@multiplatform.one/forms 7.20.0 → 7.21.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.
@@ -225,7 +225,11 @@ export interface ComboboxProps {
225
225
  compact?: boolean;
226
226
  /** Allow creating new options when search doesn't match existing options */
227
227
  creatable?: boolean;
228
- /** Called when a new option is created. Should return the new option to be added. */
228
+ /**
229
+ * Called with the typed text. Return an option to select it; the Combobox
230
+ * keeps it listed until `options` carries it. Return nothing to handle
231
+ * creation yourself (a single-value panel still closes).
232
+ */
229
233
  onCreate?: (value: string) => ComboboxOption | void;
230
234
  /** Label template for the create option. Use {value} as placeholder. Default: 'Create "{value}"' */
231
235
  createLabel?: string;
@@ -596,19 +600,20 @@ function FloatingComboboxCore({
596
600
  }, [creatable, filter, options]);
597
601
 
598
602
  const handleCreate = useCallback(() => {
599
- if (!onCreate || !filter.trim()) return;
600
- const newOption = onCreate(filter.trim());
601
- if (newOption) {
602
- if (multiple) {
603
- const current = Array.isArray(value) ? value : value ? [value] : [];
604
- onValueChange?.([...current, newOption.value]);
605
- } else {
606
- onValueChange?.(newOption.value);
607
- setOpen(false);
608
- }
603
+ const typed = filter.trim();
604
+ if (!onCreate || !typed) return;
605
+ const newOption = onCreate(typed);
606
+ if (newOption && multiple) {
607
+ const current = Array.isArray(value) ? value : value ? [value] : [];
608
+ if (!current.includes(newOption.value)) onValueChange?.([...current, newOption.value]);
609
+ } else if (newOption) {
610
+ onValueChange?.(newOption.value);
609
611
  }
612
+ // A void onCreate hands creation to the host (a dialog, a server round
613
+ // trip); a single-value panel left open would sit over that UI.
614
+ if (!multiple) setOpen(false);
610
615
  setInternalFilter("");
611
- }, [onCreate, filter, multiple, value, onValueChange]);
616
+ }, [onCreate, filter, multiple, value, onValueChange, setOpen]);
612
617
 
613
618
  // Multi-select: selected at front ONLY when first opening. Never reorder when searching or selecting.
614
619
  const initialOrderRef = useRef<ComboboxOption[] | null>(null);
