@flanksource/clicky-ui 0.2.20 → 0.3.1

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 (233) hide show
  1. package/dist/components/Combobox.cjs +5 -2
  2. package/dist/components/Combobox.cjs.map +1 -1
  3. package/dist/components/Combobox.d.ts.map +1 -1
  4. package/dist/components/Combobox.js +5 -2
  5. package/dist/components/Combobox.js.map +1 -1
  6. package/dist/components/FilterBar.cjs +280 -253
  7. package/dist/components/FilterBar.cjs.map +1 -1
  8. package/dist/components/FilterBar.d.ts.map +1 -1
  9. package/dist/components/FilterBar.js +280 -253
  10. package/dist/components/FilterBar.js.map +1 -1
  11. package/dist/components/JsonSchemaForm.cjs +3 -1
  12. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  13. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  14. package/dist/components/JsonSchemaForm.js +4 -2
  15. package/dist/components/JsonSchemaForm.js.map +1 -1
  16. package/dist/components/MultiSelect.cjs +29 -32
  17. package/dist/components/MultiSelect.cjs.map +1 -1
  18. package/dist/components/MultiSelect.d.ts.map +1 -1
  19. package/dist/components/MultiSelect.js +30 -33
  20. package/dist/components/MultiSelect.js.map +1 -1
  21. package/dist/components/TimeRange.cjs +29 -37
  22. package/dist/components/TimeRange.cjs.map +1 -1
  23. package/dist/components/TimeRange.d.ts.map +1 -1
  24. package/dist/components/TimeRange.js +30 -38
  25. package/dist/components/TimeRange.js.map +1 -1
  26. package/dist/components/TreePickerField.cjs +6 -3
  27. package/dist/components/TreePickerField.cjs.map +1 -1
  28. package/dist/components/TreePickerField.d.ts.map +1 -1
  29. package/dist/components/TreePickerField.js +6 -3
  30. package/dist/components/TreePickerField.js.map +1 -1
  31. package/dist/components/icon-menu-picker.cjs +9 -3
  32. package/dist/components/icon-menu-picker.cjs.map +1 -1
  33. package/dist/components/icon-menu-picker.d.ts.map +1 -1
  34. package/dist/components/icon-menu-picker.js +9 -3
  35. package/dist/components/icon-menu-picker.js.map +1 -1
  36. package/dist/components/json-schema-form-fields.cjs +80 -2
  37. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  38. package/dist/components/json-schema-form-fields.d.ts +15 -0
  39. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  40. package/dist/components/json-schema-form-fields.js +81 -3
  41. package/dist/components/json-schema-form-fields.js.map +1 -1
  42. package/dist/components/json-schema-form-refs.cjs +60 -0
  43. package/dist/components/json-schema-form-refs.cjs.map +1 -0
  44. package/dist/components/json-schema-form-refs.d.ts +3 -0
  45. package/dist/components/json-schema-form-refs.d.ts.map +1 -0
  46. package/dist/components/json-schema-form-refs.js +60 -0
  47. package/dist/components/json-schema-form-refs.js.map +1 -0
  48. package/dist/components/json-schema-form-render.cjs +14 -2
  49. package/dist/components/json-schema-form-render.cjs.map +1 -1
  50. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  51. package/dist/components/json-schema-form-render.js +15 -3
  52. package/dist/components/json-schema-form-render.js.map +1 -1
  53. package/dist/components/json-schema-form-resolve.cjs +5 -0
  54. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  55. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  56. package/dist/components/json-schema-form-resolve.js +5 -0
  57. package/dist/components/json-schema-form-resolve.js.map +1 -1
  58. package/dist/components/json-schema-form-template-menu.cjs +83 -0
  59. package/dist/components/json-schema-form-template-menu.cjs.map +1 -0
  60. package/dist/components/json-schema-form-template-menu.d.ts +15 -0
  61. package/dist/components/json-schema-form-template-menu.d.ts.map +1 -0
  62. package/dist/components/json-schema-form-template-menu.js +83 -0
  63. package/dist/components/json-schema-form-template-menu.js.map +1 -0
  64. package/dist/components/json-schema-form-template.cjs +18 -0
  65. package/dist/components/json-schema-form-template.cjs.map +1 -0
  66. package/dist/components/json-schema-form-template.d.ts +13 -0
  67. package/dist/components/json-schema-form-template.d.ts.map +1 -0
  68. package/dist/components/json-schema-form-template.js +18 -0
  69. package/dist/components/json-schema-form-template.js.map +1 -0
  70. package/dist/components/json-schema-form-types.d.ts +5 -1
  71. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  72. package/dist/components.cjs +4 -0
  73. package/dist/components.cjs.map +1 -1
  74. package/dist/components.d.ts +3 -0
  75. package/dist/components.d.ts.map +1 -1
  76. package/dist/components.js +4 -0
  77. package/dist/components.js.map +1 -1
  78. package/dist/data/Clicky.cjs +6 -9
  79. package/dist/data/Clicky.cjs.map +1 -1
  80. package/dist/data/Clicky.d.ts.map +1 -1
  81. package/dist/data/Clicky.js +6 -9
  82. package/dist/data/Clicky.js.map +1 -1
  83. package/dist/data/DataTable.cjs +23 -17
  84. package/dist/data/DataTable.cjs.map +1 -1
  85. package/dist/data/DataTable.d.ts +7 -1
  86. package/dist/data/DataTable.d.ts.map +1 -1
  87. package/dist/data/DataTable.js +24 -18
  88. package/dist/data/DataTable.js.map +1 -1
  89. package/dist/data/Gauge.cjs +37 -4
  90. package/dist/data/Gauge.cjs.map +1 -1
  91. package/dist/data/Gauge.d.ts +6 -1
  92. package/dist/data/Gauge.d.ts.map +1 -1
  93. package/dist/data/Gauge.js +37 -4
  94. package/dist/data/Gauge.js.map +1 -1
  95. package/dist/data/TimeseriesCoreBars.cjs +127 -29
  96. package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
  97. package/dist/data/TimeseriesCoreBars.d.ts +11 -1
  98. package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
  99. package/dist/data/TimeseriesCoreBars.js +128 -30
  100. package/dist/data/TimeseriesCoreBars.js.map +1 -1
  101. package/dist/data/TimeseriesGauge.cjs +105 -47
  102. package/dist/data/TimeseriesGauge.cjs.map +1 -1
  103. package/dist/data/TimeseriesGauge.d.ts +6 -1
  104. package/dist/data/TimeseriesGauge.d.ts.map +1 -1
  105. package/dist/data/TimeseriesGauge.js +105 -47
  106. package/dist/data/TimeseriesGauge.js.map +1 -1
  107. package/dist/data/WorkloadCard.cjs +371 -0
  108. package/dist/data/WorkloadCard.cjs.map +1 -0
  109. package/dist/data/WorkloadCard.d.ts +24 -0
  110. package/dist/data/WorkloadCard.d.ts.map +1 -0
  111. package/dist/data/WorkloadCard.js +371 -0
  112. package/dist/data/WorkloadCard.js.map +1 -0
  113. package/dist/data/WorkloadCard.model.cjs +51 -0
  114. package/dist/data/WorkloadCard.model.cjs.map +1 -0
  115. package/dist/data/WorkloadCard.model.d.ts +53 -0
  116. package/dist/data/WorkloadCard.model.d.ts.map +1 -0
  117. package/dist/data/WorkloadCard.model.js +51 -0
  118. package/dist/data/WorkloadCard.model.js.map +1 -0
  119. package/dist/data/ai/ChatFab.cjs +3 -1
  120. package/dist/data/ai/ChatFab.cjs.map +1 -1
  121. package/dist/data/ai/ChatFab.d.ts.map +1 -1
  122. package/dist/data/ai/ChatFab.js +3 -1
  123. package/dist/data/ai/ChatFab.js.map +1 -1
  124. package/dist/data/ai/ChatWindow.cjs +25 -7
  125. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  126. package/dist/data/ai/ChatWindow.d.ts +11 -3
  127. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  128. package/dist/data/ai/ChatWindow.js +26 -8
  129. package/dist/data/ai/ChatWindow.js.map +1 -1
  130. package/dist/data/ai/chat-window-context.cjs +2 -1
  131. package/dist/data/ai/chat-window-context.cjs.map +1 -1
  132. package/dist/data/ai/chat-window-context.d.ts +1 -1
  133. package/dist/data/ai/chat-window-context.d.ts.map +1 -1
  134. package/dist/data/ai/chat-window-context.js +2 -1
  135. package/dist/data/ai/chat-window-context.js.map +1 -1
  136. package/dist/data/ai/context.cjs.map +1 -1
  137. package/dist/data/ai/context.d.ts +3 -0
  138. package/dist/data/ai/context.d.ts.map +1 -1
  139. package/dist/data/ai/context.js.map +1 -1
  140. package/dist/data/chat/Chat.cjs +13 -2
  141. package/dist/data/chat/Chat.cjs.map +1 -1
  142. package/dist/data/chat/Chat.d.ts +4 -2
  143. package/dist/data/chat/Chat.d.ts.map +1 -1
  144. package/dist/data/chat/Chat.js +14 -3
  145. package/dist/data/chat/Chat.js.map +1 -1
  146. package/dist/data/chat/Conversation.cjs +47 -2
  147. package/dist/data/chat/Conversation.cjs.map +1 -1
  148. package/dist/data/chat/Conversation.d.ts +8 -2
  149. package/dist/data/chat/Conversation.d.ts.map +1 -1
  150. package/dist/data/chat/Conversation.js +47 -2
  151. package/dist/data/chat/Conversation.js.map +1 -1
  152. package/dist/data/chat/Message.cjs +13 -4
  153. package/dist/data/chat/Message.cjs.map +1 -1
  154. package/dist/data/chat/Message.d.ts +4 -2
  155. package/dist/data/chat/Message.d.ts.map +1 -1
  156. package/dist/data/chat/Message.js +13 -4
  157. package/dist/data/chat/Message.js.map +1 -1
  158. package/dist/data/chat/ToolCall.cjs +9 -4
  159. package/dist/data/chat/ToolCall.cjs.map +1 -1
  160. package/dist/data/chat/ToolCall.d.ts +3 -2
  161. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  162. package/dist/data/chat/ToolCall.js +9 -4
  163. package/dist/data/chat/ToolCall.js.map +1 -1
  164. package/dist/data/chat/index.d.ts +1 -1
  165. package/dist/data/chat/index.d.ts.map +1 -1
  166. package/dist/data/chat/types.cjs.map +1 -1
  167. package/dist/data/chat/types.d.ts +7 -0
  168. package/dist/data/chat/types.d.ts.map +1 -1
  169. package/dist/data/chat/types.js.map +1 -1
  170. package/dist/data/version-info.cjs +3 -3
  171. package/dist/data/version-info.js +3 -3
  172. package/dist/data.cjs +7 -0
  173. package/dist/data.cjs.map +1 -1
  174. package/dist/data.d.ts +5 -3
  175. package/dist/data.d.ts.map +1 -1
  176. package/dist/data.js +8 -1
  177. package/dist/data.js.map +1 -1
  178. package/dist/hooks/use-sort.cjs +19 -10
  179. package/dist/hooks/use-sort.cjs.map +1 -1
  180. package/dist/hooks/use-sort.d.ts +3 -0
  181. package/dist/hooks/use-sort.d.ts.map +1 -1
  182. package/dist/hooks/use-sort.js +19 -10
  183. package/dist/hooks/use-sort.js.map +1 -1
  184. package/dist/index.cjs +11 -0
  185. package/dist/index.cjs.map +1 -1
  186. package/dist/index.js +11 -0
  187. package/dist/index.js.map +1 -1
  188. package/dist/layout/AppShell.cjs +6 -10
  189. package/dist/layout/AppShell.cjs.map +1 -1
  190. package/dist/layout/AppShell.d.ts +2 -0
  191. package/dist/layout/AppShell.d.ts.map +1 -1
  192. package/dist/layout/AppShell.js +6 -10
  193. package/dist/layout/AppShell.js.map +1 -1
  194. package/dist/overlay/DropdownMenu.cjs +50 -38
  195. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  196. package/dist/overlay/DropdownMenu.d.ts +5 -1
  197. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  198. package/dist/overlay/DropdownMenu.js +50 -38
  199. package/dist/overlay/DropdownMenu.js.map +1 -1
  200. package/dist/overlay/HoverCard.cjs +7 -2
  201. package/dist/overlay/HoverCard.cjs.map +1 -1
  202. package/dist/overlay/HoverCard.d.ts.map +1 -1
  203. package/dist/overlay/HoverCard.js +7 -2
  204. package/dist/overlay/HoverCard.js.map +1 -1
  205. package/dist/overlay/Modal.cjs +20 -17
  206. package/dist/overlay/Modal.cjs.map +1 -1
  207. package/dist/overlay/Modal.d.ts.map +1 -1
  208. package/dist/overlay/Modal.js +21 -18
  209. package/dist/overlay/Modal.js.map +1 -1
  210. package/dist/overlay/Toast.cjs +9 -1
  211. package/dist/overlay/Toast.cjs.map +1 -1
  212. package/dist/overlay/Toast.d.ts.map +1 -1
  213. package/dist/overlay/Toast.js +9 -1
  214. package/dist/overlay/Toast.js.map +1 -1
  215. package/dist/overlay/modalStack.cjs +53 -1
  216. package/dist/overlay/modalStack.cjs.map +1 -1
  217. package/dist/overlay/modalStack.d.ts +12 -0
  218. package/dist/overlay/modalStack.d.ts.map +1 -1
  219. package/dist/overlay/modalStack.js +54 -2
  220. package/dist/overlay/modalStack.js.map +1 -1
  221. package/dist/overlay/zIndex.cjs +20 -0
  222. package/dist/overlay/zIndex.cjs.map +1 -0
  223. package/dist/overlay/zIndex.d.ts +39 -0
  224. package/dist/overlay/zIndex.d.ts.map +1 -0
  225. package/dist/overlay/zIndex.js +20 -0
  226. package/dist/overlay/zIndex.js.map +1 -0
  227. package/dist/rpc/AcceptPicker.cjs +28 -26
  228. package/dist/rpc/AcceptPicker.cjs.map +1 -1
  229. package/dist/rpc/AcceptPicker.d.ts.map +1 -1
  230. package/dist/rpc/AcceptPicker.js +29 -27
  231. package/dist/rpc/AcceptPicker.js.map +1 -1
  232. package/dist/styles.css +1 -1
  233. package/package.json +1 -1
