@frontify/fondue-components 22.0.0 → 22.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/fondue-components11.js +75 -60
  2. package/dist/fondue-components11.js.map +1 -1
  3. package/dist/fondue-components13.js +71 -69
  4. package/dist/fondue-components13.js.map +1 -1
  5. package/dist/fondue-components19.js +66 -61
  6. package/dist/fondue-components19.js.map +1 -1
  7. package/dist/fondue-components25.js +111 -97
  8. package/dist/fondue-components25.js.map +1 -1
  9. package/dist/fondue-components27.js +20 -18
  10. package/dist/fondue-components27.js.map +1 -1
  11. package/dist/fondue-components29.js +56 -51
  12. package/dist/fondue-components29.js.map +1 -1
  13. package/dist/fondue-components31.js +12 -12
  14. package/dist/fondue-components31.js.map +1 -1
  15. package/dist/fondue-components32.js +37 -37
  16. package/dist/fondue-components32.js.map +1 -1
  17. package/dist/fondue-components33.js +1 -1
  18. package/dist/fondue-components34.js +2 -2
  19. package/dist/fondue-components35.js +1 -1
  20. package/dist/fondue-components37.js +1 -1
  21. package/dist/fondue-components4.js +1 -1
  22. package/dist/fondue-components4.js.map +1 -1
  23. package/dist/fondue-components50.js +4 -4
  24. package/dist/fondue-components52.js +1 -1
  25. package/dist/fondue-components52.js.map +1 -1
  26. package/dist/fondue-components54.js +14 -14
  27. package/dist/fondue-components55.js +1 -1
  28. package/dist/fondue-components56.js +12 -12
  29. package/dist/fondue-components57.js +1 -1
  30. package/dist/fondue-components59.js +5 -5
  31. package/dist/fondue-components62.js +4 -4
  32. package/dist/fondue-components63.js +1 -1
  33. package/dist/fondue-components65.js +14 -14
  34. package/dist/fondue-components68.js +42 -42
  35. package/dist/fondue-components68.js.map +1 -1
  36. package/dist/fondue-components70.js +34 -34
  37. package/dist/fondue-components71.js +2 -2
  38. package/dist/fondue-components73.js +8 -8
  39. package/dist/fondue-components75.js +18 -16
  40. package/dist/fondue-components75.js.map +1 -1
  41. package/dist/fondue-components77.js +8 -8
  42. package/dist/fondue-components78.js +47 -35
  43. package/dist/fondue-components78.js.map +1 -1
  44. package/dist/fondue-components79.js +10 -10
  45. package/dist/fondue-components81.js +16 -12
  46. package/dist/fondue-components81.js.map +1 -1
  47. package/dist/fondue-components84.js +1 -1
  48. package/dist/fondue-components86.js +4 -39
  49. package/dist/fondue-components86.js.map +1 -1
  50. package/dist/fondue-components87.js +5 -6
  51. package/dist/fondue-components87.js.map +1 -1
  52. package/dist/fondue-components88.js +39 -4
  53. package/dist/fondue-components88.js.map +1 -1
  54. package/dist/fondue-components89.js +6 -5
  55. package/dist/fondue-components89.js.map +1 -1
  56. package/dist/fondue-components9.js +71 -70
  57. package/dist/fondue-components9.js.map +1 -1
  58. package/dist/fondue-components90.js +10 -10
  59. package/dist/index.d.ts +30 -4
  60. package/dist/style.css +1 -1
  61. package/package.json +3 -3
@@ -1,30 +1,30 @@
1
1
  import { jsx as n, jsxs as g } from "react/jsx-runtime";
2
2
  import { IconCaretRight as M } from "@frontify/fondue-icons";
3
- import * as d from "@radix-ui/react-dropdown-menu";
4
- import { forwardRef as i, useMemo as G, Children as A, useRef as v } from "react";
3
+ import * as a from "@radix-ui/react-dropdown-menu";
4
+ import { forwardRef as p, useMemo as A, Children as G, useRef as O } from "react";
5
5
  import { useFondueTheme as D, ThemeProvider as b } from "./fondue-components31.js";
6
6
  import { useProcessedChildren as h } from "./fondue-components53.js";
7
- import s from "./fondue-components54.js";
7
+ import i from "./fondue-components54.js";
8
8
  const N = ({
9
9
  children: o,
10
10
  open: t,
11
11
  modal: e = !1,
12
12
  onOpenChange: r,
13
- "data-test-id": a = "fondue-dropdown"
14
- }) => /* @__PURE__ */ n(d.Root, { open: t, modal: e, onOpenChange: r, "data-test-id": a, children: o });
13
+ "data-test-id": d = "fondue-dropdown"
14
+ }) => /* @__PURE__ */ n(a.Root, { open: t, modal: e, onOpenChange: r, "data-test-id": d, children: o });
15
15
  N.displayName = "Dropdown.Root";
16
16
  const S = ({
17
17
  asChild: o = !0,
18
18
  children: t,
19
19
  "data-test-id": e = "fondue-dropdown-trigger",
20
20
  ...r
21
- }, a) => /* @__PURE__ */ n(d.Trigger, { asChild: o, "data-test-id": e, ref: a, ...r, children: t });
21
+ }, d) => /* @__PURE__ */ n(a.Trigger, { asChild: o, "data-test-id": e, ref: d, ...r, children: t });
22
22
  S.displayName = "Dropdown.Trigger";
