@wheelhouse/ui 0.2.1 → 0.2.3

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 (199) hide show
  1. package/dist/blocks/columns/columns-types.d.ts +40 -0
  2. package/dist/blocks/columns/columns-types.d.ts.map +1 -0
  3. package/dist/blocks/columns/columns-types.js +10 -0
  4. package/dist/blocks/columns/columns-utils.d.ts +13 -0
  5. package/dist/blocks/columns/columns-utils.d.ts.map +1 -0
  6. package/dist/blocks/columns/columns-utils.js +85 -0
  7. package/dist/blocks/columns/columns.d.ts +3 -0
  8. package/dist/blocks/columns/columns.d.ts.map +1 -0
  9. package/dist/blocks/columns/columns.js +79 -0
  10. package/dist/blocks/columns/columns.stories.d.ts +12 -0
  11. package/dist/blocks/columns/columns.stories.d.ts.map +1 -0
  12. package/dist/blocks/columns/columns.stories.js +67 -0
  13. package/dist/blocks/columns/index.d.ts +6 -0
  14. package/dist/blocks/columns/index.d.ts.map +1 -0
  15. package/dist/blocks/columns/index.js +3 -0
  16. package/dist/blocks/date-selector/date-selector-context.d.ts.map +1 -0
  17. package/dist/blocks/date-selector/date-selector-default-i18n.d.ts +10 -0
  18. package/dist/blocks/date-selector/date-selector-default-i18n.d.ts.map +1 -0
  19. package/dist/blocks/date-selector/date-selector-default-i18n.js +29 -0
  20. package/dist/blocks/date-selector/date-selector-i18n-resources.d.ts +11 -0
  21. package/dist/blocks/date-selector/date-selector-i18n-resources.d.ts.map +1 -0
  22. package/dist/blocks/date-selector/date-selector-i18n-resources.js +248 -0
  23. package/dist/blocks/date-selector/date-selector-i18n.shared.d.ts +12 -0
  24. package/dist/blocks/date-selector/date-selector-i18n.shared.d.ts.map +1 -0
  25. package/dist/blocks/date-selector/date-selector-i18n.shared.js +84 -0
  26. package/dist/{components → blocks}/date-selector/date-selector-parts.d.ts +9 -0
  27. package/dist/blocks/date-selector/date-selector-parts.d.ts.map +1 -0
  28. package/dist/{components → blocks}/date-selector/date-selector-parts.js +21 -6
  29. package/dist/{components → blocks}/date-selector/date-selector-types.d.ts +70 -0
  30. package/dist/blocks/date-selector/date-selector-types.d.ts.map +1 -0
  31. package/dist/{components → blocks}/date-selector/date-selector-types.js +22 -0
  32. package/dist/blocks/date-selector/date-selector-value.d.ts +81 -0
  33. package/dist/blocks/date-selector/date-selector-value.d.ts.map +1 -0
  34. package/dist/blocks/date-selector/date-selector-value.js +423 -0
  35. package/dist/{components → blocks}/date-selector/date-selector.d.ts +1 -1
  36. package/dist/blocks/date-selector/date-selector.d.ts.map +1 -0
  37. package/dist/blocks/date-selector/date-selector.js +191 -0
  38. package/dist/{components → blocks}/date-selector/date-selector.stories.d.ts +14 -0
  39. package/dist/blocks/date-selector/date-selector.stories.d.ts.map +1 -0
  40. package/dist/blocks/date-selector/date-selector.stories.js +299 -0
  41. package/dist/blocks/date-selector/index.d.ts +11 -0
  42. package/dist/blocks/date-selector/index.d.ts.map +1 -0
  43. package/dist/blocks/date-selector/index.js +8 -0
  44. package/dist/{components → blocks}/date-selector/use-date-selector.d.ts +4 -3
  45. package/dist/blocks/date-selector/use-date-selector.d.ts.map +1 -0
  46. package/dist/{components → blocks}/date-selector/use-date-selector.js +14 -8
  47. package/dist/blocks/index.d.ts +2 -0
  48. package/dist/blocks/index.d.ts.map +1 -1
  49. package/dist/blocks/index.js +2 -0
  50. package/dist/blocks/navigation/index.d.ts +4 -1
  51. package/dist/blocks/navigation/index.d.ts.map +1 -1
  52. package/dist/blocks/navigation/index.js +2 -1
  53. package/dist/blocks/navigation/navigation-types.d.ts +60 -0
  54. package/dist/blocks/navigation/navigation-types.d.ts.map +1 -0
  55. package/dist/blocks/navigation/navigation-types.js +1 -0
  56. package/dist/blocks/navigation/navigation.d.ts +9 -0
  57. package/dist/blocks/navigation/navigation.d.ts.map +1 -0
  58. package/dist/blocks/navigation/navigation.demo.d.ts +4 -0
  59. package/dist/blocks/navigation/navigation.demo.d.ts.map +1 -0
  60. package/dist/blocks/navigation/navigation.demo.js +46 -0
  61. package/dist/blocks/navigation/navigation.js +98 -0
  62. package/dist/blocks/navigation/navigation.stories.d.ts +14 -0
  63. package/dist/blocks/navigation/navigation.stories.d.ts.map +1 -0
  64. package/dist/blocks/navigation/navigation.stories.js +16 -0
  65. package/dist/components/accordion/accordion.stories.js +1 -1
  66. package/dist/components/alert/alert.stories.js +1 -1
  67. package/dist/components/alert-dialog/alert-dialog.stories.js +1 -1
  68. package/dist/components/aspect-ratio/aspect-ratio.stories.js +1 -1
  69. package/dist/components/avatar/avatar.stories.js +1 -1
  70. package/dist/components/badge/badge.d.ts +1 -1
  71. package/dist/components/badge/badge.stories.js +1 -1
  72. package/dist/components/breadcrumb/breadcrumb.stories.js +1 -1
  73. package/dist/components/button/button.d.ts +2 -2
  74. package/dist/components/button/button.stories.js +1 -1
  75. package/dist/components/button-group/button-group.d.ts +10 -4
  76. package/dist/components/button-group/button-group.d.ts.map +1 -1
  77. package/dist/components/button-group/button-group.js +15 -3
  78. package/dist/components/button-group/button-group.stories.js +1 -1
  79. package/dist/components/button-group/index.d.ts +2 -2
  80. package/dist/components/button-group/index.d.ts.map +1 -1
  81. package/dist/components/button-group/index.js +1 -1
  82. package/dist/components/calendar/calendar.stories.js +1 -1
  83. package/dist/components/card/card.stories.js +1 -1
  84. package/dist/components/checkbox/checkbox.stories.js +1 -1
  85. package/dist/components/collapsible/collapsible.stories.js +1 -1
  86. package/dist/components/combobox/combobox.stories.js +1 -1
  87. package/dist/components/command/command.stories.js +1 -1
  88. package/dist/components/context-menu/context-menu.stories.js +1 -1
  89. package/dist/components/dialog/dialog.stories.js +1 -1
  90. package/dist/components/direction/direction.stories.js +1 -1
  91. package/dist/components/drawer/drawer.stories.js +1 -1
  92. package/dist/components/dropdown-menu/dropdown-menu.d.ts +9 -2
  93. package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
  94. package/dist/components/dropdown-menu/dropdown-menu.js +4 -1
  95. package/dist/components/dropdown-menu/dropdown-menu.stories.js +1 -1
  96. package/dist/components/dropdown-menu/index.d.ts +2 -2
  97. package/dist/components/dropdown-menu/index.d.ts.map +1 -1
  98. package/dist/components/dropdown-menu/index.js +1 -1
  99. package/dist/components/empty/empty.stories.js +1 -1
  100. package/dist/components/field/field.stories.js +1 -1
  101. package/dist/components/filters/filter-date-metric-value.d.ts +32 -0
  102. package/dist/components/filters/filter-date-metric-value.d.ts.map +1 -0
  103. package/dist/components/filters/filter-date-metric-value.js +331 -0
  104. package/dist/components/filters/filters-defaults.d.ts +4 -0
  105. package/dist/components/filters/filters-defaults.d.ts.map +1 -1
  106. package/dist/components/filters/filters-defaults.js +59 -1
  107. package/dist/components/filters/filters-i18n-resources.d.ts +277 -0
  108. package/dist/components/filters/filters-i18n-resources.d.ts.map +1 -0
  109. package/dist/components/filters/filters-i18n-resources.js +276 -0
  110. package/dist/components/filters/filters-i18n.shared.d.ts +16 -0
  111. package/dist/components/filters/filters-i18n.shared.d.ts.map +1 -0
  112. package/dist/components/filters/filters-i18n.shared.js +111 -0
  113. package/dist/components/filters/filters-types.d.ts +33 -1
  114. package/dist/components/filters/filters-types.d.ts.map +1 -1
  115. package/dist/components/filters/filters-utils.d.ts +28 -1
  116. package/dist/components/filters/filters-utils.d.ts.map +1 -1
  117. package/dist/components/filters/filters-utils.js +102 -0
  118. package/dist/components/filters/filters.d.ts +21 -3
  119. package/dist/components/filters/filters.d.ts.map +1 -1
  120. package/dist/components/filters/filters.js +493 -290
  121. package/dist/components/filters/filters.stories.d.ts +107 -2
  122. package/dist/components/filters/filters.stories.d.ts.map +1 -1
  123. package/dist/components/filters/filters.stories.js +364 -29
  124. package/dist/components/filters/index.d.ts +3 -1
  125. package/dist/components/filters/index.d.ts.map +1 -1
  126. package/dist/components/filters/index.js +3 -1
  127. package/dist/components/frame/frame.d.ts +1 -1
  128. package/dist/components/frame/frame.stories.js +1 -1
  129. package/dist/components/hover-card/hover-card.stories.js +1 -1
  130. package/dist/components/index.d.ts +0 -1
  131. package/dist/components/index.d.ts.map +1 -1
  132. package/dist/components/index.js +0 -1
  133. package/dist/components/input/input.stories.js +1 -1
  134. package/dist/components/input-group/input-group.d.ts +2 -2
  135. package/dist/components/input-group/input-group.stories.js +1 -1
  136. package/dist/components/item/item.d.ts +2 -2
  137. package/dist/components/item/item.stories.js +1 -1
  138. package/dist/components/kbd/kbd.stories.js +1 -1
  139. package/dist/components/label/label.stories.js +1 -1
  140. package/dist/components/menubar/menubar.stories.js +1 -1
  141. package/dist/components/native-select/native-select.stories.js +1 -1
  142. package/dist/components/navigation-menu/navigation-menu.stories.js +1 -1
  143. package/dist/components/pagination/pagination.stories.js +1 -1
  144. package/dist/components/popover/popover.stories.js +1 -1
  145. package/dist/components/progress/progress.stories.js +1 -1
  146. package/dist/components/radio-group/radio-group.stories.js +1 -1
  147. package/dist/components/resizable/resizable.stories.js +1 -1
  148. package/dist/components/scroll-area/scroll-area.stories.js +1 -1
  149. package/dist/components/select/select.stories.js +1 -1
  150. package/dist/components/separator/separator.stories.js +1 -1
  151. package/dist/components/sheet/sheet.stories.js +1 -1
  152. package/dist/components/slider/slider.stories.js +1 -1
  153. package/dist/components/sonner/sonner.stories.js +1 -1
  154. package/dist/components/sortable/sortable.stories.js +1 -1
  155. package/dist/components/spinner/spinner.stories.js +1 -1
  156. package/dist/components/status-indicator/status-indicator.stories.js +1 -1
  157. package/dist/components/switch/switch.stories.js +1 -1
  158. package/dist/components/tabs/tabs.d.ts +1 -1
  159. package/dist/components/tabs/tabs.stories.js +1 -1
  160. package/dist/components/text/text.d.ts +1 -1
  161. package/dist/components/text/text.stories.js +1 -1
  162. package/dist/components/textarea/textarea.stories.js +1 -1
  163. package/dist/components/toggle/toggle.stories.js +1 -1
  164. package/dist/components/toggle-group/toggle-group.stories.js +1 -1
  165. package/dist/components/tooltip/tooltip.stories.js +1 -1
  166. package/dist/index.d.ts +1 -1
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +1 -1
  169. package/dist/tsconfig.tsbuildinfo +1 -1
  170. package/llms.txt +8 -10
  171. package/package.json +6 -2
  172. package/dist/blocks/navigation/pattern-1/index.d.ts +0 -3
  173. package/dist/blocks/navigation/pattern-1/index.d.ts.map +0 -1
  174. package/dist/blocks/navigation/pattern-1/index.js +0 -1
  175. package/dist/blocks/navigation/pattern-1/pattern-1.config.d.ts +0 -47
  176. package/dist/blocks/navigation/pattern-1/pattern-1.config.d.ts.map +0 -1
  177. package/dist/blocks/navigation/pattern-1/pattern-1.config.js +0 -55
  178. package/dist/blocks/navigation/pattern-1/pattern-1.d.ts +0 -7
  179. package/dist/blocks/navigation/pattern-1/pattern-1.d.ts.map +0 -1
  180. package/dist/blocks/navigation/pattern-1/pattern-1.js +0 -50
  181. package/dist/blocks/navigation/pattern-1/pattern-1.stories.d.ts +0 -16
  182. package/dist/blocks/navigation/pattern-1/pattern-1.stories.d.ts.map +0 -1
  183. package/dist/blocks/navigation/pattern-1/pattern-1.stories.js +0 -20
  184. package/dist/components/date-selector/date-selector-context.d.ts.map +0 -1
  185. package/dist/components/date-selector/date-selector-parts.d.ts.map +0 -1
  186. package/dist/components/date-selector/date-selector-types.d.ts.map +0 -1
  187. package/dist/components/date-selector/date-selector-value.d.ts +0 -47
  188. package/dist/components/date-selector/date-selector-value.d.ts.map +0 -1
  189. package/dist/components/date-selector/date-selector-value.js +0 -183
  190. package/dist/components/date-selector/date-selector.d.ts.map +0 -1
  191. package/dist/components/date-selector/date-selector.js +0 -144
  192. package/dist/components/date-selector/date-selector.stories.d.ts.map +0 -1
  193. package/dist/components/date-selector/date-selector.stories.js +0 -144
  194. package/dist/components/date-selector/index.d.ts +0 -7
  195. package/dist/components/date-selector/index.d.ts.map +0 -1
  196. package/dist/components/date-selector/index.js +0 -5
  197. package/dist/components/date-selector/use-date-selector.d.ts.map +0 -1
  198. /package/dist/{components → blocks}/date-selector/date-selector-context.d.ts +0 -0
  199. /package/dist/{components → blocks}/date-selector/date-selector-context.js +0 -0
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '.';
3
3
  import { Button } from '../button';
