@multiplatform.one/forms 7.71.0 → 7.73.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/cjs/Button/circleGlyph.cjs +28 -0
- package/dist/cjs/Button/circleGlyph.native.js +31 -0
- package/dist/cjs/Button/circleGlyph.native.js.map +1 -0
- package/dist/cjs/Button/index.cjs +19 -3
- package/dist/cjs/Button/index.native.js +19 -3
- package/dist/cjs/Button/index.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/PanelHeader.cjs +49 -0
- package/dist/cjs/FloatingPanel/PanelHeader.native.js +53 -0
- package/dist/cjs/FloatingPanel/PanelHeader.native.js.map +1 -0
- package/dist/cjs/FloatingPanel/echoContext.cjs +67 -0
- package/dist/cjs/FloatingPanel/echoContext.native.js +71 -0
- package/dist/cjs/FloatingPanel/echoContext.native.js.map +1 -0
- package/dist/cjs/FloatingPanel/iconEcho.cjs +104 -0
- package/dist/cjs/FloatingPanel/iconEcho.native.js +114 -0
- package/dist/cjs/FloatingPanel/iconEcho.native.js.map +1 -0
- package/dist/cjs/FloatingPanel/index.cjs +371 -86
- package/dist/cjs/FloatingPanel/index.native.js +164 -20
- package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/paintedBox.cjs +80 -0
- package/dist/cjs/FloatingPanel/paintedBox.native.js +85 -0
- package/dist/cjs/FloatingPanel/paintedBox.native.js.map +1 -0
- package/dist/cjs/FloatingPanel/panelWidth.cjs +92 -0
- package/dist/cjs/FloatingPanel/panelWidth.native.js +99 -0
- package/dist/cjs/FloatingPanel/panelWidth.native.js.map +1 -0
- package/dist/cjs/FloatingPanel/pointAnchor.cjs +34 -5
- package/dist/cjs/FloatingPanel/pointAnchor.native.js +37 -8
- package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/useFloatingPanel.cjs +60 -5
- package/dist/cjs/FloatingPanel/useFloatingPanel.native.js +72 -5
- package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/cjs/InputParts/index.cjs +18 -0
- package/dist/cjs/InputParts/index.native.js +19 -1
- package/dist/cjs/InputParts/index.native.js.map +1 -1
- package/dist/cjs/Wheel/NativeWheel.native.js +1 -1
- package/dist/cjs/Wheel/NativeWheel.native.js.map +1 -1
- package/dist/cjs/Wheel/index.cjs +2 -1
- package/dist/cjs/Wheel/index.native.js +4 -1
- package/dist/cjs/Wheel/index.native.js.map +1 -1
- package/dist/cjs/Wheel/wheelShared.cjs +6 -1
- package/dist/cjs/Wheel/wheelShared.native.js +7 -1
- package/dist/cjs/Wheel/wheelShared.native.js.map +1 -1
- package/dist/cjs/fields/Combobox/index.cjs +1 -0
- package/dist/cjs/fields/Combobox/index.native.js +1 -0
- package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.cjs +6 -30
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +11 -34
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/DatetimePicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/catalog.cjs +2 -28
- package/dist/cjs/fields/DatePicker/catalog.native.js +2 -30
- package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/index.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/parts.cjs +11 -20
- package/dist/cjs/fields/DatePicker/parts.native.js +13 -22
- package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
- package/dist/cjs/fields/Select/index.cjs +65 -44
- package/dist/cjs/fields/Select/index.native.js +69 -47
- package/dist/cjs/fields/Select/index.native.js.map +1 -1
- package/dist/cjs/fields/Select/shouldInlineChoices.cjs +3 -1
- package/dist/cjs/fields/Select/shouldInlineChoices.native.js +3 -1
- package/dist/cjs/fields/Select/shouldInlineChoices.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/catalog.cjs +4 -25
- package/dist/cjs/fields/TimePicker/catalog.native.js +7 -29
- package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/index.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/parts.cjs +8 -21
- package/dist/cjs/fields/TimePicker/parts.native.js +8 -21
- package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/cjs/index.cjs +2 -0
- package/dist/cjs/index.native.js +2 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/shared/floatingList.cjs +13 -4
- package/dist/cjs/shared/floatingList.native.js +15 -4
- package/dist/cjs/shared/floatingList.native.js.map +1 -1
- package/dist/esm/Button/circleGlyph.mjs +3 -0
- package/dist/esm/Button/circleGlyph.mjs.map +1 -0
- package/dist/esm/Button/circleGlyph.native.js +3 -0
- package/dist/esm/Button/circleGlyph.native.js.map +1 -0
- package/dist/esm/Button/index.mjs +18 -2
- package/dist/esm/Button/index.mjs.map +1 -1
- package/dist/esm/Button/index.native.js +18 -2
- package/dist/esm/Button/index.native.js.map +1 -1
- package/dist/esm/FloatingPanel/PanelHeader.mjs +24 -0
- package/dist/esm/FloatingPanel/PanelHeader.mjs.map +1 -0
- package/dist/esm/FloatingPanel/PanelHeader.native.js +25 -0
- package/dist/esm/FloatingPanel/PanelHeader.native.js.map +1 -0
- package/dist/esm/FloatingPanel/echoContext.mjs +35 -0
- package/dist/esm/FloatingPanel/echoContext.mjs.map +1 -0
- package/dist/esm/FloatingPanel/echoContext.native.js +36 -0
- package/dist/esm/FloatingPanel/echoContext.native.js.map +1 -0
- package/dist/esm/FloatingPanel/iconEcho.mjs +77 -0
- package/dist/esm/FloatingPanel/iconEcho.mjs.map +1 -0
- package/dist/esm/FloatingPanel/iconEcho.native.js +84 -0
- package/dist/esm/FloatingPanel/iconEcho.native.js.map +1 -0
- package/dist/esm/FloatingPanel/index.mjs +373 -90
- package/dist/esm/FloatingPanel/index.mjs.map +1 -1
- package/dist/esm/FloatingPanel/index.native.js +165 -23
- package/dist/esm/FloatingPanel/index.native.js.map +1 -1
- package/dist/esm/FloatingPanel/paintedBox.mjs +52 -0
- package/dist/esm/FloatingPanel/paintedBox.mjs.map +1 -0
- package/dist/esm/FloatingPanel/paintedBox.native.js +54 -0
- package/dist/esm/FloatingPanel/paintedBox.native.js.map +1 -0
- package/dist/esm/FloatingPanel/panelWidth.mjs +63 -0
- package/dist/esm/FloatingPanel/panelWidth.mjs.map +1 -0
- package/dist/esm/FloatingPanel/panelWidth.native.js +67 -0
- package/dist/esm/FloatingPanel/panelWidth.native.js.map +1 -0
- package/dist/esm/FloatingPanel/pointAnchor.mjs +34 -5
- package/dist/esm/FloatingPanel/pointAnchor.mjs.map +1 -1
- package/dist/esm/FloatingPanel/pointAnchor.native.js +37 -8
- package/dist/esm/FloatingPanel/pointAnchor.native.js.map +1 -1
- package/dist/esm/FloatingPanel/useFloatingPanel.mjs +60 -6
- package/dist/esm/FloatingPanel/useFloatingPanel.mjs.map +1 -1
- package/dist/esm/FloatingPanel/useFloatingPanel.native.js +72 -6
- package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/esm/InputParts/index.mjs +19 -1
- package/dist/esm/InputParts/index.mjs.map +1 -1
- package/dist/esm/InputParts/index.native.js +20 -2
- package/dist/esm/InputParts/index.native.js.map +1 -1
- package/dist/esm/Wheel/NativeWheel.native.js +1 -1
- package/dist/esm/Wheel/NativeWheel.native.js.map +1 -1
- package/dist/esm/Wheel/index.mjs +2 -1
- package/dist/esm/Wheel/index.mjs.map +1 -1
- package/dist/esm/Wheel/index.native.js +4 -1
- package/dist/esm/Wheel/index.native.js.map +1 -1
- package/dist/esm/Wheel/wheelShared.mjs +6 -1
- package/dist/esm/Wheel/wheelShared.mjs.map +1 -1
- package/dist/esm/Wheel/wheelShared.native.js +7 -1
- package/dist/esm/Wheel/wheelShared.native.js.map +1 -1
- package/dist/esm/fields/Combobox/index.mjs +1 -0
- package/dist/esm/fields/Combobox/index.mjs.map +1 -1
- package/dist/esm/fields/Combobox/index.native.js +1 -0
- package/dist/esm/fields/Combobox/index.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs +6 -30
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js +11 -34
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/catalog.mjs +2 -28
- package/dist/esm/fields/DatePicker/catalog.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/catalog.native.js +2 -30
- package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/index.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/parts.mjs +11 -20
- package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/parts.native.js +13 -22
- package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
- package/dist/esm/fields/Select/index.mjs +66 -45
- package/dist/esm/fields/Select/index.mjs.map +1 -1
- package/dist/esm/fields/Select/index.native.js +70 -48
- package/dist/esm/fields/Select/index.native.js.map +1 -1
- package/dist/esm/fields/Select/shouldInlineChoices.mjs +3 -1
- package/dist/esm/fields/Select/shouldInlineChoices.mjs.map +1 -1
- package/dist/esm/fields/Select/shouldInlineChoices.native.js +3 -1
- package/dist/esm/fields/Select/shouldInlineChoices.native.js.map +1 -1
- package/dist/esm/fields/TimePicker/catalog.mjs +4 -25
- package/dist/esm/fields/TimePicker/catalog.mjs.map +1 -1
- package/dist/esm/fields/TimePicker/catalog.native.js +7 -29
- package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -1
- package/dist/esm/fields/TimePicker/index.native.js.map +1 -1
- package/dist/esm/fields/TimePicker/parts.mjs +8 -21
- package/dist/esm/fields/TimePicker/parts.mjs.map +1 -1
- package/dist/esm/fields/TimePicker/parts.native.js +8 -21
- package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/esm/index.mjs +2 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +2 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/shared/floatingList.mjs +14 -5
- package/dist/esm/shared/floatingList.mjs.map +1 -1
- package/dist/esm/shared/floatingList.native.js +16 -5
- package/dist/esm/shared/floatingList.native.js.map +1 -1
- package/dist/jsx/Button/circleGlyph.mjs +3 -0
- package/dist/jsx/Button/circleGlyph.mjs.map +1 -0
- package/dist/jsx/Button/circleGlyph.native.js +31 -0
- package/dist/jsx/Button/circleGlyph.native.js.map +1 -0
- package/dist/jsx/Button/index.mjs +18 -2
- package/dist/jsx/Button/index.mjs.map +1 -1
- package/dist/jsx/Button/index.native.js +19 -3
- package/dist/jsx/Button/index.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/PanelHeader.mjs +24 -0
- package/dist/jsx/FloatingPanel/PanelHeader.mjs.map +1 -0
- package/dist/jsx/FloatingPanel/PanelHeader.native.js +53 -0
- package/dist/jsx/FloatingPanel/PanelHeader.native.js.map +1 -0
- package/dist/jsx/FloatingPanel/echoContext.mjs +35 -0
- package/dist/jsx/FloatingPanel/echoContext.mjs.map +1 -0
- package/dist/jsx/FloatingPanel/echoContext.native.js +71 -0
- package/dist/jsx/FloatingPanel/echoContext.native.js.map +1 -0
- package/dist/jsx/FloatingPanel/iconEcho.mjs +77 -0
- package/dist/jsx/FloatingPanel/iconEcho.mjs.map +1 -0
- package/dist/jsx/FloatingPanel/iconEcho.native.js +114 -0
- package/dist/jsx/FloatingPanel/iconEcho.native.js.map +1 -0
- package/dist/jsx/FloatingPanel/index.mjs +373 -90
- package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/index.native.js +164 -20
- package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/paintedBox.mjs +52 -0
- package/dist/jsx/FloatingPanel/paintedBox.mjs.map +1 -0
- package/dist/jsx/FloatingPanel/paintedBox.native.js +85 -0
- package/dist/jsx/FloatingPanel/paintedBox.native.js.map +1 -0
- package/dist/jsx/FloatingPanel/panelWidth.mjs +63 -0
- package/dist/jsx/FloatingPanel/panelWidth.mjs.map +1 -0
- package/dist/jsx/FloatingPanel/panelWidth.native.js +99 -0
- package/dist/jsx/FloatingPanel/panelWidth.native.js.map +1 -0
- package/dist/jsx/FloatingPanel/pointAnchor.mjs +34 -5
- package/dist/jsx/FloatingPanel/pointAnchor.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/pointAnchor.native.js +37 -8
- package/dist/jsx/FloatingPanel/pointAnchor.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/useFloatingPanel.mjs +60 -6
- package/dist/jsx/FloatingPanel/useFloatingPanel.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/useFloatingPanel.native.js +72 -5
- package/dist/jsx/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/jsx/InputParts/index.mjs +19 -1
- package/dist/jsx/InputParts/index.mjs.map +1 -1
- package/dist/jsx/InputParts/index.native.js +19 -1
- package/dist/jsx/InputParts/index.native.js.map +1 -1
- package/dist/jsx/Wheel/NativeWheel.native.js +1 -1
- package/dist/jsx/Wheel/NativeWheel.native.js.map +1 -1
- package/dist/jsx/Wheel/index.mjs +2 -1
- package/dist/jsx/Wheel/index.mjs.map +1 -1
- package/dist/jsx/Wheel/index.native.js +4 -1
- package/dist/jsx/Wheel/index.native.js.map +1 -1
- package/dist/jsx/Wheel/wheelShared.mjs +6 -1
- package/dist/jsx/Wheel/wheelShared.mjs.map +1 -1
- package/dist/jsx/Wheel/wheelShared.native.js +7 -1
- package/dist/jsx/Wheel/wheelShared.native.js.map +1 -1
- package/dist/jsx/fields/Combobox/index.mjs +1 -0
- package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
- package/dist/jsx/fields/Combobox/index.native.js +1 -0
- package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs +6 -30
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js +11 -34
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/DatetimePicker.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/catalog.mjs +2 -28
- package/dist/jsx/fields/DatePicker/catalog.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/catalog.native.js +2 -30
- package/dist/jsx/fields/DatePicker/catalog.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/index.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/parts.mjs +11 -20
- package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/parts.native.js +13 -22
- package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
- package/dist/jsx/fields/Select/index.mjs +66 -45
- package/dist/jsx/fields/Select/index.mjs.map +1 -1
- package/dist/jsx/fields/Select/index.native.js +69 -47
- package/dist/jsx/fields/Select/index.native.js.map +1 -1
- package/dist/jsx/fields/Select/shouldInlineChoices.mjs +3 -1
- package/dist/jsx/fields/Select/shouldInlineChoices.mjs.map +1 -1
- package/dist/jsx/fields/Select/shouldInlineChoices.native.js +3 -1
- package/dist/jsx/fields/Select/shouldInlineChoices.native.js.map +1 -1
- package/dist/jsx/fields/TimePicker/catalog.mjs +4 -25
- package/dist/jsx/fields/TimePicker/catalog.mjs.map +1 -1
- package/dist/jsx/fields/TimePicker/catalog.native.js +7 -29
- package/dist/jsx/fields/TimePicker/catalog.native.js.map +1 -1
- package/dist/jsx/fields/TimePicker/index.native.js.map +1 -1
- package/dist/jsx/fields/TimePicker/parts.mjs +8 -21
- package/dist/jsx/fields/TimePicker/parts.mjs.map +1 -1
- package/dist/jsx/fields/TimePicker/parts.native.js +8 -21
- package/dist/jsx/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/jsx/index.js +2 -1
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +2 -1
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +2 -0
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/shared/floatingList.mjs +14 -5
- package/dist/jsx/shared/floatingList.mjs.map +1 -1
- package/dist/jsx/shared/floatingList.native.js +15 -4
- package/dist/jsx/shared/floatingList.native.js.map +1 -1
- package/package.json +8 -8
- package/src/Button/circleGlyph.ts +6 -0
- package/src/Button/index.tsx +25 -7
- package/src/FloatingPanel/FloatingPanel.echoStretch.spec.tsx +67 -0
- package/src/FloatingPanel/FloatingPanel.iconEcho.spec.tsx +297 -0
- package/src/FloatingPanel/FloatingPanel.menuFace.native.spec.tsx +280 -3
- package/src/FloatingPanel/FloatingPanel.seamlessCover.spec.tsx +237 -0
- package/src/FloatingPanel/PanelHeader.tsx +26 -0
- package/src/FloatingPanel/echoContext.ts +67 -0
- package/src/FloatingPanel/iconEcho.tsx +118 -0
- package/src/FloatingPanel/index.native.tsx +220 -12
- package/src/FloatingPanel/index.tsx +539 -109
- package/src/FloatingPanel/paintedBox.spec.ts +95 -0
- package/src/FloatingPanel/paintedBox.ts +75 -0
- package/src/FloatingPanel/panelWidth.spec.ts +158 -0
- package/src/FloatingPanel/panelWidth.ts +122 -0
- package/src/FloatingPanel/panelWidthContract.spec.ts +10 -10
- package/src/FloatingPanel/pointAnchor.spec.ts +111 -2
- package/src/FloatingPanel/pointAnchor.ts +56 -3
- package/src/FloatingPanel/useFloatingPanel.spec.tsx +124 -4
- package/src/FloatingPanel/useFloatingPanel.ts +112 -34
- package/src/InputParts/index.tsx +26 -0
- package/src/Wheel/NativeWheel.native.tsx +1 -1
- package/src/Wheel/Wheel.spec.tsx +9 -0
- package/src/Wheel/index.tsx +12 -3
- package/src/Wheel/wheelShared.ts +6 -2
- package/src/fields/Combobox/index.tsx +1 -0
- package/src/fields/DatePicker/DatePicker.stories.tsx +3 -3
- package/src/fields/DatePicker/DatetimePicker.catalog.tsx +17 -45
- package/src/fields/DatePicker/DatetimePicker.native.tsx +3 -0
- package/src/fields/DatePicker/catalog.tsx +8 -39
- package/src/fields/DatePicker/index.native.tsx +3 -0
- package/src/fields/DatePicker/parts.tsx +13 -23
- package/src/fields/DatePicker/seamlessCover.spec.tsx +180 -0
- package/src/fields/DatePicker/touchWeb.spec.tsx +109 -167
- package/src/fields/Select/Select.containingBlock.spec.tsx +191 -0
- package/src/fields/Select/Select.stories.tsx +43 -0
- package/src/fields/Select/index.tsx +109 -45
- package/src/fields/Select/shouldInlineChoices.spec.ts +13 -0
- package/src/fields/Select/shouldInlineChoices.ts +6 -0
- package/src/fields/TimePicker/catalog.tsx +12 -33
- package/src/fields/TimePicker/index.native.tsx +2 -0
- package/src/fields/TimePicker/parts.tsx +6 -20
- package/src/index.ts +3 -0
- package/src/shared/floatingList.tsx +21 -5
- package/types/Button/circleGlyph.d.ts +7 -0
- package/types/Button/circleGlyph.d.ts.map +1 -0
- package/types/Button/index.d.ts +2 -6
- package/types/Button/index.d.ts.map +1 -1
- package/types/FloatingPanel/PanelHeader.d.ts +9 -0
- package/types/FloatingPanel/PanelHeader.d.ts.map +1 -0
- package/types/FloatingPanel/echoContext.d.ts +38 -0
- package/types/FloatingPanel/echoContext.d.ts.map +1 -0
- package/types/FloatingPanel/iconEcho.d.ts +29 -0
- package/types/FloatingPanel/iconEcho.d.ts.map +1 -0
- package/types/FloatingPanel/index.d.ts +69 -0
- package/types/FloatingPanel/index.d.ts.map +1 -1
- package/types/FloatingPanel/index.native.d.ts +9 -1
- package/types/FloatingPanel/index.native.d.ts.map +1 -1
- package/types/FloatingPanel/paintedBox.d.ts +29 -0
- package/types/FloatingPanel/paintedBox.d.ts.map +1 -0
- package/types/FloatingPanel/panelWidth.d.ts +71 -0
- package/types/FloatingPanel/panelWidth.d.ts.map +1 -0
- package/types/FloatingPanel/pointAnchor.d.ts +17 -1
- package/types/FloatingPanel/pointAnchor.d.ts.map +1 -1
- package/types/FloatingPanel/useFloatingPanel.d.ts +33 -2
- package/types/FloatingPanel/useFloatingPanel.d.ts.map +1 -1
- package/types/InputParts/index.d.ts.map +1 -1
- package/types/Wheel/index.d.ts.map +1 -1
- package/types/Wheel/wheelShared.d.ts +2 -1
- package/types/Wheel/wheelShared.d.ts.map +1 -1
- package/types/fields/Combobox/index.d.ts.map +1 -1
- package/types/fields/DatePicker/DatetimePicker.catalog.d.ts +6 -0
- package/types/fields/DatePicker/DatetimePicker.catalog.d.ts.map +1 -1
- package/types/fields/DatePicker/DatetimePicker.native.d.ts +3 -0
- package/types/fields/DatePicker/DatetimePicker.native.d.ts.map +1 -1
- package/types/fields/DatePicker/catalog.d.ts +6 -0
- package/types/fields/DatePicker/catalog.d.ts.map +1 -1
- package/types/fields/DatePicker/index.native.d.ts +3 -0
- package/types/fields/DatePicker/index.native.d.ts.map +1 -1
- package/types/fields/DatePicker/parts.d.ts +5 -7
- package/types/fields/DatePicker/parts.d.ts.map +1 -1
- package/types/fields/Select/index.d.ts +8 -1
- package/types/fields/Select/index.d.ts.map +1 -1
- package/types/fields/Select/shouldInlineChoices.d.ts +5 -1
- package/types/fields/Select/shouldInlineChoices.d.ts.map +1 -1
- package/types/fields/TimePicker/catalog.d.ts +7 -1
- package/types/fields/TimePicker/catalog.d.ts.map +1 -1
- package/types/fields/TimePicker/index.native.d.ts +2 -0
- package/types/fields/TimePicker/index.native.d.ts.map +1 -1
- package/types/fields/TimePicker/parts.d.ts +1 -3
- package/types/fields/TimePicker/parts.d.ts.map +1 -1
- package/types/index.d.ts +3 -0
- package/types/index.d.ts.map +1 -1
- package/types/shared/floatingList.d.ts +5 -1
- package/types/shared/floatingList.d.ts.map +1 -1
- package/dist/cjs/shared/touchWebPicker.cjs +0 -136
- package/dist/cjs/shared/touchWebPicker.native.js +0 -154
- package/dist/cjs/shared/touchWebPicker.native.js.map +0 -1
- package/dist/esm/shared/touchWebPicker.mjs +0 -105
- package/dist/esm/shared/touchWebPicker.mjs.map +0 -1
- package/dist/esm/shared/touchWebPicker.native.js +0 -120
- package/dist/esm/shared/touchWebPicker.native.js.map +0 -1
- package/dist/jsx/shared/touchWebPicker.mjs +0 -105
- package/dist/jsx/shared/touchWebPicker.mjs.map +0 -1
- package/dist/jsx/shared/touchWebPicker.native.js +0 -154
- package/dist/jsx/shared/touchWebPicker.native.js.map +0 -1
- package/src/shared/touchWebPicker.spec.ts +0 -98
- package/src/shared/touchWebPicker.tsx +0 -158
- package/types/shared/touchWebPicker.d.ts +0 -40
- package/types/shared/touchWebPicker.d.ts.map +0 -1
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Date, Time and Datetime on touch web. FZ-8114 handed these to the browser's
|
|
3
|
+
* own popover; FZ-8438 replaces it with MPO's cover panel, because Safari's
|
|
4
|
+
* popover cannot lie over the field, match its arc or repeat its content
|
|
5
|
+
* (LC-112 seamless cover, Clay's rv_a07d4308a6c445b6 notes).
|
|
6
|
+
*
|
|
7
|
+
* FZ-8114's invariant still holds: a blank tap opens nothing, only the tapped
|
|
8
|
+
* field opens, and its clear ✕ clears without opening.
|
|
5
9
|
*/
|
|
6
10
|
import { formatCalendarDate } from "@multiplatform.one/theme";
|
|
7
11
|
import { useForm } from "@tanstack/react-form";
|
|
@@ -13,8 +17,15 @@ import { Form } from "../../Form";
|
|
|
13
17
|
import { TimePicker } from "../TimePicker";
|
|
14
18
|
import { DatePicker, DatetimePicker } from "./index";
|
|
15
19
|
|
|
16
|
-
let coarse = false;
|
|
17
20
|
const originalMatchMedia = window.matchMedia;
|
|
21
|
+
const originalWidth = window.innerWidth;
|
|
22
|
+
|
|
23
|
+
function setWidth(width: number) {
|
|
24
|
+
Object.defineProperty(window, "innerWidth", { configurable: true, value: width });
|
|
25
|
+
act(() => {
|
|
26
|
+
window.dispatchEvent(new Event("resize"));
|
|
27
|
+
});
|
|
28
|
+
}
|
|
18
29
|
|
|
19
30
|
beforeEach(() => {
|
|
20
31
|
Object.defineProperty(window, "matchMedia", {
|
|
@@ -22,7 +33,7 @@ beforeEach(() => {
|
|
|
22
33
|
writable: true,
|
|
23
34
|
value: (media: string) => ({
|
|
24
35
|
media,
|
|
25
|
-
matches: media === "(pointer: coarse)"
|
|
36
|
+
matches: media === "(pointer: coarse)" || media === "(hover: none)",
|
|
26
37
|
onchange: null,
|
|
27
38
|
addEventListener: () => {},
|
|
28
39
|
removeEventListener: () => {},
|
|
@@ -31,23 +42,30 @@ beforeEach(() => {
|
|
|
31
42
|
dispatchEvent: () => false,
|
|
32
43
|
}),
|
|
33
44
|
});
|
|
45
|
+
setWidth(390);
|
|
34
46
|
});
|
|
35
47
|
|
|
36
48
|
afterEach(() => {
|
|
37
|
-
coarse = false;
|
|
38
49
|
Object.defineProperty(window, "matchMedia", {
|
|
39
50
|
configurable: true,
|
|
40
51
|
writable: true,
|
|
41
52
|
value: originalMatchMedia,
|
|
42
53
|
});
|
|
54
|
+
setWidth(originalWidth);
|
|
43
55
|
});
|
|
44
56
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
57
|
+
/** A finger tap as mobile Safari delivers it: pointer, compat mouse, click. */
|
|
58
|
+
function tap(el: Element) {
|
|
59
|
+
fireEvent.pointerDown(el, { pointerType: "touch", button: 0 });
|
|
60
|
+
fireEvent.mouseDown(el, { button: 0, detail: 1 });
|
|
61
|
+
fireEvent.pointerUp(el, { pointerType: "touch", button: 0 });
|
|
62
|
+
fireEvent.mouseUp(el, { button: 0, detail: 1 });
|
|
63
|
+
fireEvent.click(el, { button: 0, detail: 1 });
|
|
49
64
|
}
|
|
50
65
|
|
|
66
|
+
const panels = () => document.querySelectorAll('[data-testid="floating-panel-viewport"]');
|
|
67
|
+
const sheets = () => document.querySelectorAll('[data-testid="floating-panel-sheet"]');
|
|
68
|
+
|
|
51
69
|
function dayButton(root: ParentNode, day: string): HTMLElement {
|
|
52
70
|
const match = Array.from(root.querySelectorAll('button, [role="button"]')).find(
|
|
53
71
|
(el) => el.textContent?.trim() === day && el.getAttribute("aria-disabled") !== "true",
|
|
@@ -56,100 +74,74 @@ function dayButton(root: ParentNode, day: string): HTMLElement {
|
|
|
56
74
|
return match as HTMLElement;
|
|
57
75
|
}
|
|
58
76
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
77
|
+
function Page() {
|
|
78
|
+
return (
|
|
79
|
+
<>
|
|
80
|
+
<div data-testid="blank" style={{ height: 200 }} />
|
|
81
|
+
<DatePicker label="Date" name="date" value={new Date(2026, 2, 5)} />
|
|
82
|
+
<TimePicker label="Time" name="time" value="14:30" />
|
|
83
|
+
<DatetimePicker label="Date and time" name="starts" />
|
|
84
|
+
</>
|
|
85
|
+
);
|
|
86
|
+
}
|
|
68
87
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
88
|
+
describe("touch web opens MPO's cover panel, never the browser's popover (FZ-8438)", () => {
|
|
89
|
+
it.each([
|
|
90
|
+
["date", "date-picker-trigger", <DatePicker key="d" label="Due" name="due" />],
|
|
91
|
+
["time", "time-picker-trigger", <TimePicker key="t" label="At" name="at" />],
|
|
92
|
+
[
|
|
93
|
+
"date and time",
|
|
94
|
+
"date-picker-trigger",
|
|
95
|
+
<DatetimePicker key="dt" label="Starts" name="starts" />,
|
|
96
|
+
],
|
|
97
|
+
] as const)("a tap on the %s field opens the MPO panel over it", async (_, testId, field) => {
|
|
98
|
+
const result = renderWithProviders(field);
|
|
99
|
+
expect(result.container.querySelector("input[type=date], input[type=time]")).toBeNull();
|
|
100
|
+
expect(result.container.querySelector('input[type="datetime-local"]')).toBeNull();
|
|
101
|
+
tap(result.getByTestId(testId));
|
|
102
|
+
await waitFor(() => expect(panels().length).toBe(1));
|
|
103
|
+
expect(sheets().length).toBe(0);
|
|
104
|
+
expect(document.querySelector("[data-fp-trigger-row]")).not.toBeNull();
|
|
73
105
|
});
|
|
74
106
|
|
|
75
|
-
it("
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
107
|
+
it("a blank tap opens nothing", async () => {
|
|
108
|
+
const result = renderWithProviders(<Page />);
|
|
109
|
+
tap(result.getByTestId("blank"));
|
|
110
|
+
tap(document.body);
|
|
79
111
|
await act(async () => {
|
|
80
|
-
|
|
112
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
81
113
|
});
|
|
82
|
-
expect(
|
|
83
|
-
|
|
84
|
-
expect(picked.getTime()).toBe(new Date(2026, 2, 5).getTime());
|
|
85
|
-
expect(result.container.querySelector('input[value="Mar 5, 2026"]')).not.toBeNull();
|
|
86
|
-
expect(touchInput(result.container, "date").value).toBe("2026-03-05");
|
|
114
|
+
expect(panels().length).toBe(0);
|
|
115
|
+
expect(sheets().length).toBe(0);
|
|
87
116
|
});
|
|
88
117
|
|
|
89
|
-
it("
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
});
|
|
97
|
-
await waitFor(() => dayButton(document.body, "5"));
|
|
98
|
-
await act(async () => {
|
|
99
|
-
fireEvent.click(dayButton(document.body, "5"));
|
|
100
|
-
});
|
|
101
|
-
desktop.unmount();
|
|
102
|
-
|
|
103
|
-
coarse = true;
|
|
104
|
-
const touch = vi.fn();
|
|
105
|
-
const phone = renderWithProviders(
|
|
106
|
-
<DatePicker label="Due" name="due" value="2026-03-01" onChange={touch} />,
|
|
107
|
-
);
|
|
108
|
-
expect(touchInput(phone.container, "date").value).toBe("2026-03-01");
|
|
109
|
-
await act(async () => {
|
|
110
|
-
fireEvent.change(touchInput(phone.container, "date"), { target: { value: "2026-03-05" } });
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
expect(fine).toHaveBeenCalledTimes(1);
|
|
114
|
-
expect(touch).toHaveBeenCalledTimes(1);
|
|
115
|
-
expect((touch.mock.calls[0][0] as Date).getTime()).toBe(
|
|
116
|
-
(fine.mock.calls[0][0] as Date).getTime(),
|
|
117
|
-
);
|
|
118
|
+
it("only the tapped field opens", async () => {
|
|
119
|
+
const result = renderWithProviders(<Page />);
|
|
120
|
+
tap(result.getByTestId("time-picker-trigger"));
|
|
121
|
+
await waitFor(() => expect(panels().length).toBe(1));
|
|
122
|
+
const panel = panels()[0] as HTMLElement;
|
|
123
|
+
expect(panel.querySelector('[data-testid="time-picker-panel"]')).not.toBeNull();
|
|
124
|
+
expect(panel.textContent).not.toContain("March");
|
|
118
125
|
});
|
|
119
126
|
|
|
120
|
-
it("
|
|
121
|
-
coarse = true;
|
|
127
|
+
it("the clear ✕ clears without opening", async () => {
|
|
122
128
|
const onChange = vi.fn();
|
|
123
129
|
const result = renderWithProviders(
|
|
124
|
-
<DatePicker label="Due" name="due" value=
|
|
130
|
+
<DatePicker label="Due" name="due" value={new Date(2026, 2, 5)} onChange={onChange} />,
|
|
125
131
|
);
|
|
132
|
+
tap(result.getByTestId("date-picker-clear"));
|
|
126
133
|
await act(async () => {
|
|
127
|
-
|
|
134
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
128
135
|
});
|
|
129
136
|
expect(onChange).toHaveBeenLastCalledWith(null);
|
|
137
|
+
expect(panels().length).toBe(0);
|
|
130
138
|
});
|
|
131
139
|
|
|
132
|
-
it("
|
|
133
|
-
coarse = true;
|
|
134
|
-
const result = renderWithProviders(
|
|
135
|
-
<DatePicker
|
|
136
|
-
label="Due"
|
|
137
|
-
name="due"
|
|
138
|
-
minDate={new Date(2026, 0, 2)}
|
|
139
|
-
maxDate={new Date(2026, 11, 30)}
|
|
140
|
-
/>,
|
|
141
|
-
);
|
|
142
|
-
const input = touchInput(result.container, "date");
|
|
143
|
-
expect(input.min).toBe("2026-01-02");
|
|
144
|
-
expect(input.max).toBe("2026-12-30");
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
it("commits into form state", async () => {
|
|
148
|
-
coarse = true;
|
|
140
|
+
it("a day picked in the panel commits the calendar's Date into form state", async () => {
|
|
149
141
|
const onSubmit = vi.fn();
|
|
150
142
|
const Fixture = () => {
|
|
151
143
|
const form = useForm({
|
|
152
|
-
defaultValues: { due:
|
|
144
|
+
defaultValues: { due: new Date(2026, 2, 1) as Date | null },
|
|
153
145
|
onSubmit: async ({ value }) => onSubmit(value),
|
|
154
146
|
});
|
|
155
147
|
return (
|
|
@@ -160,99 +152,49 @@ describe("Date on touch web (FZ-8114)", () => {
|
|
|
160
152
|
);
|
|
161
153
|
};
|
|
162
154
|
const result = renderWithProviders(<Fixture />);
|
|
155
|
+
tap(result.getByTestId("date-picker-trigger"));
|
|
156
|
+
await waitFor(() => expect(panels().length).toBe(1));
|
|
163
157
|
await act(async () => {
|
|
164
|
-
fireEvent.
|
|
158
|
+
fireEvent.click(dayButton(panels()[0] as HTMLElement, "15"));
|
|
165
159
|
});
|
|
160
|
+
await waitFor(() => expect(panels().length).toBe(0));
|
|
166
161
|
await act(async () => {
|
|
167
162
|
fireEvent.click(result.getSubmitButton() as HTMLElement);
|
|
168
163
|
});
|
|
169
164
|
await waitFor(() => expect(onSubmit).toHaveBeenCalledTimes(1));
|
|
170
|
-
expect(formatCalendarDate(onSubmit.mock.calls[0][0].due, "date")).toBe("2026-
|
|
171
|
-
});
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
describe("Datetime on touch web (FZ-8114)", () => {
|
|
175
|
-
it("a coarse pointer renders datetime-local and emits the local wall clock", async () => {
|
|
176
|
-
coarse = true;
|
|
177
|
-
const onChange = vi.fn();
|
|
178
|
-
const result = renderWithProviders(
|
|
179
|
-
<DatetimePicker label="Starts" name="starts" onChange={onChange} />,
|
|
180
|
-
);
|
|
181
|
-
await act(async () => {
|
|
182
|
-
fireEvent.change(touchInput(result.container, "datetime-local"), {
|
|
183
|
-
target: { value: "2026-03-05T14:30" },
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
const picked = onChange.mock.calls[0][0] as Date;
|
|
187
|
-
expect(formatCalendarDate(picked, "datetime")).toBe("2026-03-05 14:30:00");
|
|
188
|
-
expect(touchInput(result.container, "datetime-local").value).toBe("2026-03-05T14:30");
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
it("seconds widen the input's step and survive the round trip", () => {
|
|
192
|
-
coarse = true;
|
|
193
|
-
const result = renderWithProviders(
|
|
194
|
-
<DatetimePicker
|
|
195
|
-
label="Starts"
|
|
196
|
-
name="starts"
|
|
197
|
-
showSeconds
|
|
198
|
-
value={new Date(2026, 2, 5, 14, 30, 15)}
|
|
199
|
-
/>,
|
|
200
|
-
);
|
|
201
|
-
const input = touchInput(result.container, "datetime-local");
|
|
202
|
-
expect(input.step).toBe("1");
|
|
203
|
-
expect(input.value).toBe("2026-03-05T14:30:15");
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
it("a fine pointer keeps the MPO panel trigger", () => {
|
|
207
|
-
const result = renderWithProviders(<DatetimePicker label="Starts" name="starts" />);
|
|
208
|
-
expect(result.container.querySelector('input[type="datetime-local"]')).toBeNull();
|
|
209
|
-
expect(result.container.querySelector('[role="combobox"]')).not.toBeNull();
|
|
165
|
+
expect(formatCalendarDate(onSubmit.mock.calls[0][0].due, "date")).toBe("2026-03-15");
|
|
210
166
|
});
|
|
211
167
|
});
|
|
212
168
|
|
|
213
|
-
describe("
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
169
|
+
describe("a field too low for the panel (LC-105 collision)", () => {
|
|
170
|
+
afterEach(() => {
|
|
171
|
+
vi.restoreAllMocks();
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it("takes MPO's bottom sheet, still never a native input", async () => {
|
|
175
|
+
const field = { x: 16, y: window.innerHeight - 60, width: 358, height: 44 };
|
|
176
|
+
const original = HTMLElement.prototype.getBoundingClientRect;
|
|
177
|
+
vi.spyOn(HTMLElement.prototype, "getBoundingClientRect").mockImplementation(
|
|
178
|
+
function (this: HTMLElement) {
|
|
179
|
+
if (!this.hasAttribute("data-fp-reference")) return original.call(this);
|
|
180
|
+
return {
|
|
181
|
+
...field,
|
|
182
|
+
top: field.y,
|
|
183
|
+
left: field.x,
|
|
184
|
+
right: field.x + field.width,
|
|
185
|
+
bottom: field.y + field.height,
|
|
186
|
+
toJSON: () => ({}),
|
|
187
|
+
} as DOMRect;
|
|
188
|
+
},
|
|
219
189
|
);
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
});
|
|
225
|
-
expect(onChange).toHaveBeenLastCalledWith("14:30");
|
|
226
|
-
expect(result.container.querySelector('input[value="2:30 PM"]')).not.toBeNull();
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
it("showSeconds emits HH:mm:ss even when the browser drops :00", async () => {
|
|
230
|
-
coarse = true;
|
|
231
|
-
const onChange = vi.fn();
|
|
232
|
-
const result = renderWithProviders(
|
|
233
|
-
<TimePicker label="At" name="at" showSeconds onChange={onChange} />,
|
|
190
|
+
vi.spyOn(HTMLElement.prototype, "scrollHeight", "get").mockImplementation(
|
|
191
|
+
function (this: HTMLElement) {
|
|
192
|
+
return this.hasAttribute("data-fp-panel") ? 350 : 0;
|
|
193
|
+
},
|
|
234
194
|
);
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
expect(
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
it("a fine pointer keeps the MPO wheels trigger", () => {
|
|
242
|
-
const result = renderWithProviders(<TimePicker label="At" name="at" />);
|
|
243
|
-
expect(result.container.querySelector('input[type="time"]')).toBeNull();
|
|
244
|
-
});
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
describe("the touch input stays inside its box (FZ-8114)", () => {
|
|
248
|
-
it.each([
|
|
249
|
-
["date", <DatePicker key="d" label="Due" name="due" />],
|
|
250
|
-
["datetime-local", <DatetimePicker key="dt" label="Starts" name="starts" />],
|
|
251
|
-
["time", <TimePicker key="t" label="At" name="at" />],
|
|
252
|
-
] as const)("the %s input's box is its positioning context", (type, field) => {
|
|
253
|
-
coarse = true;
|
|
254
|
-
const result = renderWithProviders(field);
|
|
255
|
-
const box = touchInput(result.container, type).parentElement as HTMLElement;
|
|
256
|
-
expect(getComputedStyle(box).position).toBe("relative");
|
|
195
|
+
const result = renderWithProviders(<DatePicker label="Due" name="due" />);
|
|
196
|
+
tap(result.getByTestId("date-picker-trigger"));
|
|
197
|
+
await waitFor(() => expect(sheets().length).toBe(1));
|
|
198
|
+
expect(document.querySelector("input[type=date], input[type=time]")).toBeNull();
|
|
257
199
|
});
|
|
258
200
|
});
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FZ-8438 (Clay's rv_0ea65e640a0ef261, an iPad Select inside a sheet): the
|
|
3
|
+
* listbox is `position: fixed`, and inside a transformed sheet it lays out
|
|
4
|
+
* against that sheet, not the viewport. Its top is offset by the sheet's
|
|
5
|
+
* origin so the panel still lands on its field.
|
|
6
|
+
*/
|
|
7
|
+
import { fireEvent, waitFor } from "@testing-library/react";
|
|
8
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
9
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
10
|
+
import { OverlayStackProvider } from "../../shared/overlayStack";
|
|
11
|
+
import { Select, type SelectOption } from "./index";
|
|
12
|
+
|
|
13
|
+
const options: SelectOption[] = [
|
|
14
|
+
{ value: "hel", label: "Helsinki" },
|
|
15
|
+
{ value: "fsn", label: "Falkenstein" },
|
|
16
|
+
{ value: "nbg", label: "Nuremberg" },
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
async function openTop(result: ReturnType<typeof renderWithProviders>) {
|
|
20
|
+
fireEvent.keyDown(result.getByTestId("select-trigger"), { key: "Enter" });
|
|
21
|
+
const dropdown = await result.findByTestId("select-dropdown");
|
|
22
|
+
await waitFor(() => expect(dropdown.style.top).not.toBe(""));
|
|
23
|
+
return { dropdown, top: parseFloat(dropdown.style.top) };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
describe("Select inside a transformed sheet (FZ-8438)", () => {
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
Object.defineProperty(window, "innerWidth", {
|
|
29
|
+
configurable: true,
|
|
30
|
+
writable: true,
|
|
31
|
+
value: 1200,
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("offsets its top by the sheet it lays out against", async () => {
|
|
36
|
+
const plain = renderWithProviders(<Select options={options} value="hel" />);
|
|
37
|
+
const { top: viewportTop } = await openTop(plain);
|
|
38
|
+
plain.unmount();
|
|
39
|
+
|
|
40
|
+
const result = renderWithProviders(
|
|
41
|
+
<div
|
|
42
|
+
role="dialog"
|
|
43
|
+
data-testid="sheet"
|
|
44
|
+
style={{ transform: "translateY(0px)", overflowY: "auto", height: 100 }}
|
|
45
|
+
>
|
|
46
|
+
<Select options={options} value="hel" />
|
|
47
|
+
</div>,
|
|
48
|
+
);
|
|
49
|
+
const sheet = result.getByTestId("sheet");
|
|
50
|
+
sheet.scrollTop = 40;
|
|
51
|
+
const { dropdown, top } = await openTop(result);
|
|
52
|
+
expect(sheet.contains(dropdown)).toBe(true);
|
|
53
|
+
expect(top).toBe(viewportTop + 40);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
describe("Select seamless cover (LC-112, FZ-8438)", () => {
|
|
58
|
+
beforeEach(() => {
|
|
59
|
+
Object.defineProperty(window, "innerWidth", {
|
|
60
|
+
configurable: true,
|
|
61
|
+
writable: true,
|
|
62
|
+
value: 1200,
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
afterEach(() => {
|
|
66
|
+
vi.restoreAllMocks();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("opens on the field's top edge with the field echoed as a hidden first row", async () => {
|
|
70
|
+
const original = HTMLElement.prototype.getBoundingClientRect;
|
|
71
|
+
vi.spyOn(HTMLElement.prototype, "getBoundingClientRect").mockImplementation(
|
|
72
|
+
function (this: HTMLElement) {
|
|
73
|
+
const field = this.querySelector('[data-testid="select-trigger"]');
|
|
74
|
+
if (this.dataset.testid === "select-trigger" || field) {
|
|
75
|
+
return {
|
|
76
|
+
x: 16,
|
|
77
|
+
y: 200,
|
|
78
|
+
top: 200,
|
|
79
|
+
left: 16,
|
|
80
|
+
right: 416,
|
|
81
|
+
bottom: 240,
|
|
82
|
+
width: 400,
|
|
83
|
+
height: 40,
|
|
84
|
+
toJSON: () => ({}),
|
|
85
|
+
} as DOMRect;
|
|
86
|
+
}
|
|
87
|
+
return original.call(this);
|
|
88
|
+
},
|
|
89
|
+
);
|
|
90
|
+
const result = renderWithProviders(<Select options={options} value="nbg" />);
|
|
91
|
+
const { dropdown, top } = await openTop(result);
|
|
92
|
+
expect(top).toBe(200);
|
|
93
|
+
const echo = dropdown.querySelector<HTMLElement>("[data-fp-trigger-row]");
|
|
94
|
+
expect(echo).not.toBeNull();
|
|
95
|
+
expect(dropdown.firstElementChild).toBe(echo);
|
|
96
|
+
expect(echo?.getAttribute("aria-hidden")).toBe("true");
|
|
97
|
+
expect(echo?.getAttribute("role")).toBeNull();
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
describe("Select drop-up (LC-112, FZ-8438 r3)", () => {
|
|
102
|
+
const field = (top: number) => ({
|
|
103
|
+
x: 16,
|
|
104
|
+
y: top,
|
|
105
|
+
top,
|
|
106
|
+
left: 16,
|
|
107
|
+
right: 416,
|
|
108
|
+
bottom: top + 40,
|
|
109
|
+
width: 400,
|
|
110
|
+
height: 40,
|
|
111
|
+
toJSON: () => ({}),
|
|
112
|
+
});
|
|
113
|
+
let fieldTop = 700;
|
|
114
|
+
beforeEach(() => {
|
|
115
|
+
Object.defineProperty(window, "innerWidth", {
|
|
116
|
+
configurable: true,
|
|
117
|
+
writable: true,
|
|
118
|
+
value: 1024,
|
|
119
|
+
});
|
|
120
|
+
Object.defineProperty(window, "innerHeight", {
|
|
121
|
+
configurable: true,
|
|
122
|
+
writable: true,
|
|
123
|
+
value: 768,
|
|
124
|
+
});
|
|
125
|
+
const original = HTMLElement.prototype.getBoundingClientRect;
|
|
126
|
+
vi.spyOn(HTMLElement.prototype, "getBoundingClientRect").mockImplementation(
|
|
127
|
+
function (this: HTMLElement) {
|
|
128
|
+
if (
|
|
129
|
+
this.dataset.testid === "select-trigger" ||
|
|
130
|
+
this.querySelector('[data-testid="select-trigger"]')
|
|
131
|
+
) {
|
|
132
|
+
return field(fieldTop) as DOMRect;
|
|
133
|
+
}
|
|
134
|
+
return original.call(this);
|
|
135
|
+
},
|
|
136
|
+
);
|
|
137
|
+
vi.spyOn(HTMLElement.prototype, "scrollHeight", "get").mockImplementation(
|
|
138
|
+
function (this: HTMLElement) {
|
|
139
|
+
return this.dataset.testid === "select-dropdown" ? 300 : 0;
|
|
140
|
+
},
|
|
141
|
+
);
|
|
142
|
+
});
|
|
143
|
+
afterEach(() => {
|
|
144
|
+
vi.restoreAllMocks();
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it("a field too low for its list opens upward, its bottom edge on the field's", async () => {
|
|
148
|
+
fieldTop = 700;
|
|
149
|
+
const result = renderWithProviders(<Select options={options} value="hel" />);
|
|
150
|
+
const { dropdown } = await openTop(result);
|
|
151
|
+
// The panel's bottom edge is the field's (740): the 300 list plus the
|
|
152
|
+
// frame's borders, above it.
|
|
153
|
+
await waitFor(() => expect(parseFloat(dropdown.style.top)).toBeLessThan(700));
|
|
154
|
+
expect(parseFloat(dropdown.style.top) + parseFloat(dropdown.style.maxHeight)).toBe(740);
|
|
155
|
+
expect(parseFloat(dropdown.style.maxHeight)).toBeGreaterThanOrEqual(300);
|
|
156
|
+
const echo = dropdown.querySelector<HTMLElement>("[data-fp-trigger-row]");
|
|
157
|
+
await waitFor(() => expect(echo?.style.order).toBe("1"));
|
|
158
|
+
expect(echo?.style.top).toBe("");
|
|
159
|
+
expect(echo?.style.bottom).not.toBe("");
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it("a field with room below keeps the echo on top, opening down", async () => {
|
|
163
|
+
fieldTop = 120;
|
|
164
|
+
const result = renderWithProviders(<Select options={options} value="hel" />);
|
|
165
|
+
const { dropdown, top } = await openTop(result);
|
|
166
|
+
expect(top).toBe(120);
|
|
167
|
+
const echo = dropdown.querySelector<HTMLElement>("[data-fp-trigger-row]");
|
|
168
|
+
expect(echo?.style.order).toBe("");
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
describe("Select beside its field in a sheet (LC-262, FZ-8438)", () => {
|
|
173
|
+
beforeEach(() => {
|
|
174
|
+
Object.defineProperty(window, "innerWidth", {
|
|
175
|
+
configurable: true,
|
|
176
|
+
writable: true,
|
|
177
|
+
value: 1200,
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it("draws no trigger echo row when it opens beside the field", async () => {
|
|
182
|
+
const result = renderWithProviders(
|
|
183
|
+
<OverlayStackProvider zIndex={100000}>
|
|
184
|
+
<Select options={options} value="hel" />
|
|
185
|
+
</OverlayStackProvider>,
|
|
186
|
+
);
|
|
187
|
+
const { dropdown } = await openTop(result);
|
|
188
|
+
expect(dropdown.querySelector("[data-fp-trigger-row]")).toBeNull();
|
|
189
|
+
expect(dropdown.textContent?.match(/Helsinki/g)?.length ?? 0).toBe(1);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
@@ -496,3 +496,46 @@ export const NativeIos: Story = {
|
|
|
496
496
|
native: true,
|
|
497
497
|
},
|
|
498
498
|
};
|
|
499
|
+
|
|
500
|
+
const zoneOptions: SelectOption[] = [
|
|
501
|
+
{ value: "hst", label: "Hawaii" },
|
|
502
|
+
{ value: "akst", label: "Alaska" },
|
|
503
|
+
{ value: "pt", label: "Pacific Time (US and Canada)" },
|
|
504
|
+
{ value: "mt", label: "Mountain Time (US and Canada)" },
|
|
505
|
+
{ value: "ct", label: "Central Time (US and Canada)" },
|
|
506
|
+
{ value: "et", label: "Eastern Time (US and Canada)" },
|
|
507
|
+
{ value: "gmt", label: "London" },
|
|
508
|
+
{ value: "cet", label: "Berlin" },
|
|
509
|
+
{ value: "eet", label: "Helsinki" },
|
|
510
|
+
{ value: "ist", label: "Kolkata" },
|
|
511
|
+
{ value: "jst", label: "Tokyo" },
|
|
512
|
+
{ value: "aest", label: "Sydney" },
|
|
513
|
+
];
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* LC-112 width setting (FZ-8438 r3): the same field opened four ways. Each
|
|
517
|
+
* panel's top edge sits on its field; only the width changes.
|
|
518
|
+
*/
|
|
519
|
+
export const PanelWidths: Story = {
|
|
520
|
+
render: () => (
|
|
521
|
+
<YStack gap="$4" width={260}>
|
|
522
|
+
<Select label="Content" options={zoneOptions} defaultValue="pt" panelWidth="content" />
|
|
523
|
+
<Select label="Trigger" options={zoneOptions} defaultValue="pt" panelWidth="trigger" />
|
|
524
|
+
<Select label="Screen" options={zoneOptions} defaultValue="pt" panelWidth="screen" />
|
|
525
|
+
<Select label="Fixed 360" options={zoneOptions} defaultValue="pt" panelWidth={360} />
|
|
526
|
+
</YStack>
|
|
527
|
+
),
|
|
528
|
+
};
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* Phone width (LC-112, FZ-7830): a long list opens its sheet at page level and
|
|
532
|
+
* a short one (seven or fewer options) opens as a menu over its field.
|
|
533
|
+
*/
|
|
534
|
+
export const PhoneLists: Story = {
|
|
535
|
+
render: () => (
|
|
536
|
+
<YStack gap="$4">
|
|
537
|
+
<Select label="Time zone" options={zoneOptions} defaultValue="pt" />
|
|
538
|
+
<Select label="Country" options={countryOptions} defaultValue="us" />
|
|
539
|
+
</YStack>
|
|
540
|
+
),
|
|
541
|
+
};
|