@payfit/unity-components 2.5.7 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/esm/components/empty-state/EmptyState.d.ts +48 -0
  2. package/dist/esm/components/empty-state/EmptyState.js +25 -0
  3. package/dist/esm/components/empty-state/EmptyState.variants.d.ts +59 -0
  4. package/dist/esm/components/empty-state/EmptyState.variants.js +24 -0
  5. package/dist/esm/components/empty-state/parts/EmptyStateActions.d.ts +39 -0
  6. package/dist/esm/components/empty-state/parts/EmptyStateActions.js +17 -0
  7. package/dist/esm/components/empty-state/parts/EmptyStateContent.d.ts +40 -0
  8. package/dist/esm/components/empty-state/parts/EmptyStateContent.js +21 -0
  9. package/dist/esm/components/empty-state/parts/EmptyStateIcon.d.ts +41 -0
  10. package/dist/esm/components/empty-state/parts/EmptyStateIcon.js +14 -0
  11. package/dist/esm/components/empty-state/presets/EmptyStateGetStarted.d.ts +41 -0
  12. package/dist/esm/components/empty-state/presets/EmptyStateGetStarted.js +28 -0
  13. package/dist/esm/components/empty-state/presets/EmptyStateGoodJob.d.ts +29 -0
  14. package/dist/esm/components/empty-state/presets/EmptyStateGoodJob.js +55 -0
  15. package/dist/esm/components/empty-state/presets/EmptyStateNoSearchResults.d.ts +38 -0
  16. package/dist/esm/components/empty-state/presets/EmptyStateNoSearchResults.js +28 -0
  17. package/dist/esm/components/empty-state/presets/EmptyStateUpgradeRequired.d.ts +37 -0
  18. package/dist/esm/components/empty-state/presets/EmptyStateUpgradeRequired.js +28 -0
  19. package/dist/esm/components/empty-state/presets/EmptyStateUseDesktop.d.ts +28 -0
  20. package/dist/esm/components/empty-state/presets/EmptyStateUseDesktop.js +26 -0
  21. package/dist/esm/components/empty-state/presets/EmptyStateWaitingForData.d.ts +38 -0
  22. package/dist/esm/components/empty-state/presets/EmptyStateWaitingForData.js +28 -0
  23. package/dist/esm/components/inline-field/InlineField.js +15 -6
  24. package/dist/esm/components/inline-field-group/InlineFieldGroup.context.d.ts +12 -0
  25. package/dist/esm/components/inline-field-group/InlineFieldGroup.d.ts +39 -0
  26. package/dist/esm/components/inline-field-group/InlineFieldGroup.js +119 -93
  27. package/dist/esm/components/inline-field-group/parts/InlineFieldGroupActions.d.ts +24 -0
  28. package/dist/esm/components/inline-field-group/parts/InlineFieldGroupActions.js +158 -0
  29. package/dist/esm/components/inline-field-group/parts/InlineFieldGroupHeader.d.ts +11 -35
  30. package/dist/esm/components/inline-field-group/parts/InlineFieldGroupHeader.js +27 -94
  31. package/dist/esm/index.d.ts +10 -0
  32. package/dist/esm/index.js +431 -411
  33. package/i18n/en-GB.json +9 -0
  34. package/i18n/es-ES.json +9 -0
  35. package/i18n/fr-FR.json +9 -0
  36. package/package.json +7 -7