4
4
  const meta = {
5
- title: 'UI/Card',
5
+ title: 'Components/Card',
6
6
  component: Card,
7
7
  tags: ['autodocs'],
8
8
  parameters: {
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Checkbox } from '.';
3
3
  import { Label } from '../label/index';
4
4
  const meta = {
5
- title: 'UI/Checkbox',
5
+ title: 'Components/Checkbox',
6
6
  component: Checkbox,
7
7
  tags: ['autodocs'],
8
8
  parameters: {
@@ -4,7 +4,7 @@ import { Button } from '../button';
4
4
  import { Text } from '../text';
5
5
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '.';
6
6
  const meta = {
7
- title: 'UI/Collapsible',
7
+ title: 'Components/Collapsible',
8
8
  component: Collapsible,
9
9
  tags: ['autodocs'],
10
10
  parameters: {
@@ -16,7 +16,7 @@ const programmingLanguages = [
16
16
  { id: 'swift', value: 'Swift' },
17
17
  ];
18
18
  const meta = {
19
- title: 'UI/Combobox',
19
+ title: 'Components/Combobox',
20
20
  component: Combobox,
21
21
  tags: ['autodocs'],
22
22
  parameters: {
@@ -3,7 +3,7 @@ import { useState } from 'react';
3
3
  import { Button } from '../button';
4
4
  import { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut } from '.';
5
5
  const meta = {
6
- title: 'UI/Command',
6
+ title: 'Components/Command',
7
7
  component: Command,
8
8
  tags: ['autodocs'],
9
9
  parameters: {
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Text } from '../text';
3
3
  import { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, } from '.';
4
4
  const meta = {
5
- title: 'UI/ContextMenu',
5
+ title: 'Components/ContextMenu',
6
6
  component: ContextMenu,
7
7
  tags: ['autodocs'],
8
8
  parameters: {
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Button } from '../button';
3
3
  import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from './dialog';
4
4
  const meta = {
5
- title: 'UI/Dialog',
5
+ title: 'Components/Dialog',
6
6
  component: Dialog,
7
7
  tags: ['autodocs'],
8
8
  parameters: {
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { DirectionProvider } from './direction';
3
3
  const meta = {
4
- title: 'UI/Direction',
4
+ title: 'Components/Direction',
5
5
  component: DirectionProvider,
6
6
  tags: ['autodocs'],
7
7
  parameters: {
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Button } from '../button';
3
3
  import { Drawer, DrawerContent, DrawerDescription, DrawerHeader, DrawerTitle, DrawerTrigger } from './drawer';
4
4
  const meta = {
5
- title: 'UI/Drawer',
5
+ title: 'Components/Drawer',
6
6
  tags: ['autodocs'],
7
7
  parameters: {
8
8
  layout: 'centered',
@@ -25,6 +25,12 @@ type DropdownMenuItemProps = MenuPrimitive.Item.Props & {
25
25
  inset?: boolean;
26
26
  variant?: 'default' | 'destructive';
27
27
  };
28
+ /** Anchor row for `DropdownMenu` — real `<a href>` for navigation, open-in-new-tab, and middle-click. */
29
+ type DropdownMenuLinkItemProps = Omit<React.ComponentPropsWithRef<'a'>, 'className'> & {
30
+ inset?: boolean;
31
+ variant?: 'default' | 'destructive';
32
+ className?: string;
33
+ };
28
34
  /** Props for `DropdownMenuSub`. */
29
35
  type DropdownMenuSubProps = MenuPrimitive.SubmenuRoot.Props;
30
36
  /** Props for `DropdownMenuSubTrigger`. */
@@ -52,6 +58,7 @@ declare function DropdownMenuContent({ align, alignOffset, side, sideOffset, cla
52
58
  declare function DropdownMenuGroup({ ...props }: DropdownMenuGroupProps): import("react/jsx-runtime").JSX.Element;
53
59
  declare function DropdownMenuLabel({ className, inset, ...props }: DropdownMenuLabelProps): import("react/jsx-runtime").JSX.Element;
54
60
  declare function DropdownMenuItem({ className, inset, variant, ...props }: DropdownMenuItemProps): import("react/jsx-runtime").JSX.Element;
61
+ declare function DropdownMenuLinkItem({ className, inset, variant, children, ...anchorProps }: DropdownMenuLinkItemProps): import("react/jsx-runtime").JSX.Element;
55
62
  declare function DropdownMenuSub({ ...props }: DropdownMenuSubProps): import("react/jsx-runtime").JSX.Element;
56
63
  declare function DropdownMenuSubTrigger({ className, inset, children, ...props }: DropdownMenuSubTriggerProps): import("react/jsx-runtime").JSX.Element;
57
64
  declare function DropdownMenuSubContent({ align, alignOffset, side, sideOffset, className, ...props }: DropdownMenuSubContentProps): import("react/jsx-runtime").JSX.Element;
@@ -60,6 +67,6 @@ declare function DropdownMenuRadioGroup({ ...props }: DropdownMenuRadioGroupProp
60
67
  declare function DropdownMenuRadioItem({ className, children, inset, ...props }: DropdownMenuRadioItemProps): import("react/jsx-runtime").JSX.Element;
61
68
  declare function DropdownMenuSeparator({ className, ...props }: DropdownMenuSeparatorProps): import("react/jsx-runtime").JSX.Element;
62
69
  declare function DropdownMenuShortcut({ className, ...props }: DropdownMenuShortcutProps): import("react/jsx-runtime").JSX.Element;
63
- export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, };
64
- export type { DropdownMenuProps, DropdownMenuPortalProps, DropdownMenuTriggerProps, DropdownMenuContentProps, DropdownMenuSubContentProps, DropdownMenuGroupProps, DropdownMenuLabelProps, DropdownMenuItemProps, DropdownMenuSubProps, DropdownMenuSubTriggerProps, DropdownMenuCheckboxItemProps, DropdownMenuRadioGroupProps, DropdownMenuRadioItemProps, DropdownMenuSeparatorProps, DropdownMenuShortcutProps, };
70
+ export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuLinkItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, };
71
+ export type { DropdownMenuProps, DropdownMenuPortalProps, DropdownMenuTriggerProps, DropdownMenuContentProps, DropdownMenuSubContentProps, DropdownMenuGroupProps, DropdownMenuLabelProps, DropdownMenuItemProps, DropdownMenuLinkItemProps, DropdownMenuSubProps, DropdownMenuSubTriggerProps, DropdownMenuCheckboxItemProps, DropdownMenuRadioGroupProps, DropdownMenuRadioItemProps, DropdownMenuSeparatorProps, DropdownMenuShortcutProps, };
65
72
  //# sourceMappingURL=dropdown-menu.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/dropdown-menu.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/dropdown-menu.tsx"],"names":[],"mappings":"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"}
@@ -25,6 +25,9 @@ function DropdownMenuLabel({ className, inset, ...props }) {
25
25
  function DropdownMenuItem({ className, inset, variant = 'default', ...props }) {
26
26
  return (_jsx(MenuPrimitive.Item, { "data-slot": "dropdown-menu-item", "data-inset": inset, "data-variant": variant, className: cn("group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive-foreground/10 data-[variant=destructive]:focus:text-destructive-foreground dark:data-[variant=destructive]:focus:bg-destructive-foreground/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive-foreground", className), ...props }));
27
27
  }
28
+ function DropdownMenuLinkItem({ className, inset, variant = 'default', children, ...anchorProps }) {
29
+ return (_jsx(MenuPrimitive.Item, { render: _jsx("a", { "data-slot": "dropdown-menu-link-item", "data-inset": inset, "data-variant": variant, className: cn("group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive-foreground/10 data-[variant=destructive]:focus:text-destructive-foreground dark:data-[variant=destructive]:focus:bg-destructive-foreground/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive-foreground", className), ...anchorProps, children: children }) }));
30
+ }
28
31
  function DropdownMenuSub({ ...props }) {
29
32
  return _jsx(MenuPrimitive.SubmenuRoot, { "data-slot": "dropdown-menu-sub", ...props });
30
33
  }
@@ -49,4 +52,4 @@ function DropdownMenuSeparator({ className, ...props }) {
49
52
  function DropdownMenuShortcut({ className, ...props }) {
50
53
  return (_jsx("span", { "data-slot": "dropdown-menu-shortcut", className: cn('ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground', className), ...props }));
51
54
  }
52
- export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, };
55
+ export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuLinkItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, };
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Button } from '../button';
3
3
  import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from '.';
4
4
  const meta = {
5
- title: 'UI/DropdownMenu',
5
+ title: 'Components/DropdownMenu',
6
6
  component: DropdownMenu,
7
7
  tags: ['autodocs'],
8
8
  parameters: {
@@ -1,3 +1,3 @@
1
- export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, } from './dropdown-menu';
2
- export type { DropdownMenuProps, DropdownMenuPortalProps, DropdownMenuTriggerProps, DropdownMenuContentProps, DropdownMenuSubContentProps, DropdownMenuGroupProps, DropdownMenuLabelProps, DropdownMenuItemProps, DropdownMenuSubProps, DropdownMenuSubTriggerProps, DropdownMenuCheckboxItemProps, DropdownMenuRadioGroupProps, DropdownMenuRadioItemProps, DropdownMenuSeparatorProps, DropdownMenuShortcutProps, } from './dropdown-menu';
1
+ export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuLinkItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, } from './dropdown-menu';
2
+ export type { DropdownMenuProps, DropdownMenuPortalProps, DropdownMenuTriggerProps, DropdownMenuContentProps, DropdownMenuSubContentProps, DropdownMenuGroupProps, DropdownMenuLabelProps, DropdownMenuItemProps, DropdownMenuLinkItemProps, DropdownMenuSubProps, DropdownMenuSubTriggerProps, DropdownMenuCheckboxItemProps, DropdownMenuRadioGroupProps, DropdownMenuRadioItemProps, DropdownMenuSeparatorProps, DropdownMenuShortcutProps, } from './dropdown-menu';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,GACzB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACR,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,2BAA2B,EAC3B,6BAA6B,EAC7B,2BAA2B,EAC3B,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,GAC5B,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,GACzB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACR,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,2BAA2B,EAC3B,6BAA6B,EAC7B,2BAA2B,EAC3B,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,GAC5B,MAAM,iBAAiB,CAAC"}
@@ -1 +1 @@
1
- export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, } from './dropdown-menu';
1
+ export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuLinkItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, } from './dropdown-menu';
@@ -3,7 +3,7 @@ import { FolderOpen } from 'lucide-react';
3
3
  import { Button } from '../button';
4
4
  import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from './empty';
5
5
  const meta = {
6
- title: 'UI/Empty',
6
+ title: 'Components/Empty',
7
7
  component: Empty,
8
8
  tags: ['autodocs'],
9
9
  parameters: {
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Input } from '../input';
3
3
  import { Field } from './field';
4
4
  const meta = {
5
- title: 'UI/Field',
5
+ title: 'Components/Field',
6
6
  component: Field.Root,
7
7
  tags: ['autodocs'],
8
8
  parameters: {
@@ -0,0 +1,32 @@
1
+ import { type DateSelectorI18nConfig, type DateSelectorValue, type FormatDateValueOptions } from '../../blocks/date-selector/date-selector-types';
2
+ import type { FilterFieldConfig, FilterI18nConfig } from './filters-types';
3
+ /**
4
+ * Compact date summary for the bar (e.g. "Last 60 days"); uses rolling templates when applicable.
5
+ * Day pickers use {@link DATE_SELECTOR_COMPACT_DAY_FORMAT} here so the bar stays short; the dialog still uses `dateMetricProps.dayDateFormat` for parsing.
6
+ * Pass {@link FormatDateValueOptions} to match {@link DateSelectorProps.rollingRangeDisplay} on the filter field.
7
+ */
8
+ export declare function dateSegmentLabelForBar(date: DateSelectorValue, dateI18n: DateSelectorI18nConfig, dayDateFormat: string, options?: FormatDateValueOptions): string;
9
+ export interface FilterDateMetricBarPeriodSegmentsProps<T = unknown> {
10
+ field: FilterFieldConfig<T>;
11
+ values: T[];
12
+ onChange: (values: T[]) => void;
13
+ i18n: FilterI18nConfig;
14
+ size: 'sm' | 'default' | 'lg';
15
+ /** When set (e.g. newly added filter row), opens the date range menu once. */
16
+ autoFocus?: boolean;
17
+ }
18
+ /** Static "in" connector + rolling Next/Last presets (submenus) + full {@link DateSelector} in a dialog for Custom. */
19
+ export declare function FilterDateMetricBarPeriodSegments<T = unknown>({ field, values, onChange, i18n, size, autoFocus }: FilterDateMetricBarPeriodSegmentsProps<T>): import("react/jsx-runtime").JSX.Element;
20
+ export interface FilterDateMetricBarValueSegmentProps<T = unknown> {
21
+ field: FilterFieldConfig<T>;
22
+ values: T[];
23
+ onChange: (values: T[]) => void;
24
+ operator: string;
25
+ i18n: FilterI18nConfig;
26
+ size: 'sm' | 'default' | 'lg';
27
+ /** Lets the value segment change operator (e.g. "Any value" → threshold so the number field appears). */
28
+ onOperatorChange?: (operator: string) => void;
29
+ }
30
+ /** Value inputs / “any value” control for a date metric filter bar (after field, “in”, range, and operator). */
31
+ export declare function FilterDateMetricBarValueSegment<T = unknown>({ field, values, onChange, operator, i18n, size, onOperatorChange, }: FilterDateMetricBarValueSegmentProps<T>): import("react/jsx-runtime").JSX.Element | null;
32
+ //# sourceMappingURL=filter-date-metric-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-date-metric-value.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filter-date-metric-value.tsx"],"names":[],"mappings":"AAeA,OAAO,EAKH,KAAK,sBAAsB,EAG3B,KAAK,iBAAiB,EAEtB,KAAK,sBAAsB,EAC9B,MAAM,gDAAgD,CAAC;AAyBxD,OAAO,KAAK,EAA2B,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAyIpG;;;;GAIG;AACH,wBAAgB,sBAAsB,CAClC,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,sBAAsB,EAChC,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,sBAAsB,GACjC,MAAM,CAER;AAED,MAAM,WAAW,sCAAsC,CAAC,CAAC,GAAG,OAAO;IAC/D,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,uHAAuH;AACvH,wBAAgB,iCAAiC,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,sCAAsC,CAAC,CAAC,CAAC,2CAqP3J;AAED,MAAM,WAAW,oCAAoC,CAAC,CAAC,GAAG,OAAO;IAC7D,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9B,yGAAyG;IACzG,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AA+ED,gHAAgH;AAChH,wBAAgB,+BAA+B,CAAC,CAAC,GAAG,OAAO,EAAE,EACzD,KAAK,EACL,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,gBAAgB,GACnB,EAAE,oCAAoC,CAAC,CAAC,CAAC,kDAyNzC"}
@@ -0,0 +1,331 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
+ import { computeRollingPresetRange, DATE_SELECTOR_COMPACT_DAY_FORMAT, DateSelector, formatDateValue, formatRollingRangeTooltipDetail, getRollingSummaryLabel, resolveRollingCount, resolveRollingUnit, } from '../../blocks/date-selector';
5
+ import { DATE_SELECTOR_ROLLING_DAY_OPTIONS, DATE_SELECTOR_ROLLING_MONTH_OPTIONS, DATE_SELECTOR_ROLLING_QUARTER_OPTIONS, DATE_SELECTOR_ROLLING_YEAR_OPTIONS, DEFAULT_DATE_SELECTOR_I18N, } from '../../blocks/date-selector/date-selector-types';
6
+ import { Button } from '../button';
7
+ import { ButtonGroupText } from '../button-group';
8
+ import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '../dialog';
9
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from '../dropdown-menu';
10
+ import { Input } from '../input';
11
+ import { Popover, PopoverContent, PopoverTrigger } from '../popover';
12
+ import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip';
13
+ import { Check } from 'lucide-react';
14
+ import { cn } from '../../lib/utils';
15
+ import { dateMetricValueForCustomEditor, getDateMetricPayloadFromValues, getOperatorsForField } from './filters-utils';
16
+ /** Matches `Button` `variant="outline"` surface: bordered tile in the preset grid. */
17
+ const ROLLING_PRESET_OUTLINE = 'rounded-md border border-input bg-popover shadow-xs/5 dark:bg-input/32';
18
+ const ROLLING_PRESET_CELL_BASE = cn(ROLLING_PRESET_OUTLINE, 'relative min-h-7 shrink-0 justify-center !px-1.5 !py-1 text-center text-[0.7rem] leading-tight [text-wrap:pretty] tabular-nums', '[&_[data-slot=dropdown-menu-radio-item-indicator]]:hidden');
19
+ /** Selected tile: filled “active” look instead of the menu radio checkmark. */
20
+ const rollingPresetCellSelected = 'border-primary bg-accent font-medium text-foreground shadow-xs/10 dark:bg-accent/90';
21
+ function RollingWindowPresetGrid({ mode, i18n, idPrefix, rollingDayOpts, rollingMonthOpts, rollingQuarterOpts, rollingYearOpts, radioValue, rollingRadioKey, labelForRolling, onApply, }) {
22
+ const rollingPrefix = mode === 'rolling-next' ? i18n.rollingWindowTabs.next : i18n.rollingWindowTabs.last;
23
+ const sectionLabel = (unitTab) => `${rollingPrefix} ${unitTab}`;
24
+ return (_jsx(DropdownMenuRadioGroup, { value: radioValue ?? '', onValueChange: (v) => {
25
+ if (!v)
26
+ return;
27
+ const [u, c] = v.split(':');
28
+ const count = Number(c);
29
+ if (!u || !Number.isFinite(count))
30
+ return;
31
+ onApply(u, count);
32
+ }, children: _jsx("div", { className: "flex flex-col", children: _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(DropdownMenuLabel, { className: "px-0 pt-0 pb-0", children: sectionLabel(i18n.rollingUnitTabs.days) }), _jsx("div", { className: "grid grid-cols-4 gap-1.5", children: rollingDayOpts.map((days) => {
33
+ const value = rollingRadioKey('day', days);
34
+ const selected = radioValue === value;
35
+ return (_jsx(DropdownMenuRadioItem, { className: cn(ROLLING_PRESET_CELL_BASE, selected && rollingPresetCellSelected), value: value, "aria-label": labelForRolling(mode, 'day', days), children: days }, `${idPrefix}-day-${days}`));
36
+ }) })] }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(DropdownMenuLabel, { className: "px-0 pt-0 pb-0", children: sectionLabel(i18n.rollingUnitTabs.months) }), _jsx("div", { className: "grid grid-cols-5 gap-1.5", children: rollingMonthOpts.map((m) => {
37
+ const value = rollingRadioKey('month', m);
38
+ const selected = radioValue === value;
39
+ return (_jsx(DropdownMenuRadioItem, { className: cn(ROLLING_PRESET_CELL_BASE, selected && rollingPresetCellSelected), value: value, "aria-label": labelForRolling(mode, 'month', m), children: m }, `${idPrefix}-month-${m}`));
40
+ }) })] }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(DropdownMenuLabel, { className: "px-0 pt-0 pb-0", children: sectionLabel(i18n.rollingUnitTabs.quarters) }), _jsx("div", { className: "grid grid-cols-4 gap-1.5", children: rollingQuarterOpts.map((q) => {
41
+ const value = rollingRadioKey('quarter', q);
42
+ const selected = radioValue === value;
43
+ return (_jsx(DropdownMenuRadioItem, { className: cn(ROLLING_PRESET_CELL_BASE, selected && rollingPresetCellSelected), value: value, "aria-label": labelForRolling(mode, 'quarter', q), children: q }, `${idPrefix}-quarter-${q}`));
44
+ }) })] }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(DropdownMenuLabel, { className: "px-0 pt-0 pb-0", children: sectionLabel(i18n.rollingUnitTabs.years) }), _jsx("div", { className: "grid grid-cols-4 gap-1.5", children: rollingYearOpts.map((y) => {
45
+ const value = rollingRadioKey('year', y);
46
+ const selected = radioValue === value;
47
+ return (_jsx(DropdownMenuRadioItem, { className: cn(ROLLING_PRESET_CELL_BASE, selected && rollingPresetCellSelected), value: value, "aria-label": labelForRolling(mode, 'year', y), children: y }, `${idPrefix}-year-${y}`));
48
+ }) })] })] }) }) }));
49
+ }
50
+ /**
51
+ * Compact date summary for the bar (e.g. "Last 60 days"); uses rolling templates when applicable.
52
+ * Day pickers use {@link DATE_SELECTOR_COMPACT_DAY_FORMAT} here so the bar stays short; the dialog still uses `dateMetricProps.dayDateFormat` for parsing.
53
+ * Pass {@link FormatDateValueOptions} to match {@link DateSelectorProps.rollingRangeDisplay} on the filter field.
54
+ */
55
+ export function dateSegmentLabelForBar(date, dateI18n, dayDateFormat, options) {
56
+ return formatDateValue(date, dateI18n, dayDateFormat, options);
57
+ }
58
+ /** Static "in" connector + rolling Next/Last presets (submenus) + full {@link DateSelector} in a dialog for Custom. */
59
+ export function FilterDateMetricBarPeriodSegments({ field, values, onChange, i18n, size, autoFocus }) {
60
+ const [menuOpen, setMenuOpen] = useState(false);
61
+ const [customOpen, setCustomOpen] = useState(false);
62
+ /** Draft while Custom dialog is open; committed on Done, discarded on dismiss. */
63
+ const [customDraft, setCustomDraft] = useState(null);
64
+ const menuAutoOpenedRef = useRef(false);
65
+ const payload = useMemo(() => getDateMetricPayloadFromValues(values), [values]);
66
+ const setPayload = (next) => {
67
+ onChange([next]);
68
+ };
69
+ const dayFormat = field.dateMetricProps?.dayDateFormat ?? 'MM/dd/yyyy';
70
+ const mergedDateI18n = { ...DEFAULT_DATE_SELECTOR_I18N, ...field.dateMetricProps?.i18n };
71
+ const rollingDayOpts = (field.dateMetricProps?.rollingDayOptions ?? DATE_SELECTOR_ROLLING_DAY_OPTIONS);
72
+ const rollingMonthOpts = field.dateMetricProps?.rollingMonthOptions ?? DATE_SELECTOR_ROLLING_MONTH_OPTIONS;
73
+ const rollingQuarterOpts = field.dateMetricProps?.rollingQuarterOptions ?? DATE_SELECTOR_ROLLING_QUARTER_OPTIONS;
74
+ const rollingYearOpts = field.dateMetricProps?.rollingYearOptions ?? DATE_SELECTOR_ROLLING_YEAR_OPTIONS;
75
+ const rollingRangeDisplay = field.dateMetricProps?.rollingRangeDisplay ?? 'inline';
76
+ const barFormatOptions = rollingRangeDisplay === 'tooltip' ? { includeRollingRangeDetailInLabel: false } : undefined;
77
+ const dateSummary = dateSegmentLabelForBar(payload.date, mergedDateI18n, DATE_SELECTOR_COMPACT_DAY_FORMAT, barFormatOptions);
78
+ const rollingRangeTooltip = rollingRangeDisplay === 'tooltip' ? formatRollingRangeTooltipDetail(payload.date, mergedDateI18n, dayFormat) : null;
79
+ const buttonSize = size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'default';
80
+ const dateRangeTriggerButtonClassName = 'max-w-[min(100%,18rem)] justify-start text-start [text-wrap:pretty] whitespace-normal';
81
+ const dateRangeTriggerButton = _jsx(Button, { variant: "outline", size: buttonSize, className: dateRangeTriggerButtonClassName });
82
+ const applyRolling = useCallback((mode, unit, count) => {
83
+ const base = getDateMetricPayloadFromValues(values);
84
+ const { startDate, endDate } = computeRollingPresetRange(mode, unit, count);
85
+ const nextDate = {
86
+ period: 'day',
87
+ operator: 'between',
88
+ selectionMode: mode,
89
+ rollingUnit: unit,
90
+ rollingCount: count,
91
+ startDate,
92
+ endDate,
93
+ };
94
+ if (unit === 'day' && DATE_SELECTOR_ROLLING_DAY_OPTIONS.includes(count)) {
95
+ nextDate.rollingDays = count;
96
+ }
97
+ onChange([
98
+ {
99
+ ...base,
100
+ date: nextDate,
101
+ },
102
+ ]);
103
+ setMenuOpen(false);
104
+ }, [values, onChange]);
105
+ useEffect(() => {
106
+ if (!autoFocus)
107
+ return;
108
+ if (menuAutoOpenedRef.current)
109
+ return;
110
+ let cancelled = false;
111
+ const timer = window.setTimeout(() => {
112
+ if (cancelled)
113
+ return;
114
+ menuAutoOpenedRef.current = true;
115
+ setMenuOpen(true);
116
+ }, 100);
117
+ return () => {
118
+ cancelled = true;
119
+ window.clearTimeout(timer);
120
+ };
121
+ }, [autoFocus]);
122
+ const labelForRolling = (mode, unit, count) => {
123
+ if (unit === 'year' && count === 1) {
124
+ return mode === 'rolling-next' ? mergedDateI18n.rollingSummaryNextYear : mergedDateI18n.rollingSummaryLastYear;
125
+ }
126
+ if (unit === 'month' && count === 1) {
127
+ return mode === 'rolling-next' ? mergedDateI18n.rollingSummaryNextSingleMonth : mergedDateI18n.rollingSummaryLastSingleMonth;
128
+ }
129
+ if (unit === 'month' && count > 1) {
130
+ return mode === 'rolling-next'
131
+ ? mergedDateI18n.rollingSummaryNextMonths.replace('{{count}}', String(count))
132
+ : mergedDateI18n.rollingSummaryLastMonths.replace('{{count}}', String(count));
133
+ }
134
+ if (unit === 'quarter' && count === 1) {
135
+ return mode === 'rolling-next' ? mergedDateI18n.rollingSummaryNextQuarter : mergedDateI18n.rollingSummaryLastQuarter;
136
+ }
137
+ if (unit === 'quarter' && count > 1) {
138
+ return mode === 'rolling-next'
139
+ ? mergedDateI18n.rollingSummaryNextQuarters.replace('{{count}}', String(count))
140
+ : mergedDateI18n.rollingSummaryLastQuarters.replace('{{count}}', String(count));
141
+ }
142
+ return (getRollingSummaryLabel({ period: 'day', operator: 'between', selectionMode: mode, rollingUnit: unit, rollingCount: count }, mergedDateI18n) ?? '');
143
+ };
144
+ const rollingRadioKey = (unit, count) => `${unit}:${count}`;
145
+ const { selectionMode } = payload.date;
146
+ const selectedCount = resolveRollingCount(payload.date);
147
+ const selectedUnit = resolveRollingUnit(payload.date);
148
+ const isAllowedRolling = (unit, count) => {
149
+ const list = unit === 'day' ? rollingDayOpts : unit === 'month' ? rollingMonthOpts : unit === 'quarter' ? rollingQuarterOpts : rollingYearOpts;
150
+ return list.includes(count);
151
+ };
152
+ const nextRadioValue = selectionMode === 'rolling-next' && selectedCount != null && isAllowedRolling(selectedUnit, selectedCount)
153
+ ? rollingRadioKey(selectedUnit, selectedCount)
154
+ : undefined;
155
+ const lastRadioValue = selectionMode === 'rolling-last' && selectedCount != null && isAllowedRolling(selectedUnit, selectedCount)
156
+ ? rollingRadioKey(selectedUnit, selectedCount)
157
+ : undefined;
158
+ const isNextBranchActive = selectionMode === 'rolling-next';
159
+ const isLastBranchActive = selectionMode === 'rolling-last';
160
+ const isCustomRangeActive = selectionMode === 'custom';
161
+ const mainMenuActiveIcon = (show) => (show ? _jsx(Check, { className: "ml-auto size-4 shrink-0 text-foreground", "aria-hidden": true }) : null);
162
+ const openCustomDialog = () => {
163
+ setMenuOpen(false);
164
+ setCustomDraft(dateMetricValueForCustomEditor(payload.date));
165
+ setCustomOpen(true);
166
+ };
167
+ const commitCustomDialog = () => {
168
+ if (customDraft != null) {
169
+ setPayload({ ...payload, date: customDraft });
170
+ }
171
+ setCustomDraft(null);
172
+ setCustomOpen(false);
173
+ };
174
+ return (_jsxs(_Fragment, { children: [_jsx(ButtonGroupText, { size: size, className: "bg-background font-normal text-muted-foreground dark:bg-input/30", children: i18n.helpers.dateMetricDateConnector(payload.date, mergedDateI18n) }), _jsxs(DropdownMenu, { open: menuOpen, onOpenChange: setMenuOpen, children: [rollingRangeTooltip ? (_jsxs(Tooltip, { children: [_jsx(DropdownMenuTrigger, { render: _jsx(TooltipTrigger, { render: dateRangeTriggerButton }), children: _jsx("span", { children: dateSummary || i18n.select }) }), _jsx(TooltipContent, { side: "top", sideOffset: 6, className: "max-w-xs [text-wrap:pretty] tabular-nums", children: rollingRangeTooltip })] })) : (_jsx(DropdownMenuTrigger, { render: dateRangeTriggerButton, children: _jsx("span", { children: dateSummary || i18n.select }) })), _jsxs(DropdownMenuContent, { align: "center", className: "min-w-48", side: "bottom", children: [_jsxs(DropdownMenuSub, { children: [_jsx(DropdownMenuSubTrigger, { children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "min-w-0 shrink", children: mergedDateI18n.rollingWindowTabs.next }), mainMenuActiveIcon(isNextBranchActive)] }) }), _jsx(DropdownMenuSubContent, { align: "start", className: "max-h-none min-w-[13rem] overflow-visible p-2", children: _jsx(RollingWindowPresetGrid, { mode: "rolling-next", idPrefix: "next", i18n: mergedDateI18n, rollingDayOpts: rollingDayOpts, rollingMonthOpts: rollingMonthOpts, rollingQuarterOpts: rollingQuarterOpts, rollingYearOpts: rollingYearOpts, radioValue: nextRadioValue, rollingRadioKey: rollingRadioKey, labelForRolling: labelForRolling, onApply: (unit, count) => applyRolling('rolling-next', unit, count) }) })] }), _jsxs(DropdownMenuSub, { children: [_jsx(DropdownMenuSubTrigger, { children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "min-w-0 shrink", children: mergedDateI18n.rollingWindowTabs.last }), mainMenuActiveIcon(isLastBranchActive)] }) }), _jsx(DropdownMenuSubContent, { align: "start", className: "max-h-none min-w-[13rem] overflow-visible p-2", children: _jsx(RollingWindowPresetGrid, { mode: "rolling-last", idPrefix: "last", i18n: mergedDateI18n, rollingDayOpts: rollingDayOpts, rollingMonthOpts: rollingMonthOpts, rollingQuarterOpts: rollingQuarterOpts, rollingYearOpts: rollingYearOpts, radioValue: lastRadioValue, rollingRadioKey: rollingRadioKey, labelForRolling: labelForRolling, onApply: (unit, count) => applyRolling('rolling-last', unit, count) }) })] }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { className: "gap-2", onClick: openCustomDialog, children: [_jsx("span", { className: "min-w-0 shrink", children: mergedDateI18n.rollingWindowTabs.custom }), mainMenuActiveIcon(isCustomRangeActive)] })] })] }), _jsx(Dialog, { open: customOpen, onOpenChange: (open) => {
175
+ setCustomOpen(open);
176
+ if (!open) {
177
+ setCustomDraft(null);
178
+ }
179
+ }, children: _jsxs(DialogContent, { className: "max-h-[min(90vh,32rem)] w-[min(calc(100vw-2rem),28rem)] gap-0 overflow-y-auto p-4 sm:max-w-none", children: [_jsx(DialogHeader, { className: "pb-2", children: _jsx(DialogTitle, { children: mergedDateI18n.selectDate }) }), _jsx("div", { className: "flex flex-col gap-6 py-2", children: _jsx("section", { className: "flex flex-col gap-2", children: _jsx(DateSelector, { ...field.dateMetricProps, className: cn('max-w-none space-y-3', field.dateMetricProps?.className), value: customDraft ?? dateMetricValueForCustomEditor(payload.date), onChange: setCustomDraft, showOperators: field.dateMetricProps?.showOperators !== false, showInput: field.dateMetricProps?.showInput ?? false, dayDateFormat: dayFormat, showRollingPresets: false }) }) }), _jsx(DialogFooter, { className: "mt-2 border-t pt-4 sm:justify-end", children: _jsx(Button, { type: "button", size: "sm", variant: "default", onClick: commitCustomDialog, children: i18n.dateMetricDialogDone }) })] }) })] }));
180
+ }
181
+ /** Typographic en dash (–) for “no amount” on the bar trigger. */
182
+ const METRIC_EMPTY_AMOUNT = '\u2013';
183
+ /** Spaces around the en dash so empty segments don’t feel cramped (e.g. `$ – `). */
184
+ const METRIC_EMPTY_DISPLAY = ` ${METRIC_EMPTY_AMOUNT} `;
185
+ const metricAmountFormatters = new Map();
186
+ function formatMetricAmountDigits(value, locale) {
187
+ let nf = metricAmountFormatters.get(locale);
188
+ if (!nf) {
189
+ try {
190
+ nf = new Intl.NumberFormat(locale, {
191
+ minimumFractionDigits: 0,
192
+ maximumFractionDigits: 20,
193
+ useGrouping: true,
194
+ });
195
+ }
196
+ catch {
197
+ nf = new Intl.NumberFormat('en-US', {
198
+ minimumFractionDigits: 0,
199
+ maximumFractionDigits: 20,
200
+ useGrouping: true,
201
+ });
202
+ }
203
+ metricAmountFormatters.set(locale, nf);
204
+ }
205
+ return nf.format(value);
206
+ }
207
+ /** Bar label: `sym` + grouped amount, or `sym` + spaced en dash when empty. */
208
+ function formatMetricMoney(sym, value, locale) {
209
+ if (value == null || Number.isNaN(value))
210
+ return `${sym}${METRIC_EMPTY_DISPLAY}`;
211
+ return `${sym}${formatMetricAmountDigits(value, locale)}`;
212
+ }
213
+ function parseDraftNumber(raw, previous) {
214
+ if (raw.trim() === '')
215
+ return null;
216
+ const n = Number(raw);
217
+ if (!Number.isFinite(n))
218
+ return previous ?? null;
219
+ return n;
220
+ }
221
+ const METRIC_POPOVER_TRIGGER_NARROW = 'max-w-[min(100%,14rem)] shrink-0 justify-start font-medium tabular-nums';
222
+ const METRIC_POPOVER_TRIGGER_WIDE = 'max-w-[min(100%,18rem)] shrink-0 justify-start text-start font-medium [text-wrap:pretty] whitespace-normal tabular-nums';
223
+ function MetricValueThresholdPopoverShell({ open, onOpenChange, buttonSize, triggerLabel, summary, triggerClassName, children, }) {
224
+ return (_jsxs(Popover, { open: open, onOpenChange: onOpenChange, children: [_jsx(PopoverTrigger, { render: _jsx(Button, { type: "button", variant: "outline", size: buttonSize, className: triggerClassName, "aria-label": triggerLabel, "aria-expanded": open }), children: summary }), _jsx(PopoverContent, { align: "start", side: "bottom", className: "w-(--anchor-width) max-w-none min-w-[8rem] gap-0 p-1.5", children: children })] }));
225
+ }
226
+ /** Value inputs / “any value” control for a date metric filter bar (after field, “in”, range, and operator). */
227
+ export function FilterDateMetricBarValueSegment({ field, values, onChange, operator, i18n, size, onOperatorChange, }) {
228
+ const [metricPopoverOpen, setMetricPopoverOpen] = useState(false);
229
+ const [draftMin, setDraftMin] = useState('');
230
+ const [draftMax, setDraftMax] = useState('');
231
+ const draftMinRef = useRef('');
232
+ const draftMaxRef = useRef('');
233
+ const payload = useMemo(() => getDateMetricPayloadFromValues(values), [values]);
234
+ const commitMetricFromDraft = useCallback(() => {
235
+ const base = getDateMetricPayloadFromValues(values);
236
+ const min = parseDraftNumber(draftMinRef.current, base.min ?? null);
237
+ const max = parseDraftNumber(draftMaxRef.current, base.max ?? null);
238
+ if (operator === 'value_greater_than') {
239
+ onChange([{ ...base, min }]);
240
+ return;
241
+ }
242
+ if (operator === 'value_less_than') {
243
+ onChange([{ ...base, max }]);
244
+ return;
245
+ }
246
+ if (operator === 'value_between') {
247
+ onChange([{ ...base, min, max }]);
248
+ }
249
+ }, [operator, values, onChange]);
250
+ const handleMetricPopoverOpenChange = useCallback((open) => {
251
+ if (open) {
252
+ const base = getDateMetricPayloadFromValues(values);
253
+ const dm = base.min != null ? String(base.min) : '';
254
+ const dx = base.max != null ? String(base.max) : '';
255
+ draftMinRef.current = dm;
256
+ draftMaxRef.current = dx;
257
+ setDraftMin(dm);
258
+ setDraftMax(dx);
259
+ setMetricPopoverOpen(true);
260
+ }
261
+ else {
262
+ setMetricPopoverOpen((wasOpen) => {
263
+ if (wasOpen) {
264
+ commitMetricFromDraft();
265
+ }
266
+ return false;
267
+ });
268
+ }
269
+ }, [values, commitMetricFromDraft]);
270
+ const handleMetricValueInputKeyDown = useCallback((e) => {
271
+ if (e.key !== 'Enter')
272
+ return;
273
+ e.preventDefault();
274
+ handleMetricPopoverOpenChange(false);
275
+ }, [handleMetricPopoverOpenChange]);
276
+ const operators = useMemo(() => getOperatorsForField(field, values, i18n), [field, values, i18n]);
277
+ const valueAnyOperator = operators.find((o) => o.value === 'value_any');
278
+ const sym = i18n.defaultCurrency;
279
+ const numberLocale = i18n.numberFormatLocale;
280
+ const inputSizeProp = size === 'lg' ? 'default' : 'sm';
281
+ const buttonSize = size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'default';
282
+ const valueSegment = (() => {
283
+ if (operator === 'value_any') {
284
+ const anyLabel = i18n.operators.valueAny;
285
+ const anyIcon = valueAnyOperator?.icon;
286
+ if (anyIcon) {
287
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { render: _jsx(Button, { type: "button", variant: "outline", size: buttonSize, className: "min-w-8 shrink-0 px-2 font-normal text-muted-foreground hover:text-foreground [&_svg]:size-3.5", "aria-label": anyLabel, onClick: () => onOperatorChange?.('value_greater_than') }), children: anyIcon }), _jsx(TooltipContent, { side: "top", sideOffset: 6, children: anyLabel })] }));
288
+ }
289
+ return (_jsx(Button, { type: "button", variant: "outline", size: buttonSize, className: "max-w-[min(100%,14rem)] justify-start font-normal text-muted-foreground hover:text-foreground", "aria-label": anyLabel, onClick: () => onOperatorChange?.('value_greater_than'), children: anyLabel }));
290
+ }
291
+ if (operator === 'value_greater_than') {
292
+ const hasMinValue = payload.min != null && !Number.isNaN(payload.min);
293
+ const summary = formatMetricMoney(sym, payload.min ?? undefined, numberLocale);
294
+ const triggerLabel = `${i18n.operators.greaterThan}: ${summary}`;
295
+ return (_jsx(MetricValueThresholdPopoverShell, { open: metricPopoverOpen, onOpenChange: handleMetricPopoverOpenChange, buttonSize: buttonSize, triggerLabel: triggerLabel, summary: summary, triggerClassName: cn(METRIC_POPOVER_TRIGGER_NARROW, !hasMinValue ? 'text-muted-foreground' : 'text-foreground'), children: _jsx(Input, { type: "number", size: inputSizeProp, className: "w-full min-w-0 tabular-nums", value: draftMin, onChange: (e) => {
296
+ const v = e.target.value;
297
+ draftMinRef.current = v;
298
+ setDraftMin(v);
299
+ }, onKeyDown: handleMetricValueInputKeyDown }) }));
300
+ }
301
+ if (operator === 'value_less_than') {
302
+ const hasMaxValue = payload.max != null && !Number.isNaN(payload.max);
303
+ const summary = formatMetricMoney(sym, payload.max ?? undefined, numberLocale);
304
+ const triggerLabel = `${i18n.operators.lessThan}: ${summary}`;
305
+ return (_jsx(MetricValueThresholdPopoverShell, { open: metricPopoverOpen, onOpenChange: handleMetricPopoverOpenChange, buttonSize: buttonSize, triggerLabel: triggerLabel, summary: summary, triggerClassName: cn(METRIC_POPOVER_TRIGGER_NARROW, !hasMaxValue ? 'text-muted-foreground' : 'text-foreground'), children: _jsx(Input, { type: "number", size: inputSizeProp, className: "w-full min-w-0 tabular-nums", value: draftMax, onChange: (e) => {
306
+ const v = e.target.value;
307
+ draftMaxRef.current = v;
308
+ setDraftMax(v);
309
+ }, onKeyDown: handleMetricValueInputKeyDown }) }));
310
+ }
311
+ if (operator === 'value_between') {
312
+ const hasMinValue = payload.min != null && !Number.isNaN(payload.min);
313
+ const hasMaxValue = payload.max != null && !Number.isNaN(payload.max);
314
+ const minPart = formatMetricMoney(sym, payload.min ?? undefined, numberLocale);
315
+ const maxPart = formatMetricMoney(sym, payload.max ?? undefined, numberLocale);
316
+ const summary = `${minPart} - ${maxPart}`;
317
+ const triggerLabel = `${i18n.operators.between}: ${summary}`;
318
+ return (_jsx(MetricValueThresholdPopoverShell, { open: metricPopoverOpen, onOpenChange: handleMetricPopoverOpenChange, buttonSize: buttonSize, triggerLabel: triggerLabel, summary: summary, triggerClassName: cn(METRIC_POPOVER_TRIGGER_WIDE, !hasMinValue && !hasMaxValue ? 'text-muted-foreground' : 'text-foreground'), children: _jsxs("div", { className: "flex w-full flex-col gap-1.5", children: [_jsx(Input, { type: "number", size: inputSizeProp, className: "w-full min-w-0 tabular-nums", value: draftMin, onChange: (e) => {
319
+ const v = e.target.value;
320
+ draftMinRef.current = v;
321
+ setDraftMin(v);
322
+ }, onKeyDown: handleMetricValueInputKeyDown }), _jsx("div", { className: "pointer-events-none text-center text-xs text-muted-foreground select-none", "aria-hidden": true, children: "-" }), _jsx(Input, { type: "number", size: inputSizeProp, className: "w-full min-w-0 tabular-nums", value: draftMax, onChange: (e) => {
323
+ const v = e.target.value;
324
+ draftMaxRef.current = v;
325
+ setDraftMax(v);
326
+ }, onKeyDown: handleMetricValueInputKeyDown })] }) }));
327
+ }
328
+ return null;
329
+ })();
330
+ return valueSegment;
331
+ }
@@ -1,4 +1,8 @@
1
+ import type { DateSelectorI18nConfig, DateSelectorValue } from '../../blocks/date-selector/date-selector-types';
1
2
  import type { FilterI18nConfig, FilterOperator } from './filters-types';
