@payfit/unity-components 2.5.6 → 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.
- package/dist/esm/components/empty-state/EmptyState.d.ts +48 -0
- package/dist/esm/components/empty-state/EmptyState.js +25 -0
- package/dist/esm/components/empty-state/EmptyState.variants.d.ts +59 -0
- package/dist/esm/components/empty-state/EmptyState.variants.js +24 -0
- package/dist/esm/components/empty-state/parts/EmptyStateActions.d.ts +39 -0
- package/dist/esm/components/empty-state/parts/EmptyStateActions.js +17 -0
- package/dist/esm/components/empty-state/parts/EmptyStateContent.d.ts +40 -0
- package/dist/esm/components/empty-state/parts/EmptyStateContent.js +21 -0
- package/dist/esm/components/empty-state/parts/EmptyStateIcon.d.ts +41 -0
- package/dist/esm/components/empty-state/parts/EmptyStateIcon.js +14 -0
- package/dist/esm/components/empty-state/presets/EmptyStateGetStarted.d.ts +41 -0
- package/dist/esm/components/empty-state/presets/EmptyStateGetStarted.js +28 -0
- package/dist/esm/components/empty-state/presets/EmptyStateGoodJob.d.ts +29 -0
- package/dist/esm/components/empty-state/presets/EmptyStateGoodJob.js +55 -0
- package/dist/esm/components/empty-state/presets/EmptyStateNoSearchResults.d.ts +38 -0
- package/dist/esm/components/empty-state/presets/EmptyStateNoSearchResults.js +28 -0
- package/dist/esm/components/empty-state/presets/EmptyStateUpgradeRequired.d.ts +37 -0
- package/dist/esm/components/empty-state/presets/EmptyStateUpgradeRequired.js +28 -0
- package/dist/esm/components/empty-state/presets/EmptyStateUseDesktop.d.ts +28 -0
- package/dist/esm/components/empty-state/presets/EmptyStateUseDesktop.js +26 -0
- package/dist/esm/components/empty-state/presets/EmptyStateWaitingForData.d.ts +38 -0
- package/dist/esm/components/empty-state/presets/EmptyStateWaitingForData.js +28 -0
- package/dist/esm/components/inline-field/InlineField.js +15 -6
- package/dist/esm/components/inline-field-group/InlineFieldGroup.context.d.ts +12 -0
- package/dist/esm/components/inline-field-group/InlineFieldGroup.d.ts +39 -0
- package/dist/esm/components/inline-field-group/InlineFieldGroup.js +119 -93
- package/dist/esm/components/inline-field-group/parts/InlineFieldGroupActions.d.ts +24 -0
- package/dist/esm/components/inline-field-group/parts/InlineFieldGroupActions.js +158 -0
- package/dist/esm/components/inline-field-group/parts/InlineFieldGroupHeader.d.ts +11 -35
- package/dist/esm/components/inline-field-group/parts/InlineFieldGroupHeader.js +27 -94
- package/dist/esm/index.d.ts +10 -0
- package/dist/esm/index.js +431 -411
- package/i18n/en-GB.json +9 -0
- package/i18n/es-ES.json +9 -0
- package/i18n/fr-FR.json +9 -0
- package/package.json +8 -8
|
@@ -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
|
|
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:
|
|
20
|
+
mode: i,
|
|
21
21
|
enterEditMode: s,
|
|
22
22
|
exitEditMode: d,
|
|
23
23
|
fieldId: n,
|
|
24
24
|
isLoading: o,
|
|
25
|
-
triggerRef:
|
|
25
|
+
triggerRef: t,
|
|
26
26
|
editViewRef: e,
|
|
27
27
|
editViewId: c
|
|
28
28
|
}),
|
|
29
|
-
[
|
|
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
|
-
|
|
44
|
-
}, [
|
|
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
|
|
2
|
-
import { forwardRef as
|
|
3
|
-
import { uyTv as
|
|
4
|
-
import { useStore as
|
|
5
|
-
import { useId as
|
|
6
|
-
import { useIntl as
|
|
7
|
-
import { useFormContext as
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
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
|
-
}),
|
|
15
|
-
if (!
|
|
16
|
-
const
|
|
16
|
+
}), $ = (c) => {
|
|
17
|
+
if (!c.current) return;
|
|
18
|
+
const m = c.current.querySelector(
|
|
17
19
|
'[aria-invalid="true"]'
|
|
18
20
|
);
|
|
19
|
-
|
|
20
|
-
},
|
|
21
|
+
m && m.focus();
|
|
22
|
+
}, H = 5e3, Se = ie(
|
|
21
23
|
({
|
|
22
|
-
children:
|
|
23
|
-
mode:
|
|
24
|
-
defaultMode:
|
|
25
|
-
onModeChange:
|
|
26
|
-
shouldModeChange:
|
|
27
|
-
isLoading:
|
|
28
|
-
className:
|
|
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:
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
})),
|
|
52
|
+
})), x = a(i), K = a(I);
|
|
44
53
|
r(() => {
|
|
45
|
-
i && !
|
|
54
|
+
i && !x.current && (R(""), b(""));
|
|
46
55
|
}, [i]), r(() => {
|
|
47
|
-
if (
|
|
48
|
-
const
|
|
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
|
-
|
|
61
|
+
b(A), $(o);
|
|
53
62
|
}
|
|
54
|
-
}, [
|
|
55
|
-
|
|
56
|
-
}, [i,
|
|
57
|
-
if (
|
|
58
|
-
const
|
|
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
|
-
|
|
71
|
+
b(A);
|
|
63
72
|
}
|
|
64
|
-
}, [i,
|
|
65
|
-
|
|
73
|
+
}, [i, F, y, f, v]), r(() => {
|
|
74
|
+
x.current = i, K.current = I;
|
|
66
75
|
});
|
|
67
|
-
const
|
|
76
|
+
const Y = P(
|
|
68
77
|
(e) => {
|
|
69
|
-
e.preventDefault(), e.stopPropagation(),
|
|
78
|
+
e.preventDefault(), e.stopPropagation(), l.handleSubmit();
|
|
70
79
|
},
|
|
71
|
-
[
|
|
72
|
-
),
|
|
73
|
-
|
|
74
|
-
}, [
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
88
|
+
$(o);
|
|
80
89
|
},
|
|
81
|
-
exitEditMode:
|
|
82
|
-
enterEditMode:
|
|
90
|
+
exitEditMode: s,
|
|
91
|
+
enterEditMode: S
|
|
83
92
|
}),
|
|
84
|
-
[
|
|
93
|
+
[s, S]
|
|
85
94
|
), r(() => {
|
|
86
|
-
if (
|
|
87
|
-
|
|
95
|
+
if (j.current) {
|
|
96
|
+
j.current = !1;
|
|
88
97
|
return;
|
|
89
98
|
}
|
|
90
99
|
if (t === "edit") {
|
|
91
|
-
if (
|
|
92
|
-
const e =
|
|
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
|
-
|
|
107
|
+
requestAnimationFrame(() => {
|
|
108
|
+
p.current && p.current.focus();
|
|
109
|
+
});
|
|
99
110
|
}, [t]);
|
|
100
|
-
const { keyboardProps:
|
|
111
|
+
const { keyboardProps: Z } = le({
|
|
101
112
|
onKeyDown: (e) => {
|
|
102
|
-
e.key === "Escape" && t === "edit" && (e.preventDefault(),
|
|
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
|
-
},
|
|
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
|
-
|
|
118
|
-
},
|
|
128
|
+
b("");
|
|
129
|
+
}, H);
|
|
119
130
|
return () => {
|
|
120
131
|
clearTimeout(e);
|
|
121
132
|
};
|
|
122
133
|
}
|
|
123
134
|
}, [h]);
|
|
124
|
-
const
|
|
135
|
+
const L = oe(
|
|
125
136
|
() => ({
|
|
126
137
|
mode: t,
|
|
127
|
-
enterEditMode:
|
|
128
|
-
exitEditMode:
|
|
129
|
-
groupId:
|
|
130
|
-
headerId:
|
|
131
|
-
editViewId:
|
|
132
|
-
isLoading:
|
|
133
|
-
editButtonRef:
|
|
134
|
-
editViewRef:
|
|
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
|
-
|
|
155
|
+
S,
|
|
156
|
+
N,
|
|
157
|
+
u,
|
|
158
|
+
E,
|
|
159
|
+
q,
|
|
139
160
|
w,
|
|
140
|
-
|
|
141
|
-
|
|
161
|
+
p,
|
|
162
|
+
o,
|
|
163
|
+
_,
|
|
164
|
+
T,
|
|
165
|
+
V,
|
|
166
|
+
k,
|
|
142
167
|
C,
|
|
143
|
-
|
|
168
|
+
D
|
|
144
169
|
]
|
|
145
|
-
), { form:
|
|
146
|
-
return /* @__PURE__ */
|
|
170
|
+
), { form: ee } = ve();
|
|
171
|
+
return /* @__PURE__ */ n(pe.Provider, { value: L, children: /* @__PURE__ */ n(
|
|
147
172
|
"form",
|
|
148
173
|
{
|
|
149
|
-
...
|
|
150
|
-
id:
|
|
151
|
-
className:
|
|
152
|
-
onSubmit:
|
|
153
|
-
"aria-label":
|
|
154
|
-
"aria-labelledby":
|
|
155
|
-
children: /* @__PURE__ */
|
|
156
|
-
|
|
157
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
-
|
|
208
|
+
Se.displayName = "InlineFieldGroup";
|
|
183
209
|
export {
|
|
184
|
-
|
|
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
|
+
}
|