@@ -0,0 +1,26 @@
1
+ import { jsxs as i, jsx as t } from "react/jsx-runtime";
2
+ import { forwardRef as n } from "react";
3
+ import { useIntl as p } from "react-intl";
4
+ import { EmptyState as a } from "../EmptyState.js";
5
+ import { EmptyStateContent as l } from "../parts/EmptyStateContent.js";
6
+ import { EmptyStateIcon as f } from "../parts/EmptyStateIcon.js";
7
+ const d = n(({ title: e, description: o, ...r }, s) => {
8
+ const m = p().formatMessage({
9
+ id: "unity:component:empty-state:use-desktop:title",
10
+ defaultMessage: "Best experienced on desktop"
11
+ });
12
+ return /* @__PURE__ */ i(a, { ref: s, ...r, children: [
13
+ /* @__PURE__ */ t(f, { icon: "DevicesOutlined", variant: "neutral" }),
14
+ /* @__PURE__ */ t(
15
+ l,
16
+ {
17
+ title: e || m,
18
+ description: o
19
+ }
20
+ )
21
+ ] });
22
+ });
23
+ d.displayName = "EmptyStateUseDesktop";
24
+ export {
25
+ d as EmptyStateUseDesktop
26
+ };
@@ -0,0 +1,38 @@
1
+ import { ComponentPropsWithoutRef, ReactNode } from 'react';
2
+ import { EmptyState } from '../EmptyState.js';
3
+ export interface EmptyStateWaitingForDataProps extends Omit<ComponentPropsWithoutRef<typeof EmptyState>, 'children'> {
4
+ /**
5
+ * Custom title text. If not provided, uses the default i18n message.
6
+ */
7
+ title?: string;
8
+ /**
9
+ * Description text providing context about the waiting state.
10
+ * Defaults to placeholder text if not provided.
11
+ */
12
+ description?: string;
13
+ /**
14
+ * Optional action elements (buttons, links) to display.
15
+ * Pass Button or Link components as children.
16
+ */
17
+ actions?: ReactNode;
18
+ }
19
+ /**
20
+ * EmptyStateWaitingForData is a preset for informing users that data will appear once available.
21
+ * It displays an info icon and provides an optional actions slot.
22
+ * @param {EmptyStateWaitingForDataProps} props - The component props
23
+ * @example
24
+ * ```tsx
25
+ * import { EmptyStateWaitingForData, Button } from '@payfit/unity-components'
26
+ *
27
+ * <EmptyStateWaitingForData
28
+ * description="Your results will appear here once data is available."
29
+ * actions={
30
+ * <Button variant="ghost" onPress={() => console.log('Refresh')}>
31
+ * Refresh
32
+ * </Button>
33
+ * }
34
+ * />
35
+ * ```
36
+ */
37
+ declare const EmptyStateWaitingForData: import('react').ForwardRefExoticComponent<EmptyStateWaitingForDataProps & import('react').RefAttributes<HTMLDivElement>>;
38
+ export { EmptyStateWaitingForData };
@@ -0,0 +1,28 @@
1
+ import { jsxs as n, jsx as t } from "react/jsx-runtime";
2
+ import { forwardRef as p } from "react";
3
+ import { useIntl as l } from "react-intl";
4
+ import { EmptyState as s } from "../EmptyState.js";
5
+ import { EmptyStateActions as f } from "../parts/EmptyStateActions.js";
6
+ import { EmptyStateContent as y } from "../parts/EmptyStateContent.js";
7
+ import { EmptyStateIcon as d } from "../parts/EmptyStateIcon.js";
8
+ const c = p(({ title: o, description: a, actions: e, ...r }, i) => {
9
+ const m = l().formatMessage({
10
+ id: "unity:component:empty-state:waiting-for-data:title",
11
+ defaultMessage: "No available results yet"
12
+ });
13
+ return /* @__PURE__ */ n(s, { ref: i, ...r, children: [
14
+ /* @__PURE__ */ t(d, { icon: "InfoOutlined", variant: "neutral" }),
15
+ /* @__PURE__ */ t(
16
+ y,
17
+ {
18
+ title: o || m,
19
+ description: a
20
+ }
21
+ ),
22
+ e && /* @__PURE__ */ t(f, { children: e })
23
+ ] });
24
+ });
25
+ c.displayName = "EmptyStateWaitingForData";
26
+ export {
27
+ c as EmptyStateWaitingForData
28
+ };
@@ -10,23 +10,32 @@ const g = ({
10
10
  isLoading: o,
11
11
  shouldModeChange: p
12
12
  }) => {
13
- const i = r(null), e = r(null), l = r(!0), { mode: t, enterEditMode: s, exitEditMode: d } = w({
13
+ const t = r(null), e = r(null), l = r(!0), { mode: i, enterEditMode: s, exitEditMode: d } = w({
14
14
  mode: a,
15
15
  defaultMode: F,
16
16
  onModeChange: x,
17
17
  shouldModeChange: p
18
18
  }), n = `inline-field-${b()}`, c = `${n}__edit-view`, I = E(
19
19
  () => ({
20
- mode: t,
20
+ mode: i,
21
21
  enterEditMode: s,
22
22
  exitEditMode: d,
23
23
  fieldId: n,
24
24
  isLoading: o,
25
- triggerRef: i,
25
+ triggerRef: t,
26
26
  editViewRef: e,
27
27
  editViewId: c
28
28
  }),
29
- [t, s, d, n, o, c]
29
+ [
30
+ i,
31
+ s,
32
+ d,
33
+ n,
34
+ o,
35
+ t,
36
+ e,
37
+ c
38
+ ]
30
39
  ), u = M(() => {
31
40
  if (e.current) {
32
41
  const f = e.current.querySelectorAll(
@@ -40,8 +49,8 @@ const g = ({
40
49
  l.current = !1;
41
50
  return;
42
51
  }
43
- t === "edit" ? u() : i.current && i.current.focus();
44
- }, [t, u]), /* @__PURE__ */ R(V.Provider, { value: I, children: m });
52
+ i === "edit" ? u() : t.current && t.current.focus();
53
+ }, [i, u]), /* @__PURE__ */ R(V.Provider, { value: I, children: m });
45
54
  };
46
55
  g.displayName = "InlineField";
47
56
  export {
@@ -19,5 +19,17 @@ export interface InlineFieldGroupContextValue {
19
19
  editButtonRef?: RefObject<HTMLButtonElement>;
20
20
  /** Ref to the edit view container for focus management */
21
21
  editViewRef?: RefObject<HTMLFieldSetElement>;
22
+ /** Custom label for the edit button */
23
+ editLabel?: string;
24
+ /** Custom label for the save button */
25
+ saveLabel?: string;
26
+ /** Custom label for the cancel button */
27
+ cancelLabel?: string;
28
+ /** Callback fired when edit button is clicked */
29
+ onEditPress?: () => void;
30
+ /** Callback fired when save button is clicked */
31
+ onSavePress?: () => void;
32
+ /** Callback fired when cancel button is clicked */
33
+ onCancelPress?: () => void;
22
34
  }
23
35
  export declare const InlineFieldGroupContext: import('react').Context<InlineFieldGroupContextValue | undefined>;
@@ -52,6 +52,13 @@ export interface InlineFieldGroupProps extends PropsWithChildren {
52
52
  * If not provided, aria-labelledby will reference the header title.
53
53
  */
54
54
  'aria-label'?: string;
55
+ /**
56
+ * Indicates whether the component or element should track and respond to focus containment.
57
+ * When set to true, the focus is constrained within the component, preventing focus from
58
+ * moving outside its boundaries.
59
+ * @default false
60
+ */
61
+ containFocus?: boolean;
55
62
  /**
56
63
  * Success message to announce when save succeeds.
57
64
  * If not provided, no success announcement is made.
@@ -62,6 +69,38 @@ export interface InlineFieldGroupProps extends PropsWithChildren {
62
69
  * If not provided, generic validation errors are announced.
63
70
  */
64
71
  errorMessage?: string;
72
+ /**
73
+ * Custom label for the edit button.
74
+ * @default "Edit" (translated)
75
+ */
76
+ editLabel?: string;
77
+ /**
78
+ * Custom label for the save button.
79
+ * @default "Save" (translated)
80
+ */
81
+ saveLabel?: string;
82
+ /**
83
+ * Custom label for the cancel button.
84
+ * @default "Cancel" (translated)
85
+ */
86
+ cancelLabel?: string;
87
+ /**
88
+ * Optional callback fired when the edit button is clicked.
89
+ * This is called before entering edit mode and is useful for analytics or side effects.
90
+ */
91
+ onEditPress?: () => void;
92
+ /**
93
+ * Optional callback fired when the save button is clicked.
94
+ * This is called before form submission and is useful for analytics or side effects.
95
+ * Note: Form submission is handled via the form's onSubmit configuration.
96
+ */
97
+ onSavePress?: () => void;
98
+ /**
99
+ * Optional callback fired when the cancel button is clicked.
100
+ * This is called before canceling and is useful for analytics or side effects.
101
+ * The form will be reset and edit mode exited automatically.
102
+ */
103
+ onCancelPress?: () => void;
65
104
  }
66
105
  /**
67
106
  * InlineFieldGroup enables group-level inline editing with read/edit mode switching.
@@ -1,112 +1,123 @@
1
- import { jsx as x, jsxs as z } from "react/jsx-runtime";
2
- import { forwardRef as J, useRef as l, useState as V, useEffect as r, useCallback as P, useImperativeHandle as Q, useMemo as W } from "react";
3
- import { uyTv as X } from "@payfit/unity-themes";
4
- import { useStore as Y } from "@tanstack/react-form";
5
- import { useId as Z, useKeyboard as L, FocusScope as ee } from "react-aria";
6
- import { useIntl as te } from "react-intl";
7
- import { useFormContext as ie } from "../../hooks/tanstack-form-context.js";
8
- import { useInlineFieldGroupMode as re } from "./hooks/useInlineFieldGroupMode.js";
9
- import { InlineFieldGroupContext as oe } from "./InlineFieldGroup.context.js";
10
- const se = X({
1
+ import { jsx as n, jsxs as te } from "react/jsx-runtime";
2
+ import { forwardRef as ie, useRef as a, useState as O, useEffect as r, useCallback as P, useImperativeHandle as re, useMemo as oe } from "react";
3
+ import { uyTv as se } from "@payfit/unity-themes";
4
+ import { useStore as ne } from "@tanstack/react-form";
5
+ import { useId as ue, useKeyboard as le, FocusScope as ae } from "react-aria";
6
+ import { useIntl as ce } from "react-intl";
7
+ import { useFormContext as me } from "../../hooks/tanstack-form-context.js";
8
+ import { useBreakpointListener as de } from "../../hooks/use-breakpoint-listener.js";
9
+ import { useInlineFieldGroupMode as fe } from "./hooks/useInlineFieldGroupMode.js";
10
+ import { InlineFieldGroupContext as pe } from "./InlineFieldGroup.context.js";
11
+ import { InlineFieldGroupActions as be } from "./parts/InlineFieldGroupActions.js";
12
+ const ve = se({
11
13
  slots: {
12
14
  form: "uy:flex uy:flex-col uy:gap-300"
13
15
  }
14
- }), D = (a) => {
15
- if (!a.current) return;
16
- const c = a.current.querySelector(
16
+ }), $ = (c) => {
17
+ if (!c.current) return;
18
+ const m = c.current.querySelector(
17
19
  '[aria-invalid="true"]'
18
20
  );
19
- c && c.focus();
20
- }, k = 5e3, ne = J(
21
+ m && m.focus();
22
+ }, H = 5e3, Se = ie(
21
23
  ({
22
- children: a,
23
- mode: c,
24
- defaultMode: j,
25
- onModeChange: q,
26
- shouldModeChange: m,
27
- isLoading: N,
28
- className: K,
29
- "aria-label": _,
24
+ children: c,
25
+ mode: m,
26
+ defaultMode: U,
27
+ onModeChange: z,
28
+ shouldModeChange: d,
29
+ isLoading: w,
30
+ className: J,
31
+ "aria-label": M,
32
+ containFocus: Q = !1,
30
33
  successMessage: g,
31
- errorMessage: d
32
- }, O) => {
33
- const s = Z(), A = `unity-InlineFieldGroup-${s}__header`, C = `unity-InlineFieldGroup-${s}__edit-view`, E = l(null), n = l(null), M = l(!0), [G, R] = V(""), [h, f] = V(""), p = te(), u = ie(), { mode: t, enterEditMode: b, exitEditMode: o } = re({
34
- mode: c,
35
- defaultMode: j,
36
- onModeChange: q,
37
- shouldModeChange: m
38
- }), { isSubmitting: i, isValid: v, isSubmitSuccessful: S, submissionAttempts: y } = Y(u.store, (e) => ({
34
+ errorMessage: f,
35
+ editLabel: _,
36
+ saveLabel: T,
37
+ cancelLabel: V,
38
+ onEditPress: k,
39
+ onSavePress: C,
40
+ onCancelPress: D
41
+ }, W) => {
42
+ const u = ue(), E = `unity-InlineFieldGroup-${u}__header`, q = `unity-InlineFieldGroup-${u}__edit-view`, p = a(null), o = a(null), j = a(!0), [G, R] = O(""), [h, b] = O(""), v = ce(), l = me(), B = de(), X = B === "xs" || B === "sm", { mode: t, enterEditMode: S, exitEditMode: s } = fe({
43
+ mode: m,
44
+ defaultMode: U,
45
+ onModeChange: z,
46
+ shouldModeChange: d
47
+ }), { isSubmitting: i, isValid: y, isSubmitSuccessful: F, submissionAttempts: I } = ne(l.store, (e) => ({
39
48
  isSubmitting: e.isSubmitting,
40
49
  isValid: e.isValid,
41
50
  isSubmitSuccessful: e.isSubmitSuccessful,
42
51
  submissionAttempts: e.submissionAttempts
43
- })), F = l(i), T = l(y);
52
+ })), x = a(i), K = a(I);
44
53
  r(() => {
45
- i && !F.current && (R(""), f(""));
54
+ i && !x.current && (R(""), b(""));
46
55
  }, [i]), r(() => {
47
- if (y > T.current && !v) {
48
- const I = d ?? p.formatMessage({
56
+ if (I > K.current && !y) {
57
+ const A = f ?? v.formatMessage({
49
58
  id: "unity:component:inline-field-group:validation-error",
50
59
  defaultMessage: "Please fix the errors before saving."
51
60
  });
52
- f(I), D(n);
61
+ b(A), $(o);
53
62
  }
54
- }, [y, v, d, p]), r(() => {
55
- F.current && !i && S && (g && R(g), o());
56
- }, [i, S, g, o]), r(() => {
57
- if (F.current && !i && !S && v) {
58
- const I = d ?? p.formatMessage({
63
+ }, [I, y, f, v]), r(() => {
64
+ x.current && !i && F && (g && R(g), s());
65
+ }, [i, F, g, s]), r(() => {
66
+ if (x.current && !i && !F && y) {
67
+ const A = f ?? v.formatMessage({
59
68
  id: "unity:component:inline-field-group:save-error",
60
69
  defaultMessage: "An error occurred while saving. Please try again."
61
70
  });
62
- f(I);
71
+ b(A);
63
72
  }
64
- }, [i, S, v, d, p]), r(() => {
65
- F.current = i, T.current = y;
73
+ }, [i, F, y, f, v]), r(() => {
74
+ x.current = i, K.current = I;
66
75
  });
67
- const $ = P(
76
+ const Y = P(
68
77
  (e) => {
69
- e.preventDefault(), e.stopPropagation(), u.handleSubmit();
78
+ e.preventDefault(), e.stopPropagation(), l.handleSubmit();
70
79
  },
71
- [u]
72
- ), w = P(() => {
73
- m !== void 0 && !m(t, "read") || (u.reset(), o());
74
- }, [u, t, o, m]);
75
- Q(
76
- O,
80
+ [l]
81
+ ), N = P(() => {
82
+ d !== void 0 && !d(t, "read") || (l.reset(), s());
83
+ }, [l, t, s, d]);
84
+ re(
85
+ W,
77
86
  () => ({
78
87
  focusFirstInvalidField: () => {
79
- D(n);
88
+ $(o);
80
89
  },
81
- exitEditMode: o,
82
- enterEditMode: b
90
+ exitEditMode: s,
91
+ enterEditMode: S
83
92
  }),
84
- [o, b]
93
+ [s, S]
85
94
  ), r(() => {
86
- if (M.current) {
87
- M.current = !1;
95
+ if (j.current) {
96
+ j.current = !1;
88
97
  return;
89
98
  }
90
99
  if (t === "edit") {
91
- if (n.current) {
92
- const e = n.current.querySelectorAll(
100
+ if (o.current) {
101
+ const e = o.current.querySelectorAll(
93
102
  'input, select, textarea, [tabindex]:not([tabindex="-1"])'
94
103
  );
95
104
  e.length > 0 && e[0].focus();
96
105
  }
97
106
  } else
98
- E.current && E.current.focus();
107
+ requestAnimationFrame(() => {
108
+ p.current && p.current.focus();
109
+ });
99
110
  }, [t]);
100
- const { keyboardProps: B } = L({
111
+ const { keyboardProps: Z } = le({
101
112
  onKeyDown: (e) => {
102
- e.key === "Escape" && t === "edit" && (e.preventDefault(), w());
113
+ e.key === "Escape" && t === "edit" && (e.preventDefault(), N());
103
114
  }
104
115
  });
105
116
  r(() => {
106
117
  if (G) {
107
118
  const e = setTimeout(() => {
108
119
  R("");
109
- }, k);
120
+ }, H);
110
121
  return () => {
111
122
  clearTimeout(e);
112
123
  };
@@ -114,47 +125,62 @@ const se = X({
114
125
  }, [G]), r(() => {
115
126
  if (h) {
116
127
  const e = setTimeout(() => {
117
- f("");
118
- }, k);
128
+ b("");
129
+ }, H);
119
130
  return () => {
120
131
  clearTimeout(e);
121
132
  };
122
133
  }
123
134
  }, [h]);
124
- const H = W(
135
+ const L = oe(
125
136
  () => ({
126
137
  mode: t,
127
- enterEditMode: b,
128
- exitEditMode: w,
129
- groupId: s,
130
- headerId: A,
131
- editViewId: C,
132
- isLoading: N,
133
- editButtonRef: E,
134
- editViewRef: n
138
+ enterEditMode: S,
139
+ exitEditMode: N,
140
+ groupId: u,
141
+ headerId: E,
142
+ editViewId: q,
143
+ isLoading: w,
144
+ editButtonRef: p,
145
+ editViewRef: o,
146
+ editLabel: _,
147
+ saveLabel: T,
148
+ cancelLabel: V,
149
+ onEditPress: k,
150
+ onSavePress: C,
151
+ onCancelPress: D
135
152
  }),
136
153
  [
137
154
  t,
138
- b,
155
+ S,
156
+ N,
157
+ u,
158
+ E,
159
+ q,
139
160
  w,
140
- s,
141
- A,
161
+ p,
162
+ o,
163
+ _,
164
+ T,
165
+ V,
166
+ k,
142
167
  C,
143
- N
168
+ D
144
169
  ]
145
- ), { form: U } = se();
146
- return /* @__PURE__ */ x(oe.Provider, { value: H, children: /* @__PURE__ */ x(
170
+ ), { form: ee } = ve();
171
+ return /* @__PURE__ */ n(pe.Provider, { value: L, children: /* @__PURE__ */ n(
147
172
  "form",
148
173
  {
149
- ...B,
150
- id: s,
151
- className: U({ className: K }),
152
- onSubmit: $,
153
- "aria-label": _,
154
- "aria-labelledby": _ ? void 0 : A,
155
- children: /* @__PURE__ */ z(ee, { contain: t === "edit", children: [
156
- a,
157
- /* @__PURE__ */ x(
174
+ ...Z,
175
+ id: u,
176
+ className: ee({ className: J }),
177
+ onSubmit: Y,
178
+ "aria-label": M,
179
+ "aria-labelledby": M ? void 0 : E,
180
+ children: /* @__PURE__ */ te(ae, { contain: Q && t === "edit", children: [
181
+ c,
182
+ X && /* @__PURE__ */ n("div", { className: "uy:flex", children: /* @__PURE__ */ n(be, { orientation: "vertical" }) }),
183
+ /* @__PURE__ */ n(
158
184
  "div",
159
185
  {
160
186
  role: "status",
@@ -164,7 +190,7 @@ const se = X({
164
190
  children: G
165
191
  }
166
192
  ),
167
- /* @__PURE__ */ x(
193
+ /* @__PURE__ */ n(
168
194
  "div",
169
195
  {
170
196
  role: "alert",
@@ -179,7 +205,7 @@ const se = X({
179
205
  ) });
180
206
  }
181
207
  );
182
- ne.displayName = "InlineFieldGroup";
208
+ Se.displayName = "InlineFieldGroup";
183
209
  export {
184
- ne as InlineFieldGroup
210
+ Se as InlineFieldGroup
185
211
  };
@@ -0,0 +1,24 @@
1
+ import { ReactNode } from 'react';
2
+ export interface InlineFieldGroupActionsProps {
3
+ /**
4
+ * Layout orientation for the action buttons.
5
+ * - horizontal: buttons in a row (desktop/header)
6
+ * - vertical: buttons stacked (mobile/bottom)
7
+ * @default 'horizontal'
8
+ */
9
+ orientation?: 'horizontal' | 'vertical';
10
+ /**
11
+ * Additional custom actions to render alongside the default buttons.
12
+ */
13
+ customActions?: ReactNode;
14
+ }
15
+ /**
16
+ * InlineFieldGroupActions renders the edit/save/cancel action buttons.
17
+ * This is an internal component used by InlineFieldGroupHeader and InlineFieldGroup
18
+ * to provide responsive button placement.
19
+ * @internal
20
+ */
21
+ export declare function InlineFieldGroupActions({ orientation, customActions, }: InlineFieldGroupActionsProps): import("react/jsx-runtime").JSX.Element;
22
+ export declare namespace InlineFieldGroupActions {
23
+ var displayName: string;
24
+ }