@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,277 @@
1
+ import { useTheme } from "../theme/scope.js";
2
+ import { composeStyles } from "../theme/styles.js";
3
+ import { useTypeRole } from "../typography/roles.js";
4
+ import { messagesFor } from "../i18n/index.js";
5
+ import { useFieldValidation } from "../form/index.js";
6
+ import { FieldBox, FieldMessage, FieldSegments, describedBy } from "../field/index.js";
7
+ import { segmentStylesOf } from "./styles.js";
8
+ import { DateSegments } from "./index.js";
9
+ import { c } from "react/compiler-runtime";
10
+ import { Text, View } from "react-native";
11
+ import { useId, useRef, useState } from "react";
12
+ import { jsx, jsxs } from "react/jsx-runtime";
13
+ //#region src/segments/field.tsx
14
+ function arrivedOf({ leaving, onFocus, setFocused }) {
15
+ return () => {
16
+ if (leaving.current === void 0) {
17
+ setFocused(true);
18
+ onFocus?.();
19
+ } else clearTimeout(leaving.current);
20
+ };
21
+ }
22
+ function backToStart({ control }) {
23
+ return () => {
24
+ control.current?.focusLast();
25
+ };
26
+ }
27
+ function FieldLine(line) {
28
+ const $ = c(54);
29
+ const { box, control, description, end, endControl, endName, endSubmitted: t0, error, errors, floatingLabel: t1, focused, holding, isDisabled, isEmpty, isReadOnly, isRequired, label, leadingIcon, locale, name, ref, separator, state, style, submitted, testID, trailingIcon, variant: t2 } = line;
30
+ const endSubmitted = t0 === void 0 ? "" : t0;
31
+ const floatingLabel = t1 === void 0 ? true : t1;
32
+ const variant = t2 === void 0 ? "filled" : t2;
33
+ const id = useId();
34
+ const theme = useTheme();
35
+ const own = segmentStylesOf(theme);
36
+ const role = useTypeRole("bodyLarge");
37
+ let t3;
38
+ if ($[0] !== locale) {
39
+ t3 = messagesFor(locale);
40
+ $[0] = locale;
41
+ $[1] = t3;
42
+ } else t3 = $[1];
43
+ const words = t3.segments;
44
+ let t4;
45
+ if ($[2] !== end || $[3] !== endName || $[4] !== endSubmitted) {
46
+ t4 = end === void 0 ? void 0 : [endName, endSubmitted];
47
+ $[2] = end;
48
+ $[3] = endName;
49
+ $[4] = endSubmitted;
50
+ $[5] = t4;
51
+ } else t4 = $[5];
52
+ let t5;
53
+ if ($[6] !== errors) {
54
+ t5 = () => errors;
55
+ $[6] = errors;
56
+ $[7] = t5;
57
+ } else t5 = $[7];
58
+ let t6;
59
+ if ($[8] !== control || $[9] !== error || $[10] !== isDisabled || $[11] !== isEmpty || $[12] !== isReadOnly || $[13] !== isRequired || $[14] !== name || $[15] !== submitted || $[16] !== t4 || $[17] !== t5) {
60
+ t6 = {
61
+ alongside: t4,
62
+ control,
63
+ error,
64
+ isDisabled,
65
+ isEmpty,
66
+ isReadOnly,
67
+ isRequired,
68
+ name,
69
+ submitted,
70
+ validate: t5,
71
+ value: null
72
+ };
73
+ $[8] = control;
74
+ $[9] = error;
75
+ $[10] = isDisabled;
76
+ $[11] = isEmpty;
77
+ $[12] = isReadOnly;
78
+ $[13] = isRequired;
79
+ $[14] = name;
80
+ $[15] = submitted;
81
+ $[16] = t4;
82
+ $[17] = t5;
83
+ $[18] = t6;
84
+ } else t6 = $[18];
85
+ const validation = useFieldValidation(t6);
86
+ const shownError = validation.error;
87
+ let t7;
88
+ if ($[19] !== description || $[20] !== id || $[21] !== shownError) {
89
+ t7 = describedBy(id, {
90
+ description,
91
+ error: shownError
92
+ });
93
+ $[19] = description;
94
+ $[20] = id;
95
+ $[21] = shownError;
96
+ $[22] = t7;
97
+ } else t7 = $[22];
98
+ const described = t7;
99
+ let t8;
100
+ if ($[23] !== line) {
101
+ t8 = arrivedOf(line);
102
+ $[23] = line;
103
+ $[24] = t8;
104
+ } else t8 = $[24];
105
+ const arrived = t8;
106
+ let t9;
107
+ if ($[25] !== line || $[26] !== validation.onBlur) {
108
+ t9 = leftOf(line, validation.onBlur);
109
+ $[25] = line;
110
+ $[26] = validation.onBlur;
111
+ $[27] = t9;
112
+ } else t9 = $[27];
113
+ const left = t9;
114
+ const T0 = View;
115
+ const t10 = "group";
116
+ const T1 = FieldBox;
117
+ const t11 = focused ? void 0 : control;
118
+ const t12 = shownError !== void 0;
119
+ const t13 = true;
120
+ const t14 = end === void 0 ? /* @__PURE__ */ jsx(DateSegments, {
121
+ described,
122
+ holding,
123
+ isInvalid: shownError !== void 0,
124
+ label,
125
+ locale,
126
+ onBlur: left,
127
+ onEdit: validation.onEdit,
128
+ onFocus: arrived,
129
+ ref: control,
130
+ state
131
+ }) : /* @__PURE__ */ jsxs(FieldSegments, { children: [
132
+ /* @__PURE__ */ jsx(DateSegments, {
133
+ described,
134
+ holding,
135
+ isInvalid: shownError !== void 0,
136
+ label: `${words.startDate}, ${label}`,
137
+ locale,
138
+ onBlur: left,
139
+ onEdit: validation.onEdit,
140
+ onFocus: arrived,
141
+ onPastEnd: onToEnd(line),
142
+ ref: control,
143
+ state
144
+ }),
145
+ /* @__PURE__ */ jsx(Text, {
146
+ "aria-hidden": true,
147
+ style: composeStyles(role, own.separator, isDisabled ? own.textDisabled : own.textMuted),
148
+ children: separator
149
+ }),
150
+ /* @__PURE__ */ jsx(DateSegments, {
151
+ described,
152
+ holding,
153
+ isInvalid: shownError !== void 0,
154
+ label: `${words.endDate}, ${label}`,
155
+ locale,
156
+ onBeforeStart: backToStart(line),
157
+ onBlur: left,
158
+ onEdit: validation.onEdit,
159
+ onFocus: arrived,
160
+ ref: endControl,
161
+ state: end
162
+ })
163
+ ] });
164
+ let t15;
165
+ if ($[28] !== T1 || $[29] !== box || $[30] !== floatingLabel || $[31] !== focused || $[32] !== isDisabled || $[33] !== isRequired || $[34] !== label || $[35] !== leadingIcon || $[36] !== t11 || $[37] !== t12 || $[38] !== t14 || $[39] !== trailingIcon || $[40] !== variant) {
166
+ t15 = /* @__PURE__ */ jsx(T1, {
167
+ control: t11,
168
+ floatingLabel,
169
+ isDisabled,
170
+ isFocused: focused,
171
+ isInvalid: t12,
172
+ isPopulated: t13,
173
+ isRequired,
174
+ label,
175
+ leading: leadingIcon,
176
+ ref: box,
177
+ trailing: trailingIcon,
178
+ variant,
179
+ children: t14
180
+ });
181
+ $[28] = T1;
182
+ $[29] = box;
183
+ $[30] = floatingLabel;
184
+ $[31] = focused;
185
+ $[32] = isDisabled;
186
+ $[33] = isRequired;
187
+ $[34] = label;
188
+ $[35] = leadingIcon;
189
+ $[36] = t11;
190
+ $[37] = t12;
191
+ $[38] = t14;
192
+ $[39] = trailingIcon;
193
+ $[40] = variant;
194
+ $[41] = t15;
195
+ } else t15 = $[41];
196
+ let t16;
197
+ if ($[42] !== description || $[43] !== id || $[44] !== shownError) {
198
+ t16 = /* @__PURE__ */ jsx(FieldMessage, {
199
+ description,
200
+ error: shownError,
201
+ id
202
+ });
203
+ $[42] = description;
204
+ $[43] = id;
205
+ $[44] = shownError;
206
+ $[45] = t16;
207
+ } else t16 = $[45];
208
+ let t17;
209
+ if ($[46] !== T0 || $[47] !== label || $[48] !== ref || $[49] !== style || $[50] !== t15 || $[51] !== t16 || $[52] !== testID) {
210
+ t17 = /* @__PURE__ */ jsxs(T0, {
211
+ "aria-label": label,
212
+ ref,
213
+ role: t10,
214
+ style,
215
+ testID,
216
+ children: [t15, t16]
217
+ });
218
+ $[46] = T0;
219
+ $[47] = label;
220
+ $[48] = ref;
221
+ $[49] = style;
222
+ $[50] = t15;
223
+ $[51] = t16;
224
+ $[52] = testID;
225
+ $[53] = t17;
226
+ } else t17 = $[53];
227
+ return t17;
228
+ }
229
+ function leftOf({ end, leaving, onBlur, setFocused }, validationBlur) {
230
+ const left = () => {
231
+ leaving.current = void 0;
232
+ setFocused(false);
233
+ onBlur?.();
234
+ };
235
+ return () => {
236
+ validationBlur();
237
+ if (end === void 0) left();
238
+ else leaving.current = setTimeout(left, 0);
239
+ };
240
+ }
241
+ function onToEnd({ endControl }) {
242
+ return () => {
243
+ endControl.current?.focus();
244
+ };
245
+ }
246
+ /**
247
+ * A field of segments from React Stately's date field state, in the text
248
+ * field's box: the label floated from the start, since the segments always
249
+ * show, and the error what `error` says, else what `errors` says, in React
250
+ * Stately's order and its words. Given an `end` it draws a range.
251
+ */
252
+ function SegmentedField(props) {
253
+ const $ = c(3);
254
+ const control = useRef(null);
255
+ const endControl = useRef(null);
256
+ const leaving = useRef(void 0);
257
+ const [focused, setFocused] = useState(false);
258
+ let t0;
259
+ if ($[0] !== focused || $[1] !== props) {
260
+ t0 = /* @__PURE__ */ jsx(FieldLine, {
261
+ ...props,
262
+ control,
263
+ endControl,
264
+ focused,
265
+ leaving,
266
+ setFocused
267
+ });
268
+ $[0] = focused;
269
+ $[1] = props;
270
+ $[2] = t0;
271
+ } else t0 = $[2];
272
+ return t0;
273
+ }
274
+ //#endregion
275
+ export { SegmentedField };
276
+
277
+ //# sourceMappingURL=field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.js","names":["ComponentRef","ReactNode","Ref","RefObject","HostInstance","StyleProp","TextStyle","ViewStyle","DateFieldState","useId","useRef","useState","Text","View","SegmentsHandle","FieldVariant","DateSegments","describedBy","FieldBox","FieldMessage","FieldSegments","useFieldValidation","messagesFor","useTheme","composeStyles","useTypeRole","segmentStylesOf","FieldLineProps","SegmentedFieldProps","control","endControl","focused","leaving","ReturnType","setTimeout","setFocused","box","description","end","endName","endSubmitted","error","errors","floatingLabel","holding","isDisabled","isEmpty","isReadOnly","isRequired","label","leadingIcon","locale","name","onBlur","onFocus","ref","separator","state","style","submitted","testID","trailingIcon","variant","arrivedOf","current","undefined","clearTimeout","backToStart","focusLast","FieldLine","line","$","_c","t0","t1","t2","id","theme","own","role","t3","words","segments","t4","t5","t6","alongside","validate","value","validation","shownError","t7","described","t8","arrived","t9","leftOf","left","T0","t10","T1","t11","t12","t13","t14","onEdit","startDate","onToEnd","textDisabled","textMuted","endDate","t15","t16","t17","validationBlur","focus","SegmentedField","props","_c"],"sources":["../../src/segments/field.tsx"],"sourcesContent":["import type { ComponentRef, ReactNode, Ref, RefObject } from 'react'\nimport type {\n HostInstance,\n StyleProp,\n TextStyle,\n ViewStyle,\n} from 'react-native'\nimport type { DateFieldState } from 'react-stately/useDateFieldState'\n\nimport { useId, useRef, useState } from 'react'\nimport { Text, View } from 'react-native'\n\nimport type { SegmentsHandle } from '.'\nimport type { FieldVariant } from '../field'\n\nimport { DateSegments } from '.'\nimport { describedBy, FieldBox, FieldMessage, FieldSegments } from '../field'\nimport { useFieldValidation } from '../form'\nimport { messagesFor } from '../i18n'\nimport { useTheme } from '../theme/scope'\nimport { composeStyles } from '../theme/styles'\nimport { useTypeRole } from '../typography/roles'\nimport { segmentStylesOf } from './styles'\n\n// The field a date or a time is typed into: src/field's box, label and line\n// under it around the segments, with the value taking part in the Form\n// around it. DateField and TimeField differ in the state they build, and\n// both draw it through this, as web's two draw the same chrome around React\n// Aria's DateInput. DatePicker draws it with the calendar's button in the\n// trailing slot, and DateRangePicker with two dates on its line.\n//\n// **A range is two sets of segments with a separator between them**, the\n// start's and the end's, each its own React Stately field and each named for\n// its date before the label, \"Start Date\" and \"End Date\" in React Aria's\n// words. Focus runs on from the start's last segment to the end's first, as\n// a full segment or an arrow key moves it, and back from the end's first as\n// a backspace does, as React Aria's picker moves it across both. The\n// separator is decoration in the segments' muted role, hidden from a screen\n// reader, which already hears which date each segment is part of.\n//\n// Focus moving from one date to the other is not focus leaving the field: a\n// date's blur waits for the other's focus before the field draws itself\n// blurred and tells the call site, as React Aria's picker hears focus leave\n// the whole group. A field of one date has nothing to wait for, so its blur\n// is the field's at once. A press on the box while either date has focus\n// leaves focus where it is, rather than taking it back to the start's first\n// segment.\n\n// What the field keeps for its line: each date's segments, the timer a\n// date's blur waits on, and whether it draws itself focused.\ntype FieldLineProps = SegmentedFieldProps & {\n readonly control: RefObject<null | SegmentsHandle>\n readonly endControl: RefObject<null | SegmentsHandle>\n readonly focused: boolean\n readonly leaving: RefObject<ReturnType<typeof setTimeout> | undefined>\n readonly setFocused: (focused: boolean) => void\n}\n\ntype SegmentedFieldProps = {\n /** The box, which a picker measures to place its calendar under. */\n readonly box?: Ref<HostInstance>\n readonly description?: string\n /** A range's end, whose segments follow the separator. */\n readonly end?: DateFieldState\n /** The name a range's end is submitted under. */\n readonly endName?: string\n /** What the Form submits a range's end as, `''` while empty. */\n readonly endSubmitted?: string\n readonly error?: string\n /** What React Stately's validation of the value says, in its words. */\n readonly errors: readonly string[]\n readonly floatingLabel?: boolean\n /**\n * What the segments are read as holding, after their own names: the date\n * written out by default, a range picker's whole range where given.\n */\n readonly holding?: string\n readonly isDisabled: boolean\n /** Whether the value is what a required field must not be left as. */\n readonly isEmpty: boolean\n readonly isReadOnly: boolean\n readonly isRequired: boolean\n readonly label: string\n readonly leadingIcon?: ReactNode\n /** The locale the segments are written in, already resolved. */\n readonly locale: string\n readonly name?: string\n readonly onBlur?: () => void\n readonly onFocus?: () => void\n readonly ref?: Ref<ComponentRef<typeof View>>\n /** What is drawn between a range's two dates. */\n readonly separator?: string\n /** The field's state, or a range's start. */\n readonly state: DateFieldState\n readonly style?: StyleProp<ViewStyle>\n /** What the Form around the field submits the value as, `''` while empty. */\n readonly submitted: string\n readonly testID?: string\n readonly trailingIcon?: ReactNode\n readonly variant?: FieldVariant\n}\n\n// A date's segments arriving in focus: the field's focus where focus comes\n// from outside it, and nothing new where it comes from the other date, whose\n// leaving is then called off. The timer's id is kept until the next blur\n// replaces it, since focus arrives nowhere else before one.\nfunction arrivedOf({ leaving, onFocus, setFocused }: FieldLineProps) {\n return () => {\n if (leaving.current === undefined) {\n setFocused(true)\n onFocus?.()\n } else {\n clearTimeout(leaving.current)\n }\n }\n}\n\n// Moves focus back from the end's first segment to the start's last.\nfunction backToStart({ control }: FieldLineProps) {\n return () => {\n control.current?.focusLast()\n }\n}\n\n// The field's box, label and line under it around its segments.\nfunction FieldLine(line: FieldLineProps) {\n const {\n box,\n control,\n description,\n end,\n endControl,\n endName,\n endSubmitted = '',\n error,\n errors,\n floatingLabel = true,\n focused,\n holding,\n isDisabled,\n isEmpty,\n isReadOnly,\n isRequired,\n label,\n leadingIcon,\n locale,\n name,\n ref,\n separator,\n state,\n style,\n submitted,\n testID,\n trailingIcon,\n variant = 'filled',\n } = line\n const id = useId()\n const theme = useTheme()\n const own = segmentStylesOf(theme)\n const role = useTypeRole('bodyLarge')\n const words = messagesFor(locale).segments\n const validation = useFieldValidation({\n alongside: end === undefined ? undefined : [endName, endSubmitted],\n control,\n error,\n isDisabled,\n isEmpty,\n isReadOnly,\n isRequired,\n name,\n submitted,\n validate: () => errors,\n value: null,\n })\n const shownError = validation.error\n const described = describedBy(id, { description, error: shownError })\n const arrived = arrivedOf(line)\n const left = leftOf(line, validation.onBlur)\n\n return (\n <View\n aria-label={label}\n ref={ref}\n role=\"group\"\n style={style}\n testID={testID}\n >\n <FieldBox\n control={focused ? undefined : control}\n floatingLabel={floatingLabel}\n isDisabled={isDisabled}\n isFocused={focused}\n isInvalid={shownError !== undefined}\n isPopulated\n isRequired={isRequired}\n label={label}\n leading={leadingIcon}\n ref={box}\n trailing={trailingIcon}\n variant={variant}\n >\n {end === undefined ? (\n <DateSegments\n described={described}\n holding={holding}\n isInvalid={shownError !== undefined}\n label={label}\n locale={locale}\n onBlur={left}\n onEdit={validation.onEdit}\n onFocus={arrived}\n ref={control}\n state={state}\n />\n ) : (\n <FieldSegments>\n <DateSegments\n described={described}\n holding={holding}\n isInvalid={shownError !== undefined}\n label={`${words.startDate}, ${label}`}\n locale={locale}\n onBlur={left}\n onEdit={validation.onEdit}\n onFocus={arrived}\n onPastEnd={onToEnd(line)}\n ref={control}\n state={state}\n />\n <Text\n aria-hidden\n style={composeStyles<TextStyle>(\n role,\n own.separator,\n isDisabled ? own.textDisabled : own.textMuted,\n )}\n >\n {separator}\n </Text>\n <DateSegments\n described={described}\n holding={holding}\n isInvalid={shownError !== undefined}\n label={`${words.endDate}, ${label}`}\n locale={locale}\n onBeforeStart={backToStart(line)}\n onBlur={left}\n onEdit={validation.onEdit}\n onFocus={arrived}\n ref={endControl}\n state={end}\n />\n </FieldSegments>\n )}\n </FieldBox>\n <FieldMessage description={description} error={shownError} id={id} />\n </View>\n )\n}\n\n// A date's segments losing focus: the validation's blur at once, as each of\n// React Aria's date fields commits its own, and the field's blur once the\n// other date has not taken focus, or at once where there is no other.\nfunction leftOf(\n { end, leaving, onBlur, setFocused }: FieldLineProps,\n validationBlur: () => void,\n) {\n const left = () => {\n leaving.current = undefined\n setFocused(false)\n onBlur?.()\n }\n\n return () => {\n validationBlur()\n\n if (end === undefined) {\n left()\n } else {\n leaving.current = setTimeout(left, 0)\n }\n }\n}\n\n// Moves focus on from the start's last segment to the end's first.\nfunction onToEnd({ endControl }: FieldLineProps) {\n return () => {\n endControl.current?.focus()\n }\n}\n\n/**\n * A field of segments from React Stately's date field state, in the text\n * field's box: the label floated from the start, since the segments always\n * show, and the error what `error` says, else what `errors` says, in React\n * Stately's order and its words. Given an `end` it draws a range.\n */\nfunction SegmentedField(props: SegmentedFieldProps) {\n const control = useRef<SegmentsHandle>(null)\n const endControl = useRef<SegmentsHandle>(null)\n const leaving = useRef<ReturnType<typeof setTimeout>>(undefined)\n const [focused, setFocused] = useState(false)\n\n return (\n <FieldLine\n {...props}\n control={control}\n endControl={endControl}\n focused={focused}\n leaving={leaving}\n setFocused={setFocused}\n />\n )\n}\n\nexport { SegmentedField }\nexport type { SegmentedFieldProps }\n"],"mappings":"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"}