23
- const x = {
23
+ const v = {
24
24
  compact: 8,
25
25
  comfortable: 12,
26
26
  spacious: 16
27
- }, O = {
27
+ }, x = {
28
28
  compact: 8,
29
29
  spacious: 24
30
30
  }, C = ({
@@ -32,53 +32,68 @@ const x = {
32
32
  align: t = "start",
33
33
  triggerOffset: e = "compact",
34
34
  children: r,
35
- preventTriggerFocusOnClose: a,
36
- viewportCollisionPadding: u = "compact",
37
- "data-test-id": p = "fondue-dropdown-content"
38
- }, l) => {
39
- const m = D();
40
- return /* @__PURE__ */ n(d.Portal, { children: /* @__PURE__ */ n(b, { theme: m, children: /* @__PURE__ */ n(
41
- d.Content,
35
+ preventTriggerFocusOnClose: d,
36
+ viewportCollisionPadding: c = "compact",
37
+ forceMount: l = !1,
38
+ "data-test-id": m = "fondue-dropdown-content"
39
+ }, w) => {
40
+ const { theme: f, dir: u } = D();
41
+ return /* @__PURE__ */ n(a.Portal, { forceMount: l || void 0, children: /* @__PURE__ */ n(b, { theme: f, dir: u, children: /* @__PURE__ */ n(
42
+ a.Content,
42
43
  {
44
+ dir: u,
43
45
  align: t,
44
- collisionPadding: O[u],
45
- sideOffset: x[e],
46
+ collisionPadding: x[c],
47
+ sideOffset: v[e],
46
48
  side: o,
47
- className: s.content,
48
- "data-test-id": p,
49
- ref: l,
50
- onCloseAutoFocus: (w) => {
51
- a && w.preventDefault();
49
+ className: i.content,
50
+ "data-test-id": m,
51
+ ref: w,
52
+ onPointerDownOutside: (s) => {
53
+ l && s.currentTarget instanceof HTMLElement && s.currentTarget.getAttribute("data-state") === "open" && s.preventDefault();
52
54
  },
55
+ onCloseAutoFocus: (s) => {
56
+ d && s.preventDefault();
57
+ },
58
+ forceMount: l || void 0,
53
59
  children: r
54
60
  }
55
61
  ) }) });
56
62
  };
57
63
  C.displayName = "Dropdown.Content";
58
- const R = ({ children: o, heading: t, "data-test-id": e = "fondue-dropdown-group" }, r) => G(
59
- () => A.toArray(o).filter((u) => u !== null).length > 0,
64
+ const R = ({ children: o, heading: t, "data-test-id": e = "fondue-dropdown-group" }, r) => A(
65
+ () => G.toArray(o).filter((c) => c !== null).length > 0,
60
66
  [o]
61
- ) ? /* @__PURE__ */ g(d.Group, { className: s.group, "data-test-id": e, ref: r, children: [
62
- t ? /* @__PURE__ */ n("div", { className: s.groupHeading, children: /* @__PURE__ */ n("span", { "aria-label": t, children: t }) }) : null,
67
+ ) ? /* @__PURE__ */ g(a.Group, { className: i.group, "data-test-id": e, ref: r, children: [
68
+ t ? /* @__PURE__ */ n("div", { className: i.groupHeading, children: /* @__PURE__ */ n("span", { "aria-label": t, children: t }) }) : null,
63
69
  o
64
70
  ] }) : null;
65
71
  R.displayName = "Dropdown.Group";
66
72
  const T = ({
67
73
  children: o,
68
74
  "data-test-id": t = "fondue-dropdown-submenu"
69
- }) => /* @__PURE__ */ n(d.Sub, { "data-test-id": t, children: o });
75
+ }) => /* @__PURE__ */ n(a.Sub, { "data-test-id": t, children: o });
70
76
  T.displayName = "Dropdown.SubMenu";
71
77
  const I = ({ children: o, "data-test-id": t = "fondue-dropdown-subtrigger" }, e) => {
72
78
  const { content: r } = h(o);
73
- return /* @__PURE__ */ g(d.SubTrigger, { className: s.subTrigger, "data-test-id": t, ref: e, children: [
79
+ return /* @__PURE__ */ g(a.SubTrigger, { className: i.subTrigger, "data-test-id": t, ref: e, children: [
74
80
  r,
75
- /* @__PURE__ */ n(M, { className: s.subMenuIndicator, size: 16 })
81
+ /* @__PURE__ */ n(M, { className: i.subMenuIndicator, size: 16 })
76
82
  ] });
77
83
  };
78
84
  I.displayName = "Dropdown.SubTrigger";
79
85
  const F = ({ children: o, "data-test-id": t = "fondue-dropdown-subcontent" }, e) => {
80
- const r = D();
81
- return /* @__PURE__ */ n(d.Portal, { children: /* @__PURE__ */ n(b, { theme: r, children: /* @__PURE__ */ n(d.SubContent, { className: s.subContent, "data-test-id": t, ref: e, children: o }) }) });
86
+ const { theme: r, dir: d } = D();
87
+ return /* @__PURE__ */ n(a.Portal, { children: /* @__PURE__ */ n(b, { theme: r, dir: d, children: /* @__PURE__ */ n(
88
+ a.SubContent,
89
+ {
90
+ dir: d,
91
+ className: i.subContent,
92
+ "data-test-id": t,
93
+ ref: e,
94
+ children: o
95
+ }
96
+ ) }) });
82
97
  };
83
98
  F.displayName = "Dropdown.SubContent";
84
99
  const y = ({
@@ -86,54 +101,54 @@ const y = ({
86
101
  disabled: t,
87
102
  textValue: e,
88
103
  onSelect: r,
89
- emphasis: a = "default",
90
- asChild: u = !1,
91
- "data-test-id": p = "fondue-dropdown-subtrigger",
92
- ...l
93
- }, m) => {
94
- const { content: w } = h(o), c = v(!1);
104
+ emphasis: d = "default",
105
+ asChild: c = !1,
106
+ "data-test-id": l = "fondue-dropdown-subtrigger",
107
+ ...m
108
+ }, w) => {
109
+ const { content: f } = h(o), u = O(!1);
95
110
  return /* @__PURE__ */ n(
96
- d.Item,
111
+ a.Item,
97
112
  {
98
113
  onSelect: r,
99
- className: s.item,
114
+ className: i.item,
100
115
  textValue: e,
101
- "data-test-id": p,
102
- "data-emphasis": a,
103
- ref: m,
116
+ "data-test-id": l,
117
+ "data-emphasis": d,
118
+ ref: w,
104
119
  disabled: t,
105
- asChild: u,
106
- "data-show-focus-ring": c.current,
120
+ asChild: c,
121
+ "data-show-focus-ring": u.current,
107
122
  onMouseEnter: () => {
108
- c.current = !0;
123
+ u.current = !0;
109
124
  },
110
- onFocus: (f) => {
111
- c.current || (f.target.dataset.showFocusRing = "true");
125
+ onFocus: (s) => {
126
+ u.current || (s.target.dataset.showFocusRing = "true");
112
127
  },
113
- onBlur: (f) => {
114
- f.target.dataset.showFocusRing = "false", c.current = !1;
128
+ onBlur: (s) => {
129
+ s.target.dataset.showFocusRing = "false", u.current = !1;
115
130
  },
116
- ...l,
117
- children: w
131
+ ...m,
132
+ children: f
118
133
  }
119
134
  );
120
135
  };
121
136
  y.displayName = "Dropdown.Item";
122
- const P = ({ children: o, name: t, "data-test-id": e = "fondue-dropdown-slot" }, r) => /* @__PURE__ */ n("div", { "data-name": t, className: s.slot, "data-test-id": e, ref: r, children: o });
137
+ const P = ({ children: o, name: t, "data-test-id": e = "fondue-dropdown-slot" }, r) => /* @__PURE__ */ n("div", { "data-name": t, className: i.slot, "data-test-id": e, ref: r, children: o });
123
138
  P.displayName = "Dropdown.Slot";
124
- const _ = i(S), j = i(C), E = i(R), L = i(I), z = i(F), B = i(y), H = i(P), Q = {
139
+ const _ = p(S), E = p(C), L = p(R), j = p(I), H = p(F), z = p(y), B = p(P), U = {
125
140
  Root: N,
126
141
  Trigger: _,
127
- Content: j,
128
- Group: E,
142
+ Content: E,
143
+ Group: L,
129
144
  SubMenu: T,
130
- SubTrigger: L,
131
- SubContent: z,
132
- Item: B,
133
- Slot: H
145
+ SubTrigger: j,
146
+ SubContent: H,
147
+ Item: z,
148
+ Slot: B
134
149
  };
135
150
  export {
136
- Q as Dropdown,
151
+ U as Dropdown,
137
152
  C as DropdownContent,
138
153
  R as DropdownGroup,
139
154
  y as DropdownItem,
@@ -1 +1 @@
1
- {"version":3,"file":"fondue-components11.js","sources":["../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { IconCaretRight } from '@frontify/fondue-icons';\nimport * as RadixDropdown from '@radix-ui/react-dropdown-menu';\nimport { Children, forwardRef, useMemo, useRef, type ForwardedRef, type ReactNode } from 'react';\n\nimport { ThemeProvider, useFondueTheme } from '../ThemeProvider/ThemeProvider';\n\nimport { useProcessedChildren } from './hooks/useProcessedChildren';\nimport styles from './styles/dropdown.module.scss';\n\nexport type DropdownRootProps = {\n children?: ReactNode;\n /**\n * When set to true, interaction with outside elements will be disabled and only menu content will be visible to screen readers.\n * @default false\n */\n modal?: boolean;\n /**\n * Controls the open state of the dropdown.\n */\n open?: boolean;\n /**\n * Callback that is called when the open state of the dropdown changes.\n */\n onOpenChange?: (open: boolean) => void;\n\n 'data-test-id'?: string;\n};\n\nexport const DropdownRoot = ({\n children,\n open,\n modal = false,\n onOpenChange,\n 'data-test-id': dataTestId = 'fondue-dropdown',\n}: DropdownRootProps) => {\n return (\n <RadixDropdown.Root open={open} modal={modal} onOpenChange={onOpenChange} data-test-id={dataTestId}>\n {children}\n </RadixDropdown.Root>\n );\n};\nDropdownRoot.displayName = 'Dropdown.Root';\n\nexport type DropdownTriggerProps = {\n /**\n * Change the default rendered element for the one passed as a child, merging their props and behavior.\n * @default true\n */\n asChild?: boolean;\n children?: ReactNode;\n 'data-test-id'?: string;\n};\n\nexport const DropdownTrigger = (\n {\n asChild = true,\n children,\n 'data-test-id': dataTestId = 'fondue-dropdown-trigger',\n ...props\n }: DropdownTriggerProps,\n ref: ForwardedRef<HTMLButtonElement>,\n) => {\n return (\n <RadixDropdown.Trigger asChild={asChild} data-test-id={dataTestId} ref={ref} {...props}>\n {children}\n </RadixDropdown.Trigger>\n );\n};\nDropdownTrigger.displayName = 'Dropdown.Trigger';\n\ntype DropdownSpacing = 'compact' | 'comfortable' | 'spacious';\ntype DropdownViewportCollisionPadding = 'compact' | 'spacious';\nexport type DropdownContentProps = {\n children?: ReactNode;\n 'data-test-id'?: string;\n /**\n * Defines the alignment of the dropdown.\n * @default \"start\"\n */\n align?: 'start' | 'center' | 'end';\n /**\n * Defines the preferred side of the dropdown. It will not be respected if there are collisions with the viewport.\n * @default \"bottom\"\n */\n side?: 'top' | 'right' | 'bottom' | 'left';\n /**\n * Defines the spacing between the dropdown and its trigger.\n * @default 'compact'\n */\n triggerOffset?: DropdownSpacing;\n /**\n * Prevents the focus from being set on the trigger when the dropdown is closed.\n */\n preventTriggerFocusOnClose?: boolean;\n /**\n * Define the minimum distance between the dropdown and the viewport edge\n * @default 'compact'\n */\n viewportCollisionPadding?: DropdownViewportCollisionPadding;\n};\n\nconst SPACING_MAP: Record<DropdownSpacing, number> = {\n compact: 8,\n comfortable: 12,\n spacious: 16,\n};\n\nconst VIEWPORT_COLLISION_PADDING_MAP: Record<DropdownViewportCollisionPadding, number> = {\n compact: 8,\n spacious: 24,\n};\n\nexport const DropdownContent = (\n {\n side = 'bottom',\n align = 'start',\n triggerOffset = 'compact',\n children,\n preventTriggerFocusOnClose,\n viewportCollisionPadding = 'compact',\n 'data-test-id': dataTestId = 'fondue-dropdown-content',\n }: DropdownContentProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n const theme = useFondueTheme();\n\n return (\n <RadixDropdown.Portal>\n <ThemeProvider theme={theme}>\n <RadixDropdown.Content\n align={align}\n collisionPadding={VIEWPORT_COLLISION_PADDING_MAP[viewportCollisionPadding]}\n sideOffset={SPACING_MAP[triggerOffset]}\n side={side}\n className={styles.content}\n data-test-id={dataTestId}\n ref={ref}\n onCloseAutoFocus={(event) => {\n if (preventTriggerFocusOnClose) {\n event.preventDefault();\n }\n }}\n >\n {children}\n </RadixDropdown.Content>\n </ThemeProvider>\n </RadixDropdown.Portal>\n );\n};\nDropdownContent.displayName = 'Dropdown.Content';\n\nexport type DropdownGroupProps = { children: ReactNode; heading?: string; 'data-test-id'?: string };\n\nexport const DropdownGroup = (\n { children, heading, 'data-test-id': dataTestId = 'fondue-dropdown-group' }: DropdownGroupProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n const hasChildren = useMemo(\n () => Children.toArray(children).filter((child) => child !== null).length > 0,\n [children],\n );\n\n if (!hasChildren) {\n return null;\n }\n\n return (\n <RadixDropdown.Group className={styles.group} data-test-id={dataTestId} ref={ref}>\n {heading ? (\n <div className={styles.groupHeading}>\n <span aria-label={heading}>{heading}</span>\n </div>\n ) : null}\n {children}\n </RadixDropdown.Group>\n );\n};\nDropdownGroup.displayName = 'Dropdown.Group';\n\nexport type DropdownSubMenuProps = { children: ReactNode; 'data-test-id'?: string };\n\nexport const DropdownSubMenu = ({\n children,\n 'data-test-id': dataTestId = 'fondue-dropdown-submenu',\n}: DropdownSubMenuProps) => {\n return <RadixDropdown.Sub data-test-id={dataTestId}>{children}</RadixDropdown.Sub>;\n};\nDropdownSubMenu.displayName = 'Dropdown.SubMenu';\n\nexport type DropdownSubTriggerProps = { children: ReactNode; 'data-test-id'?: string };\n\nexport const DropdownSubTrigger = (\n { children, 'data-test-id': dataTestId = 'fondue-dropdown-subtrigger' }: DropdownSubTriggerProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n const { content } = useProcessedChildren(children);\n return (\n <RadixDropdown.SubTrigger className={styles.subTrigger} data-test-id={dataTestId} ref={ref}>\n {content}\n <IconCaretRight className={styles.subMenuIndicator} size={16} />\n </RadixDropdown.SubTrigger>\n );\n};\nDropdownSubTrigger.displayName = 'Dropdown.SubTrigger';\n\nexport type DropdownSubContentProps = {\n children: ReactNode;\n 'data-test-id'?: string;\n};\n\nexport const DropdownSubContent = (\n { children, 'data-test-id': dataTestId = 'fondue-dropdown-subcontent' }: DropdownSubContentProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n const theme = useFondueTheme();\n return (\n <RadixDropdown.Portal>\n <ThemeProvider theme={theme}>\n <RadixDropdown.SubContent className={styles.subContent} data-test-id={dataTestId} ref={ref}>\n {children}\n </RadixDropdown.SubContent>\n </ThemeProvider>\n </RadixDropdown.Portal>\n );\n};\nDropdownSubContent.displayName = 'Dropdown.SubContent';\n\nexport type DropdownItemProps = {\n children: ReactNode;\n /**\n * Disables the item.\n */\n disabled?: boolean;\n /**\n * The text value of the item that is passed to the onSelect callback.\n */\n textValue?: string;\n /**\n * The style of the item.\n * @default \"default\"\n */\n emphasis?: 'default' | 'danger';\n /**\n * Callback that is called when the item is selected.\n */\n onSelect?: (event: Event) => void;\n /**\n * If true, the item props will be passed to the child element.\n * @default false\n */\n asChild?: boolean;\n 'data-test-id'?: string;\n};\n\nexport const DropdownItem = (\n {\n children,\n disabled,\n textValue,\n onSelect,\n emphasis = 'default',\n asChild = false,\n 'data-test-id': dataTestId = 'fondue-dropdown-subtrigger',\n ...props\n }: DropdownItemProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n const { content } = useProcessedChildren(children);\n const wasMouseInteracted = useRef(false);\n\n return (\n <RadixDropdown.Item\n onSelect={onSelect}\n className={styles.item}\n textValue={textValue}\n data-test-id={dataTestId}\n data-emphasis={emphasis}\n ref={ref}\n disabled={disabled}\n asChild={asChild}\n data-show-focus-ring={wasMouseInteracted.current}\n onMouseEnter={() => {\n wasMouseInteracted.current = true;\n }}\n onFocus={(focusEvent) => {\n if (!wasMouseInteracted.current) {\n focusEvent.target.dataset.showFocusRing = 'true';\n }\n }}\n onBlur={(blurEvent) => {\n blurEvent.target.dataset.showFocusRing = 'false';\n wasMouseInteracted.current = false;\n }}\n {...props}\n >\n {content}\n </RadixDropdown.Item>\n );\n};\nDropdownItem.displayName = 'Dropdown.Item';\n\nexport type DropdownSlotProps = { children: ReactNode; name?: 'left' | 'right'; 'data-test-id'?: string };\n\nexport const DropdownSlot = (\n { children, name, 'data-test-id': dataTestId = 'fondue-dropdown-slot' }: DropdownSlotProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n return (\n <div data-name={name} className={styles.slot} data-test-id={dataTestId} ref={ref}>\n {children}\n </div>\n );\n};\nDropdownSlot.displayName = 'Dropdown.Slot';\n\nconst ForwardedRefDropdownTrigger = forwardRef<HTMLButtonElement, DropdownTriggerProps>(DropdownTrigger);\nconst ForwardedRefDropdownContent = forwardRef<HTMLDivElement, DropdownContentProps>(DropdownContent);\nconst ForwardedRefDropdownGroup = forwardRef<HTMLDivElement, DropdownGroupProps>(DropdownGroup);\nconst ForwardedRefDropdownSubTrigger = forwardRef<HTMLDivElement, DropdownSubTriggerProps>(DropdownSubTrigger);\nconst ForwardedRefDropdownSubContent = forwardRef<HTMLDivElement, DropdownSubContentProps>(DropdownSubContent);\nconst ForwardedRefDropdownItem = forwardRef<HTMLDivElement, DropdownItemProps>(DropdownItem);\nconst ForwardedRefDropdownSlot = forwardRef<HTMLDivElement, DropdownSlotProps>(DropdownSlot);\n\nexport const Dropdown = {\n Root: DropdownRoot,\n Trigger: ForwardedRefDropdownTrigger,\n Content: ForwardedRefDropdownContent,\n Group: ForwardedRefDropdownGroup,\n SubMenu: DropdownSubMenu,\n SubTrigger: ForwardedRefDropdownSubTrigger,\n SubContent: ForwardedRefDropdownSubContent,\n Item: ForwardedRefDropdownItem,\n Slot: ForwardedRefDropdownSlot,\n};\n"],"names":["DropdownRoot","children","open","modal","onOpenChange","dataTestId","jsx","RadixDropdown","DropdownTrigger","asChild","props","ref","SPACING_MAP","VIEWPORT_COLLISION_PADDING_MAP","DropdownContent","side","align","triggerOffset","preventTriggerFocusOnClose","viewportCollisionPadding","theme","useFondueTheme","ThemeProvider","styles","event","DropdownGroup","heading","useMemo","Children","child","jsxs","DropdownSubMenu","DropdownSubTrigger","content","useProcessedChildren","IconCaretRight","DropdownSubContent","DropdownItem","disabled","textValue","onSelect","emphasis","wasMouseInteracted","useRef","focusEvent","blurEvent","DropdownSlot","name","ForwardedRefDropdownTrigger","forwardRef","ForwardedRefDropdownContent","ForwardedRefDropdownGroup","ForwardedRefDropdownSubTrigger","ForwardedRefDropdownSubContent","ForwardedRefDropdownItem","ForwardedRefDropdownSlot","Dropdown"],"mappings":"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"}
1
+ {"version":3,"file":"fondue-components11.js","sources":["../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { IconCaretRight } from '@frontify/fondue-icons';\nimport * as RadixDropdown from '@radix-ui/react-dropdown-menu';\nimport { Children, forwardRef, useMemo, useRef, type ForwardedRef, type ReactNode } from 'react';\n\nimport { ThemeProvider, useFondueTheme } from '../ThemeProvider/ThemeProvider';\n\nimport { useProcessedChildren } from './hooks/useProcessedChildren';\nimport styles from './styles/dropdown.module.scss';\n\nexport type DropdownRootProps = {\n children?: ReactNode;\n /**\n * When set to true, interaction with outside elements will be disabled and only menu content will be visible to screen readers.\n * @default false\n */\n modal?: boolean;\n /**\n * Controls the open state of the dropdown.\n */\n open?: boolean;\n /**\n * Callback that is called when the open state of the dropdown changes.\n */\n onOpenChange?: (open: boolean) => void;\n\n 'data-test-id'?: string;\n};\n\nexport const DropdownRoot = ({\n children,\n open,\n modal = false,\n onOpenChange,\n 'data-test-id': dataTestId = 'fondue-dropdown',\n}: DropdownRootProps) => {\n return (\n <RadixDropdown.Root open={open} modal={modal} onOpenChange={onOpenChange} data-test-id={dataTestId}>\n {children}\n </RadixDropdown.Root>\n );\n};\nDropdownRoot.displayName = 'Dropdown.Root';\n\nexport type DropdownTriggerProps = {\n /**\n * Change the default rendered element for the one passed as a child, merging their props and behavior.\n * @default true\n */\n asChild?: boolean;\n children?: ReactNode;\n 'data-test-id'?: string;\n};\n\nexport const DropdownTrigger = (\n {\n asChild = true,\n children,\n 'data-test-id': dataTestId = 'fondue-dropdown-trigger',\n ...props\n }: DropdownTriggerProps,\n ref: ForwardedRef<HTMLButtonElement>,\n) => {\n return (\n <RadixDropdown.Trigger asChild={asChild} data-test-id={dataTestId} ref={ref} {...props}>\n {children}\n </RadixDropdown.Trigger>\n );\n};\nDropdownTrigger.displayName = 'Dropdown.Trigger';\n\ntype DropdownSpacing = 'compact' | 'comfortable' | 'spacious';\ntype DropdownViewportCollisionPadding = 'compact' | 'spacious';\nexport type DropdownContentProps = {\n children?: ReactNode;\n 'data-test-id'?: string;\n /**\n * Defines the alignment of the dropdown.\n * @default \"start\"\n */\n align?: 'start' | 'center' | 'end';\n /**\n * Defines the preferred side of the dropdown. It will not be respected if there are collisions with the viewport.\n * @default \"bottom\"\n */\n side?: 'top' | 'right' | 'bottom' | 'left';\n /**\n * Defines the spacing between the dropdown and its trigger.\n * @default 'compact'\n */\n triggerOffset?: DropdownSpacing;\n /**\n * Prevents the focus from being set on the trigger when the dropdown is closed.\n */\n preventTriggerFocusOnClose?: boolean;\n /**\n * Define the minimum distance between the dropdown and the viewport edge\n * @default 'compact'\n */\n viewportCollisionPadding?: DropdownViewportCollisionPadding;\n /**\n * When true, the content will always be mounted in the DOM. Before enabling, make sure you really need it.\n * @default false\n */\n forceMount?: boolean;\n};\n\nconst SPACING_MAP: Record<DropdownSpacing, number> = {\n compact: 8,\n comfortable: 12,\n spacious: 16,\n};\n\nconst VIEWPORT_COLLISION_PADDING_MAP: Record<DropdownViewportCollisionPadding, number> = {\n compact: 8,\n spacious: 24,\n};\n\nexport const DropdownContent = (\n {\n side = 'bottom',\n align = 'start',\n triggerOffset = 'compact',\n children,\n preventTriggerFocusOnClose,\n viewportCollisionPadding = 'compact',\n forceMount = false,\n 'data-test-id': dataTestId = 'fondue-dropdown-content',\n }: DropdownContentProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n const { theme, dir } = useFondueTheme();\n\n return (\n <RadixDropdown.Portal forceMount={forceMount || undefined}>\n <ThemeProvider theme={theme} dir={dir}>\n <RadixDropdown.Content\n // @ts-expect-error - dir prop works at runtime but is not in the Radix UI type definition\n dir={dir}\n align={align}\n collisionPadding={VIEWPORT_COLLISION_PADDING_MAP[viewportCollisionPadding]}\n sideOffset={SPACING_MAP[triggerOffset]}\n side={side}\n className={styles.content}\n data-test-id={dataTestId}\n ref={ref}\n onPointerDownOutside={(event) => {\n if (forceMount && event.currentTarget instanceof HTMLElement) {\n // Trigger is technically outside the dropdown content and when forceMount is true\n // the content is always in the DOM so the onPointerDownOutside event is triggered\n const dropdownIsOpen = event.currentTarget.getAttribute('data-state') === 'open';\n if (dropdownIsOpen) {\n event.preventDefault();\n }\n }\n }}\n onCloseAutoFocus={(event) => {\n if (preventTriggerFocusOnClose) {\n event.preventDefault();\n }\n }}\n forceMount={forceMount || undefined}\n >\n {children}\n </RadixDropdown.Content>\n </ThemeProvider>\n </RadixDropdown.Portal>\n );\n};\nDropdownContent.displayName = 'Dropdown.Content';\n\nexport type DropdownGroupProps = { children: ReactNode; heading?: string; 'data-test-id'?: string };\n\nexport const DropdownGroup = (\n { children, heading, 'data-test-id': dataTestId = 'fondue-dropdown-group' }: DropdownGroupProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n const hasChildren = useMemo(\n () => Children.toArray(children).filter((child) => child !== null).length > 0,\n [children],\n );\n\n if (!hasChildren) {\n return null;\n }\n\n return (\n <RadixDropdown.Group className={styles.group} data-test-id={dataTestId} ref={ref}>\n {heading ? (\n <div className={styles.groupHeading}>\n <span aria-label={heading}>{heading}</span>\n </div>\n ) : null}\n {children}\n </RadixDropdown.Group>\n );\n};\nDropdownGroup.displayName = 'Dropdown.Group';\n\nexport type DropdownSubMenuProps = { children: ReactNode; 'data-test-id'?: string };\n\nexport const DropdownSubMenu = ({\n children,\n 'data-test-id': dataTestId = 'fondue-dropdown-submenu',\n}: DropdownSubMenuProps) => {\n return <RadixDropdown.Sub data-test-id={dataTestId}>{children}</RadixDropdown.Sub>;\n};\nDropdownSubMenu.displayName = 'Dropdown.SubMenu';\n\nexport type DropdownSubTriggerProps = { children: ReactNode; 'data-test-id'?: string };\n\nexport const DropdownSubTrigger = (\n { children, 'data-test-id': dataTestId = 'fondue-dropdown-subtrigger' }: DropdownSubTriggerProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n const { content } = useProcessedChildren(children);\n return (\n <RadixDropdown.SubTrigger className={styles.subTrigger} data-test-id={dataTestId} ref={ref}>\n {content}\n <IconCaretRight className={styles.subMenuIndicator} size={16} />\n </RadixDropdown.SubTrigger>\n );\n};\nDropdownSubTrigger.displayName = 'Dropdown.SubTrigger';\n\nexport type DropdownSubContentProps = {\n children: ReactNode;\n 'data-test-id'?: string;\n};\n\nexport const DropdownSubContent = (\n { children, 'data-test-id': dataTestId = 'fondue-dropdown-subcontent' }: DropdownSubContentProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n const { theme, dir } = useFondueTheme();\n\n return (\n <RadixDropdown.Portal>\n <ThemeProvider theme={theme} dir={dir}>\n <RadixDropdown.SubContent\n // @ts-expect-error - dir prop works at runtime but is not in the Radix UI type definition\n dir={dir}\n className={styles.subContent}\n data-test-id={dataTestId}\n ref={ref}\n >\n {children}\n </RadixDropdown.SubContent>\n </ThemeProvider>\n </RadixDropdown.Portal>\n );\n};\nDropdownSubContent.displayName = 'Dropdown.SubContent';\n\nexport type DropdownItemProps = {\n children: ReactNode;\n /**\n * Disables the item.\n */\n disabled?: boolean;\n /**\n * The text value of the item that is passed to the onSelect callback.\n */\n textValue?: string;\n /**\n * The style of the item.\n * @default \"default\"\n */\n emphasis?: 'default' | 'danger';\n /**\n * Callback that is called when the item is selected.\n */\n onSelect?: (event: Event) => void;\n /**\n * If true, the item props will be passed to the child element.\n * @default false\n */\n asChild?: boolean;\n 'data-test-id'?: string;\n};\n\nexport const DropdownItem = (\n {\n children,\n disabled,\n textValue,\n onSelect,\n emphasis = 'default',\n asChild = false,\n 'data-test-id': dataTestId = 'fondue-dropdown-subtrigger',\n ...props\n }: DropdownItemProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n const { content } = useProcessedChildren(children);\n const wasMouseInteracted = useRef(false);\n\n return (\n <RadixDropdown.Item\n onSelect={onSelect}\n className={styles.item}\n textValue={textValue}\n data-test-id={dataTestId}\n data-emphasis={emphasis}\n ref={ref}\n disabled={disabled}\n asChild={asChild}\n data-show-focus-ring={wasMouseInteracted.current}\n onMouseEnter={() => {\n wasMouseInteracted.current = true;\n }}\n onFocus={(focusEvent) => {\n if (!wasMouseInteracted.current) {\n focusEvent.target.dataset.showFocusRing = 'true';\n }\n }}\n onBlur={(blurEvent) => {\n blurEvent.target.dataset.showFocusRing = 'false';\n wasMouseInteracted.current = false;\n }}\n {...props}\n >\n {content}\n </RadixDropdown.Item>\n );\n};\nDropdownItem.displayName = 'Dropdown.Item';\n\nexport type DropdownSlotProps = { children: ReactNode; name?: 'left' | 'right'; 'data-test-id'?: string };\n\nexport const DropdownSlot = (\n { children, name, 'data-test-id': dataTestId = 'fondue-dropdown-slot' }: DropdownSlotProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n return (\n <div data-name={name} className={styles.slot} data-test-id={dataTestId} ref={ref}>\n {children}\n </div>\n );\n};\nDropdownSlot.displayName = 'Dropdown.Slot';\n\nconst ForwardedRefDropdownTrigger = forwardRef<HTMLButtonElement, DropdownTriggerProps>(DropdownTrigger);\nconst ForwardedRefDropdownContent = forwardRef<HTMLDivElement, DropdownContentProps>(DropdownContent);\nconst ForwardedRefDropdownGroup = forwardRef<HTMLDivElement, DropdownGroupProps>(DropdownGroup);\nconst ForwardedRefDropdownSubTrigger = forwardRef<HTMLDivElement, DropdownSubTriggerProps>(DropdownSubTrigger);\nconst ForwardedRefDropdownSubContent = forwardRef<HTMLDivElement, DropdownSubContentProps>(DropdownSubContent);\nconst ForwardedRefDropdownItem = forwardRef<HTMLDivElement, DropdownItemProps>(DropdownItem);\nconst ForwardedRefDropdownSlot = forwardRef<HTMLDivElement, DropdownSlotProps>(DropdownSlot);\n\nexport const Dropdown = {\n Root: DropdownRoot,\n Trigger: ForwardedRefDropdownTrigger,\n Content: ForwardedRefDropdownContent,\n Group: ForwardedRefDropdownGroup,\n SubMenu: DropdownSubMenu,\n SubTrigger: ForwardedRefDropdownSubTrigger,\n SubContent: ForwardedRefDropdownSubContent,\n Item: ForwardedRefDropdownItem,\n Slot: ForwardedRefDropdownSlot,\n};\n"],"names":["DropdownRoot","children","open","modal","onOpenChange","dataTestId","jsx","RadixDropdown","DropdownTrigger","asChild","props","ref","SPACING_MAP","VIEWPORT_COLLISION_PADDING_MAP","DropdownContent","side","align","triggerOffset","preventTriggerFocusOnClose","viewportCollisionPadding","forceMount","theme","dir","useFondueTheme","ThemeProvider","styles","event","DropdownGroup","heading","useMemo","Children","child","jsxs","DropdownSubMenu","DropdownSubTrigger","content","useProcessedChildren","IconCaretRight","DropdownSubContent","DropdownItem","disabled","textValue","onSelect","emphasis","wasMouseInteracted","useRef","focusEvent","blurEvent","DropdownSlot","name","ForwardedRefDropdownTrigger","forwardRef","ForwardedRefDropdownContent","ForwardedRefDropdownGroup","ForwardedRefDropdownSubTrigger","ForwardedRefDropdownSubContent","ForwardedRefDropdownItem","ForwardedRefDropdownSlot","Dropdown"],"mappings":"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"}
@@ -1,117 +1,119 @@
1
- import { jsx as a, jsxs as u } from "react/jsx-runtime";
2
- import { IconCross as R } from "@frontify/fondue-icons";
3
- import * as l from "@radix-ui/react-popover";
4
- import { forwardRef as i } from "react";
5
- import { addAutoFocusAttribute as w, addShowFocusRing as x } from "./fondue-components49.js";
6
- import { useFondueTheme as A, ThemeProvider as T } from "./fondue-components31.js";
7
- import s from "./fondue-components56.js";
8
- const n = ({ children: t, ...o }) => /* @__PURE__ */ a(l.Root, { ...o, children: t });
9
- n.displayName = "Flyout.Root";
10
- const c = ({ asChild: t = !0, children: o, "data-test-id": e = "fondue-flyout-trigger", ...d }, r) => /* @__PURE__ */ a(
11
- l.Trigger,
1
+ import { jsx as a, jsxs as c } from "react/jsx-runtime";
2
+ import { IconCross as T } from "@frontify/fondue-icons";
3
+ import * as u from "@radix-ui/react-popover";
4
+ import { forwardRef as l } from "react";
5
+ import { addAutoFocusAttribute as I, addShowFocusRing as O } from "./fondue-components49.js";
6
+ import { useFondueTheme as S, ThemeProvider as _ } from "./fondue-components31.js";
7
+ import d from "./fondue-components56.js";
8
+ const m = ({ children: t, ...o }) => /* @__PURE__ */ a(u.Root, { ...o, children: t });
9
+ m.displayName = "Flyout.Root";
10
+ const f = ({ asChild: t = !0, children: o, "data-test-id": e = "fondue-flyout-trigger", ...r }, s) => /* @__PURE__ */ a(
11
+ u.Trigger,
12
12
  {
13
- onMouseDown: w,
13
+ onMouseDown: I,
14
14
  "data-auto-focus-visible": "true",
15
15
  "data-auto-focus-trigger": !0,
16
16
  "data-test-id": e,
17
17
  asChild: t,
18
- ref: r,
19
- ...d,
18
+ ref: s,
19
+ ...r,
20
20
  children: o
21
21
  }
22
22
  );
23
- c.displayName = "Flyout.Trigger";
24
- const I = {
23
+ f.displayName = "Flyout.Trigger";
24
+ const j = {
25
25
  compact: 8,
26
26
  comfortable: 12,
27
27
  spacious: 16
28
- }, O = {
28
+ }, B = {
29
29
  compact: 8,
30
30
  spacious: 24
31
- }, m = ({
31
+ }, y = ({
32
32
  align: t = "start",
33
33
  maxWidth: o = "360px",
34
34
  padding: e = "compact",
35
- rounded: d = "medium",
36
- width: r = "fit-content",
37
- shadow: F = "medium",
38
- triggerOffset: g = "compact",
39
- viewportCollisionPadding: N = "compact",
40
- "data-test-id": h = "fondue-flyout-content",
41
- children: v,
42
- ...C
43
- }, P) => {
44
- const b = A();
45
- return /* @__PURE__ */ a(l.Portal, { children: /* @__PURE__ */ u(T, { theme: b, children: [
46
- /* @__PURE__ */ a("div", { "data-test-id": "fondue-flyout-overlay", className: s.overlay }),
35
+ rounded: r = "medium",
36
+ width: s = "fit-content",
37
+ shadow: h = "medium",
38
+ side: N,
39
+ triggerOffset: v = "compact",
40
+ viewportCollisionPadding: C = "compact",
41
+ "data-test-id": P = "fondue-flyout-content",
42
+ children: b,
43
+ ...R
44
+ }, A) => {
45
+ const { theme: w, dir: n } = S(), x = (i) => !i || n === "ltr" ? i : i === "left" ? "right" : i === "right" ? "left" : i;
46
+ return /* @__PURE__ */ a(u.Portal, { children: /* @__PURE__ */ c(_, { theme: w, dir: n, children: [
47
+ /* @__PURE__ */ a("div", { "data-test-id": "fondue-flyout-overlay", className: d.overlay }),
47
48
  /* @__PURE__ */ a(
48
- l.Content,
49
+ u.Content,
49
50
  {
50
51
  style: {
51
52
  "--flyout-max-width": o,
52
- "--flyout-width": r
53
+ "--flyout-width": s
53
54
  },
54
- ref: P,
55
+ ref: A,
55
56
  align: t,
56
- collisionPadding: O[N],
57
- sideOffset: I[g],
58
- className: s.root,
57
+ collisionPadding: B[C],
58
+ sideOffset: j[v],
59
+ side: x(N),
60
+ className: d.root,
59
61
  "data-flyout-spacing": e,
60
- "data-rounded": d,
61
- "data-shadow": F,
62
- "data-test-id": h,
63
- onFocus: x,
64
- ...C,
65
- children: v
62
+ "data-rounded": r,
63
+ "data-shadow": h,
64
+ "data-test-id": P,
65
+ onFocus: O,
66
+ ...R,
67
+ children: b
66
68
  }
67
69
  )
68
70
  ] }) });
69
71
  };
70
- m.displayName = "Flyout.Content";
71
- const y = ({ showCloseButton: t, children: o, "data-test-id": e = "fondue-flyout-header", closeProps: d }, r) => /* @__PURE__ */ u("div", { "data-test-id": e, ref: r, className: s.header, children: [
72
+ y.displayName = "Flyout.Content";
73
+ const p = ({ showCloseButton: t, children: o, "data-test-id": e = "fondue-flyout-header", closeProps: r }, s) => /* @__PURE__ */ c("div", { "data-test-id": e, ref: s, className: d.header, children: [
72
74
  /* @__PURE__ */ a("div", { children: o }),
73
75
  t && /* @__PURE__ */ a(
74
- l.Close,
76
+ u.Close,
75
77
  {
76
78
  role: "button",
77
79
  "data-test-id": `${e}-close`,
78
- className: s.close,
80
+ className: d.close,
79
81
  "aria-label": "Close",
80
- ...d,
81
- children: /* @__PURE__ */ a(R, { size: 20 })
82
+ ...r,
83
+ children: /* @__PURE__ */ a(T, { size: 20 })
82
84
  }
83
85
  )
84
86
  ] });
85
- y.displayName = "Flyout.Header";
86
- const f = ({ children: t, "data-test-id": o = "fondue-flyout-footer" }, e) => /* @__PURE__ */ a("div", { "data-test-id": o, ref: e, className: s.footer, children: t });
87
- f.displayName = "Flyout.Footer";
88
- const p = ({ children: t, "data-test-id": o = "fondue-flyout-body", scrollable: e = !1 }, d) => /* @__PURE__ */ a(
87
+ p.displayName = "Flyout.Header";
88
+ const F = ({ children: t, "data-test-id": o = "fondue-flyout-footer" }, e) => /* @__PURE__ */ a("div", { "data-test-id": o, ref: e, className: d.footer, children: t });
89
+ F.displayName = "Flyout.Footer";
90
+ const g = ({ children: t, "data-test-id": o = "fondue-flyout-body", scrollable: e = !1 }, r) => /* @__PURE__ */ a(
89
91
  "div",
90
92
  {
91
93
  "data-test-id": o,
92
- ref: d,
94
+ ref: r,
93
95
  "data-flyout-spacing": "compact",
94
96
  "data-scrollable": e,
95
- className: s.body,
97
+ className: d.body,
96
98
  children: t
97
99
  }
98
100
  );
99
- p.displayName = "Flyout.Body";
100
- const j = {
101
- Root: n,
102
- Trigger: i(c),
103
- Content: i(m),
104
- Header: i(y),
105
- Footer: i(f),
106
- Body: i(p)
101
+ g.displayName = "Flyout.Body";
102
+ const E = {
103
+ Root: m,
104
+ Trigger: l(f),
105
+ Content: l(y),
106
+ Header: l(p),
107
+ Footer: l(F),
108
+ Body: l(g)
107
109
  };
108
110
  export {
109
- j as Flyout,
110
- p as FlyoutBody,
111
- m as FlyoutContent,
112
- f as FlyoutFooter,
113
- y as FlyoutHeader,
114
- n as FlyoutRoot,
115
- c as FlyoutTrigger
111
+ E as Flyout,
112
+ g as FlyoutBody,
113
+ y as FlyoutContent,
114
+ F as FlyoutFooter,
115
+ p as FlyoutHeader,
116
+ m as FlyoutRoot,
117
+ f as FlyoutTrigger
116
118
  };
117
119
  //# sourceMappingURL=fondue-components13.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fondue-components13.js","sources":["../src/components/Flyout/Flyout.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { IconCross } from '@frontify/fondue-icons';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport { forwardRef, type CSSProperties, type ForwardedRef, type ReactNode } from 'react';\n\nimport { type CommonAriaProps } from '#/helpers/aria';\nimport { addAutoFocusAttribute, addShowFocusRing } from '#/utilities/domUtilities';\n\nimport { ThemeProvider, useFondueTheme } from '../ThemeProvider/ThemeProvider';\n\nimport styles from './styles/flyout.module.scss';\n\nexport type FlyoutRootProps = {\n /**\n * Disable interaction with the rest of the page\n * @default false\n */\n modal?: boolean;\n /**\n * The controlled `open` state of the flyout\n * @default false\n */\n open?: boolean;\n /**\n * Event handler called when the `open` state changes\n */\n onOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n};\n\nexport const FlyoutRoot = ({ children, ...props }: FlyoutRootProps) => {\n return <RadixPopover.Root {...props}>{children}</RadixPopover.Root>;\n};\nFlyoutRoot.displayName = 'Flyout.Root';\n\nexport type FlyoutTriggerProps = {\n /**\n * Change the default rendered element for the one passed as a child, merging their props and behavior.\n * @default true\n */\n asChild?: boolean;\n children?: ReactNode;\n 'data-test-id'?: string;\n};\n\nexport const FlyoutTrigger = (\n { asChild = true, children, 'data-test-id': dataTestId = 'fondue-flyout-trigger', ...props }: FlyoutTriggerProps,\n ref: ForwardedRef<HTMLButtonElement>,\n) => {\n return (\n <RadixPopover.Trigger\n onMouseDown={addAutoFocusAttribute}\n data-auto-focus-visible=\"true\"\n data-auto-focus-trigger\n data-test-id={dataTestId}\n asChild={asChild}\n ref={ref}\n {...props}\n >\n {children}\n </RadixPopover.Trigger>\n );\n};\nFlyoutTrigger.displayName = 'Flyout.Trigger';\n\ntype FlyoutSpacing = 'compact' | 'comfortable' | 'spacious';\ntype FlyoutViewportCollisionPadding = 'compact' | 'spacious';\nexport type FlyoutContentProps = {\n /**\n * Add a shadow to the flyout\n * @default \"medium\"\n */\n shadow?: 'none' | 'medium' | 'large';\n /**\n * Add rounded corners to the flyout\n * @default \"medium\"\n */\n rounded?: 'none' | 'medium' | 'large';\n /**\n * Define the prefered side of the flyout. Can be overriden by viewport collisions viewport.\n * @default \"bottom\"\n */\n side?: 'top' | 'right' | 'bottom' | 'left';\n /**\n * Define the prefered alignment of the flyout. Can be overriden by viewport collisions viewport.\n * @default \"start\"\n */\n align?: 'start' | 'center' | 'end';\n /**\n * Define the padding of the flyout\n * @default \"compact\"\n */\n padding?: 'none' | 'tight' | 'compact' | 'comfortable' | 'spacious';\n /**\n * Define the fixed width of the flyout\n * @default \"fit-content\"\n */\n width?: string;\n /**\n * Defines the spacing between the dropdown and its trigger.\n * @default 'compact'\n */\n triggerOffset?: FlyoutSpacing;\n /**\n * Define the maximum width of the flyout\n * @default \"360px\"\n */\n maxWidth?: string;\n /**\n * Define the minimum distance between the flyout and the viewport edge\n * @default 'compact'\n */\n viewportCollisionPadding?: FlyoutViewportCollisionPadding;\n /**\n * Event handler called when auto-focusing on open\n */\n onOpenAutoFocus?: (event: Event) => void;\n children?: ReactNode;\n 'data-test-id'?: string;\n};\n\nconst SPACING_MAP: Record<FlyoutSpacing, number> = {\n compact: 8,\n comfortable: 12,\n spacious: 16,\n};\n\nconst VIEWPORT_COLLISION_PADDING_MAP: Record<FlyoutViewportCollisionPadding, number> = {\n compact: 8,\n spacious: 24,\n};\n\nexport const FlyoutContent = (\n {\n align = 'start',\n maxWidth = '360px',\n padding = 'compact',\n rounded = 'medium',\n width = 'fit-content',\n shadow = 'medium',\n triggerOffset = 'compact',\n viewportCollisionPadding = 'compact',\n 'data-test-id': dataTestId = 'fondue-flyout-content',\n children,\n ...props\n }: FlyoutContentProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n const theme = useFondueTheme();\n return (\n <RadixPopover.Portal>\n <ThemeProvider theme={theme}>\n <div data-test-id=\"fondue-flyout-overlay\" className={styles.overlay} />\n <RadixPopover.Content\n style={\n {\n '--flyout-max-width': maxWidth,\n '--flyout-width': width,\n } as CSSProperties\n }\n ref={ref}\n align={align}\n collisionPadding={VIEWPORT_COLLISION_PADDING_MAP[viewportCollisionPadding]}\n sideOffset={SPACING_MAP[triggerOffset]}\n className={styles.root}\n data-flyout-spacing={padding}\n data-rounded={rounded}\n data-shadow={shadow}\n data-test-id={dataTestId}\n onFocus={addShowFocusRing}\n {...props}\n >\n {children}\n </RadixPopover.Content>\n </ThemeProvider>\n </RadixPopover.Portal>\n );\n};\nFlyoutContent.displayName = 'Flyout.Content';\n\nexport type FlyoutHeaderProps = {\n /**\n * Show a close button in the header\n * @default false\n */\n showCloseButton?: boolean;\n children?: ReactNode;\n 'data-test-id'?: string;\n closeProps?: CommonAriaProps;\n};\n\nexport const FlyoutHeader = (\n { showCloseButton, children, 'data-test-id': dataTestId = 'fondue-flyout-header', closeProps }: FlyoutHeaderProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n return (\n <div data-test-id={dataTestId} ref={ref} className={styles.header}>\n <div>{children}</div>\n {showCloseButton && (\n <RadixPopover.Close\n role=\"button\"\n data-test-id={`${dataTestId}-close`}\n className={styles.close}\n aria-label=\"Close\"\n {...closeProps}\n >\n <IconCross size={20} />\n </RadixPopover.Close>\n )}\n </div>\n );\n};\nFlyoutHeader.displayName = 'Flyout.Header';\n\nexport type FlyoutFooterProps = { children?: ReactNode; 'data-test-id'?: string };\n\nexport const FlyoutFooter = (\n { children, 'data-test-id': dataTestId = 'fondue-flyout-footer' }: FlyoutFooterProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n return (\n <div data-test-id={dataTestId} ref={ref} className={styles.footer}>\n {children}\n </div>\n );\n};\nFlyoutFooter.displayName = 'Flyout.Footer';\n\nexport type FlyoutBodyProps = {\n children?: ReactNode;\n 'data-test-id'?: string;\n /**\n * Allow the body to scroll if the max height of the flyout is reached\n * @default false\n */\n scrollable?: boolean;\n};\n\nexport const FlyoutBody = (\n { children, 'data-test-id': dataTestId = 'fondue-flyout-body', scrollable = false }: FlyoutBodyProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n return (\n <div\n data-test-id={dataTestId}\n ref={ref}\n data-flyout-spacing=\"compact\"\n data-scrollable={scrollable}\n className={styles.body}\n >\n {children}\n </div>\n );\n};\nFlyoutBody.displayName = 'Flyout.Body';\n\nexport const Flyout = {\n Root: FlyoutRoot,\n Trigger: forwardRef<HTMLButtonElement, FlyoutTriggerProps>(FlyoutTrigger),\n Content: forwardRef<HTMLDivElement, FlyoutContentProps>(FlyoutContent),\n Header: forwardRef<HTMLDivElement, FlyoutHeaderProps>(FlyoutHeader),\n Footer: forwardRef<HTMLDivElement, FlyoutFooterProps>(FlyoutFooter),\n Body: forwardRef<HTMLDivElement, FlyoutBodyProps>(FlyoutBody),\n};\n"],"names":["FlyoutRoot","children","props","RadixPopover","FlyoutTrigger","asChild","dataTestId","ref","jsx","addAutoFocusAttribute","SPACING_MAP","VIEWPORT_COLLISION_PADDING_MAP","FlyoutContent","align","maxWidth","padding","rounded","width","shadow","triggerOffset","viewportCollisionPadding","theme","useFondueTheme","jsxs","ThemeProvider","styles","addShowFocusRing","FlyoutHeader","showCloseButton","closeProps","IconCross","FlyoutFooter","FlyoutBody","scrollable","Flyout","forwardRef"],"mappings":"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"}
1
+ {"version":3,"file":"fondue-components13.js","sources":["../src/components/Flyout/Flyout.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { IconCross } from '@frontify/fondue-icons';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport { forwardRef, type CSSProperties, type ForwardedRef, type ReactNode } from 'react';\n\nimport { type CommonAriaProps } from '#/helpers/aria';\nimport { addAutoFocusAttribute, addShowFocusRing } from '#/utilities/domUtilities';\n\nimport { ThemeProvider, useFondueTheme } from '../ThemeProvider/ThemeProvider';\n\nimport styles from './styles/flyout.module.scss';\n\nexport type FlyoutRootProps = {\n /**\n * Disable interaction with the rest of the page\n * @default false\n */\n modal?: boolean;\n /**\n * The controlled `open` state of the flyout\n * @default false\n */\n open?: boolean;\n /**\n * Event handler called when the `open` state changes\n */\n onOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n};\n\nexport const FlyoutRoot = ({ children, ...props }: FlyoutRootProps) => {\n return <RadixPopover.Root {...props}>{children}</RadixPopover.Root>;\n};\nFlyoutRoot.displayName = 'Flyout.Root';\n\nexport type FlyoutTriggerProps = {\n /**\n * Change the default rendered element for the one passed as a child, merging their props and behavior.\n * @default true\n */\n asChild?: boolean;\n children?: ReactNode;\n 'data-test-id'?: string;\n};\n\nexport const FlyoutTrigger = (\n { asChild = true, children, 'data-test-id': dataTestId = 'fondue-flyout-trigger', ...props }: FlyoutTriggerProps,\n ref: ForwardedRef<HTMLButtonElement>,\n) => {\n return (\n <RadixPopover.Trigger\n onMouseDown={addAutoFocusAttribute}\n data-auto-focus-visible=\"true\"\n data-auto-focus-trigger\n data-test-id={dataTestId}\n asChild={asChild}\n ref={ref}\n {...props}\n >\n {children}\n </RadixPopover.Trigger>\n );\n};\nFlyoutTrigger.displayName = 'Flyout.Trigger';\n\ntype FlyoutSpacing = 'compact' | 'comfortable' | 'spacious';\ntype FlyoutViewportCollisionPadding = 'compact' | 'spacious';\nexport type FlyoutContentProps = {\n /**\n * Add a shadow to the flyout\n * @default \"medium\"\n */\n shadow?: 'none' | 'medium' | 'large';\n /**\n * Add rounded corners to the flyout\n * @default \"medium\"\n */\n rounded?: 'none' | 'medium' | 'large';\n /**\n * Define the prefered side of the flyout. Can be overriden by viewport collisions viewport.\n * @default \"bottom\"\n */\n side?: 'top' | 'right' | 'bottom' | 'left';\n /**\n * Define the prefered alignment of the flyout. Can be overriden by viewport collisions viewport.\n * @default \"start\"\n */\n align?: 'start' | 'center' | 'end';\n /**\n * Define the padding of the flyout\n * @default \"compact\"\n */\n padding?: 'none' | 'tight' | 'compact' | 'comfortable' | 'spacious';\n /**\n * Define the fixed width of the flyout\n * @default \"fit-content\"\n */\n width?: string;\n /**\n * Defines the spacing between the dropdown and its trigger.\n * @default 'compact'\n */\n triggerOffset?: FlyoutSpacing;\n /**\n * Define the maximum width of the flyout\n * @default \"360px\"\n */\n maxWidth?: string;\n /**\n * Define the minimum distance between the flyout and the viewport edge\n * @default 'compact'\n */\n viewportCollisionPadding?: FlyoutViewportCollisionPadding;\n /**\n * Event handler called when auto-focusing on open\n */\n onOpenAutoFocus?: (event: Event) => void;\n children?: ReactNode;\n 'data-test-id'?: string;\n};\n\nconst SPACING_MAP: Record<FlyoutSpacing, number> = {\n compact: 8,\n comfortable: 12,\n spacious: 16,\n};\n\nconst VIEWPORT_COLLISION_PADDING_MAP: Record<FlyoutViewportCollisionPadding, number> = {\n compact: 8,\n spacious: 24,\n};\n\nexport const FlyoutContent = (\n {\n align = 'start',\n maxWidth = '360px',\n padding = 'compact',\n rounded = 'medium',\n width = 'fit-content',\n shadow = 'medium',\n side,\n triggerOffset = 'compact',\n viewportCollisionPadding = 'compact',\n 'data-test-id': dataTestId = 'fondue-flyout-content',\n children,\n ...props\n }: FlyoutContentProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n const { theme, dir } = useFondueTheme();\n\n const getAdjustedSide = (side?: 'top' | 'right' | 'bottom' | 'left') => {\n if (!side || dir === 'ltr') {\n return side;\n }\n\n if (side === 'left') {\n return 'right';\n }\n if (side === 'right') {\n return 'left';\n }\n\n return side;\n };\n\n return (\n <RadixPopover.Portal>\n <ThemeProvider theme={theme} dir={dir}>\n <div data-test-id=\"fondue-flyout-overlay\" className={styles.overlay} />\n <RadixPopover.Content\n style={\n {\n '--flyout-max-width': maxWidth,\n '--flyout-width': width,\n } as CSSProperties\n }\n ref={ref}\n align={align}\n collisionPadding={VIEWPORT_COLLISION_PADDING_MAP[viewportCollisionPadding]}\n sideOffset={SPACING_MAP[triggerOffset]}\n side={getAdjustedSide(side)}\n className={styles.root}\n data-flyout-spacing={padding}\n data-rounded={rounded}\n data-shadow={shadow}\n data-test-id={dataTestId}\n onFocus={addShowFocusRing}\n {...props}\n >\n {children}\n </RadixPopover.Content>\n </ThemeProvider>\n </RadixPopover.Portal>\n );\n};\nFlyoutContent.displayName = 'Flyout.Content';\n\nexport type FlyoutHeaderProps = {\n /**\n * Show a close button in the header\n * @default false\n */\n showCloseButton?: boolean;\n children?: ReactNode;\n 'data-test-id'?: string;\n closeProps?: CommonAriaProps;\n};\n\nexport const FlyoutHeader = (\n { showCloseButton, children, 'data-test-id': dataTestId = 'fondue-flyout-header', closeProps }: FlyoutHeaderProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n return (\n <div data-test-id={dataTestId} ref={ref} className={styles.header}>\n <div>{children}</div>\n {showCloseButton && (\n <RadixPopover.Close\n role=\"button\"\n data-test-id={`${dataTestId}-close`}\n className={styles.close}\n aria-label=\"Close\"\n {...closeProps}\n >\n <IconCross size={20} />\n </RadixPopover.Close>\n )}\n </div>\n );\n};\nFlyoutHeader.displayName = 'Flyout.Header';\n\nexport type FlyoutFooterProps = { children?: ReactNode; 'data-test-id'?: string };\n\nexport const FlyoutFooter = (\n { children, 'data-test-id': dataTestId = 'fondue-flyout-footer' }: FlyoutFooterProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n return (\n <div data-test-id={dataTestId} ref={ref} className={styles.footer}>\n {children}\n </div>\n );\n};\nFlyoutFooter.displayName = 'Flyout.Footer';\n\nexport type FlyoutBodyProps = {\n children?: ReactNode;\n 'data-test-id'?: string;\n /**\n * Allow the body to scroll if the max height of the flyout is reached\n * @default false\n */\n scrollable?: boolean;\n};\n\nexport const FlyoutBody = (\n { children, 'data-test-id': dataTestId = 'fondue-flyout-body', scrollable = false }: FlyoutBodyProps,\n ref: ForwardedRef<HTMLDivElement>,\n) => {\n return (\n <div\n data-test-id={dataTestId}\n ref={ref}\n data-flyout-spacing=\"compact\"\n data-scrollable={scrollable}\n className={styles.body}\n >\n {children}\n </div>\n );\n};\nFlyoutBody.displayName = 'Flyout.Body';\n\nexport const Flyout = {\n Root: FlyoutRoot,\n Trigger: forwardRef<HTMLButtonElement, FlyoutTriggerProps>(FlyoutTrigger),\n Content: forwardRef<HTMLDivElement, FlyoutContentProps>(FlyoutContent),\n Header: forwardRef<HTMLDivElement, FlyoutHeaderProps>(FlyoutHeader),\n Footer: forwardRef<HTMLDivElement, FlyoutFooterProps>(FlyoutFooter),\n Body: forwardRef<HTMLDivElement, FlyoutBodyProps>(FlyoutBody),\n};\n"],"names":["FlyoutRoot","children","props","RadixPopover","FlyoutTrigger","asChild","dataTestId","ref","jsx","addAutoFocusAttribute","SPACING_MAP","VIEWPORT_COLLISION_PADDING_MAP","FlyoutContent","align","maxWidth","padding","rounded","width","shadow","side","triggerOffset","viewportCollisionPadding","theme","dir","useFondueTheme","getAdjustedSide","jsxs","ThemeProvider","styles","addShowFocusRing","FlyoutHeader","showCloseButton","closeProps","IconCross","FlyoutFooter","FlyoutBody","scrollable","Flyout","forwardRef"],"mappings":"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"}