@mastra/playground-ui 34.1.0-alpha.3 → 35.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/CHANGELOG.md +137 -0
  2. package/dist/{code-block-CcVa6fM8.cjs → code-block-C4Zp_ewI.cjs} +18 -7
  3. package/dist/code-block-C4Zp_ewI.cjs.map +1 -0
  4. package/dist/{code-block-DPy5IAR8.js → code-block-CnRVTecy.js} +18 -7
  5. package/dist/code-block-CnRVTecy.js.map +1 -0
  6. package/dist/components/CodeBlock.cjs.js +1 -1
  7. package/dist/components/CodeBlock.es.js +1 -1
  8. package/dist/components/DateTimePicker.cjs.js +1 -1
  9. package/dist/components/DateTimePicker.es.js +1 -1
  10. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  11. package/dist/components/DateTimeRangePicker.es.js +1 -1
  12. package/dist/components/MainSidebar.cjs.js +1 -1
  13. package/dist/components/MainSidebar.es.js +1 -1
  14. package/dist/components/Popover.cjs.js +1 -1
  15. package/dist/components/Popover.es.js +1 -1
  16. package/dist/components/PropertyFilter.cjs.js +1 -1
  17. package/dist/components/PropertyFilter.es.js +1 -1
  18. package/dist/components/Tabs.cjs.js +1 -1
  19. package/dist/components/Tabs.es.js +1 -1
  20. package/dist/{date-time-picker-t67keTZg.js → date-time-picker-BKSdFrHR.js} +2 -2
  21. package/dist/{date-time-picker-t67keTZg.js.map → date-time-picker-BKSdFrHR.js.map} +1 -1
  22. package/dist/{date-time-picker-BKqGpw5w.cjs → date-time-picker-Bjr6V3AR.cjs} +2 -2
  23. package/dist/{date-time-picker-BKqGpw5w.cjs.map → date-time-picker-Bjr6V3AR.cjs.map} +1 -1
  24. package/dist/{date-time-range-picker-iMvwOfiZ.js → date-time-range-picker-DKvS9c4j.js} +2 -2
  25. package/dist/{date-time-range-picker-iMvwOfiZ.js.map → date-time-range-picker-DKvS9c4j.js.map} +1 -1
  26. package/dist/{date-time-range-picker-Do-3VVvo.cjs → date-time-range-picker-DjcVeD-Z.cjs} +2 -2
  27. package/dist/{date-time-range-picker-Do-3VVvo.cjs.map → date-time-range-picker-DjcVeD-Z.cjs.map} +1 -1
  28. package/dist/index.cjs.js +344 -26
  29. package/dist/index.cjs.js.map +1 -1
  30. package/dist/index.css +114 -26
  31. package/dist/index.es.js +349 -32
  32. package/dist/index.es.js.map +1 -1
  33. package/dist/{main-sidebar-Bk2U9O57.js → main-sidebar-1GVDTtcD.js} +16 -33
  34. package/dist/main-sidebar-1GVDTtcD.js.map +1 -0
  35. package/dist/{main-sidebar-CWoM-yrH.cjs → main-sidebar-Djs_3tGw.cjs} +16 -33
  36. package/dist/main-sidebar-Djs_3tGw.cjs.map +1 -0
  37. package/dist/{popover-ttQgAb0m.cjs → popover-B8RFw-D-.cjs} +12 -2
  38. package/dist/popover-B8RFw-D-.cjs.map +1 -0
  39. package/dist/{popover-CRLP2Ay_.js → popover-C65fxQ7m.js} +12 -2
  40. package/dist/popover-C65fxQ7m.js.map +1 -0
  41. package/dist/{property-filter-creator-CnuA0Otn.js → property-filter-creator-B9tK0VY3.js} +2 -2
  42. package/dist/{property-filter-creator-CnuA0Otn.js.map → property-filter-creator-B9tK0VY3.js.map} +1 -1
  43. package/dist/{property-filter-creator-Cl7xhaML.cjs → property-filter-creator-DU8pl6-6.cjs} +2 -2
  44. package/dist/{property-filter-creator-Cl7xhaML.cjs.map → property-filter-creator-DU8pl6-6.cjs.map} +1 -1
  45. package/dist/src/ds/components/CodeBlock/code-block.d.ts +3 -1
  46. package/dist/src/ds/components/Popover/popover.d.ts +1 -1
  47. package/dist/src/hooks/use-is-mobile.d.ts +1 -0
  48. package/dist/src/index.d.ts +4 -1
  49. package/dist/src/lib/resize/collapsible-panel.d.ts +1 -1
  50. package/dist/src/lib/resize/panel-drawer.d.ts +8 -0
  51. package/dist/src/lib/resize/panel-edge-icon.d.ts +4 -0
  52. package/dist/src/lib/resize/panel-icon-button.d.ts +1 -0
  53. package/dist/src/lib/resize/use-clamped-element-cursor.d.ts +16 -0
  54. package/dist/{tabs-tab-Cjv_3xGC.js → tabs-tab-Bv9aRRTl.js} +15 -15
  55. package/dist/tabs-tab-Bv9aRRTl.js.map +1 -0
  56. package/dist/{tabs-tab-Dl9FqQhm.cjs → tabs-tab-CulV7e_n.cjs} +15 -15
  57. package/dist/tabs-tab-CulV7e_n.cjs.map +1 -0
  58. package/package.json +7 -7
  59. package/dist/code-block-CcVa6fM8.cjs.map +0 -1
  60. package/dist/code-block-DPy5IAR8.js.map +0 -1
  61. package/dist/main-sidebar-Bk2U9O57.js.map +0 -1
  62. package/dist/main-sidebar-CWoM-yrH.cjs.map +0 -1
  63. package/dist/popover-CRLP2Ay_.js.map +0 -1
  64. package/dist/popover-ttQgAb0m.cjs.map +0 -1
  65. package/dist/src/hooks/index.d.ts +0 -3
  66. package/dist/src/lib/resize/index.d.ts +0 -2
  67. package/dist/tabs-tab-Cjv_3xGC.js.map +0 -1
  68. package/dist/tabs-tab-Dl9FqQhm.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"date-time-range-picker-iMvwOfiZ.js","sources":["../src/ds/components/DateTimeRangePicker/date-time-range-picker.tsx"],"sourcesContent":["import { isValid, parse } from 'date-fns';\nimport { CalendarIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { Button } from '@/ds/components/Button/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { DatePicker, TimePicker } from '@/ds/components/DateTimePicker';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\nimport { Popover, PopoverTrigger, PopoverContent } from '@/ds/components/Popover/popover';\nimport { cn } from '@/lib/utils';\n\nexport type DateRangePreset = 'all' | 'last-24h' | 'last-3d' | 'last-7d' | 'last-14d' | 'last-30d' | 'custom';\n\nconst DATE_PRESETS: { value: DateRangePreset; label: string; ms?: number }[] = [\n { value: 'all', label: 'All' },\n { value: 'last-24h', label: 'Last 24 hours', ms: 24 * 60 * 60 * 1000 },\n { value: 'last-3d', label: 'Last 3 days', ms: 3 * 24 * 60 * 60 * 1000 },\n { value: 'last-7d', label: 'Last 7 days', ms: 7 * 24 * 60 * 60 * 1000 },\n { value: 'last-14d', label: 'Last 14 days', ms: 14 * 24 * 60 * 60 * 1000 },\n { value: 'last-30d', label: 'Last 30 days', ms: 30 * 24 * 60 * 60 * 1000 },\n { value: 'custom', label: 'Custom range...' },\n];\n\nfunction buildDateWithTime(date: Date, timeStr: string): Date | null {\n const dateOnly = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n const combined = parse(timeStr, 'h:mm a', dateOnly);\n return isValid(combined) ? combined : null;\n}\n\nexport interface DateTimeRangePickerProps {\n preset?: DateRangePreset;\n onPresetChange?: (preset: DateRangePreset) => void;\n dateFrom?: Date;\n dateTo?: Date;\n onDateChange?: (value: Date | undefined, type: 'from' | 'to') => void;\n disabled?: boolean;\n /** Subset of presets to show. If omitted, all presets are shown. */\n presets?: readonly DateRangePreset[];\n /** Size passed through to the trigger Button. Defaults to 'md'. */\n size?: ButtonProps['size'];\n}\n\nexport function DateTimeRangePicker({\n preset = 'all',\n onPresetChange,\n dateFrom,\n dateTo,\n onDateChange,\n disabled,\n presets,\n size = 'md',\n}: DateTimeRangePickerProps) {\n const visiblePresets = presets ? DATE_PRESETS.filter(p => presets.includes(p.value)) : DATE_PRESETS;\n const fallbackPreset: DateRangePreset = visiblePresets.find(p => p.value !== 'custom')?.value ?? 'all';\n const [customRangeOpen, setCustomRangeOpen] = useState(false);\n const [draftDateFrom, setDraftDateFrom] = useState<Date | undefined>(dateFrom);\n const [draftDateTo, setDraftDateTo] = useState<Date | undefined>(dateTo);\n const [draftTimeFrom, setDraftTimeFrom] = useState('12:00 AM');\n const [draftTimeTo, setDraftTimeTo] = useState('11:59 PM');\n const [customRangeError, setCustomRangeError] = useState<string | undefined>();\n\n const datePresetLabel = DATE_PRESETS.find(p => p.value === preset)?.label ?? 'All';\n\n const handlePresetSelect = (value: DateRangePreset) => {\n onPresetChange?.(value);\n if (value === 'custom') {\n setDraftDateFrom(dateFrom);\n setDraftDateTo(dateTo);\n setDraftTimeFrom('12:00 AM');\n setDraftTimeTo('11:59 PM');\n setCustomRangeOpen(true);\n return;\n }\n const entry = DATE_PRESETS.find(p => p.value === value);\n if (entry?.ms) {\n onDateChange?.(new Date(Date.now() - entry.ms), 'from');\n onDateChange?.(undefined, 'to');\n } else {\n onDateChange?.(undefined, 'from');\n onDateChange?.(undefined, 'to');\n }\n };\n\n const applyCustomRange = () => {\n const fromDate = draftDateFrom ? (buildDateWithTime(draftDateFrom, draftTimeFrom) ?? draftDateFrom) : undefined;\n const toDate = draftDateTo ? (buildDateWithTime(draftDateTo, draftTimeTo) ?? draftDateTo) : undefined;\n if (fromDate && toDate && fromDate.getTime() > toDate.getTime()) {\n setCustomRangeError('Start date/time must be before end date/time');\n return;\n }\n setCustomRangeError(undefined);\n onDateChange?.(fromDate, 'from');\n onDateChange?.(toDate, 'to');\n setCustomRangeOpen(false);\n };\n\n if (preset === 'custom') {\n return (\n <Popover open={customRangeOpen} onOpenChange={setCustomRangeOpen}>\n <PopoverTrigger asChild>\n <Button size={size} disabled={disabled}>\n <CalendarIcon />\n {dateFrom ? dateFrom.toLocaleDateString() : 'Start'} {' \\u2013 '}\n {dateTo ? dateTo.toLocaleDateString() : 'End'}\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className={cn('w-auto p-0')}>\n <div className={cn('flex')}>\n <div className={cn('border-r border-border1')}>\n <span className={cn('text-ui-sm text-neutral3 font-medium px-4 pt-3 block')}>Start</span>\n <DatePicker\n mode=\"single\"\n selected={draftDateFrom}\n month={draftDateFrom}\n onSelect={setDraftDateFrom}\n disabled={disabled}\n toDate={draftDateTo}\n />\n <TimePicker\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeFrom}\n onValueChange={v => {\n if (!disabled) setDraftTimeFrom(v);\n }}\n />\n </div>\n <div>\n <span className={cn('text-ui-sm text-neutral3 font-medium px-4 pt-3 block')}>End</span>\n <DatePicker\n mode=\"single\"\n selected={draftDateTo}\n month={draftDateTo}\n onSelect={setDraftDateTo}\n disabled={disabled}\n fromDate={draftDateFrom}\n />\n <TimePicker\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeTo}\n onValueChange={v => {\n if (!disabled) setDraftTimeTo(v);\n }}\n />\n </div>\n </div>\n {customRangeError && <p className={cn('text-ui-sm text-red-500 px-4 pb-1')}>{customRangeError}</p>}\n <div className={cn('flex justify-between items-center px-4 pb-3')}>\n <button\n type=\"button\"\n disabled={disabled}\n className={cn(\n 'text-ui-sm text-neutral3 hover:text-neutral4',\n disabled && 'opacity-50 pointer-events-none',\n )}\n onClick={() => {\n setCustomRangeError(undefined);\n handlePresetSelect(fallbackPreset);\n }}\n >\n &larr; Presets\n </button>\n <Button variant=\"primary\" size=\"sm\" onClick={applyCustomRange} disabled={disabled}>\n Apply\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenu.Trigger asChild>\n <Button size={size} disabled={disabled}>\n <CalendarIcon />\n {datePresetLabel}\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"start\">\n {visiblePresets.map(p => (\n <DropdownMenu.Item key={p.value} onSelect={() => handlePresetSelect(p.value)}>\n {p.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"date-time-range-picker-DKvS9c4j.js","sources":["../src/ds/components/DateTimeRangePicker/date-time-range-picker.tsx"],"sourcesContent":["import { isValid, parse } from 'date-fns';\nimport { CalendarIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { Button } from '@/ds/components/Button/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { DatePicker, TimePicker } from '@/ds/components/DateTimePicker';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\nimport { Popover, PopoverTrigger, PopoverContent } from '@/ds/components/Popover/popover';\nimport { cn } from '@/lib/utils';\n\nexport type DateRangePreset = 'all' | 'last-24h' | 'last-3d' | 'last-7d' | 'last-14d' | 'last-30d' | 'custom';\n\nconst DATE_PRESETS: { value: DateRangePreset; label: string; ms?: number }[] = [\n { value: 'all', label: 'All' },\n { value: 'last-24h', label: 'Last 24 hours', ms: 24 * 60 * 60 * 1000 },\n { value: 'last-3d', label: 'Last 3 days', ms: 3 * 24 * 60 * 60 * 1000 },\n { value: 'last-7d', label: 'Last 7 days', ms: 7 * 24 * 60 * 60 * 1000 },\n { value: 'last-14d', label: 'Last 14 days', ms: 14 * 24 * 60 * 60 * 1000 },\n { value: 'last-30d', label: 'Last 30 days', ms: 30 * 24 * 60 * 60 * 1000 },\n { value: 'custom', label: 'Custom range...' },\n];\n\nfunction buildDateWithTime(date: Date, timeStr: string): Date | null {\n const dateOnly = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n const combined = parse(timeStr, 'h:mm a', dateOnly);\n return isValid(combined) ? combined : null;\n}\n\nexport interface DateTimeRangePickerProps {\n preset?: DateRangePreset;\n onPresetChange?: (preset: DateRangePreset) => void;\n dateFrom?: Date;\n dateTo?: Date;\n onDateChange?: (value: Date | undefined, type: 'from' | 'to') => void;\n disabled?: boolean;\n /** Subset of presets to show. If omitted, all presets are shown. */\n presets?: readonly DateRangePreset[];\n /** Size passed through to the trigger Button. Defaults to 'md'. */\n size?: ButtonProps['size'];\n}\n\nexport function DateTimeRangePicker({\n preset = 'all',\n onPresetChange,\n dateFrom,\n dateTo,\n onDateChange,\n disabled,\n presets,\n size = 'md',\n}: DateTimeRangePickerProps) {\n const visiblePresets = presets ? DATE_PRESETS.filter(p => presets.includes(p.value)) : DATE_PRESETS;\n const fallbackPreset: DateRangePreset = visiblePresets.find(p => p.value !== 'custom')?.value ?? 'all';\n const [customRangeOpen, setCustomRangeOpen] = useState(false);\n const [draftDateFrom, setDraftDateFrom] = useState<Date | undefined>(dateFrom);\n const [draftDateTo, setDraftDateTo] = useState<Date | undefined>(dateTo);\n const [draftTimeFrom, setDraftTimeFrom] = useState('12:00 AM');\n const [draftTimeTo, setDraftTimeTo] = useState('11:59 PM');\n const [customRangeError, setCustomRangeError] = useState<string | undefined>();\n\n const datePresetLabel = DATE_PRESETS.find(p => p.value === preset)?.label ?? 'All';\n\n const handlePresetSelect = (value: DateRangePreset) => {\n onPresetChange?.(value);\n if (value === 'custom') {\n setDraftDateFrom(dateFrom);\n setDraftDateTo(dateTo);\n setDraftTimeFrom('12:00 AM');\n setDraftTimeTo('11:59 PM');\n setCustomRangeOpen(true);\n return;\n }\n const entry = DATE_PRESETS.find(p => p.value === value);\n if (entry?.ms) {\n onDateChange?.(new Date(Date.now() - entry.ms), 'from');\n onDateChange?.(undefined, 'to');\n } else {\n onDateChange?.(undefined, 'from');\n onDateChange?.(undefined, 'to');\n }\n };\n\n const applyCustomRange = () => {\n const fromDate = draftDateFrom ? (buildDateWithTime(draftDateFrom, draftTimeFrom) ?? draftDateFrom) : undefined;\n const toDate = draftDateTo ? (buildDateWithTime(draftDateTo, draftTimeTo) ?? draftDateTo) : undefined;\n if (fromDate && toDate && fromDate.getTime() > toDate.getTime()) {\n setCustomRangeError('Start date/time must be before end date/time');\n return;\n }\n setCustomRangeError(undefined);\n onDateChange?.(fromDate, 'from');\n onDateChange?.(toDate, 'to');\n setCustomRangeOpen(false);\n };\n\n if (preset === 'custom') {\n return (\n <Popover open={customRangeOpen} onOpenChange={setCustomRangeOpen}>\n <PopoverTrigger asChild>\n <Button size={size} disabled={disabled}>\n <CalendarIcon />\n {dateFrom ? dateFrom.toLocaleDateString() : 'Start'} {' \\u2013 '}\n {dateTo ? dateTo.toLocaleDateString() : 'End'}\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className={cn('w-auto p-0')}>\n <div className={cn('flex')}>\n <div className={cn('border-r border-border1')}>\n <span className={cn('text-ui-sm text-neutral3 font-medium px-4 pt-3 block')}>Start</span>\n <DatePicker\n mode=\"single\"\n selected={draftDateFrom}\n month={draftDateFrom}\n onSelect={setDraftDateFrom}\n disabled={disabled}\n toDate={draftDateTo}\n />\n <TimePicker\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeFrom}\n onValueChange={v => {\n if (!disabled) setDraftTimeFrom(v);\n }}\n />\n </div>\n <div>\n <span className={cn('text-ui-sm text-neutral3 font-medium px-4 pt-3 block')}>End</span>\n <DatePicker\n mode=\"single\"\n selected={draftDateTo}\n month={draftDateTo}\n onSelect={setDraftDateTo}\n disabled={disabled}\n fromDate={draftDateFrom}\n />\n <TimePicker\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeTo}\n onValueChange={v => {\n if (!disabled) setDraftTimeTo(v);\n }}\n />\n </div>\n </div>\n {customRangeError && <p className={cn('text-ui-sm text-red-500 px-4 pb-1')}>{customRangeError}</p>}\n <div className={cn('flex justify-between items-center px-4 pb-3')}>\n <button\n type=\"button\"\n disabled={disabled}\n className={cn(\n 'text-ui-sm text-neutral3 hover:text-neutral4',\n disabled && 'opacity-50 pointer-events-none',\n )}\n onClick={() => {\n setCustomRangeError(undefined);\n handlePresetSelect(fallbackPreset);\n }}\n >\n &larr; Presets\n </button>\n <Button variant=\"primary\" size=\"sm\" onClick={applyCustomRange} disabled={disabled}>\n Apply\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenu.Trigger asChild>\n <Button size={size} disabled={disabled}>\n <CalendarIcon />\n {datePresetLabel}\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"start\">\n {visiblePresets.map(p => (\n <DropdownMenu.Item key={p.value} onSelect={() => handlePresetSelect(p.value)}>\n {p.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ const React = require('react');
7
7
  const Button = require('./Button-DpIX8JMz.cjs');
8
8
  const timePicker = require('./time-picker-DWrxHBfR.cjs');
9
9
  const dropdownMenu = require('./dropdown-menu-Vl_C0N5e.cjs');
10
- const popover = require('./popover-ttQgAb0m.cjs');
10
+ const popover = require('./popover-B8RFw-D-.cjs');
11
11
  const utils = require('./utils-vA5sWo9W.cjs');
12
12
 
13
13
  const DATE_PRESETS = [
@@ -167,4 +167,4 @@ function DateTimeRangePicker({
167
167
  }
168
168
 
169
169
  exports.DateTimeRangePicker = DateTimeRangePicker;
170
- //# sourceMappingURL=date-time-range-picker-Do-3VVvo.cjs.map
170
+ //# sourceMappingURL=date-time-range-picker-DjcVeD-Z.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"date-time-range-picker-Do-3VVvo.cjs","sources":["../src/ds/components/DateTimeRangePicker/date-time-range-picker.tsx"],"sourcesContent":["import { isValid, parse } from 'date-fns';\nimport { CalendarIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { Button } from '@/ds/components/Button/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { DatePicker, TimePicker } from '@/ds/components/DateTimePicker';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\nimport { Popover, PopoverTrigger, PopoverContent } from '@/ds/components/Popover/popover';\nimport { cn } from '@/lib/utils';\n\nexport type DateRangePreset = 'all' | 'last-24h' | 'last-3d' | 'last-7d' | 'last-14d' | 'last-30d' | 'custom';\n\nconst DATE_PRESETS: { value: DateRangePreset; label: string; ms?: number }[] = [\n { value: 'all', label: 'All' },\n { value: 'last-24h', label: 'Last 24 hours', ms: 24 * 60 * 60 * 1000 },\n { value: 'last-3d', label: 'Last 3 days', ms: 3 * 24 * 60 * 60 * 1000 },\n { value: 'last-7d', label: 'Last 7 days', ms: 7 * 24 * 60 * 60 * 1000 },\n { value: 'last-14d', label: 'Last 14 days', ms: 14 * 24 * 60 * 60 * 1000 },\n { value: 'last-30d', label: 'Last 30 days', ms: 30 * 24 * 60 * 60 * 1000 },\n { value: 'custom', label: 'Custom range...' },\n];\n\nfunction buildDateWithTime(date: Date, timeStr: string): Date | null {\n const dateOnly = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n const combined = parse(timeStr, 'h:mm a', dateOnly);\n return isValid(combined) ? combined : null;\n}\n\nexport interface DateTimeRangePickerProps {\n preset?: DateRangePreset;\n onPresetChange?: (preset: DateRangePreset) => void;\n dateFrom?: Date;\n dateTo?: Date;\n onDateChange?: (value: Date | undefined, type: 'from' | 'to') => void;\n disabled?: boolean;\n /** Subset of presets to show. If omitted, all presets are shown. */\n presets?: readonly DateRangePreset[];\n /** Size passed through to the trigger Button. Defaults to 'md'. */\n size?: ButtonProps['size'];\n}\n\nexport function DateTimeRangePicker({\n preset = 'all',\n onPresetChange,\n dateFrom,\n dateTo,\n onDateChange,\n disabled,\n presets,\n size = 'md',\n}: DateTimeRangePickerProps) {\n const visiblePresets = presets ? DATE_PRESETS.filter(p => presets.includes(p.value)) : DATE_PRESETS;\n const fallbackPreset: DateRangePreset = visiblePresets.find(p => p.value !== 'custom')?.value ?? 'all';\n const [customRangeOpen, setCustomRangeOpen] = useState(false);\n const [draftDateFrom, setDraftDateFrom] = useState<Date | undefined>(dateFrom);\n const [draftDateTo, setDraftDateTo] = useState<Date | undefined>(dateTo);\n const [draftTimeFrom, setDraftTimeFrom] = useState('12:00 AM');\n const [draftTimeTo, setDraftTimeTo] = useState('11:59 PM');\n const [customRangeError, setCustomRangeError] = useState<string | undefined>();\n\n const datePresetLabel = DATE_PRESETS.find(p => p.value === preset)?.label ?? 'All';\n\n const handlePresetSelect = (value: DateRangePreset) => {\n onPresetChange?.(value);\n if (value === 'custom') {\n setDraftDateFrom(dateFrom);\n setDraftDateTo(dateTo);\n setDraftTimeFrom('12:00 AM');\n setDraftTimeTo('11:59 PM');\n setCustomRangeOpen(true);\n return;\n }\n const entry = DATE_PRESETS.find(p => p.value === value);\n if (entry?.ms) {\n onDateChange?.(new Date(Date.now() - entry.ms), 'from');\n onDateChange?.(undefined, 'to');\n } else {\n onDateChange?.(undefined, 'from');\n onDateChange?.(undefined, 'to');\n }\n };\n\n const applyCustomRange = () => {\n const fromDate = draftDateFrom ? (buildDateWithTime(draftDateFrom, draftTimeFrom) ?? draftDateFrom) : undefined;\n const toDate = draftDateTo ? (buildDateWithTime(draftDateTo, draftTimeTo) ?? draftDateTo) : undefined;\n if (fromDate && toDate && fromDate.getTime() > toDate.getTime()) {\n setCustomRangeError('Start date/time must be before end date/time');\n return;\n }\n setCustomRangeError(undefined);\n onDateChange?.(fromDate, 'from');\n onDateChange?.(toDate, 'to');\n setCustomRangeOpen(false);\n };\n\n if (preset === 'custom') {\n return (\n <Popover open={customRangeOpen} onOpenChange={setCustomRangeOpen}>\n <PopoverTrigger asChild>\n <Button size={size} disabled={disabled}>\n <CalendarIcon />\n {dateFrom ? dateFrom.toLocaleDateString() : 'Start'} {' \\u2013 '}\n {dateTo ? dateTo.toLocaleDateString() : 'End'}\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className={cn('w-auto p-0')}>\n <div className={cn('flex')}>\n <div className={cn('border-r border-border1')}>\n <span className={cn('text-ui-sm text-neutral3 font-medium px-4 pt-3 block')}>Start</span>\n <DatePicker\n mode=\"single\"\n selected={draftDateFrom}\n month={draftDateFrom}\n onSelect={setDraftDateFrom}\n disabled={disabled}\n toDate={draftDateTo}\n />\n <TimePicker\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeFrom}\n onValueChange={v => {\n if (!disabled) setDraftTimeFrom(v);\n }}\n />\n </div>\n <div>\n <span className={cn('text-ui-sm text-neutral3 font-medium px-4 pt-3 block')}>End</span>\n <DatePicker\n mode=\"single\"\n selected={draftDateTo}\n month={draftDateTo}\n onSelect={setDraftDateTo}\n disabled={disabled}\n fromDate={draftDateFrom}\n />\n <TimePicker\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeTo}\n onValueChange={v => {\n if (!disabled) setDraftTimeTo(v);\n }}\n />\n </div>\n </div>\n {customRangeError && <p className={cn('text-ui-sm text-red-500 px-4 pb-1')}>{customRangeError}</p>}\n <div className={cn('flex justify-between items-center px-4 pb-3')}>\n <button\n type=\"button\"\n disabled={disabled}\n className={cn(\n 'text-ui-sm text-neutral3 hover:text-neutral4',\n disabled && 'opacity-50 pointer-events-none',\n )}\n onClick={() => {\n setCustomRangeError(undefined);\n handlePresetSelect(fallbackPreset);\n }}\n >\n &larr; Presets\n </button>\n <Button variant=\"primary\" size=\"sm\" onClick={applyCustomRange} disabled={disabled}>\n Apply\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenu.Trigger asChild>\n <Button size={size} disabled={disabled}>\n <CalendarIcon />\n {datePresetLabel}\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"start\">\n {visiblePresets.map(p => (\n <DropdownMenu.Item key={p.value} onSelect={() => handlePresetSelect(p.value)}>\n {p.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n"],"names":["parse","isValid","useState","jsxs","Popover","jsx","PopoverTrigger","Button","CalendarIcon","PopoverContent","cn","DatePicker","TimePicker","DropdownMenu"],"mappings":";;;;;;;;;;;;AAYA,MAAM,YAAA,GAAyE;AAAA,EAC7E,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EAC7B,EAAE,OAAO,UAAA,EAAY,KAAA,EAAO,iBAAiB,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA,EAAK;AAAA,EACrE,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,aAAA,EAAe,IAAI,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA,EAAK;AAAA,EACtE,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,aAAA,EAAe,IAAI,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA,EAAK;AAAA,EACtE,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,cAAA,EAAgB,IAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA,EAAK;AAAA,EACzE,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,cAAA,EAAgB,IAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA,EAAK;AAAA,EACzE,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,iBAAA;AAC5B,CAAA;AAEA,SAAS,iBAAA,CAAkB,MAAY,OAAA,EAA8B;AACnE,EAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY,EAAG,IAAA,CAAK,QAAA,EAAS,EAAG,IAAA,CAAK,OAAA,EAAS,CAAA;AAC7E,EAAA,MAAM,QAAA,GAAWA,aAAA,CAAM,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAA;AAClD,EAAA,OAAOC,eAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,IAAA;AACxC;AAeO,SAAS,mBAAA,CAAoB;AAAA,EAClC,MAAA,GAAS,KAAA;AAAA,EACT,cAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO;AACT,CAAA,EAA6B;AAC3B,EAAA,MAAM,cAAA,GAAiB,OAAA,GAAU,YAAA,CAAa,MAAA,CAAO,CAAA,CAAA,KAAK,QAAQ,QAAA,CAAS,CAAA,CAAE,KAAK,CAAC,CAAA,GAAI,YAAA;AACvF,EAAA,MAAM,cAAA,GAAkC,eAAe,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,KAAA,KAAU,QAAQ,GAAG,KAAA,IAAS,KAAA;AACjG,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIC,eAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAA2B,QAAQ,CAAA;AAC7E,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAA2B,MAAM,CAAA;AACvE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,UAAU,CAAA;AAC7D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,UAAU,CAAA;AACzD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,cAAA,EAA6B;AAE7E,EAAA,MAAM,eAAA,GAAkB,aAAa,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,KAAA,KAAU,MAAM,GAAG,KAAA,IAAS,KAAA;AAE7E,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAA2B;AACrD,IAAA,cAAA,GAAiB,KAAK,CAAA;AACtB,IAAA,IAAI,UAAU,QAAA,EAAU;AACtB,MAAA,gBAAA,CAAiB,QAAQ,CAAA;AACzB,MAAA,cAAA,CAAe,MAAM,CAAA;AACrB,MAAA,gBAAA,CAAiB,UAAU,CAAA;AAC3B,MAAA,cAAA,CAAe,UAAU,CAAA;AACzB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,KAAK,CAAA;AACtD,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,YAAA,GAAe,IAAI,KAAK,IAAA,CAAK,GAAA,KAAQ,KAAA,CAAM,EAAE,GAAG,MAAM,CAAA;AACtD,MAAA,YAAA,GAAe,QAAW,IAAI,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,YAAA,GAAe,QAAW,MAAM,CAAA;AAChC,MAAA,YAAA,GAAe,QAAW,IAAI,CAAA;AAAA,IAChC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,MAAM,WAAW,aAAA,GAAiB,iBAAA,CAAkB,aAAA,EAAe,aAAa,KAAK,aAAA,GAAiB,MAAA;AACtG,IAAA,MAAM,SAAS,WAAA,GAAe,iBAAA,CAAkB,WAAA,EAAa,WAAW,KAAK,WAAA,GAAe,MAAA;AAC5F,IAAA,IAAI,YAAY,MAAA,IAAU,QAAA,CAAS,SAAQ,GAAI,MAAA,CAAO,SAAQ,EAAG;AAC/D,MAAA,mBAAA,CAAoB,8CAA8C,CAAA;AAClE,MAAA;AAAA,IACF;AACA,IAAA,mBAAA,CAAoB,MAAS,CAAA;AAC7B,IAAA,YAAA,GAAe,UAAU,MAAM,CAAA;AAC/B,IAAA,YAAA,GAAe,QAAQ,IAAI,CAAA;AAC3B,IAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,uBACEC,eAAA,CAACC,eAAA,EAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,cAAc,kBAAA,EAC5C,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAACC,0BAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAH,eAAA,CAACI,aAAA,EAAA,EAAO,MAAY,QAAA,EAClB,QAAA,EAAA;AAAA,wBAAAF,cAAA,CAACG,wBAAA,EAAA,EAAa,CAAA;AAAA,QACb,QAAA,GAAW,QAAA,CAAS,kBAAA,EAAmB,GAAI,OAAA;AAAA,QAAQ,GAAA;AAAA,QAAE,KAAA;AAAA,QACrD,MAAA,GAAS,MAAA,CAAO,kBAAA,EAAmB,GAAI;AAAA,OAAA,EAC1C,CAAA,EACF,CAAA;AAAA,sCACCC,sBAAA,EAAA,EAAe,KAAA,EAAM,SAAQ,SAAA,EAAWC,QAAA,CAAG,YAAY,CAAA,EACtD,QAAA,EAAA;AAAA,wBAAAP,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWO,QAAA,CAAG,MAAM,CAAA,EACvB,QAAA,EAAA;AAAA,0BAAAP,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWO,QAAA,CAAG,yBAAyB,CAAA,EAC1C,QAAA,EAAA;AAAA,4BAAAL,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWK,QAAA,CAAG,sDAAsD,GAAG,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BAClFL,cAAA;AAAA,cAACM,qBAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,aAAA;AAAA,gBACV,KAAA,EAAO,aAAA;AAAA,gBACP,QAAA,EAAU,gBAAA;AAAA,gBACV,QAAA;AAAA,gBACA,MAAA,EAAQ;AAAA;AAAA,aACV;AAAA,4BACAN,cAAA;AAAA,cAACO,qBAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,kBAAA;AAAA,gBACV,YAAA,EAAc,aAAA;AAAA,gBACd,eAAe,CAAA,CAAA,KAAK;AAClB,kBAAA,IAAI,CAAC,QAAA,EAAU,gBAAA,CAAiB,CAAC,CAAA;AAAA,gBACnC;AAAA;AAAA;AACF,WAAA,EACF,CAAA;AAAA,0CACC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAP,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWK,QAAA,CAAG,sDAAsD,GAAG,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,4BAChFL,cAAA;AAAA,cAACM,qBAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,WAAA;AAAA,gBACV,KAAA,EAAO,WAAA;AAAA,gBACP,QAAA,EAAU,cAAA;AAAA,gBACV,QAAA;AAAA,gBACA,QAAA,EAAU;AAAA;AAAA,aACZ;AAAA,4BACAN,cAAA;AAAA,cAACO,qBAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,kBAAA;AAAA,gBACV,YAAA,EAAc,WAAA;AAAA,gBACd,eAAe,CAAA,CAAA,KAAK;AAClB,kBAAA,IAAI,CAAC,QAAA,EAAU,cAAA,CAAe,CAAC,CAAA;AAAA,gBACjC;AAAA;AAAA;AACF,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,QACC,oCAAoBP,cAAA,CAAC,GAAA,EAAA,EAAE,WAAWK,QAAA,CAAG,mCAAmC,GAAI,QAAA,EAAA,gBAAA,EAAiB,CAAA;AAAA,wBAC9FP,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWO,QAAA,CAAG,6CAA6C,CAAA,EAC9D,QAAA,EAAA;AAAA,0BAAAL,cAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,QAAA;AAAA,cACA,SAAA,EAAWK,QAAA;AAAA,gBACT,8CAAA;AAAA,gBACA,QAAA,IAAY;AAAA,eACd;AAAA,cACA,SAAS,MAAM;AACb,gBAAA,mBAAA,CAAoB,MAAS,CAAA;AAC7B,gBAAA,kBAAA,CAAmB,cAAc,CAAA;AAAA,cACnC,CAAA;AAAA,cACD,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAL,cAAA,CAACE,iBAAO,OAAA,EAAQ,SAAA,EAAU,MAAK,IAAA,EAAK,OAAA,EAAS,gBAAA,EAAkB,QAAA,EAAoB,QAAA,EAAA,OAAA,EAEnF;AAAA,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uCACGM,yBAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAR,cAAA,CAACQ,yBAAA,CAAa,SAAb,EAAqB,OAAA,EAAO,MAC3B,QAAA,kBAAAV,eAAA,CAACI,aAAA,EAAA,EAAO,MAAY,QAAA,EAClB,QAAA,EAAA;AAAA,sBAAAF,cAAA,CAACG,wBAAA,EAAA,EAAa,CAAA;AAAA,MACb;AAAA,KAAA,EACH,CAAA,EACF,CAAA;AAAA,oBACAH,cAAA,CAACQ,yBAAA,CAAa,OAAA,EAAb,EAAqB,KAAA,EAAM,SACzB,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAA,CAAA,qBAClBR,cAAA,CAACQ,yBAAA,CAAa,IAAA,EAAb,EAAgC,QAAA,EAAU,MAAM,kBAAA,CAAmB,CAAA,CAAE,KAAK,CAAA,EACxE,YAAE,KAAA,EAAA,EADmB,CAAA,CAAE,KAE1B,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"date-time-range-picker-DjcVeD-Z.cjs","sources":["../src/ds/components/DateTimeRangePicker/date-time-range-picker.tsx"],"sourcesContent":["import { isValid, parse } from 'date-fns';\nimport { CalendarIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { Button } from '@/ds/components/Button/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { DatePicker, TimePicker } from '@/ds/components/DateTimePicker';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\nimport { Popover, PopoverTrigger, PopoverContent } from '@/ds/components/Popover/popover';\nimport { cn } from '@/lib/utils';\n\nexport type DateRangePreset = 'all' | 'last-24h' | 'last-3d' | 'last-7d' | 'last-14d' | 'last-30d' | 'custom';\n\nconst DATE_PRESETS: { value: DateRangePreset; label: string; ms?: number }[] = [\n { value: 'all', label: 'All' },\n { value: 'last-24h', label: 'Last 24 hours', ms: 24 * 60 * 60 * 1000 },\n { value: 'last-3d', label: 'Last 3 days', ms: 3 * 24 * 60 * 60 * 1000 },\n { value: 'last-7d', label: 'Last 7 days', ms: 7 * 24 * 60 * 60 * 1000 },\n { value: 'last-14d', label: 'Last 14 days', ms: 14 * 24 * 60 * 60 * 1000 },\n { value: 'last-30d', label: 'Last 30 days', ms: 30 * 24 * 60 * 60 * 1000 },\n { value: 'custom', label: 'Custom range...' },\n];\n\nfunction buildDateWithTime(date: Date, timeStr: string): Date | null {\n const dateOnly = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n const combined = parse(timeStr, 'h:mm a', dateOnly);\n return isValid(combined) ? combined : null;\n}\n\nexport interface DateTimeRangePickerProps {\n preset?: DateRangePreset;\n onPresetChange?: (preset: DateRangePreset) => void;\n dateFrom?: Date;\n dateTo?: Date;\n onDateChange?: (value: Date | undefined, type: 'from' | 'to') => void;\n disabled?: boolean;\n /** Subset of presets to show. If omitted, all presets are shown. */\n presets?: readonly DateRangePreset[];\n /** Size passed through to the trigger Button. Defaults to 'md'. */\n size?: ButtonProps['size'];\n}\n\nexport function DateTimeRangePicker({\n preset = 'all',\n onPresetChange,\n dateFrom,\n dateTo,\n onDateChange,\n disabled,\n presets,\n size = 'md',\n}: DateTimeRangePickerProps) {\n const visiblePresets = presets ? DATE_PRESETS.filter(p => presets.includes(p.value)) : DATE_PRESETS;\n const fallbackPreset: DateRangePreset = visiblePresets.find(p => p.value !== 'custom')?.value ?? 'all';\n const [customRangeOpen, setCustomRangeOpen] = useState(false);\n const [draftDateFrom, setDraftDateFrom] = useState<Date | undefined>(dateFrom);\n const [draftDateTo, setDraftDateTo] = useState<Date | undefined>(dateTo);\n const [draftTimeFrom, setDraftTimeFrom] = useState('12:00 AM');\n const [draftTimeTo, setDraftTimeTo] = useState('11:59 PM');\n const [customRangeError, setCustomRangeError] = useState<string | undefined>();\n\n const datePresetLabel = DATE_PRESETS.find(p => p.value === preset)?.label ?? 'All';\n\n const handlePresetSelect = (value: DateRangePreset) => {\n onPresetChange?.(value);\n if (value === 'custom') {\n setDraftDateFrom(dateFrom);\n setDraftDateTo(dateTo);\n setDraftTimeFrom('12:00 AM');\n setDraftTimeTo('11:59 PM');\n setCustomRangeOpen(true);\n return;\n }\n const entry = DATE_PRESETS.find(p => p.value === value);\n if (entry?.ms) {\n onDateChange?.(new Date(Date.now() - entry.ms), 'from');\n onDateChange?.(undefined, 'to');\n } else {\n onDateChange?.(undefined, 'from');\n onDateChange?.(undefined, 'to');\n }\n };\n\n const applyCustomRange = () => {\n const fromDate = draftDateFrom ? (buildDateWithTime(draftDateFrom, draftTimeFrom) ?? draftDateFrom) : undefined;\n const toDate = draftDateTo ? (buildDateWithTime(draftDateTo, draftTimeTo) ?? draftDateTo) : undefined;\n if (fromDate && toDate && fromDate.getTime() > toDate.getTime()) {\n setCustomRangeError('Start date/time must be before end date/time');\n return;\n }\n setCustomRangeError(undefined);\n onDateChange?.(fromDate, 'from');\n onDateChange?.(toDate, 'to');\n setCustomRangeOpen(false);\n };\n\n if (preset === 'custom') {\n return (\n <Popover open={customRangeOpen} onOpenChange={setCustomRangeOpen}>\n <PopoverTrigger asChild>\n <Button size={size} disabled={disabled}>\n <CalendarIcon />\n {dateFrom ? dateFrom.toLocaleDateString() : 'Start'} {' \\u2013 '}\n {dateTo ? dateTo.toLocaleDateString() : 'End'}\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className={cn('w-auto p-0')}>\n <div className={cn('flex')}>\n <div className={cn('border-r border-border1')}>\n <span className={cn('text-ui-sm text-neutral3 font-medium px-4 pt-3 block')}>Start</span>\n <DatePicker\n mode=\"single\"\n selected={draftDateFrom}\n month={draftDateFrom}\n onSelect={setDraftDateFrom}\n disabled={disabled}\n toDate={draftDateTo}\n />\n <TimePicker\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeFrom}\n onValueChange={v => {\n if (!disabled) setDraftTimeFrom(v);\n }}\n />\n </div>\n <div>\n <span className={cn('text-ui-sm text-neutral3 font-medium px-4 pt-3 block')}>End</span>\n <DatePicker\n mode=\"single\"\n selected={draftDateTo}\n month={draftDateTo}\n onSelect={setDraftDateTo}\n disabled={disabled}\n fromDate={draftDateFrom}\n />\n <TimePicker\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeTo}\n onValueChange={v => {\n if (!disabled) setDraftTimeTo(v);\n }}\n />\n </div>\n </div>\n {customRangeError && <p className={cn('text-ui-sm text-red-500 px-4 pb-1')}>{customRangeError}</p>}\n <div className={cn('flex justify-between items-center px-4 pb-3')}>\n <button\n type=\"button\"\n disabled={disabled}\n className={cn(\n 'text-ui-sm text-neutral3 hover:text-neutral4',\n disabled && 'opacity-50 pointer-events-none',\n )}\n onClick={() => {\n setCustomRangeError(undefined);\n handlePresetSelect(fallbackPreset);\n }}\n >\n &larr; Presets\n </button>\n <Button variant=\"primary\" size=\"sm\" onClick={applyCustomRange} disabled={disabled}>\n Apply\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenu.Trigger asChild>\n <Button size={size} disabled={disabled}>\n <CalendarIcon />\n {datePresetLabel}\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"start\">\n {visiblePresets.map(p => (\n <DropdownMenu.Item key={p.value} onSelect={() => handlePresetSelect(p.value)}>\n {p.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n"],"names":["parse","isValid","useState","jsxs","Popover","jsx","PopoverTrigger","Button","CalendarIcon","PopoverContent","cn","DatePicker","TimePicker","DropdownMenu"],"mappings":";;;;;;;;;;;;AAYA,MAAM,YAAA,GAAyE;AAAA,EAC7E,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EAC7B,EAAE,OAAO,UAAA,EAAY,KAAA,EAAO,iBAAiB,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA,EAAK;AAAA,EACrE,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,aAAA,EAAe,IAAI,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA,EAAK;AAAA,EACtE,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,aAAA,EAAe,IAAI,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA,EAAK;AAAA,EACtE,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,cAAA,EAAgB,IAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA,EAAK;AAAA,EACzE,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,cAAA,EAAgB,IAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA,EAAK;AAAA,EACzE,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,iBAAA;AAC5B,CAAA;AAEA,SAAS,iBAAA,CAAkB,MAAY,OAAA,EAA8B;AACnE,EAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY,EAAG,IAAA,CAAK,QAAA,EAAS,EAAG,IAAA,CAAK,OAAA,EAAS,CAAA;AAC7E,EAAA,MAAM,QAAA,GAAWA,aAAA,CAAM,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAA;AAClD,EAAA,OAAOC,eAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,IAAA;AACxC;AAeO,SAAS,mBAAA,CAAoB;AAAA,EAClC,MAAA,GAAS,KAAA;AAAA,EACT,cAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO;AACT,CAAA,EAA6B;AAC3B,EAAA,MAAM,cAAA,GAAiB,OAAA,GAAU,YAAA,CAAa,MAAA,CAAO,CAAA,CAAA,KAAK,QAAQ,QAAA,CAAS,CAAA,CAAE,KAAK,CAAC,CAAA,GAAI,YAAA;AACvF,EAAA,MAAM,cAAA,GAAkC,eAAe,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,KAAA,KAAU,QAAQ,GAAG,KAAA,IAAS,KAAA;AACjG,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIC,eAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAA2B,QAAQ,CAAA;AAC7E,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAA2B,MAAM,CAAA;AACvE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,UAAU,CAAA;AAC7D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,UAAU,CAAA;AACzD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,cAAA,EAA6B;AAE7E,EAAA,MAAM,eAAA,GAAkB,aAAa,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,KAAA,KAAU,MAAM,GAAG,KAAA,IAAS,KAAA;AAE7E,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAA2B;AACrD,IAAA,cAAA,GAAiB,KAAK,CAAA;AACtB,IAAA,IAAI,UAAU,QAAA,EAAU;AACtB,MAAA,gBAAA,CAAiB,QAAQ,CAAA;AACzB,MAAA,cAAA,CAAe,MAAM,CAAA;AACrB,MAAA,gBAAA,CAAiB,UAAU,CAAA;AAC3B,MAAA,cAAA,CAAe,UAAU,CAAA;AACzB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,KAAK,CAAA;AACtD,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,YAAA,GAAe,IAAI,KAAK,IAAA,CAAK,GAAA,KAAQ,KAAA,CAAM,EAAE,GAAG,MAAM,CAAA;AACtD,MAAA,YAAA,GAAe,QAAW,IAAI,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,YAAA,GAAe,QAAW,MAAM,CAAA;AAChC,MAAA,YAAA,GAAe,QAAW,IAAI,CAAA;AAAA,IAChC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,MAAM,WAAW,aAAA,GAAiB,iBAAA,CAAkB,aAAA,EAAe,aAAa,KAAK,aAAA,GAAiB,MAAA;AACtG,IAAA,MAAM,SAAS,WAAA,GAAe,iBAAA,CAAkB,WAAA,EAAa,WAAW,KAAK,WAAA,GAAe,MAAA;AAC5F,IAAA,IAAI,YAAY,MAAA,IAAU,QAAA,CAAS,SAAQ,GAAI,MAAA,CAAO,SAAQ,EAAG;AAC/D,MAAA,mBAAA,CAAoB,8CAA8C,CAAA;AAClE,MAAA;AAAA,IACF;AACA,IAAA,mBAAA,CAAoB,MAAS,CAAA;AAC7B,IAAA,YAAA,GAAe,UAAU,MAAM,CAAA;AAC/B,IAAA,YAAA,GAAe,QAAQ,IAAI,CAAA;AAC3B,IAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,uBACEC,eAAA,CAACC,eAAA,EAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,cAAc,kBAAA,EAC5C,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAACC,0BAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAH,eAAA,CAACI,aAAA,EAAA,EAAO,MAAY,QAAA,EAClB,QAAA,EAAA;AAAA,wBAAAF,cAAA,CAACG,wBAAA,EAAA,EAAa,CAAA;AAAA,QACb,QAAA,GAAW,QAAA,CAAS,kBAAA,EAAmB,GAAI,OAAA;AAAA,QAAQ,GAAA;AAAA,QAAE,KAAA;AAAA,QACrD,MAAA,GAAS,MAAA,CAAO,kBAAA,EAAmB,GAAI;AAAA,OAAA,EAC1C,CAAA,EACF,CAAA;AAAA,sCACCC,sBAAA,EAAA,EAAe,KAAA,EAAM,SAAQ,SAAA,EAAWC,QAAA,CAAG,YAAY,CAAA,EACtD,QAAA,EAAA;AAAA,wBAAAP,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWO,QAAA,CAAG,MAAM,CAAA,EACvB,QAAA,EAAA;AAAA,0BAAAP,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWO,QAAA,CAAG,yBAAyB,CAAA,EAC1C,QAAA,EAAA;AAAA,4BAAAL,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWK,QAAA,CAAG,sDAAsD,GAAG,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BAClFL,cAAA;AAAA,cAACM,qBAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,aAAA;AAAA,gBACV,KAAA,EAAO,aAAA;AAAA,gBACP,QAAA,EAAU,gBAAA;AAAA,gBACV,QAAA;AAAA,gBACA,MAAA,EAAQ;AAAA;AAAA,aACV;AAAA,4BACAN,cAAA;AAAA,cAACO,qBAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,kBAAA;AAAA,gBACV,YAAA,EAAc,aAAA;AAAA,gBACd,eAAe,CAAA,CAAA,KAAK;AAClB,kBAAA,IAAI,CAAC,QAAA,EAAU,gBAAA,CAAiB,CAAC,CAAA;AAAA,gBACnC;AAAA;AAAA;AACF,WAAA,EACF,CAAA;AAAA,0CACC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAP,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWK,QAAA,CAAG,sDAAsD,GAAG,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,4BAChFL,cAAA;AAAA,cAACM,qBAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,WAAA;AAAA,gBACV,KAAA,EAAO,WAAA;AAAA,gBACP,QAAA,EAAU,cAAA;AAAA,gBACV,QAAA;AAAA,gBACA,QAAA,EAAU;AAAA;AAAA,aACZ;AAAA,4BACAN,cAAA;AAAA,cAACO,qBAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,kBAAA;AAAA,gBACV,YAAA,EAAc,WAAA;AAAA,gBACd,eAAe,CAAA,CAAA,KAAK;AAClB,kBAAA,IAAI,CAAC,QAAA,EAAU,cAAA,CAAe,CAAC,CAAA;AAAA,gBACjC;AAAA;AAAA;AACF,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,QACC,oCAAoBP,cAAA,CAAC,GAAA,EAAA,EAAE,WAAWK,QAAA,CAAG,mCAAmC,GAAI,QAAA,EAAA,gBAAA,EAAiB,CAAA;AAAA,wBAC9FP,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWO,QAAA,CAAG,6CAA6C,CAAA,EAC9D,QAAA,EAAA;AAAA,0BAAAL,cAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,QAAA;AAAA,cACA,SAAA,EAAWK,QAAA;AAAA,gBACT,8CAAA;AAAA,gBACA,QAAA,IAAY;AAAA,eACd;AAAA,cACA,SAAS,MAAM;AACb,gBAAA,mBAAA,CAAoB,MAAS,CAAA;AAC7B,gBAAA,kBAAA,CAAmB,cAAc,CAAA;AAAA,cACnC,CAAA;AAAA,cACD,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAL,cAAA,CAACE,iBAAO,OAAA,EAAQ,SAAA,EAAU,MAAK,IAAA,EAAK,OAAA,EAAS,gBAAA,EAAkB,QAAA,EAAoB,QAAA,EAAA,OAAA,EAEnF;AAAA,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uCACGM,yBAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAR,cAAA,CAACQ,yBAAA,CAAa,SAAb,EAAqB,OAAA,EAAO,MAC3B,QAAA,kBAAAV,eAAA,CAACI,aAAA,EAAA,EAAO,MAAY,QAAA,EAClB,QAAA,EAAA;AAAA,sBAAAF,cAAA,CAACG,wBAAA,EAAA,EAAa,CAAA;AAAA,MACb;AAAA,KAAA,EACH,CAAA,EACF,CAAA;AAAA,oBACAH,cAAA,CAACQ,yBAAA,CAAa,OAAA,EAAb,EAAqB,KAAA,EAAM,SACzB,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAA,CAAA,qBAClBR,cAAA,CAACQ,yBAAA,CAAa,IAAA,EAAb,EAAgC,QAAA,EAAU,MAAM,kBAAA,CAAmB,CAAA,CAAE,KAAK,CAAA,EACxE,YAAE,KAAA,EAAA,EADmB,CAAA,CAAE,KAE1B,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
package/dist/index.cjs.js CHANGED
@@ -26,7 +26,7 @@ const multiCombobox = require('./multi-combobox-DkFLK64B.cjs');
26
26
  const combobox$1 = require('@base-ui/react/combobox');
27
27
  const command = require('./command-D0tQ1Lpz.cjs');
28
28
  const code = require('./code-B3WONxnA.cjs');
29
- const codeBlock = require('./code-block-CcVa6fM8.cjs');
29
+ const codeBlock = require('./code-block-C4Zp_ewI.cjs');
30
30
  const copyButton = require('./copy-button-BaAuAgdC.cjs');
31
31
  const dashboardCard = require('./dashboard-card-B9enj4NG.cjs');
32
32
  const dialog = require('./dialog-46zkb32X.cjs');
@@ -47,8 +47,8 @@ const label = require('./label-U8omtW8w.cjs');
47
47
  const markdownRenderer = require('./markdown-renderer-DyUlVfRt.cjs');
48
48
  const metricsCard = require('./metrics-card-hs1pqY2Y.cjs');
49
49
  const metricsFlexGrid = require('./metrics-flex-grid-DzlyAgr7.cjs');
50
- const popover = require('./popover-ttQgAb0m.cjs');
51
- const propertyFilterCreator = require('./property-filter-creator-Cl7xhaML.cjs');
50
+ const popover = require('./popover-B8RFw-D-.cjs');
51
+ const propertyFilterCreator = require('./property-filter-creator-DU8pl6-6.cjs');
52
52
  const radioGroup = require('./radio-group-CcZMn-TY.cjs');
53
53
  const scrollArea = require('./scroll-area-BqJfcT94.cjs');
54
54
  const pendingIndicator = require('./pending-indicator-BxD-kwEk.cjs');
@@ -68,16 +68,16 @@ const buttonsGroup = require('./buttons-group-BvLg2kpv.cjs');
68
68
  const mainContent = require('./main-content-CnmMWNin.cjs');
69
69
  const mainHeader = require('./main-header-DJLRceP9.cjs');
70
70
  const sections = require('./sections-BgrvBjOR.cjs');
71
- const dateTimePicker = require('./date-time-picker-BKqGpw5w.cjs');
71
+ const dateTimePicker = require('./date-time-picker-Bjr6V3AR.cjs');
72
72
  const timePicker = require('./time-picker-DWrxHBfR.cjs');
73
73
  const components_JSONSchemaForm = require('./components/JSONSchemaForm.cjs.js');
74
74
  const keyValueList = require('./key-value-list-D067I300.cjs');
75
- const mainSidebar = require('./main-sidebar-CWoM-yrH.cjs');
75
+ const mainSidebar = require('./main-sidebar-Djs_3tGw.cjs');
76
76
  const pageHeader = require('./page-header-C1ZlL4Ua.cjs');
77
77
  const section = require('./section-muObW4n-.cjs');
78
78
  const sectionCard = require('./section-card-23Os1QRs.cjs');
79
79
  const processStepProgressBar = require('./process-step-progress-bar-D74Y-8Jo.cjs');
80
- const tabsTab = require('./tabs-tab-Dl9FqQhm.cjs');
80
+ const tabsTab = require('./tabs-tab-CulV7e_n.cjs');
81
81
  const tabsContent = require('./tabs-content-m86TGI_b.cjs');
82
82
  const getShortId = require('./get-short-id-DtN4BmrD.cjs');
83
83
  const contentBlock = require('./content-block-Csb01oxE.cjs');
@@ -102,7 +102,7 @@ const dataCodeSection = require('./data-code-section-BtFzBCox.cjs');
102
102
  const components_DataDetailsPanel = require('./components/DataDetailsPanel.cjs.js');
103
103
  const dataKeysAndValues = require('./data-keys-and-values-Spy2O_IE.cjs');
104
104
  const dataPanel = require('./data-panel-DToYF7cH.cjs');
105
- const dateTimeRangePicker = require('./date-time-range-picker-Do-3VVvo.cjs');
105
+ const dateTimeRangePicker = require('./date-time-range-picker-DjcVeD-Z.cjs');
106
106
  const horizontalBars = require('./horizontal-bars-C9qp4r47.cjs');
107
107
  const metricsDataTable = require('./metrics-data-table-D7vx2WEJ.cjs');
108
108
  const metricsLineChart = require('./metrics-line-chart-D1ZGVepo.cjs');
@@ -116,12 +116,12 @@ const transitions = require('./transitions-DpczSjmD.cjs');
116
116
  const useCopyToClipboard = require('./use-copy-to-clipboard-CQgIuR1c.cjs');
117
117
  const React = require('react');
118
118
  const utils = require('./utils-vA5sWo9W.cjs');
119
- const zustand = require('zustand');
120
- const middleware = require('zustand/middleware');
121
119
  const jsxRuntime = require('react/jsx-runtime');
122
120
  const lucideReact = require('lucide-react');
123
121
  const reactResizablePanels = require('react-resizable-panels');
124
122
  const Icon = require('./Icon-C_Ooy-cP.cjs');
123
+ const zustand = require('zustand');
124
+ const middleware = require('zustand/middleware');
125
125
  const dateFns = require('date-fns');
126
126
  const observability = require('@mastra/core/observability');
127
127
  const metricsKpiCard = require('./metrics-kpi-card-D_SaIWBc.cjs');
@@ -1426,6 +1426,19 @@ const useInView = () => {
1426
1426
  return { inView, setRef };
1427
1427
  };
1428
1428
 
1429
+ const useIsMobile = (breakpoint = 1024) => {
1430
+ const query = React.useMemo(() => `(max-width: ${breakpoint - 1}px)`, [breakpoint]);
1431
+ const [isMobile, setIsMobile] = React.useState(false);
1432
+ React.useLayoutEffect(() => {
1433
+ const mq = window.matchMedia(query);
1434
+ const update = () => setIsMobile(mq.matches);
1435
+ update();
1436
+ mq.addEventListener("change", update);
1437
+ return () => mq.removeEventListener("change", update);
1438
+ }, [query]);
1439
+ return isMobile;
1440
+ };
1441
+
1429
1442
  const lodashTitleCase = (str) => {
1430
1443
  const camelCased = str.replace(/[-_\s]+(.)?/g, (_, char) => char ? char.toUpperCase() : "").replace(/^(.)/, (char) => char.toLowerCase());
1431
1444
  return camelCased.replace(/([A-Z])/g, " $1").replace(/^./, (str2) => str2.toUpperCase()).trim();
@@ -2160,33 +2173,315 @@ const RuleBuilder = ({
2160
2173
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className, children: /* @__PURE__ */ jsxRuntime.jsx(RuleGroupView, { schema, group: ruleGroup, onChange: handleGroupChange, depth: 0, maxDepth }) });
2161
2174
  };
2162
2175
 
2163
- const CollapsiblePanel = ({ collapsedSize, children, direction, onResize, ...props }) => {
2176
+ const PanelEdgeIcon = ({ side }) => /* @__PURE__ */ jsxRuntime.jsxs(
2177
+ "svg",
2178
+ {
2179
+ viewBox: "0 0 24 24",
2180
+ fill: "none",
2181
+ stroke: "currentColor",
2182
+ strokeWidth: "2",
2183
+ strokeLinecap: "round",
2184
+ strokeLinejoin: "round",
2185
+ "aria-hidden": "true",
2186
+ children: [
2187
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "5" }),
2188
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: side === "left" ? "M9 3v18" : "M15 3v18" })
2189
+ ]
2190
+ }
2191
+ );
2192
+
2193
+ const panelIconButtonClass = utils.cn(
2194
+ "flex size-8 cursor-pointer items-center justify-center rounded-full",
2195
+ "border border-transparent bg-transparent text-neutral5 hover:bg-neutral6/5 hover:text-neutral6 active:bg-neutral6/10",
2196
+ "transition-colors duration-150 ease-out-custom motion-reduce:transition-none",
2197
+ "focus-visible:outline-hidden focus-visible:border-accent1"
2198
+ );
2199
+
2200
+ const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
2201
+ const readAxis = (point, rect, axis) => {
2202
+ return { client: point.clientY, start: rect.top, size: rect.height };
2203
+ };
2204
+ const getClampedElementCursorOffset = (point, rect, axis, margin = 0) => {
2205
+ const { client, start, size } = readAxis(point, rect);
2206
+ return clamp(client - start, margin, Math.max(margin, size - margin));
2207
+ };
2208
+ const useClampedElementCursor = ({
2209
+ axis,
2210
+ margin = 0,
2211
+ variableName
2212
+ }) => {
2213
+ const elementRef = React.useRef(null);
2214
+ const rectRef = React.useRef(null);
2215
+ const writePosition = React.useCallback(
2216
+ (point, refreshRect = false) => {
2217
+ const element = elementRef.current;
2218
+ if (!element) return;
2219
+ const rect = refreshRect || !rectRef.current ? element.getBoundingClientRect() : rectRef.current;
2220
+ rectRef.current = rect;
2221
+ const offset = getClampedElementCursorOffset(point, rect, axis, margin);
2222
+ element.style.setProperty(variableName, `${offset}px`);
2223
+ },
2224
+ [axis, margin, variableName]
2225
+ );
2226
+ const beginTracking = React.useCallback(
2227
+ (point) => {
2228
+ writePosition(point, true);
2229
+ },
2230
+ [writePosition]
2231
+ );
2232
+ const updateTracking = React.useCallback(
2233
+ (point) => {
2234
+ writePosition(point);
2235
+ },
2236
+ [writePosition]
2237
+ );
2238
+ const endTracking = React.useCallback(() => {
2239
+ rectRef.current = null;
2240
+ }, []);
2241
+ return { beginTracking, elementRef, endTracking, updateTracking };
2242
+ };
2243
+
2244
+ const PILL_EDGE_MARGIN = 22;
2245
+ const usePanelSizeTransitions = (elementRef) => {
2246
+ const [booted, setBooted] = React.useState(false);
2247
+ const bootedRef = React.useRef(false);
2248
+ const bootScheduled = React.useRef(false);
2249
+ const enableSizeTransitionsRef = React.useRef(() => {
2250
+ });
2251
+ const enableSizeTransitions = React.useCallback(() => {
2252
+ enableSizeTransitionsRef.current();
2253
+ }, []);
2254
+ const boot = React.useCallback(() => {
2255
+ if (bootScheduled.current) return;
2256
+ bootScheduled.current = true;
2257
+ requestAnimationFrame(() => {
2258
+ bootedRef.current = true;
2259
+ setBooted(true);
2260
+ enableSizeTransitionsRef.current();
2261
+ });
2262
+ }, []);
2263
+ React.useEffect(() => {
2264
+ if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
2265
+ const group = elementRef.current?.parentElement;
2266
+ if (!group) return;
2267
+ const panels = Array.from(group.children).filter(
2268
+ (child) => child instanceof HTMLElement && child.hasAttribute("data-panel")
2269
+ );
2270
+ const separators = Array.from(group.children).filter(
2271
+ (child) => child instanceof HTMLElement && child.hasAttribute("data-separator")
2272
+ );
2273
+ const enable = () => {
2274
+ if (!bootedRef.current) return;
2275
+ panels.forEach(
2276
+ (panel) => panel.style.transition = "flex-grow 300ms var(--ease-out-custom, ease), flex-basis 300ms var(--ease-out-custom, ease)"
2277
+ );
2278
+ };
2279
+ const disable = () => panels.forEach((panel) => panel.style.transition = "none");
2280
+ enable();
2281
+ enableSizeTransitionsRef.current = enable;
2282
+ separators.forEach((separator) => separator.addEventListener("pointerdown", disable));
2283
+ window.addEventListener("pointerup", enable);
2284
+ window.addEventListener("pointercancel", enable);
2285
+ return () => {
2286
+ enableSizeTransitionsRef.current = () => {
2287
+ };
2288
+ separators.forEach((separator) => separator.removeEventListener("pointerdown", disable));
2289
+ window.removeEventListener("pointerup", enable);
2290
+ window.removeEventListener("pointercancel", enable);
2291
+ panels.forEach((panel) => panel.style.transition = "");
2292
+ };
2293
+ }, [elementRef]);
2294
+ return { booted, boot, enableSizeTransitions };
2295
+ };
2296
+ const useCollapsedEdgePill = ({
2297
+ collapsed,
2298
+ direction,
2299
+ elementRef
2300
+ }) => {
2301
+ const expandButtonRef = React.useRef(null);
2302
+ const pillRef = React.useRef(null);
2303
+ const {
2304
+ beginTracking: beginPillTracking,
2305
+ elementRef: stripRef,
2306
+ endTracking: endPillTracking,
2307
+ updateTracking: updatePillTracking
2308
+ } = useClampedElementCursor({
2309
+ axis: "y",
2310
+ margin: PILL_EDGE_MARGIN,
2311
+ variableName: "--pill-y"
2312
+ });
2313
+ const setEdgeHovered = React.useCallback((hovered) => {
2314
+ const expandButton = expandButtonRef.current;
2315
+ const pill = pillRef.current;
2316
+ if (expandButton) expandButton.dataset.edgeHovered = hovered ? "true" : "false";
2317
+ if (pill) pill.dataset.edgeHovered = hovered ? "true" : "false";
2318
+ }, []);
2319
+ const spawnPill = React.useCallback(
2320
+ (point) => {
2321
+ const pill = pillRef.current;
2322
+ if (!pill) return;
2323
+ beginPillTracking(point);
2324
+ pill.style.transitionProperty = "opacity, translate";
2325
+ requestAnimationFrame(() => {
2326
+ pill.style.transitionProperty = "";
2327
+ });
2328
+ },
2329
+ [beginPillTracking]
2330
+ );
2331
+ const trackPillPosition = React.useCallback(
2332
+ (point) => {
2333
+ updatePillTracking(point);
2334
+ },
2335
+ [updatePillTracking]
2336
+ );
2337
+ React.useEffect(() => {
2338
+ if (!collapsed) return;
2339
+ const panelElement = elementRef.current;
2340
+ const separator = direction === "left" ? panelElement?.nextElementSibling : panelElement?.previousElementSibling;
2341
+ if (!(separator instanceof HTMLElement) || !separator.hasAttribute("data-separator")) return;
2342
+ const show = (event) => {
2343
+ setEdgeHovered(true);
2344
+ spawnPill(event);
2345
+ };
2346
+ const hide = () => {
2347
+ setEdgeHovered(false);
2348
+ endPillTracking();
2349
+ };
2350
+ const follow = (event) => trackPillPosition(event);
2351
+ separator.addEventListener("pointerenter", show);
2352
+ separator.addEventListener("pointerleave", hide);
2353
+ separator.addEventListener("pointermove", follow);
2354
+ return () => {
2355
+ separator.removeEventListener("pointerenter", show);
2356
+ separator.removeEventListener("pointerleave", hide);
2357
+ separator.removeEventListener("pointermove", follow);
2358
+ setEdgeHovered(false);
2359
+ endPillTracking();
2360
+ };
2361
+ }, [collapsed, direction, elementRef, endPillTracking, setEdgeHovered, spawnPill, trackPillPosition]);
2362
+ return { endPillTracking, expandButtonRef, stripRef, pillRef, spawnPill, trackPillPosition };
2363
+ };
2364
+ const CollapsiblePanel = ({
2365
+ collapsedSize,
2366
+ children,
2367
+ direction,
2368
+ className,
2369
+ onResize,
2370
+ style,
2371
+ minSize,
2372
+ ...props
2373
+ }) => {
2164
2374
  const [collapsed, setCollapsed] = React.useState(false);
2165
2375
  const panelRef = reactResizablePanels.usePanelRef();
2166
- const expand = () => {
2376
+ const elementRef = React.useRef(null);
2377
+ const { booted, boot, enableSizeTransitions } = usePanelSizeTransitions(elementRef);
2378
+ const { endPillTracking, expandButtonRef, stripRef, pillRef, spawnPill, trackPillPosition } = useCollapsedEdgePill({
2379
+ collapsed,
2380
+ direction,
2381
+ elementRef
2382
+ });
2383
+ const expand = React.useCallback(() => {
2384
+ enableSizeTransitions();
2167
2385
  if (!panelRef.current) return;
2168
2386
  panelRef.current.expand();
2169
- };
2170
- return /* @__PURE__ */ jsxRuntime.jsx(
2387
+ }, [enableSizeTransitions, panelRef]);
2388
+ const numericMinSize = typeof minSize === "number" ? minSize : null;
2389
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2171
2390
  reactResizablePanels.Panel,
2172
2391
  {
2173
2392
  panelRef,
2393
+ elementRef,
2174
2394
  collapsedSize,
2395
+ minSize,
2396
+ className: utils.cn("relative", className),
2397
+ style: {
2398
+ overflow: collapsed ? "visible" : "hidden",
2399
+ "--panel-min-w": numericMinSize ? `${numericMinSize}px` : void 0,
2400
+ ...style
2401
+ },
2175
2402
  ...props,
2176
- onResize: (size, id, prevSize) => {
2177
- if (typeof collapsedSize === "number") {
2178
- if (size.inPixels <= collapsedSize) {
2179
- setCollapsed(true);
2180
- } else if (collapsed) {
2181
- setCollapsed(false);
2182
- }
2183
- }
2184
- onResize?.(size, id, prevSize);
2403
+ onResize: (size, previousSize, panel) => {
2404
+ onResize?.(size, previousSize, panel);
2405
+ if (typeof collapsedSize !== "number") return;
2406
+ setCollapsed(size.inPixels <= collapsedSize);
2407
+ boot();
2185
2408
  },
2186
- children: collapsed ? /* @__PURE__ */ jsxRuntime.jsxs(tooltip.Tooltip, { children: [
2187
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(Button.Button, { onClick: expand, className: "h-48! border-none", children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { children: direction === "left" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRight, {}) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowLeft, {}) }) }) }) }),
2188
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipContent, { children: "Expand" })
2189
- ] }) : children
2409
+ children: [
2410
+ /* @__PURE__ */ jsxRuntime.jsx(
2411
+ "div",
2412
+ {
2413
+ inert: collapsed,
2414
+ "data-state": collapsed ? "collapsed" : "open",
2415
+ "data-direction": direction,
2416
+ style: {
2417
+ minWidth: "var(--panel-min-w)",
2418
+ opacity: collapsed ? 0 : void 0,
2419
+ translate: collapsed ? direction === "left" ? "-100% 0" : "100% 0" : void 0
2420
+ },
2421
+ className: utils.cn(
2422
+ "absolute inset-y-0 w-full overflow-hidden",
2423
+ "transition-[opacity,translate] duration-300 ease-out-custom motion-reduce:transition-none",
2424
+ "data-[direction=left]:left-0 data-[direction=right]:right-0",
2425
+ "data-[state=collapsed]:z-10",
2426
+ !booted && "transition-none"
2427
+ ),
2428
+ children
2429
+ }
2430
+ ),
2431
+ collapsed && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2432
+ /* @__PURE__ */ jsxRuntime.jsx(
2433
+ "button",
2434
+ {
2435
+ ref: expandButtonRef,
2436
+ type: "button",
2437
+ "aria-label": "Expand panel",
2438
+ onClick: expand,
2439
+ className: utils.cn(
2440
+ panelIconButtonClass,
2441
+ "absolute top-2 z-10",
2442
+ "transition-[color,background-color,opacity] duration-300 starting:opacity-0",
2443
+ direction === "left" ? "left-2" : "right-2",
2444
+ "data-[edge-hovered=true]:text-neutral6"
2445
+ ),
2446
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { children: /* @__PURE__ */ jsxRuntime.jsx(PanelEdgeIcon, { side: direction }) })
2447
+ }
2448
+ ),
2449
+ /* @__PURE__ */ jsxRuntime.jsx(
2450
+ "button",
2451
+ {
2452
+ ref: stripRef,
2453
+ type: "button",
2454
+ tabIndex: -1,
2455
+ "aria-hidden": "true",
2456
+ onClick: expand,
2457
+ onPointerEnter: (event) => spawnPill(event),
2458
+ onPointerLeave: endPillTracking,
2459
+ onPointerMove: (event) => trackPillPosition(event),
2460
+ style: { "--pill-y": "50%" },
2461
+ className: utils.cn(
2462
+ "group/expand absolute inset-y-0 z-10 w-4 cursor-pointer focus-visible:outline-hidden",
2463
+ direction === "left" ? "left-1" : "right-1"
2464
+ ),
2465
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2466
+ "span",
2467
+ {
2468
+ ref: pillRef,
2469
+ style: { top: "var(--pill-y)" },
2470
+ className: utils.cn(
2471
+ "absolute flex size-7 -translate-y-1/2 items-center justify-center rounded-full bg-neutral6 text-surface1 shadow-dialog",
2472
+ "pointer-events-none opacity-0 transition-[opacity,translate,top] duration-150 ease-out-custom motion-reduce:transition-none",
2473
+ direction === "left" ? "left-0.5 -translate-x-1" : "right-0.5 translate-x-1",
2474
+ "group-hover/expand:pointer-events-auto group-hover/expand:translate-x-0 group-hover/expand:opacity-100",
2475
+ "group-active/expand:bg-neutral6/80",
2476
+ "data-[edge-hovered=true]:pointer-events-auto data-[edge-hovered=true]:translate-x-0 data-[edge-hovered=true]:opacity-100"
2477
+ ),
2478
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { children: direction === "left" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, {}) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, {}) })
2479
+ }
2480
+ )
2481
+ }
2482
+ )
2483
+ ] })
2484
+ ]
2190
2485
  }
