@nori-ui/core 1.0.6 → 1.2.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 (174) hide show
  1. package/dist/chunk-2UXKXUX2.js +286 -0
  2. package/dist/chunk-2UXKXUX2.js.map +1 -0
  3. package/dist/{chunk-DDGMLLS3.js → chunk-46OT4PA6.js} +3 -3
  4. package/dist/{chunk-DDGMLLS3.js.map → chunk-46OT4PA6.js.map} +1 -1
  5. package/dist/{chunk-SFNDR6DI.js → chunk-5BM6H2CD.js} +3 -3
  6. package/dist/{chunk-SFNDR6DI.js.map → chunk-5BM6H2CD.js.map} +1 -1
  7. package/dist/{chunk-EWWQQ5DB.js → chunk-6JVUVBZH.js} +5 -5
  8. package/dist/{chunk-EWWQQ5DB.js.map → chunk-6JVUVBZH.js.map} +1 -1
  9. package/dist/{chunk-FT2XBBQJ.js → chunk-6PO2IWB3.js} +8 -5
  10. package/dist/chunk-6PO2IWB3.js.map +1 -0
  11. package/dist/{chunk-YNKKEO2A.js → chunk-7D2BHQ6M.js} +3 -3
  12. package/dist/{chunk-YNKKEO2A.js.map → chunk-7D2BHQ6M.js.map} +1 -1
  13. package/dist/{chunk-MRJWPRCX.js → chunk-AFQIK6JI.js} +3 -3
  14. package/dist/{chunk-MRJWPRCX.js.map → chunk-AFQIK6JI.js.map} +1 -1
  15. package/dist/{chunk-IKLA2CVQ.js → chunk-C6TRLHMW.js} +21 -5
  16. package/dist/chunk-C6TRLHMW.js.map +1 -0
  17. package/dist/{chunk-NRYWNOG5.js → chunk-CGQIVFCN.js} +3 -3
  18. package/dist/{chunk-NRYWNOG5.js.map → chunk-CGQIVFCN.js.map} +1 -1
  19. package/dist/chunk-EFK7726V.js +104 -0
  20. package/dist/chunk-EFK7726V.js.map +1 -0
  21. package/dist/{chunk-3BDDPFCI.js → chunk-FDBQOQMW.js} +3 -3
  22. package/dist/{chunk-3BDDPFCI.js.map → chunk-FDBQOQMW.js.map} +1 -1
  23. package/dist/{chunk-XALU6LOT.js → chunk-GELLSU64.js} +3 -3
  24. package/dist/{chunk-XALU6LOT.js.map → chunk-GELLSU64.js.map} +1 -1
  25. package/dist/{chunk-BZLT6R62.js → chunk-GRDVE3IR.js} +3 -3
  26. package/dist/{chunk-BZLT6R62.js.map → chunk-GRDVE3IR.js.map} +1 -1
  27. package/dist/{chunk-OMU4R4Y5.js → chunk-HTF6FDB6.js} +3 -3
  28. package/dist/{chunk-OMU4R4Y5.js.map → chunk-HTF6FDB6.js.map} +1 -1
  29. package/dist/{chunk-X7APG7G2.js → chunk-HZKXPN6B.js} +154 -34
  30. package/dist/chunk-HZKXPN6B.js.map +1 -0
  31. package/dist/{chunk-WGT345SV.js → chunk-IGLMPAWE.js} +3 -3
  32. package/dist/{chunk-WGT345SV.js.map → chunk-IGLMPAWE.js.map} +1 -1
  33. package/dist/{chunk-5XEGZFG5.js → chunk-LWQZ257T.js} +3 -3
  34. package/dist/{chunk-5XEGZFG5.js.map → chunk-LWQZ257T.js.map} +1 -1
  35. package/dist/{chunk-RFW5SRZA.js → chunk-MJ4AGXS7.js} +3 -3
  36. package/dist/{chunk-RFW5SRZA.js.map → chunk-MJ4AGXS7.js.map} +1 -1
  37. package/dist/{chunk-PNP7L4TA.js → chunk-RM5TSXVE.js} +3 -3
  38. package/dist/{chunk-PNP7L4TA.js.map → chunk-RM5TSXVE.js.map} +1 -1
  39. package/dist/{chunk-MKSDYRWQ.js → chunk-SINLREQV.js} +3 -3
  40. package/dist/{chunk-MKSDYRWQ.js.map → chunk-SINLREQV.js.map} +1 -1
  41. package/dist/{chunk-TLS54G6Y.js → chunk-UF5OENHV.js} +3 -3
  42. package/dist/{chunk-TLS54G6Y.js.map → chunk-UF5OENHV.js.map} +1 -1
  43. package/dist/{chunk-ZQMNGPLE.js → chunk-UJ5KFRDE.js} +18 -6
  44. package/dist/chunk-UJ5KFRDE.js.map +1 -0
  45. package/dist/{chunk-SWC5CNKE.js → chunk-UPVNZPFV.js} +3 -3
  46. package/dist/{chunk-SWC5CNKE.js.map → chunk-UPVNZPFV.js.map} +1 -1
  47. package/dist/{chunk-3F4TXKDY.js → chunk-UUXWRDWW.js} +3 -3
  48. package/dist/chunk-UUXWRDWW.js.map +1 -0
  49. package/dist/{chunk-7GPDNQSX.js → chunk-V2AWSDDZ.js} +5 -5
  50. package/dist/{chunk-7GPDNQSX.js.map → chunk-V2AWSDDZ.js.map} +1 -1
  51. package/dist/{chunk-JQQ3FBN7.js → chunk-VCJF75T2.js} +3 -3
  52. package/dist/{chunk-JQQ3FBN7.js.map → chunk-VCJF75T2.js.map} +1 -1
  53. package/dist/{chunk-ZBW3BA5R.js → chunk-VMAGFYHG.js} +39 -4
  54. package/dist/chunk-VMAGFYHG.js.map +1 -0
  55. package/dist/{chunk-JZ774T7U.js → chunk-W3HMOOON.js} +3 -3
  56. package/dist/{chunk-JZ774T7U.js.map → chunk-W3HMOOON.js.map} +1 -1
  57. package/dist/{chunk-6AD6KCVB.js → chunk-WAKKQROH.js} +3 -3
  58. package/dist/{chunk-6AD6KCVB.js.map → chunk-WAKKQROH.js.map} +1 -1
  59. package/dist/{chunk-LVWNMQGR.js → chunk-WDNDTSNX.js} +5 -5
  60. package/dist/{chunk-LVWNMQGR.js.map → chunk-WDNDTSNX.js.map} +1 -1
  61. package/dist/chunk-WOF67PKT.js +60 -0
  62. package/dist/chunk-WOF67PKT.js.map +1 -0
  63. package/dist/{chunk-QJNV7YQP.js → chunk-WTNDPO2V.js} +39 -4
  64. package/dist/chunk-WTNDPO2V.js.map +1 -0
  65. package/dist/chunk-XBNVKPJN.js +343 -0
  66. package/dist/chunk-XBNVKPJN.js.map +1 -0
  67. package/dist/{chunk-FEPTH5RV.js → chunk-XP55RZ3D.js} +3 -3
  68. package/dist/{chunk-FEPTH5RV.js.map → chunk-XP55RZ3D.js.map} +1 -1
  69. package/dist/{chunk-CCUXO2HN.js → chunk-Y4ZRSW35.js} +3 -3
  70. package/dist/{chunk-CCUXO2HN.js.map → chunk-Y4ZRSW35.js.map} +1 -1
  71. package/dist/client.cjs +948 -123
  72. package/dist/client.cjs.map +1 -1
  73. package/dist/client.d.cts +3 -0
  74. package/dist/client.d.ts +3 -0
  75. package/dist/client.js +42 -39
  76. package/dist/client.js.map +1 -1
  77. package/dist/components/Accordion/index.js +2 -2
  78. package/dist/components/Alert/index.js +2 -2
  79. package/dist/components/AlertDialog/index.js +2 -2
  80. package/dist/components/Avatar/index.js +2 -2
  81. package/dist/components/Badge/index.js +2 -2
  82. package/dist/components/Box/index.js +4 -4
  83. package/dist/components/Breadcrumb/index.cjs +6 -3
  84. package/dist/components/Breadcrumb/index.cjs.map +1 -1
  85. package/dist/components/Breadcrumb/index.js +5 -5
  86. package/dist/components/Button/index.js +2 -2
  87. package/dist/components/Calendar/index.cjs +170 -35
  88. package/dist/components/Calendar/index.cjs.map +1 -1
  89. package/dist/components/Calendar/index.js +5 -5
  90. package/dist/components/Card/index.js +2 -2
  91. package/dist/components/Checkbox/index.cjs +36 -1
  92. package/dist/components/Checkbox/index.cjs.map +1 -1
  93. package/dist/components/Checkbox/index.d.cts +17 -1
  94. package/dist/components/Checkbox/index.d.ts +17 -1
  95. package/dist/components/Checkbox/index.js +2 -2
  96. package/dist/components/DatePicker/index.cjs +3875 -0
  97. package/dist/components/DatePicker/index.cjs.map +1 -0
  98. package/dist/components/DatePicker/index.d.cts +58 -0
  99. package/dist/components/DatePicker/index.d.ts +58 -0
  100. package/dist/components/DatePicker/index.js +14 -0
  101. package/dist/components/DatePicker/index.js.map +1 -0
  102. package/dist/components/Dialog/index.js +2 -2
  103. package/dist/components/Field/index.cjs +703 -0
  104. package/dist/components/Field/index.cjs.map +1 -0
  105. package/dist/components/Field/index.d.cts +51 -0
  106. package/dist/components/Field/index.d.ts +51 -0
  107. package/dist/components/Field/index.js +9 -0
  108. package/dist/components/Field/index.js.map +1 -0
  109. package/dist/components/FloatButton/index.cjs +6 -3
  110. package/dist/components/FloatButton/index.cjs.map +1 -1
  111. package/dist/components/FloatButton/index.js +5 -5
  112. package/dist/components/HStack/index.js +4 -4
  113. package/dist/components/InputGroup/index.cjs.map +1 -1
  114. package/dist/components/InputGroup/index.d.cts +8 -1
  115. package/dist/components/InputGroup/index.d.ts +8 -1
  116. package/dist/components/InputGroup/index.js +2 -2
  117. package/dist/components/Label/index.cjs +458 -0
  118. package/dist/components/Label/index.cjs.map +1 -0
  119. package/dist/components/Label/index.d.cts +14 -0
  120. package/dist/components/Label/index.d.ts +14 -0
  121. package/dist/components/Label/index.js +8 -0
  122. package/dist/components/Label/index.js.map +1 -0
  123. package/dist/components/Pagination/index.cjs +21 -6
  124. package/dist/components/Pagination/index.cjs.map +1 -1
  125. package/dist/components/Pagination/index.js +5 -5
  126. package/dist/components/Popover/index.js +2 -2
  127. package/dist/components/Progress/index.js +2 -2
  128. package/dist/components/Radio/index.cjs +18 -2
  129. package/dist/components/Radio/index.cjs.map +1 -1
  130. package/dist/components/Radio/index.d.cts +17 -1
  131. package/dist/components/Radio/index.d.ts +17 -1
  132. package/dist/components/Radio/index.js +2 -2
  133. package/dist/components/SegmentedControl/index.js +2 -2
  134. package/dist/components/Select/index.cjs +15 -3
  135. package/dist/components/Select/index.cjs.map +1 -1
  136. package/dist/components/Select/index.d.cts +6 -0
  137. package/dist/components/Select/index.d.ts +6 -0
  138. package/dist/components/Select/index.js +2 -2
  139. package/dist/components/Switch/index.cjs +36 -1
  140. package/dist/components/Switch/index.cjs.map +1 -1
  141. package/dist/components/Switch/index.d.cts +17 -1
  142. package/dist/components/Switch/index.d.ts +17 -1
  143. package/dist/components/Switch/index.js +2 -2
  144. package/dist/components/Tabs/index.js +2 -2
  145. package/dist/components/Text/index.js +2 -2
  146. package/dist/components/TextArea/index.cjs +35 -84
  147. package/dist/components/TextArea/index.cjs.map +1 -1
  148. package/dist/components/TextArea/index.js +3 -3
  149. package/dist/components/TextInput/index.cjs +35 -84
  150. package/dist/components/TextInput/index.cjs.map +1 -1
  151. package/dist/components/TextInput/index.d.cts +7 -8
  152. package/dist/components/TextInput/index.d.ts +7 -8
  153. package/dist/components/TextInput/index.js +2 -2
  154. package/dist/components/Toggle/index.js +2 -2
  155. package/dist/components/Tooltip/index.js +2 -2
  156. package/dist/components/VStack/index.js +4 -4
  157. package/dist/i18n/index.cjs +6 -3
  158. package/dist/i18n/index.cjs.map +1 -1
  159. package/dist/i18n/index.js +1 -1
  160. package/dist/index.cjs +948 -123
  161. package/dist/index.cjs.map +1 -1
  162. package/dist/index.d.cts +3 -0
  163. package/dist/index.d.ts +3 -0
  164. package/dist/index.js +39 -36
  165. package/package.json +8 -1
  166. package/dist/chunk-3F4TXKDY.js.map +0 -1
  167. package/dist/chunk-FT2XBBQJ.js.map +0 -1
  168. package/dist/chunk-IKLA2CVQ.js.map +0 -1
  169. package/dist/chunk-QJNV7YQP.js.map +0 -1
  170. package/dist/chunk-X7APG7G2.js.map +0 -1
  171. package/dist/chunk-ZBW3BA5R.js.map +0 -1
  172. package/dist/chunk-ZQMNGPLE.js.map +0 -1
  173. package/dist/chunk-ZRD4FQBT.js +0 -153
  174. package/dist/chunk-ZRD4FQBT.js.map +0 -1
