@multiplatform.one/forms 7.65.0 → 7.65.2
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/cjs/ControlGroup/index.cjs +58 -57
- package/dist/cjs/ControlGroup/index.native.js +58 -57
- package/dist/cjs/ControlGroup/index.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/useFloatingPanel.cjs +1 -1
- package/dist/cjs/FloatingPanel/useFloatingPanel.native.js +1 -1
- package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/cjs/InputParts/index.cjs +83 -6
- package/dist/cjs/InputParts/index.native.js +108 -6
- package/dist/cjs/InputParts/index.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/SystemColorField.cjs +1 -0
- package/dist/cjs/fields/ColorPicker/SystemColorField.native.js +1 -0
- package/dist/cjs/fields/ColorPicker/SystemColorField.native.js.map +1 -1
- package/dist/cjs/shared/groupContext.cjs +5 -1
- package/dist/cjs/shared/groupContext.native.js +6 -0
- package/dist/cjs/shared/groupContext.native.js.map +1 -1
- package/dist/esm/ControlGroup/index.mjs +59 -58
- package/dist/esm/ControlGroup/index.mjs.map +1 -1
- package/dist/esm/ControlGroup/index.native.js +59 -58
- package/dist/esm/ControlGroup/index.native.js.map +1 -1
- package/dist/esm/FloatingPanel/useFloatingPanel.mjs +1 -1
- package/dist/esm/FloatingPanel/useFloatingPanel.mjs.map +1 -1
- package/dist/esm/FloatingPanel/useFloatingPanel.native.js +1 -1
- package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/esm/InputParts/index.mjs +85 -9
- package/dist/esm/InputParts/index.mjs.map +1 -1
- package/dist/esm/InputParts/index.native.js +110 -9
- package/dist/esm/InputParts/index.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/SystemColorField.mjs +1 -0
- package/dist/esm/fields/ColorPicker/SystemColorField.mjs.map +1 -1
- package/dist/esm/fields/ColorPicker/SystemColorField.native.js +1 -0
- package/dist/esm/fields/ColorPicker/SystemColorField.native.js.map +1 -1
- package/dist/esm/shared/groupContext.mjs +3 -1
- package/dist/esm/shared/groupContext.mjs.map +1 -1
- package/dist/esm/shared/groupContext.native.js +5 -1
- package/dist/esm/shared/groupContext.native.js.map +1 -1
- package/dist/jsx/ControlGroup/index.mjs +59 -58
- package/dist/jsx/ControlGroup/index.mjs.map +1 -1
- package/dist/jsx/ControlGroup/index.native.js +58 -57
- package/dist/jsx/ControlGroup/index.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/useFloatingPanel.mjs +1 -1
- package/dist/jsx/FloatingPanel/useFloatingPanel.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/useFloatingPanel.native.js +1 -1
- package/dist/jsx/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/jsx/InputParts/index.mjs +85 -9
- package/dist/jsx/InputParts/index.mjs.map +1 -1
- package/dist/jsx/InputParts/index.native.js +108 -6
- package/dist/jsx/InputParts/index.native.js.map +1 -1
- package/dist/jsx/fields/ColorPicker/SystemColorField.mjs +1 -0
- package/dist/jsx/fields/ColorPicker/SystemColorField.mjs.map +1 -1
- package/dist/jsx/fields/ColorPicker/SystemColorField.native.js +1 -0
- package/dist/jsx/fields/ColorPicker/SystemColorField.native.js.map +1 -1
- package/dist/jsx/shared/groupContext.mjs +3 -1
- package/dist/jsx/shared/groupContext.mjs.map +1 -1
- package/dist/jsx/shared/groupContext.native.js +6 -0
- package/dist/jsx/shared/groupContext.native.js.map +1 -1
- package/package.json +8 -8
- package/src/ControlGroup/ControlGroup.spec.tsx +30 -0
- package/src/ControlGroup/index.tsx +81 -77
- package/src/FloatingPanel/useFloatingPanel.ts +1 -1
- package/src/InputParts/index.tsx +119 -5
- package/src/InputParts/placeholderOverlay.native.spec.tsx +229 -0
- package/src/fields/ColorPicker/SystemColorField.tsx +1 -0
- package/src/fields/Input/Input.stories.tsx +36 -0
- package/src/shared/groupContext.ts +3 -0
- package/types/ControlGroup/index.d.ts.map +1 -1
- package/types/InputParts/index.d.ts +8 -0
- package/types/InputParts/index.d.ts.map +1 -1
- package/types/fields/ColorPicker/SystemColorField.d.ts.map +1 -1
- package/types/shared/groupContext.d.ts +2 -0
- package/types/shared/groupContext.d.ts.map +1 -1
package/src/InputParts/index.tsx
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
type ReactNode,
|
|
12
12
|
} from "react";
|
|
13
13
|
import type { ComponentProps, Ref, RefObject } from "react";
|
|
14
|
-
import { Pressable as RNPressable } from "react-native";
|
|
14
|
+
import { Platform, Pressable as RNPressable } from "react-native";
|
|
15
15
|
import type {
|
|
16
16
|
ColorTokens,
|
|
17
17
|
FontSizeTokens,
|
|
@@ -57,7 +57,7 @@ import {
|
|
|
57
57
|
type RecipeFamilyName,
|
|
58
58
|
} from "@multiplatform.one/theme";
|
|
59
59
|
import { formButtonColors, formCommonColors, formInputColors } from "../shared/colorRamps";
|
|
60
|
-
import { useControlGrouped } from "../shared/groupContext";
|
|
60
|
+
import { useControlGroupVertical, useControlGrouped } from "../shared/groupContext";
|
|
61
61
|
import { nativeAutoFocus } from "../shared/nativeAutoFocus";
|
|
62
62
|
import { pressSlopProps } from "../shared/pressSlopProps";
|
|
63
63
|
import { useIsInTableCell } from "../shared/tableCellContext";
|
|
@@ -382,6 +382,7 @@ const InputGroupImpl = InputGroupFrame.styleable<{
|
|
|
382
382
|
const hydrationTouch = useTouchSurface();
|
|
383
383
|
const { knobProps, control, disabledState } = useResolvedKnobs();
|
|
384
384
|
const grouped = useControlGrouped();
|
|
385
|
+
const groupedVertical = useControlGroupVertical();
|
|
385
386
|
const inTableCell = useIsInTableCell();
|
|
386
387
|
// Native Pressable owns onPress; do not also pass it to XGroup (double-fire).
|
|
387
388
|
const framePressProps = isWeb ? { onPress, disabled } : { disabled };
|
|
@@ -550,7 +551,9 @@ const InputGroupImpl = InputGroupFrame.styleable<{
|
|
|
550
551
|
borderWidth={0}
|
|
551
552
|
borderRadius={0}
|
|
552
553
|
backgroundColor="transparent"
|
|
553
|
-
|
|
554
|
+
{...(groupedVertical
|
|
555
|
+
? { flexGrow: 0, flexShrink: 0, flexBasis: "auto", height: controlFragment.height }
|
|
556
|
+
: { flex: 1 })}
|
|
554
557
|
elevation={undefined}
|
|
555
558
|
{...props}
|
|
556
559
|
{...passthroughSizeProps}
|
|
@@ -717,6 +720,62 @@ const InputFrame = styled(TInput, {
|
|
|
717
720
|
} as const,
|
|
718
721
|
});
|
|
719
722
|
|
|
723
|
+
const InputPlaceholderText = styled(Text, {
|
|
724
|
+
context: InputContext,
|
|
725
|
+
variants: {
|
|
726
|
+
touch: { true: {}, false: {} },
|
|
727
|
+
size: {
|
|
728
|
+
...(recipeFamilies.control.typeVariants ?? sizeRecipeTypeVariants),
|
|
729
|
+
"...size": sizeRecipeTypeFallback,
|
|
730
|
+
},
|
|
731
|
+
} as const,
|
|
732
|
+
});
|
|
733
|
+
|
|
734
|
+
/**
|
|
735
|
+
* FZ-8144: an iOS update moved UIKit's own placeholder 3pt below the typed
|
|
736
|
+
* line on Clay's phone, while RN Text stayed put. On iOS a single-line Area
|
|
737
|
+
* paints its visible placeholder as Text centred like the typed line, and
|
|
738
|
+
* keeps the native one transparent so VoiceOver still reads it. Multiline
|
|
739
|
+
* stays native: RN draws that placeholder itself, not UIKit.
|
|
740
|
+
*/
|
|
741
|
+
export function areaPaintsPlaceholderOverlay(multiline?: boolean): boolean {
|
|
742
|
+
return !isWeb && Platform.OS === "ios" && !multiline;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
const PLACEHOLDER_FONT_PROPS = [
|
|
746
|
+
"fontSize",
|
|
747
|
+
"fontFamily",
|
|
748
|
+
"fontWeight",
|
|
749
|
+
"fontStyle",
|
|
750
|
+
"letterSpacing",
|
|
751
|
+
"textAlign",
|
|
752
|
+
"writingDirection",
|
|
753
|
+
"allowFontScaling",
|
|
754
|
+
"maxFontSizeMultiplier",
|
|
755
|
+
] as const;
|
|
756
|
+
|
|
757
|
+
const PLACEHOLDER_INSET_PROPS = [
|
|
758
|
+
"padding",
|
|
759
|
+
"paddingHorizontal",
|
|
760
|
+
"paddingLeft",
|
|
761
|
+
"paddingRight",
|
|
762
|
+
"paddingStart",
|
|
763
|
+
"paddingEnd",
|
|
764
|
+
] as const;
|
|
765
|
+
|
|
766
|
+
function pickDefined(
|
|
767
|
+
source: Record<string, unknown>,
|
|
768
|
+
keys: readonly string[],
|
|
769
|
+
): Record<string, unknown> {
|
|
770
|
+
const out: Record<string, unknown> = {};
|
|
771
|
+
for (const key of keys) if (source[key] !== undefined) out[key] = source[key];
|
|
772
|
+
return out;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
function textOf(value: unknown): string {
|
|
776
|
+
return value == null ? "" : String(value);
|
|
777
|
+
}
|
|
778
|
+
|
|
720
779
|
const InputAreaImpl = InputFrame.styleable<{
|
|
721
780
|
secureTextEntry?: boolean;
|
|
722
781
|
keyboardType?: InputKeyboardType;
|
|
@@ -781,6 +840,27 @@ const InputAreaImpl = InputFrame.styleable<{
|
|
|
781
840
|
// pins width on Box, not Area, so it keeps the grow wrapper.
|
|
782
841
|
const hugWidth = flexProp === 0 || typeof widthProp === "number";
|
|
783
842
|
|
|
843
|
+
const {
|
|
844
|
+
placeholder,
|
|
845
|
+
placeholderTextColor: placeholderTextColorProp,
|
|
846
|
+
value,
|
|
847
|
+
defaultValue,
|
|
848
|
+
multiline,
|
|
849
|
+
} = props as {
|
|
850
|
+
placeholder?: string;
|
|
851
|
+
placeholderTextColor?: string;
|
|
852
|
+
value?: unknown;
|
|
853
|
+
defaultValue?: unknown;
|
|
854
|
+
multiline?: boolean;
|
|
855
|
+
};
|
|
856
|
+
const placeholderColor =
|
|
857
|
+
placeholderTextColorProp ?? theme.placeholderColor?.val ?? "$placeholderColor";
|
|
858
|
+
const overlay = areaPaintsPlaceholderOverlay(multiline);
|
|
859
|
+
const [liveText, setLiveText] = useState(() => textOf(defaultValue));
|
|
860
|
+
const shownText = value !== undefined ? textOf(value) : liveText;
|
|
861
|
+
const showOverlay = overlay && Boolean(placeholder) && shownText === "";
|
|
862
|
+
const fontProps = props as Record<string, unknown>;
|
|
863
|
+
|
|
784
864
|
return (
|
|
785
865
|
// LC-06/LC-10 (UX-P12, FZ-7853): in a table cell and in a form column
|
|
786
866
|
// alike, the flex wrapper and the raw input must be allowed to shrink
|
|
@@ -810,7 +890,6 @@ const InputAreaImpl = InputFrame.styleable<{
|
|
|
810
890
|
size={size}
|
|
811
891
|
{...knobProps.controlType}
|
|
812
892
|
color={knobProps.textAccentColor}
|
|
813
|
-
placeholderTextColor={theme.placeholderColor?.val ?? "$placeholderColor"}
|
|
814
893
|
{...(inTableCell || !hugWidth ? { width: "100%" as const, minWidth: 0 } : undefined)}
|
|
815
894
|
{...knobProps.body}
|
|
816
895
|
type={secureTextEntry ? "password" : props.type}
|
|
@@ -834,6 +913,7 @@ const InputAreaImpl = InputFrame.styleable<{
|
|
|
834
913
|
}
|
|
835
914
|
{...props}
|
|
836
915
|
{...nativeAutoFocus(props as { autoFocus?: boolean; autoFocusNative?: boolean })}
|
|
916
|
+
placeholderTextColor={overlay ? "transparent" : placeholderColor}
|
|
837
917
|
{...(flexProp != null ? { flex: flexProp } : undefined)}
|
|
838
918
|
{...(widthProp != null
|
|
839
919
|
? { width: widthProp, minWidth: minWidthProp, maxWidth: maxWidthProp }
|
|
@@ -862,18 +942,52 @@ const InputAreaImpl = InputFrame.styleable<{
|
|
|
862
942
|
}}
|
|
863
943
|
onBlur={(e: any) => {
|
|
864
944
|
setFocused(false);
|
|
945
|
+
if (overlay && typeof e?.nativeEvent?.text === "string") {
|
|
946
|
+
setLiveText(e.nativeEvent.text);
|
|
947
|
+
}
|
|
865
948
|
(onBlurProp as any)?.(e);
|
|
866
949
|
}}
|
|
867
950
|
onChange={
|
|
868
|
-
onChangeText || onChangeProp
|
|
951
|
+
onChangeText || onChangeProp || overlay
|
|
869
952
|
? (e: any) => {
|
|
870
953
|
const text = e.target?.value ?? e.nativeEvent?.text ?? "";
|
|
954
|
+
if (overlay) setLiveText(textOf(text));
|
|
871
955
|
onChangeText?.(text);
|
|
872
956
|
onChangeProp?.(e);
|
|
873
957
|
}
|
|
874
958
|
: undefined
|
|
875
959
|
}
|
|
876
960
|
/>
|
|
961
|
+
{showOverlay ? (
|
|
962
|
+
<View
|
|
963
|
+
aria-hidden
|
|
964
|
+
accessibilityElementsHidden
|
|
965
|
+
importantForAccessibility="no-hide-descendants"
|
|
966
|
+
pointerEvents="none"
|
|
967
|
+
position="absolute"
|
|
968
|
+
top={0}
|
|
969
|
+
bottom={0}
|
|
970
|
+
left={0}
|
|
971
|
+
right={0}
|
|
972
|
+
justifyContent="center"
|
|
973
|
+
{...pickDefined(fontProps, PLACEHOLDER_INSET_PROPS)}
|
|
974
|
+
testID="mp-placeholder-overlay"
|
|
975
|
+
>
|
|
976
|
+
<InputPlaceholderText
|
|
977
|
+
touch={hydrationTouch}
|
|
978
|
+
size={size}
|
|
979
|
+
{...knobProps.controlType}
|
|
980
|
+
{...knobProps.body}
|
|
981
|
+
{...pickDefined(fontProps, PLACEHOLDER_FONT_PROPS)}
|
|
982
|
+
color={placeholderColor as ColorTokens}
|
|
983
|
+
numberOfLines={1}
|
|
984
|
+
ellipsizeMode="tail"
|
|
985
|
+
accessible={false}
|
|
986
|
+
>
|
|
987
|
+
{placeholder}
|
|
988
|
+
</InputPlaceholderText>
|
|
989
|
+
</View>
|
|
990
|
+
) : null}
|
|
877
991
|
</View>
|
|
878
992
|
);
|
|
879
993
|
});
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
2
|
+
import { act, fireEvent } from "@testing-library/react";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import type { ColorTokens } from "tamagui";
|
|
5
|
+
import { Platform } from "react-native";
|
|
6
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
7
|
+
import { Input, areaPaintsPlaceholderOverlay } from "./index";
|
|
8
|
+
|
|
9
|
+
const env = vi.hoisted(() => ({ isWeb: false }));
|
|
10
|
+
|
|
11
|
+
vi.mock("tamagui", async (importOriginal) => {
|
|
12
|
+
const original = await importOriginal<typeof import("tamagui")>();
|
|
13
|
+
return Object.defineProperty({ ...original }, "isWeb", { get: () => env.isWeb });
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
const platform = Platform as { OS: string };
|
|
17
|
+
const webOS = platform.OS;
|
|
18
|
+
const overlayId = "mp-placeholder-overlay";
|
|
19
|
+
const hint = "8080=web, 8443=api, 9000=minio";
|
|
20
|
+
|
|
21
|
+
function field(container: HTMLElement): HTMLInputElement {
|
|
22
|
+
const input = container.querySelector("input");
|
|
23
|
+
if (!input) throw new Error("no input rendered");
|
|
24
|
+
return input;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function nativePlaceholderColor(container: HTMLElement): string {
|
|
28
|
+
return field(container).style.getPropertyValue("--t_placeholderColor").trim();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function Controlled({ initial = "" }: { initial?: string }) {
|
|
32
|
+
const [value, setValue] = useState(initial);
|
|
33
|
+
return (
|
|
34
|
+
<Input size="$3">
|
|
35
|
+
<Input.Area placeholder={hint} value={value} onChangeText={setValue} />
|
|
36
|
+
<button type="button" onClick={() => setValue("")}>
|
|
37
|
+
reset
|
|
38
|
+
</button>
|
|
39
|
+
</Input>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
env.isWeb = false;
|
|
45
|
+
platform.OS = "ios";
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
afterEach(() => {
|
|
49
|
+
platform.OS = webOS;
|
|
50
|
+
env.isWeb = true;
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
describe("FZ-8144 iOS placeholder on the typed line", () => {
|
|
54
|
+
it("paints only on iOS, single-line, never on web or Android", () => {
|
|
55
|
+
expect(areaPaintsPlaceholderOverlay()).toBe(true);
|
|
56
|
+
expect(areaPaintsPlaceholderOverlay(true)).toBe(false);
|
|
57
|
+
platform.OS = "android";
|
|
58
|
+
expect(areaPaintsPlaceholderOverlay()).toBe(false);
|
|
59
|
+
platform.OS = "ios";
|
|
60
|
+
env.isWeb = true;
|
|
61
|
+
expect(areaPaintsPlaceholderOverlay()).toBe(false);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("an empty Area draws the overlay and keeps the native placeholder transparent for VoiceOver", () => {
|
|
65
|
+
const { container, getByTestId } = renderWithProviders(
|
|
66
|
+
<Input size="$3">
|
|
67
|
+
<Input.Area placeholder={hint} />
|
|
68
|
+
</Input>,
|
|
69
|
+
);
|
|
70
|
+
const overlay = getByTestId(overlayId);
|
|
71
|
+
expect(overlay.textContent).toBe(hint);
|
|
72
|
+
expect(nativePlaceholderColor(container)).toBe("transparent");
|
|
73
|
+
expect(field(container).getAttribute("placeholder")).toBe(hint);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("the overlay is hidden from accessibility and takes no touches", () => {
|
|
77
|
+
const { getByTestId, queryByText } = renderWithProviders(
|
|
78
|
+
<Input size="$3">
|
|
79
|
+
<Input.Area placeholder={hint} />
|
|
80
|
+
</Input>,
|
|
81
|
+
);
|
|
82
|
+
const overlay = getByTestId(overlayId);
|
|
83
|
+
expect(overlay.getAttribute("aria-hidden")).toBe("true");
|
|
84
|
+
expect(getComputedStyle(overlay).pointerEvents).toBe("none");
|
|
85
|
+
expect(getComputedStyle(overlay).position).toBe("absolute");
|
|
86
|
+
expect(queryByText(hint, { ignore: "[aria-hidden] *, [aria-hidden]" })).toBeNull();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("follows the consumer's placeholder colour, the native one stays transparent", () => {
|
|
90
|
+
const { container, getByTestId } = renderWithProviders(
|
|
91
|
+
<Input size="$3">
|
|
92
|
+
<Input.Area placeholder={hint} placeholderTextColor={"rgb(1, 2, 3)" as ColorTokens} />
|
|
93
|
+
</Input>,
|
|
94
|
+
);
|
|
95
|
+
expect(nativePlaceholderColor(container)).toBe("transparent");
|
|
96
|
+
const text = getByTestId(overlayId).firstElementChild as HTMLElement;
|
|
97
|
+
expect(getComputedStyle(text).color).toBe("rgb(1, 2, 3)");
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("a filled Area renders no overlay", () => {
|
|
101
|
+
const { queryByTestId } = renderWithProviders(
|
|
102
|
+
<Input size="$3">
|
|
103
|
+
<Input.Area placeholder={hint} defaultValue="app.example.com" />
|
|
104
|
+
</Input>,
|
|
105
|
+
);
|
|
106
|
+
expect(queryByTestId(overlayId)).toBeNull();
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it("hides on the first typed character and returns when the field empties", () => {
|
|
110
|
+
const { container, queryByTestId } = renderWithProviders(
|
|
111
|
+
<Input size="$3">
|
|
112
|
+
<Input.Area placeholder={hint} />
|
|
113
|
+
</Input>,
|
|
114
|
+
);
|
|
115
|
+
expect(queryByTestId(overlayId)).not.toBeNull();
|
|
116
|
+
act(() => {
|
|
117
|
+
fireEvent.change(field(container), { target: { value: "a" } });
|
|
118
|
+
});
|
|
119
|
+
expect(queryByTestId(overlayId)).toBeNull();
|
|
120
|
+
act(() => {
|
|
121
|
+
fireEvent.change(field(container), { target: { value: "" } });
|
|
122
|
+
});
|
|
123
|
+
expect(queryByTestId(overlayId)).not.toBeNull();
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("hides while an IME composes, before any character commits", () => {
|
|
127
|
+
const { container, queryByTestId } = renderWithProviders(<Controlled />);
|
|
128
|
+
act(() => {
|
|
129
|
+
fireEvent.change(field(container), { target: { value: "か" } });
|
|
130
|
+
});
|
|
131
|
+
expect(queryByTestId(overlayId)).toBeNull();
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it("tracks a controlled value both ways", () => {
|
|
135
|
+
const { container, getByText, queryByTestId } = renderWithProviders(
|
|
136
|
+
<Controlled initial="web" />,
|
|
137
|
+
);
|
|
138
|
+
expect(queryByTestId(overlayId)).toBeNull();
|
|
139
|
+
act(() => {
|
|
140
|
+
fireEvent.click(getByText("reset"));
|
|
141
|
+
});
|
|
142
|
+
expect(queryByTestId(overlayId)).not.toBeNull();
|
|
143
|
+
act(() => {
|
|
144
|
+
fireEvent.change(field(container), { target: { value: "x" } });
|
|
145
|
+
});
|
|
146
|
+
expect(queryByTestId(overlayId)).toBeNull();
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it("multiline keeps the native placeholder, which RN draws itself", () => {
|
|
150
|
+
const { container, queryByTestId } = renderWithProviders(
|
|
151
|
+
<Input size="$3">
|
|
152
|
+
<Input.Area placeholder={hint} multiline />
|
|
153
|
+
</Input>,
|
|
154
|
+
);
|
|
155
|
+
expect(queryByTestId(overlayId)).toBeNull();
|
|
156
|
+
expect(nativePlaceholderColor(container)).not.toBe("transparent");
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it("Android and web keep the native placeholder", () => {
|
|
160
|
+
platform.OS = "android";
|
|
161
|
+
const android = renderWithProviders(
|
|
162
|
+
<Input size="$3">
|
|
163
|
+
<Input.Area placeholder={hint} />
|
|
164
|
+
</Input>,
|
|
165
|
+
);
|
|
166
|
+
expect(android.queryByTestId(overlayId)).toBeNull();
|
|
167
|
+
expect(nativePlaceholderColor(android.container)).not.toBe("transparent");
|
|
168
|
+
android.unmount();
|
|
169
|
+
platform.OS = "ios";
|
|
170
|
+
env.isWeb = true;
|
|
171
|
+
const web = renderWithProviders(
|
|
172
|
+
<Input size="$3">
|
|
173
|
+
<Input.Area placeholder={hint} />
|
|
174
|
+
</Input>,
|
|
175
|
+
);
|
|
176
|
+
expect(web.queryByTestId(overlayId)).toBeNull();
|
|
177
|
+
expect(nativePlaceholderColor(web.container)).not.toBe("transparent");
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it("sits on the typed line: fills the Area, centred, in the field's own font and size", () => {
|
|
181
|
+
for (const size of ["$3", "$4"] as const) {
|
|
182
|
+
const { container, getByTestId, unmount } = renderWithProviders(
|
|
183
|
+
<Input size={size}>
|
|
184
|
+
<Input.Area placeholder={hint} />
|
|
185
|
+
</Input>,
|
|
186
|
+
);
|
|
187
|
+
const overlay = getByTestId(overlayId);
|
|
188
|
+
const box = getComputedStyle(overlay);
|
|
189
|
+
expect(box.position).toBe("absolute");
|
|
190
|
+
for (const edge of ["top", "bottom", "left", "right"] as const) {
|
|
191
|
+
expect(box[edge]).toBe("0px");
|
|
192
|
+
}
|
|
193
|
+
expect(box.justifyContent).toBe("center");
|
|
194
|
+
const typed = getComputedStyle(field(container));
|
|
195
|
+
const text = getComputedStyle(overlay.firstElementChild as HTMLElement);
|
|
196
|
+
expect(text.fontSize).not.toBe("");
|
|
197
|
+
expect(text.fontSize).toBe(typed.fontSize);
|
|
198
|
+
expect(text.fontFamily).toBe(typed.fontFamily);
|
|
199
|
+
expect(text.fontWeight).toBe(typed.fontWeight);
|
|
200
|
+
expect(text.lineHeight).toBe(typed.lineHeight);
|
|
201
|
+
unmount();
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it("follows the Area's inset and RTL alignment", () => {
|
|
206
|
+
const { getByTestId } = renderWithProviders(
|
|
207
|
+
<Input size="$3">
|
|
208
|
+
<Input.Area placeholder={hint} paddingHorizontal={12} textAlign="right" />
|
|
209
|
+
</Input>,
|
|
210
|
+
);
|
|
211
|
+
const overlay = getByTestId(overlayId);
|
|
212
|
+
expect(getComputedStyle(overlay).paddingLeft).toBe("12px");
|
|
213
|
+
expect(getComputedStyle(overlay).paddingRight).toBe("12px");
|
|
214
|
+
const text = getComputedStyle(overlay.firstElementChild as HTMLElement);
|
|
215
|
+
expect(text.textAlign).toBe("right");
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it("the overlay text truncates to one line with a tail ellipsis", () => {
|
|
219
|
+
const { getByTestId } = renderWithProviders(
|
|
220
|
+
<Input size="$3">
|
|
221
|
+
<Input.Area placeholder={hint} />
|
|
222
|
+
</Input>,
|
|
223
|
+
);
|
|
224
|
+
const text = getByTestId(overlayId).firstElementChild as HTMLElement;
|
|
225
|
+
const style = getComputedStyle(text);
|
|
226
|
+
expect(style.whiteSpace).toBe("nowrap");
|
|
227
|
+
expect(style.textOverflow).toBe("ellipsis");
|
|
228
|
+
});
|
|
229
|
+
});
|
|
@@ -7,6 +7,7 @@ import { useState } from "react";
|
|
|
7
7
|
import { Input as TamaguiInput, XStack, YStack } from "tamagui";
|
|
8
8
|
import { Button } from "../../Button";
|
|
9
9
|
import { Form } from "../../Form";
|
|
10
|
+
import { SearchInput } from "../SearchInput";
|
|
10
11
|
import { Input } from "./index";
|
|
11
12
|
import { Paragraph } from "@multiplatform.one/theme";
|
|
12
13
|
|
|
@@ -114,6 +115,41 @@ export const Sizes: Story = {
|
|
|
114
115
|
),
|
|
115
116
|
};
|
|
116
117
|
|
|
118
|
+
/** FZ-8144: each row pairs an empty field with a typed one; the placeholder sits on the typed line. */
|
|
119
|
+
export const PlaceholderOnTypedLine: Story = {
|
|
120
|
+
name: "Placeholder on the typed line",
|
|
121
|
+
render: () => (
|
|
122
|
+
<YStack gap="$3" maxWidth={400}>
|
|
123
|
+
{(["$3", "$4"] as const).map((size) => (
|
|
124
|
+
<XStack key={`input${size}`} gap="$2">
|
|
125
|
+
<YStack flex={1}>
|
|
126
|
+
<Input size={size} label={`Empty ${size}`} labelHidden placeholder="8080=web" />
|
|
127
|
+
</YStack>
|
|
128
|
+
<YStack flex={1}>
|
|
129
|
+
<Input size={size} label={`Typed ${size}`} labelHidden defaultValue="8080=web" />
|
|
130
|
+
</YStack>
|
|
131
|
+
</XStack>
|
|
132
|
+
))}
|
|
133
|
+
{(["$3", "$4"] as const).map((size) => (
|
|
134
|
+
<XStack key={`search${size}`} gap="$2">
|
|
135
|
+
<YStack flex={1}>
|
|
136
|
+
<SearchInput size={size} placeholder="8080=web" clearable={false} />
|
|
137
|
+
</YStack>
|
|
138
|
+
<YStack flex={1}>
|
|
139
|
+
<SearchInput size={size} defaultValue="8080=web" clearable={false} />
|
|
140
|
+
</YStack>
|
|
141
|
+
</XStack>
|
|
142
|
+
))}
|
|
143
|
+
<Input
|
|
144
|
+
size="$3"
|
|
145
|
+
label="Long placeholder"
|
|
146
|
+
labelHidden
|
|
147
|
+
placeholder="8080=web, 8443=api, 9000=minio, 5432=postgres, 6379=redis"
|
|
148
|
+
/>
|
|
149
|
+
</YStack>
|
|
150
|
+
),
|
|
151
|
+
};
|
|
152
|
+
|
|
117
153
|
export const ReadOnly: Story = {
|
|
118
154
|
args: {
|
|
119
155
|
label: "Account id",
|
|
@@ -2,3 +2,6 @@ import { createContext, useContext } from "react";
|
|
|
2
2
|
|
|
3
3
|
export const ControlGroupCtx = createContext(false);
|
|
4
4
|
export const useControlGrouped = () => useContext(ControlGroupCtx);
|
|
5
|
+
|
|
6
|
+
export const ControlGroupVerticalCtx = createContext(false);
|
|
7
|
+
export const useControlGroupVertical = () => useContext(ControlGroupVerticalCtx);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ControlGroup/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAe,IAAI,EAAiB,MAAM,SAAS,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAmBxC,QAAA,MAAM,iBAAiB;;;6CAsBrB,CAAC;AAgCH,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,GAAG;IAC3D,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,iBAAS,qBAAqB,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,sBAAsB,2CAgC5E;AAED,eAAO,MAAM,iBAAiB;;CAE5B,CAAC;AAMH,MAAM,WAAW,iBAAkB,SAAQ,QAAQ,CAAC,OAAO,iBAAiB,CAAC;IAC3E,QAAQ,EAAE,SAAS,CAAC;IACpB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;CACzC;AAED,iBAAS,gBAAgB,CAAC,EAAE,QAAQ,EAAE,WAA0B,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ControlGroup/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAe,IAAI,EAAiB,MAAM,SAAS,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAmBxC,QAAA,MAAM,iBAAiB;;;6CAsBrB,CAAC;AAgCH,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,GAAG;IAC3D,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,iBAAS,qBAAqB,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,sBAAsB,2CAgC5E;AAED,eAAO,MAAM,iBAAiB;;CAE5B,CAAC;AAMH,MAAM,WAAW,iBAAkB,SAAQ,QAAQ,CAAC,OAAO,iBAAiB,CAAC;IAC3E,QAAQ,EAAE,SAAS,CAAC;IACpB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;CACzC;AAED,iBAAS,gBAAgB,CAAC,EAAE,QAAQ,EAAE,WAA0B,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,2CA6K9F;AAED,eAAO,MAAM,YAAY;;;;CAEvB,CAAC"}
|
|
@@ -111,6 +111,14 @@ export type InputModeValue = ComponentProps<typeof TInput>["inputMode"];
|
|
|
111
111
|
export declare function mapKeyboardTypeToInputMode(keyboardType?: string): MappedInputMode | undefined;
|
|
112
112
|
export declare function mapInputModeToKeyboardType(inputMode?: string): MappedKeyboardType | undefined;
|
|
113
113
|
export declare const inputSizeVariant: SizeVariantSpreadFunction<any>;
|
|
114
|
+
/**
|
|
115
|
+
* FZ-8144: an iOS update moved UIKit's own placeholder 3pt below the typed
|
|
116
|
+
* line on Clay's phone, while RN Text stayed put. On iOS a single-line Area
|
|
117
|
+
* paints its visible placeholder as Text centred like the typed line, and
|
|
118
|
+
* keeps the native one transparent so VoiceOver still reads it. Multiline
|
|
119
|
+
* stays native: RN draws that placeholder itself, not UIKit.
|
|
120
|
+
*/
|
|
121
|
+
export declare function areaPaintsPlaceholderOverlay(multiline?: boolean): boolean;
|
|
114
122
|
export interface InputActionProps {
|
|
115
123
|
/** Accessible name; the glyph is decorative. */
|
|
116
124
|
label: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/InputParts/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACV,cAAc,EACf,MAAM,SAAS,CAAC;AACjB,OAAO,EAEL,KAAK,IAAI,MAAM,EAWhB,MAAM,SAAS,CAAC;AACjB,OAAO,EAoBL,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;AAkClC,eAAO,MAAM,YAAY;UACjB,cAAc;eACT,MAAM;WACV,OAAO;YACN,WAAW,GAAG,MAAM;EACN,CAAC;AAmDzB,eAAO,MAAM,YAAY;uBACJ,OAAO;;EAE1B,CAAC;AAEH,wEAAwE;AACxE,eAAO,MAAM,eAAe,GAAI,QAAQ,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC;;;;CAYvE,CAAC;AAsBF,eAAO,MAAM,iBAAiB,QAgB5B,CAAC;AAIH,wBAAgB,yBAAyB,IAAI,IAAI,CAOhD;AAuBD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0B1B,CAAC;AAyCX,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAMA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/InputParts/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SystemColorField.d.ts","sourceRoot":"","sources":["../../../src/fields/ColorPicker/SystemColorField.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAMrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC1C,yDAAyD;IACzD,OAAO,EAAE,SAAS,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,OAAO,EACP,aAAa,EACb,KAAK,EACL,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,MAAM,EACN,cAAc,GACf,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"SystemColorField.d.ts","sourceRoot":"","sources":["../../../src/fields/ColorPicker/SystemColorField.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAMrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC1C,yDAAyD;IACzD,OAAO,EAAE,SAAS,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,OAAO,EACP,aAAa,EACb,KAAK,EACL,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,MAAM,EACN,cAAc,GACf,EAAE,qBAAqB,2CA8DvB"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export declare const ControlGroupCtx: import("react").Context<boolean>;
|
|
2
2
|
export declare const useControlGrouped: () => boolean;
|
|
3
|
+
export declare const ControlGroupVerticalCtx: import("react").Context<boolean>;
|
|
4
|
+
export declare const useControlGroupVertical: () => boolean;
|
|
3
5
|
//# sourceMappingURL=groupContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"groupContext.d.ts","sourceRoot":"","sources":["../../src/shared/groupContext.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,kCAAuB,CAAC;AACpD,eAAO,MAAM,iBAAiB,eAAoC,CAAC"}
|
|
1
|
+
{"version":3,"file":"groupContext.d.ts","sourceRoot":"","sources":["../../src/shared/groupContext.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,kCAAuB,CAAC;AACpD,eAAO,MAAM,iBAAiB,eAAoC,CAAC;AAEnE,eAAO,MAAM,uBAAuB,kCAAuB,CAAC;AAC5D,eAAO,MAAM,uBAAuB,eAA4C,CAAC"}
|