@@ -2,8 +2,10 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
+ const react$1 = require("@floating-ui/react");
5
6
  const Icon = require("../data/Icon.cjs");
6
7
  const utils = require("../lib/utils.cjs");
8
+ const modalStack = require("../overlay/modalStack.cjs");
7
9
  const button = require("./button.cjs");
8
10
  const select = require("./select.cjs");
9
11
  const UiWatch = require("../icons/components/UiWatch.cjs");
@@ -152,8 +154,6 @@ function TimeRange({
152
154
  triggerClassName,
153
155
  panelClassName
154
156
  }) {
155
- const rootRef = react.useRef(null);
156
- const triggerRef = react.useRef(null);
157
157
  const [open, setOpen] = react.useState(false);
158
158
  const [draftFrom, setDraftFrom] = react.useState(from);
159
159
  const [draftTo, setDraftTo] = react.useState(to);
@@ -165,7 +165,23 @@ function TimeRange({
165
165
  presets,
166
166
  chipRows
167
167
  );
168
- useDismissablePopup(open, rootRef, triggerRef, () => setOpen(false));
168
+ const floatingZ = modalStack.useFloatingZIndex();
169
+ const { refs, floatingStyles, context } = react$1.useFloating({
170
+ open,
171
+ onOpenChange: setOpen,
172
+ placement: align === "left" ? "bottom-start" : "bottom-end",
173
+ whileElementsMounted: react$1.autoUpdate,
174
+ middleware: [react$1.offset(6), react$1.flip({ padding: 8 }), react$1.shift({ padding: 8 })]
175
+ });
176
+ const { getReferenceProps, getFloatingProps } = react$1.useInteractions([
177
+ react$1.useClick(context),
178
+ react$1.useDismiss(context, { escapeKey: false }),
179
+ react$1.useRole(context, { role: "dialog" })
180
+ ]);
181
+ modalStack.useEscapeLayer(open, () => {
182
+ setOpen(false);
183
+ if (refs.domReference.current instanceof HTMLElement) refs.domReference.current.focus();
184
+ });
169
185
  react.useEffect(() => {
170
186
  if (open) {
171
187
  setDraftFrom(from);
@@ -197,23 +213,21 @@ function TimeRange({
197
213
  onApply("", "");
198
214
  setOpen(false);
199
215
  }
200
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: rootRef, className: utils.cn("relative inline-flex", className), children: [
216
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn("inline-flex", className), children: [
201
217
  /* @__PURE__ */ jsxRuntime.jsxs(
202
218
  button.Button,
203
219
  {
204
- ref: triggerRef,
220
+ ref: refs.setReference,
205
221
  type: "button",
206
222
  variant: "outline",
207
223
  size: "sm",
208
224
  "aria-label": `${label} filter`,
209
- "aria-expanded": open,
210
- "aria-haspopup": "dialog",
211
225
  disabled,
212
- onClick: () => setOpen((current) => !current),
213
226
  className: utils.cn(
214
227
  "h-7 w-fit max-w-[12rem] min-w-0 gap-2 px-2 text-xs font-normal",
215
228
  triggerClassName
216
229
  ),
230
+ ...getReferenceProps(),
217
231
  children: [
218
232
  /* @__PURE__ */ jsxRuntime.jsx(
219
233
  Icon.Icon,
@@ -226,22 +240,24 @@ function TimeRange({
226
240
  ]
227
241
  }
228
242
  ),
229
- open && /* @__PURE__ */ jsxRuntime.jsxs(
243
+ open && /* @__PURE__ */ jsxRuntime.jsx(react$1.FloatingPortal, { children: /* @__PURE__ */ jsxRuntime.jsx(react$1.FloatingFocusManager, { context, modal: false, children: /* @__PURE__ */ jsxRuntime.jsxs(
230
244
  "div",
231
245
  {
246
+ ref: refs.setFloating,
232
247
  role: "dialog",
233
248
  "aria-label": label,
249
+ style: { ...floatingStyles, zIndex: floatingZ },
234
250
  className: utils.cn(
235
- "fixed inset-x-2 bottom-4 top-16 z-50 flex flex-col overflow-hidden rounded-lg border border-border bg-popover text-popover-foreground shadow-lg shadow-black/10 outline-none md:absolute md:bottom-auto md:top-[calc(100%+0.375rem)] md:block md:w-[22.5rem] md:shadow-black/5",
236
- align === "left" ? "md:left-0" : "md:right-0",
251
+ "flex max-h-[min(32rem,calc(100vh-2rem))] w-[22.5rem] max-w-[calc(100vw-1rem)] flex-col overflow-hidden rounded-lg border border-border bg-popover text-popover-foreground shadow-lg shadow-black/10 outline-none",
237
252
  panelClassName
238
253
  ),
254
+ ...getFloatingProps(),
239
255
  children: [
240
256
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between border-b border-border/60 px-3.5 py-2.5", children: [
241
257
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: label }),
242
258
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-mono text-[10px] text-muted-foreground", children: timeEnabled ? selectedTimeZone : "Relative" })
243
259
  ] }),
244
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-h-0 flex-1 overflow-y-auto md:overflow-visible", children: [
260
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-h-0 flex-1 overflow-y-auto", children: [
245
261
  activeChipRows.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(ChipRowList, { rows: activeChipRows, activeToken, onApply: applyRange }),
246
262
  activePresets.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: activeChipRows.length > 0 ? "px-3.5 pb-3" : "px-3.5 pt-3", children: /* @__PURE__ */ jsxRuntime.jsx(PresetList, { presets: activePresets, onApply: applyRange }) }),
247
263
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-t border-border/60 bg-muted/30 px-3.5 py-2.5", children: [
@@ -339,7 +355,7 @@ function TimeRange({
339
355
  ] })
340
356
  ]
341
357
  }
342
- )
358
+ ) }) })
343
359
  ] });
344
360
  }