package/dist/client.cjs CHANGED
@@ -68,8 +68,8 @@ var defaultDictionary = {
68
68
  // floatButton
69
69
  "floatButton.backToTop": "Back to top",
70
70
  // calendar
71
- "calendar.header.previous": "Previous",
72
- "calendar.header.next": "Next",
71
+ "calendar.header.previous": "Previous month",
72
+ "calendar.header.next": "Next month",
73
73
  "calendar.header.openMonthView": "Open month picker",
74
74
  "calendar.header.openYearView": "Open year picker",
75
75
  "calendar.header.openDayView": "Open day picker",
@@ -85,7 +85,10 @@ var defaultDictionary = {
85
85
  "checkbox.checked": "Checked",
86
86
  "checkbox.unchecked": "Unchecked",
87
87
  "switch.on": "On",
88
- "switch.off": "Off"
88
+ "switch.off": "Off",
89
+ // field
90
+ "field.requiredIndicator": "*",
91
+ "field.requiredLabel": "required"
89
92
  };
90
93
 
91
94
  // src/i18n/resolve.ts
@@ -3697,6 +3700,13 @@ var Button = /* @__PURE__ */ __name(({
3697
3700
  );
3698
3701
  }, "Button");
3699
3702
 
3703
+ // src/components/Calendar/scroll/ScrollBody.tsx
3704
+ var ScrollBody = /* @__PURE__ */ __name((_props) => {
3705
+ throw new Error(
3706
+ "[Calendar] ScrollBody: no platform implementation resolved. Ensure your bundler honors *.web.tsx / *.native.tsx extensions."
3707
+ );
3708
+ }, "ScrollBody");
3709
+
3700
3710
  // src/components/Calendar/state/locale-utils.ts
3701
3711
  var getFirstDayOfWeek = /* @__PURE__ */ __name((locale) => {
3702
3712
  try {
@@ -4058,9 +4068,15 @@ var Select = /* @__PURE__ */ __name((props) => {
4058
4068
  itemHeight = DEFAULT_ITEM_HEIGHT,
4059
4069
  maxMenuHeight = DEFAULT_MAX_MENU,
4060
4070
  className,
4061
- testID
4071
+ testID,
4072
+ id,
4073
+ name
4062
4074
  } = props;
4063
4075
  const ariaLabel = props["aria-label"];
4076
+ const ariaLabelledBy = props["aria-labelledby"];
4077
+ const ariaDescribedBy = props["aria-describedby"];
4078
+ const ariaInvalid = props["aria-invalid"];
4079
+ const ariaRequired = props["aria-required"];
4064
4080
  const multiple = props.multiple === true;
4065
4081
  const maxSelected = multiple ? props.maxSelected : void 0;
4066
4082
  const maxChips = multiple ? props.maxChips ?? 3 : void 0;
@@ -4424,11 +4440,11 @@ var Select = /* @__PURE__ */ __name((props) => {
4424
4440
  if (!open || searchable || reactNative.Platform.OS !== "web") {
4425
4441
  return;
4426
4442
  }
4427
- const id = requestAnimationFrame(() => {
4443
+ const id2 = requestAnimationFrame(() => {
4428
4444
  const node = popupRef.current;
4429
4445
  node?.focus?.();
4430
4446
  });
4431
- return () => cancelAnimationFrame(id);
4447
+ return () => cancelAnimationFrame(id2);
4432
4448
  }, [open, searchable]);
4433
4449
  const onListScroll = React.useCallback(
4434
4450
  (event) => {
@@ -4505,7 +4521,13 @@ var Select = /* @__PURE__ */ __name((props) => {
4505
4521
  "aria-controls": `${baseId}-listbox`,
4506
4522
  "aria-haspopup": "listbox",
4507
4523
  tabIndex: disabled ? -1 : 0,
4524
+ ...id !== void 0 ? { id, nativeID: id } : {},
4525
+ ...name !== void 0 ? { name } : {},
4508
4526
  ...ariaLabel !== void 0 ? { "aria-label": ariaLabel, accessibilityLabel: ariaLabel } : {},
4527
+ ...ariaLabelledBy !== void 0 ? { "aria-labelledby": ariaLabelledBy, accessibilityLabelledBy: ariaLabelledBy } : {},
4528
+ ...ariaDescribedBy !== void 0 ? { "aria-describedby": ariaDescribedBy, accessibilityDescribedBy: ariaDescribedBy } : {},
4529
+ ...ariaInvalid === true ? { "aria-invalid": true } : {},
4530
+ ...ariaRequired === true ? { "aria-required": true } : {},
4509
4531
  ...disabled ? { "aria-disabled": true, disabled: true } : {}
4510
4532
  },
4511
4533
  onPress: () => {
@@ -5179,7 +5201,7 @@ var Caption = /* @__PURE__ */ __name(({
5179
5201
  alignSelf: "center"
5180
5202
  },
5181
5203
  children: [
5182
- /* @__PURE__ */ jsxRuntime.jsx(NavButton, { label: t("calendar.header.previous", { defaultValue: "Previous" }), onPress: onPrev, children: "\u2039" }),
5204
+ /* @__PURE__ */ jsxRuntime.jsx(NavButton, { label: t("calendar.header.previous", { defaultValue: "Previous month" }), onPress: onPrev, children: "\u2039" }),
5183
5205
  /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: { flexDirection: "row", gap: monthGap, width: titleRowWidth }, children: showMultiTitles ? months.map((m, i) => /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: { width: gridWidth, alignItems: "center" }, children: caption === "dropdown" && view === "day" ? /* @__PURE__ */ jsxRuntime.jsx(
5184
5206
  DropdownPair,
5185
5207
  {
@@ -5225,7 +5247,7 @@ var Caption = /* @__PURE__ */ __name(({
5225
5247
  drilldown: true
5226
5248
  }
5227
5249
  ) }) }),
5228
- /* @__PURE__ */ jsxRuntime.jsx(NavButton, { label: t("calendar.header.next", { defaultValue: "Next" }), onPress: onNext, children: "\u203A" })
5250
+ /* @__PURE__ */ jsxRuntime.jsx(NavButton, { label: t("calendar.header.next", { defaultValue: "Next month" }), onPress: onNext, children: "\u203A" })
5229
5251
  ]
5230
5252
  }
5231
5253
  );
@@ -5268,8 +5290,53 @@ var DropdownPair = /* @__PURE__ */ __name(({ month, year, monthOptions, yearOpti
5268
5290
  ] });
5269
5291
  }, "DropdownPair");
5270
5292
  var CELL_SIZE = 40;
5271
- var DayCell = /* @__PURE__ */ __name(({ ctx, onPress, onHoverIn, onHoverOut, renderDay }) => {
5293
+ var formatterCache = /* @__PURE__ */ new Map();
5294
+ var RUNTIME_DEFAULT_LOCALE_KEY = "__default__";
5295
+ var getDayFormatter = /* @__PURE__ */ __name((locale) => {
5296
+ const key = locale ?? RUNTIME_DEFAULT_LOCALE_KEY;
5297
+ const cached2 = formatterCache.get(key);
5298
+ if (cached2) {
5299
+ return cached2;
5300
+ }
5301
+ try {
5302
+ const fmt = new Intl.DateTimeFormat(locale, {
5303
+ weekday: "long",
5304
+ month: "long",
5305
+ day: "numeric",
5306
+ year: "numeric",
5307
+ timeZone: "UTC"
5308
+ });
5309
+ formatterCache.set(key, fmt);
5310
+ return fmt;
5311
+ } catch {
5312
+ return null;
5313
+ }
5314
+ }, "getDayFormatter");
5315
+ var formatDayLabel = /* @__PURE__ */ __name((ctx, locale) => {
5316
+ const jsDate = new Date(Date.UTC(ctx.date.year, ctx.date.month - 1, ctx.date.day));
5317
+ const fmt = getDayFormatter(locale);
5318
+ const base = fmt ? fmt.format(jsDate) : (
5319
+ // Fallback if the runtime rejects the locale tag.
5320
+ `${ctx.date.month}/${ctx.date.day}/${ctx.date.year}`
5321
+ );
5322
+ const suffixes = [];
5323
+ if (ctx.isToday) {
5324
+ suffixes.push("today");
5325
+ }
5326
+ if (ctx.isSelected || ctx.isRangeStart || ctx.isRangeEnd) {
5327
+ suffixes.push("selected");
5328
+ }
5329
+ if (ctx.isInRange && !ctx.isRangeStart && !ctx.isRangeEnd) {
5330
+ suffixes.push("in range");
5331
+ }
5332
+ if (ctx.isUnavailable) {
5333
+ suffixes.push("unavailable");
5334
+ }
5335
+ return suffixes.length > 0 ? `${base}, ${suffixes.join(", ")}` : base;
5336
+ }, "formatDayLabel");
5337
+ var DayCell = /* @__PURE__ */ __name(({ ctx, onPress, onHoverIn, onHoverOut, renderDay, locale }) => {
5272
5338
  const colors = useThemeColors();
5339
+ const accessibilityLabel = formatDayLabel(ctx, locale);
5273
5340
  const isSelectedLike = ctx.isSelected || ctx.isRangeStart || ctx.isRangeEnd;
5274
5341
  const isInsideRange = ctx.isInRange || ctx.isInPreviewRange;
5275
5342
  const isRangeMiddle = isInsideRange && !isSelectedLike;
@@ -5278,7 +5345,8 @@ var DayCell = /* @__PURE__ */ __name(({ ctx, onPress, onHoverIn, onHoverOut, ren
5278
5345
  reactNative.Pressable,
5279
5346
  {
5280
5347
  accessibilityRole: "button",
5281
- accessibilityState: { disabled: ctx.isUnavailable },
5348
+ accessibilityLabel,
5349
+ accessibilityState: { disabled: ctx.isUnavailable, selected: isSelectedLike },
5282
5350
  disabled: ctx.isUnavailable,
5283
5351
  onPress,
5284
5352
  ...onHoverIn ? { onHoverIn } : {},
@@ -5536,6 +5604,7 @@ var DayGrid = /* @__PURE__ */ __name((props) => {
5536
5604
  DayCell,
5537
5605
  {
5538
5606
  ctx,
5607
+ locale,
5539
5608
  onPress: () => onDayPress(date),
5540
5609
  ...onDayHover ? {
5541
5610
  onHoverIn: /* @__PURE__ */ __name(() => onDayHover(date), "onHoverIn"),
@@ -5698,6 +5767,9 @@ var focusDayCell = /* @__PURE__ */ __name((root, date, force) => {
5698
5767
  if (!root) {
5699
5768
  return;
5700
5769
  }
5770
+ if (typeof document === "undefined" || typeof root.contains !== "function") {
5771
+ return;
5772
+ }
5701
5773
  if (!force && !root.contains(document.activeElement)) {
5702
5774
  return;
5703
5775
  }
@@ -5802,8 +5874,13 @@ var SingleOrMultiCalendar = /* @__PURE__ */ __name((props) => {
5802
5874
  const colors = useThemeColors();
5803
5875
  const firstDayOfWeek = props.firstDayOfWeek ?? getFirstDayOfWeek(locale);
5804
5876
  const weekendDays = props.weekendDays ?? getWeekendDays(locale);
5805
- const visibleMonths = pickVisibleMonths(props.visibleMonths, containerWidth);
5877
+ const visibleMonths = props.behavior === "scroll" ? 1 : pickVisibleMonths(props.visibleMonths, containerWidth);
5806
5878
  const { innerWidth, gridsRowWidth } = surfaceMetrics(visibleMonths);
5879
+ React.useEffect(() => {
5880
+ if (process.env.NODE_ENV !== "production" && props.behavior === "scroll" && typeof props.visibleMonths === "number" && props.visibleMonths > 1) {
5881
+ console.warn('[Calendar] visibleMonths is ignored when behavior="scroll"; falling back to single column.');
5882
+ }
5883
+ }, [props.behavior, props.visibleMonths]);
5807
5884
  const containerRef = React.useRef(null);
5808
5885
  const state = useCalendarState({
5809
5886
  ...props.mode !== void 0 ? { mode: props.mode } : {},
@@ -5866,6 +5943,8 @@ var SingleOrMultiCalendar = /* @__PURE__ */ __name((props) => {
5866
5943
  setAnchor((a) => a.add({ years: -10 }));
5867
5944
  } else if (state.view === "month") {
5868
5945
  setAnchor((a) => a.add({ years: -1 }));
5946
+ } else if (props.behavior === "scroll") {
5947
+ state.moveFocus({ months: -1 });
5869
5948
  } else {
5870
5949
  setAnchor((a) => a.add({ months: -1 }));
5871
5950
  }
@@ -5875,6 +5954,8 @@ var SingleOrMultiCalendar = /* @__PURE__ */ __name((props) => {
5875
5954
  setAnchor((a) => a.add({ years: 10 }));
5876
5955
  } else if (state.view === "month") {
5877
5956
  setAnchor((a) => a.add({ years: 1 }));
5957
+ } else if (props.behavior === "scroll") {
5958
+ state.moveFocus({ months: 1 });
5878
5959
  } else {
5879
5960
  setAnchor((a) => a.add({ months: 1 }));
5880
5961
  }
@@ -5937,22 +6018,44 @@ var SingleOrMultiCalendar = /* @__PURE__ */ __name((props) => {
5937
6018
  }
5938
6019
  ),
5939
6020
  /* @__PURE__ */ jsxRuntime.jsxs(FadeIn, { children: [
5940
- state.view === "day" && /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: { flexDirection: "row", gap: MONTH_GAP, alignSelf: "center", width: gridsRowWidth }, children: months.map((m) => /* @__PURE__ */ jsxRuntime.jsx(
5941
- DayGrid,
6021
+ state.view === "day" && (props.behavior === "scroll" ? /* @__PURE__ */ jsxRuntime.jsx(
6022
+ ScrollBody,
5942
6023
  {
5943
- visibleMonth: m,
5944
- locale,
5945
6024
  mode: props.mode ?? "single",
5946
- value: state.value,
6025
+ locale,
5947
6026
  focusedDate: state.focusedDate,
5948
- isUnavailable: state.isUnavailable,
5949
- weekendDays,
6027
+ onFocusedMonthChange: (next) => setAnchor(next),
6028
+ value: state.value,
6029
+ onSelectDate: (date) => state.selectDate(date, "click"),
5950
6030
  firstDayOfWeek,
5951
- onDayPress: (date) => state.selectDate(date, "click"),
6031
+ weekendDays,
6032
+ ...props.minValue !== void 0 ? { minValue: props.minValue } : {},
6033
+ ...props.maxValue !== void 0 ? { maxValue: props.maxValue } : {},
6034
+ ...props.isDateUnavailable !== void 0 ? { isDateUnavailable: props.isDateUnavailable } : {},
5952
6035
  ...renderDay ? { renderDay } : {}
5953
- },
5954
- `${m.year}-${m.month}`
5955
- )) }),
6036
+ }
6037
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
6038
+ reactNative.View,
6039
+ {
6040
+ style: { flexDirection: "row", gap: MONTH_GAP, alignSelf: "center", width: gridsRowWidth },
6041
+ children: months.map((m) => /* @__PURE__ */ jsxRuntime.jsx(
6042
+ DayGrid,
6043
+ {
6044
+ visibleMonth: m,
6045
+ locale,
6046
+ mode: props.mode ?? "single",
6047
+ value: state.value,
6048
+ focusedDate: state.focusedDate,
6049
+ isUnavailable: state.isUnavailable,
6050
+ weekendDays,
6051
+ firstDayOfWeek,
6052
+ onDayPress: (date) => state.selectDate(date, "click"),
6053
+ ...renderDay ? { renderDay } : {}
6054
+ },
6055
+ `${m.year}-${m.month}`
6056
+ ))
6057
+ }
6058
+ )),
5956
6059
  state.view === "month" && /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: { alignItems: "center" }, children: /* @__PURE__ */ jsxRuntime.jsx(
5957
6060
  MonthGrid,
5958
6061
  {
@@ -5987,8 +6090,13 @@ var RangeCalendar = /* @__PURE__ */ __name((props) => {
5987
6090
  const colors = useThemeColors();
5988
6091
  const firstDayOfWeek = props.firstDayOfWeek ?? getFirstDayOfWeek(locale);
5989
6092
  const weekendDays = props.weekendDays ?? getWeekendDays(locale);
5990
- const visibleMonths = pickVisibleMonths(props.visibleMonths, containerWidth);
6093
+ const visibleMonths = props.behavior === "scroll" ? 1 : pickVisibleMonths(props.visibleMonths, containerWidth);
5991
6094
  const { innerWidth, gridsRowWidth } = surfaceMetrics(visibleMonths);
6095
+ React.useEffect(() => {
6096
+ if (process.env.NODE_ENV !== "production" && props.behavior === "scroll" && typeof props.visibleMonths === "number" && props.visibleMonths > 1) {
6097
+ console.warn('[Calendar] visibleMonths is ignored when behavior="scroll"; falling back to single column.');
6098
+ }
6099
+ }, [props.behavior, props.visibleMonths]);
5992
6100
  const containerRef = React.useRef(null);
5993
6101
  const range2 = useRangeState({
5994
6102
  ...props.value !== void 0 ? { value: props.value } : {},
@@ -6066,6 +6174,8 @@ var RangeCalendar = /* @__PURE__ */ __name((props) => {
6066
6174
  setAnchor((a) => a.add({ years: -10 }));
6067
6175
  } else if (view === "month") {
6068
6176
  setAnchor((a) => a.add({ years: -1 }));
6177
+ } else if (props.behavior === "scroll") {
6178
+ setFocusedDate((f) => f.add({ months: -1 }));
6069
6179
  } else {
6070
6180
  setAnchor((a) => a.add({ months: -1 }));
6071
6181
  }
@@ -6075,6 +6185,8 @@ var RangeCalendar = /* @__PURE__ */ __name((props) => {
6075
6185
  setAnchor((a) => a.add({ years: 10 }));
6076
6186
  } else if (view === "month") {
6077
6187
  setAnchor((a) => a.add({ years: 1 }));
6188
+ } else if (props.behavior === "scroll") {
6189
+ setFocusedDate((f) => f.add({ months: 1 }));
6078
6190
  } else {
6079
6191
  setAnchor((a) => a.add({ months: 1 }));
6080
6192
  }
@@ -6145,24 +6257,47 @@ var RangeCalendar = /* @__PURE__ */ __name((props) => {
6145
6257
  }
6146
6258
  ),
6147
6259
  /* @__PURE__ */ jsxRuntime.jsxs(FadeIn, { children: [
6148
- view === "day" && /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: { flexDirection: "row", gap: MONTH_GAP, alignSelf: "center", width: gridsRowWidth }, children: months.map((m) => /* @__PURE__ */ jsxRuntime.jsx(
6149
- DayGrid,
6260
+ view === "day" && (props.behavior === "scroll" ? /* @__PURE__ */ jsxRuntime.jsx(
6261
+ ScrollBody,
6150
6262
  {
6151
- visibleMonth: m,
6152
- locale,
6153
6263
  mode: "range",
6264
+ locale,
6265
+ focusedDate,
6266
+ onFocusedMonthChange: (next) => setAnchor(next),
6154
6267
  value: range2.value,
6155
6268
  previewRange: range2.previewRange,
6156
- focusedDate,
6157
- isUnavailable: range2.isUnavailable,
6158
- weekendDays,
6269
+ onSelectDate: (date) => range2.selectDate(date),
6159
6270
  firstDayOfWeek,
6160
- onDayPress: (date) => range2.selectDate(date),
6161
- onDayHover: (date) => range2.setHoveredDate(date),
6271
+ weekendDays,
6272
+ ...props.minValue !== void 0 ? { minValue: props.minValue } : {},
6273
+ ...props.maxValue !== void 0 ? { maxValue: props.maxValue } : {},
6274
+ ...props.isDateUnavailable !== void 0 ? { isDateUnavailable: props.isDateUnavailable } : {},
6162
6275
  ...renderDay ? { renderDay } : {}
6163
- },
6164
- `${m.year}-${m.month}`
6165
- )) }),
6276
+ }
6277
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
6278
+ reactNative.View,
6279
+ {
6280
+ style: { flexDirection: "row", gap: MONTH_GAP, alignSelf: "center", width: gridsRowWidth },
6281
+ children: months.map((m) => /* @__PURE__ */ jsxRuntime.jsx(
6282
+ DayGrid,
6283
+ {
6284
+ visibleMonth: m,
6285
+ locale,
6286
+ mode: "range",
6287
+ value: range2.value,
6288
+ previewRange: range2.previewRange,
6289
+ focusedDate,
6290
+ isUnavailable: range2.isUnavailable,
6291
+ weekendDays,
6292
+ firstDayOfWeek,
6293
+ onDayPress: (date) => range2.selectDate(date),
6294
+ onDayHover: (date) => range2.setHoveredDate(date),
6295
+ ...renderDay ? { renderDay } : {}
6296
+ },
6297
+ `${m.year}-${m.month}`
6298
+ ))
6299
+ }
6300
+ )),
6166
6301
  view === "month" && /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: { alignItems: "center" }, children: /* @__PURE__ */ jsxRuntime.jsx(
6167
6302
  MonthGrid,
6168
6303
  {
@@ -6350,7 +6485,15 @@ var Checkbox = /* @__PURE__ */ __name(({
6350
6485
  className,
6351
6486
  testID,
6352
6487
  asChild,
6353
- children
6488
+ children,
6489
+ id,
6490
+ name,
6491
+ "aria-labelledby": ariaLabelledBy,
6492
+ accessibilityLabelledBy,
6493
+ "aria-describedby": ariaDescribedBy,
6494
+ accessibilityDescribedBy,
6495
+ "aria-invalid": ariaInvalid,
6496
+ "aria-required": ariaRequired
6354
6497
  }) => {
6355
6498
  const colors = useThemeColors();
6356
6499
  const [inner, setInner] = React.useState(defaultChecked);
@@ -6378,6 +6521,13 @@ var Checkbox = /* @__PURE__ */ __name(({
6378
6521
  accessibilityState: { checked: value, disabled: Boolean(disabled) },
6379
6522
  testID
6380
6523
  };
6524
+ if (id !== void 0) {
6525
+ commonProps.id = id;
6526
+ commonProps.nativeID = id;
6527
+ }
6528
+ if (name !== void 0) {
6529
+ commonProps.name = name;
6530
+ }
6381
6531
  if (disabled) {
6382
6532
  commonProps["aria-disabled"] = true;
6383
6533
  }
@@ -6385,6 +6535,26 @@ var Checkbox = /* @__PURE__ */ __name(({
6385
6535
  commonProps["aria-label"] = label;
6386
6536
  commonProps.accessibilityLabel = label;
6387
6537
  }
6538
+ if (ariaLabelledBy !== void 0) {
6539
+ commonProps["aria-labelledby"] = ariaLabelledBy;
6540
+ commonProps.accessibilityLabelledBy = ariaLabelledBy;
6541
+ }
6542
+ if (accessibilityLabelledBy !== void 0) {
6543
+ commonProps.accessibilityLabelledBy = accessibilityLabelledBy;
6544
+ }
6545
+ if (ariaDescribedBy !== void 0) {
6546
+ commonProps["aria-describedby"] = ariaDescribedBy;
6547
+ commonProps.accessibilityDescribedBy = ariaDescribedBy;
6548
+ }
6549
+ if (accessibilityDescribedBy !== void 0) {
6550
+ commonProps.accessibilityDescribedBy = accessibilityDescribedBy;
6551
+ }
6552
+ if (ariaInvalid) {
6553
+ commonProps["aria-invalid"] = true;
6554
+ }
6555
+ if (ariaRequired) {
6556
+ commonProps["aria-required"] = true;
6557
+ }
6388
6558
  if (asChild) {
6389
6559
  const slotProps = {
6390
6560
  role: "checkbox",
@@ -6441,6 +6611,334 @@ var Checkbox = /* @__PURE__ */ __name(({
6441
6611
  }
6442
6612
  );
6443
6613
  }, "Checkbox");
6614
+ function formatDate(date$1, locale) {
6615
+ try {
6616
+ return new Intl.DateTimeFormat(locale, { dateStyle: "medium" }).format(date$1.toDate(date.getLocalTimeZone()));
6617
+ } catch {
6618
+ return `${date$1.year}-${String(date$1.month).padStart(2, "0")}-${String(date$1.day).padStart(2, "0")}`;
6619
+ }
6620
+ }
6621
+ __name(formatDate, "formatDate");
6622
+ function CalendarIcon({ size = 16, color = "currentColor" }) {
6623
+ const colors = useThemeColors();
6624
+ if (reactNative.Platform.OS === "web") {
6625
+ return /* @__PURE__ */ jsxRuntime.jsx(
6626
+ "svg",
6627
+ {
6628
+ width: size,
6629
+ height: size,
6630
+ viewBox: "0 0 24 24",
6631
+ fill: "none",
6632
+ stroke: color,
6633
+ strokeWidth: "2",
6634
+ strokeLinecap: "round",
6635
+ strokeLinejoin: "round",
6636
+ "aria-hidden": "true",
6637
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 2v4M16 2v4M3 10h18M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z" })
6638
+ }
6639
+ );
6640
+ }
6641
+ const resolvedColor = color === "currentColor" ? colors.semantic.text.muted : color;
6642
+ return /* @__PURE__ */ jsxRuntime.jsx(
6643
+ reactNative.Text,
6644
+ {
6645
+ accessibilityElementsHidden: true,
6646
+ importantForAccessibility: "no-hide-descendants",
6647
+ style: { fontSize: size, lineHeight: size, color: resolvedColor },
6648
+ children: "\u{1F4C5}"
6649
+ }
6650
+ );
6651
+ }
6652
+ __name(CalendarIcon, "CalendarIcon");
6653
+ function buildCalendarOptional(minValue, maxValue, isDateUnavailable, firstDayOfWeek) {
6654
+ const out = {};
6655
+ if (minValue !== void 0) {
6656
+ out.minValue = minValue;
6657
+ }
6658
+ if (maxValue !== void 0) {
6659
+ out.maxValue = maxValue;
6660
+ }
6661
+ if (isDateUnavailable !== void 0) {
6662
+ out.isDateUnavailable = isDateUnavailable;
6663
+ }
6664
+ if (firstDayOfWeek !== void 0) {
6665
+ out.firstDayOfWeek = firstDayOfWeek;
6666
+ }
6667
+ return out;
6668
+ }
6669
+ __name(buildCalendarOptional, "buildCalendarOptional");
6670
+ function buildTriggerAriaProps(ariaProps) {
6671
+ const out = {};
6672
+ if (ariaProps["aria-labelledby"] !== void 0) {
6673
+ out["aria-labelledby"] = ariaProps["aria-labelledby"];
6674
+ }
6675
+ if (ariaProps["aria-describedby"] !== void 0) {
6676
+ out["aria-describedby"] = ariaProps["aria-describedby"];
6677
+ }
6678
+ if (ariaProps["aria-invalid"] !== void 0) {
6679
+ out["aria-invalid"] = ariaProps["aria-invalid"];
6680
+ }
6681
+ if (ariaProps["aria-required"] !== void 0) {
6682
+ out["aria-required"] = ariaProps["aria-required"];
6683
+ }
6684
+ return out;
6685
+ }
6686
+ __name(buildTriggerAriaProps, "buildTriggerAriaProps");
6687
+ var DatePickerRoot = /* @__PURE__ */ __name(({
6688
+ value,
6689
+ defaultValue: defaultValue2,
6690
+ onChange,
6691
+ locale: localeProp,
6692
+ minValue,
6693
+ maxValue,
6694
+ isDateUnavailable,
6695
+ firstDayOfWeek,
6696
+ placeholder,
6697
+ disabled = false,
6698
+ id,
6699
+ name: _name,
6700
+ className,
6701
+ testID,
6702
+ ...ariaProps
6703
+ }) => {
6704
+ const providerLocale = useLocale();
6705
+ const locale = localeProp ?? providerLocale;
6706
+ const [open, setOpen] = React.useState(false);
6707
+ const isControlled = value !== void 0;
6708
+ const [inner, setInner] = React.useState(defaultValue2 ?? null);
6709
+ const current = isControlled ? value ?? null : inner;
6710
+ const handleChange = React.useCallback(
6711
+ (date) => {
6712
+ if (!isControlled) {
6713
+ setInner(date);
6714
+ }
6715
+ onChange?.(date);
6716
+ setOpen(false);
6717
+ },
6718
+ [isControlled, onChange]
6719
+ );
6720
+ const handleOpenChange = React.useCallback(
6721
+ (next) => {
6722
+ if (!disabled) {
6723
+ setOpen(next);
6724
+ }
6725
+ },
6726
+ [disabled]
6727
+ );
6728
+ const displayValue = current ? formatDate(current, locale) : null;
6729
+ const calendarOptional = buildCalendarOptional(minValue, maxValue, isDateUnavailable, firstDayOfWeek);
6730
+ const triggerAriaProps = buildTriggerAriaProps(ariaProps);
6731
+ const colors = useThemeColors();
6732
+ const hasError = ariaProps["aria-invalid"] === true || ariaProps["aria-invalid"] === "true";
6733
+ const pressableStyle = {
6734
+ flexDirection: "row",
6735
+ alignItems: "center",
6736
+ borderWidth: 1,
6737
+ borderRadius: px(colors.radius.md),
6738
+ paddingHorizontal: px(colors.spacing["3"]),
6739
+ paddingVertical: px(colors.spacing["2"]),
6740
+ backgroundColor: colors.semantic.background.elevated,
6741
+ borderColor: hasError ? colors.color.danger : colors.semantic.border.default,
6742
+ opacity: disabled ? 0.6 : 1
6743
+ };
6744
+ const textStyle = {
6745
+ flex: 1,
6746
+ fontFamily: colors.fontFamily.body,
6747
+ fontSize: px(colors.fontSize.md),
6748
+ color: displayValue ? colors.semantic.text.default : colors.semantic.text.muted
6749
+ };
6750
+ const triggerExtraProps = {
6751
+ role: "combobox",
6752
+ accessibilityRole: "button",
6753
+ "aria-haspopup": "dialog",
6754
+ "aria-expanded": open,
6755
+ ...triggerAriaProps
6756
+ };
6757
+ if (id !== void 0) {
6758
+ triggerExtraProps.id = id;
6759
+ triggerExtraProps.nativeID = id;
6760
+ }
6761
+ if (testID !== void 0) {
6762
+ triggerExtraProps.testID = testID;
6763
+ }
6764
+ if (hasError) {
6765
+ triggerExtraProps["aria-invalid"] = true;
6766
+ }
6767
+ if (ariaProps["aria-required"]) {
6768
+ triggerExtraProps["aria-required"] = true;
6769
+ }
6770
+ if (disabled) {
6771
+ triggerExtraProps["aria-disabled"] = true;
6772
+ }
6773
+ return /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: handleOpenChange, children: [
6774
+ /* @__PURE__ */ jsxRuntime.jsx(Popover.Trigger, { asChild: false, className: cn(className), children: /* @__PURE__ */ jsxRuntime.jsxs(
6775
+ reactNative.Pressable,
6776
+ {
6777
+ onPress: disabled ? void 0 : () => setOpen(!open),
6778
+ disabled,
6779
+ className: cn(
6780
+ "flex-row items-center rounded-md border px-3 py-2",
6781
+ hasError ? "border-semantic-interactive-destructive" : "border-semantic-border-default",
6782
+ disabled ? "opacity-60" : void 0,
6783
+ className
6784
+ ),
6785
+ style: pressableStyle,
6786
+ ...triggerExtraProps,
6787
+ children: [
6788
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: textStyle, numberOfLines: 1, children: displayValue ?? placeholder ?? "" }),
6789
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: { marginLeft: px(colors.spacing["2"]) }, children: /* @__PURE__ */ jsxRuntime.jsx(CalendarIcon, { size: 16, color: colors.semantic.text.muted }) })
6790
+ ]
6791
+ }
6792
+ ) }),
6793
+ /* @__PURE__ */ jsxRuntime.jsx(Popover.Content, { "aria-label": "Date picker", side: "bottom", align: "start", children: /* @__PURE__ */ jsxRuntime.jsx(
6794
+ Calendar,
6795
+ {
6796
+ mode: "single",
6797
+ value: current,
6798
+ onChange: (date) => {
6799
+ handleChange(date);
6800
+ },
6801
+ locale,
6802
+ ...calendarOptional
6803
+ }
6804
+ ) })
6805
+ ] });
6806
+ }, "DatePickerRoot");
6807
+ var DatePickerRange = /* @__PURE__ */ __name(({
6808
+ value,
6809
+ defaultValue: defaultValue2,
6810
+ onChange,
6811
+ locale: localeProp,
6812
+ minValue,
6813
+ maxValue,
6814
+ isDateUnavailable,
6815
+ firstDayOfWeek,
6816
+ placeholder,
6817
+ disabled = false,
6818
+ id,
6819
+ name: _name,
6820
+ className,
6821
+ testID,
6822
+ ...ariaProps
6823
+ }) => {
6824
+ const providerLocale = useLocale();
6825
+ const locale = localeProp ?? providerLocale;
6826
+ const [open, setOpen] = React.useState(false);
6827
+ const isControlled = value !== void 0;
6828
+ const [inner, setInner] = React.useState(defaultValue2 ?? { start: null, end: null });
6829
+ const current = isControlled ? value ?? { start: null, end: null } : inner;
6830
+ const calendarValue = current.start !== null ? { start: current.start, end: current.end } : null;
6831
+ const handleChange = React.useCallback(
6832
+ (calRange) => {
6833
+ const next = {
6834
+ start: calRange?.start ?? null,
6835
+ end: calRange?.end ?? null
6836
+ };
6837
+ if (!isControlled) {
6838
+ setInner(next);
6839
+ }
6840
+ onChange?.(next);
6841
+ if (next.start !== null && next.end !== null) {
6842
+ setOpen(false);
6843
+ }
6844
+ },
6845
+ [isControlled, onChange]
6846
+ );
6847
+ const handleOpenChange = React.useCallback(
6848
+ (next) => {
6849
+ if (!disabled) {
6850
+ setOpen(next);
6851
+ }
6852
+ },
6853
+ [disabled]
6854
+ );
6855
+ let displayValue = null;
6856
+ if (current.start !== null) {
6857
+ const startStr = formatDate(current.start, locale);
6858
+ const endStr = current.end !== null ? formatDate(current.end, locale) : "";
6859
+ displayValue = `${startStr} \u2013 ${endStr}`;
6860
+ }
6861
+ const calendarOptional = buildCalendarOptional(minValue, maxValue, isDateUnavailable, firstDayOfWeek);
6862
+ const triggerAriaProps = buildTriggerAriaProps(ariaProps);
6863
+ const colors = useThemeColors();
6864
+ const hasError = ariaProps["aria-invalid"] === true || ariaProps["aria-invalid"] === "true";
6865
+ const pressableStyle = {
6866
+ flexDirection: "row",
6867
+ alignItems: "center",
6868
+ borderWidth: 1,
6869
+ borderRadius: px(colors.radius.md),
6870
+ paddingHorizontal: px(colors.spacing["3"]),
6871
+ paddingVertical: px(colors.spacing["2"]),
6872
+ backgroundColor: colors.semantic.background.elevated,
6873
+ borderColor: hasError ? colors.color.danger : colors.semantic.border.default,
6874
+ opacity: disabled ? 0.6 : 1
6875
+ };
6876
+ const textStyle = {
6877
+ flex: 1,
6878
+ fontFamily: colors.fontFamily.body,
6879
+ fontSize: px(colors.fontSize.md),
6880
+ color: displayValue ? colors.semantic.text.default : colors.semantic.text.muted
6881
+ };
6882
+ const triggerExtraProps = {
6883
+ role: "combobox",
6884
+ accessibilityRole: "button",
6885
+ "aria-haspopup": "dialog",
6886
+ "aria-expanded": open,
6887
+ ...triggerAriaProps
6888
+ };
6889
+ if (id !== void 0) {
6890
+ triggerExtraProps.id = id;
6891
+ triggerExtraProps.nativeID = id;
6892
+ }
6893
+ if (testID !== void 0) {
6894
+ triggerExtraProps.testID = testID;
6895
+ }
6896
+ if (hasError) {
6897
+ triggerExtraProps["aria-invalid"] = true;
6898
+ }
6899
+ if (ariaProps["aria-required"]) {
6900
+ triggerExtraProps["aria-required"] = true;
6901
+ }
6902
+ if (disabled) {
6903
+ triggerExtraProps["aria-disabled"] = true;
6904
+ }
6905
+ return /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: handleOpenChange, children: [
6906
+ /* @__PURE__ */ jsxRuntime.jsx(Popover.Trigger, { asChild: false, className: cn(className), children: /* @__PURE__ */ jsxRuntime.jsxs(
6907
+ reactNative.Pressable,
6908
+ {
6909
+ onPress: disabled ? void 0 : () => setOpen(!open),
6910
+ disabled,
6911
+ className: cn(
6912
+ "flex-row items-center rounded-md border px-3 py-2",
6913
+ hasError ? "border-semantic-interactive-destructive" : "border-semantic-border-default",
6914
+ disabled ? "opacity-60" : void 0,
6915
+ className
6916
+ ),
6917
+ style: pressableStyle,
6918
+ ...triggerExtraProps,
6919
+ children: [
6920
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: textStyle, numberOfLines: 1, children: displayValue ?? placeholder ?? "" }),
6921
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: { marginLeft: px(colors.spacing["2"]) }, children: /* @__PURE__ */ jsxRuntime.jsx(CalendarIcon, { size: 16, color: colors.semantic.text.muted }) })
6922
+ ]
6923
+ }
6924
+ ) }),
6925
+ /* @__PURE__ */ jsxRuntime.jsx(Popover.Content, { "aria-label": "Date range picker", side: "bottom", align: "start", children: /* @__PURE__ */ jsxRuntime.jsx(
6926
+ Calendar,
6927
+ {
6928
+ mode: "range",
6929
+ value: calendarValue,
6930
+ onChange: (range2) => {
6931
+ handleChange(range2);
6932
+ },
6933
+ locale,
6934
+ ...calendarOptional
6935
+ }
6936
+ ) })
6937
+ ] });
6938
+ }, "DatePickerRange");
6939
+ var DatePicker = Object.assign(DatePickerRoot, {
6940
+ Range: DatePickerRange
6941
+ });
6444
6942
  var DialogContext = React.createContext(null);
6445
6943
  var useDialogContext = /* @__PURE__ */ __name((label) => {
6446
6944
  const ctx = React.useContext(DialogContext);
@@ -6853,6 +7351,279 @@ var Dialog = Object.assign(DialogRoot, {
6853
7351
  Footer: DialogFooter,
6854
7352
  Close: DialogClose
6855
7353
  });
7354
+ var FieldContext = React.createContext(null);
7355
+ var useFieldContextStrict = /* @__PURE__ */ __name((caller) => {
7356
+ const ctx = React.useContext(FieldContext);
7357
+ if (!ctx) {
7358
+ throw new Error(`[Field] ${caller} must be used inside <Field> or <Field.Group>.`);
7359
+ }
7360
+ return ctx;
7361
+ }, "useFieldContextStrict");
7362
+ var childHasDisplayName = /* @__PURE__ */ __name((child, name) => {
7363
+ if (!React.isValidElement(child)) {
7364
+ return false;
7365
+ }
7366
+ const t = child.type;
7367
+ return typeof t !== "string" && t?.displayName === name;
7368
+ }, "childHasDisplayName");
7369
+ var COMPOUND_DISPLAY_NAMES = ["Field.Label", "Field.Description", "Field.Error", "Field.Control"];
7370
+ var isCompoundChild = /* @__PURE__ */ __name((child) => COMPOUND_DISPLAY_NAMES.some((name) => childHasDisplayName(child, name)), "isCompoundChild");
7371
+ var FieldRoot = /* @__PURE__ */ __name(({
7372
+ name,
7373
+ required = false,
7374
+ disabled = false,
7375
+ error = null,
7376
+ label,
7377
+ description,
7378
+ validating = false,
7379
+ orientation = "vertical",
7380
+ id,
7381
+ children,
7382
+ className,
7383
+ testID,
7384
+ isGroup = false
7385
+ }) => {
7386
+ const colors = useThemeColors();
7387
+ const reactId = React.useId();
7388
+ const fieldId = id ?? `nori-ui-field-${reactId}`;
7389
+ const labelId = `${fieldId}-label`;
7390
+ const descriptionId = `${fieldId}-desc`;
7391
+ const errorId = `${fieldId}-error`;
7392
+ const isCompoundMode = React.useMemo(() => {
7393
+ let found = false;
7394
+ React.Children.forEach(children, (child) => {
7395
+ if (isCompoundChild(child)) {
7396
+ found = true;
7397
+ }
7398
+ });
7399
+ return found;
7400
+ }, [children]);
7401
+ const hasDescription = React.useMemo(() => {
7402
+ if (!isCompoundMode) {
7403
+ return description !== void 0 && description !== null && description !== false && description !== "";
7404
+ }
7405
+ let found = false;
7406
+ React.Children.forEach(children, (child) => {
7407
+ if (childHasDisplayName(child, "Field.Description")) {
7408
+ found = true;
7409
+ }
7410
+ });
7411
+ return found;
7412
+ }, [isCompoundMode, description, children]);
7413
+ const hasError = React.useMemo(() => {
7414
+ if (!isCompoundMode) {
7415
+ return Boolean(error);
7416
+ }
7417
+ let found = false;
7418
+ React.Children.forEach(children, (child) => {
7419
+ if (childHasDisplayName(child, "Field.Error") && React.isValidElement(child)) {
7420
+ const el = child;
7421
+ if (el.props.children !== void 0 && el.props.children !== null && el.props.children !== false && el.props.children !== "") {
7422
+ found = true;
7423
+ }
7424
+ }
7425
+ });
7426
+ if (!found && error !== null && error !== void 0 && error !== false && error !== "") {
7427
+ found = true;
7428
+ }
7429
+ return found;
7430
+ }, [isCompoundMode, error, children]);
7431
+ const describedBy = React.useMemo(() => {
7432
+ const ids = [];
7433
+ if (hasDescription) {
7434
+ ids.push(descriptionId);
7435
+ }
7436
+ if (hasError) {
7437
+ ids.push(errorId);
7438
+ }
7439
+ return ids.length === 0 ? void 0 : ids.join(" ");
7440
+ }, [hasDescription, hasError, descriptionId, errorId]);
7441
+ const value = {
7442
+ fieldId,
7443
+ labelId,
7444
+ descriptionId,
7445
+ errorId,
7446
+ hasError,
7447
+ hasDescription,
7448
+ describedBy,
7449
+ disabled,
7450
+ required,
7451
+ validating,
7452
+ ...name !== void 0 ? { name } : {},
7453
+ // In compound mode pass `error` (string) so Field.Error can fall back to it.
7454
+ // In shorthand mode the error prop may be ReactNode; only pass when it is a string/null.
7455
+ ...error !== null && error !== void 0 && typeof error === "string" ? { error } : {},
7456
+ isGroup
7457
+ };
7458
+ const warnedRef = React.useRef(false);
7459
+ React.useEffect(() => {
7460
+ if (process.env.NODE_ENV === "production" || warnedRef.current) {
7461
+ return;
7462
+ }
7463
+ const hasShorthand = label !== void 0 || description !== void 0 || error !== void 0;
7464
+ if (hasShorthand && isCompoundMode) {
7465
+ warnedRef.current = true;
7466
+ console.warn(
7467
+ "[Field] Mixing shorthand props (label/description/error) with compound children (Field.Label/Field.Description/Field.Error) is not supported. The compound children will win. To suppress this warning, use only one mode."
7468
+ );
7469
+ }
7470
+ }, [label, description, error, isCompoundMode]);
7471
+ const containerStyle = orientation === "horizontal" ? {
7472
+ flexDirection: "row",
7473
+ alignItems: "flex-start",
7474
+ gap: px(colors.spacing["3"])
7475
+ } : { flexDirection: "column", gap: px(colors.spacing["1"]) };
7476
+ const containerExtra = {};
7477
+ if (testID !== void 0) {
7478
+ containerExtra.testID = testID;
7479
+ }
7480
+ containerExtra["data-orientation"] = orientation;
7481
+ if (isGroup) {
7482
+ containerExtra.role = "group";
7483
+ containerExtra["aria-labelledby"] = labelId;
7484
+ containerExtra.accessibilityRole = "none";
7485
+ }
7486
+ if (validating) {
7487
+ containerExtra["data-validating"] = "";
7488
+ containerExtra["aria-busy"] = true;
7489
+ }
7490
+ const renderShorthand = /* @__PURE__ */ __name(() => {
7491
+ const childArray = React.Children.toArray(children);
7492
+ const controlChild = childArray.length === 1 && React.isValidElement(childArray[0]) ? childArray[0] : null;
7493
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7494
+ label !== void 0 && label !== null && label !== false ? /* @__PURE__ */ jsxRuntime.jsx(FieldLabel, { children: label }) : null,
7495
+ description !== void 0 && description !== null && description !== false && description !== "" ? /* @__PURE__ */ jsxRuntime.jsx(FieldDescription, { children: description }) : null,
7496
+ controlChild !== null ? /* @__PURE__ */ jsxRuntime.jsx(FieldControl, { children: controlChild }) : children,
7497
+ error !== void 0 && error !== null && error !== false && error !== "" ? /* @__PURE__ */ jsxRuntime.jsx(FieldError, { children: error }) : null
7498
+ ] });
7499
+ }, "renderShorthand");
7500
+ return /* @__PURE__ */ jsxRuntime.jsx(FieldContext.Provider, { value, children: /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: containerStyle, ...className !== void 0 ? { className } : {}, ...containerExtra, children: [
7501
+ isCompoundMode ? children : renderShorthand(),
7502
+ validating ? /* @__PURE__ */ jsxRuntime.jsx(Spinner, { size: "sm" }) : null
7503
+ ] }) });
7504
+ }, "FieldRoot");
7505
+ var FieldLabel = /* @__PURE__ */ __name(({ children }) => {
7506
+ const ctx = useFieldContextStrict("Field.Label");
7507
+ const colors = useThemeColors();
7508
+ const { t } = useTranslation();
7509
+ const requiredIndicator = t("field.requiredIndicator");
7510
+ const requiredLabel = t("field.requiredLabel");
7511
+ const focusInput = /* @__PURE__ */ __name(() => {
7512
+ if (typeof document !== "undefined") {
7513
+ const el = document.getElementById(ctx.fieldId);
7514
+ if (el && typeof el.focus === "function") {
7515
+ el.focus();
7516
+ }
7517
+ }
7518
+ }, "focusInput");
7519
+ return /* @__PURE__ */ jsxRuntime.jsx(reactNative.Pressable, { onPress: focusInput, accessibilityRole: "none", disabled: ctx.disabled, children: /* @__PURE__ */ jsxRuntime.jsxs(
7520
+ reactNative.Text,
7521
+ {
7522
+ nativeID: ctx.labelId,
7523
+ ...{ id: ctx.labelId },
7524
+ accessibilityRole: "text",
7525
+ style: {
7526
+ fontFamily: colors.fontFamily.body,
7527
+ fontSize: px(colors.fontSize.sm),
7528
+ fontWeight: colors.fontWeight.medium,
7529
+ color: ctx.disabled ? colors.semantic.text.muted : colors.semantic.text.default
7530
+ },
7531
+ children: [
7532
+ children,
7533
+ ctx.required ? /* @__PURE__ */ jsxRuntime.jsx(
7534
+ reactNative.Text,
7535
+ {
7536
+ accessibilityLabel: requiredLabel,
7537
+ ...{ "aria-label": requiredLabel },
7538
+ style: { color: colors.color.danger },
7539
+ children: ` ${requiredIndicator}`
7540
+ }
7541
+ ) : null
7542
+ ]
7543
+ }
7544
+ ) });
7545
+ }, "FieldLabel");
7546
+ FieldLabel.displayName = "Field.Label";
7547
+ var FieldControl = /* @__PURE__ */ __name(({ children }) => {
7548
+ const ctx = useFieldContextStrict("Field.Control");
7549
+ if (React.Children.count(children) !== 1 || !React.isValidElement(children)) {
7550
+ throw new Error("[Field.Control] expects exactly one child element.");
7551
+ }
7552
+ const child = children;
7553
+ const merged = {
7554
+ id: child.props.id ?? ctx.fieldId,
7555
+ accessibilityLabelledBy: ctx.labelId,
7556
+ "aria-labelledby": ctx.labelId
7557
+ };
7558
+ if (ctx.name !== void 0 && child.props.name === void 0) {
7559
+ merged.name = ctx.name;
7560
+ }
7561
+ if (ctx.describedBy !== void 0) {
7562
+ merged["aria-describedby"] = ctx.describedBy;
7563
+ merged.accessibilityDescribedBy = ctx.describedBy;
7564
+ }
7565
+ if (ctx.hasError) {
7566
+ merged["aria-invalid"] = true;
7567
+ }
7568
+ if (ctx.required) {
7569
+ merged["aria-required"] = true;
7570
+ }
7571
+ if (ctx.disabled || child.props.disabled) {
7572
+ merged.disabled = true;
7573
+ }
7574
+ return React.cloneElement(child, merged);
7575
+ }, "FieldControl");
7576
+ FieldControl.displayName = "Field.Control";
7577
+ var FieldDescription = /* @__PURE__ */ __name(({ children }) => {
7578
+ const ctx = useFieldContextStrict("Field.Description");
7579
+ const colors = useThemeColors();
7580
+ return /* @__PURE__ */ jsxRuntime.jsx(
7581
+ reactNative.Text,
7582
+ {
7583
+ nativeID: ctx.descriptionId,
7584
+ ...{ id: ctx.descriptionId },
7585
+ style: {
7586
+ fontFamily: colors.fontFamily.body,
7587
+ fontSize: px(colors.fontSize.sm),
7588
+ color: colors.semantic.text.muted
7589
+ },
7590
+ children
7591
+ }
7592
+ );
7593
+ }, "FieldDescription");
7594
+ FieldDescription.displayName = "Field.Description";
7595
+ var FieldError = /* @__PURE__ */ __name(({ children }) => {
7596
+ const ctx = useFieldContextStrict("Field.Error");
7597
+ const colors = useThemeColors();
7598
+ const content = children ?? ctx.error;
7599
+ if (content === null || content === void 0 || content === "" || content === false) {
7600
+ return null;
7601
+ }
7602
+ return /* @__PURE__ */ jsxRuntime.jsx(
7603
+ reactNative.Text,
7604
+ {
7605
+ nativeID: ctx.errorId,
7606
+ ...{ id: ctx.errorId, role: "alert" },
7607
+ accessibilityRole: "text",
7608
+ style: {
7609
+ fontFamily: colors.fontFamily.body,
7610
+ fontSize: px(colors.fontSize.sm),
7611
+ color: colors.color.danger
7612
+ },
7613
+ children: content
7614
+ }
7615
+ );
7616
+ }, "FieldError");
7617
+ FieldError.displayName = "Field.Error";
7618
+ var FieldGroup = /* @__PURE__ */ __name((props) => /* @__PURE__ */ jsxRuntime.jsx(FieldRoot, { ...props, isGroup: true }), "FieldGroup");
7619
+ FieldGroup.displayName = "Field.Group";
7620
+ var Field = Object.assign(FieldRoot, {
7621
+ Label: FieldLabel,
7622
+ Description: FieldDescription,
7623
+ Control: FieldControl,
7624
+ Error: FieldError,
7625
+ Group: FieldGroup
7626
+ });
6856
7627
  var isDev = process.env.NODE_ENV !== "production";
6857
7628
  var SafeAreaInsetsContext = /* @__PURE__ */ React__namespace.createContext(null);
6858
7629
  if (isDev) {
@@ -7863,6 +8634,55 @@ var InputGroup = Object.assign(InputGroupRoot, {
7863
8634
  Addon: InputGroupAddon,
7864
8635
  Input: InputGroupInput
7865
8636
  });
8637
+ var Label = /* @__PURE__ */ __name(({ htmlFor, required = false, disabled = false, children, className, testID }) => {
8638
+ const colors = useThemeColors();
8639
+ const { t } = useTranslation();
8640
+ const requiredIndicator = t("field.requiredIndicator");
8641
+ const requiredLabel = t("field.requiredLabel");
8642
+ const focusTarget = /* @__PURE__ */ __name(() => {
8643
+ if (typeof document !== "undefined") {
8644
+ const el = document.getElementById(htmlFor);
8645
+ if (el && typeof el.focus === "function") {
8646
+ el.focus();
8647
+ }
8648
+ }
8649
+ }, "focusTarget");
8650
+ return /* @__PURE__ */ jsxRuntime.jsx(
8651
+ reactNative.Pressable,
8652
+ {
8653
+ onPress: focusTarget,
8654
+ accessibilityRole: "none",
8655
+ disabled,
8656
+ ...testID !== void 0 ? { testID } : {},
8657
+ ...className !== void 0 ? { className } : {},
8658
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
8659
+ reactNative.Text,
8660
+ {
8661
+ ...{ htmlFor },
8662
+ accessibilityRole: "text",
8663
+ style: {
8664
+ fontFamily: colors.fontFamily.body,
8665
+ fontSize: px(colors.fontSize.sm),
8666
+ fontWeight: colors.fontWeight.medium,
8667
+ color: disabled ? colors.semantic.text.muted : colors.semantic.text.default
8668
+ },
8669
+ children: [
8670
+ children,
8671
+ required ? /* @__PURE__ */ jsxRuntime.jsx(
8672
+ reactNative.Text,
8673
+ {
8674
+ accessibilityLabel: requiredLabel,
8675
+ ...{ "aria-label": requiredLabel },
8676
+ style: { color: colors.color.danger },
8677
+ children: ` ${requiredIndicator}`
8678
+ }
8679
+ ) : null
8680
+ ]
8681
+ }
8682
+ )
8683
+ }
8684
+ );
8685
+ }, "Label");
7866
8686
  var range = /* @__PURE__ */ __name((from, to) => {
7867
8687
  if (to < from) {
7868
8688
  return [];
@@ -9009,7 +9829,15 @@ var RadioGroup = /* @__PURE__ */ __name(({
9009
9829
  name,
9010
9830
  children,
9011
9831
  className,
9012
- testID
9832
+ testID,
9833
+ id,
9834
+ nativeID,
9835
+ "aria-labelledby": ariaLabelledBy,
9836
+ accessibilityLabelledBy,
9837
+ "aria-describedby": ariaDescribedBy,
9838
+ accessibilityDescribedBy,
9839
+ "aria-invalid": ariaInvalid,
9840
+ "aria-required": ariaRequired
9013
9841
  }) => {
9014
9842
  const [inner, setInner] = React.useState(defaultValue2);
9015
9843
  const isControlled = value !== void 0;
@@ -9111,7 +9939,15 @@ var RadioGroup = /* @__PURE__ */ __name(({
9111
9939
  "aria-orientation": orientation,
9112
9940
  "aria-disabled": disabled || void 0,
9113
9941
  onKeyDown: handleKeyDown,
9114
- ...testID !== void 0 ? { testID } : {}
9942
+ ...testID !== void 0 ? { testID } : {},
9943
+ ...id !== void 0 ? { id } : {},
9944
+ ...nativeID !== void 0 ? { nativeID } : {},
9945
+ ...ariaLabelledBy !== void 0 ? { "aria-labelledby": ariaLabelledBy } : {},
9946
+ ...accessibilityLabelledBy !== void 0 ? { accessibilityLabelledBy } : {},
9947
+ ...ariaDescribedBy !== void 0 ? { "aria-describedby": ariaDescribedBy } : {},
9948
+ ...accessibilityDescribedBy !== void 0 ? { accessibilityDescribedBy } : {},
9949
+ ...ariaInvalid ? { "aria-invalid": true } : {},
9950
+ ...ariaRequired ? { "aria-required": true } : {}
9115
9951
  };
9116
9952
  return /* @__PURE__ */ jsxRuntime.jsx(RadioGroupContext.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxRuntime.jsx(
9117
9953
  RadioGroupViewport,
@@ -10057,7 +10893,15 @@ var Switch = /* @__PURE__ */ __name(({
10057
10893
  className,
10058
10894
  testID,
10059
10895
  asChild,
10060
- children
10896
+ children,
10897
+ id,
10898
+ name,
10899
+ "aria-labelledby": ariaLabelledBy,
10900
+ accessibilityLabelledBy,
10901
+ "aria-describedby": ariaDescribedBy,
10902
+ accessibilityDescribedBy,
10903
+ "aria-invalid": ariaInvalid,
10904
+ "aria-required": ariaRequired
10061
10905
  }) => {
10062
10906
  const colors = useThemeColors();
10063
10907
  const [inner, setInner] = React.useState(defaultChecked);
@@ -10082,6 +10926,13 @@ var Switch = /* @__PURE__ */ __name(({
10082
10926
  accessibilityState: { checked: value, disabled: Boolean(disabled) },
10083
10927
  testID
10084
10928
  };
10929
+ if (id !== void 0) {
10930
+ commonProps.id = id;
10931
+ commonProps.nativeID = id;
10932
+ }
10933
+ if (name !== void 0) {
10934
+ commonProps.name = name;
10935
+ }
10085
10936
  if (disabled) {
10086
10937
  commonProps["aria-disabled"] = true;
10087
10938
  }
@@ -10089,6 +10940,26 @@ var Switch = /* @__PURE__ */ __name(({
10089
10940
  commonProps["aria-label"] = label;
10090
10941
  commonProps.accessibilityLabel = label;
10091
10942
  }
10943
+ if (ariaLabelledBy !== void 0) {
10944
+ commonProps["aria-labelledby"] = ariaLabelledBy;
10945
+ commonProps.accessibilityLabelledBy = ariaLabelledBy;
10946
+ }
10947
+ if (accessibilityLabelledBy !== void 0) {
10948
+ commonProps.accessibilityLabelledBy = accessibilityLabelledBy;
10949
+ }
10950
+ if (ariaDescribedBy !== void 0) {
10951
+ commonProps["aria-describedby"] = ariaDescribedBy;
10952
+ commonProps.accessibilityDescribedBy = ariaDescribedBy;
10953
+ }
10954
+ if (accessibilityDescribedBy !== void 0) {
10955
+ commonProps.accessibilityDescribedBy = accessibilityDescribedBy;
10956
+ }
10957
+ if (ariaInvalid) {
10958
+ commonProps["aria-invalid"] = true;
10959
+ }
10960
+ if (ariaRequired) {
10961
+ commonProps["aria-required"] = true;
10962
+ }
10092
10963
  if (asChild) {
10093
10964
  const slotProps = {
10094
10965
  role: "switch",
@@ -10455,7 +11326,6 @@ var Tabs = Object.assign(TabsRoot, {
10455
11326
  Trigger: TabsTrigger,
10456
11327
  Content: TabsContent
10457
11328
  });
10458
- var CONTAINER_LAYOUT_BASE4 = { flexDirection: "column" };
10459
11329
  var FIELD_LAYOUT_BASE2 = {
10460
11330
  flexDirection: "row",
10461
11331
  alignItems: "center",
@@ -10466,42 +11336,33 @@ var FIELD_LAYOUT_BASE2 = {
10466
11336
  overflow: "hidden"
10467
11337
  };
10468
11338
  var TextInput = /* @__PURE__ */ __name(({
10469
- label,
10470
- helperText,
10471
- error,
10472
11339
  disabled,
10473
11340
  leading,
10474
11341
  trailing,
10475
11342
  containerClassName,
10476
11343
  className,
10477
11344
  testID,
11345
+ id,
11346
+ name,
10478
11347
  onChangeText,
10479
11348
  multiline,
10480
11349
  numberOfLines,
10481
11350
  ...rest
10482
11351
  }) => {
10483
11352
  const colors = useThemeColors();
10484
- const reactId = React.useId();
10485
- const inputId = testID ?? `nori-ui-input-${reactId}`;
10486
11353
  const inputRef = React.useRef(null);
10487
- const focusInput = /* @__PURE__ */ __name(() => {
10488
- inputRef.current?.focus();
10489
- }, "focusInput");
10490
- const describeId = `${inputId}-describe`;
10491
- const hasError = Boolean(error);
10492
- const describedBy = error || helperText ? describeId : void 0;
11354
+ const restAny = rest;
11355
+ const hasError = restAny["aria-invalid"] === true || restAny["aria-invalid"] === "true";
10493
11356
  const inputExtras = {};
10494
11357
  if (testID !== void 0) {
10495
11358
  inputExtras.testID = testID;
10496
11359
  }
10497
- if (label !== void 0) {
10498
- inputExtras.accessibilityLabel = label;
10499
- }
10500
- if (hasError) {
10501
- inputExtras["aria-invalid"] = true;
11360
+ if (id !== void 0) {
11361
+ inputExtras.id = id;
11362
+ inputExtras.nativeID = id;
10502
11363
  }
10503
- if (describedBy !== void 0) {
10504
- inputExtras["aria-describedby"] = describedBy;
11364
+ if (name !== void 0) {
11365
+ inputExtras.name = name;
10505
11366
  }
10506
11367
  if (multiline !== void 0) {
10507
11368
  inputExtras.multiline = multiline;
@@ -10512,12 +11373,6 @@ var TextInput = /* @__PURE__ */ __name(({
10512
11373
  if (onChangeText !== void 0) {
10513
11374
  inputExtras.onChangeText = onChangeText;
10514
11375
  }
10515
- const labelStyle = {
10516
- fontFamily: colors.fontFamily.body,
10517
- fontSize: px(colors.fontSize.sm),
10518
- fontWeight: colors.fontWeight.medium,
10519
- color: colors.semantic.text.default
10520
- };
10521
11376
  const inputStyle = {
10522
11377
  flex: 1,
10523
11378
  paddingVertical: px(colors.spacing["2"]),
@@ -10525,17 +11380,6 @@ var TextInput = /* @__PURE__ */ __name(({
10525
11380
  fontSize: px(colors.fontSize.md),
10526
11381
  color: colors.semantic.text.default
10527
11382
  };
10528
- const helperStyle = {
10529
- fontFamily: colors.fontFamily.body,
10530
- fontSize: px(colors.fontSize.sm),
10531
- color: colors.semantic.text.muted
10532
- };
10533
- const errorStyle = {
10534
- fontFamily: colors.fontFamily.body,
10535
- fontSize: px(colors.fontSize.sm),
10536
- color: colors.color.danger
10537
- };
10538
- const containerStyle = { ...CONTAINER_LAYOUT_BASE4, gap: px(colors.spacing["1"]) };
10539
11383
  const fieldStyle = [
10540
11384
  FIELD_LAYOUT_BASE2,
10541
11385
  {
@@ -10546,55 +11390,33 @@ var TextInput = /* @__PURE__ */ __name(({
10546
11390
  },
10547
11391
  disabled ? { opacity: 0.6 } : null
10548
11392
  ];
10549
- return /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { className: cn("flex flex-col gap-1", containerClassName), style: containerStyle, children: [
10550
- label !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Pressable, { onPress: focusInput, accessibilityRole: "none", disabled, children: /* @__PURE__ */ jsxRuntime.jsx(
10551
- reactNative.Text,
10552
- {
10553
- nativeID: `${inputId}-label`,
10554
- accessibilityRole: "text",
10555
- className: "text-sm font-medium text-semantic-text-default",
10556
- style: labelStyle,
10557
- children: label
10558
- }
10559
- ) }) : null,
10560
- /* @__PURE__ */ jsxRuntime.jsxs(
10561
- reactNative.View,
10562
- {
10563
- className: cn(
10564
- "flex-row items-center rounded-md border px-3",
10565
- hasError ? "border-semantic-interactive-destructive" : "border-semantic-border-default",
10566
- disabled ? "opacity-60" : void 0
11393
+ return /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { className: cn(containerClassName), style: { flexDirection: "column" }, children: /* @__PURE__ */ jsxRuntime.jsxs(
11394
+ reactNative.View,
11395
+ {
11396
+ className: cn(
11397
+ "flex-row items-center rounded-md border px-3",
11398
+ hasError ? "border-semantic-interactive-destructive" : "border-semantic-border-default",
11399
+ disabled ? "opacity-60" : void 0
11400
+ ),
11401
+ style: fieldStyle,
11402
+ children: [
11403
+ leading ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { className: "mr-2", style: { marginRight: px(colors.spacing["2"]) }, children: leading }) : null,
11404
+ /* @__PURE__ */ jsxRuntime.jsx(
11405
+ reactNative.TextInput,
11406
+ {
11407
+ ref: inputRef,
11408
+ editable: !disabled,
11409
+ className: cn("flex-1 py-2 text-md text-semantic-text-default outline-none", className),
11410
+ placeholderTextColor: colors.semantic.text.muted,
11411
+ ...inputExtras,
11412
+ ...rest,
11413
+ style: [inputStyle, rest.style]
11414
+ }
10567
11415
  ),
10568
- style: fieldStyle,
10569
- children: [
10570
- leading ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { className: "mr-2", style: { marginRight: px(colors.spacing["2"]) }, children: leading }) : null,
10571
- /* @__PURE__ */ jsxRuntime.jsx(
10572
- reactNative.TextInput,
10573
- {
10574
- ref: inputRef,
10575
- nativeID: inputId,
10576
- editable: !disabled,
10577
- className: cn("flex-1 py-2 text-md text-semantic-text-default outline-none", className),
10578
- placeholderTextColor: colors.semantic.text.muted,
10579
- ...inputExtras,
10580
- ...rest,
10581
- style: [inputStyle, rest.style]
10582
- }
10583
- ),
10584
- trailing ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { className: "ml-2", style: { marginLeft: px(colors.spacing["2"]) }, children: trailing }) : null
10585
- ]
10586
- }
10587
- ),
10588
- error ? /* @__PURE__ */ jsxRuntime.jsx(
10589
- reactNative.Text,
10590
- {
10591
- nativeID: describeId,
10592
- className: "text-sm text-semantic-interactive-destructive",
10593
- style: errorStyle,
10594
- children: error
10595
- }
10596
- ) : helperText ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { nativeID: describeId, className: "text-sm text-semantic-text-muted", style: helperStyle, children: helperText }) : null
10597
- ] });
11416
+ trailing ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { className: "ml-2", style: { marginLeft: px(colors.spacing["2"]) }, children: trailing }) : null
11417
+ ]
11418
+ }
11419
+ ) });
10598
11420
  }, "TextInput");
10599
11421
  var TextArea = /* @__PURE__ */ __name(({ numberOfLines = 4, resize = "vertical", style, ...rest }) => {
10600
11422
  const resizeStyle = { resize };
@@ -11797,12 +12619,15 @@ exports.Button = Button;
11797
12619
  exports.Calendar = Calendar;
11798
12620
  exports.Card = Card;
11799
12621
  exports.Checkbox = Checkbox;
12622
+ exports.DatePicker = DatePicker;
11800
12623
  exports.Dialog = Dialog;
12624
+ exports.Field = Field;
11801
12625
  exports.FloatButton = FloatButton;
11802
12626
  exports.HStack = HStack;
11803
12627
  exports.I18nProvider = I18nProvider;
11804
12628
  exports.Icon = Icon;
11805
12629
  exports.InputGroup = InputGroup;
12630
+ exports.Label = Label;
11806
12631
  exports.LocaleProvider = LocaleProvider;
11807
12632
  exports.NoriProvider = NoriProvider;
11808
12633
  exports.PAGINATION_COMPACT_BREAKPOINT = PAGINATION_COMPACT_BREAKPOINT;