@dreamtree-org/twreact-ui 1.3.9 → 1.3.11

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 (128) hide show
  1. package/README.md +32 -0
  2. package/ai-skills/dreamtree-ui.md +12 -7
  3. package/dist/ai-schema.json +156 -29
  4. package/dist/charts/index.js +195 -66
  5. package/dist/components/blocks/AppShell.d.ts.map +1 -1
  6. package/dist/components/charts/CartesianChart.d.ts.map +1 -1
  7. package/dist/components/charts/ChartFrame.d.ts.map +1 -1
  8. package/dist/components/charts/useChartLayout.d.ts +25 -0
  9. package/dist/components/charts/useChartLayout.d.ts.map +1 -0
  10. package/dist/components/core/Accordion.d.ts.map +1 -1
  11. package/dist/components/core/Button.d.ts.map +1 -1
  12. package/dist/components/core/Checkbox.d.ts.map +1 -1
  13. package/dist/components/core/ColorPicker.d.ts.map +1 -1
  14. package/dist/components/core/DatePicker.d.ts.map +1 -1
  15. package/dist/components/core/Form.d.ts.map +1 -1
  16. package/dist/components/core/Input.d.ts.map +1 -1
  17. package/dist/components/core/Loader.d.ts.map +1 -1
  18. package/dist/components/core/LocationPicker.d.ts.map +1 -1
  19. package/dist/components/core/PriceRangePicker.d.ts +0 -29
  20. package/dist/components/core/PriceRangePicker.d.ts.map +1 -1
  21. package/dist/components/core/ProgressBar.d.ts.map +1 -1
  22. package/dist/components/core/Radio.d.ts.map +1 -1
  23. package/dist/components/core/Rate.d.ts.map +1 -1
  24. package/dist/components/core/RoundedTag.d.ts.map +1 -1
  25. package/dist/components/core/Skeleton.d.ts.map +1 -1
  26. package/dist/components/core/Slider.d.ts.map +1 -1
  27. package/dist/components/core/SpeechToText.d.ts.map +1 -1
  28. package/dist/components/core/Switch.d.ts.map +1 -1
  29. package/dist/components/core/Table/ColumnMenu.d.ts.map +1 -1
  30. package/dist/components/core/Table/Pagination.d.ts.map +1 -1
  31. package/dist/components/core/Table/TableRow.d.ts.map +1 -1
  32. package/dist/components/core/Table/helpers.d.ts +2 -0
  33. package/dist/components/core/Table/helpers.d.ts.map +1 -1
  34. package/dist/components/core/Tabs.d.ts +2 -5
  35. package/dist/components/core/Tabs.d.ts.map +1 -1
  36. package/dist/components/core/TextToSpeech.d.ts +2 -7
  37. package/dist/components/core/TextToSpeech.d.ts.map +1 -1
  38. package/dist/components/core/Textarea.d.ts.map +1 -1
  39. package/dist/components/core/Tooltip.d.ts.map +1 -1
  40. package/dist/components/feedback/Alert.d.ts.map +1 -1
  41. package/dist/components/feedback/Dialog.d.ts.map +1 -1
  42. package/dist/components/feedback/Toast.d.ts.map +1 -1
  43. package/dist/components/navigation/Breadcrumbs.d.ts.map +1 -1
  44. package/dist/components/navigation/FootNav.d.ts.map +1 -1
  45. package/dist/components/navigation/Sidebar.d.ts.map +1 -1
  46. package/dist/components/utility/Avatar.d.ts +8 -0
  47. package/dist/components/utility/Avatar.d.ts.map +1 -1
  48. package/dist/components/utility/AvatarGroup.d.ts +4 -0
  49. package/dist/components/utility/AvatarGroup.d.ts.map +1 -0
  50. package/dist/components/utility/Badge.d.ts.map +1 -1
  51. package/dist/components/utility/Card.d.ts.map +1 -1
  52. package/dist/components/utility/Carousel.d.ts.map +1 -1
  53. package/dist/components/utility/FileUpload.d.ts.map +1 -1
  54. package/dist/components/utility/Pagination.d.ts.map +1 -1
  55. package/dist/components/utility/Sortable.d.ts.map +1 -1
  56. package/dist/components/utility/Stepper.d.ts.map +1 -1
  57. package/dist/esm/components/blocks/AppShell.js +24 -18
  58. package/dist/esm/components/blocks/EmptyState.js +1 -1
  59. package/dist/esm/components/blocks/ErrorState.js +1 -1
  60. package/dist/esm/components/blocks/LoadingState.js +4 -4
  61. package/dist/esm/components/blocks/StatCard.js +6 -6
  62. package/dist/esm/components/blocks/StatusPill.js +5 -8
  63. package/dist/esm/components/charts/CartesianChart.js +85 -62
  64. package/dist/esm/components/charts/ChartFrame.js +12 -5
  65. package/dist/esm/components/charts/useChartLayout.js +105 -0
  66. package/dist/esm/components/core/Accordion.js +40 -9
  67. package/dist/esm/components/core/Button.js +49 -25
  68. package/dist/esm/components/core/Checkbox.js +71 -45
  69. package/dist/esm/components/core/ColorPicker.js +49 -48
  70. package/dist/esm/components/core/DatePicker.js +97 -58
  71. package/dist/esm/components/core/Form.js +35 -8
  72. package/dist/esm/components/core/Input.js +89 -20
  73. package/dist/esm/components/core/Loader.js +30 -44
  74. package/dist/esm/components/core/LocationPicker.js +82 -16
  75. package/dist/esm/components/core/PriceRangePicker.js +205 -218
  76. package/dist/esm/components/core/ProgressBar.js +8 -12
  77. package/dist/esm/components/core/Radio.js +43 -15
  78. package/dist/esm/components/core/Rate.js +109 -50
  79. package/dist/esm/components/core/RoundedTag.js +27 -10
  80. package/dist/esm/components/core/Skeleton.js +13 -14
  81. package/dist/esm/components/core/Slider.js +24 -6
  82. package/dist/esm/components/core/SpeechToText.js +68 -16
  83. package/dist/esm/components/core/Switch.js +88 -16
  84. package/dist/esm/components/core/Table/ColumnMenu.js +2 -4
  85. package/dist/esm/components/core/Table/Pagination.js +15 -18
  86. package/dist/esm/components/core/Table/TableRow.js +2 -2
  87. package/dist/esm/components/core/Table/helpers.js +33 -1
  88. package/dist/esm/components/core/Tabs.js +185 -37
  89. package/dist/esm/components/core/TextToSpeech.js +121 -28
  90. package/dist/esm/components/core/Textarea.js +10 -2
  91. package/dist/esm/components/core/Tooltip.js +100 -28
  92. package/dist/esm/components/feedback/Alert.js +21 -11
  93. package/dist/esm/components/feedback/Dialog.js +44 -100
  94. package/dist/esm/components/feedback/Toast.js +24 -5
  95. package/dist/esm/components/navigation/Breadcrumbs.js +97 -35
  96. package/dist/esm/components/navigation/FootNav.js +102 -13
  97. package/dist/esm/components/navigation/Sidebar.js +13 -61
  98. package/dist/esm/components/utility/Avatar.js +37 -22
  99. package/dist/esm/components/utility/AvatarGroup.js +56 -0
  100. package/dist/esm/components/utility/Badge.js +43 -23
  101. package/dist/esm/components/utility/Card.js +32 -8
  102. package/dist/esm/components/utility/Carousel.js +165 -38
  103. package/dist/esm/components/utility/FileUpload.js +106 -31
  104. package/dist/esm/components/utility/Pagination.js +33 -15
  105. package/dist/esm/components/utility/Sortable.js +6 -2
  106. package/dist/esm/components/utility/Stepper.js +110 -47
  107. package/dist/esm/hooks/useFocusTrap.js +10 -2
  108. package/dist/esm/hooks/useSliderValues.js +8 -2
  109. package/dist/esm/hooks/useSortable.js +107 -5
  110. package/dist/esm/index.js +1 -0
  111. package/dist/esm/utils/touchTarget.js +4 -1
  112. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  113. package/dist/hooks/useSliderValues.d.ts +6 -2
  114. package/dist/hooks/useSliderValues.d.ts.map +1 -1
  115. package/dist/hooks/useSortable.d.ts +11 -1
  116. package/dist/hooks/useSortable.d.ts.map +1 -1
  117. package/dist/index.css +1 -1
  118. package/dist/index.d.ts +3 -2
  119. package/dist/index.esm.css +1 -1
  120. package/dist/index.esm.js +3734 -2174
  121. package/dist/index.js +3732 -2171
  122. package/dist/types/charts.d.ts +3 -1
  123. package/dist/types/charts.d.ts.map +1 -1
  124. package/dist/types/index.d.ts +64 -9
  125. package/dist/types/index.d.ts.map +1 -1
  126. package/doc/README.md +1 -0
  127. package/mcp/catalog.snapshot.json +350 -121
  128. package/package.json +1 -1
