@kanso-labs/react-native-kanso-ui 0.8.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.
Files changed (253) hide show
  1. package/README.md +4 -3
  2. package/dist/autocomplete/index.js +15 -1
  3. package/dist/autocomplete/index.js.map +1 -1
  4. package/dist/badge/index.js +9 -70
  5. package/dist/badge/index.js.map +1 -1
  6. package/dist/button/group.d.ts +5 -0
  7. package/dist/button/group.js +115 -0
  8. package/dist/button/group.js.map +1 -0
  9. package/dist/button/index.d.ts +4 -1
  10. package/dist/button/index.js +45 -23
  11. package/dist/button/index.js.map +1 -1
  12. package/dist/button/palettes.d.ts +2 -0
  13. package/dist/button/slots.js +2 -1
  14. package/dist/button/slots.js.map +1 -1
  15. package/dist/calendar/index.js +351 -182
  16. package/dist/calendar/index.js.map +1 -1
  17. package/dist/calendar/styles.js +33 -2
  18. package/dist/calendar/styles.js.map +1 -1
  19. package/dist/carousel/arrangement.d.ts +5 -0
  20. package/dist/carousel/arrangement.js +123 -0
  21. package/dist/carousel/arrangement.js.map +1 -0
  22. package/dist/chequer/index.js +95 -0
  23. package/dist/chequer/index.js.map +1 -0
  24. package/dist/collection/index.d.ts +157 -0
  25. package/dist/collection/index.js +1331 -0
  26. package/dist/collection/index.js.map +1 -0
  27. package/dist/color-thumb/index.js +56 -0
  28. package/dist/color-thumb/index.js.map +1 -0
  29. package/dist/components/badge/index.d.ts +48 -0
  30. package/dist/components/badge/index.js +122 -0
  31. package/dist/components/badge/index.js.map +1 -0
  32. package/dist/{badge → components/badge}/styles.js +10 -6
  33. package/dist/components/badge/styles.js.map +1 -0
  34. package/dist/components/breadcrumbs/index.d.ts +66 -0
  35. package/dist/components/breadcrumbs/index.js +285 -0
  36. package/dist/components/breadcrumbs/index.js.map +1 -0
  37. package/dist/components/button/index.d.ts +4 -2
  38. package/dist/components/button/index.js +227 -188
  39. package/dist/components/button/index.js.map +1 -1
  40. package/dist/components/button-group/index.d.ts +87 -0
  41. package/dist/components/button-group/index.js +275 -0
  42. package/dist/components/button-group/index.js.map +1 -0
  43. package/dist/components/calendar/index.d.ts +11 -3
  44. package/dist/components/calendar/index.js +60 -45
  45. package/dist/components/calendar/index.js.map +1 -1
  46. package/dist/components/carousel/index.d.ts +72 -0
  47. package/dist/components/carousel/index.js +496 -0
  48. package/dist/components/carousel/index.js.map +1 -0
  49. package/dist/components/checkbox/index.d.ts +7 -1
  50. package/dist/components/checkbox/index.js +183 -138
  51. package/dist/components/checkbox/index.js.map +1 -1
  52. package/dist/components/checkbox-group/index.d.ts +92 -0
  53. package/dist/components/checkbox-group/index.js +306 -0
  54. package/dist/components/checkbox-group/index.js.map +1 -0
  55. package/dist/components/code/index.d.ts +25 -0
  56. package/dist/components/code/index.js +87 -0
  57. package/dist/components/code/index.js.map +1 -0
  58. package/dist/components/color-area/index.d.ts +85 -0
  59. package/dist/components/color-area/index.js +630 -0
  60. package/dist/components/color-area/index.js.map +1 -0
  61. package/dist/components/color-field/index.d.ts +144 -0
  62. package/dist/components/color-field/index.js +516 -0
  63. package/dist/components/color-field/index.js.map +1 -0
  64. package/dist/components/color-picker/index.d.ts +74 -0
  65. package/dist/components/color-picker/index.js +317 -0
  66. package/dist/components/color-picker/index.js.map +1 -0
  67. package/dist/components/color-slider/index.d.ts +82 -0
  68. package/dist/components/color-slider/index.js +456 -0
  69. package/dist/components/color-slider/index.js.map +1 -0
  70. package/dist/components/color-swatch/index.d.ts +46 -0
  71. package/dist/components/color-swatch/index.js +127 -0
  72. package/dist/components/color-swatch/index.js.map +1 -0
  73. package/dist/components/color-swatch-picker/index.d.ts +81 -0
  74. package/dist/components/color-swatch-picker/index.js +287 -0
  75. package/dist/components/color-swatch-picker/index.js.map +1 -0
  76. package/dist/components/color-wheel/index.d.ts +71 -0
  77. package/dist/components/color-wheel/index.js +407 -0
  78. package/dist/components/color-wheel/index.js.map +1 -0
  79. package/dist/components/combo-box/index.d.ts +193 -0
  80. package/dist/components/combo-box/index.js +616 -0
  81. package/dist/components/combo-box/index.js.map +1 -0
  82. package/dist/components/container/index.d.ts +47 -0
  83. package/dist/components/container/index.js +85 -0
  84. package/dist/components/container/index.js.map +1 -0
  85. package/dist/components/date-field/index.d.ts +120 -0
  86. package/dist/components/date-field/index.js +111 -0
  87. package/dist/components/date-field/index.js.map +1 -0
  88. package/dist/components/date-picker/index.d.ts +130 -0
  89. package/dist/components/date-picker/index.js +310 -0
  90. package/dist/components/date-picker/index.js.map +1 -0
  91. package/dist/components/date-range-picker/index.d.ts +139 -0
  92. package/dist/components/date-range-picker/index.js +421 -0
  93. package/dist/components/date-range-picker/index.js.map +1 -0
  94. package/dist/components/disclosure/index.d.ts +94 -0
  95. package/dist/components/disclosure/index.js +365 -0
  96. package/dist/components/disclosure/index.js.map +1 -0
  97. package/dist/components/disclosure-group/index.d.ts +61 -0
  98. package/dist/components/disclosure-group/index.js +100 -0
  99. package/dist/components/disclosure-group/index.js.map +1 -0
  100. package/dist/components/drop-zone/index.d.ts +113 -0
  101. package/dist/components/drop-zone/index.js +304 -0
  102. package/dist/components/drop-zone/index.js.map +1 -0
  103. package/dist/components/fab/index.d.ts +80 -0
  104. package/dist/components/fab/index.js +246 -0
  105. package/dist/components/fab/index.js.map +1 -0
  106. package/dist/components/fab-menu/index.d.ts +120 -0
  107. package/dist/components/fab-menu/index.js +640 -0
  108. package/dist/components/fab-menu/index.js.map +1 -0
  109. package/dist/components/feed/index.d.ts +57 -0
  110. package/dist/components/feed/index.js +167 -0
  111. package/dist/components/feed/index.js.map +1 -0
  112. package/dist/components/form/index.d.ts +3 -2
  113. package/dist/components/form/index.js.map +1 -1
  114. package/dist/components/icon-button/index.d.ts +4 -2
  115. package/dist/components/icon-button/index.js +204 -171
  116. package/dist/components/icon-button/index.js.map +1 -1
  117. package/dist/components/keycap/index.d.ts +27 -0
  118. package/dist/components/keycap/index.js +136 -0
  119. package/dist/components/keycap/index.js.map +1 -0
  120. package/dist/components/list/index.d.ts +15 -158
  121. package/dist/components/list/index.js +21 -1047
  122. package/dist/components/list/index.js.map +1 -1
  123. package/dist/components/list-box/index.d.ts +73 -0
  124. package/dist/components/list-box/index.js +82 -0
  125. package/dist/components/list-box/index.js.map +1 -0
  126. package/dist/components/loading-indicator/index.d.ts +32 -0
  127. package/dist/components/loading-indicator/index.js +174 -0
  128. package/dist/components/loading-indicator/index.js.map +1 -0
  129. package/dist/components/menu/index.js +1 -1
  130. package/dist/components/navigation-tree/index.d.ts +117 -0
  131. package/dist/components/navigation-tree/index.js +135 -0
  132. package/dist/components/navigation-tree/index.js.map +1 -0
  133. package/dist/components/number-field/index.js +132 -143
  134. package/dist/components/number-field/index.js.map +1 -1
  135. package/dist/components/range-calendar/index.d.ts +69 -0
  136. package/dist/components/range-calendar/index.js +144 -0
  137. package/dist/components/range-calendar/index.js.map +1 -0
  138. package/dist/components/search-view/index.d.ts +78 -0
  139. package/dist/components/search-view/index.js +570 -0
  140. package/dist/components/search-view/index.js.map +1 -0
  141. package/dist/components/select/index.d.ts +152 -0
  142. package/dist/components/select/index.js +419 -0
  143. package/dist/components/select/index.js.map +1 -0
  144. package/dist/components/separator/index.d.ts +3 -2
  145. package/dist/components/separator/index.js +29 -26
  146. package/dist/components/separator/index.js.map +1 -1
  147. package/dist/components/slider/index.d.ts +111 -0
  148. package/dist/components/slider/index.js +673 -0
  149. package/dist/components/slider/index.js.map +1 -0
  150. package/dist/components/split-button/index.d.ts +77 -0
  151. package/dist/components/split-button/index.js +354 -0
  152. package/dist/components/split-button/index.js.map +1 -0
  153. package/dist/components/supporting-pane/index.d.ts +44 -0
  154. package/dist/components/supporting-pane/index.js +109 -0
  155. package/dist/components/supporting-pane/index.js.map +1 -0
  156. package/dist/components/tabs/index.d.ts +196 -0
  157. package/dist/components/tabs/index.js +1137 -0
  158. package/dist/components/tabs/index.js.map +1 -0
  159. package/dist/components/text/index.d.ts +1 -1
  160. package/dist/components/text/index.js +49 -21
  161. package/dist/components/text/index.js.map +1 -1
  162. package/dist/components/text-area/index.d.ts +145 -0
  163. package/dist/components/text-area/index.js +231 -0
  164. package/dist/components/text-area/index.js.map +1 -0
  165. package/dist/components/time-field/index.d.ts +43 -0
  166. package/dist/components/time-field/index.js +107 -0
  167. package/dist/components/time-field/index.js.map +1 -0
  168. package/dist/components/time-picker/index.d.ts +65 -0
  169. package/dist/components/time-picker/index.js +1168 -0
  170. package/dist/components/time-picker/index.js.map +1 -0
  171. package/dist/components/toolbar/index.d.ts +53 -0
  172. package/dist/components/toolbar/index.js +185 -0
  173. package/dist/components/toolbar/index.js.map +1 -0
  174. package/dist/components/tooltip/index.d.ts +101 -0
  175. package/dist/components/tooltip/index.js +223 -0
  176. package/dist/components/tooltip/index.js.map +1 -0
  177. package/dist/components/tree/index.d.ts +112 -0
  178. package/dist/components/tree/index.js +157 -0
  179. package/dist/components/tree/index.js.map +1 -0
  180. package/dist/control/group.js +23 -0
  181. package/dist/control/group.js.map +1 -0
  182. package/dist/disclosure/chevron.js +75 -0
  183. package/dist/disclosure/chevron.js.map +1 -0
  184. package/dist/disclosure/index.js +7 -0
  185. package/dist/disclosure/index.js.map +1 -0
  186. package/dist/drop/index.d.ts +54 -0
  187. package/dist/drop/index.js +161 -0
  188. package/dist/drop/index.js.map +1 -0
  189. package/dist/fab/index.d.ts +19 -0
  190. package/dist/fab/index.js +147 -0
  191. package/dist/fab/index.js.map +1 -0
  192. package/dist/field/chevron.js +74 -0
  193. package/dist/field/chevron.js.map +1 -0
  194. package/dist/field/index.d.ts +2 -1
  195. package/dist/field/index.js +350 -153
  196. package/dist/field/index.js.map +1 -1
  197. package/dist/field/styles.js +27 -0
  198. package/dist/field/styles.js.map +1 -1
  199. package/dist/files/index.d.ts +18 -0
  200. package/dist/files/index.js +107 -0
  201. package/dist/files/index.js.map +1 -0
  202. package/dist/form/index.d.ts +6 -4
  203. package/dist/form/index.js +64 -85
  204. package/dist/form/index.js.map +1 -1
  205. package/dist/glyphs/index.js +92 -1
  206. package/dist/glyphs/index.js.map +1 -1
  207. package/dist/i18n/index.js +20 -1
  208. package/dist/i18n/index.js.map +1 -1
  209. package/dist/i18n/messages.js +1394 -34
  210. package/dist/i18n/messages.js.map +1 -1
  211. package/dist/index.d.ts +51 -6
  212. package/dist/index.js +47 -4
  213. package/dist/indicator/paths.js +23 -1
  214. package/dist/indicator/paths.js.map +1 -1
  215. package/dist/modal/index.js +96 -68
  216. package/dist/modal/index.js.map +1 -1
  217. package/dist/navigation/index.js +8 -5
  218. package/dist/navigation/index.js.map +1 -1
  219. package/dist/number/keyboard.js +16 -0
  220. package/dist/number/keyboard.js.map +1 -0
  221. package/dist/overlay/anchored.js +68 -38
  222. package/dist/overlay/anchored.js.map +1 -1
  223. package/dist/overlay/keyboard.js +57 -0
  224. package/dist/overlay/keyboard.js.map +1 -0
  225. package/dist/overlay/panel.js +173 -19
  226. package/dist/overlay/panel.js.map +1 -1
  227. package/dist/overlay/placement.js +16 -2
  228. package/dist/overlay/placement.js.map +1 -1
  229. package/dist/picker/index.js +322 -0
  230. package/dist/picker/index.js.map +1 -0
  231. package/dist/press/index.d.ts +2 -0
  232. package/dist/press/index.js +102 -100
  233. package/dist/press/index.js.map +1 -1
  234. package/dist/row/index.js +77 -69
  235. package/dist/row/index.js.map +1 -1
  236. package/dist/row/styles.js +13 -2
  237. package/dist/row/styles.js.map +1 -1
  238. package/dist/segments/field.js +277 -0
  239. package/dist/segments/field.js.map +1 -0
  240. package/dist/segments/index.js +574 -0
  241. package/dist/segments/index.js.map +1 -0
  242. package/dist/segments/styles.js +24 -0
  243. package/dist/segments/styles.js.map +1 -0
  244. package/dist/separator/index.js +7 -0
  245. package/dist/separator/index.js.map +1 -0
  246. package/dist/slider/index.js +145 -0
  247. package/dist/slider/index.js.map +1 -0
  248. package/dist/swatch/index.js +56 -0
  249. package/dist/swatch/index.js.map +1 -0
  250. package/dist/typography/size.js +14 -0
  251. package/dist/typography/size.js.map +1 -0
  252. package/package.json +11 -2
  253. package/dist/badge/styles.js.map +0 -1