2191
2486
  );
2192
2487
  };
@@ -2225,6 +2520,27 @@ const PanelSeparator = ({ variant = "line" }) => {
2225
2520
  );
2226
2521
  };
2227
2522
 
2523
+ const PanelDrawer = ({ direction, label, children }) => {
2524
+ return /* @__PURE__ */ jsxRuntime.jsxs(drawer.Drawer, { side: direction, children: [
2525
+ /* @__PURE__ */ jsxRuntime.jsx(drawer.DrawerTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
2526
+ "button",
2527
+ {
2528
+ type: "button",
2529
+ "aria-label": label,
2530
+ className: utils.cn(panelIconButtonClass, "absolute top-2 z-10", direction === "left" ? "left-2" : "right-2"),
2531
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { children: /* @__PURE__ */ jsxRuntime.jsx(PanelEdgeIcon, { side: direction }) })
2532
+ }
2533
+ ) }),
2534
+ /* @__PURE__ */ jsxRuntime.jsxs(drawer.DrawerPortal, { keepMounted: true, children: [
2535
+ /* @__PURE__ */ jsxRuntime.jsx(drawer.DrawerBackdrop, {}),
2536
+ /* @__PURE__ */ jsxRuntime.jsx(drawer.DrawerViewport, { children: /* @__PURE__ */ jsxRuntime.jsxs(drawer.DrawerPopup, { className: "w-[calc(100vw-2.5rem)] max-w-[28rem]", children: [
2537
+ /* @__PURE__ */ jsxRuntime.jsx(drawer.DrawerTitle, { className: "sr-only", children: label }),
2538
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-0 flex-1 flex-col", children })
2539
+ ] }) })
2540
+ ] })
2541
+ ] });
2542
+ };
2543
+
2228
2544
  const EXTENSION_TO_MIME = {
2229
2545
  jpg: "image/jpg",
2230
2546
  jpeg: "image/jpeg",
@@ -8487,6 +8803,7 @@ exports.OpenAIIcon = OpenAIIcon;
8487
8803
  exports.OpenErrorsInLogsButton = OpenErrorsInLogsButton;
8488
8804
  exports.OpenInTracesButton = OpenInTracesButton;
8489
8805
  exports.OpenaiChatIcon = OpenaiChatIcon;
8806
+ exports.PanelDrawer = PanelDrawer;
8490
8807
  exports.PanelSeparator = PanelSeparator;
8491
8808
  exports.ProcessorIcon = ProcessorIcon;
8492
8809
  exports.PromptIcon = PromptIcon;
@@ -8625,6 +8942,7 @@ exports.useDrilldown = useDrilldown;
8625
8942
  exports.useEntityNames = useEntityNames;
8626
8943
  exports.useEnvironments = useEnvironments;
8627
8944
  exports.useInView = useInView;
8945
+ exports.useIsMobile = useIsMobile;
8628
8946
  exports.useLatencyMetrics = useLatencyMetrics;
8629
8947
  exports.useLogs = useLogs;
8630
8948
  exports.useLogsFilterPersistence = useLogsFilterPersistence;