3
+ export type DateMetricDateConnectorPhrases = Pick<FilterI18nConfig, 'dateMetricDateOn' | 'dateMetricDateIn'>;
4
+ /** Default bar connector between amount and date for `date_metric` filters. */
5
+ export declare function defaultDateMetricDateConnector(date: DateSelectorValue, dateI18n: DateSelectorI18nConfig, phrases?: DateMetricDateConnectorPhrases): string;
2
6
  export declare const DEFAULT_I18N: FilterI18nConfig;
3
7
  export declare const createOperatorsFromI18n: (i18n: FilterI18nConfig) => Record<string, FilterOperator[]>;
4
8
  export declare const DEFAULT_OPERATORS: Record<string, FilterOperator[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"filters-defaults.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filters-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAExE,eAAO,MAAM,YAAY,EAAE,gBAkE1B,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,MAAM,gBAAgB,KAAG,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAgC9F,CAAC;AAEH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAyC,CAAC"}
1
+ {"version":3,"file":"filters-defaults.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filters-defaults.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAEhH,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAExE,MAAM,MAAM,8BAA8B,GAAG,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,GAAG,kBAAkB,CAAC,CAAC;AAe7G,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAC1C,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,sBAAsB,EAChC,OAAO,GAAE,8BAAsE,GAChF,MAAM,CA2BR;AAED,eAAO,MAAM,YAAY,EAAE,gBA0E1B,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,MAAM,gBAAgB,KAAG,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAqC9F,CAAC;AAEH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAyC,CAAC"}