@xsolla/xui-calendar 0.218.0 → 0.219.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Calendar.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../src/CalendarHeader.tsx","../../src/utils.ts","../../src/CalendarGrid.tsx","../../src/CalendarChips.tsx","../../src/DualCalendar.tsx"],"sourcesContent":["import { forwardRef, useCallback, useEffect, useState } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { addMonths, subDays, subMonths, startOfDay } from \"date-fns\";\nimport { CalendarHeader } from \"./CalendarHeader\";\nimport { CalendarGrid } from \"./CalendarGrid\";\nimport { CalendarChips } from \"./CalendarChips\";\nimport type { CalendarProps } from \"./types\";\n\nexport const Calendar = forwardRef<any, CalendarProps>(\n (\n {\n locale = \"enUS\",\n onChange,\n startDate,\n endDate,\n selectedDate,\n selectsRange = false,\n contextMenuMaxHeight,\n topContent,\n bottomContent,\n chips,\n activeChip,\n onChipSelect,\n testID,\n minDate,\n maxDate,\n firstDayOfWeek = 0,\n month,\n initialMonth,\n themeMode,\n themeProductContext,\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n const [currentMonth, setCurrentMonth] = useState<Date>(\n (month || initialMonth || selectedDate || startDate || new Date()) as Date\n );\n const [selectedStartDate, setSelectedStartDate] = useState<\n Date | null | undefined\n >(startDate);\n const [selectedEndDate, setSelectedEndDate] = useState<\n Date | null | undefined\n >(endDate);\n const [locSelectedDate, setLocSelectedDate] = useState<\n Date | null | undefined\n >(selectedDate);\n const [selectingRange, setSelectingRange] = useState<Date | null>(null);\n\n useEffect(() => {\n setSelectedStartDate(startDate);\n setSelectedEndDate(endDate);\n setLocSelectedDate(selectedDate);\n if (month !== undefined) {\n setCurrentMonth(month);\n }\n }, [startDate, endDate, selectedDate, month]);\n\n const handleChange = useCallback(\n (date: Date) => {\n const newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate()\n );\n\n if (!selectsRange) {\n setLocSelectedDate(newDate);\n onChange?.(newDate);\n } else {\n if (!selectedStartDate || (selectedStartDate && selectedEndDate)) {\n setSelectedStartDate(newDate);\n setSelectedEndDate(null);\n setSelectingRange(newDate);\n onChange?.([newDate, null]);\n } else {\n const start =\n selectedStartDate < newDate ? selectedStartDate : newDate;\n const end =\n selectedStartDate < newDate ? newDate : selectedStartDate;\n setSelectedStartDate(start);\n setSelectedEndDate(end);\n setSelectingRange(null);\n onChange?.([start, end]);\n }\n }\n },\n [onChange, selectsRange, selectedStartDate, selectedEndDate]\n );\n\n const decreaseMonth = useCallback(\n () => setCurrentMonth((prev) => subMonths(prev, 1)),\n []\n );\n const increaseMonth = useCallback(\n () => setCurrentMonth((prev) => addMonths(prev, 1)),\n []\n );\n const changeMonth = useCallback(\n (m: number) =>\n setCurrentMonth((prev) => new Date(prev.getFullYear(), m, 1)),\n []\n );\n const changeYear = useCallback(\n (y: number) => setCurrentMonth((prev) => new Date(y, prev.getMonth(), 1)),\n []\n );\n\n const handleChipSelect = useCallback(\n (value: string | null) => {\n onChipSelect?.(value);\n\n const chip = chips?.find((c) => c.value === value);\n if (!chip || chip.days === undefined) return;\n\n const today = startOfDay(new Date());\n\n if (chip.days === 0) {\n if (selectsRange) {\n setSelectedStartDate(today);\n setSelectedEndDate(today);\n setSelectingRange(null);\n onChange?.([today, today]);\n } else {\n setLocSelectedDate(today);\n onChange?.(today);\n }\n setCurrentMonth(today);\n return;\n }\n\n const start = subDays(today, chip.days);\n if (selectsRange) {\n setSelectedStartDate(start);\n setSelectedEndDate(today);\n setSelectingRange(null);\n onChange?.([start, today]);\n } else {\n setLocSelectedDate(start);\n onChange?.(start);\n }\n setCurrentMonth(start);\n },\n [chips, selectsRange, onChange, onChipSelect]\n );\n\n return (\n <Box\n ref={ref}\n testID={testID}\n backgroundColor={theme.colors.layer.float}\n borderRadius={theme.shape.contextMenu.md.borderRadius}\n padding={16}\n overflow=\"hidden\"\n style={{\n boxShadow:\n \"0px 2px 3px 0px rgba(7, 7, 8, 0.2), 0px 6px 10px 4px rgba(7, 7, 8, 0.1)\",\n width: 312,\n }}\n >\n {topContent?.({ close: () => {} })}\n\n {chips && chips.length > 0 && (\n <CalendarChips\n chips={chips}\n activeChip={activeChip}\n onChipSelect={handleChipSelect}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n )}\n\n <CalendarHeader\n monthDate={currentMonth}\n decreaseMonth={decreaseMonth}\n increaseMonth={increaseMonth}\n changeYear={changeYear}\n changeMonth={changeMonth}\n locale={locale}\n minDate={minDate}\n maxDate={maxDate}\n contextMenuMaxHeight={contextMenuMaxHeight}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n\n <CalendarGrid\n currentMonth={currentMonth}\n locale={locale}\n firstDayOfWeek={firstDayOfWeek}\n selectsRange={selectsRange}\n minDate={minDate}\n maxDate={maxDate}\n startDate={selectedStartDate}\n endDate={selectedEndDate}\n selectedDate={locSelectedDate}\n selectingRange={selectingRange}\n onDayPress={handleChange}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n\n {bottomContent?.({ close: () => {} })}\n </Box>\n );\n }\n);\n\nCalendar.displayName = \"Calendar\";\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import React, { useCallback, useMemo } from \"react\";\nimport { IconButton } from \"@xsolla/xui-button\";\nimport { Select } from \"@xsolla/xui-select\";\nimport { ArrowLeft, ArrowRight } from \"@xsolla/xui-icons-base\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { getMonthInLocale } from \"./utils\";\nimport type { CalendarHeaderProps } from \"./types\";\n\nconst months = [\n \"january\",\n \"february\",\n \"march\",\n \"april\",\n \"may\",\n \"june\",\n \"july\",\n \"august\",\n \"september\",\n \"october\",\n \"november\",\n \"december\",\n];\n\nexport const CalendarHeader: React.FC<CalendarHeaderProps> = ({\n monthDate,\n decreaseMonth,\n increaseMonth,\n changeYear,\n changeMonth,\n prevMonthButtonDisabled,\n nextMonthButtonDisabled,\n locale,\n minDate,\n maxDate,\n contextMenuMaxHeight,\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const handleChangeMonth = useCallback(\n (value: any) => {\n changeMonth(months.indexOf(value as string));\n },\n [changeMonth]\n );\n\n const handleChangeYear = useCallback(\n (value: any) => {\n changeYear(parseInt(value as string, 10));\n },\n [changeYear]\n );\n\n const monthOptions = useMemo(() => {\n return months.map((month, index) => ({\n label: getMonthInLocale(index, locale),\n value: month,\n }));\n }, [locale]);\n\n const yearOptions = useMemo(() => {\n const options = [];\n const yearStart = minDate ? minDate.getFullYear() : 1900;\n const yearEnd = maxDate\n ? maxDate.getFullYear()\n : new Date().getFullYear() + 100;\n for (let i = yearEnd; i >= yearStart; i--) {\n options.push({ value: i.toString(), label: i.toString() });\n }\n return options;\n }, [minDate, maxDate]);\n\n return (\n <Box\n testID={testID}\n width=\"100%\"\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n marginBottom={16}\n gap={8}\n >\n <IconButton\n size=\"xs\"\n tone=\"mono\"\n variant=\"tertiary\"\n onPress={decreaseMonth}\n disabled={prevMonthButtonDisabled}\n icon={<ArrowLeft size={16} />}\n aria-label=\"Previous month\"\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n\n <Box flexDirection=\"row\" flex={1} gap={4}>\n <Box flex={1.5}>\n <Select\n value={months[monthDate.getMonth()]}\n onChange={handleChangeMonth}\n options={monthOptions}\n size=\"sm\"\n maxHeight={contextMenuMaxHeight}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n </Box>\n <Box flex={1}>\n <Select\n value={monthDate.getFullYear().toString()}\n onChange={handleChangeYear}\n options={yearOptions}\n size=\"sm\"\n maxHeight={contextMenuMaxHeight}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n </Box>\n </Box>\n\n <IconButton\n size=\"xs\"\n tone=\"mono\"\n variant=\"tertiary\"\n onPress={increaseMonth}\n disabled={nextMonthButtonDisabled}\n icon={<ArrowRight size={16} />}\n aria-label=\"Next month\"\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n </Box>\n );\n};\n","import { format, setMonth } from \"date-fns\";\nimport * as locales from \"date-fns/locale\";\nimport type { CalendarLocaleType } from \"./types\";\n\nconst defaultLocale = \"enUS\";\n\nexport function formatDate(\n date: Date,\n formatStr: string,\n locale: CalendarLocaleType = defaultLocale\n) {\n const localeObj = locales[locale] || locales[defaultLocale];\n\n return format(date, formatStr, {\n locale: localeObj,\n });\n}\n\nexport function getMonthInLocale(\n month: number,\n locale: CalendarLocaleType = defaultLocale\n) {\n return formatDate(setMonth(new Date(), month), \"LLLL\", locale);\n}\n","import React, { useMemo, useCallback, useState } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport {\n addDays,\n eachDayOfInterval,\n endOfDay,\n endOfMonth,\n endOfWeek,\n format,\n isAfter,\n isBefore,\n isSameDay,\n isSameMonth,\n isToday,\n isWithinInterval,\n startOfDay,\n startOfMonth,\n startOfWeek,\n} from \"date-fns\";\nimport * as locales from \"date-fns/locale\";\nimport type { CalendarGridProps } from \"./types\";\n\n/** Width of a single day cell. */\nconst DAY_CELL_WIDTH = 40;\n/**\n * Natural width of the 7-column grid. The header and week rows are pinned to\n * this so the cells sit flush against each other: a range highlight has to read\n * as one continuous band, which it cannot do if the row distributes slack\n * between the cells. See FEP-834.\n */\nconst GRID_WIDTH = DAY_CELL_WIDTH * 7;\n\nexport const CalendarGrid: React.FC<CalendarGridProps> = ({\n currentMonth,\n locale = \"enUS\",\n firstDayOfWeek = 0,\n selectsRange = false,\n minDate,\n maxDate,\n startDate,\n endDate,\n selectedDate,\n selectingRange,\n onDayPress,\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const localeObj = (locales as any)[locale] || locales.enUS;\n const [hoveredKey, setHoveredKey] = useState<string | null>(null);\n\n const monthStart = startOfMonth(currentMonth);\n const monthEnd = endOfMonth(currentMonth);\n const weekStartsOn = (firstDayOfWeek ?? 0) as any;\n const calendarStart = startOfWeek(monthStart, { weekStartsOn });\n const calendarEnd = endOfWeek(monthEnd, { weekStartsOn });\n\n const days = eachDayOfInterval({ start: calendarStart, end: calendarEnd });\n\n const weekDays = useMemo(() => {\n return Array.from({ length: 7 }, (_, i) => {\n const day = addDays(calendarStart, i);\n return format(day, \"EEEEEE\", { locale: localeObj });\n });\n }, [calendarStart, localeObj]);\n\n const weeks = useMemo(() => {\n const weekArray: Date[][] = [];\n for (let i = 0; i < days.length; i += 7) {\n weekArray.push(days.slice(i, i + 7));\n }\n return weekArray;\n }, [days]);\n\n const isDateDisabled = useCallback(\n (date: Date) => {\n if (minDate && isBefore(date, startOfDay(minDate))) return true;\n if (maxDate && isAfter(date, endOfDay(maxDate))) return true;\n return false;\n },\n [minDate, maxDate]\n );\n\n const isDateInRange = useCallback(\n (date: Date) => {\n if (!selectsRange || !startDate) return false;\n const rangeEnd = endDate || selectingRange;\n if (!rangeEnd) return false;\n const start = startDate < rangeEnd ? startDate : rangeEnd;\n const end = startDate < rangeEnd ? rangeEnd : startDate;\n return isWithinInterval(date, {\n start: startOfDay(start),\n end: endOfDay(end),\n });\n },\n [selectsRange, startDate, endDate, selectingRange]\n );\n\n return (\n <Box testID={testID}>\n <Box\n flexDirection=\"row\"\n justifyContent=\"flex-start\"\n width={GRID_WIDTH}\n marginBottom={8}\n >\n {weekDays.map((day, i) => (\n <Box key={i} width={DAY_CELL_WIDTH} alignItems=\"center\">\n <Text\n fontSize={12}\n fontWeight=\"600\"\n color={theme.colors.content.tertiary}\n >\n {day.toUpperCase()}\n </Text>\n </Box>\n ))}\n </Box>\n\n <Box gap={2}>\n {weeks.map((week, i) => (\n <Box\n key={i}\n flexDirection=\"row\"\n justifyContent=\"flex-start\"\n width={GRID_WIDTH}\n >\n {week.map((day, j) => {\n const dayKey = format(day, \"yyyy-MM-dd\");\n const isOutsideMonth = !isSameMonth(day, currentMonth);\n const isSelected =\n (!selectsRange &&\n selectedDate &&\n isSameDay(day, selectedDate)) ||\n (selectsRange &&\n startDate &&\n endDate &&\n isSameDay(day, startDate) &&\n isSameDay(day, endDate));\n const isRangeStart =\n selectsRange && startDate && isSameDay(day, startDate);\n const isRangeEnd =\n selectsRange && endDate && isSameDay(day, endDate);\n const inRange = isDateInRange(day);\n const today = isToday(day);\n const disabled = isDateDisabled(day);\n const isHoverable =\n !disabled && !isOutsideMonth && !isSelected && !isRangeStart && !isRangeEnd;\n const isHovered = isHoverable && hoveredKey === dayKey;\n\n let bgColor = \"transparent\";\n let textColor = theme.colors.content.primary;\n\n if (isSelected || isRangeStart || isRangeEnd || inRange) {\n bgColor = theme.colors.control.check.bg;\n textColor = theme.colors.control.check.icon;\n } else if (isHovered || today) {\n bgColor = theme.colors.control.check.bgHover;\n textColor = theme.colors.control.check.icon;\n } else if (isOutsideMonth || disabled) {\n textColor = theme.colors.control.text.disable;\n }\n\n return (\n <Box\n key={j}\n width={DAY_CELL_WIDTH}\n height={32}\n alignItems=\"center\"\n justifyContent=\"center\"\n borderTopLeftRadius={isSelected || isRangeStart ? 4 : 0}\n borderTopRightRadius={isSelected || isRangeEnd ? 4 : 0}\n borderBottomLeftRadius={isSelected || isRangeStart ? 4 : 0}\n borderBottomRightRadius={isSelected || isRangeEnd ? 4 : 0}\n backgroundColor={bgColor}\n cursor={disabled || isOutsideMonth ? \"default\" : \"pointer\"}\n onPress={() =>\n !disabled && !isOutsideMonth && onDayPress?.(day)\n }\n onMouseEnter={() =>\n isHoverable && setHoveredKey(dayKey)\n }\n onMouseLeave={() =>\n setHoveredKey((current) =>\n current === dayKey ? null : current\n )\n }\n hoverStyle={\n isHoverable\n ? { backgroundColor: theme.colors.control.check.bgHover }\n : undefined\n }\n >\n <Text\n color={textColor}\n fontSize={14}\n fontWeight={\n isSelected || isRangeStart || isRangeEnd ? \"600\" : \"400\"\n }\n >\n {format(day, \"d\")}\n </Text>\n </Box>\n );\n })}\n </Box>\n ))}\n </Box>\n </Box>\n );\n};\n","import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport type { CalendarChipsProps } from \"./types\";\n\nexport const CalendarChips: React.FC<CalendarChipsProps> = ({\n chips,\n activeChip,\n onChipSelect,\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const toggleColors = theme.colors.control.toggleButton;\n // Tag's sizing scale is a compact-chip scale; toggleButtonGroup's is a\n // full-button scale and renders oversized here. Only the colors come\n // from the toggle-button tokens (to match the Figma selected/hover states).\n const sizeStyles = theme.sizing.tag(\"sm\");\n const borderWidth = sizeStyles.borderWidth;\n\n if (!chips || chips.length === 0) return null;\n\n return (\n <Box\n testID={testID}\n flexDirection=\"row\"\n flexWrap=\"wrap\"\n gap={8}\n marginBottom={16}\n >\n {chips.map((chip) => {\n const isActive = activeChip === chip.value;\n const bgColor = isActive ? toggleColors.bgActive : toggleColors.bg;\n const textColor = isActive ? toggleColors.textActive : toggleColors.text;\n const borderColor = isActive\n ? toggleColors.borderActive\n : toggleColors.border;\n\n return (\n <Box\n key={chip.value}\n as=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n testID={chip.value}\n onPress={() => onChipSelect?.(chip.value)}\n height={sizeStyles.height}\n paddingHorizontal={sizeStyles.padding}\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={bgColor}\n borderWidth={borderWidth}\n borderColor={borderColor}\n borderStyle=\"solid\"\n borderRadius={sizeStyles.radius}\n cursor=\"pointer\"\n hoverStyle={\n !isActive\n ? {\n backgroundColor: toggleColors.bgHover,\n borderColor: toggleColors.borderHover,\n }\n : undefined\n }\n >\n <Text\n color={textColor}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"400\"\n whiteSpace=\"nowrap\"\n >\n {chip.label}\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n};\n","import { forwardRef, useCallback, useEffect, useState } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { addMonths, subDays, subMonths, startOfDay } from \"date-fns\";\nimport { CalendarHeader } from \"./CalendarHeader\";\nimport { CalendarGrid } from \"./CalendarGrid\";\nimport { CalendarChips } from \"./CalendarChips\";\nimport type { DualCalendarProps } from \"./types\";\n\nexport const DualCalendar = forwardRef<any, DualCalendarProps>(\n (\n {\n locale = \"enUS\",\n onChange,\n startDate,\n endDate,\n contextMenuMaxHeight,\n topContent,\n bottomContent,\n chips,\n activeChip,\n onChipSelect,\n testID,\n minDate,\n maxDate,\n firstDayOfWeek = 0,\n month,\n initialMonth,\n themeMode,\n themeProductContext,\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n const [leftMonth, setLeftMonth] = useState<Date>(\n (month || initialMonth || startDate || new Date()) as Date\n );\n const [selectedStartDate, setSelectedStartDate] = useState<\n Date | null | undefined\n >(startDate);\n const [selectedEndDate, setSelectedEndDate] = useState<\n Date | null | undefined\n >(endDate);\n const [selectingRange, setSelectingRange] = useState<Date | null>(null);\n\n const rightMonth = addMonths(leftMonth, 1);\n\n useEffect(() => {\n setSelectedStartDate(startDate);\n setSelectedEndDate(endDate);\n if (month !== undefined) {\n setLeftMonth(month);\n }\n }, [startDate, endDate, month]);\n\n const handleDayPress = useCallback(\n (date: Date) => {\n const newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate()\n );\n\n if (!selectedStartDate || (selectedStartDate && selectedEndDate)) {\n setSelectedStartDate(newDate);\n setSelectedEndDate(null);\n setSelectingRange(newDate);\n onChange?.([newDate, null]);\n } else {\n const start =\n selectedStartDate < newDate ? selectedStartDate : newDate;\n const end = selectedStartDate < newDate ? newDate : selectedStartDate;\n setSelectedStartDate(start);\n setSelectedEndDate(end);\n setSelectingRange(null);\n onChange?.([start, end]);\n }\n },\n [onChange, selectedStartDate, selectedEndDate]\n );\n\n const decreaseLeftMonth = useCallback(\n () => setLeftMonth((prev) => subMonths(prev, 1)),\n []\n );\n const increaseLeftMonth = useCallback(\n () => setLeftMonth((prev) => addMonths(prev, 1)),\n []\n );\n const changeLeftMonth = useCallback(\n (m: number) => setLeftMonth((prev) => new Date(prev.getFullYear(), m, 1)),\n []\n );\n const changeLeftYear = useCallback(\n (y: number) => setLeftMonth((prev) => new Date(y, prev.getMonth(), 1)),\n []\n );\n\n const decreaseRightMonth = useCallback(\n () => setLeftMonth((prev) => subMonths(prev, 1)),\n []\n );\n const increaseRightMonth = useCallback(\n () => setLeftMonth((prev) => addMonths(prev, 1)),\n []\n );\n const changeRightMonth = useCallback(\n (m: number) => setLeftMonth(new Date(rightMonth.getFullYear(), m - 1, 1)),\n [rightMonth]\n );\n const changeRightYear = useCallback(\n (y: number) => setLeftMonth(new Date(y, rightMonth.getMonth() - 1, 1)),\n [rightMonth]\n );\n\n const handleChipSelect = useCallback(\n (value: string | null) => {\n onChipSelect?.(value);\n\n const chip = chips?.find((c) => c.value === value);\n if (!chip || chip.days === undefined) return;\n\n const today = startOfDay(new Date());\n\n if (chip.days === 0) {\n setSelectedStartDate(today);\n setSelectedEndDate(today);\n setSelectingRange(null);\n setLeftMonth(today);\n onChange?.([today, today]);\n return;\n }\n\n const start = subDays(today, chip.days);\n setSelectedStartDate(start);\n setSelectedEndDate(today);\n setSelectingRange(null);\n setLeftMonth(start);\n onChange?.([start, today]);\n },\n [chips, onChange, onChipSelect]\n );\n\n return (\n <Box\n ref={ref}\n testID={testID}\n backgroundColor={theme.colors.layer.float}\n borderRadius={theme.shape.contextMenu.md.borderRadius}\n padding={16}\n overflow=\"hidden\"\n style={{\n boxShadow:\n \"0px 2px 3px 0px rgba(7, 7, 8, 0.2), 0px 6px 10px 4px rgba(7, 7, 8, 0.1)\",\n width: 624,\n }}\n >\n {topContent?.({ close: () => {} })}\n\n {chips && chips.length > 0 && (\n <CalendarChips\n chips={chips}\n activeChip={activeChip}\n onChipSelect={handleChipSelect}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n )}\n\n <Box flexDirection=\"row\" gap={16}>\n <Box flex={1}>\n <CalendarHeader\n monthDate={leftMonth}\n decreaseMonth={decreaseLeftMonth}\n increaseMonth={increaseLeftMonth}\n changeYear={changeLeftYear}\n changeMonth={changeLeftMonth}\n locale={locale}\n minDate={minDate}\n maxDate={maxDate}\n contextMenuMaxHeight={contextMenuMaxHeight}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n\n <CalendarGrid\n currentMonth={leftMonth}\n locale={locale}\n firstDayOfWeek={firstDayOfWeek}\n selectsRange\n minDate={minDate}\n maxDate={maxDate}\n startDate={selectedStartDate}\n endDate={selectedEndDate}\n selectingRange={selectingRange}\n onDayPress={handleDayPress}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n </Box>\n\n <Box flex={1}>\n <CalendarHeader\n monthDate={rightMonth}\n decreaseMonth={decreaseRightMonth}\n increaseMonth={increaseRightMonth}\n changeYear={changeRightYear}\n changeMonth={changeRightMonth}\n locale={locale}\n minDate={minDate}\n maxDate={maxDate}\n contextMenuMaxHeight={contextMenuMaxHeight}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n\n <CalendarGrid\n currentMonth={rightMonth}\n locale={locale}\n firstDayOfWeek={firstDayOfWeek}\n selectsRange\n minDate={minDate}\n maxDate={maxDate}\n startDate={selectedStartDate}\n endDate={selectedEndDate}\n selectingRange={selectingRange}\n onDayPress={handleDayPress}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n </Box>\n </Box>\n\n {bottomContent?.({ close: () => {} })}\n </Box>\n );\n }\n);\n\nDualCalendar.displayName = \"DualCalendar\";\n"],"mappings":"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","names":["useCallback","useState","jsx","useResolvedTheme","startOfDay","jsx","useMemo","useCallback","format","locales","jsx","jsxs","useMemo","useCallback","useResolvedTheme","jsx","jsx","jsxs","useResolvedTheme","useState","useCallback","startOfDay","forwardRef","useCallback","useEffect","useState","useResolvedTheme","addMonths","subDays","subMonths","startOfDay","jsx","jsxs","forwardRef","useResolvedTheme","useState","addMonths","useEffect","useCallback","subMonths","startOfDay","subDays"]}
1
+ {"version":3,"sources":["../../src/Calendar.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../src/CalendarHeader.tsx","../../src/utils.ts","../../src/CalendarGrid.tsx","../../src/CalendarChips.tsx","../../src/DualCalendar.tsx"],"sourcesContent":["import { forwardRef, useCallback, useEffect, useState } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { addMonths, subDays, subMonths, startOfDay } from \"date-fns\";\nimport { CalendarHeader } from \"./CalendarHeader\";\nimport { CalendarGrid } from \"./CalendarGrid\";\nimport { CalendarChips } from \"./CalendarChips\";\nimport type { CalendarProps } from \"./types\";\n\nexport const Calendar = forwardRef<any, CalendarProps>(\n (\n {\n locale = \"enUS\",\n onChange,\n startDate,\n endDate,\n selectedDate,\n selectsRange = false,\n contextMenuMaxHeight,\n topContent,\n bottomContent,\n chips,\n activeChip,\n onChipSelect,\n testID,\n minDate,\n maxDate,\n firstDayOfWeek = 0,\n month,\n initialMonth,\n themeMode,\n themeProductContext,\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n const [currentMonth, setCurrentMonth] = useState<Date>(\n (month || initialMonth || selectedDate || startDate || new Date()) as Date\n );\n const [selectedStartDate, setSelectedStartDate] = useState<\n Date | null | undefined\n >(startDate);\n const [selectedEndDate, setSelectedEndDate] = useState<\n Date | null | undefined\n >(endDate);\n const [locSelectedDate, setLocSelectedDate] = useState<\n Date | null | undefined\n >(selectedDate);\n const [selectingRange, setSelectingRange] = useState<Date | null>(null);\n\n useEffect(() => {\n setSelectedStartDate(startDate);\n setSelectedEndDate(endDate);\n setLocSelectedDate(selectedDate);\n if (month !== undefined) {\n setCurrentMonth(month);\n }\n }, [startDate, endDate, selectedDate, month]);\n\n const handleChange = useCallback(\n (date: Date) => {\n const newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate()\n );\n\n if (!selectsRange) {\n setLocSelectedDate(newDate);\n onChange?.(newDate);\n } else {\n if (!selectedStartDate || (selectedStartDate && selectedEndDate)) {\n setSelectedStartDate(newDate);\n setSelectedEndDate(null);\n setSelectingRange(newDate);\n onChange?.([newDate, null]);\n } else {\n const start =\n selectedStartDate < newDate ? selectedStartDate : newDate;\n const end =\n selectedStartDate < newDate ? newDate : selectedStartDate;\n setSelectedStartDate(start);\n setSelectedEndDate(end);\n setSelectingRange(null);\n onChange?.([start, end]);\n }\n }\n },\n [onChange, selectsRange, selectedStartDate, selectedEndDate]\n );\n\n const decreaseMonth = useCallback(\n () => setCurrentMonth((prev) => subMonths(prev, 1)),\n []\n );\n const increaseMonth = useCallback(\n () => setCurrentMonth((prev) => addMonths(prev, 1)),\n []\n );\n const changeMonth = useCallback(\n (m: number) =>\n setCurrentMonth((prev) => new Date(prev.getFullYear(), m, 1)),\n []\n );\n const changeYear = useCallback(\n (y: number) => setCurrentMonth((prev) => new Date(y, prev.getMonth(), 1)),\n []\n );\n\n const handleChipSelect = useCallback(\n (value: string | null) => {\n onChipSelect?.(value);\n\n const chip = chips?.find((c) => c.value === value);\n if (!chip || chip.days === undefined) return;\n\n const today = startOfDay(new Date());\n\n if (chip.days === 0) {\n if (selectsRange) {\n setSelectedStartDate(today);\n setSelectedEndDate(today);\n setSelectingRange(null);\n onChange?.([today, today]);\n } else {\n setLocSelectedDate(today);\n onChange?.(today);\n }\n setCurrentMonth(today);\n return;\n }\n\n const start = subDays(today, chip.days);\n if (selectsRange) {\n setSelectedStartDate(start);\n setSelectedEndDate(today);\n setSelectingRange(null);\n onChange?.([start, today]);\n } else {\n setLocSelectedDate(start);\n onChange?.(start);\n }\n setCurrentMonth(start);\n },\n [chips, selectsRange, onChange, onChipSelect]\n );\n\n return (\n <Box\n ref={ref}\n testID={testID}\n backgroundColor={theme.colors.layer.float}\n borderRadius={theme.shape.contextMenu.md.borderRadius}\n padding={16}\n overflow=\"hidden\"\n style={{\n boxShadow:\n \"0px 2px 3px 0px rgba(7, 7, 8, 0.2), 0px 6px 10px 4px rgba(7, 7, 8, 0.1)\",\n width: 312,\n }}\n >\n {topContent?.({ close: () => {} })}\n\n {chips && chips.length > 0 && (\n <CalendarChips\n chips={chips}\n activeChip={activeChip}\n onChipSelect={handleChipSelect}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n )}\n\n <CalendarHeader\n monthDate={currentMonth}\n decreaseMonth={decreaseMonth}\n increaseMonth={increaseMonth}\n changeYear={changeYear}\n changeMonth={changeMonth}\n locale={locale}\n minDate={minDate}\n maxDate={maxDate}\n contextMenuMaxHeight={contextMenuMaxHeight}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n\n <CalendarGrid\n currentMonth={currentMonth}\n locale={locale}\n firstDayOfWeek={firstDayOfWeek}\n selectsRange={selectsRange}\n minDate={minDate}\n maxDate={maxDate}\n startDate={selectedStartDate}\n endDate={selectedEndDate}\n selectedDate={locSelectedDate}\n selectingRange={selectingRange}\n onDayPress={handleChange}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n\n {bottomContent?.({ close: () => {} })}\n </Box>\n );\n }\n);\n\nCalendar.displayName = \"Calendar\";\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\n/**\n * Yoga has no inline formatting context, so RN's ViewStyle.display only\n * accepts \"flex\" | \"none\". Every inline-ish web value collapses to a plain\n * flex container — the box already fills only its content on native, which is\n * what those callers wanted on web anyway. Returning undefined (rather than\n * \"flex\") leaves RN's own default in place.\n */\nconst toNativeDisplay = (\n display: BoxProps[\"display\"]\n): ViewStyle[\"display\"] => (display === \"none\" ? \"none\" : undefined);\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n display,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n display: toNativeDisplay(display),\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import React, { useCallback, useMemo } from \"react\";\nimport { IconButton } from \"@xsolla/xui-button\";\nimport { Select } from \"@xsolla/xui-select\";\nimport { ArrowLeft, ArrowRight } from \"@xsolla/xui-icons-base\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { getMonthInLocale } from \"./utils\";\nimport type { CalendarHeaderProps } from \"./types\";\n\nconst months = [\n \"january\",\n \"february\",\n \"march\",\n \"april\",\n \"may\",\n \"june\",\n \"july\",\n \"august\",\n \"september\",\n \"october\",\n \"november\",\n \"december\",\n];\n\nexport const CalendarHeader: React.FC<CalendarHeaderProps> = ({\n monthDate,\n decreaseMonth,\n increaseMonth,\n changeYear,\n changeMonth,\n prevMonthButtonDisabled,\n nextMonthButtonDisabled,\n locale,\n minDate,\n maxDate,\n contextMenuMaxHeight,\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const handleChangeMonth = useCallback(\n (value: any) => {\n changeMonth(months.indexOf(value as string));\n },\n [changeMonth]\n );\n\n const handleChangeYear = useCallback(\n (value: any) => {\n changeYear(parseInt(value as string, 10));\n },\n [changeYear]\n );\n\n const monthOptions = useMemo(() => {\n return months.map((month, index) => ({\n label: getMonthInLocale(index, locale),\n value: month,\n }));\n }, [locale]);\n\n const yearOptions = useMemo(() => {\n const options = [];\n const yearStart = minDate ? minDate.getFullYear() : 1900;\n const yearEnd = maxDate\n ? maxDate.getFullYear()\n : new Date().getFullYear() + 100;\n for (let i = yearEnd; i >= yearStart; i--) {\n options.push({ value: i.toString(), label: i.toString() });\n }\n return options;\n }, [minDate, maxDate]);\n\n return (\n <Box\n testID={testID}\n width=\"100%\"\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n marginBottom={16}\n gap={8}\n >\n <IconButton\n size=\"xs\"\n tone=\"mono\"\n variant=\"tertiary\"\n onPress={decreaseMonth}\n disabled={prevMonthButtonDisabled}\n icon={<ArrowLeft size={16} />}\n aria-label=\"Previous month\"\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n\n <Box flexDirection=\"row\" flex={1} gap={4}>\n <Box flex={1.5}>\n <Select\n value={months[monthDate.getMonth()]}\n onChange={handleChangeMonth}\n options={monthOptions}\n size=\"sm\"\n maxHeight={contextMenuMaxHeight}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n </Box>\n <Box flex={1}>\n <Select\n value={monthDate.getFullYear().toString()}\n onChange={handleChangeYear}\n options={yearOptions}\n size=\"sm\"\n maxHeight={contextMenuMaxHeight}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n </Box>\n </Box>\n\n <IconButton\n size=\"xs\"\n tone=\"mono\"\n variant=\"tertiary\"\n onPress={increaseMonth}\n disabled={nextMonthButtonDisabled}\n icon={<ArrowRight size={16} />}\n aria-label=\"Next month\"\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n </Box>\n );\n};\n","import { format, setMonth } from \"date-fns\";\nimport * as locales from \"date-fns/locale\";\nimport type { CalendarLocaleType } from \"./types\";\n\nconst defaultLocale = \"enUS\";\n\nexport function formatDate(\n date: Date,\n formatStr: string,\n locale: CalendarLocaleType = defaultLocale\n) {\n const localeObj = locales[locale] || locales[defaultLocale];\n\n return format(date, formatStr, {\n locale: localeObj,\n });\n}\n\nexport function getMonthInLocale(\n month: number,\n locale: CalendarLocaleType = defaultLocale\n) {\n return formatDate(setMonth(new Date(), month), \"LLLL\", locale);\n}\n","import React, { useMemo, useCallback, useState } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport {\n addDays,\n eachDayOfInterval,\n endOfDay,\n endOfMonth,\n endOfWeek,\n format,\n isAfter,\n isBefore,\n isSameDay,\n isSameMonth,\n isToday,\n isWithinInterval,\n startOfDay,\n startOfMonth,\n startOfWeek,\n} from \"date-fns\";\nimport * as locales from \"date-fns/locale\";\nimport type { CalendarGridProps } from \"./types\";\n\n/** Width of a single day cell. */\nconst DAY_CELL_WIDTH = 40;\n/**\n * Natural width of the 7-column grid. The header and week rows are pinned to\n * this so the cells sit flush against each other: a range highlight has to read\n * as one continuous band, which it cannot do if the row distributes slack\n * between the cells. See FEP-834.\n */\nconst GRID_WIDTH = DAY_CELL_WIDTH * 7;\n\nexport const CalendarGrid: React.FC<CalendarGridProps> = ({\n currentMonth,\n locale = \"enUS\",\n firstDayOfWeek = 0,\n selectsRange = false,\n minDate,\n maxDate,\n startDate,\n endDate,\n selectedDate,\n selectingRange,\n onDayPress,\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const localeObj = (locales as any)[locale] || locales.enUS;\n const [hoveredKey, setHoveredKey] = useState<string | null>(null);\n\n const monthStart = startOfMonth(currentMonth);\n const monthEnd = endOfMonth(currentMonth);\n const weekStartsOn = (firstDayOfWeek ?? 0) as any;\n const calendarStart = startOfWeek(monthStart, { weekStartsOn });\n const calendarEnd = endOfWeek(monthEnd, { weekStartsOn });\n\n const days = eachDayOfInterval({ start: calendarStart, end: calendarEnd });\n\n const weekDays = useMemo(() => {\n return Array.from({ length: 7 }, (_, i) => {\n const day = addDays(calendarStart, i);\n return format(day, \"EEEEEE\", { locale: localeObj });\n });\n }, [calendarStart, localeObj]);\n\n const weeks = useMemo(() => {\n const weekArray: Date[][] = [];\n for (let i = 0; i < days.length; i += 7) {\n weekArray.push(days.slice(i, i + 7));\n }\n return weekArray;\n }, [days]);\n\n const isDateDisabled = useCallback(\n (date: Date) => {\n if (minDate && isBefore(date, startOfDay(minDate))) return true;\n if (maxDate && isAfter(date, endOfDay(maxDate))) return true;\n return false;\n },\n [minDate, maxDate]\n );\n\n const isDateInRange = useCallback(\n (date: Date) => {\n if (!selectsRange || !startDate) return false;\n const rangeEnd = endDate || selectingRange;\n if (!rangeEnd) return false;\n const start = startDate < rangeEnd ? startDate : rangeEnd;\n const end = startDate < rangeEnd ? rangeEnd : startDate;\n return isWithinInterval(date, {\n start: startOfDay(start),\n end: endOfDay(end),\n });\n },\n [selectsRange, startDate, endDate, selectingRange]\n );\n\n return (\n <Box testID={testID}>\n <Box\n flexDirection=\"row\"\n justifyContent=\"flex-start\"\n width={GRID_WIDTH}\n marginBottom={8}\n >\n {weekDays.map((day, i) => (\n <Box key={i} width={DAY_CELL_WIDTH} alignItems=\"center\">\n <Text\n fontSize={12}\n fontWeight=\"600\"\n color={theme.colors.content.tertiary}\n >\n {day.toUpperCase()}\n </Text>\n </Box>\n ))}\n </Box>\n\n <Box gap={2}>\n {weeks.map((week, i) => (\n <Box\n key={i}\n flexDirection=\"row\"\n justifyContent=\"flex-start\"\n width={GRID_WIDTH}\n >\n {week.map((day, j) => {\n const dayKey = format(day, \"yyyy-MM-dd\");\n const isOutsideMonth = !isSameMonth(day, currentMonth);\n const isSelected =\n (!selectsRange &&\n selectedDate &&\n isSameDay(day, selectedDate)) ||\n (selectsRange &&\n startDate &&\n endDate &&\n isSameDay(day, startDate) &&\n isSameDay(day, endDate));\n const isRangeStart =\n selectsRange && startDate && isSameDay(day, startDate);\n const isRangeEnd =\n selectsRange && endDate && isSameDay(day, endDate);\n const inRange = isDateInRange(day);\n const today = isToday(day);\n const disabled = isDateDisabled(day);\n const isHoverable =\n !disabled && !isOutsideMonth && !isSelected && !isRangeStart && !isRangeEnd;\n const isHovered = isHoverable && hoveredKey === dayKey;\n\n let bgColor = \"transparent\";\n let textColor = theme.colors.content.primary;\n\n if (isSelected || isRangeStart || isRangeEnd || inRange) {\n bgColor = theme.colors.control.check.bg;\n textColor = theme.colors.control.check.icon;\n } else if (isHovered || today) {\n bgColor = theme.colors.control.check.bgHover;\n textColor = theme.colors.control.check.icon;\n } else if (isOutsideMonth || disabled) {\n textColor = theme.colors.control.text.disable;\n }\n\n return (\n <Box\n key={j}\n width={DAY_CELL_WIDTH}\n height={32}\n alignItems=\"center\"\n justifyContent=\"center\"\n borderTopLeftRadius={isSelected || isRangeStart ? 4 : 0}\n borderTopRightRadius={isSelected || isRangeEnd ? 4 : 0}\n borderBottomLeftRadius={isSelected || isRangeStart ? 4 : 0}\n borderBottomRightRadius={isSelected || isRangeEnd ? 4 : 0}\n backgroundColor={bgColor}\n cursor={disabled || isOutsideMonth ? \"default\" : \"pointer\"}\n onPress={() =>\n !disabled && !isOutsideMonth && onDayPress?.(day)\n }\n onMouseEnter={() =>\n isHoverable && setHoveredKey(dayKey)\n }\n onMouseLeave={() =>\n setHoveredKey((current) =>\n current === dayKey ? null : current\n )\n }\n hoverStyle={\n isHoverable\n ? { backgroundColor: theme.colors.control.check.bgHover }\n : undefined\n }\n >\n <Text\n color={textColor}\n fontSize={14}\n fontWeight={\n isSelected || isRangeStart || isRangeEnd ? \"600\" : \"400\"\n }\n >\n {format(day, \"d\")}\n </Text>\n </Box>\n );\n })}\n </Box>\n ))}\n </Box>\n </Box>\n );\n};\n","import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport type { CalendarChipsProps } from \"./types\";\n\nexport const CalendarChips: React.FC<CalendarChipsProps> = ({\n chips,\n activeChip,\n onChipSelect,\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const toggleColors = theme.colors.control.toggleButton;\n // Tag's sizing scale is a compact-chip scale; toggleButtonGroup's is a\n // full-button scale and renders oversized here. Only the colors come\n // from the toggle-button tokens (to match the Figma selected/hover states).\n const sizeStyles = theme.sizing.tag(\"sm\");\n const borderWidth = sizeStyles.borderWidth;\n\n if (!chips || chips.length === 0) return null;\n\n return (\n <Box\n testID={testID}\n flexDirection=\"row\"\n flexWrap=\"wrap\"\n gap={8}\n marginBottom={16}\n >\n {chips.map((chip) => {\n const isActive = activeChip === chip.value;\n const bgColor = isActive ? toggleColors.bgActive : toggleColors.bg;\n const textColor = isActive ? toggleColors.textActive : toggleColors.text;\n const borderColor = isActive\n ? toggleColors.borderActive\n : toggleColors.border;\n\n return (\n <Box\n key={chip.value}\n as=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n testID={chip.value}\n onPress={() => onChipSelect?.(chip.value)}\n height={sizeStyles.height}\n paddingHorizontal={sizeStyles.padding}\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={bgColor}\n borderWidth={borderWidth}\n borderColor={borderColor}\n borderStyle=\"solid\"\n borderRadius={sizeStyles.radius}\n cursor=\"pointer\"\n hoverStyle={\n !isActive\n ? {\n backgroundColor: toggleColors.bgHover,\n borderColor: toggleColors.borderHover,\n }\n : undefined\n }\n >\n <Text\n color={textColor}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"400\"\n whiteSpace=\"nowrap\"\n >\n {chip.label}\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n};\n","import { forwardRef, useCallback, useEffect, useState } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { addMonths, subDays, subMonths, startOfDay } from \"date-fns\";\nimport { CalendarHeader } from \"./CalendarHeader\";\nimport { CalendarGrid } from \"./CalendarGrid\";\nimport { CalendarChips } from \"./CalendarChips\";\nimport type { DualCalendarProps } from \"./types\";\n\nexport const DualCalendar = forwardRef<any, DualCalendarProps>(\n (\n {\n locale = \"enUS\",\n onChange,\n startDate,\n endDate,\n contextMenuMaxHeight,\n topContent,\n bottomContent,\n chips,\n activeChip,\n onChipSelect,\n testID,\n minDate,\n maxDate,\n firstDayOfWeek = 0,\n month,\n initialMonth,\n themeMode,\n themeProductContext,\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n const [leftMonth, setLeftMonth] = useState<Date>(\n (month || initialMonth || startDate || new Date()) as Date\n );\n const [selectedStartDate, setSelectedStartDate] = useState<\n Date | null | undefined\n >(startDate);\n const [selectedEndDate, setSelectedEndDate] = useState<\n Date | null | undefined\n >(endDate);\n const [selectingRange, setSelectingRange] = useState<Date | null>(null);\n\n const rightMonth = addMonths(leftMonth, 1);\n\n useEffect(() => {\n setSelectedStartDate(startDate);\n setSelectedEndDate(endDate);\n if (month !== undefined) {\n setLeftMonth(month);\n }\n }, [startDate, endDate, month]);\n\n const handleDayPress = useCallback(\n (date: Date) => {\n const newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate()\n );\n\n if (!selectedStartDate || (selectedStartDate && selectedEndDate)) {\n setSelectedStartDate(newDate);\n setSelectedEndDate(null);\n setSelectingRange(newDate);\n onChange?.([newDate, null]);\n } else {\n const start =\n selectedStartDate < newDate ? selectedStartDate : newDate;\n const end = selectedStartDate < newDate ? newDate : selectedStartDate;\n setSelectedStartDate(start);\n setSelectedEndDate(end);\n setSelectingRange(null);\n onChange?.([start, end]);\n }\n },\n [onChange, selectedStartDate, selectedEndDate]\n );\n\n const decreaseLeftMonth = useCallback(\n () => setLeftMonth((prev) => subMonths(prev, 1)),\n []\n );\n const increaseLeftMonth = useCallback(\n () => setLeftMonth((prev) => addMonths(prev, 1)),\n []\n );\n const changeLeftMonth = useCallback(\n (m: number) => setLeftMonth((prev) => new Date(prev.getFullYear(), m, 1)),\n []\n );\n const changeLeftYear = useCallback(\n (y: number) => setLeftMonth((prev) => new Date(y, prev.getMonth(), 1)),\n []\n );\n\n const decreaseRightMonth = useCallback(\n () => setLeftMonth((prev) => subMonths(prev, 1)),\n []\n );\n const increaseRightMonth = useCallback(\n () => setLeftMonth((prev) => addMonths(prev, 1)),\n []\n );\n const changeRightMonth = useCallback(\n (m: number) => setLeftMonth(new Date(rightMonth.getFullYear(), m - 1, 1)),\n [rightMonth]\n );\n const changeRightYear = useCallback(\n (y: number) => setLeftMonth(new Date(y, rightMonth.getMonth() - 1, 1)),\n [rightMonth]\n );\n\n const handleChipSelect = useCallback(\n (value: string | null) => {\n onChipSelect?.(value);\n\n const chip = chips?.find((c) => c.value === value);\n if (!chip || chip.days === undefined) return;\n\n const today = startOfDay(new Date());\n\n if (chip.days === 0) {\n setSelectedStartDate(today);\n setSelectedEndDate(today);\n setSelectingRange(null);\n setLeftMonth(today);\n onChange?.([today, today]);\n return;\n }\n\n const start = subDays(today, chip.days);\n setSelectedStartDate(start);\n setSelectedEndDate(today);\n setSelectingRange(null);\n setLeftMonth(start);\n onChange?.([start, today]);\n },\n [chips, onChange, onChipSelect]\n );\n\n return (\n <Box\n ref={ref}\n testID={testID}\n backgroundColor={theme.colors.layer.float}\n borderRadius={theme.shape.contextMenu.md.borderRadius}\n padding={16}\n overflow=\"hidden\"\n style={{\n boxShadow:\n \"0px 2px 3px 0px rgba(7, 7, 8, 0.2), 0px 6px 10px 4px rgba(7, 7, 8, 0.1)\",\n width: 624,\n }}\n >\n {topContent?.({ close: () => {} })}\n\n {chips && chips.length > 0 && (\n <CalendarChips\n chips={chips}\n activeChip={activeChip}\n onChipSelect={handleChipSelect}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n )}\n\n <Box flexDirection=\"row\" gap={16}>\n <Box flex={1}>\n <CalendarHeader\n monthDate={leftMonth}\n decreaseMonth={decreaseLeftMonth}\n increaseMonth={increaseLeftMonth}\n changeYear={changeLeftYear}\n changeMonth={changeLeftMonth}\n locale={locale}\n minDate={minDate}\n maxDate={maxDate}\n contextMenuMaxHeight={contextMenuMaxHeight}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n\n <CalendarGrid\n currentMonth={leftMonth}\n locale={locale}\n firstDayOfWeek={firstDayOfWeek}\n selectsRange\n minDate={minDate}\n maxDate={maxDate}\n startDate={selectedStartDate}\n endDate={selectedEndDate}\n selectingRange={selectingRange}\n onDayPress={handleDayPress}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n </Box>\n\n <Box flex={1}>\n <CalendarHeader\n monthDate={rightMonth}\n decreaseMonth={decreaseRightMonth}\n increaseMonth={increaseRightMonth}\n changeYear={changeRightYear}\n changeMonth={changeRightMonth}\n locale={locale}\n minDate={minDate}\n maxDate={maxDate}\n contextMenuMaxHeight={contextMenuMaxHeight}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n\n <CalendarGrid\n currentMonth={rightMonth}\n locale={locale}\n firstDayOfWeek={firstDayOfWeek}\n selectsRange\n minDate={minDate}\n maxDate={maxDate}\n startDate={selectedStartDate}\n endDate={selectedEndDate}\n selectingRange={selectingRange}\n onDayPress={handleDayPress}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n </Box>\n </Box>\n\n {bottomContent?.({ close: () => {} })}\n </Box>\n );\n }\n);\n\nDualCalendar.displayName = \"DualCalendar\";\n"],"mappings":"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","names":["useCallback","useState","jsx","useResolvedTheme","startOfDay","jsx","useMemo","useCallback","format","locales","jsx","jsxs","useMemo","useCallback","useResolvedTheme","jsx","jsx","jsxs","useResolvedTheme","useState","useCallback","startOfDay","forwardRef","useCallback","useEffect","useState","useResolvedTheme","addMonths","subDays","subMonths","startOfDay","jsx","jsxs","forwardRef","useResolvedTheme","useState","addMonths","useEffect","useCallback","subMonths","startOfDay","subDays"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xsolla/xui-calendar",
3
- "version": "0.218.0",
3
+ "version": "0.219.0",
4
4
  "main": "./web/index.js",
5
5
  "module": "./web/index.mjs",
6
6
  "types": "./web/index.d.ts",
@@ -13,12 +13,12 @@
13
13
  "test:coverage": "vitest run --coverage"
14
14
  },
15
15
  "dependencies": {
16
- "@xsolla/xui-button": "0.218.0",
17
- "@xsolla/xui-core": "0.218.0",
18
- "@xsolla/xui-icons-base": "0.218.0",
19
- "@xsolla/xui-primitives-core": "0.218.0",
20
- "@xsolla/xui-select": "0.218.0",
21
- "@xsolla/xui-tag": "0.218.0",
16
+ "@xsolla/xui-button": "0.219.0",
17
+ "@xsolla/xui-core": "0.219.0",
18
+ "@xsolla/xui-icons-base": "0.219.0",
19
+ "@xsolla/xui-primitives-core": "0.219.0",
20
+ "@xsolla/xui-select": "0.219.0",
21
+ "@xsolla/xui-tag": "0.219.0",
22
22
  "date-fns": "^3.0.0"
23
23
  },
24
24
  "peerDependencies": {
package/web/index.js CHANGED
@@ -91,6 +91,10 @@ var ADDITIONAL_BLOCKED_PROPS = /* @__PURE__ */ new Set([
91
91
  "fontWeight",
92
92
  "fontFamily",
93
93
  "textDecoration",
94
+ // `display` is a presentation attribute on SVG, so isPropValid lets it
95
+ // through — but Box consumes it purely as CSS. Without this it lands on the
96
+ // DOM node as a bogus `display="inline-flex"` attribute.
97
+ "display",
94
98
  // Cross-platform layout prop that Text consumes as CSS, never as an
95
99
  // attribute. Pinned explicitly because it is now spread into the styled
96
100
  // component rather than destructured away before it can reach the DOM.
@@ -125,7 +129,7 @@ function createFilteredElement(defaultTag) {
125
129
  var import_jsx_runtime = require("react/jsx-runtime");
126
130
  var FilteredDiv = createFilteredElement("div");
127
131
  var StyledBox = (0, import_styled_components.default)(FilteredDiv)`
128
- display: flex;
132
+ display: ${(props) => props.display || "flex"};
129
133
  box-sizing: border-box;
130
134
  background-color: ${(props) => props.backgroundColor || "transparent"};
131
135
  border-color: ${(props) => props.borderColor || "transparent"};
@@ -261,7 +265,7 @@ var Box = import_react2.default.forwardRef(
261
265
  onLoad,
262
266
  "data-testid": dataTestId || testID,
263
267
  style: {
264
- display: "block",
268
+ display: props.display || "block",
265
269
  objectFit: "cover",
266
270
  width: typeof props.width === "number" ? `${props.width}px` : props.width,
267
271
  height: typeof props.height === "number" ? `${props.height}px` : props.height,