@kanso-labs/react-native-kanso-ui 0.9.0 → 0.10.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.
- package/README.md +4 -3
- package/dist/autocomplete/index.js +15 -1
- package/dist/autocomplete/index.js.map +1 -1
- package/dist/button/group.d.ts +5 -0
- package/dist/button/group.js +115 -0
- package/dist/button/group.js.map +1 -0
- package/dist/button/index.d.ts +4 -1
- package/dist/button/index.js +44 -22
- package/dist/button/index.js.map +1 -1
- package/dist/button/slots.js +2 -1
- package/dist/button/slots.js.map +1 -1
- package/dist/calendar/index.js +351 -182
- package/dist/calendar/index.js.map +1 -1
- package/dist/calendar/styles.js +33 -2
- package/dist/calendar/styles.js.map +1 -1
- package/dist/carousel/arrangement.d.ts +5 -0
- package/dist/carousel/arrangement.js +123 -0
- package/dist/carousel/arrangement.js.map +1 -0
- package/dist/chequer/index.js +95 -0
- package/dist/chequer/index.js.map +1 -0
- package/dist/collection/index.d.ts +157 -0
- package/dist/collection/index.js +1331 -0
- package/dist/collection/index.js.map +1 -0
- package/dist/color-thumb/index.js +56 -0
- package/dist/color-thumb/index.js.map +1 -0
- package/dist/components/button/index.d.ts +4 -2
- package/dist/components/button/index.js +227 -188
- package/dist/components/button/index.js.map +1 -1
- package/dist/components/button-group/index.d.ts +87 -0
- package/dist/components/button-group/index.js +275 -0
- package/dist/components/button-group/index.js.map +1 -0
- package/dist/components/calendar/index.d.ts +11 -3
- package/dist/components/calendar/index.js +60 -45
- package/dist/components/calendar/index.js.map +1 -1
- package/dist/components/carousel/index.d.ts +72 -0
- package/dist/components/carousel/index.js +496 -0
- package/dist/components/carousel/index.js.map +1 -0
- package/dist/components/checkbox-group/index.d.ts +3 -4
- package/dist/components/checkbox-group/index.js +1 -1
- package/dist/components/checkbox-group/index.js.map +1 -1
- package/dist/components/color-area/index.d.ts +85 -0
- package/dist/components/color-area/index.js +630 -0
- package/dist/components/color-area/index.js.map +1 -0
- package/dist/components/color-field/index.d.ts +144 -0
- package/dist/components/color-field/index.js +516 -0
- package/dist/components/color-field/index.js.map +1 -0
- package/dist/components/color-picker/index.d.ts +74 -0
- package/dist/components/color-picker/index.js +317 -0
- package/dist/components/color-picker/index.js.map +1 -0
- package/dist/components/color-slider/index.d.ts +82 -0
- package/dist/components/color-slider/index.js +456 -0
- package/dist/components/color-slider/index.js.map +1 -0
- package/dist/components/color-swatch/index.d.ts +46 -0
- package/dist/components/color-swatch/index.js +127 -0
- package/dist/components/color-swatch/index.js.map +1 -0
- package/dist/components/color-swatch-picker/index.d.ts +81 -0
- package/dist/components/color-swatch-picker/index.js +287 -0
- package/dist/components/color-swatch-picker/index.js.map +1 -0
- package/dist/components/color-wheel/index.d.ts +71 -0
- package/dist/components/color-wheel/index.js +407 -0
- package/dist/components/color-wheel/index.js.map +1 -0
- package/dist/components/combo-box/index.d.ts +193 -0
- package/dist/components/combo-box/index.js +616 -0
- package/dist/components/combo-box/index.js.map +1 -0
- package/dist/components/date-field/index.d.ts +120 -0
- package/dist/components/date-field/index.js +111 -0
- package/dist/components/date-field/index.js.map +1 -0
- package/dist/components/date-picker/index.d.ts +130 -0
- package/dist/components/date-picker/index.js +310 -0
- package/dist/components/date-picker/index.js.map +1 -0
- package/dist/components/date-range-picker/index.d.ts +139 -0
- package/dist/components/date-range-picker/index.js +421 -0
- package/dist/components/date-range-picker/index.js.map +1 -0
- package/dist/components/disclosure/index.d.ts +94 -0
- package/dist/components/disclosure/index.js +365 -0
- package/dist/components/disclosure/index.js.map +1 -0
- package/dist/components/disclosure-group/index.d.ts +61 -0
- package/dist/components/disclosure-group/index.js +100 -0
- package/dist/components/disclosure-group/index.js.map +1 -0
- package/dist/components/drop-zone/index.d.ts +113 -0
- package/dist/components/drop-zone/index.js +304 -0
- package/dist/components/drop-zone/index.js.map +1 -0
- package/dist/components/fab/index.d.ts +1 -1
- package/dist/components/fab/index.js +91 -76
- package/dist/components/fab/index.js.map +1 -1
- package/dist/components/form/index.d.ts +3 -2
- package/dist/components/form/index.js.map +1 -1
- package/dist/components/icon-button/index.d.ts +4 -2
- package/dist/components/icon-button/index.js +204 -171
- package/dist/components/icon-button/index.js.map +1 -1
- package/dist/components/list/index.d.ts +15 -158
- package/dist/components/list/index.js +21 -1047
- package/dist/components/list/index.js.map +1 -1
- package/dist/components/list-box/index.d.ts +73 -0
- package/dist/components/list-box/index.js +82 -0
- package/dist/components/list-box/index.js.map +1 -0
- package/dist/components/loading-indicator/index.d.ts +32 -0
- package/dist/components/loading-indicator/index.js +174 -0
- package/dist/components/loading-indicator/index.js.map +1 -0
- package/dist/components/navigation-tree/index.d.ts +117 -0
- package/dist/components/navigation-tree/index.js +135 -0
- package/dist/components/navigation-tree/index.js.map +1 -0
- package/dist/components/number-field/index.js +132 -143
- package/dist/components/number-field/index.js.map +1 -1
- package/dist/components/range-calendar/index.d.ts +69 -0
- package/dist/components/range-calendar/index.js +144 -0
- package/dist/components/range-calendar/index.js.map +1 -0
- package/dist/components/search-view/index.d.ts +78 -0
- package/dist/components/search-view/index.js +570 -0
- package/dist/components/search-view/index.js.map +1 -0
- package/dist/components/select/index.d.ts +152 -0
- package/dist/components/select/index.js +419 -0
- package/dist/components/select/index.js.map +1 -0
- package/dist/components/slider/index.d.ts +111 -0
- package/dist/components/slider/index.js +673 -0
- package/dist/components/slider/index.js.map +1 -0
- package/dist/components/split-button/index.d.ts +77 -0
- package/dist/components/split-button/index.js +354 -0
- package/dist/components/split-button/index.js.map +1 -0
- package/dist/components/tabs/index.d.ts +196 -0
- package/dist/components/tabs/index.js +1137 -0
- package/dist/components/tabs/index.js.map +1 -0
- package/dist/components/time-field/index.d.ts +43 -0
- package/dist/components/time-field/index.js +107 -0
- package/dist/components/time-field/index.js.map +1 -0
- package/dist/components/time-picker/index.d.ts +65 -0
- package/dist/components/time-picker/index.js +1168 -0
- package/dist/components/time-picker/index.js.map +1 -0
- package/dist/components/tooltip/index.d.ts +101 -0
- package/dist/components/tooltip/index.js +223 -0
- package/dist/components/tooltip/index.js.map +1 -0
- package/dist/components/tree/index.d.ts +112 -0
- package/dist/components/tree/index.js +157 -0
- package/dist/components/tree/index.js.map +1 -0
- package/dist/disclosure/chevron.js +75 -0
- package/dist/disclosure/chevron.js.map +1 -0
- package/dist/disclosure/index.js +7 -0
- package/dist/disclosure/index.js.map +1 -0
- package/dist/drop/index.d.ts +54 -0
- package/dist/drop/index.js +161 -0
- package/dist/drop/index.js.map +1 -0
- package/dist/field/chevron.js +74 -0
- package/dist/field/chevron.js.map +1 -0
- package/dist/field/index.d.ts +2 -1
- package/dist/field/index.js +310 -154
- package/dist/field/index.js.map +1 -1
- package/dist/field/styles.js +9 -0
- package/dist/field/styles.js.map +1 -1
- package/dist/files/index.d.ts +18 -0
- package/dist/files/index.js +107 -0
- package/dist/files/index.js.map +1 -0
- package/dist/form/index.d.ts +5 -2
- package/dist/form/index.js +64 -85
- package/dist/form/index.js.map +1 -1
- package/dist/glyphs/index.js +92 -1
- package/dist/glyphs/index.js.map +1 -1
- package/dist/i18n/index.js +20 -1
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/messages.js +1394 -34
- package/dist/i18n/messages.js.map +1 -1
- package/dist/index.d.ts +35 -3
- package/dist/index.js +34 -3
- package/dist/indicator/paths.js +23 -1
- package/dist/indicator/paths.js.map +1 -1
- package/dist/modal/index.js +92 -77
- package/dist/modal/index.js.map +1 -1
- package/dist/number/keyboard.js +16 -0
- package/dist/number/keyboard.js.map +1 -0
- package/dist/overlay/anchored.js +68 -38
- package/dist/overlay/anchored.js.map +1 -1
- package/dist/overlay/keyboard.js +57 -0
- package/dist/overlay/keyboard.js.map +1 -0
- package/dist/overlay/panel.js +173 -19
- package/dist/overlay/panel.js.map +1 -1
- package/dist/overlay/placement.js +13 -1
- package/dist/overlay/placement.js.map +1 -1
- package/dist/picker/index.js +322 -0
- package/dist/picker/index.js.map +1 -0
- package/dist/press/index.d.ts +2 -0
- package/dist/press/index.js +102 -100
- package/dist/press/index.js.map +1 -1
- package/dist/row/index.js +77 -69
- package/dist/row/index.js.map +1 -1
- package/dist/row/styles.js +13 -2
- package/dist/row/styles.js.map +1 -1
- package/dist/segments/field.js +277 -0
- package/dist/segments/field.js.map +1 -0
- package/dist/segments/index.js +574 -0
- package/dist/segments/index.js.map +1 -0
- package/dist/segments/styles.js +24 -0
- package/dist/segments/styles.js.map +1 -0
- package/dist/slider/index.js +145 -0
- package/dist/slider/index.js.map +1 -0
- package/dist/swatch/index.js +56 -0
- package/dist/swatch/index.js.map +1 -0
- package/package.json +11 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["CalendarDateTime","ZonedDateTime","HostInstance","LayoutChangeEvent","StyleProp","TextStyle","ViewStyle","AnimatedStyle","DateSegmentType","OverlayTriggerState","TimeFieldState","TimeValue","DateFormatter","getLocalTimeZone","Time","toCalendarDateTime","today","use","useCallback","useId","useRef","useState","Text","NativeText","Platform","Pressable","ScrollView","StyleSheet","View","Gesture","GestureDetector","GestureHandlerRootView","Animated","useAnimatedStyle","SafeAreaInsetsContext","Svg","Circle","Line","useOverlayTriggerState","useTimeFieldState","DateSegmentsProps","SegmentDrawing","SegmentsHandle","ResolvedTheme","TimeFieldProps","ButtonSlotContext","ClockGlyph","KeyboardGlyph","messagesFor","useLocaleOf","insetsOf","ModalWindow","NO_INSETS","panelRoleOf","useModalState","usePanelShown","usePanelStyle","roomOf","usePressFeedback","DateSegments","SegmentedField","useTheme","composeStyles","themedStyles","useTypeRole","Button","IconButton","DIAL","CENTRE","OUTER_RING","INNER_RING","HANDLE","WIDTH","BOX_HEIGHT","COLON","PERIOD_WIDTH","DIAL_GAP","HEADLINE_GAP","CENTRE_DOT","BETWEEN_DOT","SLOP","BOX_PARTS","ReadonlySet","Set","UNDESCRIBED","stylesOf","colors","radii","shadows","sizing","spacing","create","actions","alignItems","flexDirection","gap","sm","justifyContent","marginTop","xl","box","backgroundColor","surfaceContainerHighest","borderRadius","height","width","controlXl","boxInput","rowMd","boxInputFocused","borderColor","primary","borderWidth","boxSelected","primaryContainer","boxText","color","onSurface","fontVariant","boxTextSelected","onPrimaryContainer","buttons","caption","onSurfaceVariant","captions","colon","textAlign","container","surfaceContainerHigh","boxShadow","elevation3","maxHeight","maxWidth","overflow","transformOrigin","content","padding","dial","alignSelf","OS","undefined","direction","dialLabel","position","dialLabels","absoluteFill","pointerEvents","dialText","dialTextSelected","onPrimary","headline","marginBottom","insetRing","outlineOffset","layout","bottom","left","right","top","notDrawn","display","period","outline","periodDivider","borderTopColor","borderTopWidth","periodHalf","flexBasis","flexGrow","periodInput","periodSelected","tertiaryContainer","periodText","periodTextSelected","onTertiaryContainer","row","md","DialLabel","isSelected","key","text","x","y","DialProps","draft","locale","onPick","onRelease","part","TimePart","testID","twelveHour","ModalContentProps","cancelLabel","confirmLabel","defaultMode","TimePickerMode","enterTimeLabel","field","fieldLabel","granularity","headlineId","hourCycle","labelId","motion","onClose","placeholderValue","selectTimeLabel","setHeadline","node","ModalProps","Omit","state","trigger","PeriodHalfProps","isAfternoon","onChoose","afternoon","TimePickerProps","T","defaultOpen","isOpen","onOpenChange","asDateTime","time","clockOf","isDisabled","label","onPress","ref","Dial","t0","$","_c","theme","styles","role","t1","gesture","useDialGesture","labels","labelsFor","between","minute","t2","hour","polar","handle","T0","t3","T1","T2","t4","t5","t6","t7","t8","t9","t10","t11","T3","t12","t13","map","placeOf","t14","t15","t16","t17","turn","radius","drawingOf","ReturnType","isDial","shown","selected","type","isActive","literal","parts","raisesKeyboard","fieldName","name","charAt","toLocaleUpperCase","slice","initialTime","held","value","steps","Array","from","length","_","step","digits","Intl","NumberFormat","minimumIntegerDigits","format","hours","hour12","partOf","ModalContent","headlineRole","captionRole","dialRole","inputRole","words","segments","setDraft","mode","setMode","setPart","setContent","room","setRoom","boxes","usesTwelveHours","showsMinutes","periods","Symbol","for","next","hideTimeZone","onChange","shouldForceLeadingZeros","follow","across","down","Math","atan2","PI","set","round","time_0","inner","hypot","time_1","pick","current","focusOn","release","switchMode","time_2","choosePeriod","setValue","confirm","measureContent","event","nativeEvent","measureRoom","t18","t19","t20","t21","dayPeriod","formatToParts","Date","find","each","String","PeriodHalf","feedback","choose","handlers","ring","layer","angle","sin","cos","TimePicker","props","isReadOnly","isRequired","writtenIn","setTrigger","selectTime","open","realtimeValidation","validationErrors","timeValue","toString","cancel","enterTime","TimePickerModal","insets","count","opened","setOpened","close","present","setPresent","slots","scrim","opacity","get","Pick","pan","Pan","runOnJS","onStart","onUpdate","onEnd","tap","Tap","maxDistance","success","Race","withTestId","resolvedOptions","_c","NativeText"],"sources":["../../../src/components/time-picker/index.tsx"],"sourcesContent":["import type { CalendarDateTime, ZonedDateTime } from '@internationalized/date'\nimport type {\n HostInstance,\n LayoutChangeEvent,\n StyleProp,\n TextStyle,\n ViewStyle,\n} from 'react-native'\nimport type { AnimatedStyle } from 'react-native-reanimated'\nimport type { DateSegmentType } from 'react-stately/useDateFieldState'\nimport type { OverlayTriggerState } from 'react-stately/useOverlayTriggerState'\nimport type { TimeFieldState, TimeValue } from 'react-stately/useTimeFieldState'\n\nimport {\n DateFormatter,\n getLocalTimeZone,\n Time,\n toCalendarDateTime,\n today,\n} from '@internationalized/date'\nimport { use, useCallback, useId, useRef, useState } from 'react'\nimport {\n Text as NativeText,\n Platform,\n Pressable,\n ScrollView,\n StyleSheet,\n View,\n} from 'react-native'\nimport {\n Gesture,\n GestureDetector,\n GestureHandlerRootView,\n} from 'react-native-gesture-handler'\nimport Animated, { useAnimatedStyle } from 'react-native-reanimated'\nimport { SafeAreaInsetsContext } from 'react-native-safe-area-context'\nimport Svg, { Circle, Line } from 'react-native-svg'\nimport { useOverlayTriggerState } from 'react-stately/useOverlayTriggerState'\nimport { useTimeFieldState } from 'react-stately/useTimeFieldState'\n\nimport type {\n DateSegmentsProps,\n SegmentDrawing,\n SegmentsHandle,\n} from '../../segments'\nimport type { ResolvedTheme } from '../../theme/scope'\nimport type { TimeFieldProps } from '../time-field'\n\nimport { ButtonSlotContext } from '../../button/slots'\nimport { ClockGlyph, KeyboardGlyph } from '../../glyphs'\nimport { messagesFor } from '../../i18n'\nimport { useLocaleOf } from '../../i18n/provider'\nimport {\n insetsOf,\n ModalWindow,\n NO_INSETS,\n panelRoleOf,\n useModalState,\n} from '../../modal'\nimport { usePanelShown, usePanelStyle } from '../../overlay/panel'\nimport { roomOf } from '../../picker'\nimport { usePressFeedback } from '../../press'\nimport { DateSegments } from '../../segments'\nimport { SegmentedField } from '../../segments/field'\nimport { useTheme } from '../../theme/scope'\nimport { composeStyles, themedStyles } from '../../theme/styles'\nimport { useTypeRole } from '../../typography/roles'\nimport { Button } from '../button'\nimport { IconButton } from '../icon-button'\n\n// kanso-ui's TimePicker, the time pickers page's picker: TimeField's\n// segments, with a clock button in the field's trailing slot that opens the\n// page's modal over a scrim. A time is typed into the field or picked in the\n// modal, and the modal's OK is what writes a picked time back.\n//\n// **Modal at every width.** The page has no docked time picker, so unlike\n// DatePicker nothing here changes with the window's size: the container is\n// centred over the scrim on a phone and on a tablet alike, in a React Native\n// `Modal` through src/modal, as Dialog's is.\n//\n// **The modal is the page's vertical layout, in both of its variants.** The\n// dial: a label medium headline on surface variant, then the time selector,\n// an hour and a minute box, 96 by 80dp at the small corner in display large,\n// on surface container highest and on primary container once selected, with\n// 24dp for the colon between, and beside them the period selector, 52 by\n// 80dp, outlined, its chosen half on tertiary container. Under them, 36dp\n// down, the 256dp dial on surface container highest: labels in body large,\n// the 48dp handle and 2dp hand in primary, an 8dp centre, and the label under\n// the handle in on primary. The input variant drops the dial and draws the\n// boxes as text fields, 96 by 72dp in display medium, the focused one on\n// primary container with a 2dp primary outline, each named underneath in\n// body small, and the period selector at the same 72dp. Both put the\n// keyboard or clock toggle at the actions' start and the text buttons at\n// their end, inside a container on surface container high at the\n// extra-large corner, level 3, with 24dp of padding. A window too short for\n// the dial scrolls the container rather than squeezing it.\n//\n// **The boxes are a time field of their own**, a second React Stately state\n// drawn through src/segments, so they are typed into, stepped and read as\n// TimeField's segments are, in both variants, which differ in how the boxes\n// are drawn rather than in what they are. On the dial a press on a box picks\n// which part the dial sets, without raising the keyboard; in the input\n// variant it raises the number pad, as a field's segment does. The day\n// period stays a part of that state but is not drawn, and the period\n// selector beside the boxes stands in for it, as a radio group of the\n// locale's two words for it. The dial is a pointer affordance over the boxes\n// and is hidden from a screen reader, as web's is: everything it sets, the\n// boxes set too.\n//\n// **The dial does not mirror.** A clock face is the same in either writing\n// direction, so it is drawn and read in screen coordinates, three o'clock on\n// the right, whatever direction the layout around it runs. The row above it\n// follows the layout's own direction, so in a right-to-left layout the\n// period selector sits on the left.\n//\n// Twenty-four hours put the day's second half on an inner ring, 12 at its\n// top and 00 at the outer ring's, with no period selector, and whether there\n// is one at all is the locale's or `hourCycle`'s, as it is in TimeField.\n\n// The dial's geometry in dp, which is also its own coordinates: the radius\n// of the outer and inner rings of labels and of the handle that sits on\n// them. The inner ring sits far enough in that a handle on it clears the\n// outer ring's labels.\nconst DIAL = 256\nconst CENTRE = DIAL / 2\nconst OUTER_RING = 101\nconst INNER_RING = 64\nconst HANDLE = 24\n\n// The page's measurements that are its own rather than the scale's: the\n// container's width, which is the 280dp time selector and the padding either\n// side, the dial variant's box height, the colon's width, the period\n// selector's width, and the gaps over the dial and under the headline.\nconst WIDTH = 328\nconst BOX_HEIGHT = 80\nconst COLON = 24\nconst PERIOD_WIDTH = 52\nconst DIAL_GAP = 36\nconst HEADLINE_GAP = 20\n\n// The dot centring the hand, and the one on the handle between two of the\n// minute labels.\nconst CENTRE_DOT = 4\nconst BETWEEN_DOT = 2\n\n// How far a press moves before it is a drag rather than a tap: Gesture\n// Handler's own default distance for a pan, as the slider's.\nconst SLOP = 10\n\n// The parts the boxes draw. The day period is the period selector's.\nconst BOX_PARTS: ReadonlySet<DateSegmentType> = new Set(['hour', 'minute'])\n\n// What describes the boxes after their value: nothing, since no line sits\n// under them.\nconst UNDESCRIBED: DateSegmentsProps['described'] = []\n\nconst stylesOf = themedStyles(\n ({ colors, radii, shadows, sizing, spacing }: ResolvedTheme) =>\n StyleSheet.create({\n actions: {\n alignItems: 'center',\n flexDirection: 'row',\n gap: spacing.sm,\n justifyContent: 'space-between',\n marginTop: spacing.xl,\n },\n // An hour or a minute box.\n box: {\n alignItems: 'center',\n backgroundColor: colors.surfaceContainerHighest,\n borderRadius: radii.sm,\n height: BOX_HEIGHT,\n justifyContent: 'center',\n width: sizing.controlXl,\n },\n // The input variant's box: the text field the page draws there, which\n // is shorter.\n boxInput: {\n height: sizing.rowMd,\n },\n // The focused text field's outline, drawn inside the box.\n boxInputFocused: {\n borderColor: colors.primary,\n borderWidth: 2,\n },\n boxSelected: {\n backgroundColor: colors.primaryContainer,\n },\n boxText: {\n color: colors.onSurface,\n fontVariant: ['tabular-nums'],\n },\n boxTextSelected: {\n color: colors.onPrimaryContainer,\n },\n buttons: {\n flexDirection: 'row',\n gap: spacing.sm,\n },\n caption: {\n color: colors.onSurfaceVariant,\n width: sizing.controlXl,\n },\n captions: {\n flexDirection: 'row',\n gap: COLON,\n marginTop: spacing.sm,\n },\n // The colon between the boxes, in the boxes' type.\n colon: {\n color: colors.onSurface,\n textAlign: 'center',\n width: COLON,\n },\n // The page's container: its fill, corner and level, as wide as the\n // page's vertical layout and no wider or taller than the room it is\n // given.\n container: {\n backgroundColor: colors.surfaceContainerHigh,\n borderRadius: radii.xl,\n boxShadow: shadows.elevation3,\n maxHeight: '100%',\n maxWidth: '100%',\n overflow: 'hidden',\n transformOrigin: 'center',\n width: WIDTH,\n },\n content: {\n padding: spacing.xl,\n },\n // The dial's square, its labels placed in screen coordinates. iOS and\n // Android turn a left into a right under a right-to-left layout, so\n // the square is laid out left to right there; a browser keeps a left\n // where it is and has no such style.\n dial: {\n alignSelf: 'center',\n ...(Platform.OS === 'web' ? undefined : { direction: 'ltr' }),\n height: DIAL,\n marginTop: DIAL_GAP,\n width: DIAL,\n },\n // A label's square, the handle's size, centred on its place on a ring.\n dialLabel: {\n alignItems: 'center',\n height: HANDLE * 2,\n justifyContent: 'center',\n position: 'absolute',\n width: HANDLE * 2,\n },\n dialLabels: {\n ...StyleSheet.absoluteFill,\n pointerEvents: 'none',\n },\n dialText: {\n color: colors.onSurface,\n },\n dialTextSelected: {\n color: colors.onPrimary,\n },\n headline: {\n color: colors.onSurfaceVariant,\n marginBottom: HEADLINE_GAP,\n },\n // The ring a focused half takes, drawn inside the selector, which\n // clips anything drawn past its edge.\n insetRing: {\n outlineOffset: -2,\n },\n // The container's room: centred in the window, clear of every edge\n // inside the safe area. It takes no touches itself, so a press around\n // the container reaches the scrim under it.\n layout: {\n alignItems: 'center',\n bottom: 0,\n justifyContent: 'center',\n left: 0,\n pointerEvents: 'box-none',\n position: 'absolute',\n right: 0,\n top: 0,\n },\n notDrawn: {\n display: 'none',\n },\n // The period selector: two halves stacked in one outlined box, the\n // locale's morning word above its afternoon one.\n period: {\n borderColor: colors.outline,\n borderRadius: radii.sm,\n borderWidth: 1,\n height: BOX_HEIGHT,\n overflow: 'hidden',\n width: PERIOD_WIDTH,\n },\n periodDivider: {\n borderTopColor: colors.outline,\n borderTopWidth: 1,\n },\n periodHalf: {\n alignItems: 'center',\n flexBasis: 0,\n flexGrow: 1,\n justifyContent: 'center',\n },\n periodInput: {\n height: sizing.rowMd,\n },\n periodSelected: {\n backgroundColor: colors.tertiaryContainer,\n },\n periodText: {\n color: colors.onSurfaceVariant,\n },\n periodTextSelected: {\n color: colors.onTertiaryContainer,\n },\n row: {\n alignItems: 'flex-start',\n flexDirection: 'row',\n gap: spacing.md,\n justifyContent: 'center',\n },\n }),\n)\n\n// One label on the dial, placed on its ring.\ntype DialLabel = {\n readonly isSelected: boolean\n readonly key: string\n readonly text: string\n readonly x: number\n readonly y: number\n}\n\ntype DialProps = {\n readonly draft: TimeValue\n readonly locale: string\n /** Called with a press's place, in the dial's coordinates. */\n readonly onPick: (x: number, y: number) => void\n /** Called as a press that picked lets go. */\n readonly onRelease: () => void\n /** The part the dial sets. */\n readonly part: TimePart\n readonly testID: string | undefined\n readonly twelveHour: boolean\n}\n\n// What the modal's content is handed by the modal around it.\ntype ModalContentProps = {\n readonly cancelLabel: string\n readonly confirmLabel: string\n readonly defaultMode: TimePickerMode\n readonly enterTimeLabel: string\n /** The field's state, which the modal reads its time from and writes it to. */\n readonly field: TimeFieldState\n readonly fieldLabel: string\n readonly granularity: TimePart\n readonly headlineId: string\n readonly hourCycle: 12 | 24 | undefined\n readonly labelId: string\n readonly locale: string\n readonly motion: AnimatedStyle<ViewStyle>\n readonly onClose: () => void\n readonly placeholderValue: TimeValue | undefined\n readonly selectTimeLabel: string\n readonly setHeadline: (node: HostInstance | null) => void\n readonly testID: string | undefined\n}\n\ntype ModalProps = Omit<\n ModalContentProps,\n 'headlineId' | 'labelId' | 'motion' | 'onClose' | 'setHeadline'\n> & {\n /** The picker's open state. */\n readonly state: OverlayTriggerState\n /** The clock button, which a screen reader goes back to once it has gone. */\n readonly trigger: HostInstance | null\n}\n\ntype PeriodHalfProps = {\n readonly isAfternoon: boolean\n readonly isSelected: boolean\n readonly onChoose: (afternoon: boolean) => void\n readonly text: string\n}\n\n// The parts of a time the dial and the boxes set.\ntype TimePart = 'hour' | 'minute'\n\n/** Which of the time pickers page's two variants the modal shows. */\ntype TimePickerMode = 'dial' | 'input'\n\ntype TimePickerProps<T extends TimeValue = TimeValue> = Omit<\n TimeFieldProps<T>,\n 'trailingIcon'\n> & {\n /**\n * What the modal's dismissing action says. Left out, it is the word for it\n * in the locale, \"Cancel\" in English.\n */\n readonly cancelLabel?: string\n /**\n * What the modal's confirming action says. Left out, it is the word for it\n * in the locale, \"OK\" in English.\n */\n readonly confirmLabel?: string\n /**\n * Which variant the modal opens on: the dial, or the boxes as text fields\n * to type into. The button at the modal's start switches between them.\n * @default 'dial'\n */\n readonly defaultMode?: TimePickerMode\n /** Whether the modal starts open, when it keeps its own state. */\n readonly defaultOpen?: boolean\n /**\n * The input variant's headline, which also names the button that switches\n * the dial to it. Left out, it is the locale's, \"Enter time\" in English.\n */\n readonly enterTimeLabel?: string\n /** Whether the modal is open, when the call site holds the state. */\n readonly isOpen?: boolean\n /** Called with the modal's new state as it opens or closes. */\n readonly onOpenChange?: (isOpen: boolean) => void\n /**\n * The dial's headline, which also names the clock button that opens the\n * modal, before the field's label, and the button that switches the input\n * variant back. Left out, it is the locale's, \"Select time\" in English.\n */\n readonly selectTimeLabel?: string\n}\n\n/**\n * A picked time as the field's state takes it, which is always a date and\n * time: a bare time is put on today, and the field takes the date off again\n * on the way out.\n */\nfunction asDateTime(time: TimeValue): CalendarDateTime | ZonedDateTime {\n return 'day' in time\n ? time\n : toCalendarDateTime(today(getLocalTimeZone()), time)\n}\n\n// The clock button for the box's trailing slot. A call rather than JSX\n// written at the prop, which is what react-perf's jsx-no-jsx-as-prop is\n// after.\nfunction clockOf({\n isDisabled,\n isOpen,\n label,\n onPress,\n ref,\n}: {\n readonly isDisabled: boolean\n readonly isOpen: boolean\n readonly label: string\n readonly onPress: () => void\n readonly ref: (node: HostInstance | null) => void\n}) {\n return (\n <IconButton\n aria-expanded={isOpen}\n aria-label={label}\n isDisabled={isDisabled}\n onPress={onPress}\n ref={ref}\n >\n <ClockGlyph />\n </IconButton>\n )\n}\n\n// The dial: the face, the hand and its handle in react-native-svg, and the\n// labels over them, driven by a pan and a tap.\nfunction Dial({\n draft,\n locale,\n onPick,\n onRelease,\n part,\n testID,\n twelveHour,\n}: DialProps) {\n const theme = useTheme()\n const { colors } = theme\n const styles = stylesOf(theme)\n const role = useTypeRole('bodyLarge')\n const gesture = useDialGesture({ onPick, onRelease, testID })\n const labels = labelsFor(part, draft, locale, twelveHour)\n const between = part === 'minute' && draft.minute % 5 !== 0\n const handle =\n part === 'minute'\n ? polar(draft.minute / 60, OUTER_RING)\n : polar(\n (draft.hour % 12) / 12,\n !twelveHour && draft.hour >= 12 ? INNER_RING : OUTER_RING,\n )\n\n return (\n <GestureHandlerRootView style={styles.dial}>\n <GestureDetector gesture={gesture}>\n <View\n aria-hidden\n testID={testID === undefined ? undefined : `${testID}-dial`}\n >\n <Svg height={DIAL} viewBox={`0 0 ${DIAL} ${DIAL}`} width={DIAL}>\n <Circle\n cx={CENTRE}\n cy={CENTRE}\n fill={colors.surfaceContainerHighest}\n r={CENTRE}\n />\n <Line\n stroke={colors.primary}\n strokeWidth={2}\n x1={CENTRE}\n x2={handle.x}\n y1={CENTRE}\n y2={handle.y}\n />\n <Circle\n cx={CENTRE}\n cy={CENTRE}\n fill={colors.primary}\n r={CENTRE_DOT}\n />\n <Circle\n cx={handle.x}\n cy={handle.y}\n fill={colors.primary}\n r={HANDLE}\n />\n {between ? (\n <Circle\n cx={handle.x}\n cy={handle.y}\n fill={colors.onPrimary}\n r={BETWEEN_DOT}\n />\n ) : null}\n </Svg>\n <View style={styles.dialLabels}>\n {labels.map((label) => (\n <View\n key={label.key}\n style={composeStyles<ViewStyle>(\n styles.dialLabel,\n placeOf(label),\n )}\n >\n <NativeText\n style={composeStyles<TextStyle>(\n role,\n label.isSelected\n ? styles.dialTextSelected\n : styles.dialText,\n )}\n >\n {label.text}\n </NativeText>\n </View>\n ))}\n </View>\n </View>\n </GestureDetector>\n </GestureHandlerRootView>\n )\n}\n\n/** One label, placed a fraction of a turn round a ring. */\nfunction dialLabel(\n key: string,\n text: string,\n isSelected: boolean,\n turn: number,\n radius: number,\n): DialLabel {\n const { x, y } = polar(turn, radius)\n return { isSelected, key, text, x, y }\n}\n\n// How the boxes are drawn: the page's boxes in place of a field's line, the\n// one selected on primary container, which on the dial is the part the dial\n// sets and in the input variant the box being typed into, outlined besides.\nfunction drawingOf(\n styles: ReturnType<typeof stylesOf>,\n role: StyleProp<TextStyle>,\n isDial: boolean,\n shown: TimePart,\n): SegmentDrawing {\n const selected = (type: DateSegmentType, isActive: boolean) =>\n isDial ? type === shown : isActive\n\n return {\n box: (type, isActive) =>\n composeStyles<ViewStyle>(\n styles.box,\n isDial ? undefined : styles.boxInput,\n selected(type, isActive) ? styles.boxSelected : undefined,\n !isDial && isActive ? styles.boxInputFocused : undefined,\n ),\n literal: composeStyles<TextStyle>(role, styles.colon),\n parts: BOX_PARTS,\n raisesKeyboard: !isDial,\n text: (type, isActive) =>\n composeStyles<TextStyle>(\n role,\n styles.boxText,\n selected(type, isActive) ? styles.boxTextSelected : undefined,\n ),\n }\n}\n\n/** A part's name as the locale writes it, opening with a capital. */\nfunction fieldName(name: string, locale: string) {\n return name.charAt(0).toLocaleUpperCase(locale) + name.slice(1)\n}\n\n/**\n * The time the modal opens on: the field's own, else its placeholder, else\n * midnight. A date and time keeps its date, so the field gets back what it\n * holds.\n */\nfunction initialTime(\n field: TimeFieldState,\n placeholderValue: TimeValue | undefined,\n): TimeValue {\n const held = field.value\n if (held !== null && 'hour' in held) {\n return held\n }\n return placeholderValue ?? new Time()\n}\n\n/** The labels the dial draws for one part, in the locale's digits. */\nfunction labelsFor(\n part: TimePart,\n time: TimeValue,\n locale: string,\n twelveHour: boolean,\n): DialLabel[] {\n const steps = Array.from({ length: 12 }, (_, step) => step)\n\n if (part === 'minute') {\n const digits = new Intl.NumberFormat(locale, { minimumIntegerDigits: 2 })\n return steps.map((step) =>\n dialLabel(\n `m${step}`,\n digits.format(step * 5),\n time.minute === step * 5,\n step / 12,\n OUTER_RING,\n ),\n )\n }\n\n const hours = new DateFormatter(locale, {\n hour: 'numeric',\n hour12: twelveHour,\n })\n if (twelveHour) {\n return steps.map((step) =>\n dialLabel(\n `h${step}`,\n partOf(hours, step, 'hour'),\n time.hour % 12 === step,\n step / 12,\n OUTER_RING,\n ),\n )\n }\n return [\n ...steps.map((step) =>\n dialLabel(\n `h${step}`,\n partOf(hours, step, 'hour'),\n time.hour === step,\n step / 12,\n OUTER_RING,\n ),\n ),\n ...steps.map((step) =>\n dialLabel(\n `h${step + 12}`,\n partOf(hours, step + 12, 'hour'),\n time.hour === step + 12,\n step / 12,\n INNER_RING,\n ),\n ),\n ]\n}\n\n// The modal's content, mounted each time it opens: the time it was opened\n// with is its draft until OK writes the draft into the field, or the modal\n// closes without it.\nfunction ModalContent({\n cancelLabel,\n confirmLabel,\n defaultMode,\n enterTimeLabel,\n field,\n fieldLabel,\n granularity,\n headlineId,\n hourCycle,\n labelId,\n locale,\n motion,\n onClose,\n placeholderValue,\n selectTimeLabel,\n setHeadline,\n testID,\n}: ModalContentProps) {\n const theme = useTheme()\n const styles = stylesOf(theme)\n const headlineRole = useTypeRole('labelMedium')\n const captionRole = useTypeRole('bodySmall')\n const dialRole = useTypeRole('displayLarge')\n const inputRole = useTypeRole('displayMedium')\n const words = messagesFor(locale).segments\n const [draft, setDraft] = useState(() => initialTime(field, placeholderValue))\n const [mode, setMode] = useState(defaultMode)\n const [part, setPart] = useState<TimePart>('hour')\n const [content, setContent] = useState(0)\n const [room, setRoom] = useState(0)\n const boxes = useRef<SegmentsHandle>(null)\n const twelveHour = usesTwelveHours(locale, hourCycle)\n const showsMinutes = granularity === 'minute'\n const isDial = mode === 'dial'\n const isAfternoon = draft.hour >= 12\n const headline = isDial ? selectTimeLabel : enterTimeLabel\n const periods = new DateFormatter(locale, { hour: 'numeric', hour12: true })\n const state = useTimeFieldState({\n granularity,\n hideTimeZone: true,\n hourCycle,\n locale,\n onChange: (next: null | TimeValue) => {\n if (next !== null) {\n setDraft(next)\n }\n },\n shouldForceLeadingZeros: true,\n value: draft,\n })\n\n // Which part the dial sets, taken from the box in focus: a press on a box,\n // or the boxes moving on once an hour is typed.\n const follow = useCallback((type: DateSegmentType | null) => {\n if (type === 'hour' || type === 'minute') {\n setPart(type)\n }\n }, [])\n\n // A press on the dial sets the part it shows from where it lands: a\n // fraction of a turn clockwise from twelve, and on a 24-hour clock the\n // ring nearer it.\n const pick = useCallback(\n (x: number, y: number) => {\n const across = x - CENTRE\n const down = y - CENTRE\n const turn = (Math.atan2(across, -down) / (2 * Math.PI) + 1) % 1\n\n if (part === 'minute') {\n setDraft((time) => time.set({ minute: Math.round(turn * 60) % 60 }))\n return\n }\n const step = Math.round(turn * 12) % 12\n if (twelveHour) {\n setDraft((time) =>\n time.set({ hour: step + (time.hour >= 12 ? 12 : 0) }),\n )\n return\n }\n const inner = Math.hypot(across, down) < (OUTER_RING + INNER_RING) / 2\n setDraft((time) => time.set({ hour: inner ? step + 12 : step }))\n },\n [part, twelveHour],\n )\n\n // An hour picked on the dial moves on to the minutes, as the page does.\n const release = useCallback(() => {\n if (part === 'hour' && showsMinutes) {\n setPart('minute')\n boxes.current?.focusOn('minute', false)\n }\n }, [part, showsMinutes])\n\n // The other variant, with the box the dial sets in focus: typed into, with\n // the keyboard raised, or set on the dial, with it put away.\n const switchMode = useCallback(() => {\n setMode(isDial ? 'input' : 'dial')\n boxes.current?.focusOn(part, isDial)\n }, [isDial, part])\n\n // A half of the day keeps the hour on the clock's face, and choosing the\n // half the time is already in leaves it as it was.\n const choosePeriod = useCallback((afternoon: boolean) => {\n setDraft((time) =>\n time.set({ hour: (time.hour % 12) + (afternoon ? 12 : 0) }),\n )\n }, [])\n\n // OK writes the draft through the field's state, and its `slot` closes the\n // modal after.\n const confirm = useCallback(() => {\n field.setValue(asDateTime(draft))\n }, [draft, field])\n\n // The content's height against the room the container leaves it, so it\n // scrolls only when it does not fit, and a drag on the dial is never taken\n // for a scroll otherwise.\n const measureContent = useCallback((_: number, height: number) => {\n setContent(height)\n }, [])\n const measureRoom = useCallback((event: LayoutChangeEvent) => {\n setRoom(event.nativeEvent.layout.height)\n }, [])\n\n return (\n <Animated.View\n {...panelRoleOf('dialog', undefined)}\n aria-label={\n Platform.OS === 'web' ? undefined : `${headline}, ${fieldLabel}`\n }\n onAccessibilityEscape={onClose}\n style={composeStyles<AnimatedStyle<ViewStyle>>(styles.container, motion)}\n testID={testID === undefined ? undefined : `${testID}-modal`}\n >\n <ScrollView\n contentContainerStyle={styles.content}\n onContentSizeChange={measureContent}\n onLayout={measureRoom}\n scrollEnabled={content > room}\n >\n <NativeText\n nativeID={headlineId}\n ref={setHeadline}\n role=\"heading\"\n style={composeStyles<TextStyle>(headlineRole, styles.headline)}\n >\n {headline}\n </NativeText>\n {Platform.OS === 'web' ? (\n <NativeText nativeID={labelId} style={styles.notDrawn}>\n {fieldLabel}\n </NativeText>\n ) : null}\n <View style={styles.row}>\n <View>\n <DateSegments\n described={UNDESCRIBED}\n drawing={drawingOf(\n styles,\n isDial ? dialRole : inputRole,\n isDial,\n part,\n )}\n isInvalid={false}\n label={fieldLabel}\n locale={locale}\n onActiveChange={follow}\n ref={boxes}\n state={state}\n />\n {isDial ? null : (\n <View aria-hidden style={styles.captions}>\n <NativeText\n style={composeStyles<TextStyle>(captionRole, styles.caption)}\n >\n {fieldName(words.hour, locale)}\n </NativeText>\n {showsMinutes ? (\n <NativeText\n style={composeStyles<TextStyle>(\n captionRole,\n styles.caption,\n )}\n >\n {fieldName(words.minute, locale)}\n </NativeText>\n ) : null}\n </View>\n )}\n </View>\n {twelveHour ? (\n <View\n aria-label={words.dayPeriod}\n role=\"radiogroup\"\n style={composeStyles<ViewStyle>(\n styles.period,\n isDial ? undefined : styles.periodInput,\n )}\n >\n <PeriodHalf\n isAfternoon={false}\n isSelected={!isAfternoon}\n onChoose={choosePeriod}\n text={partOf(periods, 9, 'dayPeriod')}\n />\n <PeriodHalf\n isAfternoon\n isSelected={isAfternoon}\n onChoose={choosePeriod}\n text={partOf(periods, 21, 'dayPeriod')}\n />\n </View>\n ) : null}\n </View>\n {isDial ? (\n <Dial\n draft={draft}\n locale={locale}\n onPick={pick}\n onRelease={release}\n part={part}\n testID={testID}\n twelveHour={twelveHour}\n />\n ) : null}\n <View style={styles.actions}>\n <IconButton\n aria-label={isDial ? enterTimeLabel : selectTimeLabel}\n onPress={switchMode}\n >\n {isDial ? <KeyboardGlyph /> : <ClockGlyph />}\n </IconButton>\n <View style={styles.buttons}>\n <Button slot=\"close\" variant=\"text\">\n {cancelLabel}\n </Button>\n <Button onPress={confirm} slot=\"close\" variant=\"text\">\n {confirmLabel}\n </Button>\n </View>\n </View>\n </ScrollView>\n </Animated.View>\n )\n}\n\n/** The part of a formatted time a formatter writes for one hour of the day. */\nfunction partOf(\n format: DateFormatter,\n hour: number,\n type: 'dayPeriod' | 'hour',\n) {\n return (\n format\n .formatToParts(new Date(2000, 0, 1, hour))\n .find((each) => each.type === type)?.value ?? String(hour)\n )\n}\n\n// A half of the period selector: a radio of the selector's group, the\n// afternoon's drawing the rule between the two.\nfunction PeriodHalf({\n isAfternoon,\n isSelected,\n onChoose,\n text,\n}: PeriodHalfProps) {\n const theme = useTheme()\n const styles = stylesOf(theme)\n const role = useTypeRole('titleMedium')\n const feedback = usePressFeedback({\n color: isSelected\n ? theme.colors.onTertiaryContainer\n : theme.colors.onSurfaceVariant,\n })\n const choose = useCallback(() => {\n onChoose(isAfternoon)\n }, [isAfternoon, onChoose])\n\n return (\n <Pressable\n aria-checked={isSelected}\n role=\"radio\"\n {...feedback.handlers}\n onPress={choose}\n style={composeStyles<ViewStyle>(\n styles.periodHalf,\n isAfternoon ? styles.periodDivider : undefined,\n isSelected ? styles.periodSelected : undefined,\n feedback.ring,\n feedback.ring === undefined ? undefined : styles.insetRing,\n )}\n >\n {feedback.layer}\n <NativeText\n style={composeStyles<TextStyle>(\n role,\n isSelected ? styles.periodTextSelected : styles.periodText,\n )}\n >\n {text}\n </NativeText>\n </Pressable>\n )\n}\n\n// A label's square, its centre on the label's place.\nfunction placeOf({ x, y }: DialLabel): ViewStyle {\n return { left: x - HANDLE, top: y - HANDLE }\n}\n\n/** Where a fraction of a turn clockwise from twelve lands on a ring. */\nfunction polar(turn: number, radius: number) {\n const angle = turn * 2 * Math.PI\n return {\n x: CENTRE + radius * Math.sin(angle),\n y: CENTRE - radius * Math.cos(angle),\n }\n}\n\n/**\n * A time typed into a field, or picked in a modal behind the clock button at\n * the field's end: on a dial, or typed into the modal's larger boxes. The\n * value is an `@internationalized/date` value, as on web: pass `value` with\n * `onChange` to control it, or `defaultValue` to let it keep its own.\n *\n * ```tsx\n * import { Time } from '@internationalized/date'\n *\n * <TimePicker defaultValue={new Time(9, 30)} label=\"Label\" />\n * ```\n *\n * The field is TimeField's, so `granularity`, `hourCycle`, `minValue` and\n * `maxValue` behave as they do there. The modal sets hours and minutes and\n * keeps the seconds a value already has; a time it writes back is checked\n * against the bounds as a typed one is. Whether it shows a twelve or\n * twenty-four hour clock is the locale's, through the `I18nProvider`, unless\n * `hourCycle` says otherwise.\n *\n * `style`, `ref` and `testID` land on the field as a whole.\n */\nfunction TimePicker<T extends TimeValue = TimeValue>({\n cancelLabel,\n confirmLabel,\n defaultMode = 'dial',\n defaultOpen,\n enterTimeLabel,\n isDisabled = false,\n isOpen,\n isReadOnly = false,\n isRequired = false,\n locale,\n onOpenChange,\n selectTimeLabel,\n ...props\n}: TimePickerProps<T>) {\n const writtenIn = useLocaleOf(locale)\n const words = messagesFor(writtenIn)\n const [trigger, setTrigger] = useState<HostInstance | null>(null)\n const state = useOverlayTriggerState({ defaultOpen, isOpen, onOpenChange })\n const field = useTimeFieldState<T>({\n ...props,\n isDisabled,\n isReadOnly,\n isRequired,\n locale: writtenIn,\n })\n const selectTime = selectTimeLabel ?? words.selectTime\n // oxlint-disable-next-line typescript/unbound-method -- React Stately's setters are callbacks, and read no `this`\n const { open } = state\n\n return (\n <>\n <SegmentedField\n {...props}\n errors={field.realtimeValidation.validationErrors}\n isDisabled={isDisabled}\n isEmpty={field.value === null}\n isReadOnly={isReadOnly}\n isRequired={isRequired}\n locale={writtenIn}\n state={field}\n // The time alone, as TimeField submits it.\n submitted={field.value === null ? '' : field.timeValue.toString()}\n trailingIcon={clockOf({\n isDisabled: isDisabled || isReadOnly,\n isOpen: state.isOpen,\n label: `${selectTime} ${props.label}`,\n onPress: open,\n ref: setTrigger,\n })}\n />\n <TimePickerModal\n cancelLabel={cancelLabel ?? words.cancel}\n confirmLabel={confirmLabel ?? words.confirm}\n defaultMode={defaultMode}\n enterTimeLabel={enterTimeLabel ?? words.enterTime}\n field={field}\n fieldLabel={props.label}\n granularity={props.granularity === 'hour' ? 'hour' : 'minute'}\n hourCycle={props.hourCycle}\n locale={writtenIn}\n placeholderValue={props.placeholderValue}\n selectTimeLabel={selectTime}\n state={state}\n testID={props.testID}\n trigger={trigger}\n />\n </>\n )\n}\n\n// The modal while it is open and while its exit runs: the window, the scrim\n// and the container, centred in the room the safe area leaves. Its content\n// is mounted afresh each time it opens.\nfunction TimePickerModal({ state, trigger, ...props }: ModalProps) {\n const theme = useTheme()\n const styles = stylesOf(theme)\n const insets = use(SafeAreaInsetsContext) ?? NO_INSETS\n const headlineId = useId()\n const labelId = useId()\n const [headline, setHeadline] = useState<HostInstance | null>(null)\n const [opened, setOpened] = useState({ count: 0, isOpen: state.isOpen })\n const { close, present, setPresent, slots } = useModalState(\n { state, trigger },\n {},\n )\n const shown = usePanelShown(state.isOpen, true, setPresent)\n const motion = usePanelStyle(shown)\n const scrim = useAnimatedStyle(() => {\n 'worklet'\n return { opacity: shown.get() }\n })\n\n // Counts each opening, which the content is keyed by, so a modal opened\n // again while its exit still runs starts from the field's time again.\n if (opened.isOpen !== state.isOpen) {\n setOpened({\n count: opened.count + (state.isOpen ? 1 : 0),\n isOpen: state.isOpen,\n })\n }\n\n if (!present) {\n return null\n }\n\n return (\n <ModalWindow\n isKeyboardDismissDisabled={false}\n labelledBy={`${headlineId} ${labelId}`}\n onClose={close}\n onScrimPress={state.isOpen ? close : undefined}\n scrim={scrim}\n title={headline}\n >\n <View\n style={composeStyles<ViewStyle>(\n styles.layout,\n insetsOf(roomOf(insets, theme.spacing.sm)),\n )}\n >\n <ButtonSlotContext value={slots}>\n <ModalContent\n {...props}\n headlineId={headlineId}\n key={opened.count}\n labelId={labelId}\n motion={motion}\n onClose={close}\n setHeadline={setHeadline}\n />\n </ButtonSlotContext>\n </View>\n </ModalWindow>\n )\n}\n\n// The dial's gestures: a drag that sets the part as it moves and moves on\n// as it lets go, and a tap that does both where it lands. Each lets go to\n// the other, as the slider's track does.\nfunction useDialGesture({\n onPick,\n onRelease,\n testID,\n}: Pick<DialProps, 'onPick' | 'onRelease' | 'testID'>) {\n // Gesture Handler 3 deprecates these builders for hooks that version 2 does\n // not have, and the peer range admits both, so the builders stay while it\n // does.\n // oxlint-disable-next-line react/capitalized-calls, typescript/no-deprecated -- a builder named after its gesture, not a component; see above\n const pan = Gesture.Pan()\n .runOnJS(true)\n .onStart(({ x, y }) => {\n onPick(x, y)\n })\n .onUpdate(({ x, y }) => {\n onPick(x, y)\n })\n .onEnd(() => {\n onRelease()\n })\n // oxlint-disable-next-line react/capitalized-calls, typescript/no-deprecated -- as above\n const tap = Gesture.Tap()\n .maxDistance(SLOP)\n .runOnJS(true)\n .onEnd(({ x, y }, success) => {\n if (success) {\n onPick(x, y)\n onRelease()\n }\n })\n\n // oxlint-disable-next-line react/capitalized-calls, typescript/no-deprecated -- as above\n return Gesture.Race(\n testID === undefined ? pan : pan.withTestId(`${testID}-dial-pan`),\n testID === undefined ? tap : tap.withTestId(`${testID}-dial-tap`),\n )\n}\n\n/**\n * Whether the clock has twelve hours. `hourCycle` decides when it is given,\n * as it does for the segments; otherwise the locale does.\n */\nfunction usesTwelveHours(locale: string, hourCycle: 12 | 24 | undefined) {\n if (hourCycle !== undefined) {\n return hourCycle === 12\n }\n return (\n new DateFormatter(locale, { hour: 'numeric' }).resolvedOptions().hour12 ??\n false\n )\n}\n\nexport type { TimePickerMode, TimePickerProps }\n\nexport { TimePicker }\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA2HA,MAAMmE,OAAO;AACb,MAAMC,SAASD,OAAO;AACtB,MAAME,aAAa;AACnB,MAAMC,aAAa;AACnB,MAAMC,SAAS;AAMf,MAAMC,QAAQ;AACd,MAAMC,aAAa;AACnB,MAAMC,QAAQ;AACd,MAAMC,eAAe;AACrB,MAAMC,WAAW;AACjB,MAAMC,eAAe;AAIrB,MAAMC,aAAa;AACnB,MAAMC,cAAc;AAIpB,MAAMC,OAAO;AAGb,MAAMC,4BAA0C,IAAIE,IAAI,CAAC,QAAQ,QAAQ,CAAC;AAI1E,MAAMC,cAA8C,CAAA;AAEpD,MAAMC,WAAWtB,cACd,EAAEuB,QAAQC,OAAOC,SAASC,QAAQC,cACjC/D,WAAWgE,OAAO;CAChBC,SAAS;EACPC,YAAY;EACZC,eAAe;EACfC,KAAKL,QAAQM;EACbC,gBAAgB;EAChBC,WAAWR,QAAQS;CACrB;CAEAC,KAAK;EACHP,YAAY;EACZQ,iBAAiBf,OAAOgB;EACxBC,cAAchB,MAAMS;EACpBQ,QAAQ/B;EACRwB,gBAAgB;EAChBQ,OAAOhB,OAAOiB;CAChB;CAGAC,UAAU,EACRH,QAAQf,OAAOmB,MACjB;CAEAC,iBAAiB;EACfC,aAAaxB,OAAOyB;EACpBC,aAAa;CACf;CACAC,aAAa,EACXZ,iBAAiBf,OAAO4B,iBAC1B;CACAC,SAAS;EACPC,OAAO9B,OAAO+B;EACdC,aAAa,CAAC,cAAc;CAC9B;CACAC,iBAAiB,EACfH,OAAO9B,OAAOkC,mBAChB;CACAC,SAAS;EACP3B,eAAe;EACfC,KAAKL,QAAQM;CACf;CACA0B,SAAS;EACPN,OAAO9B,OAAOqC;EACdlB,OAAOhB,OAAOiB;CAChB;CACAkB,UAAU;EACR9B,eAAe;EACfC,KAAKrB;EACLwB,WAAWR,QAAQM;CACrB;CAEA6B,OAAO;EACLT,OAAO9B,OAAO+B;EACdS,WAAW;EACXrB,OAAO/B;CACT;CAIAqD,WAAW;EACT1B,iBAAiBf,OAAO0C;EACxBzB,cAAchB,MAAMY;EACpB8B,WAAWzC,QAAQ0C;EACnBC,WAAW;EACXC,UAAU;EACVC,UAAU;EACVC,iBAAiB;EACjB7B,OAAOjC;CACT;CACA+D,SAAS,EACPC,SAAS9C,QAAQS,GACnB;CAKAsC,MAAM;EACJC,WAAW;EACX,GAAIlH,SAASmH,OAAO,QAAQC,KAAAA,IAAY,EAAEC,WAAW,MAAM;EAC3DrC,QAAQrC;EACR+B,WAAWtB;EACX6B,OAAOtC;CACT;CAEA2E,WAAW;EACTjD,YAAY;EACZW,QAAQjC;EACR0B,gBAAgB;EAChB8C,UAAU;EACVtC,OAAOlC;CACT;CACAyE,YAAY;EACV,GAAGrH,WAAWsH;EACdC,eAAe;CACjB;CACAC,UAAU,EACR/B,OAAO9B,OAAO+B,UAChB;CACA+B,kBAAkB,EAChBhC,OAAO9B,OAAO+D,UAChB;CACAC,UAAU;EACRlC,OAAO9B,OAAOqC;EACd4B,cAAc1E;CAChB;CAGA2E,WAAW,EACTC,eAAe,GACjB;CAIAC,QAAQ;EACN7D,YAAY;EACZ8D,QAAQ;EACR1D,gBAAgB;EAChB2D,MAAM;EACNV,eAAe;EACfH,UAAU;EACVc,OAAO;EACPC,KAAK;CACP;CACAC,UAAU,EACRC,SAAS,OACX;CAGAC,QAAQ;EACNnD,aAAaxB,OAAO4E;EACpB3D,cAAchB,MAAMS;EACpBgB,aAAa;EACbR,QAAQ/B;EACR4D,UAAU;EACV5B,OAAO9B;CACT;CACAwF,eAAe;EACbC,gBAAgB9E,OAAO4E;EACvBG,gBAAgB;CAClB;CACAC,YAAY;EACVzE,YAAY;EACZ0E,WAAW;EACXC,UAAU;EACVvE,gBAAgB;CAClB;CACAwE,aAAa,EACXjE,QAAQf,OAAOmB,MACjB;CACA8D,gBAAgB,EACdrE,iBAAiBf,OAAOqF,kBAC1B;CACAC,YAAY,EACVxD,OAAO9B,OAAOqC,iBAChB;CACAkD,oBAAoB,EAClBzD,OAAO9B,OAAOwF,oBAChB;CACAC,KAAK;EACHlF,YAAY;EACZC,eAAe;EACfC,KAAKL,QAAQsF;EACb/E,gBAAgB;CAClB;AACF,CAAC,CACL;;;;;;AAiHA,SAAS8H,WAAWC,MAAmD;CACrE,OAAO,SAASA,OACZA,OACAjN,mBAAmBC,MAAMH,iBAAiB,CAAC,GAAGmN,IAAI;AACxD;AAKA,SAASC,QAAQ,EACfC,YACAL,QACAM,OACAC,SACAC,OAOC;CACD,OACE,oBAAC,YAAD;EACE,iBAAeR;EACf,cAAYM;EACAD;EACHE;EACJC;EAEL,UAAA,oBAAC,YAAD,CAAW,CAAA;CACD,CAAA;AAEhB;AAIA,SAAAC,KAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAc,MAAA,EAAAjD,OAAAC,QAAAC,QAAAC,WAAAC,MAAAE,QAAAC,eAAAwC;CASZ,MAAAG,QAAc7K,SAAS;CACvB,MAAA,EAAAyB,WAAmBoJ;CACnB,MAAAC,SAAetJ,SAASqJ,KAAK;CAC7B,MAAAE,OAAa5K,YAAY,WAAW;CAAC,IAAA6K;CAAA,IAAAL,EAAA,OAAA9C,UAAA8C,EAAA,OAAA7C,aAAA6C,EAAA,OAAA1C,QAAA;EACN+C,KAAA;GAAAnD;GAAAC;GAAAG;EAA4B;EAAC0C,EAAA,KAAA9C;EAAA8C,EAAA,KAAA7C;EAAA6C,EAAA,KAAA1C;EAAA0C,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAA5D,MAAAM,UAAgBC,eAAeF,EAA6B;CAC5D,MAAAG,SAAeC,UAAUrD,MAAMJ,OAAOC,QAAQM,UAAU;CACxD,MAAAmD,UAAgBtD,SAAS,YAAYJ,MAAK2D,SAAU,MAAM;CAAC,IAAAC;CAAA,IAAAZ,EAAA,OAAAhD,MAAA6D,QAAAb,EAAA,OAAAhD,MAAA2D,UAAAX,EAAA,OAAA5C,QAAA4C,EAAA,OAAAzC,YAAA;EAEzDqD,KAAAxD,SAAS,WACL0D,MAAM9D,MAAK2D,SAAU,IAAI9K,UAIzB,IAHAiL,MACG9D,MAAK6D,OAAQ,KAAM,IACpB,CAACtD,cAAcP,MAAK6D,QAAS,KAA7B/K,aAAAD,UACF;EAACmK,EAAA,KAAAhD,MAAA6D;EAAAb,EAAA,KAAAhD,MAAA2D;EAAAX,EAAA,KAAA5C;EAAA4C,EAAA,KAAAzC;EAAAyC,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CANP,MAAAe,SACEH;CAQC,MAAAI,KAAAzN;CAA8B,MAAA0N,KAAAd,OAAMlG;CAClC,MAAAiH,KAAA5N;CACE,MAAA6N,KAAA/N;CACC,MAAAgO,KAAA;CACQ,MAAAC,KAAA/D,WAAWlD,KAAAA,IAAXA,KAAAA,IAAA,GAAsCkD,OAAM;CAAO,IAAAgE;CAAA,IAAAtB,EAAA,OAAAlJ,OAAAgB,yBAAA;EAGzDwJ,KAAA,oBAAC,QAAD;GACM1L,IAAAA;GACAA,IAAAA;GACE,MAAAkB,OAAMgB;GACTlC,GAAAA;EAAM,CAAA;EACToK,EAAA,KAAAlJ,OAAAgB;EAAAkI,EAAA,MAAAsB;CAAA,OAAAA,KAAAtB,EAAA;CAAA,IAAAuB;CAAA,IAAAvB,EAAA,QAAAlJ,OAAAyB,WAAAyH,EAAA,QAAAe,OAAAlE,KAAAmD,EAAA,QAAAe,OAAAjE,GAAA;EACFyE,KAAA,oBAAC,MAAD;GACU,QAAAzK,OAAMyB;GACD,aAAA;GACT3C,IAAAA;GACA,IAAAmL,OAAMlE;GACNjH,IAAAA;GACA,IAAAmL,OAAMjE;EAAE,CAAA;EACZkD,EAAA,MAAAlJ,OAAAyB;EAAAyH,EAAA,MAAAe,OAAAlE;EAAAmD,EAAA,MAAAe,OAAAjE;EAAAkD,EAAA,MAAAuB;CAAA,OAAAA,KAAAvB,EAAA;CAAA,IAAAwB;CAAA,IAAAxB,EAAA,QAAAlJ,OAAAyB,SAAA;EACFiJ,KAAA,oBAAC,QAAD;GACM5L,IAAAA;GACAA,IAAAA;GACE,MAAAkB,OAAMyB;GACTjC,GAAAA;EAAU,CAAA;EACb0J,EAAA,MAAAlJ,OAAAyB;EAAAyH,EAAA,MAAAwB;CAAA,OAAAA,KAAAxB,EAAA;CAAA,IAAAyB;CAAA,IAAAzB,EAAA,QAAAlJ,OAAAyB,WAAAyH,EAAA,QAAAe,OAAAlE,KAAAmD,EAAA,QAAAe,OAAAjE,GAAA;EACF2E,KAAA,oBAAC,QAAD;GACM,IAAAV,OAAMlE;GACN,IAAAkE,OAAMjE;GACJ,MAAAhG,OAAMyB;GACTxC,GAAAA;EAAM,CAAA;EACTiK,EAAA,MAAAlJ,OAAAyB;EAAAyH,EAAA,MAAAe,OAAAlE;EAAAmD,EAAA,MAAAe,OAAAjE;EAAAkD,EAAA,MAAAyB;CAAA,OAAAA,KAAAzB,EAAA;CAAA,IAAA0B;CAAA,IAAA1B,EAAA,QAAAU,WAAAV,EAAA,QAAAlJ,OAAA+D,aAAAmF,EAAA,QAAAe,OAAAlE,KAAAmD,EAAA,QAAAe,OAAAjE,GAAA;EACD4E,MAAAhB,UACC,oBAAC,QAAD;GACM,IAAAK,OAAMlE;GACN,IAAAkE,OAAMjE;GACJ,MAAAhG,OAAM+D;GACTtE,GAAAA;EAAW,CAAA,IALjB;EAOOyJ,EAAA,MAAAU;EAAAV,EAAA,MAAAlJ,OAAA+D;EAAAmF,EAAA,MAAAe,OAAAlE;EAAAmD,EAAA,MAAAe,OAAAjE;EAAAkD,EAAA,MAAA0B;CAAA,OAAAA,MAAA1B,EAAA;CAAA,IAAA2B;CAAA,IAAA3B,EAAA,QAAA0B,OAAA1B,EAAA,QAAAsB,MAAAtB,EAAA,QAAAuB,MAAAvB,EAAA,QAAAwB,MAAAxB,EAAA,QAAAyB,IAAA;EAlCVE,MAAA,qBAAC,KAAD;GAAahM,QAAAA;GAAe,SAAA,OAAOA,KAAI,GAAIA;GAAeA,OAAAA;GAA1D,UAAA;IACE2L;IAMAC;IAQAC;IAMAC;IAMCC;GA3BC;;EAmCE1B,EAAA,MAAA0B;EAAA1B,EAAA,MAAAsB;EAAAtB,EAAA,MAAAuB;EAAAvB,EAAA,MAAAwB;EAAAxB,EAAA,MAAAyB;EAAAzB,EAAA,MAAA2B;CAAA,OAAAA,MAAA3B,EAAA;CACL,MAAA4B,KAAAxO;CAAY,MAAAyO,MAAA1B,OAAM3F;CAChB,MAAAsH,MAAAtB,OAAMuB,KAAKpC,UACV,oBAAC,MAAD;EAES,OAAArK,cACL6K,OAAM7F,WACN0H,QAAQrC,KAAK,CACf;EAEA,UAAA,oBAACyL,MAAD;GACS,OAAA9V,cACL8K,MACAT,MAAKjD,aACDyD,OAAMvF,mBACNuF,OAAMxF,QACZ;GAECgF,UAAAA,MAAK/C;EARG,CAAA;CAPR,GACE+C,MAAKhD,GADP,CAkBN;CAAC,IAAAsF;CAAA,IAAAjC,EAAA,QAAA4B,MAAA5B,EAAA,QAAAG,UAAAH,EAAA,QAAA8B,KAAA;EApBJG,MAAA,oBAAC,IAAD;GAAa,OAAAJ;GACVC,UAAAA;EADE,CAAA;EAqBE9B,EAAA,MAAA4B;EAAA5B,EAAA,MAAAG;EAAAH,EAAA,MAAA8B;EAAA9B,EAAA,MAAAiC;CAAA,OAAAA,MAAAjC,EAAA;CAAA,IAAAkC;CAAA,IAAAlC,EAAA,QAAAmB,MAAAnB,EAAA,QAAA2B,OAAA3B,EAAA,QAAAiC,OAAAjC,EAAA,QAAAqB,IAAA;EA7DTa,MAAA,qBAAC,IAAD;GACE,eAAAd;GACQ,QAAAC;GAFV,UAAA,CAIEM,KAoCAM,GAxCG;;EA8DEjC,EAAA,MAAAmB;EAAAnB,EAAA,MAAA2B;EAAA3B,EAAA,MAAAiC;EAAAjC,EAAA,MAAAqB;EAAArB,EAAA,MAAAkC;CAAA,OAAAA,MAAAlC,EAAA;CAAA,IAAAmC;CAAA,IAAAnC,EAAA,QAAAkB,MAAAlB,EAAA,QAAAM,WAAAN,EAAA,QAAAkC,KAAA;EA/DTC,MAAA,oBAAC,IAAD;GAA0B7B;GACxB4B,UAAAA;EADc,CAAA;EAgEElC,EAAA,MAAAkB;EAAAlB,EAAA,MAAAM;EAAAN,EAAA,MAAAkC;EAAAlC,EAAA,MAAAmC;CAAA,OAAAA,MAAAnC,EAAA;CAAA,IAAAoC;CAAA,IAAApC,EAAA,QAAAgB,MAAAhB,EAAA,QAAAG,UAAAH,EAAA,QAAAmC,KAAA;EAjEpBC,MAAA,oBAAC,IAAD;GAA+B,OAAAnB;GAC7BkB,UAAAA;EADqB,CAAA;EAkEEnC,EAAA,MAAAgB;EAAAhB,EAAA,MAAAG;EAAAH,EAAA,MAAAmC;EAAAnC,EAAA,MAAAoC;CAAA,OAAAA,MAAApC,EAAA;CAAA,OAlEzBoC;AAkEyB;;AAK7B,SAAS9H,UACPqC,KACAC,MACAF,YACA2F,MACAC,QACW;CACX,MAAM,EAAEzF,GAAGC,MAAMgE,MAAMuB,MAAMC,MAAM;CACnC,OAAO;EAAE5F;EAAYC;EAAKC;EAAMC;EAAGC;CAAE;AACvC;AAKA,SAASyF,UACPpC,QACAC,MACAqC,QACAC,OACgB;CAChB,MAAMC,YAAYC,MAAuBC,aACvCJ,SAASG,SAASF,QAAQG;CAE5B,OAAO;EACLjL,MAAMgL,MAAMC,aACVvN,cACE6K,OAAOvI,KACP6K,SAASrI,KAAAA,IAAY+F,OAAOhI,UAC5BwK,SAASC,MAAMC,QAAQ,IAAI1C,OAAO1H,cAAc2B,KAAAA,GAChD,CAACqI,UAAUI,WAAW1C,OAAO9H,kBAAkB+B,KAAAA,CACjD;EACF0I,SAASxN,cAAyB8K,MAAMD,OAAO9G,KAAK;EACpD0J,OAAOtM;EACPuM,gBAAgB,CAACP;EACjB7F,OAAOgG,MAAMC,aACXvN,cACE8K,MACAD,OAAOxH,SACPgK,SAASC,MAAMC,QAAQ,IAAI1C,OAAOpH,kBAAkBqB,KAAAA,CACtD;CACJ;AACF;;AAGA,SAAS6I,UAAUC,MAAcjG,QAAgB;CAC/C,OAAOiG,KAAKC,OAAO,CAAC,CAAC,CAACC,kBAAkBnG,MAAM,IAAIiG,KAAKG,MAAM,CAAC;AAChE;;;;;;AAOA,SAASC,YACPxF,OACAQ,kBACW;CACX,MAAMiF,OAAOzF,MAAM0F;CACnB,IAAID,SAAS,QAAQ,UAAUA,MAC7B,OAAOA;CAET,OAAOjF,oBAAoB,IAAIhM,KAAK;AACtC;;AAGA,SAASmO,UACPrD,MACAoC,MACAvC,QACAM,YACa;CACb,MAAMkG,QAAQC,MAAMC,KAAK,EAAEC,QAAQ,GAAG,IAAIC,GAAGC,SAASA,IAAI;CAE1D,IAAI1G,SAAS,UAAU;EACrB,MAAM2G,SAAS,IAAIC,KAAKC,aAAahH,QAAQ,EAAEiH,sBAAsB,EAAE,CAAC;EACxE,OAAOT,MAAM1B,KAAK+B,SAChBxJ,UACE,IAAIwJ,QACJC,OAAOI,OAAOL,OAAO,CAAC,GACtBtE,KAAKmB,WAAWmD,OAAO,GACvBA,OAAO,IACPjO,UACF,CACF;CACF;CAEA,MAAMuO,QAAQ,IAAIhS,cAAc6K,QAAQ;EACtC4D,MAAM;EACNwD,QAAQ9G;CACV,CAAC;CACD,IAAIA,YACF,OAAOkG,MAAM1B,KAAK+B,SAChBxJ,UACE,IAAIwJ,QACJQ,OAAOF,OAAON,MAAM,MAAM,GAC1BtE,KAAKqB,OAAO,OAAOiD,MACnBA,OAAO,IACPjO,UACF,CACF;CAEF,OAAO,CACL,GAAG4N,MAAM1B,KAAK+B,SACZxJ,UACE,IAAIwJ,QACJQ,OAAOF,OAAON,MAAM,MAAM,GAC1BtE,KAAKqB,SAASiD,MACdA,OAAO,IACPjO,UACF,CACF,GACA,GAAG4N,MAAM1B,KAAK+B,SACZxJ,UACE,IAAIwJ,OAAO,MACXQ,OAAOF,OAAON,OAAO,IAAI,MAAM,GAC/BtE,KAAKqB,SAASiD,OAAO,IACrBA,OAAO,IACPhO,UACF,CACF,CAAC;AAEL;AAKA,SAAAyO,aAAAxE,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAsB,MAAA,EAAAxC,aAAAC,cAAAC,aAAAE,gBAAAC,OAAAC,YAAAC,aAAAC,YAAAC,WAAAC,SAAAlB,QAAAmB,QAAAC,SAAAC,kBAAAC,iBAAAC,aAAAlB,WAAAyC;CAmBpB,MAAAG,QAAc7K,SAAS;CACvB,MAAA8K,SAAetJ,SAASqJ,KAAK;CAC7B,MAAAsE,eAAqBhP,YAAY,aAAa;CAC9C,MAAAiP,cAAoBjP,YAAY,WAAW;CAC3C,MAAAkP,WAAiBlP,YAAY,cAAc;CAC3C,MAAAmP,YAAkBnP,YAAY,eAAe;CAC7C,MAAAoP,QAAcpQ,YAAYyI,MAAM,CAAC,CAAA4H;CAAS,IAAAxE;CAAA,IAAAL,EAAA,OAAAlC,SAAAkC,EAAA,OAAA1B,kBAAA;EACP+B,WAAMiD,YAAYxF,OAAOQ,gBAAgB;EAAC0B,EAAA,KAAAlC;EAAAkC,EAAA,KAAA1B;EAAA0B,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAA7E,MAAA,CAAAhD,OAAA8H,YAA0BjS,SAASwN,EAA0C;CAC7E,MAAA,CAAA0E,MAAAC,WAAwBnS,SAAS8K,WAAW;CAC5C,MAAA,CAAAP,MAAA6H,WAAwBpS,SAAmB,MAAM;CACjD,MAAA,CAAAkH,SAAAmL,cAA8BrS,SAAS,CAAC;CACxC,MAAA,CAAAsS,MAAAC,WAAwBvS,SAAS,CAAC;CAClC,MAAAwS,QAAczS,OAAuB,IAAI;CAAC,IAAAgO;CAAA,IAAAZ,EAAA,OAAA9B,aAAA8B,EAAA,OAAA/C,QAAA;EACvB2D,KAAA0E,gBAAgBrI,QAAQiB,SAAS;EAAC8B,EAAA,KAAA9B;EAAA8B,EAAA,KAAA/C;EAAA+C,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAArD,MAAAzC,aAAmBqD;CACnB,MAAA2E,eAAqBvH,gBAAgB;CACrC,MAAAyE,SAAesC,SAAS;CACxB,MAAAhG,cAAoB/B,MAAK6D,QAAS;CAClC,MAAA/F,WAAiB2H,SAAAlE,kBAAAV;CACjB,MAAA2H,UAAgB,IAAIpT,cAAc6K,QAAQ;EAAA4D,MAAQ;EAASwD,QAAU;CAAK,CAAC;CAAC,IAAApD;CAAA,IAAAjB,EAAA,OAAAyF,OAAAC,IAAA,2BAAA,GAAA;EAMhEzE,MAAA0E,SAAA;GACR,IAAIA,SAAS,MACXb,SAASa,IAAI;EACd;EACF3F,EAAA,KAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAAA,IAAAoB;CAAA,IAAApB,EAAA,OAAAhD,SAAAgD,EAAA,OAAAhC,eAAAgC,EAAA,OAAA9B,aAAA8B,EAAA,QAAA/C,QAAA;EAT6BmE,KAAA;GAAApD;GAAA4H,cAEhB;GAAI1H;GAAAjB;GAAA4I,UAGR5E;GAIT6E,yBACwB;GAAItC,OACtBxG;EACT;EAACgD,EAAA,KAAAhD;EAAAgD,EAAA,KAAAhC;EAAAgC,EAAA,KAAA9B;EAAA8B,EAAA,MAAA/C;EAAA+C,EAAA,MAAAoB;CAAA,OAAAA,KAAApB,EAAA;CAZD,MAAApB,QAAc7K,kBAAkBqN,EAY/B;CAAC,IAAAC;CAAA,IAAArB,EAAA,QAAAyF,OAAAC,IAAA,2BAAA,GAAA;EAIyBrE,MAAAuB,SAAA;GACzB,IAAIA,SAAS,UAAUA,SAAS,UAC9BqC,QAAQrC,IAAI;EACb;EACF5C,EAAA,MAAAqB;CAAA,OAAAA,KAAArB,EAAA;CAJD,MAAA+F,SAAe1E;CAIT,IAAAC;CAAA,IAAAtB,EAAA,QAAA5C,QAAA4C,EAAA,QAAAzC,YAAA;EAMJ+D,MAAAzE,GAAAC,MAAA;GACE,MAAAkJ,SAAenJ,IAAIjH;GACnB,MAAAqQ,OAAanJ,IAAIlH;GACjB,MAAAyM,QAAc6D,KAAIC,MAAOH,QAAQ,CAACC,IAAI,KAAK,IAAIC,KAAIE,MAAO,KAAK;GAE/D,IAAIhJ,SAAS,UAAQ;IACnB0H,UAAStF,SAAUA,KAAI6G,IAAK,EAAA1F,QAAUuF,KAAII,MAAOjE,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC;IAAC;GAAA;GAGtE,MAAAyB,OAAaoC,KAAII,MAAOjE,OAAO,EAAE,IAAI;GACrC,IAAI9E,YAAU;IACZuH,UAASyB,WACP/G,OAAI6G,IAAK,EAAAxF,MAAQiD,QAAQtE,OAAIqB,QAAS,KAAb,KAAA,GAA0B,CAAC,CACtD;IAAC;GAAA;GAGH,MAAA2F,QAAcN,KAAIO,MAAOT,QAAQC,IAAI,IAAKpQ,MAA2B;GACrEiP,UAAS4B,WAAUlH,OAAI6G,IAAK,EAAAxF,MAAQ2F,QAAQ1C,OAAO,KAAfA,KAAyB,CAAC,CAAC;EAAC;EACjE9D,EAAA,MAAA5C;EAAA4C,EAAA,MAAAzC;EAAAyC,EAAA,MAAAsB;CAAA,OAAAA,KAAAtB,EAAA;CAnBH,MAAA2G,OAAarF;CAqBZ,IAAAC;CAAA,IAAAvB,EAAA,QAAA5C,QAAA4C,EAAA,QAAAuF,cAAA;EAG2BhE,WAAA;GAC1B,IAAInE,SAAS,UAATmI,cAA+B;IACjCN,QAAQ,QAAQ;IAChBI,MAAKuB,SAAiBC,QAAC,UAAU,KAAK;GAAC;EACxC;EACF7G,EAAA,MAAA5C;EAAA4C,EAAA,MAAAuF;EAAAvF,EAAA,MAAAuB;CAAA,OAAAA,KAAAvB,EAAA;CALD,MAAA8G,UAAgBvF;CAKQ,IAAAC;CAAA,IAAAxB,EAAA,QAAAyC,UAAAzC,EAAA,QAAA5C,MAAA;EAIOoE,WAAA;GAC7BwD,QAAQvC,SAAA,UAAA,MAAyB;GACjC4C,MAAKuB,SAAiBC,QAACzJ,MAAMqF,MAAM;EAAC;EACrCzC,EAAA,MAAAyC;EAAAzC,EAAA,MAAA5C;EAAA4C,EAAA,MAAAwB;CAAA,OAAAA,KAAAxB,EAAA;CAHD,MAAA+G,aAAmBvF;CAGD,IAAAC;CAAA,IAAAzB,EAAA,QAAAyF,OAAAC,IAAA,2BAAA,GAAA;EAIejE,MAAAxC,cAAA;GAC/B6F,UAASkC,WACPxH,OAAI6G,IAAK,EAAAxF,MAASrB,OAAIqB,OAAQ,MAAO5B,YAAA,KAAA,GAAoB,CAAC,CAC5D;EAAC;EACFe,EAAA,MAAAyB;CAAA,OAAAA,KAAAzB,EAAA;CAJD,MAAAiH,eAAqBxF;CAIf,IAAAC;CAAA,IAAA1B,EAAA,QAAAhD,SAAAgD,EAAA,QAAAlC,OAAA;EAIsB4D,YAAA;GAC1B5D,MAAKoJ,SAAU3H,WAAWvC,KAAK,CAAC;EAAC;EAClCgD,EAAA,MAAAhD;EAAAgD,EAAA,MAAAlC;EAAAkC,EAAA,MAAA0B;CAAA,OAAAA,MAAA1B,EAAA;CAFD,MAAAmH,UAAgBzF;CAEE,IAAAC;CAAA,IAAA3B,EAAA,QAAAyF,OAAAC,IAAA,2BAAA,GAAA;EAKiB/D,OAAAkC,GAAA7L,WAAA;GACjCkN,WAAWlN,MAAM;EAAC;EACnBgI,EAAA,MAAA2B;CAAA,OAAAA,MAAA3B,EAAA;CAFD,MAAAoH,iBAAuBzF;CAEjB,IAAAE;CAAA,IAAA7B,EAAA,QAAAyF,OAAAC,IAAA,2BAAA,GAAA;EAC0B7D,OAAAwF,UAAA;GAC9BjC,QAAQiC,MAAKC,YAAYpM,OAAOlD,MAAO;EAAC;EACzCgI,EAAA,MAAA6B;CAAA,OAAAA,MAAA7B,EAAA;CAFD,MAAAuH,cAAoB1F;CAEd,IAAAC;CAAA,IAAA9B,EAAA,QAAAyF,OAAAC,IAAA,2BAAA,GAAA;EAIE5D,MAAAjN,YAAY,UAAUuF,KAAAA,CAAS;EAAC4F,EAAA,MAAA8B;CAAA,OAAAA,MAAA9B,EAAA;CAAA,IAAAiC;CAAA,IAAAjC,EAAA,QAAAhD,SAAAgD,EAAA,QAAAyC,UAAAzC,EAAA,QAAA/C,UAAA+C,EAAA,QAAA5C,QAAA4C,EAAA,QAAA2G,QAAA3G,EAAA,QAAA8G,WAAA9G,EAAA,QAAA1C,UAAA0C,EAAA,QAAAzC,YAAA;EAwFjC0E,MAAAQ,SACC,oBAAC,MAAD;GACSzF;GACCC;GACA0J,QAAAA;GACGG,WAAAA;GACL1J;GACEE;GACIC;EAAU,CAAA,IARzB;EAUOyC,EAAA,MAAAhD;EAAAgD,EAAA,MAAAyC;EAAAzC,EAAA,MAAA/C;EAAA+C,EAAA,MAAA5C;EAAA4C,EAAA,MAAA2G;EAAA3G,EAAA,MAAA8G;EAAA9G,EAAA,MAAA1C;EAAA0C,EAAA,MAAAzC;EAAAyC,EAAA,MAAAiC;CAAA,OAAAA,MAAAjC,EAAA;CAGQ,MAAAkC,MAAAO,SAAA5E,iBAAAU;CAAyC,IAAA4D;CAAA,IAAAnC,EAAA,QAAAyC,QAAA;EAGpDN,MAAAM,SAAS,oBAAC,eAAD,CAAc,CAAA,IAAM,oBAAC,YAAD,CAAW,CAAA;EAAGzC,EAAA,MAAAyC;EAAAzC,EAAA,MAAAmC;CAAA,OAAAA,MAAAnC,EAAA;CAAA,IAAAoC;CAAA,IAAApC,EAAA,QAAA+G,cAAA/G,EAAA,QAAAkC,OAAAlC,EAAA,QAAAmC,KAAA;EAJ9CC,MAAA,oBAAC,YAAD;GACc,cAAAF;GACH6E,SAAAA;GAER5E,UAAAA;EAJQ,CAAA;EAKEnC,EAAA,MAAA+G;EAAA/G,EAAA,MAAAkC;EAAAlC,EAAA,MAAAmC;EAAAnC,EAAA,MAAAoC;CAAA,OAAAA,MAAApC,EAAA;CAAA,IAAAwH;CAAA,IAAAxH,EAAA,QAAAvC,aAAA;EAEX+J,MAAA,oBAAC,QAAD;GAAa,MAAA;GAAgB,SAAA;GAC1B/J,UAAAA;EADI,CAAA;EAEEuC,EAAA,MAAAvC;EAAAuC,EAAA,MAAAwH;CAAA,OAAAA,MAAAxH,EAAA;CAAA,IAAAyH;CAAA,IAAAzH,EAAA,QAAAmH,WAAAnH,EAAA,QAAAtC,cAAA;EACT+J,MAAA,oBAAC,QAAD;GAAiBN,SAAAA;GAAc,MAAA;GAAgB,SAAA;GAC5CzJ,UAAAA;EADI,CAAA;EAEEsC,EAAA,MAAAmH;EAAAnH,EAAA,MAAAtC;EAAAsC,EAAA,MAAAyH;CAAA,OAAAA,MAAAzH,EAAA;CAAA,IAAA0H;CAAA,IAAA1H,EAAA,QAAAG,OAAAlH,WAAA+G,EAAA,QAAAwH,OAAAxH,EAAA,QAAAyH,KAAA;EANXC,MAAA,qBAAC,MAAD;GAAa,OAAAvH,OAAMlH;GAAnB,UAAA,CACEuO,KAGAC,GAJG;;EAOEzH,EAAA,MAAAG,OAAAlH;EAAA+G,EAAA,MAAAwH;EAAAxH,EAAA,MAAAyH;EAAAzH,EAAA,MAAA0H;CAAA,OAAAA,MAAA1H,EAAA;CAAA,IAAA2H;CAAA,IAAA3H,EAAA,QAAAG,OAAA/I,WAAA4I,EAAA,QAAAoC,OAAApC,EAAA,QAAA0H,KAAA;EAdTC,MAAA,qBAAC,MAAD;GAAa,OAAAxH,OAAM/I;GAAnB,UAAA,CACEgL,KAMAsF,GAPG;;EAeE1H,EAAA,MAAAG,OAAA/I;EAAA4I,EAAA,MAAAoC;EAAApC,EAAA,MAAA0H;EAAA1H,EAAA,MAAA2H;CAAA,OAAAA,MAAA3H,EAAA;CAAA,OAnHX,oBAAA,SAAA,MAAA;EAAA,GACM8B;EAEF,cAAA9O,SAAQmH,OAAQ,QAAhBC,KAAAA,IAAA,GAAuCU,SAAQ,IAAKiD;EAE/BM,uBAAAA;EAChB,OAAA/I,cAAwC6K,OAAM5G,WAAY6E,MAAM;EAC/D,QAAAd,WAAWlD,KAAAA,IAAXA,KAAAA,IAAA,GAAsCkD,OAAM;EAEpD,UAAA,qBAAC,YAAD;GACyB,uBAAA6C,OAAMpG;GACRqN,qBAAAA;GACXG,UAAAA;GACK,eAAAxN,UAAUoL;GAJ3B,UAAA;IAME,oBAACiG,MAAD;KACYnN,UAAAA;KACLO,KAAAA;KACA,MAAA;KACE,OAAAlJ,cAAyBkP,cAAcrE,OAAMrF,QAAS;KAE5DA,UAAAA;IANQ,CAAA;IAQV9H,SAAQmH,OAAQ,QACf,oBAACiR,MAAD;KAAsBjN,UAAAA;KAAgB,OAAAgC,OAAM5E;KACzCwC,UAAAA;IADQ,CAAA,IADZ;IAKD,qBAAC,MAAD;KAAa,OAAAoC,OAAM5D;KAAnB,UAAA,CACE,qBAAC,MAAD,EAAA,UAAA,CACE,oBAAC,cAAD;MACa3F,WAAAA;MACF,SAAA2L,UACPpC,QACAsC,SAAAiC,WAAAC,WACAlC,QACArF,IACF;MACW,WAAA;MACJW,OAAAA;MACCd;MACQ8I,gBAAAA;MACXV,KAAAA;MACEzG;KAAK,CAAA,GAEb6D,SAAA,OACC,qBAAC,MAAD;MAAM,eAAA;MAAmB,OAAAtC,OAAM/G;MAA/B,UAAA,CACE,oBAACgS,MAAD;OACS,OAAA9V,cAAyBmP,aAAatE,OAAMjH,OAAQ;OAE1D+J,UAAAA,UAAU2B,MAAK/D,MAAO5D,MAAM;MAHpB,CAAA,GAKVsI,eACC,oBAAC6F,MAAD;OACS,OAAA9V,cACLmP,aACAtE,OAAMjH,OACR;OAEC+J,UAAAA,UAAU2B,MAAKjE,QAAS1D,MAAM;MANtB,CAAA,IADZ,IANE;KAjBJ,CAAA,CAAA,EAAA,CAAA,GAoCJM,aACC,qBAAC,MAAD;MACc,cAAAqH,MAAKgD;MACZ,MAAA;MACE,OAAAtS,cACL6K,OAAM1E,QACNgH,SAAArI,KAAAA,IAAqB+F,OAAMlE,WAC7B;MANF,UAAA,CAQE,oBAAC,YAAD;OACe,aAAA;OACD,YAAA,CAAC8C;OACHkI,UAAAA;OACJ,MAAA3C,OAAOkB,SAAS,GAAG,WAAW;MAAC,CAAA,GAEvC,oBAAC,YAAD;OACE,aAAA;OACYzG,YAAAA;OACFkI,UAAAA;OACJ,MAAA3C,OAAOkB,SAAS,IAAI,WAAW;MAAC,CAAA,CAlBrC;KADN,CAAA,IAAA,IArCE;;IA6DJvD;IAWD0F;GA3FS;;CA4Gb,CAAA;AAAgB;;AAKpB,SAASrD,OACPH,QACAtD,MACA+B,MACA;CACA,OACEuB,OACG0D,cAAc,IAAIC,KAAK,KAAM,GAAG,GAAGjH,IAAI,CAAC,CAAC,CACzCkH,MAAMC,SAASA,KAAKpF,SAASA,IAAI,CAAC,EAAEY,SAASyE,OAAOpH,IAAI;AAE/D;AAIA,SAAAqH,WAAAnI,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAoB,MAAA,EAAAlB,aAAArC,YAAAsC,UAAApC,SAAAmD;CAMlB,MAAAG,QAAc7K,SAAS;CACvB,MAAA8K,SAAetJ,SAASqJ,KAAK;CAC7B,MAAAE,OAAa5K,YAAY,aAAa;CAE7B,MAAA6K,KAAA3D,aACHwD,MAAKpJ,OAAOwF,sBACZ4D,MAAKpJ,OAAOqC;CAAiB,IAAAyH;CAAA,IAAAZ,EAAA,OAAAK,IAAA;EAHDO,KAAA,EAAAhI,OACzByH,GAGT;EAACL,EAAA,KAAAK;EAAAL,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAJD,MAAAmI,WAAiBjT,iBAAiB0L,EAIjC;CAAC,IAAAK;CAAA,IAAAjB,EAAA,OAAAjB,eAAAiB,EAAA,OAAAhB,UAAA;EACyBiC,WAAA;GACzBjC,SAASD,WAAW;EAAC;EACtBiB,EAAA,KAAAjB;EAAAiB,EAAA,KAAAhB;EAAAgB,EAAA,KAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAFD,MAAAoI,SAAenH;CAKZ,MAAAD,KAAA/N;CAEM,MAAAmO,KAAA;CACD,MAAAC,KAAA8G,SAAQE;CAEL,MAAA/G,KAAAhM,cACL6K,OAAMrE,YACNiD,cAAcoB,OAAMxE,gBAApBvB,KAAAA,GACAsC,aAAayD,OAAMjE,iBAAnB9B,KAAAA,GACA+N,SAAQG,MACRH,SAAQG,SAAUlO,KAAAA,IAAlBA,KAAAA,IAA0C+F,OAAMnF,SAClD;CAEC,MAAAuG,KAAA4G,SAAQI;CACR,MAAArH,KAAAnO;CACQ,MAAAyO,KAAAlM,cACL8K,MACA1D,aAAayD,OAAM9D,qBAAsB8D,OAAM/D,UACjD;CAAC,IAAAqF;CAAA,IAAAzB,EAAA,OAAAkB,MAAAlB,EAAA,OAAAwB,MAAAxB,EAAA,OAAApD,MAAA;EAJH6E,KAAA,oBAAC,IAAD;GACS,OAAAD;GAKN5E,UAAAA;EANQ,CAAA;EAOEoD,EAAA,KAAAkB;EAAAlB,EAAA,KAAAwB;EAAAxB,EAAA,KAAApD;EAAAoD,EAAA,KAAAyB;CAAA,OAAAA,KAAAzB,EAAA;CAAA,IAAA0B;CAAA,IAAA1B,EAAA,OAAAgB,MAAAhB,EAAA,QAAAoI,UAAApI,EAAA,QAAAmI,SAAAE,YAAArI,EAAA,QAAAmI,SAAAI,SAAAvI,EAAA,QAAAtD,cAAAsD,EAAA,QAAAsB,MAAAtB,EAAA,QAAAyB,IAAA;EArBfC,MAAA,qBAAC,IAAD;GACgBhF,gBAAAA;GACT,MAAA0E;GAAO,GACRC;GACK+G,SAAAA;GACF,OAAA9G;GALT,UAAA,CAaGC,IACDE,EAdQ;;EAsBEzB,EAAA,KAAAgB;EAAAhB,EAAA,MAAAoI;EAAApI,EAAA,MAAAmI,SAAAE;EAAArI,EAAA,MAAAmI,SAAAI;EAAAvI,EAAA,MAAAtD;EAAAsD,EAAA,MAAAsB;EAAAtB,EAAA,MAAAyB;EAAAzB,EAAA,MAAA0B;CAAA,OAAAA,MAAA1B,EAAA;CAAA,OAtBZ0B;AAsBY;AAKhB,SAASM,QAAQ,EAAEnF,GAAGC,KAA2B;CAC/C,OAAO;EAAE1B,MAAMyB,IAAI9G;EAAQuF,KAAKwB,IAAI/G;CAAO;AAC7C;;AAGA,SAAS+K,MAAMuB,MAAcC,QAAgB;CAC3C,MAAMkG,QAAQnG,OAAO,IAAI6D,KAAKE;CAC9B,OAAO;EACLvJ,GAAGjH,SAAS0M,SAAS4D,KAAKuC,IAAID,KAAK;EACnC1L,GAAGlH,SAAS0M,SAAS4D,KAAKwC,IAAIF,KAAK;CACrC;AACF;;;;;;;;;;;;;;;;;;;;;;AAuBA,SAAAG,WAAA5I,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAxC;CAAA,IAAAC;CAAA,IAAA0B;CAAA,IAAAvB;CAAA,IAAAwB;CAAA,IAAApC;CAAA,IAAAqC;CAAA,IAAAsJ;CAAA,IAAArK;CAAA,IAAA8B;CAAA,IAAAO;CAAA,IAAAK;CAAA,IAAAG;CAAA,IAAApB,EAAA,OAAAD,IAAA;EAAqD,CAAA,CAAAtC,aAAAC,cAAAC,aAAA0C,IAAAjB,aAAAvB,gBAAA6B,YAAAkB,IAAAvB,QAAAwJ,YAAA5H,IAAA6H,YAAA1H,IAAAnE,QAAAqC,cAAAf,iBAAA,GAAAqK,SAAA7I;EAchCC,EAAA,KAAAD;EAAAC,EAAA,KAAAvC;EAAAuC,EAAA,KAAAtC;EAAAsC,EAAA,KAAAZ;EAAAY,EAAA,KAAAnC;EAAAmC,EAAA,KAAAX;EAAAW,EAAA,KAAA/C;EAAA+C,EAAA,KAAAV;EAAAU,EAAA,KAAA4I;EAAA5I,EAAA,KAAAzB;EAAAyB,EAAA,MAAAK;EAAAL,EAAA,MAAAY;EAAAZ,EAAA,MAAAiB;EAAAjB,EAAA,MAAAoB;CAAA,OAAA;EAAA3D,cAAAuC,EAAA;EAAAtC,eAAAsC,EAAA;EAAAZ,cAAAY,EAAA;EAAAnC,iBAAAmC,EAAA;EAAAX,SAAAW,EAAA;EAAA/C,SAAA+C,EAAA;EAAAV,eAAAU,EAAA;EAAA4I,QAAA5I,EAAA;EAAAzB,kBAAAyB,EAAA;EAAAK,KAAAL,EAAA;EAAAY,KAAAZ,EAAA;EAAAiB,KAAAjB,EAAA;EAAAoB,KAAApB,EAAA;CAAA;CAXnB,MAAArC,cAAA0C,OAAAjG,KAAAA,IAAA,SAAAiG;CAGA,MAAAX,aAAAkB,OAAAxG,KAAAA,IAAA,QAAAwG;CAEA,MAAAiI,aAAA5H,OAAA7G,KAAAA,IAAA,QAAA6G;CACA,MAAA6H,aAAA1H,OAAAhH,KAAAA,IAAA,QAAAgH;CAMA,MAAA2H,YAAkBtU,YAAYwI,MAAM;CAAC,IAAAoE;CAAA,IAAArB,EAAA,QAAA+I,WAAA;EACvB1H,KAAA7M,YAAYuU,SAAS;EAAC/I,EAAA,MAAA+I;EAAA/I,EAAA,MAAAqB;CAAA,OAAAA,KAAArB,EAAA;CAApC,MAAA4E,QAAcvD;CACd,MAAA,CAAAxC,SAAAmK,cAA8BnW,SAA8B,IAAI;CAAC,IAAAyO;CAAA,IAAAtB,EAAA,QAAAZ,eAAAY,EAAA,QAAAX,UAAAW,EAAA,QAAAV,cAAA;EAC5BgC,KAAA;GAAAlC;GAAAC;GAAAC;EAAoC;EAACU,EAAA,MAAAZ;EAAAY,EAAA,MAAAX;EAAAW,EAAA,MAAAV;EAAAU,EAAA,MAAAsB;CAAA,OAAAA,KAAAtB,EAAA;CAA1E,MAAApB,QAAc9K,uBAAuBwN,EAAqC;CAAC,IAAAC;CAAA,IAAAvB,EAAA,QAAAN,cAAAM,EAAA,QAAA6I,cAAA7I,EAAA,QAAA8I,cAAA9I,EAAA,QAAA4I,SAAA5I,EAAA,QAAA+I,WAAA;EACxCxH,KAAA;GAAA,GAC9BqH;GAAKlJ;GAAAmJ;GAAAC;GAAA7L,QAIA8L;EACV;EAAC/I,EAAA,MAAAN;EAAAM,EAAA,MAAA6I;EAAA7I,EAAA,MAAA8I;EAAA9I,EAAA,MAAA4I;EAAA5I,EAAA,MAAA+I;EAAA/I,EAAA,MAAAuB;CAAA,OAAAA,KAAAvB,EAAA;CAND,MAAAlC,QAAc/J,kBAAqBwN,EAMlC;CACD,MAAA0H,aAAmB1K,mBAAmBqG,MAAKqE;CAE3C,MAAA,EAAAC,SAAiBtK;CAMH,MAAA4C,KAAA1D,MAAKqL,mBAAmBC;CAEvB,MAAA3H,KAAA3D,MAAK0F,UAAW;CAAI,IAAA9B;CAAA,IAAA1B,EAAA,QAAAlC,MAAAuL,aAAArJ,EAAA,QAAAlC,MAAA0F,OAAA;EAMlB9B,MAAA5D,MAAK0F,UAAW,OAAhB,KAA4B1F,MAAKuL,UAAUC,SAAU;EAACtJ,EAAA,MAAAlC,MAAAuL;EAAArJ,EAAA,MAAAlC,MAAA0F;EAAAxD,EAAA,MAAA0B;CAAA,OAAAA,MAAA1B,EAAA;CAEnD,MAAA2B,MAAAjC,cAAAmJ;CAEL,MAAAhH,MAAA,GAAGoH,WAAU,GAAIL,MAAKjJ;CAAQ,IAAAmC;CAAA,IAAA9B,EAAA,QAAAkJ,QAAAlJ,EAAA,QAAApB,MAAAS,UAAAW,EAAA,QAAA2B,OAAA3B,EAAA,QAAA6B,KAAA;EAHzBC,MAAArC,QAAQ;GAAAC,YACRiC;GAAwBtC,QAC5BT,MAAKS;GAAOM,OACbkC;GAA8BjC,SAC5BsJ;GAAIrJ,KACRmJ;EACP,CAAC;EAAChJ,EAAA,MAAAkJ;EAAAlJ,EAAA,MAAApB,MAAAS;EAAAW,EAAA,MAAA2B;EAAA3B,EAAA,MAAA6B;EAAA7B,EAAA,MAAA8B;CAAA,OAAAA,MAAA9B,EAAA;CAAA,IAAAiC;CAAA,IAAAjC,EAAA,QAAAlC,SAAAkC,EAAA,QAAAN,cAAAM,EAAA,QAAA6I,cAAA7I,EAAA,QAAA8I,cAAA9I,EAAA,QAAA4I,SAAA5I,EAAA,QAAA0B,OAAA1B,EAAA,QAAA8B,OAAA9B,EAAA,QAAAyB,MAAAzB,EAAA,QAAA+I,WAAA;EAjBJ9G,MAAA,oBAAC,gBAAD;GAAe,GACT2G;GACI,QAAApH;GACI9B;GACH,SAAA+B;GACGoH;GACAC;GACJC,QAAAA;GACDjL,OAAAA;GAEI,WAAA4D;GACG,cAAAI;EAMZ,CAAA;EACF9B,EAAA,MAAAlC;EAAAkC,EAAA,MAAAN;EAAAM,EAAA,MAAA6I;EAAA7I,EAAA,MAAA8I;EAAA9I,EAAA,MAAA4I;EAAA5I,EAAA,MAAA0B;EAAA1B,EAAA,MAAA8B;EAAA9B,EAAA,MAAAyB;EAAAzB,EAAA,MAAA+I;EAAA/I,EAAA,MAAAiC;CAAA,OAAAA,MAAAjC,EAAA;CAEa,MAAAkC,MAAAzE,eAAemH,MAAK2E;CACnB,MAAApH,MAAAzE,gBAAgBkH,MAAKuC;CAEnB,MAAA/E,MAAAvE,kBAAkB+G,MAAK4E;CAG1B,MAAAhC,MAAAoB,MAAK5K,gBAAiB,SAAtB,SAAA;CAAgD,IAAAyJ;CAAA,IAAAzH,EAAA,QAAArC,eAAAqC,EAAA,QAAAlC,SAAAkC,EAAA,QAAA4I,MAAA1K,aAAA8B,EAAA,QAAA4I,MAAAjJ,SAAAK,EAAA,QAAA4I,MAAAtK,oBAAA0B,EAAA,QAAA4I,MAAAtL,UAAA0C,EAAA,QAAAiJ,cAAAjJ,EAAA,QAAApB,SAAAoB,EAAA,QAAAkC,OAAAlC,EAAA,QAAAmC,OAAAnC,EAAA,QAAAoC,OAAApC,EAAA,QAAAwH,OAAAxH,EAAA,QAAAnB,WAAAmB,EAAA,QAAA+I,WAAA;EAP/DtB,MAAA,oBAAC,iBAAD;GACe,aAAAvF;GACC,cAAAC;GACDxE;GACG,gBAAAyE;GACTtE;GACK,YAAA8K,MAAKjJ;GACJ,aAAA6H;GACF,WAAAoB,MAAK1K;GACR6K,QAAAA;GACU,kBAAAH,MAAKtK;GACN2K,iBAAAA;GACVrK;GACC,QAAAgK,MAAKtL;GACJuB;EAAO,CAAA;EAChBmB,EAAA,MAAArC;EAAAqC,EAAA,MAAAlC;EAAAkC,EAAA,MAAA4I,MAAA1K;EAAA8B,EAAA,MAAA4I,MAAAjJ;EAAAK,EAAA,MAAA4I,MAAAtK;EAAA0B,EAAA,MAAA4I,MAAAtL;EAAA0C,EAAA,MAAAiJ;EAAAjJ,EAAA,MAAApB;EAAAoB,EAAA,MAAAkC;EAAAlC,EAAA,MAAAmC;EAAAnC,EAAA,MAAAoC;EAAApC,EAAA,MAAAwH;EAAAxH,EAAA,MAAAnB;EAAAmB,EAAA,MAAA+I;EAAA/I,EAAA,MAAAyH;CAAA,OAAAA,MAAAzH,EAAA;CAAA,IAAA0H;CAAA,IAAA1H,EAAA,QAAAiC,OAAAjC,EAAA,QAAAyH,KAAA;EAnCJC,MAAA,qBAAA,YAAA,EAAA,UAAA,CACEzF,KAmBAwF,GAeE,EAAA,CAAA;EACDzH,EAAA,MAAAiC;EAAAjC,EAAA,MAAAyH;EAAAzH,EAAA,MAAA0H;CAAA,OAAAA,MAAA1H,EAAA;CAAA,OApCH0H;AAoCG;AAOP,SAAA+B,gBAAA1J,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAA2I;CAAA,IAAAhK;CAAA,IAAAC;CAAA,IAAAmB,EAAA,OAAAD,IAAA;EAAyB,CAAA,CAAAnB,OAAAC,SAAA,GAAA+J,SAAA7I;EAAwCC,EAAA,KAAAD;EAAAC,EAAA,KAAA4I;EAAA5I,EAAA,KAAApB;EAAAoB,EAAA,KAAAnB;CAAA,OAAA;EAAA+J,QAAA5I,EAAA;EAAApB,QAAAoB,EAAA;EAAAnB,UAAAmB,EAAA;CAAA;CAC/D,MAAAE,QAAc7K,SAAS;CACvB,MAAA8K,SAAetJ,SAASqJ,KAAK;CAC7B,MAAAwJ,SAAejX,IAAIiB,qBAAkC,KAAtCkB;CACf,MAAAqJ,aAAmBtL,MAAM;CACzB,MAAAwL,UAAgBxL,MAAM;CACtB,MAAA,CAAAmI,UAAA0D,eAAgC3L,SAA8B,IAAI;CAAC,IAAAwN;CAAA,IAAAL,EAAA,OAAApB,MAAAS,QAAA;EAC9BgB,KAAA;GAAAsJ,OAAS;GAACtK,QAAUT,MAAKS;EAAQ;EAACW,EAAA,KAAApB,MAAAS;EAAAW,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAvE,MAAA,CAAA4J,QAAAC,aAA4BhX,SAASwN,EAAkC;CAAC,IAAAO;CAAA,IAAAZ,EAAA,OAAApB,SAAAoB,EAAA,OAAAnB,SAAA;EAEtE+B,KAAA;GAAAhC;GAAAC;EAAiB;EAACmB,EAAA,KAAApB;EAAAoB,EAAA,KAAAnB;EAAAmB,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,IAAAiB;CAAA,IAAAjB,EAAA,OAAAyF,OAAAC,IAAA,2BAAA,GAAA;EAClBzE,KAAA,CAAC;EAACjB,EAAA,KAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAFJ,MAAA,EAAA8J,OAAAC,SAAAC,YAAAC,UAA8CnV,cAC5C8L,IACAK,EACF;CACA,MAAAyB,QAAc3N,cAAc6J,MAAKS,QAAS,MAAM2K,UAAU;CAC1D,MAAA5L,SAAepJ,cAAc0N,KAAK;CAClC,MAAAwH,QAAczW,uBAAiB;EAAA;EAAA,OAEtB,EAAA0W,SAAWzH,MAAK0H,IAAK,EAAE;CAAC,CAChC;CAID,IAAIR,OAAMvK,WAAYT,MAAKS,QACzBwK,UAAU;EAAAF,OACDC,OAAMD,SAAU/K,MAAKS,SAAL,IAAA;EAAqBA,QACpCT,MAAKS;CACf,CAAC;CAGH,IAAI,CAAC0K,SAAO,OACH;CAIN,MAAA/I,KAAArM;CAC4B,MAAAyM,KAAA;CACf,MAAAC,KAAA,GAAGpD,WAAU,GAAIE;CAEf,MAAAmD,KAAA1C,MAAKS,SAALyK,QAAA1P,KAAAA;CAIb,MAAA8G,KAAA9N;CACQ,MAAAmO,KAAAjM,cACL6K,OAAMjF,QACNxG,SAASO,OAAOyU,QAAQxJ,MAAKhJ,QAAQM,EAAG,CAAC,CAC3C;CAAC,IAAAgK;CAAA,IAAAxB,EAAA,QAAA8J,SAAA9J,EAAA,QAAA/B,cAAA+B,EAAA,QAAA7B,WAAA6B,EAAA,QAAA5B,UAAA4B,EAAA,QAAA4J,OAAAD,SAAA3J,EAAA,QAAA4I,SAAA5I,EAAA,QAAAxB,aAAA;EAGCgD,KAAA,8BAAC,cAAD;GAAa,GACPoH;GACQ3K;GACP,KAAA2L,OAAMD;GACFxL;GACDC;GACC0L,SAAAA;GACItL;EAAW,CAAA;EACxBwB,EAAA,MAAA8J;EAAA9J,EAAA,MAAA/B;EAAA+B,EAAA,MAAA7B;EAAA6B,EAAA,MAAA5B;EAAA4B,EAAA,MAAA4J,OAAAD;EAAA3J,EAAA,MAAA4I;EAAA5I,EAAA,MAAAxB;EAAAwB,EAAA,MAAAwB;CAAA,OAAAA,KAAAxB,EAAA;CAAA,IAAAyB;CAAA,IAAAzB,EAAA,QAAAiK,SAAAjK,EAAA,QAAAwB,IAAA;EATJC,KAAA,oBAAC,mBAAD;GAA0BwI,OAAAA;GACxBzI,UAAAA;EADgB,CAAA;EAUExB,EAAA,MAAAiK;EAAAjK,EAAA,MAAAwB;EAAAxB,EAAA,MAAAyB;CAAA,OAAAA,KAAAzB,EAAA;CAAA,IAAA0B;CAAA,IAAA1B,EAAA,QAAAkB,MAAAlB,EAAA,QAAAuB,MAAAvB,EAAA,QAAAyB,IAAA;EAhBtBC,MAAA,oBAAC,IAAD;GACS,OAAAH;GAKPE,UAAAA;EANG,CAAA;EAiBEzB,EAAA,MAAAkB;EAAAlB,EAAA,MAAAuB;EAAAvB,EAAA,MAAAyB;EAAAzB,EAAA,MAAA0B;CAAA,OAAAA,MAAA1B,EAAA;CAAA,IAAA2B;CAAA,IAAA3B,EAAA,QAAAgB,MAAAhB,EAAA,QAAA8J,SAAA9J,EAAA,QAAAlF,YAAAkF,EAAA,QAAAkK,SAAAlK,EAAA,QAAA0B,OAAA1B,EAAA,QAAAqB,MAAArB,EAAA,QAAAsB,IAAA;EAzBTK,MAAA,oBAAC,IAAD;GAC6B,2BAAAP;GACf,YAAAC;GACHyI,SAAAA;GACK,cAAAxI;GACP4I;GACApP,OAAAA;GAEP4G,UAAAA;EARU,CAAA;EA0BE1B,EAAA,MAAAgB;EAAAhB,EAAA,MAAA8J;EAAA9J,EAAA,MAAAlF;EAAAkF,EAAA,MAAAkK;EAAAlK,EAAA,MAAA0B;EAAA1B,EAAA,MAAAqB;EAAArB,EAAA,MAAAsB;EAAAtB,EAAA,MAAA2B;CAAA,OAAAA,MAAA3B,EAAA;CAAA,OA1Bd2B;AA0Bc;AAOlB,SAASpB,eAAe,EACtBrD,QACAC,WACAG,UACqD;CAKrD,MAAMgN,MAAMjX,QAAQkX,IAAI,CAAC,CACtBC,QAAQ,IAAI,CAAC,CACbC,SAAS,EAAE5N,GAAGC,QAAQ;EACrBI,OAAOL,GAAGC,CAAC;CACb,CAAC,CAAC,CACD4N,UAAU,EAAE7N,GAAGC,QAAQ;EACtBI,OAAOL,GAAGC,CAAC;CACb,CAAC,CAAC,CACD6N,YAAY;EACXxN,UAAU;CACZ,CAAC;CAEH,MAAMyN,MAAMvX,QAAQwX,IAAI,CAAC,CACtBC,YAAYtU,IAAI,CAAC,CACjBgU,QAAQ,IAAI,CAAC,CACbG,OAAO,EAAE9N,GAAGC,KAAKiO,YAAY;EAC5B,IAAIA,SAAS;GACX7N,OAAOL,GAAGC,CAAC;GACXK,UAAU;EACZ;CACF,CAAC;CAGH,OAAO9J,QAAQ2X,KACb1N,WAAWlD,KAAAA,IAAYkQ,MAAMA,IAAIW,WAAW,GAAG3N,OAAM,UAAW,GAChEA,WAAWlD,KAAAA,IAAYwQ,MAAMA,IAAIK,WAAW,GAAG3N,OAAM,UAAW,CAClE;AACF;;;;;AAMA,SAASgI,gBAAgBrI,QAAgBiB,WAAgC;CACvE,IAAIA,cAAc9D,KAAAA,GAChB,OAAO8D,cAAc;CAEvB,OACE,IAAI9L,cAAc6K,QAAQ,EAAE4D,MAAM,UAAU,CAAC,CAAC,CAACqK,gBAAgB,CAAC,CAAC7G,UACjE;AAEJ"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { OverlayAlign, OverlaySide } from "../../overlay/placement.js";
|
|
2
|
+
import "../../overlay/index.js";
|
|
3
|
+
import { HostInstance, StyleProp, ViewStyle } from "react-native";
|
|
4
|
+
import { ReactNode, Ref } from "react";
|
|
5
|
+
//#region src/components/tooltip/index.d.ts
|
|
6
|
+
/** Where the tooltip sits along the side it opens on. */
|
|
7
|
+
type TooltipAlign = OverlayAlign;
|
|
8
|
+
type TooltipProps = {
|
|
9
|
+
/**
|
|
10
|
+
* Where the tooltip sits along the side it opens on. On `top` and
|
|
11
|
+
* `bottom`, `start` and `end` follow a right-to-left layout.
|
|
12
|
+
* @default 'center'
|
|
13
|
+
*/
|
|
14
|
+
readonly align?: TooltipAlign;
|
|
15
|
+
/** Moves the tooltip along that side, in dp: right or down when positive. */
|
|
16
|
+
readonly alignOffset?: number;
|
|
17
|
+
/**
|
|
18
|
+
* The button the tooltip describes, and nothing else: a `Button`,
|
|
19
|
+
* `IconButton` or `Fab`, or a `Popover` or `Menu` whose trigger is one.
|
|
20
|
+
*/
|
|
21
|
+
readonly children?: ReactNode;
|
|
22
|
+
/**
|
|
23
|
+
* How long the tooltip stays once the pointer has left the trigger, or a
|
|
24
|
+
* held press has ended, in milliseconds.
|
|
25
|
+
* @default 500
|
|
26
|
+
*/
|
|
27
|
+
readonly closeDelay?: number;
|
|
28
|
+
/** Whether the tooltip starts open, when it keeps its own state. */
|
|
29
|
+
readonly defaultOpen?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* How long a pointer rests on the trigger, or a press is held on it,
|
|
32
|
+
* before the tooltip opens, in milliseconds.
|
|
33
|
+
* @default 1500
|
|
34
|
+
*/
|
|
35
|
+
readonly delay?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Keeps the tooltip from opening, and its label off the trigger's hint.
|
|
38
|
+
* @default false
|
|
39
|
+
*/
|
|
40
|
+
readonly isDisabled?: boolean;
|
|
41
|
+
/** Whether the tooltip is open, when the call site holds the state. */
|
|
42
|
+
readonly isOpen?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* What the tooltip says. Text, since it is also the trigger's
|
|
45
|
+
* accessibility hint, which a screen reader reads after its name.
|
|
46
|
+
*/
|
|
47
|
+
readonly label: string;
|
|
48
|
+
/** Called with the new state as the tooltip opens or closes. */
|
|
49
|
+
readonly onOpenChange?: (isOpen: boolean) => void;
|
|
50
|
+
readonly ref?: Ref<HostInstance>;
|
|
51
|
+
/**
|
|
52
|
+
* Whether a press of the trigger closes the tooltip.
|
|
53
|
+
* @default true
|
|
54
|
+
*/
|
|
55
|
+
readonly shouldCloseOnPress?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Which side of the trigger the tooltip opens on. It flips to the opposite
|
|
58
|
+
* side when there is no room.
|
|
59
|
+
* @default 'top'
|
|
60
|
+
*/
|
|
61
|
+
readonly side?: TooltipSide;
|
|
62
|
+
/**
|
|
63
|
+
* The gap between the trigger and the tooltip, in dp.
|
|
64
|
+
* @default spacing.sm
|
|
65
|
+
*/
|
|
66
|
+
readonly sideOffset?: number;
|
|
67
|
+
readonly style?: StyleProp<ViewStyle>;
|
|
68
|
+
readonly testID?: string;
|
|
69
|
+
/**
|
|
70
|
+
* `focus` leaves a pointer resting on the trigger out, so only a press
|
|
71
|
+
* held on it opens the tooltip.
|
|
72
|
+
*/
|
|
73
|
+
readonly trigger?: 'focus';
|
|
74
|
+
};
|
|
75
|
+
/** Which side of the trigger the tooltip opens on. */
|
|
76
|
+
type TooltipSide = OverlaySide;
|
|
77
|
+
/**
|
|
78
|
+
* A label for the button it wraps, the tooltips spec page's plain tooltip,
|
|
79
|
+
* shown while a press is held on the button or a pointer rests on it.
|
|
80
|
+
*
|
|
81
|
+
* ```tsx
|
|
82
|
+
* <Tooltip label="Search">
|
|
83
|
+
* <IconButton aria-label="Search">
|
|
84
|
+
* <SearchGlyph />
|
|
85
|
+
* </IconButton>
|
|
86
|
+
* </Tooltip>
|
|
87
|
+
* ```
|
|
88
|
+
*
|
|
89
|
+
* Pass `isOpen` with `onOpenChange` to hold the open state, or `defaultOpen`
|
|
90
|
+
* to let it keep its own, and `delay` and `closeDelay` for how long it waits
|
|
91
|
+
* before it opens and closes. What it says has to repeat what the button
|
|
92
|
+
* already means, since a screen reader hears it as the button's hint and
|
|
93
|
+
* touch only shows it to someone who holds a press: anything with a button
|
|
94
|
+
* in it, or worth reading twice, is a `Popover`.
|
|
95
|
+
*
|
|
96
|
+
* `style`, `ref` and `testID` land on the tooltip itself.
|
|
97
|
+
*/
|
|
98
|
+
declare function Tooltip({ align, alignOffset, children, closeDelay, defaultOpen, delay, isDisabled, isOpen, label, onOpenChange, ref, shouldCloseOnPress, side, sideOffset, style, testID, trigger }: TooltipProps): import("react").JSX.Element;
|
|
99
|
+
//#endregion
|
|
100
|
+
export { Tooltip, type TooltipAlign, type TooltipProps, type TooltipSide };
|
|
101
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { useTheme } from "../../theme/scope.js";
|
|
2
|
+
import { composeStyles, themedStyles } from "../../theme/styles.js";
|
|
3
|
+
import { useTypeRole } from "../../typography/roles.js";
|
|
4
|
+
import { ButtonTooltipContext } from "../../button/slots.js";
|
|
5
|
+
import { PANEL_ORIGINS, usePanelMotion } from "../../overlay/panel.js";
|
|
6
|
+
import { Overlay } from "../../overlay/host.js";
|
|
7
|
+
import { useAnchoredPlacement } from "../../overlay/anchored.js";
|
|
8
|
+
import { c } from "react/compiler-runtime";
|
|
9
|
+
import { StyleSheet, Text } from "react-native";
|
|
10
|
+
import Animated from "react-native-reanimated";
|
|
11
|
+
import { useRef, useState } from "react";
|
|
12
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
13
|
+
import { useTooltipTriggerState } from "react-stately/useTooltipTriggerState";
|
|
14
|
+
//#region src/components/tooltip/index.tsx
|
|
15
|
+
const DEFAULT_DELAY = 1500;
|
|
16
|
+
const DEFAULT_CLOSE_DELAY = 500;
|
|
17
|
+
const MAX_WIDTH = 320;
|
|
18
|
+
const stylesOf = themedStyles(({ colors, radii, spacing }) => StyleSheet.create({
|
|
19
|
+
label: { color: colors.inverseOnSurface },
|
|
20
|
+
surface: {
|
|
21
|
+
backgroundColor: colors.inverseSurface,
|
|
22
|
+
borderRadius: radii.xs,
|
|
23
|
+
maxWidth: MAX_WIDTH,
|
|
24
|
+
paddingHorizontal: spacing.sm,
|
|
25
|
+
paddingVertical: spacing.xs,
|
|
26
|
+
pointerEvents: "none"
|
|
27
|
+
}
|
|
28
|
+
}));
|
|
29
|
+
/**
|
|
30
|
+
* A label for the button it wraps, the tooltips spec page's plain tooltip,
|
|
31
|
+
* shown while a press is held on the button or a pointer rests on it.
|
|
32
|
+
*
|
|
33
|
+
* ```tsx
|
|
34
|
+
* <Tooltip label="Search">
|
|
35
|
+
* <IconButton aria-label="Search">
|
|
36
|
+
* <SearchGlyph />
|
|
37
|
+
* </IconButton>
|
|
38
|
+
* </Tooltip>
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* Pass `isOpen` with `onOpenChange` to hold the open state, or `defaultOpen`
|
|
42
|
+
* to let it keep its own, and `delay` and `closeDelay` for how long it waits
|
|
43
|
+
* before it opens and closes. What it says has to repeat what the button
|
|
44
|
+
* already means, since a screen reader hears it as the button's hint and
|
|
45
|
+
* touch only shows it to someone who holds a press: anything with a button
|
|
46
|
+
* in it, or worth reading twice, is a `Popover`.
|
|
47
|
+
*
|
|
48
|
+
* `style`, `ref` and `testID` land on the tooltip itself.
|
|
49
|
+
*/
|
|
50
|
+
function Tooltip(t0) {
|
|
51
|
+
const $ = c(30);
|
|
52
|
+
const { align: t1, alignOffset, children, closeDelay: t2, defaultOpen, delay: t3, isDisabled: t4, isOpen, label, onOpenChange, ref, shouldCloseOnPress: t5, side: t6, sideOffset, style, testID, trigger } = t0;
|
|
53
|
+
const align = t1 === void 0 ? "center" : t1;
|
|
54
|
+
const closeDelay = t2 === void 0 ? DEFAULT_CLOSE_DELAY : t2;
|
|
55
|
+
const delay = t3 === void 0 ? DEFAULT_DELAY : t3;
|
|
56
|
+
const isDisabled = t4 === void 0 ? false : t4;
|
|
57
|
+
const shouldCloseOnPress = t5 === void 0 ? true : t5;
|
|
58
|
+
const side = t6 === void 0 ? "top" : t6;
|
|
59
|
+
let t7;
|
|
60
|
+
if ($[0] !== closeDelay || $[1] !== defaultOpen || $[2] !== delay || $[3] !== isOpen || $[4] !== onOpenChange) {
|
|
61
|
+
t7 = {
|
|
62
|
+
closeDelay,
|
|
63
|
+
defaultOpen,
|
|
64
|
+
delay,
|
|
65
|
+
isOpen,
|
|
66
|
+
onOpenChange
|
|
67
|
+
};
|
|
68
|
+
$[0] = closeDelay;
|
|
69
|
+
$[1] = defaultOpen;
|
|
70
|
+
$[2] = delay;
|
|
71
|
+
$[3] = isOpen;
|
|
72
|
+
$[4] = onOpenChange;
|
|
73
|
+
$[5] = t7;
|
|
74
|
+
} else t7 = $[5];
|
|
75
|
+
const state = useTooltipTriggerState(t7);
|
|
76
|
+
const anchor = useRef(null);
|
|
77
|
+
const hovered = useRef(false);
|
|
78
|
+
const [present, setPresent] = useState(state.isOpen);
|
|
79
|
+
const pointer = trigger !== "focus";
|
|
80
|
+
let t8;
|
|
81
|
+
if ($[6] !== delay || $[7] !== isDisabled || $[8] !== label || $[9] !== pointer || $[10] !== shouldCloseOnPress || $[11] !== state) {
|
|
82
|
+
t8 = isDisabled ? null : {
|
|
83
|
+
delayLongPress: delay,
|
|
84
|
+
hint: label,
|
|
85
|
+
onHoverIn: pointer ? () => {
|
|
86
|
+
hovered.current = true;
|
|
87
|
+
state.open(false);
|
|
88
|
+
} : void 0,
|
|
89
|
+
onHoverOut: pointer ? () => {
|
|
90
|
+
hovered.current = false;
|
|
91
|
+
state.close(false);
|
|
92
|
+
} : void 0,
|
|
93
|
+
onLongPress: () => {
|
|
94
|
+
state.open(true);
|
|
95
|
+
},
|
|
96
|
+
onPressIn: shouldCloseOnPress ? () => {
|
|
97
|
+
state.close(true);
|
|
98
|
+
} : void 0,
|
|
99
|
+
onPressOut: () => {
|
|
100
|
+
if (!hovered.current) state.close(false);
|
|
101
|
+
},
|
|
102
|
+
ref: anchor
|
|
103
|
+
};
|
|
104
|
+
$[6] = delay;
|
|
105
|
+
$[7] = isDisabled;
|
|
106
|
+
$[8] = label;
|
|
107
|
+
$[9] = pointer;
|
|
108
|
+
$[10] = shouldCloseOnPress;
|
|
109
|
+
$[11] = state;
|
|
110
|
+
$[12] = t8;
|
|
111
|
+
} else t8 = $[12];
|
|
112
|
+
const described = t8;
|
|
113
|
+
if (state.isOpen && !present) setPresent(true);
|
|
114
|
+
let t9;
|
|
115
|
+
if ($[13] !== children || $[14] !== described) {
|
|
116
|
+
t9 = /* @__PURE__ */ jsx(ButtonTooltipContext, {
|
|
117
|
+
value: described,
|
|
118
|
+
children
|
|
119
|
+
});
|
|
120
|
+
$[13] = children;
|
|
121
|
+
$[14] = described;
|
|
122
|
+
$[15] = t9;
|
|
123
|
+
} else t9 = $[15];
|
|
124
|
+
let t10;
|
|
125
|
+
if ($[16] !== align || $[17] !== alignOffset || $[18] !== label || $[19] !== present || $[20] !== ref || $[21] !== side || $[22] !== sideOffset || $[23] !== state.isOpen || $[24] !== style || $[25] !== testID) {
|
|
126
|
+
t10 = present ? /* @__PURE__ */ jsx(Overlay, { children: /* @__PURE__ */ jsx(TooltipSurface, {
|
|
127
|
+
align,
|
|
128
|
+
alignOffset,
|
|
129
|
+
anchor,
|
|
130
|
+
isOpen: state.isOpen,
|
|
131
|
+
label,
|
|
132
|
+
ref,
|
|
133
|
+
setPresent,
|
|
134
|
+
side,
|
|
135
|
+
sideOffset,
|
|
136
|
+
style,
|
|
137
|
+
testID
|
|
138
|
+
}) }) : null;
|
|
139
|
+
$[16] = align;
|
|
140
|
+
$[17] = alignOffset;
|
|
141
|
+
$[18] = label;
|
|
142
|
+
$[19] = present;
|
|
143
|
+
$[20] = ref;
|
|
144
|
+
$[21] = side;
|
|
145
|
+
$[22] = sideOffset;
|
|
146
|
+
$[23] = state.isOpen;
|
|
147
|
+
$[24] = style;
|
|
148
|
+
$[25] = testID;
|
|
149
|
+
$[26] = t10;
|
|
150
|
+
} else t10 = $[26];
|
|
151
|
+
let t11;
|
|
152
|
+
if ($[27] !== t10 || $[28] !== t9) {
|
|
153
|
+
t11 = /* @__PURE__ */ jsxs(Fragment$1, { children: [t9, t10] });
|
|
154
|
+
$[27] = t10;
|
|
155
|
+
$[28] = t9;
|
|
156
|
+
$[29] = t11;
|
|
157
|
+
} else t11 = $[29];
|
|
158
|
+
return t11;
|
|
159
|
+
}
|
|
160
|
+
function TooltipSurface(t0) {
|
|
161
|
+
const $ = c(17);
|
|
162
|
+
const { align, alignOffset, anchor, isOpen, label, ref, setPresent, side, sideOffset, style, testID } = t0;
|
|
163
|
+
const styles = stylesOf(useTheme());
|
|
164
|
+
const role = useTypeRole("bodySmall");
|
|
165
|
+
let t1;
|
|
166
|
+
if ($[0] !== align || $[1] !== alignOffset || $[2] !== anchor || $[3] !== side || $[4] !== sideOffset) {
|
|
167
|
+
t1 = {
|
|
168
|
+
align,
|
|
169
|
+
alignOffset,
|
|
170
|
+
anchor,
|
|
171
|
+
side,
|
|
172
|
+
sideOffset
|
|
173
|
+
};
|
|
174
|
+
$[0] = align;
|
|
175
|
+
$[1] = alignOffset;
|
|
176
|
+
$[2] = anchor;
|
|
177
|
+
$[3] = side;
|
|
178
|
+
$[4] = sideOffset;
|
|
179
|
+
$[5] = t1;
|
|
180
|
+
} else t1 = $[5];
|
|
181
|
+
const placement = useAnchoredPlacement(t1);
|
|
182
|
+
const motion = usePanelMotion(isOpen, placement.placed, setPresent);
|
|
183
|
+
const t2 = Animated;
|
|
184
|
+
const t3 = true;
|
|
185
|
+
const t4 = placement.onLayout;
|
|
186
|
+
const t5 = composeStyles(styles.surface, placement.style, { transformOrigin: PANEL_ORIGINS[placement.side] }, motion, style);
|
|
187
|
+
const T0 = Text;
|
|
188
|
+
const t6 = composeStyles(role, styles.label);
|
|
189
|
+
let t7;
|
|
190
|
+
if ($[6] !== T0 || $[7] !== label || $[8] !== t6) {
|
|
191
|
+
t7 = /* @__PURE__ */ jsx(T0, {
|
|
192
|
+
style: t6,
|
|
193
|
+
children: label
|
|
194
|
+
});
|
|
195
|
+
$[6] = T0;
|
|
196
|
+
$[7] = label;
|
|
197
|
+
$[8] = t6;
|
|
198
|
+
$[9] = t7;
|
|
199
|
+
} else t7 = $[9];
|
|
200
|
+
let t8;
|
|
201
|
+
if ($[10] !== placement.onLayout || $[11] !== ref || $[12] !== t2.View || $[13] !== t5 || $[14] !== t7 || $[15] !== testID) {
|
|
202
|
+
t8 = /* @__PURE__ */ jsx(t2.View, {
|
|
203
|
+
"aria-hidden": t3,
|
|
204
|
+
onLayout: t4,
|
|
205
|
+
ref,
|
|
206
|
+
style: t5,
|
|
207
|
+
testID,
|
|
208
|
+
children: t7
|
|
209
|
+
});
|
|
210
|
+
$[10] = placement.onLayout;
|
|
211
|
+
$[11] = ref;
|
|
212
|
+
$[12] = t2.View;
|
|
213
|
+
$[13] = t5;
|
|
214
|
+
$[14] = t7;
|
|
215
|
+
$[15] = testID;
|
|
216
|
+
$[16] = t8;
|
|
217
|
+
} else t8 = $[16];
|
|
218
|
+
return t8;
|
|
219
|
+
}
|
|
220
|
+
//#endregion
|
|
221
|
+
export { Tooltip };
|
|
222
|
+
|
|
223
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["ReactNode","Ref","RefObject","HostInstance","StyleProp","TextStyle","ViewStyle","AnimatedStyle","useMemo","useRef","useState","Text","NativeText","StyleSheet","Animated","useTooltipTriggerState","ButtonTooltip","OverlayAlign","OverlaySide","ResolvedTheme","ButtonTooltipContext","Overlay","useAnchoredPlacement","PANEL_ORIGINS","usePanelMotion","useTheme","composeStyles","themedStyles","useTypeRole","DEFAULT_DELAY","DEFAULT_CLOSE_DELAY","MAX_WIDTH","stylesOf","colors","radii","spacing","create","label","color","inverseOnSurface","surface","backgroundColor","inverseSurface","borderRadius","xs","maxWidth","paddingHorizontal","sm","paddingVertical","pointerEvents","SurfaceProps","Pick","TooltipProps","anchor","isOpen","setPresent","present","testID","TooltipAlign","align","alignOffset","children","closeDelay","defaultOpen","delay","isDisabled","onOpenChange","ref","shouldCloseOnPress","side","TooltipSide","sideOffset","style","trigger","Tooltip","t0","$","_c","t1","t2","t3","t4","t5","t6","undefined","t7","state","hovered","pointer","t8","delayLongPress","hint","onHoverIn","current","open","onHoverOut","close","onLongPress","onPressIn","onPressOut","described","t9","t10","t11","TooltipSurface","styles","role","placement","motion","placed","onLayout","transformOrigin","T0","View","_c","NativeText"],"sources":["../../../src/components/tooltip/index.tsx"],"sourcesContent":["import type { ReactNode, Ref, RefObject } from 'react'\nimport type {\n HostInstance,\n StyleProp,\n TextStyle,\n ViewStyle,\n} from 'react-native'\nimport type { AnimatedStyle } from 'react-native-reanimated'\n\nimport { useMemo, useRef, useState } from 'react'\nimport { Text as NativeText, StyleSheet } from 'react-native'\nimport Animated from 'react-native-reanimated'\nimport { useTooltipTriggerState } from 'react-stately/useTooltipTriggerState'\n\nimport type { ButtonTooltip } from '../../button/slots'\nimport type { OverlayAlign, OverlaySide } from '../../overlay'\nimport type { ResolvedTheme } from '../../theme/scope'\n\nimport { ButtonTooltipContext } from '../../button/slots'\nimport { Overlay, useAnchoredPlacement } from '../../overlay'\nimport { PANEL_ORIGINS, usePanelMotion } from '../../overlay/panel'\nimport { useTheme } from '../../theme/scope'\nimport { composeStyles, themedStyles } from '../../theme/styles'\nimport { useTypeRole } from '../../typography/roles'\n\n// kanso-ui's Tooltip, the tooltips page's plain tooltip: a container on\n// inverse surface with 8dp of padding at the ends and 4dp above and below,\n// holding a line of supporting text in body small on inverse on surface, so\n// one line is the page's 24dp. The page names a shape token without giving\n// its value, so it takes the extra-small corner, as web's does, and it lies\n// flat: the plain tooltip's tokens give no elevation. A long label wraps at\n// 320dp rather than running the width of the window.\n//\n// **It is placed by src/overlay's anchored placement**, in the overlay host\n// above the screen: on `side`, `top` unless told otherwise, lined up by\n// `align`, flipped to the opposite side at the edge of the window and kept\n// inside the safe area. It grows and fades in and out from the edge facing\n// the trigger as every anchored panel does, through src/overlay's panel\n// motion. It takes no press and draws no layer under it, so the screen stays\n// usable while it shows.\n//\n// **Touch has no hover, so a press held on the trigger for `delay` opens it**,\n// as Android's own tooltips open on a long press, and the press then ends\n// without pressing the trigger. A pointer resting on the trigger for `delay`\n// opens it as well, an iPad's or an Android mouse's. It closes `closeDelay`\n// after the pointer leaves, or after a held press ends while no pointer is on\n// the trigger, and at once on a press of the trigger unless\n// `shouldCloseOnPress` is off. `trigger=\"focus\"` leaves the pointer out, so\n// only the held press opens it. The state is React Stately's, the one web's\n// React Aria keeps, so once one tooltip has shown, the next a pointer rests on\n// opens at once, and only one shows at a time.\n//\n// **A screen reader never reaches the surface.** The label is the trigger's\n// accessibility hint instead, read after its name, which is what web's\n// `aria-describedby` gives a reader, and why the label is text.\n//\n// **The trigger is a Button, an IconButton or a FAB placed directly inside\n// it**, which takes the tooltip through src/button's slots.ts, as a\n// popover's trigger takes the popover. A tooltip and a popover or menu can\n// wrap the same button in either order.\n\n// How long a pointer rests on the trigger, or a press is held on it, before\n// the tooltip opens, and how long it stays once the pointer or the press has\n// gone, React Aria's own defaults, which web's takes.\nconst DEFAULT_DELAY = 1500\nconst DEFAULT_CLOSE_DELAY = 500\n\n// The widest it draws, web's cap.\nconst MAX_WIDTH = 320\n\nconst stylesOf = themedStyles(({ colors, radii, spacing }: ResolvedTheme) =>\n StyleSheet.create({\n label: {\n color: colors.inverseOnSurface,\n },\n surface: {\n backgroundColor: colors.inverseSurface,\n borderRadius: radii.xs,\n maxWidth: MAX_WIDTH,\n paddingHorizontal: spacing.sm,\n paddingVertical: spacing.xs,\n pointerEvents: 'none',\n },\n }),\n)\n\ntype SurfaceProps = Pick<\n TooltipProps,\n 'align' | 'alignOffset' | 'label' | 'ref' | 'side' | 'sideOffset' | 'style'\n> & {\n readonly anchor: RefObject<HostInstance | null>\n readonly isOpen: boolean\n readonly setPresent: (present: boolean) => void\n readonly testID: string | undefined\n}\n\n/** Where the tooltip sits along the side it opens on. */\ntype TooltipAlign = OverlayAlign\n\ntype TooltipProps = {\n /**\n * Where the tooltip sits along the side it opens on. On `top` and\n * `bottom`, `start` and `end` follow a right-to-left layout.\n * @default 'center'\n */\n readonly align?: TooltipAlign\n /** Moves the tooltip along that side, in dp: right or down when positive. */\n readonly alignOffset?: number\n /**\n * The button the tooltip describes, and nothing else: a `Button`,\n * `IconButton` or `Fab`, or a `Popover` or `Menu` whose trigger is one.\n */\n readonly children?: ReactNode\n /**\n * How long the tooltip stays once the pointer has left the trigger, or a\n * held press has ended, in milliseconds.\n * @default 500\n */\n readonly closeDelay?: number\n /** Whether the tooltip starts open, when it keeps its own state. */\n readonly defaultOpen?: boolean\n /**\n * How long a pointer rests on the trigger, or a press is held on it,\n * before the tooltip opens, in milliseconds.\n * @default 1500\n */\n readonly delay?: number\n /**\n * Keeps the tooltip from opening, and its label off the trigger's hint.\n * @default false\n */\n readonly isDisabled?: boolean\n /** Whether the tooltip is open, when the call site holds the state. */\n readonly isOpen?: boolean\n /**\n * What the tooltip says. Text, since it is also the trigger's\n * accessibility hint, which a screen reader reads after its name.\n */\n readonly label: string\n /** Called with the new state as the tooltip opens or closes. */\n readonly onOpenChange?: (isOpen: boolean) => void\n readonly ref?: Ref<HostInstance>\n /**\n * Whether a press of the trigger closes the tooltip.\n * @default true\n */\n readonly shouldCloseOnPress?: boolean\n /**\n * Which side of the trigger the tooltip opens on. It flips to the opposite\n * side when there is no room.\n * @default 'top'\n */\n readonly side?: TooltipSide\n /**\n * The gap between the trigger and the tooltip, in dp.\n * @default spacing.sm\n */\n readonly sideOffset?: number\n readonly style?: StyleProp<ViewStyle>\n readonly testID?: string\n /**\n * `focus` leaves a pointer resting on the trigger out, so only a press\n * held on it opens the tooltip.\n */\n readonly trigger?: 'focus'\n}\n\n/** Which side of the trigger the tooltip opens on. */\ntype TooltipSide = OverlaySide\n\n/**\n * A label for the button it wraps, the tooltips spec page's plain tooltip,\n * shown while a press is held on the button or a pointer rests on it.\n *\n * ```tsx\n * <Tooltip label=\"Search\">\n * <IconButton aria-label=\"Search\">\n * <SearchGlyph />\n * </IconButton>\n * </Tooltip>\n * ```\n *\n * Pass `isOpen` with `onOpenChange` to hold the open state, or `defaultOpen`\n * to let it keep its own, and `delay` and `closeDelay` for how long it waits\n * before it opens and closes. What it says has to repeat what the button\n * already means, since a screen reader hears it as the button's hint and\n * touch only shows it to someone who holds a press: anything with a button\n * in it, or worth reading twice, is a `Popover`.\n *\n * `style`, `ref` and `testID` land on the tooltip itself.\n */\nfunction Tooltip({\n align = 'center',\n alignOffset,\n children,\n closeDelay = DEFAULT_CLOSE_DELAY,\n defaultOpen,\n delay = DEFAULT_DELAY,\n isDisabled = false,\n isOpen,\n label,\n onOpenChange,\n ref,\n shouldCloseOnPress = true,\n side = 'top',\n sideOffset,\n style,\n testID,\n trigger,\n}: TooltipProps) {\n const state = useTooltipTriggerState({\n closeDelay,\n defaultOpen,\n delay,\n isOpen,\n onOpenChange,\n })\n const anchor = useRef<HostInstance>(null)\n const hovered = useRef(false)\n const [present, setPresent] = useState(state.isOpen)\n const pointer = trigger !== 'focus'\n // What the trigger takes on: the pointer resting on it and leaving it, the\n // held press that opens the tooltip, and a press that closes it, at once as\n // it starts and after `closeDelay` as a held one ends, unless a pointer\n // still rests on the trigger, which keeps it until the pointer leaves.\n const described = useMemo<ButtonTooltip | null>(\n () =>\n isDisabled\n ? null\n : {\n delayLongPress: delay,\n hint: label,\n onHoverIn: pointer\n ? () => {\n hovered.current = true\n state.open(false)\n }\n : undefined,\n onHoverOut: pointer\n ? () => {\n hovered.current = false\n state.close(false)\n }\n : undefined,\n onLongPress: () => {\n state.open(true)\n },\n onPressIn: shouldCloseOnPress\n ? () => {\n state.close(true)\n }\n : undefined,\n onPressOut: () => {\n if (!hovered.current) {\n state.close(false)\n }\n },\n ref: anchor,\n },\n [delay, isDisabled, label, pointer, shouldCloseOnPress, state],\n )\n\n // Mounted the moment it opens, and kept until its exit has run.\n if (state.isOpen && !present) {\n setPresent(true)\n }\n\n return (\n <>\n <ButtonTooltipContext value={described}>{children}</ButtonTooltipContext>\n {present ? (\n <Overlay>\n <TooltipSurface\n align={align}\n alignOffset={alignOffset}\n anchor={anchor}\n isOpen={state.isOpen}\n label={label}\n ref={ref}\n setPresent={setPresent}\n side={side}\n sideOffset={sideOffset}\n style={style}\n testID={testID}\n />\n </Overlay>\n ) : null}\n </>\n )\n}\n\n// The tooltip itself, drawn in the overlay host and placed beside the\n// trigger once it has reported its size.\nfunction TooltipSurface({\n align,\n alignOffset,\n anchor,\n isOpen,\n label,\n ref,\n setPresent,\n side,\n sideOffset,\n style,\n testID,\n}: SurfaceProps) {\n const styles = stylesOf(useTheme())\n const role = useTypeRole('bodySmall')\n const placement = useAnchoredPlacement({\n align,\n alignOffset,\n anchor,\n side,\n sideOffset,\n })\n const motion = usePanelMotion(isOpen, placement.placed, setPresent)\n\n return (\n <Animated.View\n aria-hidden\n onLayout={placement.onLayout}\n ref={ref}\n style={composeStyles<AnimatedStyle<ViewStyle>>(\n styles.surface,\n placement.style,\n { transformOrigin: PANEL_ORIGINS[placement.side] },\n motion,\n style,\n )}\n testID={testID}\n >\n <NativeText style={composeStyles<TextStyle>(role, styles.label)}>\n {label}\n </NativeText>\n </Animated.View>\n )\n}\n\nexport { Tooltip }\nexport type { TooltipAlign, TooltipProps, TooltipSide }\n"],"mappings":"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"}
|