@@ -1285,6 +1290,9 @@ function FloatingComboboxCore({
1285
1290
  lastKeyboardNavTimeRef.current = Date.now();
1286
1291
  setActiveIndex(Math.max(0, totalNavigableItems - 1));
1287
1292
  } else if (event.key === "Enter" || event.key === " ") {
1293
+ // Space picks only from an empty search; after text it is part of
1294
+ // the query (and of a value being created), as it is in the sheet.
1295
+ if (event.key === " " && filter.trim()) return;
1288
1296
  event.preventDefault();
1289
1297
  if (activeIndex === createOptionIndex && showCreateOption) {
1290
1298
  handleCreate();
@@ -1312,6 +1320,7 @@ function FloatingComboboxCore({
1312
1320
  createOptionIndex,
1313
1321
  showCreateOption,
1314
1322
  multiple,
1323
+ filter,
1315
1324
  setKeyboardNav,
1316
1325
  ],
1317
1326
  );
@@ -1909,19 +1918,20 @@ function NativeComboboxCore({
1909
1918
  }, [creatable, filter, options]);
1910
1919
 
1911
1920
  const handleCreate = useCallback(() => {
1912
- if (!onCreate || !filter.trim()) return;
1913
- const newOption = onCreate(filter.trim());
1914
- if (newOption) {
1915
- if (multiple) {
1916
- const current = Array.isArray(value) ? value : value ? [value] : [];
1917
- onValueChange?.([...current, newOption.value]);
1918
- } else {
1919
- onValueChange?.(newOption.value);
1920
- setOpen(false);
1921
- }
1921
+ const typed = filter.trim();
1922
+ if (!onCreate || !typed) return;
1923
+ const newOption = onCreate(typed);
1924
+ if (newOption && multiple) {
1925
+ const current = Array.isArray(value) ? value : value ? [value] : [];
1926
+ if (!current.includes(newOption.value)) onValueChange?.([...current, newOption.value]);
1927
+ } else if (newOption) {
1928
+ onValueChange?.(newOption.value);
1922
1929
  }
1930
+ // A void onCreate hands creation to the host (a dialog, a server round
1931
+ // trip); a single-value panel left open would sit over that UI.
1932
+ if (!multiple) setOpen(false);
1923
1933
  setInternalFilter("");
1924
- }, [onCreate, filter, multiple, value, onValueChange]);
1934
+ }, [onCreate, filter, multiple, value, onValueChange, setOpen]);
1925
1935
 
1926
1936
  // Async-search comboboxes (Awesomebar, Link fields) open with few or no
1927
1937
  // options and stream results as the user types — open the sheet tall
@@ -2639,6 +2649,25 @@ export function Combobox({
2639
2649
  defaultValue,
2640
2650
  );
2641
2651
  const isControlled = valueProp !== undefined;
2652
+ const [createdOptions, setCreatedOptions] = useState<ComboboxOption[]>([]);
2653
+ const knownOptions = useMemo(() => {
2654
+ const unlisted = createdOptions.filter((c) => !options.some((o) => o.value === c.value));
2655
+ return unlisted.length ? [...options, ...unlisted] : options;
2656
+ }, [options, createdOptions]);
2657
+ const handleCreateOption = useMemo(
2658
+ () =>
2659
+ onCreate &&
2660
+ ((typed: string) => {
2661
+ const created = onCreate(typed);
2662
+ if (created) {
2663
+ setCreatedOptions((prev) =>
2664
+ prev.some((o) => o.value === created.value) ? prev : [...prev, created],
2665
+ );
2666
+ }
2667
+ return created;
2668
+ }),
2669
+ [onCreate],
2670
+ );
2642
2671
  const viewportGtSm = useViewportGtSm();
2643
2672
  // Sheet on native and below `$sm` (viewport < 640, OVERLAY_BREAKPOINT).
2644
2673
  // Floating from `$sm` up.
@@ -2659,7 +2688,7 @@ export function Combobox({
2659
2688
  const renderReadOnly = (selectValue: string | string[] | undefined) => {
2660
2689
  if (multiple && Array.isArray(selectValue)) {
2661
2690
  const labels = selectValue
2662
- .map((v) => options.find((o) => o.value === v)?.label ?? v)
2691
+ .map((v) => knownOptions.find((o) => o.value === v)?.label ?? v)
2663
2692
  .join(", ");
2664
2693
  return (
2665
2694
  <Text
@@ -2675,7 +2704,7 @@ export function Combobox({
2675
2704
  );
2676
2705
  }
2677
2706
  const sv = typeof selectValue === "string" ? selectValue : undefined;
2678
- const selected = options.find((option) => option.value === sv);
2707
+ const selected = knownOptions.find((option) => option.value === sv);
2679
2708
  const displayText = selected?.label ?? (sv ? (valueLabel ?? sv) : "-");
2680
2709
  return (
2681
2710
  <Text
@@ -2700,7 +2729,7 @@ export function Combobox({
2700
2729
  const ComboboxCore = shouldUseSheet ? NativeComboboxCore : FloatingComboboxCore;
2701
2730
  return (
2702
2731
  <ComboboxCore
2703
- options={options}
2732
+ options={onSearch ? options : knownOptions}
2704
2733
  value={selectValue}
2705
2734
  onValueChange={(value) => {
2706
2735
  if (disabled) return;
@@ -2717,7 +2746,7 @@ export function Combobox({
2717
2746
  onSearch={onSearch}
2718
2747
  loading={loading}
2719
2748
  searchError={searchError}
2720
- valueLabel={valueLabel}
2749
+ valueLabel={valueLabel ?? createdOptions.find((o) => o.value === selectValue)?.label}
2721
2750
  clearable={clearable}
2722
2751
  onLoadMore={onLoadMore}
2723
2752
  hasMore={hasMore}
@@ -2734,7 +2763,7 @@ export function Combobox({
2734
2763
  selectedOrder={selectedOrder}
2735
2764
  dismissible={dismissible}
2736
2765
  creatable={creatable}
2737
- onCreate={onCreate}
2766
+ onCreate={handleCreateOption}
2738
2767
  createLabel={createLabel}
2739
2768
  hideSearch={hideSearch}
2740
2769
  searchValue={searchValue}
@@ -1,8 +1,10 @@
1
1
  /**
2
2
  * MPO-356 / LC-91 SWITCH-FOOTPRINT, native half. Clay's iPhone measured the
3
- * default track at about 85 × 43 pt; a UISwitch is 51 × 31 with a 27 pt
4
- * thumb. Mock tamagui's isWeb so the native branch runs on the test host
5
- * renderer (RadioGroup.native.spec pattern) and read the painted track back.
3
+ * default track at about 85 × 43 pt; the track is UISwitch's 51 × 31, and the
4
+ * thumb follows Tamagui's proportion, filling the track inside the 1 pt
5
+ * hairline (29 pt) as it does on web. Mock tamagui's isWeb so the native
6
+ * branch runs on the test host renderer (RadioGroup.native.spec pattern) and
7
+ * read the painted track back.
6
8
  */
7
9
 
8
10
  import { cleanup } from "@testing-library/react";
@@ -36,10 +38,10 @@ function mount(overrides: Record<string, unknown> = {}, minTargetHeight?: number
36
38
  }
37
39
 
38
40
  describe("Switch footprint on native (MPO-356)", () => {
39
- it("paints a UISwitch-sized 51 × 31 track with a 27 pt thumb at default knobs", () => {
41
+ it("paints a UISwitch-sized 51 × 31 track with a 29 pt thumb at default knobs", () => {
40
42
  const { track, thumb } = mount();
41
43
  expect(track).toEqual({ width: 51, height: 31 });
42
- expect(thumb).toEqual({ width: 27, height: 27 });
44
+ expect(thumb).toEqual({ width: 29, height: 29 });
43
45
  });
44
46
 
45
47
  it("keeps the 51 × 31 paint inside a 44 pt press target on touch", () => {
@@ -55,4 +57,11 @@ describe("Switch footprint on native (MPO-356)", () => {
55
57
  expect(small).toEqual({ width: 41, height: 25 });
56
58
  expect(large).toEqual({ width: 61, height: 37 });
57
59
  });
60
+
61
+ for (const size of ["small", "medium", "large"] as const) {
62
+ it(`size ${size}: the thumb fills the track inside the 1 pt hairline, Tamagui's proportion`, () => {
63
+ const { track, thumb } = mount({ size });
64
+ expect(thumb).toEqual({ width: track.height - 2, height: track.height - 2 });
65
+ });
66
+ }
58
67
  });
@@ -8,14 +8,14 @@ import { isWeb } from "tamagui";
8
8
  *
9
9
  * - web: Tamagui's Switch, `getSwitchHeight` = size × 0.65 at a 2:1 aspect,
10
10
  * thumb filling the track (tamagui.dev `$4` = 58 × 29, thumb 29).
11
- * - native: UISwitch, 51 × 31 pt with a 27 pt thumb (2 pt rim gutter) at the
12
- * 44 medium stop. Material 3's 52 × 32 sits inside the same 10 percent.
11
+ * - native: UISwitch's 51 × 31 pt track at the 44 medium stop (Material 3's
12
+ * 52 × 32 sits inside the same 10 percent), Tamagui's thumb filling it: 29 pt.
13
13
  *
14
14
  * Painting the whole recipe height is what made `$4` an 86 × 44 slab once
15
15
  * MPO-13 lifted the recipe from 32 to Tamagui's 44.
16
16
  */
17
17
  const webSwitch = { heightRatio: 0.65, aspect: 2, rimGutter: 0 };
18
- const nativeSwitch = { heightRatio: 31 / 44, aspect: 51 / 31, rimGutter: 2 };
18
+ const nativeSwitch = { heightRatio: 31 / 44, aspect: 51 / 31, rimGutter: 1 };
19
19
 
20
20
  export type SwitchFootprint = {
21
21
  trackHeight: number;
@@ -76,7 +76,11 @@ export interface ComboboxProps {
76
76
  compact?: boolean;
77
77
  /** Allow creating new options when search doesn't match existing options */
78
78
  creatable?: boolean;
79
- /** Called when a new option is created. Should return the new option to be added. */
79
+ /**
80
+ * Called with the typed text. Return an option to select it; the Combobox
81
+ * keeps it listed until `options` carries it. Return nothing to handle
82
+ * creation yourself (a single-value panel still closes).
83
+ */
80
84
  onCreate?: (value: string) => ComboboxOption | void;
81
85
  /** Label template for the create option. Use {value} as placeholder. Default: 'Create "{value}"' */
82
86
  createLabel?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/Combobox/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AA2BvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAU9C,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAkCtD,OAAO,EAA0B,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAgF9E,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uFAAuF;IACvF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IAC9C,0CAA0C;IAC1C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iGAAiG;IACjG,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,yFAAyF;IACzF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,GAAG,cAAc,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,KAAK,SAAS,CAAC;IAChG,oFAAoF;IACpF,aAAa,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,+FAA+F;IAC/F,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,cAAc,GAAG,IAAI,CAAC;IACpD,oGAAoG;IACpG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uFAAuF;IACvF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAoyED,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,KAAK,EAAE,SAAS,EAChB,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,WAAW,EAAE,eAAe,EAC5B,iBAAiB,EAAE,qBAAqB,EACxC,YAAY,EAAE,gBAAgB,EAC9B,QAAQ,EACR,OAAO,EACP,WAAW,EACX,UAAU,EACV,SAAS,EACT,UAAU,EACV,OAAO,EACP,OAAO,EACP,aAAa,EACb,IAAI,EACJ,IAAI,EAAE,QAAQ,EACd,UAAU,EACV,KAAK,EACL,UAAU,EACV,UAAU,EACV,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,MAAM,EACV,MAAM,EACN,YAAY,EACZ,QAAQ,EAAE,YAAY,EACtB,QAAQ,EACR,aAAa,EACb,WAAW,EACX,QAAQ,EACR,OAAO,EACP,SAAS,EACT,QAAQ,EACR,WAAW,EACX,UAAU,EACV,WAAW,EACX,IAAI,EACJ,YAAY,EACZ,YAAY,EAAE,SAAS,EACvB,GAAG,IAAI,EACR,EAAE,aAAa,2CA+Lf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/Combobox/index.tsx"],"names":[],"mappings":"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"}