@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.
Files changed (70) hide show
  1. package/dist/cjs/ControlGroup/index.cjs +58 -57
  2. package/dist/cjs/ControlGroup/index.native.js +58 -57
  3. package/dist/cjs/ControlGroup/index.native.js.map +1 -1
  4. package/dist/cjs/FloatingPanel/useFloatingPanel.cjs +1 -1
  5. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js +1 -1
  6. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  7. package/dist/cjs/InputParts/index.cjs +83 -6
  8. package/dist/cjs/InputParts/index.native.js +108 -6
  9. package/dist/cjs/InputParts/index.native.js.map +1 -1
  10. package/dist/cjs/fields/ColorPicker/SystemColorField.cjs +1 -0
  11. package/dist/cjs/fields/ColorPicker/SystemColorField.native.js +1 -0
  12. package/dist/cjs/fields/ColorPicker/SystemColorField.native.js.map +1 -1
  13. package/dist/cjs/shared/groupContext.cjs +5 -1
  14. package/dist/cjs/shared/groupContext.native.js +6 -0
  15. package/dist/cjs/shared/groupContext.native.js.map +1 -1
  16. package/dist/esm/ControlGroup/index.mjs +59 -58
  17. package/dist/esm/ControlGroup/index.mjs.map +1 -1
  18. package/dist/esm/ControlGroup/index.native.js +59 -58
  19. package/dist/esm/ControlGroup/index.native.js.map +1 -1
  20. package/dist/esm/FloatingPanel/useFloatingPanel.mjs +1 -1
  21. package/dist/esm/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  22. package/dist/esm/FloatingPanel/useFloatingPanel.native.js +1 -1
  23. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  24. package/dist/esm/InputParts/index.mjs +85 -9
  25. package/dist/esm/InputParts/index.mjs.map +1 -1
  26. package/dist/esm/InputParts/index.native.js +110 -9
  27. package/dist/esm/InputParts/index.native.js.map +1 -1
  28. package/dist/esm/fields/ColorPicker/SystemColorField.mjs +1 -0
  29. package/dist/esm/fields/ColorPicker/SystemColorField.mjs.map +1 -1
  30. package/dist/esm/fields/ColorPicker/SystemColorField.native.js +1 -0
  31. package/dist/esm/fields/ColorPicker/SystemColorField.native.js.map +1 -1
  32. package/dist/esm/shared/groupContext.mjs +3 -1
  33. package/dist/esm/shared/groupContext.mjs.map +1 -1
  34. package/dist/esm/shared/groupContext.native.js +5 -1
  35. package/dist/esm/shared/groupContext.native.js.map +1 -1
  36. package/dist/jsx/ControlGroup/index.mjs +59 -58
  37. package/dist/jsx/ControlGroup/index.mjs.map +1 -1
  38. package/dist/jsx/ControlGroup/index.native.js +58 -57
  39. package/dist/jsx/ControlGroup/index.native.js.map +1 -1
  40. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs +1 -1
  41. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  42. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js +1 -1
  43. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  44. package/dist/jsx/InputParts/index.mjs +85 -9
  45. package/dist/jsx/InputParts/index.mjs.map +1 -1
  46. package/dist/jsx/InputParts/index.native.js +108 -6
  47. package/dist/jsx/InputParts/index.native.js.map +1 -1
  48. package/dist/jsx/fields/ColorPicker/SystemColorField.mjs +1 -0
  49. package/dist/jsx/fields/ColorPicker/SystemColorField.mjs.map +1 -1
  50. package/dist/jsx/fields/ColorPicker/SystemColorField.native.js +1 -0
  51. package/dist/jsx/fields/ColorPicker/SystemColorField.native.js.map +1 -1
  52. package/dist/jsx/shared/groupContext.mjs +3 -1
  53. package/dist/jsx/shared/groupContext.mjs.map +1 -1
  54. package/dist/jsx/shared/groupContext.native.js +6 -0
  55. package/dist/jsx/shared/groupContext.native.js.map +1 -1
  56. package/package.json +8 -8
  57. package/src/ControlGroup/ControlGroup.spec.tsx +30 -0
  58. package/src/ControlGroup/index.tsx +81 -77
  59. package/src/FloatingPanel/useFloatingPanel.ts +1 -1
  60. package/src/InputParts/index.tsx +119 -5
  61. package/src/InputParts/placeholderOverlay.native.spec.tsx +229 -0
  62. package/src/fields/ColorPicker/SystemColorField.tsx +1 -0
  63. package/src/fields/Input/Input.stories.tsx +36 -0
  64. package/src/shared/groupContext.ts +3 -0
  65. package/types/ControlGroup/index.d.ts.map +1 -1
  66. package/types/InputParts/index.d.ts +8 -0
  67. package/types/InputParts/index.d.ts.map +1 -1
  68. package/types/fields/ColorPicker/SystemColorField.d.ts.map +1 -1
  69. package/types/shared/groupContext.d.ts +2 -0
  70. package/types/shared/groupContext.d.ts.map +1 -1
@@ -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
- flex={1}
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
+ });
@@ -84,6 +84,7 @@ export function SystemColorField({
84
84
  {!inTableCell && presetColors.length > 0 ? (
85
85
  <ScrollView
86
86
  horizontal
87
+ keyboardShouldPersistTaps="handled"
87
88
  showsHorizontalScrollIndicator={false}
88
89
  testID="color-picker-system-presets"
89
90
  >
@@ -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,2CAyK9F;AAED,eAAO,MAAM,YAAY;;;;CAEvB,CAAC"}
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":"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"}
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,2CA6DvB"}
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"}