@@ -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,53 @@
1
+ import { StyleProp, View, ViewProps, ViewStyle } from "react-native";
2
+ import { ComponentRef, ReactNode, Ref } from "react";
3
+ //#region src/components/toolbar/index.d.ts
4
+ type ToolbarProps = Omit<ViewProps, 'children' | 'style'> & {
5
+ /** The controls, and any rule between them. */
6
+ readonly children?: ReactNode;
7
+ /**
8
+ * Which way the bar runs. A `Separator` among its controls runs across it.
9
+ * @default 'horizontal'
10
+ */
11
+ readonly orientation?: 'horizontal' | 'vertical';
12
+ readonly ref?: Ref<ComponentRef<typeof View>>;
13
+ readonly style?: StyleProp<ViewStyle>;
14
+ /**
15
+ * Which of the page's two colour schemes the bar takes. `neutral` is the
16
+ * page's standard scheme, the surface container it draws by default;
17
+ * `vibrant` moves it to primary container, for a bar meant to carry the
18
+ * screen's accent.
19
+ * @default 'neutral'
20
+ */
21
+ readonly tone?: ToolbarTone;
22
+ };
23
+ type ToolbarTone = 'neutral' | 'vibrant';
24
+ /**
25
+ * A container for a set of controls, announced as a toolbar so a screen
26
+ * reader reads them as one group.
27
+ *
28
+ * ```tsx
29
+ * <Toolbar aria-label="Label">
30
+ * <IconButton aria-label="First item">
31
+ * <FirstIcon />
32
+ * </IconButton>
33
+ * <Separator />
34
+ * <IconButton aria-label="Second item">
35
+ * <SecondIcon />
36
+ * </IconButton>
37
+ * </Toolbar>
38
+ * ```
39
+ *
40
+ * Name it with `aria-label` or `aria-labelledby`: nothing here labels it for
41
+ * you, and a toolbar with no name is a group a screen reader cannot
42
+ * announce.
43
+ *
44
+ * `orientation` decides which way the bar runs, and a `Separator` among its
45
+ * controls draws across that direction without being told; one inside an
46
+ * overlay opened from the bar draws as it would anywhere else. `style`,
47
+ * `ref` and `testID` land on the bar, which is the element a layout
48
+ * positions.
49
+ */
50
+ declare function Toolbar({ children, orientation, style, tone, ...props }: ToolbarProps): import("react").JSX.Element;
51
+ //#endregion
52
+ export { Toolbar, type ToolbarProps, type ToolbarTone };
53
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,185 @@
1
+ import { IconStyleContext } from "../../glyphs/icon-style.js";
2
+ import { useTheme } from "../../theme/scope.js";
3
+ import { composeStyles, themedStyles } from "../../theme/styles.js";
4
+ import { SeparatorOrientationContext } from "../../separator/index.js";
5
+ import { c } from "react/compiler-runtime";
6
+ import { Platform, StyleSheet, View } from "react-native";
7
+ import { jsx } from "react/jsx-runtime";
8
+ //#region src/components/toolbar/index.tsx
9
+ const ICON_SIZE = 24;
10
+ const VERTICAL = { "aria-orientation": "vertical" };
11
+ const stylesOf = themedStyles(({ colors, radii, spacing }) => StyleSheet.create({
12
+ base: {
13
+ alignItems: "center",
14
+ alignSelf: "flex-start",
15
+ borderRadius: radii.pill,
16
+ gap: spacing.sm,
17
+ justifyContent: "center"
18
+ },
19
+ horizontal: {
20
+ flexDirection: "row",
21
+ minHeight: 64,
22
+ paddingHorizontal: spacing.lg,
23
+ paddingVertical: spacing.sm
24
+ },
25
+ neutral: { backgroundColor: colors.surfaceContainer },
26
+ vertical: {
27
+ flexDirection: "column",
28
+ minWidth: 64,
29
+ paddingHorizontal: spacing.sm,
30
+ paddingVertical: spacing.lg
31
+ },
32
+ vibrant: { backgroundColor: colors.primaryContainer }
33
+ }));
34
+ function iconStyleOf(color) {
35
+ return {
36
+ color,
37
+ size: ICON_SIZE
38
+ };
39
+ }
40
+ /**
41
+ * A container for a set of controls, announced as a toolbar so a screen
42
+ * reader reads them as one group.
43
+ *
44
+ * ```tsx
45
+ * <Toolbar aria-label="Label">
46
+ * <IconButton aria-label="First item">
47
+ * <FirstIcon />
48
+ * </IconButton>
49
+ * <Separator />
50
+ * <IconButton aria-label="Second item">
51
+ * <SecondIcon />
52
+ * </IconButton>
53
+ * </Toolbar>
54
+ * ```
55
+ *
56
+ * Name it with `aria-label` or `aria-labelledby`: nothing here labels it for
57
+ * you, and a toolbar with no name is a group a screen reader cannot
58
+ * announce.
59
+ *
60
+ * `orientation` decides which way the bar runs, and a `Separator` among its
61
+ * controls draws across that direction without being told; one inside an
62
+ * overlay opened from the bar draws as it would anywhere else. `style`,
63
+ * `ref` and `testID` land on the bar, which is the element a layout
64
+ * positions.
65
+ */
66
+ function Toolbar(t0) {
67
+ const $ = c(37);
68
+ let children;
69
+ let props;
70
+ let style;
71
+ let t1;
72
+ let t2;
73
+ if ($[0] !== t0) {
74
+ ({children, orientation: t1, style, tone: t2, ...props} = t0);
75
+ $[0] = t0;
76
+ $[1] = children;
77
+ $[2] = props;
78
+ $[3] = style;
79
+ $[4] = t1;
80
+ $[5] = t2;
81
+ } else {
82
+ children = $[1];
83
+ props = $[2];
84
+ style = $[3];
85
+ t1 = $[4];
86
+ t2 = $[5];
87
+ }
88
+ const orientation = t1 === void 0 ? "horizontal" : t1;
89
+ const tone = t2 === void 0 ? "neutral" : t2;
90
+ const theme = useTheme();
91
+ let T0;
92
+ let T1;
93
+ let T2;
94
+ let t3;
95
+ let t4;
96
+ let t5;
97
+ let t6;
98
+ let t7;
99
+ let t8;
100
+ if ($[6] !== orientation || $[7] !== props || $[8] !== style || $[9] !== theme || $[10] !== tone) {
101
+ const own = stylesOf(theme);
102
+ const content = tone === "vibrant" ? theme.colors.onPrimaryContainer : theme.colors.onSurfaceVariant;
103
+ T2 = SeparatorOrientationContext;
104
+ t8 = orientation === "horizontal" ? "vertical" : "horizontal";
105
+ T1 = IconStyleContext;
106
+ if ($[20] !== content) {
107
+ t7 = iconStyleOf(content);
108
+ $[20] = content;
109
+ $[21] = t7;
110
+ } else t7 = $[21];
111
+ T0 = View;
112
+ t3 = "toolbar";
113
+ t4 = Platform.OS === "web" && orientation === "vertical" ? VERTICAL : void 0;
114
+ t5 = props;
115
+ t6 = composeStyles(own.base, own[orientation], own[tone], style);
116
+ $[6] = orientation;
117
+ $[7] = props;
118
+ $[8] = style;
119
+ $[9] = theme;
120
+ $[10] = tone;
121
+ $[11] = T0;
122
+ $[12] = T1;
123
+ $[13] = T2;
124
+ $[14] = t3;
125
+ $[15] = t4;
126
+ $[16] = t5;
127
+ $[17] = t6;
128
+ $[18] = t7;
129
+ $[19] = t8;
130
+ } else {
131
+ T0 = $[11];
132
+ T1 = $[12];
133
+ T2 = $[13];
134
+ t3 = $[14];
135
+ t4 = $[15];
136
+ t5 = $[16];
137
+ t6 = $[17];
138
+ t7 = $[18];
139
+ t8 = $[19];
140
+ }
141
+ let t9;
142
+ if ($[22] !== T0 || $[23] !== children || $[24] !== t3 || $[25] !== t4 || $[26] !== t5 || $[27] !== t6) {
143
+ t9 = /* @__PURE__ */ jsx(T0, {
144
+ role: t3,
145
+ ...t4,
146
+ ...t5,
147
+ style: t6,
148
+ children
149
+ });
150
+ $[22] = T0;
151
+ $[23] = children;
152
+ $[24] = t3;
153
+ $[25] = t4;
154
+ $[26] = t5;
155
+ $[27] = t6;
156
+ $[28] = t9;
157
+ } else t9 = $[28];
158
+ let t10;
159
+ if ($[29] !== T1 || $[30] !== t7 || $[31] !== t9) {
160
+ t10 = /* @__PURE__ */ jsx(T1, {
161
+ value: t7,
162
+ children: t9
163
+ });
164
+ $[29] = T1;
165
+ $[30] = t7;
166
+ $[31] = t9;
167
+ $[32] = t10;
168
+ } else t10 = $[32];
169
+ let t11;
170
+ if ($[33] !== T2 || $[34] !== t10 || $[35] !== t8) {
171
+ t11 = /* @__PURE__ */ jsx(T2, {
172
+ value: t8,
173
+ children: t10
174
+ });
175
+ $[33] = T2;
176
+ $[34] = t10;
177
+ $[35] = t8;
178
+ $[36] = t11;
179
+ } else t11 = $[36];
180
+ return t11;
181
+ }
182
+ //#endregion
183
+ export { Toolbar };
184
+
185
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["ComponentRef","ReactNode","Ref","ColorValue","StyleProp","ViewProps","ViewStyle","Platform","StyleSheet","View","IconStyle","IconStyleContext","SeparatorOrientationContext","useTheme","composeStyles","themedStyles","ToolbarProps","Omit","children","orientation","ref","style","tone","ToolbarTone","ICON_SIZE","VERTICAL","const","stylesOf","colors","radii","spacing","create","base","alignItems","alignSelf","borderRadius","pill","gap","sm","justifyContent","horizontal","flexDirection","minHeight","paddingHorizontal","lg","paddingVertical","neutral","backgroundColor","surfaceContainer","vertical","minWidth","vibrant","primaryContainer","iconStyleOf","color","size","Toolbar","t0","$","_c","props","t1","t2","undefined","theme","T0","T1","T2","t3","t4","t5","t6","t7","t8","own","content","onPrimaryContainer","onSurfaceVariant","OS","t9","t10","t11","_c"],"sources":["../../../src/components/toolbar/index.tsx"],"sourcesContent":["import type { ComponentRef, ReactNode, Ref } from 'react'\nimport type { ColorValue, StyleProp, ViewProps, ViewStyle } from 'react-native'\n\nimport { Platform, StyleSheet, View } from 'react-native'\n\nimport type { IconStyle } from '../../glyphs/icon-style'\n\nimport { IconStyleContext } from '../../glyphs/icon-style'\nimport { SeparatorOrientationContext } from '../../separator'\nimport { useTheme } from '../../theme/scope'\nimport { composeStyles, themedStyles } from '../../theme/styles'\n\n// kanso-ui's Toolbar: the toolbars page's container, a row of frequently used\n// controls on a surface of its own. The page calls it \"a container with\n// configurable slots\", so nothing here says what goes in one: an icon\n// button, a button, a field or a rule are all the call site's to place.\n//\n// The measurements are the page's, stated there in words: 64dp across the\n// bar, its contents centred, 8dp between items and 16dp of padding at the two\n// ends. The two colour schemes are its own too, standard on surface container\n// and vibrant on primary container, each with its content role on what the\n// bar holds: on-surface variant, and on-primary container. `tone` spells the\n// standard one `neutral`, the word every `tone` in the library uses for its\n// neutral role. That role reaches a bare icon placed in the bar through\n// `useIconStyle()`, while a control keeps its own colours.\n//\n// **A rule inside it runs across the bar, not along it.** The bar tells a\n// `Separator` among its controls to run the other way, so a rule between two\n// controls is correct without the call site saying which way it runs. A modal\n// window opened from the bar clears that, and an overlay never sees it, so a\n// rule in a dialog, sheet or popover draws as it does anywhere else.\n//\n// It is announced as a toolbar, which tells a screen reader its controls\n// belong together. Web's arrow keys between the controls are React Aria's and\n// have no counterpart on a touch screen, so each control is reached as any\n// other is.\n//\n// One departure, about the shape, and it is web's. The page gives the\n// container's corner as a token its widget draws rather than writes, so there\n// is no value to read. The fully rounded corner here, and the bar hugging its\n// controls rather than spanning its parent, are the library's choice for a\n// bar that floats over a screen; a docked one spans its container and squares\n// its corner, both from the call site's `style`.\n\ntype ToolbarProps = Omit<ViewProps, 'children' | 'style'> & {\n /** The controls, and any rule between them. */\n readonly children?: ReactNode\n /**\n * Which way the bar runs. A `Separator` among its controls runs across it.\n * @default 'horizontal'\n */\n readonly orientation?: 'horizontal' | 'vertical'\n readonly ref?: Ref<ComponentRef<typeof View>>\n readonly style?: StyleProp<ViewStyle>\n /**\n * Which of the page's two colour schemes the bar takes. `neutral` is the\n * page's standard scheme, the surface container it draws by default;\n * `vibrant` moves it to primary container, for a bar meant to carry the\n * screen's accent.\n * @default 'neutral'\n */\n readonly tone?: ToolbarTone\n}\n\ntype ToolbarTone = 'neutral' | 'vibrant'\n\n// The icon a bare glyph in the bar draws at, the 24dp grid Material Symbols\n// are drawn on.\nconst ICON_SIZE = 24\n\n// React Native Web writes `aria-orientation` onto the element, which React\n// Native's types do not name. A horizontal bar needs none, since that is the\n// toolbar role's own default.\nconst VERTICAL = { 'aria-orientation': 'vertical' } as const\n\nconst stylesOf = themedStyles(({ colors, radii, spacing }) =>\n StyleSheet.create({\n base: {\n alignItems: 'center',\n alignSelf: 'flex-start',\n borderRadius: radii.pill,\n gap: spacing.sm,\n justifyContent: 'center',\n },\n // The page's 64dp across the bar, and its 16dp of padding at the two\n // ends. A minimum rather than a fixed size, since a field or a button\n // taller than 64dp should make the bar taller rather than overflow it.\n //\n // The cross axis takes the 8dp the page puts between items rather than\n // nothing. A `Separator` takes its length from the bar, so with no\n // padding there a rule would run the full 64dp and cut the container in\n // two instead of dividing what is inside it.\n horizontal: {\n flexDirection: 'row',\n minHeight: 64,\n paddingHorizontal: spacing.lg,\n paddingVertical: spacing.sm,\n },\n neutral: {\n backgroundColor: colors.surfaceContainer,\n },\n vertical: {\n flexDirection: 'column',\n minWidth: 64,\n paddingHorizontal: spacing.sm,\n paddingVertical: spacing.lg,\n },\n vibrant: {\n backgroundColor: colors.primaryContainer,\n },\n }),\n)\n\n// Built by a call rather than written inline at the prop, which is what\n// react-perf's jsx-no-new-object-as-prop is after; the React Compiler\n// memoises the result on its inputs.\nfunction iconStyleOf(color: ColorValue): IconStyle {\n return { color, size: ICON_SIZE }\n}\n\n/**\n * A container for a set of controls, announced as a toolbar so a screen\n * reader reads them as one group.\n *\n * ```tsx\n * <Toolbar aria-label=\"Label\">\n * <IconButton aria-label=\"First item\">\n * <FirstIcon />\n * </IconButton>\n * <Separator />\n * <IconButton aria-label=\"Second item\">\n * <SecondIcon />\n * </IconButton>\n * </Toolbar>\n * ```\n *\n * Name it with `aria-label` or `aria-labelledby`: nothing here labels it for\n * you, and a toolbar with no name is a group a screen reader cannot\n * announce.\n *\n * `orientation` decides which way the bar runs, and a `Separator` among its\n * controls draws across that direction without being told; one inside an\n * overlay opened from the bar draws as it would anywhere else. `style`,\n * `ref` and `testID` land on the bar, which is the element a layout\n * positions.\n */\nfunction Toolbar({\n children,\n orientation = 'horizontal',\n style,\n tone = 'neutral',\n ...props\n}: ToolbarProps) {\n const theme = useTheme()\n const own = stylesOf(theme)\n const content =\n tone === 'vibrant'\n ? theme.colors.onPrimaryContainer\n : theme.colors.onSurfaceVariant\n\n return (\n <SeparatorOrientationContext\n value={orientation === 'horizontal' ? 'vertical' : 'horizontal'}\n >\n <IconStyleContext value={iconStyleOf(content)}>\n <View\n role=\"toolbar\"\n {...(Platform.OS === 'web' && orientation === 'vertical'\n ? VERTICAL\n : undefined)}\n {...props}\n style={composeStyles<ViewStyle>(\n own.base,\n own[orientation],\n own[tone],\n style,\n )}\n >\n {children}\n </View>\n </IconStyleContext>\n </SeparatorOrientationContext>\n )\n}\n\nexport { Toolbar }\nexport type { ToolbarProps, ToolbarTone }\n"],"mappings":"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"}
@@ -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