@@ -19,6 +19,14 @@ var sizeToPx = function sizeToPx(size) {
19
19
  return 24;
20
20
  }
21
21
  };
22
+ // Keyframes live in tailwind.config.js (DTUI-48) — no per-instance <style> tag.
23
+ // `speed` reaches the animation through the --dt-loader-speed custom property.
24
+ // Under prefers-reduced-motion the spinner slows right down (it still signals
25
+ // "busy"); the bouncing dots and sliding bar stop.
26
+ var SPIN = "animate-loader-spin motion-reduce:[animation-duration:3s]";
27
+ // Default track colour, dark-safe. A `secondaryColor` prop overrides it inline.
28
+ var TRACK_STROKE = "stroke-black/[0.08] dark:stroke-white/15";
29
+ var TRACK_BG = "bg-black/[0.08] dark:bg-white/15";
22
30
  var Loader = /*#__PURE__*/forwardRef(function Loader(_ref, ref) {
23
31
  var _ref$size = _ref.size,
24
32
  size = _ref$size === void 0 ? "md" : _ref$size,
@@ -28,8 +36,7 @@ var Loader = /*#__PURE__*/forwardRef(function Loader(_ref, ref) {
28
36
  thickness = _ref$thickness === void 0 ? 2.5 : _ref$thickness,
29
37
  _ref$color = _ref.color,
30
38
  color = _ref$color === void 0 ? "currentColor" : _ref$color,
31
- _ref$secondaryColor = _ref.secondaryColor,
32
- secondaryColor = _ref$secondaryColor === void 0 ? "rgba(0,0,0,0.08)" : _ref$secondaryColor,
39
+ secondaryColor = _ref.secondaryColor,
33
40
  _ref$variant = _ref.variant,
34
41
  variant = _ref$variant === void 0 ? "spinner" : _ref$variant,
35
42
  _ref$className = _ref.className,
@@ -45,32 +52,29 @@ var Loader = /*#__PURE__*/forwardRef(function Loader(_ref, ref) {
45
52
  rest = _objectWithoutProperties(_ref, _excluded);
46
53
  var px = sizeToPx(size);
47
54
  var wrapperClass = cn(inline ? "inline-flex" : "flex", "items-center gap-2", className);
48
- // animation attributes for SVG rotate
49
- var animDur = "".concat(speed, "s");
50
- var rotateFrom = reverse ? "360 12 12" : "0 12 12";
51
- var rotateTo = reverse ? "0 12 12" : "360 12 12";
55
+ var rootStyle = _objectSpread2({
56
+ "--dt-loader-speed": "".concat(speed, "s")
57
+ }, style);
52
58
  return jsxs("div", _objectSpread2(_objectSpread2({
53
59
  ref: ref,
54
60
  role: "progressbar",
55
61
  "aria-label": ariaLabel,
56
62
  className: wrapperClass,
57
- style: style
63
+ style: rootStyle
58
64
  }, rest), {}, {
59
- children: [jsx("style", {
60
- children: "\n @keyframes loader-bounce {\n 0%, 80%, 100% { transform: translateY(0); opacity: 0.9 }\n 40% { transform: translateY(-6px); opacity: 1 }\n }\n @keyframes loader-bar {\n 0% { transform: translateX(-35%); }\n 100% { transform: translateX(135%); }\n }\n "
61
- }), variant === "spinner" && jsxs("svg", {
65
+ children: [variant === "spinner" && jsxs("svg", {
62
66
  width: px,
63
67
  height: px,
64
68
  viewBox: "0 0 24 24",
65
69
  fill: "none",
66
- style: {
67
- display: "block"
68
- },
70
+ "aria-hidden": "true",
71
+ className: cn("block", SPIN, reverse && "[animation-direction:reverse]"),
69
72
  xmlns: "http://www.w3.org/2000/svg",
70
73
  children: [jsx("circle", {
71
74
  cx: "12",
72
75
  cy: "12",
73
76
  r: 10 - thickness,
77
+ className: secondaryColor ? undefined : TRACK_STROKE,
74
78
  stroke: secondaryColor,
75
79
  strokeWidth: thickness
76
80
  }), jsx("path", {
@@ -79,60 +83,42 @@ var Loader = /*#__PURE__*/forwardRef(function Loader(_ref, ref) {
79
83
  strokeWidth: thickness,
80
84
  strokeLinecap: "round",
81
85
  strokeLinejoin: "round",
82
- strokeDasharray: "24",
83
- children: jsx("animateTransform", {
84
- attributeName: "transform",
85
- attributeType: "XML",
86
- type: "rotate",
87
- from: rotateFrom,
88
- to: rotateTo,
89
- dur: animDur,
90
- repeatCount: "indefinite"
91
- })
86
+ strokeDasharray: "24"
92
87
  })]
93
88
  }), variant === "dots" && jsx("div", {
89
+ className: "inline-flex items-center",
94
90
  style: {
95
- display: "inline-flex",
96
- alignItems: "center",
97
91
  gap: Math.max(2, Math.round(px / 8))
98
92
  },
99
93
  children: [0, 1, 2].map(function (i) {
100
94
  return jsx("span", {
101
95
  "aria-hidden": true,
96
+ className: "inline-block rounded-full animate-loader-bounce motion-reduce:animate-none",
102
97
  style: {
103
98
  width: px / 4,
104
99
  height: px / 4,
105
- borderRadius: "9999px",
106
- display: "inline-block",
107
100
  background: color,
108
- animation: "loader-bounce ".concat(speed, "s ").concat(i * (speed / 6), "s infinite ease-in-out")
101
+ animationDelay: "".concat(Math.round(i * speed * 1000 / 6) / 1000, "s")
109
102
  }
110
103
  }, i);
111
104
  })
112
105
  }), variant === "bar" && jsx("div", {
113
106
  "aria-hidden": true,
114
- style: {
107
+ className: cn("relative overflow-hidden rounded-full", !secondaryColor && TRACK_BG),
108
+ style: _objectSpread2({
115
109
  width: Math.max(72, px * 2.5),
116
- height: Math.max(6, px / 6),
117
- background: secondaryColor,
118
- overflow: "hidden",
119
- borderRadius: 9999,
120
- position: "relative"
121
- },
110
+ height: Math.max(6, px / 6)
111
+ }, secondaryColor ? {
112
+ background: secondaryColor
113
+ } : {}),
122
114
  children: jsx("div", {
115
+ className: "absolute inset-y-0 left-0 w-[35%] animate-loader-bar motion-reduce:animate-none",
123
116
  style: {
124
- position: "absolute",
125
- left: 0,
126
- top: 0,
127
- bottom: 0,
128
- width: "35%",
129
- background: "linear-gradient(90deg, ".concat(color, ", ").concat(secondaryColor, ")"),
130
- transform: "translateX(-35%)",
131
- animation: "loader-bar ".concat(speed, "s linear infinite")
117
+ background: "linear-gradient(90deg, ".concat(color, ", ").concat(secondaryColor || "transparent", ")")
132
118
  }
133
119
  })
134
120
  }), text && jsx("span", {
135
- className: "text-sm text-primary-500",
121
+ className: "text-sm text-primary-500 dark:text-primary-400",
136
122
  children: text
137
123
  })]
138
124
  }));
@@ -1,10 +1,19 @@
1
1
  'use client';
2
2
  import { objectWithoutProperties as _objectWithoutProperties, slicedToArray as _slicedToArray, objectSpread2 as _objectSpread2 } from '../../_virtual/_rollupPluginBabelHelpers.js';
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
- import React, { forwardRef, useState, cloneElement } from 'react';
4
+ import React, { forwardRef, useState, useId, cloneElement } from 'react';
5
5
  import { cn } from '../../utils/cn.js';
6
+ import { PRESS_FEEDBACK, TOUCH_TARGET } from '../../utils/touchTarget.js';
6
7
 
7
- var _excluded = ["value", "onChange", "inputProps", "icon", "iconProps", "iconPosition", "placeholder", "className"];
8
+ var _excluded = ["value", "onChange", "inputProps", "icon", "iconProps", "iconPosition", "placeholder", "fullWidth", "className"];
9
+ // User-facing copy for GeolocationPositionError codes (and "unsupported").
10
+ var LOCATION_ERROR_MESSAGES = {
11
+ unsupported: "Location isn't available in this browser.",
12
+ 1: "Location permission was denied. Allow it in your browser settings, or type the coordinates.",
13
+ 2: "Your location couldn't be determined. Try again, or type the coordinates.",
14
+ 3: "Finding your location took too long. Try again.",
15
+ "default": "Couldn't get your location. Try again, or type the coordinates."
16
+ };
8
17
  function formatCoords(coords) {
9
18
  if (!coords) return "";
10
19
  var lat = Number(coords.lat);
@@ -40,6 +49,8 @@ var LocationPicker = /*#__PURE__*/forwardRef(function LocationPicker(_ref, ref)
40
49
  iconPosition = _ref$iconPosition === void 0 ? "right" : _ref$iconPosition,
41
50
  _ref$placeholder = _ref.placeholder,
42
51
  placeholder = _ref$placeholder === void 0 ? "lat, lng" : _ref$placeholder,
52
+ _ref$fullWidth = _ref.fullWidth,
53
+ fullWidth = _ref$fullWidth === void 0 ? false : _ref$fullWidth,
43
54
  className = _ref.className,
44
55
  rest = _objectWithoutProperties(_ref, _excluded);
45
56
  var _useState = useState(function () {
@@ -48,12 +59,23 @@ var LocationPicker = /*#__PURE__*/forwardRef(function LocationPicker(_ref, ref)
48
59
  _useState2 = _slicedToArray(_useState, 2),
49
60
  text = _useState2[0],
50
61
  setText = _useState2[1];
62
+ // Geolocation request state, shown in the UI (DTUI-42).
63
+ var _useState3 = useState("idle"),
64
+ _useState4 = _slicedToArray(_useState3, 2),
65
+ status = _useState4[0],
66
+ setStatus = _useState4[1]; // "idle" | "loading" | "error"
67
+ var _useState5 = useState(""),
68
+ _useState6 = _slicedToArray(_useState5, 2),
69
+ errorMessage = _useState6[0],
70
+ setErrorMessage = _useState6[1];
71
+ var messageId = "location-picker-msg-".concat(useId());
72
+ var loading = status === "loading";
51
73
  // Re-sync the text when the external `value` changes (adjust-during-render
52
74
  // pattern, avoids a cascading effect render).
53
- var _useState3 = useState(value),
54
- _useState4 = _slicedToArray(_useState3, 2),
55
- prevValue = _useState4[0],
56
- setPrevValue = _useState4[1];
75
+ var _useState7 = useState(value),
76
+ _useState8 = _slicedToArray(_useState7, 2),
77
+ prevValue = _useState8[0],
78
+ setPrevValue = _useState8[1];
57
79
  if (value !== prevValue) {
58
80
  setPrevValue(value);
59
81
  setText(formatCoords(value));
@@ -77,15 +99,22 @@ var LocationPicker = /*#__PURE__*/forwardRef(function LocationPicker(_ref, ref)
77
99
  lng: Number(position.coords.longitude)
78
100
  };
79
101
  setText(formatCoords(coords));
102
+ setStatus("idle");
103
+ setErrorMessage("");
80
104
  if (typeof onChange === "function") onChange(coords);
81
105
  };
82
106
  var handleGeoError = function handleGeoError(err) {
83
107
  console.error("LocationPicker geolocation error:", err);
108
+ setStatus("error");
109
+ setErrorMessage(LOCATION_ERROR_MESSAGES[err === null || err === void 0 ? void 0 : err.code] || LOCATION_ERROR_MESSAGES["default"]);
84
110
  };
85
111
  var handleIconClick = function handleIconClick(e) {
86
112
  var _navigator;
113
+ if (loading) return;
87
114
  if (!((_navigator = navigator) !== null && _navigator !== void 0 && _navigator.geolocation)) {
88
115
  console.error("LocationPicker: geolocation not supported in this browser");
116
+ setStatus("error");
117
+ setErrorMessage(LOCATION_ERROR_MESSAGES.unsupported);
89
118
  if (typeof iconProps.onClick === "function") {
90
119
  try {
91
120
  iconProps.onClick(e);
@@ -95,6 +124,8 @@ var LocationPicker = /*#__PURE__*/forwardRef(function LocationPicker(_ref, ref)
95
124
  }
96
125
  return;
97
126
  }
127
+ setStatus("loading");
128
+ setErrorMessage("");
98
129
  navigator.geolocation.getCurrentPosition(handleGeoSuccess, handleGeoError, {
99
130
  enableHighAccuracy: true,
100
131
  timeout: 10000
@@ -127,33 +158,68 @@ var LocationPicker = /*#__PURE__*/forwardRef(function LocationPicker(_ref, ref)
127
158
  strokeWidth: "1.2"
128
159
  })]
129
160
  });
161
+ var Spinner = jsxs("svg", {
162
+ className: "w-4 h-4 animate-spin motion-reduce:animate-none",
163
+ viewBox: "0 0 24 24",
164
+ fill: "none",
165
+ "aria-hidden": "true",
166
+ "data-testid": "location-picker-spinner",
167
+ children: [jsx("circle", {
168
+ cx: "12",
169
+ cy: "12",
170
+ r: "9",
171
+ stroke: "currentColor",
172
+ strokeOpacity: "0.25",
173
+ strokeWidth: "2.5"
174
+ }), jsx("path", {
175
+ d: "M21 12a9 9 0 0 0-9-9",
176
+ stroke: "currentColor",
177
+ strokeWidth: "2.5",
178
+ strokeLinecap: "round"
179
+ })]
180
+ });
130
181
  var iconButton = jsx("button", _objectSpread2(_objectSpread2({
131
182
  type: "button",
132
183
  onClick: handleIconClick
133
184
  }, iconProps), {}, {
134
185
  "aria-label": iconProps["aria-label"] || "Use my location",
135
- className: "inline-flex items-center justify-center p-1 focus:outline-none ".concat(iconProps.className || ""),
136
- children: icon ? /*#__PURE__*/React.isValidElement(icon) ? /*#__PURE__*/cloneElement(icon) : icon : DefaultIcon
186
+ "aria-busy": loading || undefined,
187
+ "aria-describedby": status !== "idle" ? messageId : iconProps["aria-describedby"],
188
+ className: cn("inline-flex items-center justify-center rounded-md p-1 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200", "focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500", "transition-colors duration-fast motion-reduce:transition-none", loading && "cursor-wait", TOUCH_TARGET, PRESS_FEEDBACK, "transition-[color,background-color,border-color,transform]", iconProps.className),
189
+ children: loading ? Spinner : icon ? /*#__PURE__*/React.isValidElement(icon) ? /*#__PURE__*/cloneElement(icon) : icon : DefaultIcon
137
190
  }));
138
- var inputPaddingClass = iconPosition === "right" ? "pr-10" : "pl-10";
139
- return jsx("div", _objectSpread2(_objectSpread2({
140
- className: cn("inline-flex items-center", className)
191
+ // The 44px touch target is wider than p-1, so leave room for it on coarse pointers.
192
+ var inputPaddingClass = iconPosition === "right" ? "pr-10 [@media(pointer:coarse)]:pr-12" : "pl-10 [@media(pointer:coarse)]:pl-12";
193
+ return jsxs("div", _objectSpread2(_objectSpread2({
194
+ className: cn(fullWidth ? "flex w-full flex-col" : "inline-flex flex-col", className),
195
+ "data-status": status
141
196
  }, rest), {}, {
142
- children: jsxs("div", {
143
- className: "relative",
197
+ children: [jsxs("div", {
198
+ className: cn("relative", fullWidth && "w-full"),
144
199
  children: [jsx("input", _objectSpread2(_objectSpread2({
145
200
  ref: ref,
146
201
  type: "text",
147
- placeholder: placeholder
202
+ placeholder: placeholder,
203
+ "aria-describedby": status !== "idle" ? messageId : undefined
148
204
  }, inputProps), {}, {
149
205
  value: text,
150
206
  onChange: handleInputChange,
151
- className: cn("min-w-[200px] rounded-md border border-gray-300 bg-white py-2 px-3 text-sm placeholder-gray-400 shadow-sm focus:border-primary-500 focus:ring-1 focus:ring-primary-500", inputProps.className, inputPaddingClass)
207
+ className: cn("rounded-md border border-gray-300 bg-white py-2 px-3 text-sm text-gray-900 placeholder-gray-400 shadow-sm focus:border-primary-500 focus:ring-1 focus:ring-primary-500", "dark:border-gray-600 dark:bg-gray-900 dark:text-gray-100 dark:placeholder-gray-500", "[@media(pointer:coarse)]:text-base", fullWidth ? "w-full" : "min-w-[200px]", status === "error" && "border-error-500 dark:border-error-400", inputProps.className, inputPaddingClass)
152
208
  })), jsx("div", {
153
209
  className: cn("absolute inset-y-0 flex items-center", iconPosition === "right" ? "right-2" : "left-2"),
154
210
  children: iconButton
155
211
  })]
156
- })
212
+ }), status === "loading" && jsx("p", {
213
+ id: messageId,
214
+ role: "status",
215
+ className: "mt-1 text-xs text-gray-500 dark:text-gray-400",
216
+ children: "Finding your location\u2026"
217
+ }), status === "error" && jsx("p", {
218
+ id: messageId,
219
+ role: "alert",
220
+ className: "mt-1 text-xs text-error-600 dark:text-error-400",
221
+ children: errorMessage
222
+ })]
157
223
  }));
158
224
  });
159
225
  LocationPicker.displayName = "LocationPicker";