345
361
  function DraftRangeInput({
@@ -580,30 +596,6 @@ function formatPresetRange({ from, to }) {
580
596
  if (!to || to === "now") return from;
581
597
  return `${from} -> ${to}`;
582
598
  }
583
- function useDismissablePopup(open, rootRef, triggerRef, onClose) {
584
- react.useEffect(() => {
585
- if (!open) return;
586
- const onPointerDown = (event) => {
587
- var _a;
588
- if (!((_a = rootRef.current) == null ? void 0 : _a.contains(event.target))) {
589
- onClose();
590
- }
591
- };
592
- const onKeyDown = (event) => {
593
- var _a;
594
- if (event.key === "Escape") {
595
- onClose();
596
- (_a = triggerRef.current) == null ? void 0 : _a.focus();
597
- }
598
- };
599
- document.addEventListener("mousedown", onPointerDown);
600
- document.addEventListener("keydown", onKeyDown);
601
- return () => {
602
- document.removeEventListener("mousedown", onPointerDown);
603
- document.removeEventListener("keydown", onKeyDown);
604
- };
605
- }, [onClose, open, rootRef, triggerRef]);
606
- }
607
599
  function normalizeRangeValue(kind, value, options = {}) {
608
600
  const trimmed = value.trim();
609
601
  if (!trimmed) return "";
@@ -1 +1 @@
1
- {"version":3,"file":"TimeRange.cjs","sources":["../../src/components/TimeRange.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type RefObject } from \"react\";\nimport { Icon } from \"../data/Icon\";\nimport { UiArrowRight, UiCalendar, UiClose, UiWatch } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { Select } from \"./select\";\n\nexport type TimeRangeKind = \"time\" | \"date\";\n\nexport type TimeRangePresetGroup = \"min\" | \"hr\" | \"day\" | \"wk+\" | \"this\" | \"last\";\n\nexport type TimeRangePreset = {\n /** Visible label for the preset row. */\n label: string;\n /** Start value applied when the preset is selected, e.g. `now-1h`. */\n from: string;\n /** End value applied when the preset is selected, usually `now`. */\n to: string;\n};\n\nexport type TimeRangeChipRow = {\n /** Stable row id used as the React key. */\n id: string;\n /** Group label shown beside the chips. */\n label: string;\n /** Preset chips rendered in this row. */\n chips: {\n /** Compact label shown in the chip. */\n label: string;\n /** Start value applied when clicked, e.g. `now-15m`. */\n token: string;\n /** Optional end value; defaults to `now`. */\n to?: string;\n /** Accessible label for the chip button. */\n ariaLabel?: string;\n /** Optional browser tooltip. */\n title?: string;\n }[];\n};\n\nexport type TimeRangeProps = {\n /** Controls whether the inputs accept date-only or date-time values. */\n kind?: TimeRangeKind;\n /** Label shown in the trigger before the selected range summary. */\n label?: string;\n /** Current start value. Relative values such as `now-1h` are supported. */\n from?: string;\n /** Current end value. Relative values such as `now` are supported. */\n to?: string;\n /** Called when the user applies a typed value or preset. */\n onApply: (from: string, to: string) => void;\n /** Presets or preset groups to show in the popup. */\n presets?: Array<TimeRangePreset | TimeRangePresetGroup>;\n /** Explicit chip rows; overrides the built-in preset group layout. */\n chipRows?: TimeRangeChipRow[];\n /** Enables time fields for date-time ranges. */\n timeEnabled?: boolean;\n /** Selected timezone shown in the popup. */\n timeZone?: string;\n /** Available timezone options. */\n timeZones?: string[];\n /** Placeholder for the start input. */\n fromPlaceholder?: string;\n /** Placeholder for the end input. */\n toPlaceholder?: string;\n /** Trigger text when neither boundary is set. */\n emptyLabel?: string;\n /** Aligns the popup to the trigger's left or right edge. */\n align?: \"left\" | \"right\";\n /** Disables opening and applying changes. */\n disabled?: boolean;\n /** Classes applied to the root wrapper. */\n className?: string;\n /** Classes applied to the trigger button. */\n triggerClassName?: string;\n /** Classes applied to the popup panel. */\n panelClassName?: string;\n};\n\nconst defaultTimeChipRows: TimeRangeChipRow[] = [\n {\n id: \"minutes\",\n label: \"Min\",\n chips: [\n { label: \"5m\", token: \"now-5m\" },\n { label: \"15m\", token: \"now-15m\" },\n { label: \"30m\", token: \"now-30m\" },\n ],\n },\n {\n id: \"hours\",\n label: \"Hr\",\n chips: [\n { label: \"1h\", token: \"now-1h\" },\n { label: \"2h\", token: \"now-2h\" },\n { label: \"4h\", token: \"now-4h\" },\n { label: \"8h\", token: \"now-8h\" },\n { label: \"12h\", token: \"now-12h\" },\n ],\n },\n {\n id: \"days\",\n label: \"Day\",\n chips: [\n { label: \"1d\", token: \"now-1d\" },\n { label: \"2d\", token: \"now-2d\" },\n { label: \"3d\", token: \"now-3d\" },\n { label: \"1w\", token: \"now-1w\" },\n ],\n },\n {\n id: \"weeks\",\n label: \"Wk+\",\n chips: [\n { label: \"2w\", token: \"now-2w\" },\n { label: \"1M\", token: \"now-1M\" },\n { label: \"3M\", token: \"now-3M\" },\n { label: \"6M\", token: \"now-6M\" },\n { label: \"1y\", token: \"now-1y\" },\n ],\n },\n];\n\nconst timeChipRowsByGroup: Record<\n Exclude<TimeRangePresetGroup, \"this\" | \"last\">,\n TimeRangeChipRow\n> = {\n min: defaultTimeChipRows[0]!,\n hr: defaultTimeChipRows[1]!,\n day: defaultTimeChipRows[2]!,\n \"wk+\": defaultTimeChipRows[3]!,\n};\n\nconst defaultDateChipRows: TimeRangeChipRow[] = [\n {\n id: \"days\",\n label: \"Day\",\n chips: [\n { label: \"1d\", token: \"now-1d\" },\n { label: \"2d\", token: \"now-2d\" },\n { label: \"3d\", token: \"now-3d\" },\n { label: \"7d\", token: \"now-7d\" },\n ],\n },\n {\n id: \"weeks\",\n label: \"Wk\",\n chips: [\n { label: \"1w\", token: \"now-1w\" },\n { label: \"2w\", token: \"now-2w\" },\n { label: \"4w\", token: \"now-4w\" },\n ],\n },\n {\n id: \"months\",\n label: \"Mo\",\n chips: [\n { label: \"1M\", token: \"now-1M\" },\n { label: \"3M\", token: \"now-3M\" },\n { label: \"6M\", token: \"now-6M\" },\n { label: \"1y\", token: \"now-1y\" },\n ],\n },\n];\n\nconst thisLastChipRows: Record<Extract<TimeRangePresetGroup, \"this\" | \"last\">, TimeRangeChipRow> = {\n this: {\n id: \"this\",\n label: \"This\",\n chips: [\n { label: \"Week\", token: \"now/w\", to: \"now/w+1w\", ariaLabel: \"this week\" },\n {\n label: \"Month\",\n token: \"now/M\",\n to: \"now/M+1M\",\n ariaLabel: \"this month\",\n },\n {\n label: \"Quarter\",\n token: \"now/q\",\n to: \"now/q+1q\",\n ariaLabel: \"this quarter\",\n },\n { label: \"Year\", token: \"now/y\", to: \"now/y+1y\", ariaLabel: \"this year\" },\n ],\n },\n last: {\n id: \"last\",\n label: \"Last\",\n chips: [\n { label: \"Week\", token: \"now/w-1w\", to: \"now/w\", ariaLabel: \"last week\" },\n {\n label: \"Month\",\n token: \"now/M-1M\",\n to: \"now/M\",\n ariaLabel: \"last month\",\n },\n {\n label: \"Quarter\",\n token: \"now/q-1q\",\n to: \"now/q\",\n ariaLabel: \"last quarter\",\n },\n { label: \"Year\", token: \"now/y-1y\", to: \"now/y\", ariaLabel: \"last year\" },\n ],\n },\n};\n\nexport function TimeRange({\n kind = \"time\",\n label = \"Time range\",\n from = \"\",\n to = \"\",\n onApply,\n presets,\n chipRows,\n timeEnabled = false,\n timeZone,\n timeZones,\n fromPlaceholder,\n toPlaceholder,\n emptyLabel,\n align = \"right\",\n disabled = false,\n className,\n triggerClassName,\n panelClassName,\n}: TimeRangeProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n const [draftFrom, setDraftFrom] = useState(from);\n const [draftTo, setDraftTo] = useState(to);\n const resolvedDefaultTimeZone = timeZone ?? getDefaultTimeZone();\n const [selectedTimeZone, setSelectedTimeZone] = useState(resolvedDefaultTimeZone);\n\n const activeTimeZones = resolveTimeZones(timeZones, selectedTimeZone);\n const { rows: activeChipRows, presets: activePresets } = resolvePresetConfig(\n kind,\n presets,\n chipRows,\n );\n\n useDismissablePopup(open, rootRef, triggerRef, () => setOpen(false));\n\n useEffect(() => {\n if (open) {\n setDraftFrom(from);\n setDraftTo(to);\n setSelectedTimeZone(resolvedDefaultTimeZone);\n }\n }, [from, open, resolvedDefaultTimeZone, to]);\n\n const buttonLabel =\n formatSelectedPresetLabel(from, to, activeChipRows, activePresets) ??\n formatRangeLabel(kind, from, to, emptyLabel);\n const activeToken = normalizeRangeValue(kind, from, {\n timeEnabled,\n timeZone: selectedTimeZone,\n });\n\n function applyRange(nextFrom: string, nextTo: string) {\n onApply(\n normalizeRangeValue(kind, nextFrom, {\n timeEnabled,\n timeZone: selectedTimeZone,\n }),\n normalizeRangeValue(kind, nextTo, {\n timeEnabled,\n timeZone: selectedTimeZone,\n }),\n );\n setOpen(false);\n }\n\n function clearRange() {\n setDraftFrom(\"\");\n setDraftTo(\"\");\n onApply(\"\", \"\");\n setOpen(false);\n }\n\n return (\n <div ref={rootRef} className={cn(\"relative inline-flex\", className)}>\n <Button\n ref={triggerRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`${label} filter`}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n disabled={disabled}\n onClick={() => setOpen((current) => !current)}\n className={cn(\n \"h-7 w-fit max-w-[12rem] min-w-0 gap-2 px-2 text-xs font-normal\",\n triggerClassName,\n )}\n >\n <Icon\n icon={kind === \"time\" ? UiWatch : UiCalendar}\n className=\"text-muted-foreground text-[14px]\"\n />\n <span className=\"truncate font-normal tabular-nums\">{buttonLabel}</span>\n </Button>\n\n {open && (\n <div\n role=\"dialog\"\n aria-label={label}\n className={cn(\n \"fixed inset-x-2 bottom-4 top-16 z-50 flex flex-col overflow-hidden rounded-lg border border-border bg-popover text-popover-foreground shadow-lg shadow-black/10 outline-none md:absolute md:bottom-auto md:top-[calc(100%+0.375rem)] md:block md:w-[22.5rem] md:shadow-black/5\",\n align === \"left\" ? \"md:left-0\" : \"md:right-0\",\n panelClassName,\n )}\n >\n <div className=\"flex items-center justify-between border-b border-border/60 px-3.5 py-2.5\">\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {label}\n </span>\n <span className=\"font-mono text-[10px] text-muted-foreground\">\n {timeEnabled ? selectedTimeZone : \"Relative\"}\n </span>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto md:overflow-visible\">\n {activeChipRows.length > 0 && (\n <ChipRowList rows={activeChipRows} activeToken={activeToken} onApply={applyRange} />\n )}\n {activePresets.length > 0 && (\n <div className={activeChipRows.length > 0 ? \"px-3.5 pb-3\" : \"px-3.5 pt-3\"}>\n <PresetList presets={activePresets} onApply={applyRange} />\n </div>\n )}\n\n <div className=\"border-t border-border/60 bg-muted/30 px-3.5 py-2.5\">\n <div className=\"mb-1.5 flex flex-wrap items-center justify-between gap-2\">\n <div className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n Custom\n </div>\n {timeEnabled && (\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n TZ\n </span>\n <Select\n aria-label={`${label} timezone`}\n value={selectedTimeZone}\n options={activeTimeZones.map((zone) => ({\n value: zone,\n label: zone,\n }))}\n onChange={(event) => setSelectedTimeZone(event.target.value)}\n className=\"h-7 w-40 truncate px-2 pr-7 font-mono text-xs\"\n />\n </div>\n )}\n </div>\n <div className=\"grid gap-1.5 md:grid-cols-[1fr_auto_1fr] md:items-center\">\n <DraftRangeInput\n aria-label={`${label} from`}\n placeholder={\n fromPlaceholder ?? (kind === \"date\" ? \"YYYY-MM-DD or now-1d\" : \"now-24h\")\n }\n value={draftFrom}\n onChange={setDraftFrom}\n onClear={() => setDraftFrom(\"\")}\n pickerKind={kind}\n timeEnabled={timeEnabled}\n />\n <Icon\n icon={UiArrowRight}\n className=\"hidden text-muted-foreground text-[12px] md:block\"\n />\n <DraftRangeInput\n aria-label={`${label} to`}\n placeholder={toPlaceholder ?? (kind === \"date\" ? \"YYYY-MM-DD or now\" : \"now\")}\n value={draftTo}\n onChange={setDraftTo}\n onClear={() => setDraftTo(\"\")}\n pickerKind={kind}\n timeEnabled={timeEnabled}\n />\n </div>\n </div>\n </div>\n\n <div className=\"flex items-center justify-between border-t border-border/60 px-3 py-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2.5 text-xs\"\n disabled={!from && !to}\n onClick={clearRange}\n >\n Clear\n </Button>\n <div className=\"flex gap-1.5\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2.5 text-xs\"\n onClick={() => setOpen(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n className=\"h-7 px-3.5 text-xs\"\n onClick={() => applyRange(draftFrom, draftTo)}\n >\n Apply\n </Button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction DraftRangeInput({\n value,\n onChange,\n onClear,\n placeholder,\n pickerKind,\n timeEnabled,\n ...rest\n}: {\n value: string;\n onChange: (value: string) => void;\n onClear: () => void;\n placeholder: string | undefined;\n pickerKind?: TimeRangeKind;\n timeEnabled: boolean;\n \"aria-label\": string;\n}) {\n const ariaLabel = rest[\"aria-label\"];\n const showCalendar = pickerKind !== undefined;\n const showTimeInput = pickerKind === \"time\" && timeEnabled;\n const { date: datePart, time: timePart } = splitDateTime(value);\n\n function setDatePart(nextDate: string) {\n if (!showTimeInput) {\n onChange(nextDate);\n return;\n }\n if (!nextDate) {\n onChange(timePart ? `T${timePart}` : \"\");\n return;\n }\n onChange(timePart ? `${nextDate}T${timePart}` : nextDate);\n }\n\n function setTimePart(nextTime: string) {\n if (!nextTime) {\n onChange(datePart);\n return;\n }\n onChange(datePart ? `${datePart}T${nextTime}` : `T${nextTime}`);\n }\n\n return (\n <div className=\"space-y-1\">\n <DraftTextInput\n ariaLabel={ariaLabel}\n placeholder={placeholder}\n value={showTimeInput ? datePart : value}\n onChange={showTimeInput ? setDatePart : onChange}\n onClear={onClear}\n showCalendar={showCalendar}\n />\n {showTimeInput && (\n <DraftTimeInput ariaLabel={`${ariaLabel} time`} value={timePart} onChange={setTimePart} />\n )}\n </div>\n );\n}\n\nfunction resolvePresetConfig(\n kind: TimeRangeKind,\n presets: TimeRangeProps[\"presets\"],\n chipRows: TimeRangeChipRow[] | undefined,\n) {\n if (presets === undefined) {\n return {\n rows: chipRows ?? (kind === \"date\" ? defaultDateChipRows : defaultTimeChipRows),\n presets: [] as TimeRangePreset[],\n };\n }\n\n const rows: TimeRangeChipRow[] = chipRows ? [...chipRows] : [];\n const presetList: TimeRangePreset[] = [];\n\n for (const preset of presets) {\n if (typeof preset !== \"string\") {\n presetList.push(preset);\n continue;\n }\n if (preset === \"this\" || preset === \"last\") {\n rows.push(thisLastChipRows[preset]);\n continue;\n }\n rows.push(timeChipRowsByGroup[preset]);\n }\n\n return { rows, presets: presetList };\n}\n\nfunction DraftTextInput({\n ariaLabel,\n value,\n onChange,\n onClear,\n placeholder,\n showCalendar,\n}: {\n ariaLabel: string;\n value: string;\n onChange: (value: string) => void;\n onClear: () => void;\n placeholder: string | undefined;\n showCalendar: boolean;\n}) {\n const pickerRef = useRef<HTMLInputElement | null>(null);\n const hasValue = value.length > 0;\n const paddingRight = showCalendar ? (hasValue ? \"pr-12\" : \"pr-7\") : \"pr-7\";\n\n return (\n <div className=\"relative\">\n <input\n type=\"text\"\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n className={cn(\n \"h-8 w-full rounded-md border border-input bg-background px-2 font-mono text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n paddingRight,\n )}\n />\n {hasValue && (\n <button\n type=\"button\"\n aria-label={`Clear ${ariaLabel}`}\n onClick={onClear}\n className={cn(\n \"absolute inset-y-0 inline-flex w-5 items-center justify-center text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n showCalendar ? \"right-6\" : \"right-1\",\n )}\n >\n <Icon icon={UiClose} className=\"text-[12px]\" />\n </button>\n )}\n {showCalendar && (\n <>\n <input\n ref={pickerRef}\n type=\"date\"\n tabIndex={-1}\n aria-hidden=\"true\"\n value={/^\\d{4}-\\d{2}-\\d{2}$/.test(value.trim()) ? value.trim() : \"\"}\n onChange={(event) => onChange(event.target.value)}\n className=\"pointer-events-none absolute left-0 top-0 h-0 w-0 opacity-0\"\n />\n <button\n type=\"button\"\n aria-label={`Pick ${ariaLabel}`}\n onClick={() => pickerRef.current?.showPicker?.()}\n className=\"absolute inset-y-0 right-1 inline-flex w-5 items-center justify-center text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Icon icon={UiCalendar} className=\"text-[12px]\" />\n </button>\n </>\n )}\n </div>\n );\n}\n\nfunction DraftTimeInput({\n ariaLabel,\n value,\n onChange,\n}: {\n ariaLabel: string;\n value: string;\n onChange: (value: string) => void;\n}) {\n return (\n <input\n type=\"time\"\n aria-label={ariaLabel}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n className=\"h-8 w-full rounded-md border border-input bg-background px-2 font-mono text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n );\n}\n\nfunction splitDateTime(value: string) {\n const trimmed = value.trim();\n const match = /^(\\d{4}-\\d{2}-\\d{2})?T?(\\d{2}:\\d{2})?/.exec(trimmed);\n if (!match || trimmed.startsWith(\"now\") || /^[+-]/.test(trimmed)) {\n return { date: trimmed, time: \"\" };\n }\n return { date: match[1] ?? \"\", time: match[2] ?? \"\" };\n}\n\nfunction ChipRowList({\n rows,\n activeToken,\n onApply,\n}: {\n rows: TimeRangeChipRow[];\n activeToken: string;\n onApply: (from: string, to: string) => void;\n}) {\n if (rows.length === 0) return null;\n\n return (\n <div className=\"px-3.5 py-3\" role=\"list\" aria-label=\"Time filters\">\n {rows.map((row, index) => (\n <div\n key={row.id}\n className={cn(\n \"grid grid-cols-[2rem_1fr] items-center gap-2\",\n index === rows.length - 1 ? \"\" : \"mb-1.5\",\n )}\n role=\"listitem\"\n >\n <span className=\"text-[9.5px] font-bold uppercase tracking-wider text-muted-foreground\">\n {row.label}\n </span>\n <div className=\"flex divide-x divide-border overflow-hidden rounded-[5px] border border-border\">\n {row.chips.map((chip) => {\n const active = chip.token === activeToken;\n return (\n <button\n key={chip.token}\n type=\"button\"\n title={chip.title ?? chip.ariaLabel ?? chip.token}\n aria-label={chip.ariaLabel ?? chip.token}\n aria-pressed={active}\n onClick={() => onApply(chip.token, chip.to ?? \"now\")}\n className={cn(\n \"flex-1 min-w-0 px-0 py-1.5 text-center font-mono text-[11.5px] leading-none transition-colors focus-visible:relative focus-visible:z-10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n active\n ? \"bg-foreground font-semibold text-background\"\n : \"bg-background font-medium text-muted-foreground hover:bg-muted\",\n )}\n >\n {chip.label}\n </button>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction PresetList({\n presets,\n onApply,\n}: {\n presets: TimeRangePreset[];\n onApply: (from: string, to: string) => void;\n}) {\n if (presets.length === 0) return null;\n\n return (\n <div className=\"mb-3 space-y-1\" role=\"list\" aria-label=\"Time filters\">\n {presets.map((preset) => (\n <button\n key={`${preset.label}-${preset.from}-${preset.to}`}\n type=\"button\"\n className=\"flex h-8 w-full items-center justify-between gap-3 rounded-md border border-border bg-background px-2 text-left text-xs hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={() => onApply(preset.from, preset.to)}\n >\n <span className=\"min-w-0 truncate font-medium\">{preset.label}</span>\n <span className=\"shrink-0 font-mono text-[11px] text-muted-foreground\">\n {formatPresetRange(preset)}\n </span>\n </button>\n ))}\n </div>\n );\n}\n\nfunction formatSelectedPresetLabel(\n from: string,\n to: string,\n rows: TimeRangeChipRow[],\n presets: TimeRangePreset[],\n) {\n const normalizedFrom = from.trim();\n const normalizedTo = to.trim();\n if (!normalizedFrom && !normalizedTo) return undefined;\n\n for (const row of rows) {\n for (const chip of row.chips) {\n if (chip.token === normalizedFrom && (chip.to ?? \"now\") === normalizedTo) {\n return chip.ariaLabel ?? chip.title ?? chip.label;\n }\n }\n }\n\n return presets.find((preset) => preset.from === normalizedFrom && preset.to === normalizedTo)\n ?.label;\n}\n\nfunction formatPresetRange({ from, to }: TimeRangePreset) {\n if (!from) return to;\n if (!to || to === \"now\") return from;\n return `${from} -> ${to}`;\n}\n\nfunction useDismissablePopup(\n open: boolean,\n rootRef: RefObject<HTMLElement | null>,\n triggerRef: RefObject<HTMLElement | null>,\n onClose: () => void,\n) {\n useEffect(() => {\n if (!open) return;\n\n const onPointerDown = (event: MouseEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) {\n onClose();\n }\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n triggerRef.current?.focus();\n }\n };\n\n document.addEventListener(\"mousedown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [onClose, open, rootRef, triggerRef]);\n}\n\nfunction normalizeRangeValue(\n kind: TimeRangeKind,\n value: string,\n options: { timeEnabled?: boolean; timeZone?: string } = {},\n) {\n const trimmed = value.trim();\n if (!trimmed) return \"\";\n if (trimmed === \"now\" || trimmed.startsWith(\"now\")) return trimmed;\n if (kind === \"time\" && /^[+-]\\d/.test(trimmed)) return `now${trimmed}`;\n if (kind === \"time\" && options.timeEnabled) {\n return encodeDateTimeWithOffset(trimmed, options.timeZone ?? getDefaultTimeZone());\n }\n return trimmed;\n}\n\nfunction formatRangeLabel(kind: TimeRangeKind, from: string, to: string, emptyLabel?: string) {\n const trimmedFrom = from.trim();\n const trimmedTo = to.trim();\n\n if (!trimmedFrom && !trimmedTo) {\n return emptyLabel ?? (kind === \"date\" ? \"Any date\" : \"now-24h\");\n }\n\n if (kind === \"time\") {\n const normalizedFrom = normalizeRangeValue(kind, trimmedFrom);\n const normalizedTo = normalizeRangeValue(kind, trimmedTo || \"now\");\n if (!normalizedFrom) return normalizedTo;\n if (normalizedTo === \"now\") return normalizedFrom;\n return `${normalizedFrom} -> ${normalizedTo}`;\n }\n\n if (trimmedFrom && trimmedTo && trimmedFrom === trimmedTo) {\n return trimmedFrom;\n }\n\n if (!trimmedFrom) return trimmedTo;\n if (!trimmedTo) return trimmedFrom;\n return `${trimmedFrom} -> ${trimmedTo}`;\n}\n\nfunction getDefaultTimeZone() {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\";\n } catch {\n return \"UTC\";\n }\n}\n\nfunction resolveTimeZones(timeZones: string[] | undefined, selectedTimeZone: string) {\n const zones = timeZones && timeZones.length > 0 ? timeZones : [selectedTimeZone, \"UTC\"];\n return Array.from(new Set([selectedTimeZone, ...zones, \"UTC\"].filter(Boolean)));\n}\n\nfunction encodeDateTimeWithOffset(value: string, timeZone: string) {\n if (!isLocalDateTime(value) || hasExplicitOffset(value)) return value;\n\n const match = value.match(/^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})(?::(\\d{2}))?(?:\\.\\d+)?$/);\n if (!match) return value;\n\n const [, year, month, day, hour, minute, second = \"00\"] = match;\n const localUtcMillis = Date.UTC(\n Number(year),\n Number(month) - 1,\n Number(day),\n Number(hour),\n Number(minute),\n Number(second),\n );\n const offsetMinutes = getTimeZoneOffsetMinutes(timeZone, localUtcMillis);\n return `${year}-${month}-${day}T${hour}:${minute}:${second}${formatOffset(offsetMinutes)}`;\n}\n\nfunction isLocalDateTime(value: string) {\n return /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2})?(?:\\.\\d+)?$/.test(value.trim());\n}\n\nfunction hasExplicitOffset(value: string) {\n return /(?:Z|[+-]\\d{2}:?\\d{2})$/i.test(value.trim());\n}\n\nfunction getTimeZoneOffsetMinutes(timeZone: string, localUtcMillis: number) {\n try {\n const formatter = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n const parts = Object.fromEntries(\n formatter\n .formatToParts(new Date(localUtcMillis))\n .filter((part) => part.type !== \"literal\")\n .map((part) => [part.type, part.value]),\n );\n const zonedUtcMillis = Date.UTC(\n Number(parts.year),\n Number(parts.month) - 1,\n Number(parts.day),\n Number(parts.hour),\n Number(parts.minute),\n Number(parts.second),\n );\n return (zonedUtcMillis - localUtcMillis) / 60_000;\n } catch {\n return 0;\n }\n}\n\nfunction formatOffset(offsetMinutes: number) {\n const sign = offsetMinutes >= 0 ? \"+\" : \"-\";\n const abs = Math.abs(offsetMinutes);\n const hours = Math.floor(abs / 60)\n .toString()\n .padStart(2, \"0\");\n const minutes = Math.floor(abs % 60)\n .toString()\n .padStart(2, \"0\");\n return `${sign}${hours}:${minutes}`;\n}\n"],"names":["useRef","useState","useEffect","jsxs","cn","Button","jsx","Icon","UiWatch","UiCalendar","Select","UiArrowRight","UiClose","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"TimeRange.cjs","sources":["../../src/components/TimeRange.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type Ref } from \"react\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingPortal,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useInteractions,\n useRole,\n} from \"@floating-ui/react\";\nimport { Icon } from \"../data/Icon\";\nimport { UiArrowRight, UiCalendar, UiClose, UiWatch } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport { useEscapeLayer, useFloatingZIndex } from \"../overlay/modalStack\";\nimport { Button } from \"./button\";\nimport { Select } from \"./select\";\n\nexport type TimeRangeKind = \"time\" | \"date\";\n\nexport type TimeRangePresetGroup = \"min\" | \"hr\" | \"day\" | \"wk+\" | \"this\" | \"last\";\n\nexport type TimeRangePreset = {\n /** Visible label for the preset row. */\n label: string;\n /** Start value applied when the preset is selected, e.g. `now-1h`. */\n from: string;\n /** End value applied when the preset is selected, usually `now`. */\n to: string;\n};\n\nexport type TimeRangeChipRow = {\n /** Stable row id used as the React key. */\n id: string;\n /** Group label shown beside the chips. */\n label: string;\n /** Preset chips rendered in this row. */\n chips: {\n /** Compact label shown in the chip. */\n label: string;\n /** Start value applied when clicked, e.g. `now-15m`. */\n token: string;\n /** Optional end value; defaults to `now`. */\n to?: string;\n /** Accessible label for the chip button. */\n ariaLabel?: string;\n /** Optional browser tooltip. */\n title?: string;\n }[];\n};\n\nexport type TimeRangeProps = {\n /** Controls whether the inputs accept date-only or date-time values. */\n kind?: TimeRangeKind;\n /** Label shown in the trigger before the selected range summary. */\n label?: string;\n /** Current start value. Relative values such as `now-1h` are supported. */\n from?: string;\n /** Current end value. Relative values such as `now` are supported. */\n to?: string;\n /** Called when the user applies a typed value or preset. */\n onApply: (from: string, to: string) => void;\n /** Presets or preset groups to show in the popup. */\n presets?: Array<TimeRangePreset | TimeRangePresetGroup>;\n /** Explicit chip rows; overrides the built-in preset group layout. */\n chipRows?: TimeRangeChipRow[];\n /** Enables time fields for date-time ranges. */\n timeEnabled?: boolean;\n /** Selected timezone shown in the popup. */\n timeZone?: string;\n /** Available timezone options. */\n timeZones?: string[];\n /** Placeholder for the start input. */\n fromPlaceholder?: string;\n /** Placeholder for the end input. */\n toPlaceholder?: string;\n /** Trigger text when neither boundary is set. */\n emptyLabel?: string;\n /** Aligns the popup to the trigger's left or right edge. */\n align?: \"left\" | \"right\";\n /** Disables opening and applying changes. */\n disabled?: boolean;\n /** Classes applied to the root wrapper. */\n className?: string;\n /** Classes applied to the trigger button. */\n triggerClassName?: string;\n /** Classes applied to the popup panel. */\n panelClassName?: string;\n};\n\nconst defaultTimeChipRows: TimeRangeChipRow[] = [\n {\n id: \"minutes\",\n label: \"Min\",\n chips: [\n { label: \"5m\", token: \"now-5m\" },\n { label: \"15m\", token: \"now-15m\" },\n { label: \"30m\", token: \"now-30m\" },\n ],\n },\n {\n id: \"hours\",\n label: \"Hr\",\n chips: [\n { label: \"1h\", token: \"now-1h\" },\n { label: \"2h\", token: \"now-2h\" },\n { label: \"4h\", token: \"now-4h\" },\n { label: \"8h\", token: \"now-8h\" },\n { label: \"12h\", token: \"now-12h\" },\n ],\n },\n {\n id: \"days\",\n label: \"Day\",\n chips: [\n { label: \"1d\", token: \"now-1d\" },\n { label: \"2d\", token: \"now-2d\" },\n { label: \"3d\", token: \"now-3d\" },\n { label: \"1w\", token: \"now-1w\" },\n ],\n },\n {\n id: \"weeks\",\n label: \"Wk+\",\n chips: [\n { label: \"2w\", token: \"now-2w\" },\n { label: \"1M\", token: \"now-1M\" },\n { label: \"3M\", token: \"now-3M\" },\n { label: \"6M\", token: \"now-6M\" },\n { label: \"1y\", token: \"now-1y\" },\n ],\n },\n];\n\nconst timeChipRowsByGroup: Record<\n Exclude<TimeRangePresetGroup, \"this\" | \"last\">,\n TimeRangeChipRow\n> = {\n min: defaultTimeChipRows[0]!,\n hr: defaultTimeChipRows[1]!,\n day: defaultTimeChipRows[2]!,\n \"wk+\": defaultTimeChipRows[3]!,\n};\n\nconst defaultDateChipRows: TimeRangeChipRow[] = [\n {\n id: \"days\",\n label: \"Day\",\n chips: [\n { label: \"1d\", token: \"now-1d\" },\n { label: \"2d\", token: \"now-2d\" },\n { label: \"3d\", token: \"now-3d\" },\n { label: \"7d\", token: \"now-7d\" },\n ],\n },\n {\n id: \"weeks\",\n label: \"Wk\",\n chips: [\n { label: \"1w\", token: \"now-1w\" },\n { label: \"2w\", token: \"now-2w\" },\n { label: \"4w\", token: \"now-4w\" },\n ],\n },\n {\n id: \"months\",\n label: \"Mo\",\n chips: [\n { label: \"1M\", token: \"now-1M\" },\n { label: \"3M\", token: \"now-3M\" },\n { label: \"6M\", token: \"now-6M\" },\n { label: \"1y\", token: \"now-1y\" },\n ],\n },\n];\n\nconst thisLastChipRows: Record<Extract<TimeRangePresetGroup, \"this\" | \"last\">, TimeRangeChipRow> = {\n this: {\n id: \"this\",\n label: \"This\",\n chips: [\n { label: \"Week\", token: \"now/w\", to: \"now/w+1w\", ariaLabel: \"this week\" },\n {\n label: \"Month\",\n token: \"now/M\",\n to: \"now/M+1M\",\n ariaLabel: \"this month\",\n },\n {\n label: \"Quarter\",\n token: \"now/q\",\n to: \"now/q+1q\",\n ariaLabel: \"this quarter\",\n },\n { label: \"Year\", token: \"now/y\", to: \"now/y+1y\", ariaLabel: \"this year\" },\n ],\n },\n last: {\n id: \"last\",\n label: \"Last\",\n chips: [\n { label: \"Week\", token: \"now/w-1w\", to: \"now/w\", ariaLabel: \"last week\" },\n {\n label: \"Month\",\n token: \"now/M-1M\",\n to: \"now/M\",\n ariaLabel: \"last month\",\n },\n {\n label: \"Quarter\",\n token: \"now/q-1q\",\n to: \"now/q\",\n ariaLabel: \"last quarter\",\n },\n { label: \"Year\", token: \"now/y-1y\", to: \"now/y\", ariaLabel: \"last year\" },\n ],\n },\n};\n\nexport function TimeRange({\n kind = \"time\",\n label = \"Time range\",\n from = \"\",\n to = \"\",\n onApply,\n presets,\n chipRows,\n timeEnabled = false,\n timeZone,\n timeZones,\n fromPlaceholder,\n toPlaceholder,\n emptyLabel,\n align = \"right\",\n disabled = false,\n className,\n triggerClassName,\n panelClassName,\n}: TimeRangeProps) {\n const [open, setOpen] = useState(false);\n const [draftFrom, setDraftFrom] = useState(from);\n const [draftTo, setDraftTo] = useState(to);\n const resolvedDefaultTimeZone = timeZone ?? getDefaultTimeZone();\n const [selectedTimeZone, setSelectedTimeZone] = useState(resolvedDefaultTimeZone);\n\n const activeTimeZones = resolveTimeZones(timeZones, selectedTimeZone);\n const { rows: activeChipRows, presets: activePresets } = resolvePresetConfig(\n kind,\n presets,\n chipRows,\n );\n\n // The popup is portaled (floating-ui) so it escapes the `overflow` clipping of\n // scroll-container ancestors (e.g. AppLayout's `<main overflow-y-auto>`) — the\n // same approach Combobox/DropdownMenu use. `flip`/`shift` keep it on-screen.\n const floatingZ = useFloatingZIndex();\n const { refs, floatingStyles, context } = useFloating({\n open,\n onOpenChange: setOpen,\n placement: align === \"left\" ? \"bottom-start\" : \"bottom-end\",\n whileElementsMounted: autoUpdate,\n middleware: [offset(6), flip({ padding: 8 }), shift({ padding: 8 })],\n });\n const { getReferenceProps, getFloatingProps } = useInteractions([\n useClick(context),\n useDismiss(context, { escapeKey: false }),\n useRole(context, { role: \"dialog\" }),\n ]);\n useEscapeLayer(open, () => {\n setOpen(false);\n if (refs.domReference.current instanceof HTMLElement) refs.domReference.current.focus();\n });\n\n useEffect(() => {\n if (open) {\n setDraftFrom(from);\n setDraftTo(to);\n setSelectedTimeZone(resolvedDefaultTimeZone);\n }\n }, [from, open, resolvedDefaultTimeZone, to]);\n\n const buttonLabel =\n formatSelectedPresetLabel(from, to, activeChipRows, activePresets) ??\n formatRangeLabel(kind, from, to, emptyLabel);\n const activeToken = normalizeRangeValue(kind, from, {\n timeEnabled,\n timeZone: selectedTimeZone,\n });\n\n function applyRange(nextFrom: string, nextTo: string) {\n onApply(\n normalizeRangeValue(kind, nextFrom, {\n timeEnabled,\n timeZone: selectedTimeZone,\n }),\n normalizeRangeValue(kind, nextTo, {\n timeEnabled,\n timeZone: selectedTimeZone,\n }),\n );\n setOpen(false);\n }\n\n function clearRange() {\n setDraftFrom(\"\");\n setDraftTo(\"\");\n onApply(\"\", \"\");\n setOpen(false);\n }\n\n return (\n <div className={cn(\"inline-flex\", className)}>\n <Button\n ref={refs.setReference as Ref<HTMLButtonElement>}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`${label} filter`}\n disabled={disabled}\n className={cn(\n \"h-7 w-fit max-w-[12rem] min-w-0 gap-2 px-2 text-xs font-normal\",\n triggerClassName,\n )}\n {...getReferenceProps()}\n >\n <Icon\n icon={kind === \"time\" ? UiWatch : UiCalendar}\n className=\"text-muted-foreground text-[14px]\"\n />\n <span className=\"truncate font-normal tabular-nums\">{buttonLabel}</span>\n </Button>\n\n {open && (\n <FloatingPortal>\n <FloatingFocusManager context={context} modal={false}>\n <div\n ref={refs.setFloating}\n role=\"dialog\"\n aria-label={label}\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={cn(\n \"flex max-h-[min(32rem,calc(100vh-2rem))] w-[22.5rem] max-w-[calc(100vw-1rem)] flex-col overflow-hidden rounded-lg border border-border bg-popover text-popover-foreground shadow-lg shadow-black/10 outline-none\",\n panelClassName,\n )}\n {...getFloatingProps()}\n >\n <div className=\"flex items-center justify-between border-b border-border/60 px-3.5 py-2.5\">\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {label}\n </span>\n <span className=\"font-mono text-[10px] text-muted-foreground\">\n {timeEnabled ? selectedTimeZone : \"Relative\"}\n </span>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {activeChipRows.length > 0 && (\n <ChipRowList rows={activeChipRows} activeToken={activeToken} onApply={applyRange} />\n )}\n {activePresets.length > 0 && (\n <div className={activeChipRows.length > 0 ? \"px-3.5 pb-3\" : \"px-3.5 pt-3\"}>\n <PresetList presets={activePresets} onApply={applyRange} />\n </div>\n )}\n\n <div className=\"border-t border-border/60 bg-muted/30 px-3.5 py-2.5\">\n <div className=\"mb-1.5 flex flex-wrap items-center justify-between gap-2\">\n <div className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n Custom\n </div>\n {timeEnabled && (\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n TZ\n </span>\n <Select\n aria-label={`${label} timezone`}\n value={selectedTimeZone}\n options={activeTimeZones.map((zone) => ({\n value: zone,\n label: zone,\n }))}\n onChange={(event) => setSelectedTimeZone(event.target.value)}\n className=\"h-7 w-40 truncate px-2 pr-7 font-mono text-xs\"\n />\n </div>\n )}\n </div>\n <div className=\"grid gap-1.5 md:grid-cols-[1fr_auto_1fr] md:items-center\">\n <DraftRangeInput\n aria-label={`${label} from`}\n placeholder={\n fromPlaceholder ?? (kind === \"date\" ? \"YYYY-MM-DD or now-1d\" : \"now-24h\")\n }\n value={draftFrom}\n onChange={setDraftFrom}\n onClear={() => setDraftFrom(\"\")}\n pickerKind={kind}\n timeEnabled={timeEnabled}\n />\n <Icon\n icon={UiArrowRight}\n className=\"hidden text-muted-foreground text-[12px] md:block\"\n />\n <DraftRangeInput\n aria-label={`${label} to`}\n placeholder={toPlaceholder ?? (kind === \"date\" ? \"YYYY-MM-DD or now\" : \"now\")}\n value={draftTo}\n onChange={setDraftTo}\n onClear={() => setDraftTo(\"\")}\n pickerKind={kind}\n timeEnabled={timeEnabled}\n />\n </div>\n </div>\n </div>\n\n <div className=\"flex items-center justify-between border-t border-border/60 px-3 py-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2.5 text-xs\"\n disabled={!from && !to}\n onClick={clearRange}\n >\n Clear\n </Button>\n <div className=\"flex gap-1.5\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2.5 text-xs\"\n onClick={() => setOpen(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n className=\"h-7 px-3.5 text-xs\"\n onClick={() => applyRange(draftFrom, draftTo)}\n >\n Apply\n </Button>\n </div>\n </div>\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </div>\n );\n}\n\nfunction DraftRangeInput({\n value,\n onChange,\n onClear,\n placeholder,\n pickerKind,\n timeEnabled,\n ...rest\n}: {\n value: string;\n onChange: (value: string) => void;\n onClear: () => void;\n placeholder: string | undefined;\n pickerKind?: TimeRangeKind;\n timeEnabled: boolean;\n \"aria-label\": string;\n}) {\n const ariaLabel = rest[\"aria-label\"];\n const showCalendar = pickerKind !== undefined;\n const showTimeInput = pickerKind === \"time\" && timeEnabled;\n const { date: datePart, time: timePart } = splitDateTime(value);\n\n function setDatePart(nextDate: string) {\n if (!showTimeInput) {\n onChange(nextDate);\n return;\n }\n if (!nextDate) {\n onChange(timePart ? `T${timePart}` : \"\");\n return;\n }\n onChange(timePart ? `${nextDate}T${timePart}` : nextDate);\n }\n\n function setTimePart(nextTime: string) {\n if (!nextTime) {\n onChange(datePart);\n return;\n }\n onChange(datePart ? `${datePart}T${nextTime}` : `T${nextTime}`);\n }\n\n return (\n <div className=\"space-y-1\">\n <DraftTextInput\n ariaLabel={ariaLabel}\n placeholder={placeholder}\n value={showTimeInput ? datePart : value}\n onChange={showTimeInput ? setDatePart : onChange}\n onClear={onClear}\n showCalendar={showCalendar}\n />\n {showTimeInput && (\n <DraftTimeInput ariaLabel={`${ariaLabel} time`} value={timePart} onChange={setTimePart} />\n )}\n </div>\n );\n}\n\nfunction resolvePresetConfig(\n kind: TimeRangeKind,\n presets: TimeRangeProps[\"presets\"],\n chipRows: TimeRangeChipRow[] | undefined,\n) {\n if (presets === undefined) {\n return {\n rows: chipRows ?? (kind === \"date\" ? defaultDateChipRows : defaultTimeChipRows),\n presets: [] as TimeRangePreset[],\n };\n }\n\n const rows: TimeRangeChipRow[] = chipRows ? [...chipRows] : [];\n const presetList: TimeRangePreset[] = [];\n\n for (const preset of presets) {\n if (typeof preset !== \"string\") {\n presetList.push(preset);\n continue;\n }\n if (preset === \"this\" || preset === \"last\") {\n rows.push(thisLastChipRows[preset]);\n continue;\n }\n rows.push(timeChipRowsByGroup[preset]);\n }\n\n return { rows, presets: presetList };\n}\n\nfunction DraftTextInput({\n ariaLabel,\n value,\n onChange,\n onClear,\n placeholder,\n showCalendar,\n}: {\n ariaLabel: string;\n value: string;\n onChange: (value: string) => void;\n onClear: () => void;\n placeholder: string | undefined;\n showCalendar: boolean;\n}) {\n const pickerRef = useRef<HTMLInputElement | null>(null);\n const hasValue = value.length > 0;\n const paddingRight = showCalendar ? (hasValue ? \"pr-12\" : \"pr-7\") : \"pr-7\";\n\n return (\n <div className=\"relative\">\n <input\n type=\"text\"\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n className={cn(\n \"h-8 w-full rounded-md border border-input bg-background px-2 font-mono text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n paddingRight,\n )}\n />\n {hasValue && (\n <button\n type=\"button\"\n aria-label={`Clear ${ariaLabel}`}\n onClick={onClear}\n className={cn(\n \"absolute inset-y-0 inline-flex w-5 items-center justify-center text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n showCalendar ? \"right-6\" : \"right-1\",\n )}\n >\n <Icon icon={UiClose} className=\"text-[12px]\" />\n </button>\n )}\n {showCalendar && (\n <>\n <input\n ref={pickerRef}\n type=\"date\"\n tabIndex={-1}\n aria-hidden=\"true\"\n value={/^\\d{4}-\\d{2}-\\d{2}$/.test(value.trim()) ? value.trim() : \"\"}\n onChange={(event) => onChange(event.target.value)}\n className=\"pointer-events-none absolute left-0 top-0 h-0 w-0 opacity-0\"\n />\n <button\n type=\"button\"\n aria-label={`Pick ${ariaLabel}`}\n onClick={() => pickerRef.current?.showPicker?.()}\n className=\"absolute inset-y-0 right-1 inline-flex w-5 items-center justify-center text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Icon icon={UiCalendar} className=\"text-[12px]\" />\n </button>\n </>\n )}\n </div>\n );\n}\n\nfunction DraftTimeInput({\n ariaLabel,\n value,\n onChange,\n}: {\n ariaLabel: string;\n value: string;\n onChange: (value: string) => void;\n}) {\n return (\n <input\n type=\"time\"\n aria-label={ariaLabel}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n className=\"h-8 w-full rounded-md border border-input bg-background px-2 font-mono text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n );\n}\n\nfunction splitDateTime(value: string) {\n const trimmed = value.trim();\n const match = /^(\\d{4}-\\d{2}-\\d{2})?T?(\\d{2}:\\d{2})?/.exec(trimmed);\n if (!match || trimmed.startsWith(\"now\") || /^[+-]/.test(trimmed)) {\n return { date: trimmed, time: \"\" };\n }\n return { date: match[1] ?? \"\", time: match[2] ?? \"\" };\n}\n\nfunction ChipRowList({\n rows,\n activeToken,\n onApply,\n}: {\n rows: TimeRangeChipRow[];\n activeToken: string;\n onApply: (from: string, to: string) => void;\n}) {\n if (rows.length === 0) return null;\n\n return (\n <div className=\"px-3.5 py-3\" role=\"list\" aria-label=\"Time filters\">\n {rows.map((row, index) => (\n <div\n key={row.id}\n className={cn(\n \"grid grid-cols-[2rem_1fr] items-center gap-2\",\n index === rows.length - 1 ? \"\" : \"mb-1.5\",\n )}\n role=\"listitem\"\n >\n <span className=\"text-[9.5px] font-bold uppercase tracking-wider text-muted-foreground\">\n {row.label}\n </span>\n <div className=\"flex divide-x divide-border overflow-hidden rounded-[5px] border border-border\">\n {row.chips.map((chip) => {\n const active = chip.token === activeToken;\n return (\n <button\n key={chip.token}\n type=\"button\"\n title={chip.title ?? chip.ariaLabel ?? chip.token}\n aria-label={chip.ariaLabel ?? chip.token}\n aria-pressed={active}\n onClick={() => onApply(chip.token, chip.to ?? \"now\")}\n className={cn(\n \"flex-1 min-w-0 px-0 py-1.5 text-center font-mono text-[11.5px] leading-none transition-colors focus-visible:relative focus-visible:z-10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n active\n ? \"bg-foreground font-semibold text-background\"\n : \"bg-background font-medium text-muted-foreground hover:bg-muted\",\n )}\n >\n {chip.label}\n </button>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction PresetList({\n presets,\n onApply,\n}: {\n presets: TimeRangePreset[];\n onApply: (from: string, to: string) => void;\n}) {\n if (presets.length === 0) return null;\n\n return (\n <div className=\"mb-3 space-y-1\" role=\"list\" aria-label=\"Time filters\">\n {presets.map((preset) => (\n <button\n key={`${preset.label}-${preset.from}-${preset.to}`}\n type=\"button\"\n className=\"flex h-8 w-full items-center justify-between gap-3 rounded-md border border-border bg-background px-2 text-left text-xs hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={() => onApply(preset.from, preset.to)}\n >\n <span className=\"min-w-0 truncate font-medium\">{preset.label}</span>\n <span className=\"shrink-0 font-mono text-[11px] text-muted-foreground\">\n {formatPresetRange(preset)}\n </span>\n </button>\n ))}\n </div>\n );\n}\n\nfunction formatSelectedPresetLabel(\n from: string,\n to: string,\n rows: TimeRangeChipRow[],\n presets: TimeRangePreset[],\n) {\n const normalizedFrom = from.trim();\n const normalizedTo = to.trim();\n if (!normalizedFrom && !normalizedTo) return undefined;\n\n for (const row of rows) {\n for (const chip of row.chips) {\n if (chip.token === normalizedFrom && (chip.to ?? \"now\") === normalizedTo) {\n return chip.ariaLabel ?? chip.title ?? chip.label;\n }\n }\n }\n\n return presets.find((preset) => preset.from === normalizedFrom && preset.to === normalizedTo)\n ?.label;\n}\n\nfunction formatPresetRange({ from, to }: TimeRangePreset) {\n if (!from) return to;\n if (!to || to === \"now\") return from;\n return `${from} -> ${to}`;\n}\n\nfunction normalizeRangeValue(\n kind: TimeRangeKind,\n value: string,\n options: { timeEnabled?: boolean; timeZone?: string } = {},\n) {\n const trimmed = value.trim();\n if (!trimmed) return \"\";\n if (trimmed === \"now\" || trimmed.startsWith(\"now\")) return trimmed;\n if (kind === \"time\" && /^[+-]\\d/.test(trimmed)) return `now${trimmed}`;\n if (kind === \"time\" && options.timeEnabled) {\n return encodeDateTimeWithOffset(trimmed, options.timeZone ?? getDefaultTimeZone());\n }\n return trimmed;\n}\n\nfunction formatRangeLabel(kind: TimeRangeKind, from: string, to: string, emptyLabel?: string) {\n const trimmedFrom = from.trim();\n const trimmedTo = to.trim();\n\n if (!trimmedFrom && !trimmedTo) {\n return emptyLabel ?? (kind === \"date\" ? \"Any date\" : \"now-24h\");\n }\n\n if (kind === \"time\") {\n const normalizedFrom = normalizeRangeValue(kind, trimmedFrom);\n const normalizedTo = normalizeRangeValue(kind, trimmedTo || \"now\");\n if (!normalizedFrom) return normalizedTo;\n if (normalizedTo === \"now\") return normalizedFrom;\n return `${normalizedFrom} -> ${normalizedTo}`;\n }\n\n if (trimmedFrom && trimmedTo && trimmedFrom === trimmedTo) {\n return trimmedFrom;\n }\n\n if (!trimmedFrom) return trimmedTo;\n if (!trimmedTo) return trimmedFrom;\n return `${trimmedFrom} -> ${trimmedTo}`;\n}\n\nfunction getDefaultTimeZone() {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\";\n } catch {\n return \"UTC\";\n }\n}\n\nfunction resolveTimeZones(timeZones: string[] | undefined, selectedTimeZone: string) {\n const zones = timeZones && timeZones.length > 0 ? timeZones : [selectedTimeZone, \"UTC\"];\n return Array.from(new Set([selectedTimeZone, ...zones, \"UTC\"].filter(Boolean)));\n}\n\nfunction encodeDateTimeWithOffset(value: string, timeZone: string) {\n if (!isLocalDateTime(value) || hasExplicitOffset(value)) return value;\n\n const match = value.match(/^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})(?::(\\d{2}))?(?:\\.\\d+)?$/);\n if (!match) return value;\n\n const [, year, month, day, hour, minute, second = \"00\"] = match;\n const localUtcMillis = Date.UTC(\n Number(year),\n Number(month) - 1,\n Number(day),\n Number(hour),\n Number(minute),\n Number(second),\n );\n const offsetMinutes = getTimeZoneOffsetMinutes(timeZone, localUtcMillis);\n return `${year}-${month}-${day}T${hour}:${minute}:${second}${formatOffset(offsetMinutes)}`;\n}\n\nfunction isLocalDateTime(value: string) {\n return /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2})?(?:\\.\\d+)?$/.test(value.trim());\n}\n\nfunction hasExplicitOffset(value: string) {\n return /(?:Z|[+-]\\d{2}:?\\d{2})$/i.test(value.trim());\n}\n\nfunction getTimeZoneOffsetMinutes(timeZone: string, localUtcMillis: number) {\n try {\n const formatter = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n const parts = Object.fromEntries(\n formatter\n .formatToParts(new Date(localUtcMillis))\n .filter((part) => part.type !== \"literal\")\n .map((part) => [part.type, part.value]),\n );\n const zonedUtcMillis = Date.UTC(\n Number(parts.year),\n Number(parts.month) - 1,\n Number(parts.day),\n Number(parts.hour),\n Number(parts.minute),\n Number(parts.second),\n );\n return (zonedUtcMillis - localUtcMillis) / 60_000;\n } catch {\n return 0;\n }\n}\n\nfunction formatOffset(offsetMinutes: number) {\n const sign = offsetMinutes >= 0 ? \"+\" : \"-\";\n const abs = Math.abs(offsetMinutes);\n const hours = Math.floor(abs / 60)\n .toString()\n .padStart(2, \"0\");\n const minutes = Math.floor(abs % 60)\n .toString()\n .padStart(2, \"0\");\n return `${sign}${hours}:${minutes}`;\n}\n"],"names":["useState","useFloatingZIndex","useFloating","autoUpdate","offset","flip","shift","useInteractions","useClick","useDismiss","useRole","useEscapeLayer","useEffect","cn","jsxs","Button","jsx","Icon","UiWatch","UiCalendar","FloatingPortal","FloatingFocusManager","Select","UiArrowRight","useRef","UiClose","Fragment"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TimeRange.d.ts","sourceRoot":"","sources":["../../src/components/TimeRange.tsx"],"names":[],"mappings":"AAOA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAElF,MAAM,MAAM,eAAe,GAAG;IAC5B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,KAAK,EAAE;QACL,uCAAuC;QACvC,KAAK,EAAE,MAAM,CAAC;QACd,wDAAwD;QACxD,KAAK,EAAE,MAAM,CAAC;QACd,6CAA6C;QAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,4CAA4C;QAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gCAAgC;QAChC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,EAAE,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,wEAAwE;IACxE,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,4DAA4D;IAC5D,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,qDAAqD;IACrD,OAAO,CAAC,EAAE,KAAK,CAAC,eAAe,GAAG,oBAAoB,CAAC,CAAC;IACxD,sEAAsE;IACtE,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC9B,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAmIF,wBAAgB,SAAS,CAAC,EACxB,IAAa,EACb,KAAoB,EACpB,IAAS,EACT,EAAO,EACP,OAAO,EACP,OAAO,EACP,QAAQ,EACR,WAAmB,EACnB,QAAQ,EACR,SAAS,EACT,eAAe,EACf,aAAa,EACb,UAAU,EACV,KAAe,EACf,QAAgB,EAChB,SAAS,EACT,gBAAgB,EAChB,cAAc,GACf,EAAE,cAAc,2CAoMhB"}
1
+ {"version":3,"file":"TimeRange.d.ts","sourceRoot":"","sources":["../../src/components/TimeRange.tsx"],"names":[],"mappings":"AAqBA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAElF,MAAM,MAAM,eAAe,GAAG;IAC5B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,KAAK,EAAE;QACL,uCAAuC;QACvC,KAAK,EAAE,MAAM,CAAC;QACd,wDAAwD;QACxD,KAAK,EAAE,MAAM,CAAC;QACd,6CAA6C;QAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,4CAA4C;QAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gCAAgC;QAChC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,EAAE,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,wEAAwE;IACxE,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,4DAA4D;IAC5D,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,qDAAqD;IACrD,OAAO,CAAC,EAAE,KAAK,CAAC,eAAe,GAAG,oBAAoB,CAAC,CAAC;IACxD,sEAAsE;IACtE,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC9B,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAmIF,wBAAgB,SAAS,CAAC,EACxB,IAAa,EACb,KAAoB,EACpB,IAAS,EACT,EAAO,EACP,OAAO,EACP,OAAO,EACP,QAAQ,EACR,WAAmB,EACnB,QAAQ,EACR,SAAS,EACT,eAAe,EACf,aAAa,EACb,UAAU,EACV,KAAe,EACf,QAAgB,EAChB,SAAS,EACT,gBAAgB,EAChB,cAAc,GACf,EAAE,cAAc,2CAyNhB"}
@@ -1,7 +1,9 @@
1
1
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
- import { useRef, useState, useEffect } from "react";
2
+ import { useState, useEffect, useRef } from "react";
3
+ import { useFloating, autoUpdate, offset, flip, shift, useInteractions, useClick, useDismiss, useRole, FloatingPortal, FloatingFocusManager } from "@floating-ui/react";
3
4
  import { Icon } from "../data/Icon.js";
4
5
  import { cn } from "../lib/utils.js";
6
+ import { useFloatingZIndex, useEscapeLayer } from "../overlay/modalStack.js";
5
7
  import { Button } from "./button.js";
6
8
  import { Select } from "./select.js";
7
9
  import { UiWatch } from "../icons/components/UiWatch.js";
@@ -150,8 +152,6 @@ function TimeRange({
150
152
  triggerClassName,
151
153
  panelClassName
152
154
  }) {
153
- const rootRef = useRef(null);
154
- const triggerRef = useRef(null);
155
155
  const [open, setOpen] = useState(false);
156
156
  const [draftFrom, setDraftFrom] = useState(from);
157
157
  const [draftTo, setDraftTo] = useState(to);
@@ -163,7 +163,23 @@ function TimeRange({
163
163
  presets,
164
164
  chipRows
165
165
  );
166
- useDismissablePopup(open, rootRef, triggerRef, () => setOpen(false));
166
+ const floatingZ = useFloatingZIndex();
167
+ const { refs, floatingStyles, context } = useFloating({
168
+ open,
169
+ onOpenChange: setOpen,
170
+ placement: align === "left" ? "bottom-start" : "bottom-end",
171
+ whileElementsMounted: autoUpdate,
172
+ middleware: [offset(6), flip({ padding: 8 }), shift({ padding: 8 })]
173
+ });
174
+ const { getReferenceProps, getFloatingProps } = useInteractions([
175
+ useClick(context),
176
+ useDismiss(context, { escapeKey: false }),
177
+ useRole(context, { role: "dialog" })
178
+ ]);
179
+ useEscapeLayer(open, () => {
180
+ setOpen(false);
181
+ if (refs.domReference.current instanceof HTMLElement) refs.domReference.current.focus();
182
+ });
167
183
  useEffect(() => {
168
184
  if (open) {
169
185
  setDraftFrom(from);
@@ -195,23 +211,21 @@ function TimeRange({
195
211
  onApply("", "");
196
212
  setOpen(false);
197
213
  }
198
- return /* @__PURE__ */ jsxs("div", { ref: rootRef, className: cn("relative inline-flex", className), children: [
214
+ return /* @__PURE__ */ jsxs("div", { className: cn("inline-flex", className), children: [
199
215
  /* @__PURE__ */ jsxs(
200
216
  Button,
201
217
  {
202
- ref: triggerRef,
218
+ ref: refs.setReference,
203
219
  type: "button",
204
220
  variant: "outline",
205
221
  size: "sm",
206
222
  "aria-label": `${label} filter`,
207
- "aria-expanded": open,
208
- "aria-haspopup": "dialog",
209
223
  disabled,
210
- onClick: () => setOpen((current) => !current),
211
224
  className: cn(
212
225
  "h-7 w-fit max-w-[12rem] min-w-0 gap-2 px-2 text-xs font-normal",
213
226
  triggerClassName
214
227
  ),
228
+ ...getReferenceProps(),
215
229
  children: [
216
230
  /* @__PURE__ */ jsx(
217
231
  Icon,
@@ -224,22 +238,24 @@ function TimeRange({
224
238
  ]
225
239
  }
226
240
  ),
227
- open && /* @__PURE__ */ jsxs(
241
+ open && /* @__PURE__ */ jsx(FloatingPortal, { children: /* @__PURE__ */ jsx(FloatingFocusManager, { context, modal: false, children: /* @__PURE__ */ jsxs(
228
242
  "div",
229
243
  {
244
+ ref: refs.setFloating,
230
245
  role: "dialog",
231
246
  "aria-label": label,
247
+ style: { ...floatingStyles, zIndex: floatingZ },
232
248
  className: cn(
233
- "fixed inset-x-2 bottom-4 top-16 z-50 flex flex-col overflow-hidden rounded-lg border border-border bg-popover text-popover-foreground shadow-lg shadow-black/10 outline-none md:absolute md:bottom-auto md:top-[calc(100%+0.375rem)] md:block md:w-[22.5rem] md:shadow-black/5",
234
- align === "left" ? "md:left-0" : "md:right-0",
249
+ "flex max-h-[min(32rem,calc(100vh-2rem))] w-[22.5rem] max-w-[calc(100vw-1rem)] flex-col overflow-hidden rounded-lg border border-border bg-popover text-popover-foreground shadow-lg shadow-black/10 outline-none",
235
250
  panelClassName
236
251
  ),
252
+ ...getFloatingProps(),
237
253
  children: [
238
254
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-border/60 px-3.5 py-2.5", children: [
239
255
  /* @__PURE__ */ jsx("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: label }),
240
256
  /* @__PURE__ */ jsx("span", { className: "font-mono text-[10px] text-muted-foreground", children: timeEnabled ? selectedTimeZone : "Relative" })
241
257
  ] }),
242
- /* @__PURE__ */ jsxs("div", { className: "min-h-0 flex-1 overflow-y-auto md:overflow-visible", children: [
258
+ /* @__PURE__ */ jsxs("div", { className: "min-h-0 flex-1 overflow-y-auto", children: [
243
259
  activeChipRows.length > 0 && /* @__PURE__ */ jsx(ChipRowList, { rows: activeChipRows, activeToken, onApply: applyRange }),
244
260
  activePresets.length > 0 && /* @__PURE__ */ jsx("div", { className: activeChipRows.length > 0 ? "px-3.5 pb-3" : "px-3.5 pt-3", children: /* @__PURE__ */ jsx(PresetList, { presets: activePresets, onApply: applyRange }) }),
245
261
  /* @__PURE__ */ jsxs("div", { className: "border-t border-border/60 bg-muted/30 px-3.5 py-2.5", children: [
@@ -337,7 +353,7 @@ function TimeRange({
337
353
  ] })
338
354
  ]
339
355
  }
340
- )
356
+ ) }) })
341
357
  ] });
342
358
  }
343
359
  function DraftRangeInput({
@@ -578,30 +594,6 @@ function formatPresetRange({ from, to }) {
578
594
  if (!to || to === "now") return from;
579
595
  return `${from} -> ${to}`;
580
596
  }
581
- function useDismissablePopup(open, rootRef, triggerRef, onClose) {
582
- useEffect(() => {
583
- if (!open) return;
584
- const onPointerDown = (event) => {
585
- var _a;
586
- if (!((_a = rootRef.current) == null ? void 0 : _a.contains(event.target))) {
587
- onClose();
588
- }
589
- };
590
- const onKeyDown = (event) => {
591
- var _a;
592
- if (event.key === "Escape") {
593
- onClose();
594
- (_a = triggerRef.current) == null ? void 0 : _a.focus();
595
- }
596
- };
597
- document.addEventListener("mousedown", onPointerDown);
598
- document.addEventListener("keydown", onKeyDown);
599
- return () => {
600
- document.removeEventListener("mousedown", onPointerDown);
601
- document.removeEventListener("keydown", onKeyDown);
602
- };
603
- }, [onClose, open, rootRef, triggerRef]);
604
- }
605
597
  function normalizeRangeValue(kind, value, options = {}) {
606
598
  const trimmed = value.trim();
607
599
  if (!trimmed) return "";