glassdate-rn 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/GlassDatePicker.tsx","../src/logic/calendar.ts","../src/logic/constraints.ts","../src/utils/colourUtils.ts","../src/logic/mono.ts","../../tokens/themes/default.dark.json","../../tokens/themes/default.light.json","../../tokens/themes/ios-liquid.dark.json","../../tokens/themes/ios-liquid.light.json","../../tokens/themes/material3.dark.json","../../tokens/themes/material3.light.json","../../tokens/themes/toon.json","../../tokens/themes/flat.json","../../tokens/themes/plain.json","../src/logic/theme.ts","../src/GlassContainerRN.tsx","../src/CalendarGrid.tsx","../src/MonthYearHeader.tsx","../src/MonthSelector.tsx","../src/YearSelector.tsx","../src/ConfirmFooter.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from 'react';\nimport { View, Text, Platform, useColorScheme, StyleSheet } from 'react-native';\nimport type {\n GlassDateTokens,\n ThemeKey,\n ConstraintPreset,\n DayShape,\n OpenDropdown,\n DeepPartial,\n} from './types/tokens.types';\nimport {\n resolveConstraintBounds,\n isDateSelectable,\n isDateSelectableFromBounds,\n isMonthSelectable,\n clampDate,\n isConstraintConfigInvalid,\n type ConstraintConfig,\n} from './logic/constraints';\nimport { previousMonth, nextMonth } from './logic/calendar';\nimport { resolveTokens, mapDayShapeToRadius } from './logic/theme';\nimport { GlassContainer } from './GlassContainerRN';\nimport { CalendarGrid } from './CalendarGrid';\nimport { MonthYearHeader } from './MonthYearHeader';\nimport { MonthSelector } from './MonthSelector';\nimport { YearSelector } from './YearSelector';\nimport { ConfirmFooter } from './ConfirmFooter';\n\nexport interface GlassDatePickerProps {\n value?: Date | null;\n hintDate?: Date;\n onChange?: (date: Date) => void;\n onConfirm?: (date: Date) => void;\n onCancel?: () => void;\n constraint?: ConstraintPreset;\n minDate?: Date;\n maxDate?: Date;\n yearRange?: number;\n theme?: ThemeKey;\n colorScheme?: 'dark' | 'light' | 'auto';\n accent?: string;\n dayShape?: DayShape;\n tokens?: DeepPartial<GlassDateTokens>;\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n monthNames?: [string, string, string, string, string, string,\n string, string, string, string, string, string];\n confirmLabel?: (date: Date) => string;\n placeholderLabel?: string;\n showSelectedDate?: boolean;\n selectedDateLabel?: (date: Date) => string;\n}\n\nfunction defaultSelectedDateLabel(date: Date): string {\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'full' }).format(date);\n}\n\nfunction getDefaultTheme(): ThemeKey {\n const os = Platform.OS;\n if (os === 'ios') return 'ios-liquid';\n if (os === 'android') return 'material3';\n return 'default';\n}\n\nexport function GlassDatePicker({\n value,\n hintDate,\n onChange,\n onConfirm,\n onCancel,\n constraint = 'none',\n minDate,\n maxDate,\n yearRange,\n theme,\n colorScheme: colorSchemeProp = 'auto',\n accent,\n dayShape = 'circle',\n tokens: tokenOverrides,\n firstDayOfWeek: firstDayOfWeekProp = 0,\n monthNames: monthNamesProp,\n confirmLabel: confirmLabelProp,\n placeholderLabel: placeholderLabelProp,\n showSelectedDate = false,\n selectedDateLabel: selectedDateLabelProp,\n}: GlassDatePickerProps): React.ReactElement {\n const [today] = useState(() => new Date());\n const initialView = hintDate ?? today;\n const [viewYear, setViewYear] = useState(initialView.getFullYear());\n const [viewMonth, setViewMonth] = useState(initialView.getMonth() + 1);\n const [selectedDate, setSelectedDate] = useState<Date | null>(null);\n const [openDropdown, setOpenDropdown] = useState<OpenDropdown>('none');\n\n const activeTheme = theme ?? getDefaultTheme();\n const systemColorScheme = useColorScheme();\n const resolvedColorScheme: 'dark' | 'light' =\n colorSchemeProp === 'auto'\n ? systemColorScheme === 'dark'\n ? 'dark'\n : 'light'\n : colorSchemeProp;\n\n let firstDayOfWeek = firstDayOfWeekProp;\n if (firstDayOfWeek < 0 || firstDayOfWeek > 6) {\n console.warn(\n `GlassDate: firstDayOfWeek must be 0–6, got ${firstDayOfWeek} — defaulting to 0`,\n );\n firstDayOfWeek = 0;\n }\n\n let monthNames: string[] | undefined;\n if (monthNamesProp) {\n if (monthNamesProp.length === 12) {\n monthNames = monthNamesProp;\n } else {\n console.warn(\n `GlassDate: monthNames must have exactly 12 elements, got ${monthNamesProp.length} — using English defaults`,\n );\n }\n }\n\n const resolvedTokens = resolveTokens(activeTheme, resolvedColorScheme, accent, tokenOverrides);\n const dayShapeRadius = mapDayShapeToRadius(dayShape);\n\n const constraintConfig: ConstraintConfig = {\n preset: constraint,\n ...(constraint === 'custom' && minDate !== undefined && { minDate }),\n ...(constraint === 'custom' && maxDate !== undefined && { maxDate }),\n ...(yearRange !== undefined && { yearRange }),\n };\n\n const resolvedBounds = resolveConstraintBounds(constraintConfig, today);\n const isConfirmEnabled =\n selectedDate !== null && isDateSelectableFromBounds(selectedDate, resolvedBounds);\n\n const prev = previousMonth(viewYear, viewMonth);\n const nxt = nextMonth(viewYear, viewMonth);\n const isPrevArrowDisabled = !isMonthSelectable(prev.year, prev.month, constraintConfig, today);\n const isNextArrowDisabled = !isMonthSelectable(nxt.year, nxt.month, constraintConfig, today);\n\n // INITIAL RENDER — view is already set from hintDate ?? today via useState\n useEffect(() => {\n if (isConstraintConfigInvalid(constraintConfig)) {\n console.warn('GlassDate: minDate is after maxDate');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // VALUE PROP CHANGES\n useEffect(() => {\n setOpenDropdown('none');\n\n if (value === null || value === undefined) {\n setSelectedDate(null);\n return;\n }\n\n if (isDateSelectable(value, constraintConfig, today)) {\n setSelectedDate(value);\n setViewYear(value.getFullYear());\n setViewMonth(value.getMonth() + 1);\n } else {\n console.warn('GlassDate: updated value is outside constraint range');\n const clamped = clampDate(value, constraintConfig, today);\n if (clamped) {\n setSelectedDate(clamped);\n setViewYear(clamped.getFullYear());\n setViewMonth(clamped.getMonth() + 1);\n } else {\n setSelectedDate(null);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value?.getTime()]);\n\n // CONSTRAINT PROP CHANGES\n useEffect(() => {\n setOpenDropdown('none');\n\n if (isConstraintConfigInvalid(constraintConfig)) {\n setSelectedDate(null);\n console.warn('GlassDate: minDate is after maxDate');\n return;\n }\n\n if (selectedDate !== null && !isDateSelectable(selectedDate, constraintConfig, today)) {\n setSelectedDate(null);\n }\n\n if (!isMonthSelectable(viewYear, viewMonth, constraintConfig, today)) {\n const bounds = resolveConstraintBounds(constraintConfig, today);\n setViewYear(bounds.maxDate.getFullYear());\n setViewMonth(bounds.maxDate.getMonth() + 1);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [constraint, minDate?.getTime(), maxDate?.getTime()]);\n\n const handleDayPress = useCallback(\n (date: Date) => {\n if (\n selectedDate &&\n selectedDate.getFullYear() === date.getFullYear() &&\n selectedDate.getMonth() === date.getMonth() &&\n selectedDate.getDate() === date.getDate()\n ) {\n return;\n }\n setSelectedDate(date);\n setOpenDropdown('none');\n onChange?.(date);\n },\n [selectedDate, onChange],\n );\n\n const handleMonthPillPress = useCallback(() => {\n setOpenDropdown((prev) => (prev === 'month' ? 'none' : 'month'));\n }, []);\n\n const handleYearPillPress = useCallback(() => {\n setOpenDropdown((prev) => (prev === 'year' ? 'none' : 'year'));\n }, []);\n\n const handlePrevPress = useCallback(() => {\n const p = previousMonth(viewYear, viewMonth);\n setViewYear(p.year);\n setViewMonth(p.month);\n setOpenDropdown('none');\n }, [viewYear, viewMonth]);\n\n const handleNextPress = useCallback(() => {\n const n = nextMonth(viewYear, viewMonth);\n setViewYear(n.year);\n setViewMonth(n.month);\n setOpenDropdown('none');\n }, [viewYear, viewMonth]);\n\n const handleMonthSelect = useCallback((month: number) => {\n setViewMonth(month);\n setOpenDropdown('none');\n }, []);\n\n const handleYearSelect = useCallback((year: number) => {\n setViewYear(year);\n setOpenDropdown('none');\n if (selectedDate) {\n const projected = new Date(year, selectedDate.getMonth(), selectedDate.getDate());\n if (!isDateSelectableFromBounds(projected, resolvedBounds)) {\n setSelectedDate(null);\n }\n }\n }, [selectedDate, resolvedBounds]);\n\n const handleConfirm = useCallback(() => {\n if (isConfirmEnabled && selectedDate) {\n onConfirm?.(selectedDate);\n }\n }, [isConfirmEnabled, selectedDate, onConfirm]);\n\n const handleCancel = useCallback(() => {\n onCancel?.();\n }, [onCancel]);\n\n const handleDismissDropdown = useCallback(() => {\n setOpenDropdown('none');\n }, []);\n\n const containerTokens = resolvedTokens.container;\n\n return (\n <View\n style={[\n styles.scene,\n { backgroundColor: resolvedTokens.scene.backgroundColour },\n Platform.select({ web: { userSelect: 'none' } as any }),\n ]}\n >\n <GlassContainer\n blurRadius={containerTokens.blurRadius}\n backgroundColour={containerTokens.backgroundColour}\n cornerRadius={containerTokens.cornerRadius}\n style={[\n styles.container,\n {\n borderColor: containerTokens.borderColour,\n borderWidth: containerTokens.borderWidth,\n shadowColor: containerTokens.shadowColour,\n shadowOffset: {\n width: containerTokens.shadowOffsetX,\n height: containerTokens.shadowOffsetY,\n },\n shadowRadius: containerTokens.shadowBlurRadius,\n shadowOpacity: containerTokens.shadowOpacity,\n },\n ]}\n >\n <MonthYearHeader\n viewYear={viewYear}\n viewMonth={viewMonth}\n today={today}\n openDropdown={openDropdown}\n isPrevArrowDisabled={isPrevArrowDisabled}\n isNextArrowDisabled={isNextArrowDisabled}\n resolvedTokens={resolvedTokens}\n monthNames={monthNames}\n onMonthPillPress={handleMonthPillPress}\n onYearPillPress={handleYearPillPress}\n onPrevPress={handlePrevPress}\n onNextPress={handleNextPress}\n />\n\n <View style={styles.contentArea}>\n {openDropdown === 'none' && (\n <CalendarGrid\n viewYear={viewYear}\n viewMonth={viewMonth}\n selectedDate={selectedDate}\n today={today}\n constraintConfig={constraintConfig}\n resolvedTokens={resolvedTokens}\n dayShapeRadius={dayShapeRadius}\n firstDayOfWeek={firstDayOfWeek}\n onDayPress={handleDayPress}\n />\n )}\n {openDropdown === 'month' && (\n <MonthSelector\n viewYear={viewYear}\n viewMonth={viewMonth}\n selectedDate={selectedDate}\n today={today}\n constraintConfig={constraintConfig}\n resolvedTokens={resolvedTokens}\n monthNames={monthNames}\n onMonthSelect={handleMonthSelect}\n onDismiss={handleDismissDropdown}\n />\n )}\n {openDropdown === 'year' && (\n <YearSelector\n viewYear={viewYear}\n selectedDate={selectedDate}\n today={today}\n constraintConfig={constraintConfig}\n resolvedTokens={resolvedTokens}\n onYearSelect={handleYearSelect}\n onDismiss={handleDismissDropdown}\n />\n )}\n </View>\n\n {showSelectedDate && selectedDate && (\n <Text style={[\n styles.selectedDateText,\n { color: resolvedTokens.footer.selectedDateTextColour },\n ]}>\n {(selectedDateLabelProp ?? defaultSelectedDateLabel)(selectedDate)}\n </Text>\n )}\n\n <ConfirmFooter\n selectedDate={selectedDate}\n isConfirmEnabled={isConfirmEnabled}\n resolvedTokens={resolvedTokens}\n confirmLabel={confirmLabelProp}\n placeholderLabel={placeholderLabelProp}\n onCancel={handleCancel}\n onConfirm={handleConfirm}\n />\n </GlassContainer>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n scene: {\n padding: 16,\n },\n container: {\n padding: 16,\n overflow: 'hidden',\n height: 480,\n },\n contentArea: {\n flex: 1,\n },\n selectedDateText: {\n fontSize: 15,\n textAlign: 'center',\n paddingVertical: 8,\n },\n});\n","export function daysInMonth(year: number, month: number): number {\n return new Date(year, month, 0).getDate();\n}\n\nexport function firstWeekdayOf(year: number, month: number): number {\n return new Date(year, month - 1, 1).getDay();\n}\n\nexport function previousMonth(year: number, month: number): { year: number; month: number } {\n if (month === 1) {\n return { year: year - 1, month: 12 };\n }\n return { year, month: month - 1 };\n}\n\nexport function nextMonth(year: number, month: number): { year: number; month: number } {\n if (month === 12) {\n return { year: year + 1, month: 1 };\n }\n return { year, month: month + 1 };\n}\n","import { daysInMonth } from './calendar';\n\nexport type ConstraintPreset = 'none' | 'birthday' | 'adult' | 'future' | 'custom';\n\nexport interface ConstraintConfig {\n preset: ConstraintPreset;\n minDate?: Date;\n maxDate?: Date;\n yearRange?: number;\n}\n\nexport interface ConstraintBounds {\n minDate: Date;\n maxDate: Date;\n}\n\nconst DEFAULT_YEAR_RANGE = 100;\n\nfunction makeDate(year: number, month: number, day: number): Date {\n return new Date(year, month - 1, day);\n}\n\nfunction dateYear(d: Date): number {\n return d.getFullYear();\n}\n\nfunction dateMonth(d: Date): number {\n return d.getMonth() + 1;\n}\n\nfunction dateDay(d: Date): number {\n return d.getDate();\n}\n\nfunction isLeapYear(year: number): boolean {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\nfunction computeAdultMaxDate(today: Date): Date {\n const year = dateYear(today) - 18;\n const month = dateMonth(today);\n const day = dateDay(today);\n\n if (month === 2 && day === 29 && !isLeapYear(year)) {\n return makeDate(year, 3, 1);\n }\n return makeDate(year, month, day);\n}\n\nfunction dateToNumber(d: Date): number {\n return dateYear(d) * 10000 + dateMonth(d) * 100 + dateDay(d);\n}\n\nfunction compareDates(a: Date, b: Date): number {\n return dateToNumber(a) - dateToNumber(b);\n}\n\nexport function resolveConstraintBounds(config: ConstraintConfig, today: Date): ConstraintBounds {\n const range = config.yearRange ?? DEFAULT_YEAR_RANGE;\n const defaultMin = makeDate(dateYear(today) - range, 1, 1);\n const defaultMax = makeDate(dateYear(today) + range, 12, 31);\n\n switch (config.preset) {\n case 'none':\n return { minDate: defaultMin, maxDate: defaultMax };\n case 'birthday':\n return { minDate: defaultMin, maxDate: today };\n case 'adult':\n return { minDate: defaultMin, maxDate: computeAdultMaxDate(today) };\n case 'future': {\n const tomorrow = makeDate(dateYear(today), dateMonth(today), dateDay(today) + 1);\n return { minDate: tomorrow, maxDate: defaultMax };\n }\n case 'custom':\n return {\n minDate: config.minDate ?? defaultMin,\n maxDate: config.maxDate ?? makeDate(9999, 12, 31),\n };\n }\n}\n\nexport function isConstraintConfigInvalid(config: ConstraintConfig): boolean {\n return (\n config.preset === 'custom' &&\n config.minDate !== undefined &&\n config.maxDate !== undefined &&\n compareDates(config.minDate, config.maxDate) > 0\n );\n}\n\nexport function isDateSelectableFromBounds(date: Date | null | undefined, bounds: ConstraintBounds): boolean {\n if (date == null) return false;\n return compareDates(date, bounds.minDate) >= 0 && compareDates(date, bounds.maxDate) <= 0;\n}\n\nexport function isDateSelectable(date: Date, config: ConstraintConfig, today: Date): boolean {\n const bounds = resolveConstraintBounds(config, today);\n return isDateSelectableFromBounds(date, bounds);\n}\n\nexport function isMonthSelectable(\n year: number,\n month: number,\n config: ConstraintConfig,\n today: Date,\n): boolean {\n const bounds = resolveConstraintBounds(config, today);\n const firstOfMonth = makeDate(year, month, 1);\n const lastOfMonth = makeDate(year, month, daysInMonth(year, month));\n\n return compareDates(lastOfMonth, bounds.minDate) >= 0 && compareDates(firstOfMonth, bounds.maxDate) <= 0;\n}\n\nexport function isYearSelectable(year: number, config: ConstraintConfig, today: Date): boolean {\n const bounds = resolveConstraintBounds(config, today);\n const firstOfYear = makeDate(year, 1, 1);\n const lastOfYear = makeDate(year, 12, 31);\n\n return compareDates(lastOfYear, bounds.minDate) >= 0 && compareDates(firstOfYear, bounds.maxDate) <= 0;\n}\n\nexport function clampDate(date: Date, config: ConstraintConfig, today: Date): Date | null {\n if (isConstraintConfigInvalid(config)) return null;\n const bounds = resolveConstraintBounds(config, today);\n\n if (isDateSelectableFromBounds(date, bounds)) return date;\n if (compareDates(date, bounds.minDate) < 0) return bounds.minDate;\n if (compareDates(date, bounds.maxDate) > 0) return bounds.maxDate;\n return null;\n}\n","const HEX6_REGEX = /^#[0-9A-Fa-f]{6}$/;\nconst HEX8_REGEX = /^#[0-9A-Fa-f]{8}$/;\n\nexport function validateHexColour(s: string): boolean {\n return HEX6_REGEX.test(s) || HEX8_REGEX.test(s);\n}\n\nexport function hexToRgba(s: string): { r: number; g: number; b: number; a: number } {\n const h = s.replace('#', '');\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n const a = h.length === 8 ? parseInt(h.slice(6, 8), 16) : 255;\n return { r, g, b, a };\n}\n\nfunction relativeLuminance(hex: string): number {\n const { r, g, b } = hexToRgba(hex);\n const linearise = (c: number) => {\n const s = c / 255;\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n };\n return 0.2126 * linearise(r) + 0.7152 * linearise(g) + 0.0722 * linearise(b);\n}\n\nexport function contrastRatio(fg: string, bg: string): number {\n const l1 = relativeLuminance(fg);\n const l2 = relativeLuminance(bg);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n","import type { GlassDateTokens } from '../types/tokens.types';\n\nexport const MONO_DEFAULT_ACCENT = '#4FC3F7';\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } {\n const h = hex.replace('#', '');\n return {\n r: parseInt(h.slice(0, 2), 16),\n g: parseInt(h.slice(2, 4), 16),\n b: parseInt(h.slice(4, 6), 16),\n };\n}\n\nfunction rgbToHex8(r: number, g: number, b: number, a: number): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n return (\n '#' +\n [r, g, b, a]\n .map((v) => clamp(v).toString(16).padStart(2, '0'))\n .join('')\n );\n}\n\nfunction withAlpha(hex: string, opacity: number): string {\n const { r, g, b } = hexToRgb(hex);\n return rgbToHex8(r, g, b, Math.round(opacity * 255));\n}\n\nfunction relativeLuminance(hex: string): number {\n const { r, g, b } = hexToRgb(hex);\n const linearise = (c: number) => {\n const s = c / 255;\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n };\n return 0.2126 * linearise(r) + 0.7152 * linearise(g) + 0.0722 * linearise(b);\n}\n\nexport function computeMonoTokens(accent: string): GlassDateTokens {\n const lum = relativeLuminance(accent);\n const useDarkText = lum > 0.179;\n const textOnSurface = useDarkText ? '#1A1A2E' : '#F5F5FF';\n const textOnAccent = useDarkText ? '#1A1A2E' : '#FFFFFF';\n const popupBg = useDarkText ? '#FAFAFA' : '#1A1A28';\n const popupText = useDarkText ? '#1A1A2E' : '#F5F5FF';\n\n return {\n scene: { backgroundColour: withAlpha(accent, 0.13) },\n container: {\n backgroundColour: withAlpha(accent, 0.06),\n borderColour: withAlpha(accent, 0.22),\n borderWidth: 1,\n cornerRadius: 18,\n shadowColour: accent,\n shadowOffsetX: 0,\n shadowOffsetY: 6,\n shadowBlurRadius: 24,\n shadowOpacity: 0.15,\n blurRadius: 0,\n },\n pill: {\n backgroundColour: withAlpha(accent, 0.1),\n borderColour: withAlpha(accent, 0.25),\n borderWidth: 1,\n cornerRadius: 10,\n textColour: accent,\n fontWeight: 500,\n hoverBackgroundColour: withAlpha(accent, 0.18),\n todayBackgroundColour: accent,\n todayBorderColour: accent,\n todayTextColour: textOnAccent,\n },\n popup: {\n backgroundColour: popupBg,\n borderColour: withAlpha(accent, 0.2),\n borderWidth: 1,\n cornerRadius: 14,\n itemTextColour: popupText,\n itemFontWeight: 500,\n itemHoverBackgroundColour: withAlpha(accent, 0.08),\n itemActiveBackgroundColour: accent,\n itemActiveTextColour: textOnAccent,\n itemSelectedBackgroundColour: withAlpha(accent, 0.18),\n itemSelectedTextColour: accent,\n itemDisabledOpacity: 0.22,\n },\n nav: {\n backgroundColour: withAlpha(accent, 0.1),\n borderColour: withAlpha(accent, 0.22),\n borderWidth: 1,\n cornerRadius: 8,\n arrowColour: accent,\n hoverBackgroundColour: withAlpha(accent, 0.18),\n disabledOpacity: 0.22,\n },\n grid: {\n weekdayLabelColour: withAlpha(accent, 0.45),\n weekdayFontWeight: 600,\n dayTextColour: textOnSurface,\n dayFontWeight: 400,\n dayHoverBackgroundColour: withAlpha(accent, 0.08),\n daySelectedBackgroundColour: accent,\n daySelectedTextColour: textOnAccent,\n dayTodayFontWeight: 700,\n dayTodayDotColour: accent,\n dayOutOfRangeOpacity: 0.18,\n dayAdjacentMonthOpacity: 0.18,\n },\n footer: {\n cancelBackgroundColour: withAlpha(accent, 0.07),\n cancelBorderColour: withAlpha(accent, 0.18),\n cancelBorderWidth: 1,\n cancelTextColour: withAlpha(accent, 0.6),\n cancelCornerRadius: 12,\n cancelHoverBackgroundColour: withAlpha(accent, 0.14),\n confirmBackgroundColour: accent,\n confirmBorderColour: withAlpha(accent, 0.5),\n confirmBorderWidth: 1,\n confirmTextColour: textOnAccent,\n confirmCornerRadius: 12,\n confirmHoverBackgroundColour: withAlpha(accent, 0.87),\n disabledOpacity: 0.38,\n selectedDateTextColour: textOnSurface,\n },\n meta: { name: 'mono', mode: 'single', defaultAccent: accent },\n };\n}\n","{\n \"scene\": { \"backgroundColour\": \"#000000\" },\n \"container\": {\n \"backgroundColour\": \"#1C1C1E\",\n \"borderColour\": \"#38383A\",\n \"borderWidth\": 1,\n \"cornerRadius\": 16,\n \"shadowColour\": \"#000000\",\n \"shadowOffsetX\": 0,\n \"shadowOffsetY\": 4,\n \"shadowBlurRadius\": 16,\n \"shadowOpacity\": 0.3,\n \"blurRadius\": 0\n },\n \"pill\": {\n \"backgroundColour\": \"#2C2C2E\",\n \"borderColour\": \"#38383A\",\n \"borderWidth\": 1,\n \"cornerRadius\": 10,\n \"textColour\": \"#FFFFFF\",\n \"fontWeight\": 600,\n \"hoverBackgroundColour\": \"#3A3A3C\",\n \"todayBackgroundColour\": \"accent\",\n \"todayBorderColour\": \"accent\",\n \"todayTextColour\": \"#FFFFFF\"\n },\n \"popup\": {\n \"backgroundColour\": \"#2C2C2E\",\n \"borderColour\": \"#38383A\",\n \"borderWidth\": 1,\n \"cornerRadius\": 12,\n \"itemTextColour\": \"#FFFFFF\",\n \"itemFontWeight\": 500,\n \"itemHoverBackgroundColour\": \"#3A3A3C\",\n \"itemActiveBackgroundColour\": \"accent\",\n \"itemActiveTextColour\": \"#FFFFFF\",\n \"itemSelectedBackgroundColour\": \"#FFFFFF1A\",\n \"itemSelectedTextColour\": \"#FFFFFF\",\n \"itemDisabledOpacity\": 0.3\n },\n \"nav\": {\n \"backgroundColour\": \"#2C2C2E\",\n \"borderColour\": \"#38383A\",\n \"borderWidth\": 1,\n \"cornerRadius\": 8,\n \"arrowColour\": \"#FFFFFF\",\n \"hoverBackgroundColour\": \"#3A3A3C\",\n \"disabledOpacity\": 0.3\n },\n \"grid\": {\n \"weekdayLabelColour\": \"#8E8E93\",\n \"weekdayFontWeight\": 600,\n \"dayTextColour\": \"#FFFFFF\",\n \"dayFontWeight\": 400,\n \"dayHoverBackgroundColour\": \"#3A3A3C\",\n \"daySelectedBackgroundColour\": \"accent\",\n \"daySelectedTextColour\": \"#FFFFFF\",\n \"dayTodayFontWeight\": 700,\n \"dayTodayDotColour\": \"accent\",\n \"dayOutOfRangeOpacity\": 0.25,\n \"dayAdjacentMonthOpacity\": 0.25\n },\n \"footer\": {\n \"cancelBackgroundColour\": \"#2C2C2E\",\n \"cancelBorderColour\": \"#38383A\",\n \"cancelBorderWidth\": 1,\n \"cancelTextColour\": \"#8E8E93\",\n \"cancelCornerRadius\": 12,\n \"cancelHoverBackgroundColour\": \"#3A3A3C\",\n \"confirmBackgroundColour\": \"accent\",\n \"confirmBorderColour\": \"accent\",\n \"confirmBorderWidth\": 0,\n \"confirmTextColour\": \"#FFFFFF\",\n \"confirmCornerRadius\": 12,\n \"confirmHoverBackgroundColour\": \"accent\",\n \"disabledOpacity\": 0.4,\n \"selectedDateTextColour\": \"#EBEBF5\"\n },\n \"meta\": { \"name\": \"default\", \"mode\": \"dark\", \"defaultAccent\": \"#007AFF\" }\n}\n","{\n \"scene\": { \"backgroundColour\": \"#F2F2F7\" },\n \"container\": {\n \"backgroundColour\": \"#FFFFFF\",\n \"borderColour\": \"#D1D1D6\",\n \"borderWidth\": 1,\n \"cornerRadius\": 16,\n \"shadowColour\": \"#000000\",\n \"shadowOffsetX\": 0,\n \"shadowOffsetY\": 4,\n \"shadowBlurRadius\": 16,\n \"shadowOpacity\": 0.08,\n \"blurRadius\": 0\n },\n \"pill\": {\n \"backgroundColour\": \"#E5E5EA\",\n \"borderColour\": \"#D1D1D6\",\n \"borderWidth\": 1,\n \"cornerRadius\": 10,\n \"textColour\": \"#1C1C1E\",\n \"fontWeight\": 600,\n \"hoverBackgroundColour\": \"#D1D1D6\",\n \"todayBackgroundColour\": \"accent\",\n \"todayBorderColour\": \"accent\",\n \"todayTextColour\": \"#FFFFFF\"\n },\n \"popup\": {\n \"backgroundColour\": \"#FFFFFF\",\n \"borderColour\": \"#D1D1D6\",\n \"borderWidth\": 1,\n \"cornerRadius\": 12,\n \"itemTextColour\": \"#1C1C1E\",\n \"itemFontWeight\": 500,\n \"itemHoverBackgroundColour\": \"#E5E5EA\",\n \"itemActiveBackgroundColour\": \"accent\",\n \"itemActiveTextColour\": \"#FFFFFF\",\n \"itemSelectedBackgroundColour\": \"#00000014\",\n \"itemSelectedTextColour\": \"#1C1C1E\",\n \"itemDisabledOpacity\": 0.3\n },\n \"nav\": {\n \"backgroundColour\": \"#E5E5EA\",\n \"borderColour\": \"#D1D1D6\",\n \"borderWidth\": 1,\n \"cornerRadius\": 8,\n \"arrowColour\": \"#1C1C1E\",\n \"hoverBackgroundColour\": \"#D1D1D6\",\n \"disabledOpacity\": 0.3\n },\n \"grid\": {\n \"weekdayLabelColour\": \"#8E8E93\",\n \"weekdayFontWeight\": 600,\n \"dayTextColour\": \"#1C1C1E\",\n \"dayFontWeight\": 400,\n \"dayHoverBackgroundColour\": \"#E5E5EA\",\n \"daySelectedBackgroundColour\": \"accent\",\n \"daySelectedTextColour\": \"#FFFFFF\",\n \"dayTodayFontWeight\": 700,\n \"dayTodayDotColour\": \"accent\",\n \"dayOutOfRangeOpacity\": 0.25,\n \"dayAdjacentMonthOpacity\": 0.25\n },\n \"footer\": {\n \"cancelBackgroundColour\": \"#E5E5EA\",\n \"cancelBorderColour\": \"#D1D1D6\",\n \"cancelBorderWidth\": 1,\n \"cancelTextColour\": \"#8E8E93\",\n \"cancelCornerRadius\": 12,\n \"cancelHoverBackgroundColour\": \"#D1D1D6\",\n \"confirmBackgroundColour\": \"accent\",\n \"confirmBorderColour\": \"accent\",\n \"confirmBorderWidth\": 0,\n \"confirmTextColour\": \"#FFFFFF\",\n \"confirmCornerRadius\": 12,\n \"confirmHoverBackgroundColour\": \"accent\",\n \"disabledOpacity\": 0.4,\n \"selectedDateTextColour\": \"#3C3C43\"\n },\n \"meta\": { \"name\": \"default\", \"mode\": \"light\", \"defaultAccent\": \"#007AFF\" }\n}\n","{\n \"scene\": { \"backgroundColour\": \"#000000\" },\n \"container\": {\n \"backgroundColour\": \"#1C1C1E80\",\n \"borderColour\": \"#FFFFFF1A\",\n \"borderWidth\": 0.5,\n \"cornerRadius\": 22,\n \"shadowColour\": \"#000000\",\n \"shadowOffsetX\": 0,\n \"shadowOffsetY\": 8,\n \"shadowBlurRadius\": 32,\n \"shadowOpacity\": 0.4,\n \"blurRadius\": 20\n },\n \"pill\": {\n \"backgroundColour\": \"#FFFFFF14\",\n \"borderColour\": \"#FFFFFF1A\",\n \"borderWidth\": 0.5,\n \"cornerRadius\": 12,\n \"textColour\": \"#EBEBF5\",\n \"fontWeight\": 600,\n \"hoverBackgroundColour\": \"#FFFFFF24\",\n \"todayBackgroundColour\": \"accent\",\n \"todayBorderColour\": \"accent\",\n \"todayTextColour\": \"#FFFFFF\"\n },\n \"popup\": {\n \"backgroundColour\": \"#2C2C2ECC\",\n \"borderColour\": \"#FFFFFF1A\",\n \"borderWidth\": 0.5,\n \"cornerRadius\": 14,\n \"itemTextColour\": \"#EBEBF5\",\n \"itemFontWeight\": 500,\n \"itemHoverBackgroundColour\": \"#FFFFFF14\",\n \"itemActiveBackgroundColour\": \"accent\",\n \"itemActiveTextColour\": \"#FFFFFF\",\n \"itemSelectedBackgroundColour\": \"#FFFFFF1A\",\n \"itemSelectedTextColour\": \"#FFFFFF\",\n \"itemDisabledOpacity\": 0.25\n },\n \"nav\": {\n \"backgroundColour\": \"#FFFFFF14\",\n \"borderColour\": \"#FFFFFF1A\",\n \"borderWidth\": 0.5,\n \"cornerRadius\": 10,\n \"arrowColour\": \"#EBEBF5\",\n \"hoverBackgroundColour\": \"#FFFFFF24\",\n \"disabledOpacity\": 0.25\n },\n \"grid\": {\n \"weekdayLabelColour\": \"#EBEBF599\",\n \"weekdayFontWeight\": 600,\n \"dayTextColour\": \"#EBEBF5\",\n \"dayFontWeight\": 400,\n \"dayHoverBackgroundColour\": \"#FFFFFF14\",\n \"daySelectedBackgroundColour\": \"accent\",\n \"daySelectedTextColour\": \"#FFFFFF\",\n \"dayTodayFontWeight\": 700,\n \"dayTodayDotColour\": \"accent\",\n \"dayOutOfRangeOpacity\": 0.2,\n \"dayAdjacentMonthOpacity\": 0.2\n },\n \"footer\": {\n \"cancelBackgroundColour\": \"#FFFFFF14\",\n \"cancelBorderColour\": \"#FFFFFF1A\",\n \"cancelBorderWidth\": 0.5,\n \"cancelTextColour\": \"#EBEBF599\",\n \"cancelCornerRadius\": 14,\n \"cancelHoverBackgroundColour\": \"#FFFFFF24\",\n \"confirmBackgroundColour\": \"accent\",\n \"confirmBorderColour\": \"accent\",\n \"confirmBorderWidth\": 0,\n \"confirmTextColour\": \"#FFFFFF\",\n \"confirmCornerRadius\": 14,\n \"confirmHoverBackgroundColour\": \"accent\",\n \"disabledOpacity\": 0.35,\n \"selectedDateTextColour\": \"#EBEBF599\"\n },\n \"meta\": { \"name\": \"ios-liquid\", \"mode\": \"dark\", \"defaultAccent\": \"#0A84FF\" }\n}\n","{\n \"scene\": { \"backgroundColour\": \"#F2F2F7\" },\n \"container\": {\n \"backgroundColour\": \"#FFFFFF99\",\n \"borderColour\": \"#0000001A\",\n \"borderWidth\": 0.5,\n \"cornerRadius\": 22,\n \"shadowColour\": \"#000000\",\n \"shadowOffsetX\": 0,\n \"shadowOffsetY\": 8,\n \"shadowBlurRadius\": 32,\n \"shadowOpacity\": 0.12,\n \"blurRadius\": 20\n },\n \"pill\": {\n \"backgroundColour\": \"#7878801F\",\n \"borderColour\": \"#7878801A\",\n \"borderWidth\": 0.5,\n \"cornerRadius\": 12,\n \"textColour\": \"#1C1C1E\",\n \"fontWeight\": 600,\n \"hoverBackgroundColour\": \"#78788033\",\n \"todayBackgroundColour\": \"accent\",\n \"todayBorderColour\": \"accent\",\n \"todayTextColour\": \"#FFFFFF\"\n },\n \"popup\": {\n \"backgroundColour\": \"#FFFFFFCC\",\n \"borderColour\": \"#0000001A\",\n \"borderWidth\": 0.5,\n \"cornerRadius\": 14,\n \"itemTextColour\": \"#1C1C1E\",\n \"itemFontWeight\": 500,\n \"itemHoverBackgroundColour\": \"#78788014\",\n \"itemActiveBackgroundColour\": \"accent\",\n \"itemActiveTextColour\": \"#FFFFFF\",\n \"itemSelectedBackgroundColour\": \"#00000014\",\n \"itemSelectedTextColour\": \"#1C1C1E\",\n \"itemDisabledOpacity\": 0.25\n },\n \"nav\": {\n \"backgroundColour\": \"#7878801F\",\n \"borderColour\": \"#7878801A\",\n \"borderWidth\": 0.5,\n \"cornerRadius\": 10,\n \"arrowColour\": \"#1C1C1E\",\n \"hoverBackgroundColour\": \"#78788033\",\n \"disabledOpacity\": 0.25\n },\n \"grid\": {\n \"weekdayLabelColour\": \"#3C3C4399\",\n \"weekdayFontWeight\": 600,\n \"dayTextColour\": \"#1C1C1E\",\n \"dayFontWeight\": 400,\n \"dayHoverBackgroundColour\": \"#78788014\",\n \"daySelectedBackgroundColour\": \"accent\",\n \"daySelectedTextColour\": \"#FFFFFF\",\n \"dayTodayFontWeight\": 700,\n \"dayTodayDotColour\": \"accent\",\n \"dayOutOfRangeOpacity\": 0.2,\n \"dayAdjacentMonthOpacity\": 0.2\n },\n \"footer\": {\n \"cancelBackgroundColour\": \"#7878801F\",\n \"cancelBorderColour\": \"#7878801A\",\n \"cancelBorderWidth\": 0.5,\n \"cancelTextColour\": \"#3C3C4399\",\n \"cancelCornerRadius\": 14,\n \"cancelHoverBackgroundColour\": \"#78788033\",\n \"confirmBackgroundColour\": \"accent\",\n \"confirmBorderColour\": \"accent\",\n \"confirmBorderWidth\": 0,\n \"confirmTextColour\": \"#FFFFFF\",\n \"confirmCornerRadius\": 14,\n \"confirmHoverBackgroundColour\": \"accent\",\n \"disabledOpacity\": 0.35,\n \"selectedDateTextColour\": \"#3C3C4399\"\n },\n \"meta\": { \"name\": \"ios-liquid\", \"mode\": \"light\", \"defaultAccent\": \"#007AFF\" }\n}\n","{\n \"scene\": { \"backgroundColour\": \"#121212\" },\n \"container\": {\n \"backgroundColour\": \"#1E1E1E\",\n \"borderColour\": \"#333333\",\n \"borderWidth\": 1,\n \"cornerRadius\": 28,\n \"shadowColour\": \"#000000\",\n \"shadowOffsetX\": 0,\n \"shadowOffsetY\": 2,\n \"shadowBlurRadius\": 8,\n \"shadowOpacity\": 0.3,\n \"blurRadius\": 0\n },\n \"pill\": {\n \"backgroundColour\": \"#2D2D2D\",\n \"borderColour\": \"#404040\",\n \"borderWidth\": 0,\n \"cornerRadius\": 8,\n \"textColour\": \"#E6E1E5\",\n \"fontWeight\": 500,\n \"hoverBackgroundColour\": \"#383838\",\n \"todayBackgroundColour\": \"accent\",\n \"todayBorderColour\": \"accent\",\n \"todayTextColour\": \"#FFFFFF\"\n },\n \"popup\": {\n \"backgroundColour\": \"#2D2D2D\",\n \"borderColour\": \"#404040\",\n \"borderWidth\": 0,\n \"cornerRadius\": 16,\n \"itemTextColour\": \"#E6E1E5\",\n \"itemFontWeight\": 500,\n \"itemHoverBackgroundColour\": \"#383838\",\n \"itemActiveBackgroundColour\": \"accent\",\n \"itemActiveTextColour\": \"#FFFFFF\",\n \"itemSelectedBackgroundColour\": \"#FFFFFF1A\",\n \"itemSelectedTextColour\": \"#FFFFFF\",\n \"itemDisabledOpacity\": 0.38\n },\n \"nav\": {\n \"backgroundColour\": \"#2D2D2D\",\n \"borderColour\": \"#404040\",\n \"borderWidth\": 0,\n \"cornerRadius\": 20,\n \"arrowColour\": \"#E6E1E5\",\n \"hoverBackgroundColour\": \"#383838\",\n \"disabledOpacity\": 0.38\n },\n \"grid\": {\n \"weekdayLabelColour\": \"#CAC4D0\",\n \"weekdayFontWeight\": 500,\n \"dayTextColour\": \"#E6E1E5\",\n \"dayFontWeight\": 400,\n \"dayHoverBackgroundColour\": \"#383838\",\n \"daySelectedBackgroundColour\": \"accent\",\n \"daySelectedTextColour\": \"#FFFFFF\",\n \"dayTodayFontWeight\": 600,\n \"dayTodayDotColour\": \"accent\",\n \"dayOutOfRangeOpacity\": 0.38,\n \"dayAdjacentMonthOpacity\": 0.38\n },\n \"footer\": {\n \"cancelBackgroundColour\": \"#2D2D2D\",\n \"cancelBorderColour\": \"#49454F\",\n \"cancelBorderWidth\": 1,\n \"cancelTextColour\": \"#CAC4D0\",\n \"cancelCornerRadius\": 20,\n \"cancelHoverBackgroundColour\": \"#383838\",\n \"confirmBackgroundColour\": \"accent\",\n \"confirmBorderColour\": \"accent\",\n \"confirmBorderWidth\": 0,\n \"confirmTextColour\": \"#FFFFFF\",\n \"confirmCornerRadius\": 20,\n \"confirmHoverBackgroundColour\": \"accent\",\n \"disabledOpacity\": 0.38,\n \"selectedDateTextColour\": \"#CAC4D0\"\n },\n \"meta\": { \"name\": \"material3\", \"mode\": \"dark\", \"defaultAccent\": \"#D0BCFF\" }\n}\n","{\n \"scene\": { \"backgroundColour\": \"#FFFBFE\" },\n \"container\": {\n \"backgroundColour\": \"#FFFBFE\",\n \"borderColour\": \"#CAC4D0\",\n \"borderWidth\": 1,\n \"cornerRadius\": 28,\n \"shadowColour\": \"#000000\",\n \"shadowOffsetX\": 0,\n \"shadowOffsetY\": 2,\n \"shadowBlurRadius\": 8,\n \"shadowOpacity\": 0.08,\n \"blurRadius\": 0\n },\n \"pill\": {\n \"backgroundColour\": \"#E8DEF8\",\n \"borderColour\": \"#CAC4D0\",\n \"borderWidth\": 0,\n \"cornerRadius\": 8,\n \"textColour\": \"#1C1B1F\",\n \"fontWeight\": 500,\n \"hoverBackgroundColour\": \"#D0BCFF66\",\n \"todayBackgroundColour\": \"accent\",\n \"todayBorderColour\": \"accent\",\n \"todayTextColour\": \"#FFFFFF\"\n },\n \"popup\": {\n \"backgroundColour\": \"#FFFBFE\",\n \"borderColour\": \"#CAC4D0\",\n \"borderWidth\": 0,\n \"cornerRadius\": 16,\n \"itemTextColour\": \"#1C1B1F\",\n \"itemFontWeight\": 500,\n \"itemHoverBackgroundColour\": \"#E8DEF8\",\n \"itemActiveBackgroundColour\": \"accent\",\n \"itemActiveTextColour\": \"#FFFFFF\",\n \"itemSelectedBackgroundColour\": \"#00000014\",\n \"itemSelectedTextColour\": \"#1C1C1E\",\n \"itemDisabledOpacity\": 0.38\n },\n \"nav\": {\n \"backgroundColour\": \"#E8DEF8\",\n \"borderColour\": \"#CAC4D0\",\n \"borderWidth\": 0,\n \"cornerRadius\": 20,\n \"arrowColour\": \"#1C1B1F\",\n \"hoverBackgroundColour\": \"#D0BCFF66\",\n \"disabledOpacity\": 0.38\n },\n \"grid\": {\n \"weekdayLabelColour\": \"#49454F\",\n \"weekdayFontWeight\": 500,\n \"dayTextColour\": \"#1C1B1F\",\n \"dayFontWeight\": 400,\n \"dayHoverBackgroundColour\": \"#E8DEF8\",\n \"daySelectedBackgroundColour\": \"accent\",\n \"daySelectedTextColour\": \"#FFFFFF\",\n \"dayTodayFontWeight\": 600,\n \"dayTodayDotColour\": \"accent\",\n \"dayOutOfRangeOpacity\": 0.38,\n \"dayAdjacentMonthOpacity\": 0.38\n },\n \"footer\": {\n \"cancelBackgroundColour\": \"#E8DEF8\",\n \"cancelBorderColour\": \"#79747E\",\n \"cancelBorderWidth\": 1,\n \"cancelTextColour\": \"#49454F\",\n \"cancelCornerRadius\": 20,\n \"cancelHoverBackgroundColour\": \"#D0BCFF66\",\n \"confirmBackgroundColour\": \"accent\",\n \"confirmBorderColour\": \"accent\",\n \"confirmBorderWidth\": 0,\n \"confirmTextColour\": \"#FFFFFF\",\n \"confirmCornerRadius\": 20,\n \"confirmHoverBackgroundColour\": \"accent\",\n \"disabledOpacity\": 0.38,\n \"selectedDateTextColour\": \"#49454F\"\n },\n \"meta\": { \"name\": \"material3\", \"mode\": \"light\", \"defaultAccent\": \"#6750A4\" }\n}\n","{\n \"scene\": { \"backgroundColour\": \"#FFF8E1\" },\n \"container\": {\n \"backgroundColour\": \"#FFFDE7\",\n \"borderColour\": \"#1A1A1A\",\n \"borderWidth\": 3,\n \"cornerRadius\": 20,\n \"shadowColour\": \"#1A1A1A\",\n \"shadowOffsetX\": 4,\n \"shadowOffsetY\": 4,\n \"shadowBlurRadius\": 0,\n \"shadowOpacity\": 1,\n \"blurRadius\": 0\n },\n \"pill\": {\n \"backgroundColour\": \"#FFE082\",\n \"borderColour\": \"#1A1A1A\",\n \"borderWidth\": 2,\n \"cornerRadius\": 12,\n \"textColour\": \"#1A1A1A\",\n \"fontWeight\": 800,\n \"hoverBackgroundColour\": \"#FFD54F\",\n \"todayBackgroundColour\": \"accent\",\n \"todayBorderColour\": \"accent\",\n \"todayTextColour\": \"#FFFFFF\"\n },\n \"popup\": {\n \"backgroundColour\": \"#FFF9C4\",\n \"borderColour\": \"#1A1A1A\",\n \"borderWidth\": 2,\n \"cornerRadius\": 14,\n \"itemTextColour\": \"#1A1A1A\",\n \"itemFontWeight\": 700,\n \"itemHoverBackgroundColour\": \"#FFE082\",\n \"itemActiveBackgroundColour\": \"accent\",\n \"itemActiveTextColour\": \"#FFFFFF\",\n \"itemSelectedBackgroundColour\": \"#FFE082\",\n \"itemSelectedTextColour\": \"#1A1A1A\",\n \"itemDisabledOpacity\": 0.3\n },\n \"nav\": {\n \"backgroundColour\": \"#FFE082\",\n \"borderColour\": \"#1A1A1A\",\n \"borderWidth\": 2,\n \"cornerRadius\": 10,\n \"arrowColour\": \"#1A1A1A\",\n \"hoverBackgroundColour\": \"#FFD54F\",\n \"disabledOpacity\": 0.3\n },\n \"grid\": {\n \"weekdayLabelColour\": \"#5D4037\",\n \"weekdayFontWeight\": 700,\n \"dayTextColour\": \"#1A1A1A\",\n \"dayFontWeight\": 600,\n \"dayHoverBackgroundColour\": \"#FFE082\",\n \"daySelectedBackgroundColour\": \"accent\",\n \"daySelectedTextColour\": \"#FFFFFF\",\n \"dayTodayFontWeight\": 800,\n \"dayTodayDotColour\": \"accent\",\n \"dayOutOfRangeOpacity\": 0.25,\n \"dayAdjacentMonthOpacity\": 0.25\n },\n \"footer\": {\n \"cancelBackgroundColour\": \"#FFE082\",\n \"cancelBorderColour\": \"#1A1A1A\",\n \"cancelBorderWidth\": 2,\n \"cancelTextColour\": \"#5D4037\",\n \"cancelCornerRadius\": 14,\n \"cancelHoverBackgroundColour\": \"#FFD54F\",\n \"confirmBackgroundColour\": \"accent\",\n \"confirmBorderColour\": \"accent\",\n \"confirmBorderWidth\": 2,\n \"confirmTextColour\": \"#FFFFFF\",\n \"confirmCornerRadius\": 14,\n \"confirmHoverBackgroundColour\": \"accent\",\n \"disabledOpacity\": 0.35,\n \"selectedDateTextColour\": \"#4E342E\"\n },\n \"meta\": { \"name\": \"toon\", \"mode\": \"single\", \"defaultAccent\": \"#FF6D00\" }\n}\n","{\n \"scene\": { \"backgroundColour\": \"#ECEFF1\" },\n \"container\": {\n \"backgroundColour\": \"#FFFFFF\",\n \"borderColour\": \"#FFFFFF\",\n \"borderWidth\": 0,\n \"cornerRadius\": 8,\n \"shadowColour\": \"#000000\",\n \"shadowOffsetX\": 0,\n \"shadowOffsetY\": 0,\n \"shadowBlurRadius\": 0,\n \"shadowOpacity\": 0,\n \"blurRadius\": 0\n },\n \"pill\": {\n \"backgroundColour\": \"#ECEFF1\",\n \"borderColour\": \"#ECEFF1\",\n \"borderWidth\": 0,\n \"cornerRadius\": 6,\n \"textColour\": \"#37474F\",\n \"fontWeight\": 600,\n \"hoverBackgroundColour\": \"#CFD8DC\",\n \"todayBackgroundColour\": \"accent\",\n \"todayBorderColour\": \"accent\",\n \"todayTextColour\": \"#FFFFFF\"\n },\n \"popup\": {\n \"backgroundColour\": \"#ECEFF1\",\n \"borderColour\": \"#ECEFF1\",\n \"borderWidth\": 0,\n \"cornerRadius\": 6,\n \"itemTextColour\": \"#37474F\",\n \"itemFontWeight\": 500,\n \"itemHoverBackgroundColour\": \"#CFD8DC\",\n \"itemActiveBackgroundColour\": \"accent\",\n \"itemActiveTextColour\": \"#FFFFFF\",\n \"itemSelectedBackgroundColour\": \"#CFD8DC\",\n \"itemSelectedTextColour\": \"#37474F\",\n \"itemDisabledOpacity\": 0.3\n },\n \"nav\": {\n \"backgroundColour\": \"#ECEFF1\",\n \"borderColour\": \"#ECEFF1\",\n \"borderWidth\": 0,\n \"cornerRadius\": 6,\n \"arrowColour\": \"#37474F\",\n \"hoverBackgroundColour\": \"#CFD8DC\",\n \"disabledOpacity\": 0.3\n },\n \"grid\": {\n \"weekdayLabelColour\": \"#78909C\",\n \"weekdayFontWeight\": 500,\n \"dayTextColour\": \"#37474F\",\n \"dayFontWeight\": 400,\n \"dayHoverBackgroundColour\": \"#ECEFF1\",\n \"daySelectedBackgroundColour\": \"accent\",\n \"daySelectedTextColour\": \"#FFFFFF\",\n \"dayTodayFontWeight\": 700,\n \"dayTodayDotColour\": \"accent\",\n \"dayOutOfRangeOpacity\": 0.25,\n \"dayAdjacentMonthOpacity\": 0.25\n },\n \"footer\": {\n \"cancelBackgroundColour\": \"#ECEFF1\",\n \"cancelBorderColour\": \"#ECEFF1\",\n \"cancelBorderWidth\": 0,\n \"cancelTextColour\": \"#78909C\",\n \"cancelCornerRadius\": 6,\n \"cancelHoverBackgroundColour\": \"#CFD8DC\",\n \"confirmBackgroundColour\": \"accent\",\n \"confirmBorderColour\": \"accent\",\n \"confirmBorderWidth\": 0,\n \"confirmTextColour\": \"#FFFFFF\",\n \"confirmCornerRadius\": 6,\n \"confirmHoverBackgroundColour\": \"accent\",\n \"disabledOpacity\": 0.35,\n \"selectedDateTextColour\": \"#546E7A\"\n },\n \"meta\": { \"name\": \"flat\", \"mode\": \"single\", \"defaultAccent\": \"#2196F3\" }\n}\n","{\n \"scene\": { \"backgroundColour\": \"#FAFAFA\" },\n \"container\": {\n \"backgroundColour\": \"#FFFFFF\",\n \"borderColour\": \"#E0E0E0\",\n \"borderWidth\": 1,\n \"cornerRadius\": 4,\n \"shadowColour\": \"#000000\",\n \"shadowOffsetX\": 0,\n \"shadowOffsetY\": 1,\n \"shadowBlurRadius\": 3,\n \"shadowOpacity\": 0.06,\n \"blurRadius\": 0\n },\n \"pill\": {\n \"backgroundColour\": \"#F5F5F5\",\n \"borderColour\": \"#E0E0E0\",\n \"borderWidth\": 1,\n \"cornerRadius\": 4,\n \"textColour\": \"#212121\",\n \"fontWeight\": 500,\n \"hoverBackgroundColour\": \"#EEEEEE\",\n \"todayBackgroundColour\": \"accent\",\n \"todayBorderColour\": \"accent\",\n \"todayTextColour\": \"#FFFFFF\"\n },\n \"popup\": {\n \"backgroundColour\": \"#FFFFFF\",\n \"borderColour\": \"#E0E0E0\",\n \"borderWidth\": 1,\n \"cornerRadius\": 4,\n \"itemTextColour\": \"#212121\",\n \"itemFontWeight\": 400,\n \"itemHoverBackgroundColour\": \"#F5F5F5\",\n \"itemActiveBackgroundColour\": \"accent\",\n \"itemActiveTextColour\": \"#FFFFFF\",\n \"itemSelectedBackgroundColour\": \"#EEEEEE\",\n \"itemSelectedTextColour\": \"#212121\",\n \"itemDisabledOpacity\": 0.3\n },\n \"nav\": {\n \"backgroundColour\": \"#F5F5F5\",\n \"borderColour\": \"#E0E0E0\",\n \"borderWidth\": 1,\n \"cornerRadius\": 4,\n \"arrowColour\": \"#212121\",\n \"hoverBackgroundColour\": \"#EEEEEE\",\n \"disabledOpacity\": 0.3\n },\n \"grid\": {\n \"weekdayLabelColour\": \"#757575\",\n \"weekdayFontWeight\": 500,\n \"dayTextColour\": \"#212121\",\n \"dayFontWeight\": 400,\n \"dayHoverBackgroundColour\": \"#F5F5F5\",\n \"daySelectedBackgroundColour\": \"accent\",\n \"daySelectedTextColour\": \"#FFFFFF\",\n \"dayTodayFontWeight\": 600,\n \"dayTodayDotColour\": \"accent\",\n \"dayOutOfRangeOpacity\": 0.25,\n \"dayAdjacentMonthOpacity\": 0.25\n },\n \"footer\": {\n \"cancelBackgroundColour\": \"#F5F5F5\",\n \"cancelBorderColour\": \"#E0E0E0\",\n \"cancelBorderWidth\": 1,\n \"cancelTextColour\": \"#757575\",\n \"cancelCornerRadius\": 4,\n \"cancelHoverBackgroundColour\": \"#EEEEEE\",\n \"confirmBackgroundColour\": \"accent\",\n \"confirmBorderColour\": \"accent\",\n \"confirmBorderWidth\": 0,\n \"confirmTextColour\": \"#FFFFFF\",\n \"confirmCornerRadius\": 4,\n \"confirmHoverBackgroundColour\": \"accent\",\n \"disabledOpacity\": 0.35,\n \"selectedDateTextColour\": \"#616161\"\n },\n \"meta\": { \"name\": \"plain\", \"mode\": \"single\", \"defaultAccent\": \"#424242\" }\n}\n","import type { GlassDateTokens, ThemeKey, DeepPartial, DayShape } from '../types/tokens.types';\nimport { validateHexColour } from '../utils/colourUtils';\nimport { computeMonoTokens, MONO_DEFAULT_ACCENT } from './mono';\n\nimport defaultDark from '../../../tokens/themes/default.dark.json';\nimport defaultLight from '../../../tokens/themes/default.light.json';\nimport iosLiquidDark from '../../../tokens/themes/ios-liquid.dark.json';\nimport iosLiquidLight from '../../../tokens/themes/ios-liquid.light.json';\nimport material3Dark from '../../../tokens/themes/material3.dark.json';\nimport material3Light from '../../../tokens/themes/material3.light.json';\nimport toon from '../../../tokens/themes/toon.json';\nimport flat from '../../../tokens/themes/flat.json';\nimport plain from '../../../tokens/themes/plain.json';\n\ntype ColorScheme = 'dark' | 'light';\n\nconst THEME_MAP: Record<string, GlassDateTokens> = {\n 'default.dark': defaultDark as unknown as GlassDateTokens,\n 'default.light': defaultLight as unknown as GlassDateTokens,\n 'ios-liquid.dark': iosLiquidDark as unknown as GlassDateTokens,\n 'ios-liquid.light': iosLiquidLight as unknown as GlassDateTokens,\n 'material3.dark': material3Dark as unknown as GlassDateTokens,\n 'material3.light': material3Light as unknown as GlassDateTokens,\n 'toon': toon as unknown as GlassDateTokens,\n 'flat': flat as unknown as GlassDateTokens,\n 'plain': plain as unknown as GlassDateTokens,\n};\n\nconst SINGLE_MODE_THEMES: Set<ThemeKey> = new Set(['toon', 'flat', 'plain']);\n\nfunction deepMerge<T extends Record<string, unknown>>(base: T, override: Partial<Record<string, unknown>>): T {\n const result = { ...base };\n for (const key of Object.keys(override)) {\n const ov = override[key];\n const bv = result[key as keyof T];\n if (\n ov !== undefined &&\n ov !== null &&\n typeof ov === 'object' &&\n !Array.isArray(ov) &&\n typeof bv === 'object' &&\n bv !== null\n ) {\n (result as Record<string, unknown>)[key] = deepMerge(\n bv as Record<string, unknown>,\n ov as Record<string, unknown>,\n );\n } else if (ov !== undefined) {\n (result as Record<string, unknown>)[key] = ov;\n }\n }\n return result;\n}\n\nfunction replaceAccent(tokens: GlassDateTokens, resolvedAccent: string): GlassDateTokens {\n const result = JSON.parse(JSON.stringify(tokens)) as GlassDateTokens;\n\n const replace = (obj: Record<string, unknown>) => {\n for (const key of Object.keys(obj)) {\n const val = obj[key];\n if (val === 'accent') {\n obj[key] = resolvedAccent;\n } else if (typeof val === 'object' && val !== null) {\n replace(val as Record<string, unknown>);\n }\n }\n };\n\n replace(result as unknown as Record<string, unknown>);\n return result;\n}\n\nexport function mapDayShapeToRadius(dayShape: DayShape): number {\n switch (dayShape) {\n case 'circle':\n return 9999;\n case 'round-square':\n return 14;\n case 'subtle':\n return 10;\n }\n}\n\nexport function resolveTokens(\n theme: ThemeKey,\n colorScheme: ColorScheme,\n accent: string | undefined,\n tokenOverrides: DeepPartial<GlassDateTokens> | undefined,\n): GlassDateTokens {\n // Step 1 / 1a — Load base theme\n let tokens: GlassDateTokens;\n\n if (theme === 'mono') {\n const resolvedAccent =\n accent !== undefined && validateHexColour(accent) ? accent : MONO_DEFAULT_ACCENT;\n tokens = computeMonoTokens(resolvedAccent);\n // Mono outputs use accent directly — no \"accent\" keyword to replace.\n // Jump to Step 4 (dayShape handled by caller) then Step 5.\n if (tokenOverrides !== undefined) {\n tokens = deepMerge(\n tokens as unknown as Record<string, unknown>,\n tokenOverrides as unknown as Partial<Record<string, unknown>>,\n ) as unknown as GlassDateTokens;\n }\n return tokens;\n }\n\n if (SINGLE_MODE_THEMES.has(theme)) {\n const loaded = THEME_MAP[theme];\n if (!loaded) {\n throw new Error(`Unknown theme: ${theme}`);\n }\n tokens = JSON.parse(JSON.stringify(loaded)) as GlassDateTokens;\n } else {\n const key = `${theme}.${colorScheme}`;\n const loaded = THEME_MAP[key];\n if (!loaded) {\n throw new Error(`Unknown theme/colorScheme: ${key}`);\n }\n tokens = JSON.parse(JSON.stringify(loaded)) as GlassDateTokens;\n }\n\n // Step 2 — Resolve accent\n const resolvedAccent =\n accent !== undefined && validateHexColour(accent) ? accent : tokens.meta.defaultAccent;\n\n // Step 3 — Substitute 'accent' keyword\n tokens = replaceAccent(tokens, resolvedAccent);\n\n // Step 4 — dayShape mapping handled by caller (mapDayShapeToRadius)\n\n // Step 5 — Deep-merge partial token overrides\n if (tokenOverrides !== undefined) {\n tokens = deepMerge(\n tokens as unknown as Record<string, unknown>,\n tokenOverrides as unknown as Partial<Record<string, unknown>>,\n ) as unknown as GlassDateTokens;\n }\n\n return tokens;\n}\n","import React from 'react';\nimport { View, Platform, type StyleProp, type ViewStyle } from 'react-native';\n\nlet GlassView: React.ComponentType<any> | null = null;\nlet isLiquidGlassAvailable: (() => boolean) | null = null;\nlet isGlassEffectAPIAvailable: (() => boolean) | null = null;\n\ntry {\n const pkg = require('expo-glass-effect');\n GlassView = pkg.GlassView;\n isLiquidGlassAvailable = pkg.isLiquidGlassAvailable;\n isGlassEffectAPIAvailable = pkg.isGlassEffectAPIAvailable;\n} catch {\n // Not installed — solid fallback applies everywhere\n}\n\ninterface GlassContainerProps {\n blurRadius: number;\n backgroundColour: string;\n cornerRadius: number;\n style?: StyleProp<ViewStyle>;\n children: React.ReactNode;\n}\n\nexport function GlassContainer({\n blurRadius,\n backgroundColour,\n cornerRadius,\n style,\n children,\n}: GlassContainerProps): React.ReactElement {\n const useGlass =\n blurRadius > 0 &&\n GlassView !== null &&\n isLiquidGlassAvailable?.() === true &&\n isGlassEffectAPIAvailable?.() === true;\n\n if (useGlass && GlassView) {\n return (\n <GlassView\n style={[\n style,\n {\n borderRadius: cornerRadius,\n ...Platform.select({ web: { userSelect: 'none' } as any }),\n },\n ]}\n glassEffectStyle=\"regular\"\n tintColor={backgroundColour}\n >\n {children}\n </GlassView>\n );\n }\n\n return (\n <View\n style={[\n style,\n {\n borderRadius: cornerRadius,\n backgroundColor: backgroundColour,\n ...Platform.select({ web: { userSelect: 'none' } as any }),\n },\n ]}\n >\n {children}\n </View>\n );\n}\n","import React from 'react';\nimport { View, Text, Pressable, Platform, StyleSheet } from 'react-native';\nimport type { GlassDateTokens } from './types/tokens.types';\nimport { resolveConstraintBounds, isDateSelectableFromBounds, type ConstraintConfig, type ConstraintBounds } from './logic/constraints';\nimport { daysInMonth, firstWeekdayOf, previousMonth, nextMonth } from './logic/calendar';\n\nconst WEEKDAY_LABELS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\nconst FULL_MONTH_NAMES = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\nconst TOTAL_CELLS = 42;\n\nfunction buildAccessibilityLabel(\n day: number, month: number, year: number,\n isToday: boolean, isSelected: boolean, isOutOfRange: boolean, isAdjacentMonth: boolean,\n): string {\n const dateStr = `${FULL_MONTH_NAMES[month - 1]} ${day}, ${year}`;\n const suffixes: string[] = [];\n if (isSelected) suffixes.push('selected');\n if (isToday) suffixes.push('today');\n if (isOutOfRange || isAdjacentMonth) suffixes.push('not available');\n return suffixes.length > 0 ? `${dateStr}, ${suffixes.join(', ')}` : dateStr;\n}\n\ninterface CalendarGridProps {\n viewYear: number;\n viewMonth: number;\n selectedDate: Date | null;\n today: Date;\n constraintConfig: ConstraintConfig;\n resolvedTokens: GlassDateTokens;\n dayShapeRadius: number;\n firstDayOfWeek: number;\n onDayPress: (date: Date) => void;\n}\n\ninterface DayCell {\n day: number;\n month: number;\n year: number;\n isAdjacentMonth: boolean;\n}\n\nfunction buildCells(year: number, month: number, firstDayOfWeek: number): DayCell[] {\n const cells: DayCell[] = [];\n const daysThisMonth = daysInMonth(year, month);\n const startWeekday = firstWeekdayOf(year, month);\n const offset = (startWeekday - firstDayOfWeek + 7) % 7;\n\n const prev = previousMonth(year, month);\n const daysPrevMonth = daysInMonth(prev.year, prev.month);\n\n for (let i = 0; i < offset; i++) {\n cells.push({\n day: daysPrevMonth - offset + 1 + i,\n month: prev.month,\n year: prev.year,\n isAdjacentMonth: true,\n });\n }\n\n for (let d = 1; d <= daysThisMonth; d++) {\n cells.push({ day: d, month, year, isAdjacentMonth: false });\n }\n\n const next = nextMonth(year, month);\n let nextDay = 1;\n while (cells.length < TOTAL_CELLS) {\n cells.push({ day: nextDay++, month: next.month, year: next.year, isAdjacentMonth: true });\n }\n\n // Drop last row if it's entirely adjacent-month days\n const lastRow = cells.slice(35, 42);\n if (lastRow.every((c) => c.isAdjacentMonth)) {\n cells.length = 35;\n }\n\n return cells;\n}\n\nfunction isSameDate(a: Date | null, b: Date): boolean {\n if (!a) return false;\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\n\nfunction isSameDateParts(a: Date | null, year: number, month: number, day: number): boolean {\n if (!a) return false;\n return a.getFullYear() === year && a.getMonth() + 1 === month && a.getDate() === day;\n}\n\nconst webInteractive = Platform.select({\n web: { cursor: 'pointer', outlineStyle: 'none' } as any,\n});\n\nexport function CalendarGrid({\n viewYear,\n viewMonth,\n selectedDate,\n today,\n constraintConfig,\n resolvedTokens,\n dayShapeRadius,\n firstDayOfWeek,\n onDayPress,\n}: CalendarGridProps): React.ReactElement {\n const bounds: ConstraintBounds = resolveConstraintBounds(constraintConfig, today);\n const cells = buildCells(viewYear, viewMonth, firstDayOfWeek);\n const t = resolvedTokens.grid;\n\n const shiftedLabels: string[] = [];\n for (let i = 0; i < 7; i++) {\n shiftedLabels.push(WEEKDAY_LABELS[(firstDayOfWeek + i) % 7]!);\n }\n\n return (\n <View style={[styles.container, Platform.select({ web: { userSelect: 'none' } as any })]}>\n <View style={styles.weekdayRow}>\n {shiftedLabels.map((label, i) => (\n <View key={i} style={styles.weekdayCell}>\n <Text\n style={{\n color: t.weekdayLabelColour,\n fontWeight: String(t.weekdayFontWeight) as any,\n fontSize: 13,\n textAlign: 'center',\n }}\n >\n {label}\n </Text>\n </View>\n ))}\n </View>\n\n <View style={styles.gridContainer}>\n {cells.map((cell, index) => {\n const cellDate = new Date(cell.year, cell.month - 1, cell.day);\n const isSelectable = !cell.isAdjacentMonth && isDateSelectableFromBounds(cellDate, bounds);\n const isSelected = isSameDateParts(selectedDate, cell.year, cell.month, cell.day);\n const isToday =\n !cell.isAdjacentMonth &&\n today.getFullYear() === cell.year &&\n today.getMonth() + 1 === cell.month &&\n today.getDate() === cell.day;\n const isOutOfRange = !cell.isAdjacentMonth && !isSelectable;\n\n const a11yLabel = buildAccessibilityLabel(\n cell.day, cell.month, cell.year,\n isToday, isSelected, isOutOfRange, cell.isAdjacentMonth,\n );\n\n return (\n <Pressable\n key={index}\n disabled={!isSelectable}\n accessibilityRole=\"button\"\n accessibilityLabel={a11yLabel}\n accessibilityState={{\n selected: isSelected,\n disabled: !isSelectable,\n }}\n onPress={() => {\n if (isSelectable) {\n onDayPress(cellDate);\n }\n }}\n style={(({ hovered }: { hovered?: boolean }) => [\n styles.dayCell,\n {\n borderRadius: dayShapeRadius,\n },\n isSelected && {\n backgroundColor: t.daySelectedBackgroundColour,\n },\n !isSelected && hovered && isSelectable && {\n backgroundColor: t.dayHoverBackgroundColour,\n },\n !isSelected && hovered && isToday && !isOutOfRange && {\n backgroundColor: t.dayHoverBackgroundColour,\n },\n isSelectable && webInteractive,\n ]) as any}\n >\n <Text\n style={[\n {\n fontSize: 16,\n textAlign: 'center',\n color: isSelected ? t.daySelectedTextColour : t.dayTextColour,\n fontWeight: isToday && !isSelected\n ? (String(t.dayTodayFontWeight) as any)\n : (String(t.dayFontWeight) as any),\n opacity: cell.isAdjacentMonth\n ? t.dayAdjacentMonthOpacity\n : isOutOfRange\n ? t.dayOutOfRangeOpacity\n : 1,\n },\n ]}\n >\n {cell.day}\n </Text>\n {isToday && !isSelected && !cell.isAdjacentMonth && (\n <View\n style={{\n width: 5,\n height: 5,\n borderRadius: 2.5,\n backgroundColor: t.dayTodayDotColour,\n alignSelf: 'center',\n marginTop: 2,\n }}\n />\n )}\n </Pressable>\n );\n })}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n weekdayRow: {\n flexDirection: 'row',\n marginBottom: 4,\n },\n weekdayCell: {\n flex: 1,\n alignItems: 'center',\n paddingVertical: 4,\n },\n gridContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n },\n dayCell: {\n width: '14.285%' as any,\n height: 44,\n justifyContent: 'center',\n alignItems: 'center',\n },\n});\n","import React from 'react';\nimport { View, Text, Pressable, Platform, StyleSheet } from 'react-native';\nimport type { GlassDateTokens, OpenDropdown } from './types/tokens.types';\n\nconst MONTH_NAMES = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\n\ninterface MonthYearHeaderProps {\n viewYear: number;\n viewMonth: number;\n today: Date;\n openDropdown: OpenDropdown;\n isPrevArrowDisabled: boolean;\n isNextArrowDisabled: boolean;\n resolvedTokens: GlassDateTokens;\n monthNames?: string[];\n onMonthPillPress: () => void;\n onYearPillPress: () => void;\n onPrevPress: () => void;\n onNextPress: () => void;\n}\n\nconst webInteractive = Platform.select({\n web: { cursor: 'pointer', outlineStyle: 'none' } as any,\n});\n\nexport function MonthYearHeader({\n viewYear,\n viewMonth,\n today,\n openDropdown,\n isPrevArrowDisabled,\n isNextArrowDisabled,\n resolvedTokens,\n monthNames: customMonthNames,\n onMonthPillPress,\n onYearPillPress,\n onPrevPress,\n onNextPress,\n}: MonthYearHeaderProps): React.ReactElement {\n const pill = resolvedTokens.pill;\n const displayMonthNames = customMonthNames ?? MONTH_NAMES;\n const nav = resolvedTokens.nav;\n\n const isMonthPillHighlighted =\n viewYear === today.getFullYear() && viewMonth === today.getMonth() + 1;\n const isYearPillHighlighted = viewYear === today.getFullYear();\n\n const prevDisabled = isPrevArrowDisabled || openDropdown !== 'none';\n const nextDisabled = isNextArrowDisabled || openDropdown !== 'none';\n\n return (\n <View style={styles.container}>\n <View style={styles.pillContainer}>\n <Pressable\n onPress={onMonthPillPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`${MONTH_NAMES[viewMonth - 1]}, select month`}\n style={(({ pressed, hovered }: { pressed: boolean; hovered?: boolean }) => [\n styles.pill,\n {\n backgroundColor: isMonthPillHighlighted\n ? pill.todayBackgroundColour\n : hovered\n ? pill.hoverBackgroundColour\n : pill.backgroundColour,\n borderColor: isMonthPillHighlighted ? pill.todayBorderColour : pill.borderColour,\n borderWidth: pill.borderWidth,\n borderRadius: pill.cornerRadius,\n opacity: pressed ? 0.7 : 1,\n },\n webInteractive,\n ]) as any}\n >\n <Text\n style={{\n color: isMonthPillHighlighted ? pill.todayTextColour : pill.textColour,\n fontWeight: String(pill.fontWeight) as any,\n fontSize: 16,\n }}\n >\n {displayMonthNames[viewMonth - 1]} {'▼'}\n </Text>\n </Pressable>\n\n <Pressable\n onPress={onYearPillPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`${viewYear}, select year`}\n style={(({ pressed, hovered }: { pressed: boolean; hovered?: boolean }) => [\n styles.pill,\n {\n backgroundColor: isYearPillHighlighted\n ? pill.todayBackgroundColour\n : hovered\n ? pill.hoverBackgroundColour\n : pill.backgroundColour,\n borderColor: isYearPillHighlighted ? pill.todayBorderColour : pill.borderColour,\n borderWidth: pill.borderWidth,\n borderRadius: pill.cornerRadius,\n opacity: pressed ? 0.7 : 1,\n },\n webInteractive,\n ]) as any}\n >\n <Text\n style={{\n color: isYearPillHighlighted ? pill.todayTextColour : pill.textColour,\n fontWeight: String(pill.fontWeight) as any,\n fontSize: 16,\n }}\n >\n {viewYear} {'▼'}\n </Text>\n </Pressable>\n </View>\n\n <View style={styles.arrowGroup}>\n <Pressable\n disabled={prevDisabled}\n onPress={onPrevPress}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Previous month\"\n accessibilityState={{ disabled: prevDisabled }}\n style={(({ pressed, hovered }: { pressed: boolean; hovered?: boolean }) => [\n styles.arrowButton,\n {\n backgroundColor: hovered && !prevDisabled ? nav.hoverBackgroundColour : nav.backgroundColour,\n borderColor: nav.borderColour,\n borderWidth: nav.borderWidth,\n borderRadius: nav.cornerRadius,\n opacity: prevDisabled ? nav.disabledOpacity : pressed ? 0.6 : 1,\n },\n !prevDisabled && webInteractive,\n ]) as any}\n >\n <Text style={{ color: nav.arrowColour, fontSize: 18 }}>{'◀'}</Text>\n </Pressable>\n\n <Pressable\n disabled={nextDisabled}\n onPress={onNextPress}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Next month\"\n accessibilityState={{ disabled: nextDisabled }}\n style={(({ pressed, hovered }: { pressed: boolean; hovered?: boolean }) => [\n styles.arrowButton,\n {\n backgroundColor: hovered && !nextDisabled ? nav.hoverBackgroundColour : nav.backgroundColour,\n borderColor: nav.borderColour,\n borderWidth: nav.borderWidth,\n borderRadius: nav.cornerRadius,\n opacity: nextDisabled ? nav.disabledOpacity : pressed ? 0.6 : 1,\n },\n !nextDisabled && webInteractive,\n ]) as any}\n >\n <Text style={{ color: nav.arrowColour, fontSize: 18 }}>{'▶'}</Text>\n </Pressable>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 8,\n },\n pillContainer: {\n flexDirection: 'row',\n gap: 6,\n },\n pill: {\n flexDirection: 'row',\n paddingHorizontal: 10,\n paddingVertical: 8,\n minHeight: 44,\n justifyContent: 'center',\n alignItems: 'center',\n },\n arrowGroup: {\n flexDirection: 'row',\n gap: 2,\n },\n arrowButton: {\n width: 44,\n height: 44,\n justifyContent: 'center',\n alignItems: 'center',\n },\n});\n","import React from 'react';\nimport { View, Text, Pressable, Platform, StyleSheet } from 'react-native';\nimport type { GlassDateTokens } from './types/tokens.types';\nimport { isMonthSelectable, type ConstraintConfig } from './logic/constraints';\n\nconst MONTH_ABBREVIATIONS = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n];\n\nconst FULL_MONTH_NAMES = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\n\ninterface MonthSelectorProps {\n viewYear: number;\n viewMonth: number;\n selectedDate: Date | null;\n today: Date;\n constraintConfig: ConstraintConfig;\n resolvedTokens: GlassDateTokens;\n monthNames?: string[];\n onMonthSelect: (month: number) => void;\n onDismiss: () => void;\n}\n\nconst webInteractive = Platform.select({\n web: { cursor: 'pointer', outlineStyle: 'none' } as any,\n});\n\nexport function MonthSelector({\n viewYear,\n viewMonth,\n selectedDate,\n today,\n constraintConfig,\n resolvedTokens,\n monthNames: customMonthNames,\n onMonthSelect,\n onDismiss,\n}: MonthSelectorProps): React.ReactElement {\n const popup = resolvedTokens.popup;\n\n const selectedMonth =\n selectedDate !== null && selectedDate.getFullYear() === viewYear\n ? selectedDate.getMonth() + 1\n : null;\n\n return (\n <Pressable onPress={onDismiss} style={[styles.overlay, Platform.select({ web: { userSelect: 'none' } as any })]}>\n <View\n style={[\n styles.grid,\n {\n backgroundColor: popup.backgroundColour,\n borderColor: popup.borderColour,\n borderWidth: popup.borderWidth,\n borderRadius: popup.cornerRadius,\n },\n ]}\n >\n {(customMonthNames ?? MONTH_ABBREVIATIONS).map((label, index) => {\n const month = index + 1;\n const isActive = month === viewMonth;\n const isSelected = !isActive && month === selectedMonth;\n const isSelectable = isMonthSelectable(viewYear, month, constraintConfig, today);\n\n const bgColor = isActive\n ? popup.itemActiveBackgroundColour\n : isSelected\n ? popup.itemSelectedBackgroundColour\n : 'transparent';\n\n const textColor = isActive\n ? popup.itemActiveTextColour\n : isSelected\n ? popup.itemSelectedTextColour\n : popup.itemTextColour;\n\n return (\n <Pressable\n key={month}\n disabled={!isSelectable}\n accessibilityRole=\"button\"\n accessibilityLabel={FULL_MONTH_NAMES[index]}\n accessibilityState={{\n selected: isActive,\n disabled: !isSelectable,\n }}\n onPress={(e) => {\n e.stopPropagation();\n if (isSelectable) {\n onMonthSelect(month);\n }\n }}\n style={(({ hovered }: { hovered?: boolean }) => [\n styles.monthItem,\n {\n backgroundColor:\n hovered && isSelectable && !isActive && !isSelected\n ? popup.itemHoverBackgroundColour\n : bgColor,\n borderRadius: popup.cornerRadius / 2,\n opacity: isSelectable ? 1 : popup.itemDisabledOpacity,\n },\n isSelectable && webInteractive,\n ]) as any}\n >\n <Text\n style={{\n color: textColor,\n fontWeight: String(popup.itemFontWeight) as any,\n fontSize: 15,\n textAlign: 'center',\n }}\n >\n {label}\n </Text>\n </Pressable>\n );\n })}\n </View>\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n },\n grid: {\n flex: 1,\n flexDirection: 'row',\n flexWrap: 'wrap',\n padding: 8,\n justifyContent: 'center',\n alignContent: 'center',\n },\n monthItem: {\n width: '33.333%' as any,\n paddingVertical: 16,\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: 44,\n },\n});\n","import React, { useRef, useMemo } from 'react';\nimport { View, Text, Pressable, ScrollView, Platform, StyleSheet } from 'react-native';\nimport type { GlassDateTokens } from './types/tokens.types';\nimport { isYearSelectable, resolveConstraintBounds, type ConstraintConfig } from './logic/constraints';\n\nconst ITEM_HEIGHT = 44;\n\ninterface YearSelectorProps {\n viewYear: number;\n selectedDate: Date | null;\n today: Date;\n constraintConfig: ConstraintConfig;\n resolvedTokens: GlassDateTokens;\n onYearSelect: (year: number) => void;\n onDismiss: () => void;\n}\n\nconst webInteractive = Platform.select({\n web: { cursor: 'pointer', outlineStyle: 'none' } as any,\n});\n\nexport function YearSelector({\n viewYear,\n selectedDate,\n today,\n constraintConfig,\n resolvedTokens,\n onYearSelect,\n onDismiss,\n}: YearSelectorProps): React.ReactElement {\n const popup = resolvedTokens.popup;\n const scrollRef = useRef<ScrollView>(null);\n const scrolled = useRef(false);\n\n const bounds = resolveConstraintBounds(constraintConfig, today);\n const minYear = bounds.minDate.getFullYear();\n const maxYear = Math.min(bounds.maxDate.getFullYear(), 9999);\n\n const years = useMemo(() => {\n const arr: number[] = [];\n for (let y = minYear; y <= maxYear; y++) {\n arr.push(y);\n }\n return arr;\n }, [minYear, maxYear]);\n\n const selectedYear = selectedDate !== null ? selectedDate.getFullYear() : null;\n\n const targetIndex = useMemo(() => {\n if (years.indexOf(viewYear) >= 0) return years.indexOf(viewYear);\n let best = 0;\n let bestDist = Infinity;\n for (let i = 0; i < years.length; i++) {\n if (isYearSelectable(years[i]!, constraintConfig, today)) {\n const dist = Math.abs(years[i]! - viewYear);\n if (dist < bestDist) {\n best = i;\n bestDist = dist;\n }\n }\n }\n return best;\n }, [viewYear, constraintConfig, today, years]);\n\n return (\n <Pressable onPress={onDismiss} style={[styles.overlay, Platform.select({ web: { userSelect: 'none' } as any })]}>\n <View\n style={[\n styles.listContainer,\n {\n backgroundColor: popup.backgroundColour,\n borderColor: popup.borderColour,\n borderWidth: popup.borderWidth,\n borderRadius: popup.cornerRadius,\n },\n ]}\n >\n <ScrollView\n ref={scrollRef}\n showsVerticalScrollIndicator={false}\n onContentSizeChange={() => {\n if (scrolled.current) return;\n scrolled.current = true;\n const offset = Math.max(0, targetIndex * ITEM_HEIGHT - 3 * ITEM_HEIGHT);\n scrollRef.current?.scrollTo({ y: offset, animated: false });\n }}\n >\n {years.map((year) => {\n const isActive = year === viewYear;\n const isSelected = !isActive && year === selectedYear;\n const selectable = isYearSelectable(year, constraintConfig, today);\n\n const bgColor = isActive\n ? popup.itemActiveBackgroundColour\n : isSelected\n ? popup.itemSelectedBackgroundColour\n : 'transparent';\n\n const textColor = isActive\n ? popup.itemActiveTextColour\n : isSelected\n ? popup.itemSelectedTextColour\n : popup.itemTextColour;\n\n return (\n <Pressable\n key={year}\n disabled={!selectable}\n accessibilityRole=\"button\"\n accessibilityLabel={String(year)}\n accessibilityState={{\n selected: isActive,\n disabled: !selectable,\n }}\n onPress={(e) => {\n e.stopPropagation();\n if (selectable) {\n onYearSelect(year);\n }\n }}\n style={(({ hovered }: { hovered?: boolean }) => [\n styles.yearItem,\n {\n backgroundColor:\n hovered && selectable && !isActive && !isSelected\n ? popup.itemHoverBackgroundColour\n : bgColor,\n borderRadius: popup.cornerRadius / 2,\n opacity: selectable ? 1 : popup.itemDisabledOpacity,\n },\n selectable && webInteractive,\n ]) as any}\n >\n <Text\n style={{\n color: textColor,\n fontWeight: String(popup.itemFontWeight) as any,\n fontSize: 16,\n textAlign: 'center',\n }}\n >\n {year}\n </Text>\n </Pressable>\n );\n })}\n </ScrollView>\n </View>\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n },\n listContainer: {\n flex: 1,\n overflow: 'hidden',\n },\n yearItem: {\n height: ITEM_HEIGHT,\n justifyContent: 'center',\n alignItems: 'center',\n paddingHorizontal: 16,\n },\n});\n","import React from 'react';\nimport { View, Text, Pressable, Platform, StyleSheet } from 'react-native';\nimport type { GlassDateTokens } from './types/tokens.types';\n\ninterface ConfirmFooterProps {\n selectedDate: Date | null;\n isConfirmEnabled: boolean;\n resolvedTokens: GlassDateTokens;\n confirmLabel?: (date: Date) => string;\n placeholderLabel?: string;\n onCancel: () => void;\n onConfirm: () => void;\n}\n\nfunction defaultConfirmLabel(_date: Date): string {\n return 'Done';\n}\n\nconst webInteractive = Platform.select({\n web: { cursor: 'pointer', outlineStyle: 'none' } as any,\n});\n\nexport function ConfirmFooter({\n selectedDate,\n isConfirmEnabled,\n resolvedTokens,\n confirmLabel: confirmLabelFn,\n placeholderLabel = 'Select a date',\n onCancel,\n onConfirm,\n}: ConfirmFooterProps): React.ReactElement {\n const footer = resolvedTokens.footer;\n\n const labelText = selectedDate\n ? (confirmLabelFn ?? defaultConfirmLabel)(selectedDate)\n : placeholderLabel;\n\n return (\n <View style={styles.container}>\n <Pressable\n onPress={onCancel}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Cancel\"\n style={(({ pressed, hovered }: { pressed: boolean; hovered?: boolean }) => [\n styles.button,\n {\n backgroundColor: hovered ? footer.cancelHoverBackgroundColour : footer.cancelBackgroundColour,\n borderColor: footer.cancelBorderColour,\n borderWidth: footer.cancelBorderWidth,\n borderRadius: footer.cancelCornerRadius,\n opacity: pressed ? 0.7 : 1,\n },\n webInteractive,\n ]) as any}\n >\n <Text\n style={{\n color: footer.cancelTextColour,\n fontSize: 16,\n fontWeight: '500',\n textAlign: 'center',\n }}\n >\n Cancel\n </Text>\n </Pressable>\n\n <View style={styles.gap} />\n\n <Pressable\n disabled={!isConfirmEnabled}\n accessibilityRole=\"button\"\n accessibilityLabel={labelText}\n accessibilityState={{ disabled: !isConfirmEnabled }}\n onPress={() => {\n if (isConfirmEnabled) {\n onConfirm();\n }\n }}\n style={(({ pressed, hovered }: { pressed: boolean; hovered?: boolean }) => [\n styles.button,\n {\n backgroundColor:\n hovered && isConfirmEnabled\n ? footer.confirmHoverBackgroundColour\n : footer.confirmBackgroundColour,\n borderColor: footer.confirmBorderColour,\n borderWidth: footer.confirmBorderWidth,\n borderRadius: footer.confirmCornerRadius,\n opacity: !isConfirmEnabled ? footer.disabledOpacity : pressed ? 0.7 : 1,\n },\n isConfirmEnabled && webInteractive,\n ]) as any}\n >\n <Text\n style={{\n color: footer.confirmTextColour,\n fontSize: 16,\n fontWeight: '600',\n textAlign: 'center',\n }}\n >\n {labelText}\n </Text>\n </Pressable>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flexDirection: 'row',\n paddingTop: 8,\n },\n button: {\n flex: 1,\n paddingVertical: 14,\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 44,\n },\n gap: {\n width: 8,\n },\n});\n"],"mappings":"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","names":["View","Text","Platform","StyleSheet","resolvedAccent","View","Platform","jsx","Platform","View","jsx","View","Text","Pressable","Platform","StyleSheet","jsx","jsxs","webInteractive","styles","View","Text","Pressable","Platform","StyleSheet","jsx","FULL_MONTH_NAMES","webInteractive","Platform","Pressable","styles","View","Text","StyleSheet","View","Text","Pressable","Platform","StyleSheet","jsx","webInteractive","Platform","Pressable","styles","View","Text","StyleSheet","View","Text","Pressable","Platform","StyleSheet","jsx","jsxs","webInteractive","styles","jsx","jsxs","Platform","prev","View","styles","Text","StyleSheet"]}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "glassdate-rn",
3
+ "version": "0.1.0",
4
+ "description": "Token-driven, fully-customizable date picker for React Native",
5
+ "license": "MIT",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.mjs",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "src"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsup",
22
+ "typecheck": "tsc --noEmit",
23
+ "test": "jest",
24
+ "prepublishOnly": "tsup"
25
+ },
26
+ "peerDependencies": {
27
+ "react": ">=19.0.0",
28
+ "react-native": ">=0.81.0"
29
+ },
30
+ "peerDependenciesMeta": {
31
+ "expo-glass-effect": {
32
+ "optional": true
33
+ }
34
+ },
35
+ "devDependencies": {
36
+ "@testing-library/react-native": "^12.5.0",
37
+ "@types/jest": "^30.0.0",
38
+ "@types/react": "^19.0.0",
39
+ "@types/react-native": "^0.73.0",
40
+ "jest": "^29.7.0",
41
+ "react": "^19.0.0",
42
+ "react-native": "^0.81.0",
43
+ "react-test-renderer": "^19.0.0",
44
+ "ts-jest": "^29.2.0",
45
+ "tsup": "^8.0.0",
46
+ "typescript": "~5.8.0"
47
+ },
48
+ "jest": {
49
+ "preset": "ts-jest",
50
+ "testEnvironment": "node",
51
+ "roots": [
52
+ "<rootDir>/__tests__"
53
+ ],
54
+ "moduleFileExtensions": [
55
+ "ts",
56
+ "tsx",
57
+ "js",
58
+ "json"
59
+ ],
60
+ "transform": {
61
+ "^.+\\.tsx?$": [
62
+ "ts-jest",
63
+ {
64
+ "tsconfig": "tsconfig.json"
65
+ }
66
+ ]
67
+ }
68
+ }
69
+ }
@@ -0,0 +1,246 @@
1
+ import React from 'react';
2
+ import { View, Text, Pressable, Platform, StyleSheet } from 'react-native';
3
+ import type { GlassDateTokens } from './types/tokens.types';
4
+ import { resolveConstraintBounds, isDateSelectableFromBounds, type ConstraintConfig, type ConstraintBounds } from './logic/constraints';
5
+ import { daysInMonth, firstWeekdayOf, previousMonth, nextMonth } from './logic/calendar';
6
+
7
+ const WEEKDAY_LABELS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
8
+ const FULL_MONTH_NAMES = [
9
+ 'January', 'February', 'March', 'April', 'May', 'June',
10
+ 'July', 'August', 'September', 'October', 'November', 'December',
11
+ ];
12
+ const TOTAL_CELLS = 42;
13
+
14
+ function buildAccessibilityLabel(
15
+ day: number, month: number, year: number,
16
+ isToday: boolean, isSelected: boolean, isOutOfRange: boolean, isAdjacentMonth: boolean,
17
+ ): string {
18
+ const dateStr = `${FULL_MONTH_NAMES[month - 1]} ${day}, ${year}`;
19
+ const suffixes: string[] = [];
20
+ if (isSelected) suffixes.push('selected');
21
+ if (isToday) suffixes.push('today');
22
+ if (isOutOfRange || isAdjacentMonth) suffixes.push('not available');
23
+ return suffixes.length > 0 ? `${dateStr}, ${suffixes.join(', ')}` : dateStr;
24
+ }
25
+
26
+ interface CalendarGridProps {
27
+ viewYear: number;
28
+ viewMonth: number;
29
+ selectedDate: Date | null;
30
+ today: Date;
31
+ constraintConfig: ConstraintConfig;
32
+ resolvedTokens: GlassDateTokens;
33
+ dayShapeRadius: number;
34
+ firstDayOfWeek: number;
35
+ onDayPress: (date: Date) => void;
36
+ }
37
+
38
+ interface DayCell {
39
+ day: number;
40
+ month: number;
41
+ year: number;
42
+ isAdjacentMonth: boolean;
43
+ }
44
+
45
+ function buildCells(year: number, month: number, firstDayOfWeek: number): DayCell[] {
46
+ const cells: DayCell[] = [];
47
+ const daysThisMonth = daysInMonth(year, month);
48
+ const startWeekday = firstWeekdayOf(year, month);
49
+ const offset = (startWeekday - firstDayOfWeek + 7) % 7;
50
+
51
+ const prev = previousMonth(year, month);
52
+ const daysPrevMonth = daysInMonth(prev.year, prev.month);
53
+
54
+ for (let i = 0; i < offset; i++) {
55
+ cells.push({
56
+ day: daysPrevMonth - offset + 1 + i,
57
+ month: prev.month,
58
+ year: prev.year,
59
+ isAdjacentMonth: true,
60
+ });
61
+ }
62
+
63
+ for (let d = 1; d <= daysThisMonth; d++) {
64
+ cells.push({ day: d, month, year, isAdjacentMonth: false });
65
+ }
66
+
67
+ const next = nextMonth(year, month);
68
+ let nextDay = 1;
69
+ while (cells.length < TOTAL_CELLS) {
70
+ cells.push({ day: nextDay++, month: next.month, year: next.year, isAdjacentMonth: true });
71
+ }
72
+
73
+ // Drop last row if it's entirely adjacent-month days
74
+ const lastRow = cells.slice(35, 42);
75
+ if (lastRow.every((c) => c.isAdjacentMonth)) {
76
+ cells.length = 35;
77
+ }
78
+
79
+ return cells;
80
+ }
81
+
82
+ function isSameDate(a: Date | null, b: Date): boolean {
83
+ if (!a) return false;
84
+ return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
85
+ }
86
+
87
+ function isSameDateParts(a: Date | null, year: number, month: number, day: number): boolean {
88
+ if (!a) return false;
89
+ return a.getFullYear() === year && a.getMonth() + 1 === month && a.getDate() === day;
90
+ }
91
+
92
+ const webInteractive = Platform.select({
93
+ web: { cursor: 'pointer', outlineStyle: 'none' } as any,
94
+ });
95
+
96
+ export function CalendarGrid({
97
+ viewYear,
98
+ viewMonth,
99
+ selectedDate,
100
+ today,
101
+ constraintConfig,
102
+ resolvedTokens,
103
+ dayShapeRadius,
104
+ firstDayOfWeek,
105
+ onDayPress,
106
+ }: CalendarGridProps): React.ReactElement {
107
+ const bounds: ConstraintBounds = resolveConstraintBounds(constraintConfig, today);
108
+ const cells = buildCells(viewYear, viewMonth, firstDayOfWeek);
109
+ const t = resolvedTokens.grid;
110
+
111
+ const shiftedLabels: string[] = [];
112
+ for (let i = 0; i < 7; i++) {
113
+ shiftedLabels.push(WEEKDAY_LABELS[(firstDayOfWeek + i) % 7]!);
114
+ }
115
+
116
+ return (
117
+ <View style={[styles.container, Platform.select({ web: { userSelect: 'none' } as any })]}>
118
+ <View style={styles.weekdayRow}>
119
+ {shiftedLabels.map((label, i) => (
120
+ <View key={i} style={styles.weekdayCell}>
121
+ <Text
122
+ style={{
123
+ color: t.weekdayLabelColour,
124
+ fontWeight: String(t.weekdayFontWeight) as any,
125
+ fontSize: 13,
126
+ textAlign: 'center',
127
+ }}
128
+ >
129
+ {label}
130
+ </Text>
131
+ </View>
132
+ ))}
133
+ </View>
134
+
135
+ <View style={styles.gridContainer}>
136
+ {cells.map((cell, index) => {
137
+ const cellDate = new Date(cell.year, cell.month - 1, cell.day);
138
+ const isSelectable = !cell.isAdjacentMonth && isDateSelectableFromBounds(cellDate, bounds);
139
+ const isSelected = isSameDateParts(selectedDate, cell.year, cell.month, cell.day);
140
+ const isToday =
141
+ !cell.isAdjacentMonth &&
142
+ today.getFullYear() === cell.year &&
143
+ today.getMonth() + 1 === cell.month &&
144
+ today.getDate() === cell.day;
145
+ const isOutOfRange = !cell.isAdjacentMonth && !isSelectable;
146
+
147
+ const a11yLabel = buildAccessibilityLabel(
148
+ cell.day, cell.month, cell.year,
149
+ isToday, isSelected, isOutOfRange, cell.isAdjacentMonth,
150
+ );
151
+
152
+ return (
153
+ <Pressable
154
+ key={index}
155
+ disabled={!isSelectable}
156
+ accessibilityRole="button"
157
+ accessibilityLabel={a11yLabel}
158
+ accessibilityState={{
159
+ selected: isSelected,
160
+ disabled: !isSelectable,
161
+ }}
162
+ onPress={() => {
163
+ if (isSelectable) {
164
+ onDayPress(cellDate);
165
+ }
166
+ }}
167
+ style={(({ hovered }: { hovered?: boolean }) => [
168
+ styles.dayCell,
169
+ {
170
+ borderRadius: dayShapeRadius,
171
+ },
172
+ isSelected && {
173
+ backgroundColor: t.daySelectedBackgroundColour,
174
+ },
175
+ !isSelected && hovered && isSelectable && {
176
+ backgroundColor: t.dayHoverBackgroundColour,
177
+ },
178
+ !isSelected && hovered && isToday && !isOutOfRange && {
179
+ backgroundColor: t.dayHoverBackgroundColour,
180
+ },
181
+ isSelectable && webInteractive,
182
+ ]) as any}
183
+ >
184
+ <Text
185
+ style={[
186
+ {
187
+ fontSize: 16,
188
+ textAlign: 'center',
189
+ color: isSelected ? t.daySelectedTextColour : t.dayTextColour,
190
+ fontWeight: isToday && !isSelected
191
+ ? (String(t.dayTodayFontWeight) as any)
192
+ : (String(t.dayFontWeight) as any),
193
+ opacity: cell.isAdjacentMonth
194
+ ? t.dayAdjacentMonthOpacity
195
+ : isOutOfRange
196
+ ? t.dayOutOfRangeOpacity
197
+ : 1,
198
+ },
199
+ ]}
200
+ >
201
+ {cell.day}
202
+ </Text>
203
+ {isToday && !isSelected && !cell.isAdjacentMonth && (
204
+ <View
205
+ style={{
206
+ width: 5,
207
+ height: 5,
208
+ borderRadius: 2.5,
209
+ backgroundColor: t.dayTodayDotColour,
210
+ alignSelf: 'center',
211
+ marginTop: 2,
212
+ }}
213
+ />
214
+ )}
215
+ </Pressable>
216
+ );
217
+ })}
218
+ </View>
219
+ </View>
220
+ );
221
+ }
222
+
223
+ const styles = StyleSheet.create({
224
+ container: {
225
+ flex: 1,
226
+ },
227
+ weekdayRow: {
228
+ flexDirection: 'row',
229
+ marginBottom: 4,
230
+ },
231
+ weekdayCell: {
232
+ flex: 1,
233
+ alignItems: 'center',
234
+ paddingVertical: 4,
235
+ },
236
+ gridContainer: {
237
+ flexDirection: 'row',
238
+ flexWrap: 'wrap',
239
+ },
240
+ dayCell: {
241
+ width: '14.285%' as any,
242
+ height: 44,
243
+ justifyContent: 'center',
244
+ alignItems: 'center',
245
+ },
246
+ });