@multiplatform.one/forms 7.63.4 → 7.65.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/AdaptivePopup/index.cjs +3 -5
- package/dist/cjs/AdaptivePopup/index.native.js +3 -5
- package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
- package/dist/cjs/Button/index.cjs +1 -0
- package/dist/cjs/Button/index.native.js +1 -0
- package/dist/cjs/Button/index.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/SystemColorField.cjs +106 -0
- package/dist/cjs/fields/ColorPicker/SystemColorField.native.js +110 -0
- package/dist/cjs/fields/ColorPicker/SystemColorField.native.js.map +1 -0
- package/dist/cjs/fields/ColorPicker/index.cjs +36 -4
- package/dist/cjs/fields/ColorPicker/index.native.js +36 -6
- package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/systemColorWell.cjs +30 -0
- package/dist/cjs/fields/ColorPicker/systemColorWell.gnome.cjs +30 -0
- package/dist/cjs/fields/ColorPicker/systemColorWell.gnome.native.js +33 -0
- package/dist/cjs/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -0
- package/dist/cjs/fields/ColorPicker/systemColorWell.native.js +111 -0
- package/dist/cjs/fields/ColorPicker/systemColorWell.native.js.map +1 -0
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.cjs +27 -0
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +31 -0
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/catalog.cjs +30 -1
- package/dist/cjs/fields/DatePicker/catalog.native.js +32 -1
- package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/parts.cjs +17 -6
- package/dist/cjs/fields/DatePicker/parts.native.js +17 -6
- package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/catalog.cjs +24 -0
- package/dist/cjs/fields/TimePicker/catalog.native.js +28 -0
- package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/parts.cjs +20 -8
- package/dist/cjs/fields/TimePicker/parts.native.js +20 -8
- package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/cjs/shared/focusManagement.cjs +1 -5
- package/dist/cjs/shared/focusManagement.native.js +1 -5
- package/dist/cjs/shared/focusManagement.native.js.map +1 -1
- package/dist/cjs/shared/touchWebPicker.cjs +136 -0
- package/dist/cjs/shared/touchWebPicker.native.js +154 -0
- package/dist/cjs/shared/touchWebPicker.native.js.map +1 -0
- package/dist/esm/AdaptivePopup/index.mjs +4 -6
- package/dist/esm/AdaptivePopup/index.mjs.map +1 -1
- package/dist/esm/AdaptivePopup/index.native.js +4 -6
- package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
- package/dist/esm/Button/index.mjs +2 -1
- package/dist/esm/Button/index.mjs.map +1 -1
- package/dist/esm/Button/index.native.js +2 -1
- package/dist/esm/Button/index.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/SystemColorField.mjs +81 -0
- package/dist/esm/fields/ColorPicker/SystemColorField.mjs.map +1 -0
- package/dist/esm/fields/ColorPicker/SystemColorField.native.js +82 -0
- package/dist/esm/fields/ColorPicker/SystemColorField.native.js.map +1 -0
- package/dist/esm/fields/ColorPicker/index.mjs +36 -4
- package/dist/esm/fields/ColorPicker/index.mjs.map +1 -1
- package/dist/esm/fields/ColorPicker/index.native.js +36 -6
- package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/systemColorWell.gnome.mjs +5 -0
- package/dist/esm/fields/ColorPicker/systemColorWell.gnome.mjs.map +1 -0
- package/dist/esm/fields/ColorPicker/systemColorWell.gnome.native.js +5 -0
- package/dist/esm/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -0
- package/dist/esm/fields/ColorPicker/systemColorWell.mjs +5 -0
- package/dist/esm/fields/ColorPicker/systemColorWell.mjs.map +1 -0
- package/dist/esm/fields/ColorPicker/systemColorWell.native.js +77 -0
- package/dist/esm/fields/ColorPicker/systemColorWell.native.js.map +1 -0
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs +27 -0
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js +31 -0
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/catalog.mjs +30 -1
- package/dist/esm/fields/DatePicker/catalog.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/catalog.native.js +32 -1
- package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/parts.mjs +17 -6
- package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/parts.native.js +17 -6
- package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
- package/dist/esm/fields/TimePicker/catalog.mjs +24 -0
- package/dist/esm/fields/TimePicker/catalog.mjs.map +1 -1
- package/dist/esm/fields/TimePicker/catalog.native.js +28 -0
- package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -1
- package/dist/esm/fields/TimePicker/parts.mjs +20 -8
- package/dist/esm/fields/TimePicker/parts.mjs.map +1 -1
- package/dist/esm/fields/TimePicker/parts.native.js +20 -8
- package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/esm/shared/focusManagement.mjs +2 -6
- package/dist/esm/shared/focusManagement.mjs.map +1 -1
- package/dist/esm/shared/focusManagement.native.js +2 -6
- package/dist/esm/shared/focusManagement.native.js.map +1 -1
- package/dist/esm/shared/touchWebPicker.mjs +105 -0
- package/dist/esm/shared/touchWebPicker.mjs.map +1 -0
- package/dist/esm/shared/touchWebPicker.native.js +120 -0
- package/dist/esm/shared/touchWebPicker.native.js.map +1 -0
- package/dist/jsx/AdaptivePopup/index.mjs +4 -6
- package/dist/jsx/AdaptivePopup/index.mjs.map +1 -1
- package/dist/jsx/AdaptivePopup/index.native.js +3 -5
- package/dist/jsx/AdaptivePopup/index.native.js.map +1 -1
- package/dist/jsx/Button/index.mjs +2 -1
- package/dist/jsx/Button/index.mjs.map +1 -1
- package/dist/jsx/Button/index.native.js +1 -0
- package/dist/jsx/Button/index.native.js.map +1 -1
- package/dist/jsx/fields/ColorPicker/SystemColorField.mjs +81 -0
- package/dist/jsx/fields/ColorPicker/SystemColorField.mjs.map +1 -0
- package/dist/jsx/fields/ColorPicker/SystemColorField.native.js +110 -0
- package/dist/jsx/fields/ColorPicker/SystemColorField.native.js.map +1 -0
- package/dist/jsx/fields/ColorPicker/index.mjs +36 -4
- package/dist/jsx/fields/ColorPicker/index.mjs.map +1 -1
- package/dist/jsx/fields/ColorPicker/index.native.js +36 -6
- package/dist/jsx/fields/ColorPicker/index.native.js.map +1 -1
- package/dist/jsx/fields/ColorPicker/systemColorWell.gnome.mjs +5 -0
- package/dist/jsx/fields/ColorPicker/systemColorWell.gnome.mjs.map +1 -0
- package/dist/jsx/fields/ColorPicker/systemColorWell.gnome.native.js +33 -0
- package/dist/jsx/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -0
- package/dist/jsx/fields/ColorPicker/systemColorWell.mjs +5 -0
- package/dist/jsx/fields/ColorPicker/systemColorWell.mjs.map +1 -0
- package/dist/jsx/fields/ColorPicker/systemColorWell.native.js +111 -0
- package/dist/jsx/fields/ColorPicker/systemColorWell.native.js.map +1 -0
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs +27 -0
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js +31 -0
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/catalog.mjs +30 -1
- package/dist/jsx/fields/DatePicker/catalog.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/catalog.native.js +32 -1
- package/dist/jsx/fields/DatePicker/catalog.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/parts.mjs +17 -6
- package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/parts.native.js +17 -6
- package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
- package/dist/jsx/fields/TimePicker/catalog.mjs +24 -0
- package/dist/jsx/fields/TimePicker/catalog.mjs.map +1 -1
- package/dist/jsx/fields/TimePicker/catalog.native.js +28 -0
- package/dist/jsx/fields/TimePicker/catalog.native.js.map +1 -1
- package/dist/jsx/fields/TimePicker/parts.mjs +20 -8
- package/dist/jsx/fields/TimePicker/parts.mjs.map +1 -1
- package/dist/jsx/fields/TimePicker/parts.native.js +20 -8
- package/dist/jsx/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/jsx/shared/focusManagement.mjs +2 -6
- package/dist/jsx/shared/focusManagement.mjs.map +1 -1
- package/dist/jsx/shared/focusManagement.native.js +1 -5
- package/dist/jsx/shared/focusManagement.native.js.map +1 -1
- package/dist/jsx/shared/touchWebPicker.mjs +105 -0
- package/dist/jsx/shared/touchWebPicker.mjs.map +1 -0
- package/dist/jsx/shared/touchWebPicker.native.js +154 -0
- package/dist/jsx/shared/touchWebPicker.native.js.map +1 -0
- package/package.json +13 -8
- package/src/AdaptivePopup/index.tsx +4 -3
- package/src/Button/index.tsx +4 -0
- package/src/fields/ColorPicker/SystemColorField.tsx +101 -0
- package/src/fields/ColorPicker/index.tsx +48 -13
- package/src/fields/ColorPicker/systemColorWell.gnome.ts +7 -0
- package/src/fields/ColorPicker/systemColorWell.native.spec.tsx +266 -0
- package/src/fields/ColorPicker/systemColorWell.native.tsx +144 -0
- package/src/fields/ColorPicker/systemColorWell.ts +21 -0
- package/src/fields/DatePicker/DatePicker.stories.tsx +27 -1
- package/src/fields/DatePicker/DatetimePicker.catalog.tsx +45 -1
- package/src/fields/DatePicker/catalog.tsx +48 -8
- package/src/fields/DatePicker/parts.tsx +19 -4
- package/src/fields/DatePicker/touchWeb.spec.tsx +245 -0
- package/src/fields/TimePicker/catalog.tsx +33 -0
- package/src/fields/TimePicker/parts.tsx +19 -6
- package/src/overlayGround.spec.ts +50 -0
- package/src/shared/focusManagement.ts +7 -3
- package/src/shared/touchWebPicker.spec.ts +98 -0
- package/src/shared/touchWebPicker.tsx +158 -0
- package/types/AdaptivePopup/index.d.ts.map +1 -1
- package/types/Button/index.d.ts.map +1 -1
- package/types/fields/ColorPicker/SystemColorField.d.ts +22 -0
- package/types/fields/ColorPicker/SystemColorField.d.ts.map +1 -0
- package/types/fields/ColorPicker/index.d.ts.map +1 -1
- package/types/fields/ColorPicker/systemColorWell.d.ts +18 -0
- package/types/fields/ColorPicker/systemColorWell.d.ts.map +1 -0
- package/types/fields/ColorPicker/systemColorWell.gnome.d.ts +5 -0
- package/types/fields/ColorPicker/systemColorWell.gnome.d.ts.map +1 -0
- package/types/fields/ColorPicker/systemColorWell.native.d.ts +55 -0
- package/types/fields/ColorPicker/systemColorWell.native.d.ts.map +1 -0
- package/types/fields/DatePicker/DatetimePicker.catalog.d.ts +1 -1
- package/types/fields/DatePicker/DatetimePicker.catalog.d.ts.map +1 -1
- package/types/fields/DatePicker/catalog.d.ts.map +1 -1
- package/types/fields/DatePicker/parts.d.ts +6 -1
- package/types/fields/DatePicker/parts.d.ts.map +1 -1
- package/types/fields/TimePicker/catalog.d.ts.map +1 -1
- package/types/fields/TimePicker/parts.d.ts +3 -1
- package/types/fields/TimePicker/parts.d.ts.map +1 -1
- package/types/shared/focusManagement.d.ts.map +1 -1
- package/types/shared/touchWebPicker.d.ts +40 -0
- package/types/shared/touchWebPicker.d.ts.map +1 -0
|
@@ -14,6 +14,12 @@ import {
|
|
|
14
14
|
useResolvedValidators,
|
|
15
15
|
} from "../../shared/utils";
|
|
16
16
|
import type { AnyFormApi } from "../../types";
|
|
17
|
+
import {
|
|
18
|
+
fromTimeInputValue,
|
|
19
|
+
toTimeInputValue,
|
|
20
|
+
TouchWebPickerInput,
|
|
21
|
+
useCoarsePointer,
|
|
22
|
+
} from "../../shared/touchWebPicker";
|
|
17
23
|
import {
|
|
18
24
|
TimePanel,
|
|
19
25
|
TimePickerClearButton,
|
|
@@ -87,6 +93,7 @@ export function TimePicker({
|
|
|
87
93
|
id: idProp,
|
|
88
94
|
});
|
|
89
95
|
const resolvedValidators = useResolvedValidators(required, validators, label, name);
|
|
96
|
+
const touchWeb = useCoarsePointer();
|
|
90
97
|
const [open, setOpen] = useState(false);
|
|
91
98
|
const [internalValue, setInternalValue] = useState<string>(() => valueProp ?? defaultValue ?? "");
|
|
92
99
|
useEffect(() => {
|
|
@@ -167,6 +174,32 @@ export function TimePicker({
|
|
|
167
174
|
if (readOnly) {
|
|
168
175
|
return renderTrigger(triggerValue, hasError, undefined, true);
|
|
169
176
|
}
|
|
177
|
+
if (touchWeb) {
|
|
178
|
+
return (
|
|
179
|
+
<TimePickerInputTrigger
|
|
180
|
+
value={triggerValue}
|
|
181
|
+
placeholder={placeholder}
|
|
182
|
+
disabled={disabled}
|
|
183
|
+
clockIcon={clockIcon}
|
|
184
|
+
onOpen={() => {}}
|
|
185
|
+
onClear={() => handleClear(fieldChange)}
|
|
186
|
+
touchInput={
|
|
187
|
+
<TouchWebPickerInput
|
|
188
|
+
kind="time"
|
|
189
|
+
id={id}
|
|
190
|
+
value={toTimeInputValue(fieldValue ?? value, showSeconds)}
|
|
191
|
+
showSeconds={showSeconds}
|
|
192
|
+
disabled={disabled}
|
|
193
|
+
required={required}
|
|
194
|
+
invalid={hasError}
|
|
195
|
+
aria-label={label ? undefined : t("Time")}
|
|
196
|
+
onValue={(next) => handleChange(fromTimeInputValue(next, showSeconds), fieldChange)}
|
|
197
|
+
onBlur={blurHandler}
|
|
198
|
+
/>
|
|
199
|
+
}
|
|
200
|
+
/>
|
|
201
|
+
);
|
|
202
|
+
}
|
|
170
203
|
return (
|
|
171
204
|
<FloatingPanel
|
|
172
205
|
open={open}
|
|
@@ -124,6 +124,8 @@ interface TimePickerInputTriggerProps {
|
|
|
124
124
|
"aria-readonly"?: boolean;
|
|
125
125
|
/** FZ-7853: same shell, no clear action, nothing opens. */
|
|
126
126
|
readOnly?: boolean;
|
|
127
|
+
/** Touch web (LC-266): the browser's time input, laid over the box; it owns tap, focus and name. */
|
|
128
|
+
touchInput?: ReactNode;
|
|
127
129
|
}
|
|
128
130
|
|
|
129
131
|
export function TimePickerInputTrigger({
|
|
@@ -139,8 +141,9 @@ export function TimePickerInputTrigger({
|
|
|
139
141
|
"aria-invalid": ariaInvalid,
|
|
140
142
|
"aria-readonly": ariaReadonly,
|
|
141
143
|
readOnly,
|
|
144
|
+
touchInput,
|
|
142
145
|
}: TimePickerInputTriggerProps) {
|
|
143
|
-
const interactive = !disabled && !readOnly;
|
|
146
|
+
const interactive = !disabled && !readOnly && !touchInput;
|
|
144
147
|
return (
|
|
145
148
|
<View
|
|
146
149
|
flexDirection="row"
|
|
@@ -160,6 +163,7 @@ export function TimePickerInputTrigger({
|
|
|
160
163
|
onPress={isWeb && interactive ? onOpen : undefined}
|
|
161
164
|
{...(disabled ? { opacity: 0.5, pointerEvents: "none" as const } : undefined)}
|
|
162
165
|
>
|
|
166
|
+
{touchInput}
|
|
163
167
|
<InputParts.Section data-testid="time-picker-glyph">
|
|
164
168
|
<InputParts.Icon adornment="leading" color={formCommonColors.muted}>
|
|
165
169
|
{clockIcon ?? <ClockIcon />}
|
|
@@ -169,15 +173,17 @@ export function TimePickerInputTrigger({
|
|
|
169
173
|
<InputParts.Area
|
|
170
174
|
readOnly
|
|
171
175
|
{...(readOnly ? undefined : { pointerEvents: "none" as const })}
|
|
172
|
-
id={id}
|
|
176
|
+
id={touchInput ? undefined : id}
|
|
173
177
|
value={value}
|
|
174
178
|
placeholder={placeholder}
|
|
175
179
|
disabled={disabled}
|
|
176
180
|
color={formCommonColors.text}
|
|
177
181
|
placeholderTextColor={formCommonColors.muted}
|
|
178
|
-
|
|
179
|
-
aria-
|
|
180
|
-
aria-
|
|
182
|
+
tabIndex={touchInput ? -1 : undefined}
|
|
183
|
+
aria-hidden={touchInput ? true : undefined}
|
|
184
|
+
aria-label={touchInput ? undefined : ariaLabel}
|
|
185
|
+
aria-required={touchInput ? undefined : ariaRequired}
|
|
186
|
+
aria-invalid={touchInput ? undefined : ariaInvalid}
|
|
181
187
|
aria-readonly={readOnly || ariaReadonly || undefined}
|
|
182
188
|
onKeyPress={
|
|
183
189
|
!interactive
|
|
@@ -198,7 +204,14 @@ export function TimePickerInputTrigger({
|
|
|
198
204
|
</InputParts.Section>
|
|
199
205
|
{value && isWeb && !readOnly ? (
|
|
200
206
|
<InputParts.Section>
|
|
201
|
-
|
|
207
|
+
{touchInput ? (
|
|
208
|
+
// Above the touch input, so Clear stays reachable on the box.
|
|
209
|
+
<View zIndex={2}>
|
|
210
|
+
<TimePickerClearButton onClear={onClear} disabled={disabled} />
|
|
211
|
+
</View>
|
|
212
|
+
) : (
|
|
213
|
+
<TimePickerClearButton onClear={onClear} disabled={disabled} />
|
|
214
|
+
)}
|
|
202
215
|
</InputParts.Section>
|
|
203
216
|
) : null}
|
|
204
217
|
</InputParts.Box>
|
|
@@ -25,6 +25,8 @@ import { formControlColors, formSelectedColors, formSwitchColors } from "./share
|
|
|
25
25
|
|
|
26
26
|
/** The card's floor: the console's "a plain Button on an overlay's ground" asks the same. */
|
|
27
27
|
const plateFloor = 1.1;
|
|
28
|
+
/** Round 2: a dark overlay edge is absent, or a hairline at most this much white. */
|
|
29
|
+
const edgeAlphaCeiling = 0.08;
|
|
28
30
|
|
|
29
31
|
type RawThemes = Record<string, Record<string, { val: string } | string>>;
|
|
30
32
|
const themes = createDefaultThemeConfig().tamagui.themes as unknown as RawThemes;
|
|
@@ -105,6 +107,16 @@ describe("FZ-7944: a control on an overlay has a plate distinct from the overlay
|
|
|
105
107
|
describe.each(darkCases)("$label", (c) => {
|
|
106
108
|
const ground = groundOf(c);
|
|
107
109
|
|
|
110
|
+
it("the overlay frame draws no light edge: elevation is the lighter fill and the shadow", () => {
|
|
111
|
+
const { elevatedSurface } = resolveKnobs(c.knobs, undefined, "dark").knobProps;
|
|
112
|
+
const edge = String(elevatedSurface.borderColor);
|
|
113
|
+
const alpha = /^(?:rgba|hsla)\(.*,\s*([\d.]+)\s*\)$/.exec(edge)?.[1];
|
|
114
|
+
expect(
|
|
115
|
+
edge === "transparent" || (alpha !== undefined && Number(alpha) <= edgeAlphaCeiling),
|
|
116
|
+
`${c.label} edge ${edge}`,
|
|
117
|
+
).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
|
|
108
120
|
it("a tinted Button's rest, hover and press each clear the plate floor on the ground", () => {
|
|
109
121
|
if (c.knobs.fillStyle === "outlined") return;
|
|
110
122
|
const paint = controlTierPaint("tinted", true, true);
|
|
@@ -179,3 +191,41 @@ describe("FZ-7944: every frame that paints the elevated ground marks its subtree
|
|
|
179
191
|
for (const tag of resets) expect(tag).toMatch(/\belevated\b/);
|
|
180
192
|
});
|
|
181
193
|
});
|
|
194
|
+
|
|
195
|
+
describe("FZ-7944 round 2, LC-71: the keyboard ring is the accent, never white", () => {
|
|
196
|
+
// A solid accent sub-theme keeps the on-fill ring for content inside the
|
|
197
|
+
// fill (FZ-7715); a Button on the page takes its ring from the parent scope.
|
|
198
|
+
const cases = [...presetCases, ...hueCases].filter((c) => !c.scope.endsWith("_accent"));
|
|
199
|
+
const ownInkHues = ["blue", "red", "green", "yellow", "orange", "pink", "purple"];
|
|
200
|
+
|
|
201
|
+
function channels(color: string): number[] {
|
|
202
|
+
const hex = themePackage.normalizeToHex(color);
|
|
203
|
+
if (!hex) throw new Error(`unparseable ring ${color}`);
|
|
204
|
+
return [1, 3, 5].map((index) => Number.parseInt(hex.slice(index, index + 2), 16));
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
it.each(cases)("$label", ({ scope }) => {
|
|
208
|
+
for (const component of [undefined, "Button"]) {
|
|
209
|
+
const ring = resolve(scope, "$outlineColor", component);
|
|
210
|
+
const rgb = channels(ring);
|
|
211
|
+
expect(
|
|
212
|
+
Math.max(...rgb) - Math.min(...rgb),
|
|
213
|
+
`${scope} ${component ?? ""} ring ${ring}`,
|
|
214
|
+
).toBeGreaterThanOrEqual(24);
|
|
215
|
+
expect(
|
|
216
|
+
ratio(ring, resolve(scope, "$color1")),
|
|
217
|
+
`${scope} ring on its page`,
|
|
218
|
+
).toBeGreaterThanOrEqual(3);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it("a colour scope rings in its own accent ink, any other scope in the root's", () => {
|
|
223
|
+
for (const { scope, scheme } of cases.filter((c) => c.scope === c.label)) {
|
|
224
|
+
const hue = scope.split("_")[1] ?? "";
|
|
225
|
+
const expected = ownInkHues.includes(hue)
|
|
226
|
+
? resolve(scope, "$accentColor")
|
|
227
|
+
: resolve(scheme, "$outlineColor");
|
|
228
|
+
expect(resolve(scope, "$outlineColor"), scope).toBe(expected);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
});
|
|
@@ -36,7 +36,12 @@
|
|
|
36
36
|
|
|
37
37
|
import { useEffect, useRef, type RefObject } from "react";
|
|
38
38
|
import { isWeb, useDialogContext } from "tamagui";
|
|
39
|
-
import {
|
|
39
|
+
import {
|
|
40
|
+
focusOnOpen,
|
|
41
|
+
wasKeyboardFocus,
|
|
42
|
+
useResolvedKnobs,
|
|
43
|
+
motionHideDelayMs,
|
|
44
|
+
} from "@multiplatform.one/theme";
|
|
40
45
|
import { useRestoreRetries } from "./restoreRetries";
|
|
41
46
|
|
|
42
47
|
const FOCUSABLE =
|
|
@@ -152,8 +157,7 @@ export function useSheetModalFocus(
|
|
|
152
157
|
const focusIn = () => {
|
|
153
158
|
if (!canUseDom()) return;
|
|
154
159
|
if (frame.contains(document.activeElement)) return;
|
|
155
|
-
|
|
156
|
-
(first ?? frame).focus({ preventScroll: true, focusVisible: false } as FocusOptions);
|
|
160
|
+
focusOnOpen(frame.querySelector<HTMLElement>(FOCUSABLE), frame);
|
|
157
161
|
};
|
|
158
162
|
// Both frames are tracked: cancelling only the outer one leaves the inner
|
|
159
163
|
// callback live once the outer has already run.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FZ-8114 value contract for the touch-web picker inputs, across timezones.
|
|
3
|
+
* The browser speaks timezone-naive strings; the MPO calendar speaks local
|
|
4
|
+
* Dates. Each zone below must map one onto the other without a day or hour
|
|
5
|
+
* shift. The negative control (the UTC-instant formulation) has to FAIL in
|
|
6
|
+
* some zone, so a host that stopped honouring TZ cannot pass this vacuously.
|
|
7
|
+
*/
|
|
8
|
+
import { formatCalendarDate } from "@multiplatform.one/theme";
|
|
9
|
+
import { describe, expect, it } from "vitest";
|
|
10
|
+
import {
|
|
11
|
+
fromNativeDateValue,
|
|
12
|
+
fromTimeInputValue,
|
|
13
|
+
toDateInputValue,
|
|
14
|
+
toDatetimeLocalValue,
|
|
15
|
+
toTimeInputValue,
|
|
16
|
+
} from "./touchWebPicker";
|
|
17
|
+
|
|
18
|
+
const zones = [
|
|
19
|
+
"UTC",
|
|
20
|
+
"America/Los_Angeles",
|
|
21
|
+
"America/St_Johns",
|
|
22
|
+
"Asia/Kolkata",
|
|
23
|
+
"Pacific/Kiritimati",
|
|
24
|
+
] as const;
|
|
25
|
+
|
|
26
|
+
function inZone<T>(timeZone: string, read: () => T): T {
|
|
27
|
+
const previous = process.env.TZ;
|
|
28
|
+
process.env.TZ = timeZone;
|
|
29
|
+
try {
|
|
30
|
+
return read();
|
|
31
|
+
} finally {
|
|
32
|
+
if (previous === undefined) delete process.env.TZ;
|
|
33
|
+
else process.env.TZ = previous;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
describe("touch-web picker values (FZ-8114)", () => {
|
|
38
|
+
it("the zones really differ on this host", () => {
|
|
39
|
+
const offsets = new Set(
|
|
40
|
+
zones.map((zone) => inZone(zone, () => new Date(2026, 2, 5).getTimezoneOffset())),
|
|
41
|
+
);
|
|
42
|
+
expect(offsets.size).toBe(zones.length);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
for (const zone of zones) {
|
|
46
|
+
describe(zone, () => {
|
|
47
|
+
it("date: the calendar's local midnight and the input string round-trip", () => {
|
|
48
|
+
inZone(zone, () => {
|
|
49
|
+
const picked = new Date(2026, 2, 5);
|
|
50
|
+
expect(toDateInputValue(picked)).toBe("2026-03-05");
|
|
51
|
+
const back = fromNativeDateValue("2026-03-05");
|
|
52
|
+
expect(back?.getTime()).toBe(picked.getTime());
|
|
53
|
+
expect(formatCalendarDate(back, "date")).toBe("2026-03-05");
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("datetime: the local wall clock and the datetime-local string round-trip", () => {
|
|
58
|
+
inZone(zone, () => {
|
|
59
|
+
const picked = new Date(2026, 7, 15, 23, 45, 30);
|
|
60
|
+
expect(toDatetimeLocalValue(picked, false)).toBe("2026-08-15T23:45");
|
|
61
|
+
expect(toDatetimeLocalValue(picked, true)).toBe("2026-08-15T23:45:30");
|
|
62
|
+
const back = fromNativeDateValue("2026-08-15T23:45");
|
|
63
|
+
expect(back?.getTime()).toBe(new Date(2026, 7, 15, 23, 45, 0).getTime());
|
|
64
|
+
expect(formatCalendarDate(back, "datetime")).toBe("2026-08-15 23:45:00");
|
|
65
|
+
const withSeconds = fromNativeDateValue("2026-08-15T23:45:30");
|
|
66
|
+
expect(withSeconds?.getTime()).toBe(picked.getTime());
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
it("negative control: the UTC instant names the wrong day in some zone", () => {
|
|
73
|
+
const wrong = zones.filter((zone) =>
|
|
74
|
+
inZone(zone, () => new Date(2026, 7, 15).toISOString().slice(0, 10) !== "2026-08-15"),
|
|
75
|
+
);
|
|
76
|
+
expect(wrong.length).toBeGreaterThan(0);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("empty and unparseable input clears", () => {
|
|
80
|
+
expect(toDateInputValue(null)).toBe("");
|
|
81
|
+
expect(toDatetimeLocalValue(undefined, true)).toBe("");
|
|
82
|
+
expect(fromNativeDateValue("")).toBeNull();
|
|
83
|
+
expect(fromNativeDateValue("2026-13-45")).toBeNull();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("time: the input string normalises to the string TimePicker's wheels emit", () => {
|
|
87
|
+
expect(fromTimeInputValue("14:30", false)).toBe("14:30");
|
|
88
|
+
expect(fromTimeInputValue("14:30", true)).toBe("14:30:00");
|
|
89
|
+
expect(fromTimeInputValue("14:30:15", false)).toBe("14:30");
|
|
90
|
+
expect(fromTimeInputValue("14:30:15.250", true)).toBe("14:30:15");
|
|
91
|
+
expect(fromTimeInputValue("9:05", false)).toBe("09:05");
|
|
92
|
+
expect(fromTimeInputValue("", false)).toBe("");
|
|
93
|
+
expect(fromTimeInputValue("25:00", false)).toBe("");
|
|
94
|
+
expect(toTimeInputValue("08:00:00", false)).toBe("08:00");
|
|
95
|
+
expect(toTimeInputValue("08:00", true)).toBe("08:00:00");
|
|
96
|
+
expect(toTimeInputValue(undefined, false)).toBe("");
|
|
97
|
+
});
|
|
98
|
+
});
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { formatCalendarDate, parseCalendarDate } from "@multiplatform.one/theme";
|
|
2
|
+
import { type CSSProperties, useSyncExternalStore } from "react";
|
|
3
|
+
import { isWeb } from "tamagui";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* LC-266 on touch web (FZ-8114): a coarse primary pointer gets the browser's
|
|
7
|
+
* own picker (`input type=date|time|datetime-local`), laid transparently over
|
|
8
|
+
* the MPO box. iOS Safari opens its picker only for a real tap on the input,
|
|
9
|
+
* so the input has to be what the finger hits.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export type TouchWebPickerKind = "date" | "time" | "datetime-local";
|
|
13
|
+
|
|
14
|
+
const coarsePointerQuery = "(pointer: coarse)";
|
|
15
|
+
|
|
16
|
+
function coarsePointerList(): MediaQueryList | null {
|
|
17
|
+
if (!isWeb || typeof window === "undefined" || typeof window.matchMedia !== "function") {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
return window.matchMedia(coarsePointerQuery);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function subscribeCoarsePointer(onChange: () => void): () => void {
|
|
24
|
+
const list = coarsePointerList();
|
|
25
|
+
if (!list) return () => {};
|
|
26
|
+
if (typeof list.addEventListener === "function") {
|
|
27
|
+
list.addEventListener("change", onChange);
|
|
28
|
+
return () => list.removeEventListener("change", onChange);
|
|
29
|
+
}
|
|
30
|
+
list.addListener?.(onChange);
|
|
31
|
+
return () => list.removeListener?.(onChange);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function readCoarsePointer(): boolean {
|
|
35
|
+
return coarsePointerList()?.matches ?? false;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Primary pointer only: a touch laptop driven by its trackpad reports `fine`
|
|
40
|
+
* and keeps the keyboard field. SSR and hydration read `false`.
|
|
41
|
+
*/
|
|
42
|
+
export function useCoarsePointer(): boolean {
|
|
43
|
+
return useSyncExternalStore(subscribeCoarsePointer, readCoarsePointer, () => false);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function toDateInputValue(value: Date | null | undefined): string {
|
|
47
|
+
return value ? formatCalendarDate(value, "date") : "";
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function toDatetimeLocalValue(value: Date | null | undefined, showSeconds: boolean): string {
|
|
51
|
+
if (!value) return "";
|
|
52
|
+
const wire = formatCalendarDate(value, "datetime").replace(" ", "T");
|
|
53
|
+
return showSeconds ? wire : wire.slice(0, 16);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The browser's string is timezone-naive, so it is read onto LOCAL parts:
|
|
58
|
+
* the same Date the MPO calendar builds for that day or wall clock.
|
|
59
|
+
*/
|
|
60
|
+
export function fromNativeDateValue(value: string): Date | null {
|
|
61
|
+
return parseCalendarDate(value);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const nativeTimePattern = /^([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d)(?:\.\d+)?)?$/;
|
|
65
|
+
|
|
66
|
+
/** Browsers drop `:00` seconds or add milliseconds; both normalise to TimePicker's string. */
|
|
67
|
+
export function fromTimeInputValue(value: string, showSeconds: boolean): string {
|
|
68
|
+
const match = value
|
|
69
|
+
.trim()
|
|
70
|
+
.replace(/^(\d):/, "0$1:")
|
|
71
|
+
.match(nativeTimePattern);
|
|
72
|
+
if (!match) return "";
|
|
73
|
+
const base = `${match[1]}:${match[2]}`;
|
|
74
|
+
return showSeconds ? `${base}:${match[3] ?? "00"}` : base;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function toTimeInputValue(value: string | null | undefined, showSeconds: boolean): string {
|
|
78
|
+
return fromTimeInputValue(value ?? "", showSeconds);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const overlayStyle: CSSProperties = {
|
|
82
|
+
position: "absolute",
|
|
83
|
+
top: 0,
|
|
84
|
+
left: 0,
|
|
85
|
+
width: "100%",
|
|
86
|
+
height: "100%",
|
|
87
|
+
margin: 0,
|
|
88
|
+
padding: 0,
|
|
89
|
+
border: 0,
|
|
90
|
+
opacity: 0,
|
|
91
|
+
// iOS Safari zooms the page into a focused input under 16px.
|
|
92
|
+
fontSize: 16,
|
|
93
|
+
cursor: "pointer",
|
|
94
|
+
zIndex: 1,
|
|
95
|
+
WebkitAppearance: "none",
|
|
96
|
+
appearance: "none",
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export interface TouchWebPickerInputProps {
|
|
100
|
+
kind: TouchWebPickerKind;
|
|
101
|
+
value: string;
|
|
102
|
+
onValue: (value: string) => void;
|
|
103
|
+
onBlur?: () => void;
|
|
104
|
+
id?: string;
|
|
105
|
+
min?: string;
|
|
106
|
+
max?: string;
|
|
107
|
+
showSeconds?: boolean;
|
|
108
|
+
disabled?: boolean;
|
|
109
|
+
required?: boolean;
|
|
110
|
+
invalid?: boolean;
|
|
111
|
+
"aria-label"?: string;
|
|
112
|
+
"aria-describedby"?: string;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** FieldLayout's label targets `id`, so the input carries the field's name. */
|
|
116
|
+
export function TouchWebPickerInput({
|
|
117
|
+
kind,
|
|
118
|
+
value,
|
|
119
|
+
onValue,
|
|
120
|
+
onBlur,
|
|
121
|
+
id,
|
|
122
|
+
min,
|
|
123
|
+
max,
|
|
124
|
+
showSeconds,
|
|
125
|
+
disabled,
|
|
126
|
+
required,
|
|
127
|
+
invalid,
|
|
128
|
+
"aria-label": ariaLabel,
|
|
129
|
+
"aria-describedby": ariaDescribedBy,
|
|
130
|
+
}: TouchWebPickerInputProps) {
|
|
131
|
+
return (
|
|
132
|
+
<input
|
|
133
|
+
type={kind}
|
|
134
|
+
id={id}
|
|
135
|
+
value={value}
|
|
136
|
+
min={min || undefined}
|
|
137
|
+
max={max || undefined}
|
|
138
|
+
step={showSeconds ? 1 : undefined}
|
|
139
|
+
disabled={disabled}
|
|
140
|
+
required={required}
|
|
141
|
+
aria-label={ariaLabel}
|
|
142
|
+
aria-describedby={ariaDescribedBy}
|
|
143
|
+
aria-invalid={invalid || undefined}
|
|
144
|
+
data-testid="touch-web-picker"
|
|
145
|
+
style={overlayStyle}
|
|
146
|
+
onChange={(event) => onValue(event.currentTarget.value)}
|
|
147
|
+
onBlur={onBlur}
|
|
148
|
+
onClick={(event) => {
|
|
149
|
+
// Chrome with a touch screen in desktop mode draws editable segments
|
|
150
|
+
// and opens nothing for a tap; showPicker opens the dialog. It throws
|
|
151
|
+
// when the picker is already up, which is harmless.
|
|
152
|
+
try {
|
|
153
|
+
(event.currentTarget as HTMLInputElement & { showPicker?: () => void }).showPicker?.();
|
|
154
|
+
} catch {}
|
|
155
|
+
}}
|
|
156
|
+
/>
|
|
157
|
+
);
|
|
158
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AdaptivePopup/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AdaptivePopup/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AA2Bf,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,uCAAuC;IACvC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,gCAAgC;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,wCAAwC;IACxC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,mBAAmB;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,YAAY,CAAC;IAChD;;;;;OAKG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,sDAAsD;IACtD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kDAAkD;IAClD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAoBD,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtE;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,yBAAyB,CAK5B;AAyFD,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,KAAK,EACL,WAAW,EACX,QAAQ,EACR,IAAW,EACX,IAAe,EACf,eAAsB,EACtB,MAAM,EACN,QAAQ,GACT,EAAE,kBAAkB,2CAkSpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Button/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAQL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Button/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ComponentType, type ReactNode } from "react";
|
|
2
|
+
import type { SystemColorWellProps } from "./systemColorWell";
|
|
3
|
+
export interface SystemColorFieldProps {
|
|
4
|
+
Well: ComponentType<SystemColorWellProps>;
|
|
5
|
+
/** The MPO trigger row: swatch, hex and clear button. */
|
|
6
|
+
trigger: ReactNode;
|
|
7
|
+
selectedColor: string;
|
|
8
|
+
alpha: number;
|
|
9
|
+
showAlpha: boolean;
|
|
10
|
+
presetColors: string[];
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
a11yLabel?: string;
|
|
13
|
+
onPick: (hex: string, alpha?: number) => void;
|
|
14
|
+
onSelectPreset: (hex: string) => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* LC-266 on iOS: the field opens the system colour picker; the theme swatches
|
|
18
|
+
* stay one tap away in a row under it, because the system picker cannot show
|
|
19
|
+
* them. With a value, the trailing clear button stays outside the well.
|
|
20
|
+
*/
|
|
21
|
+
export declare function SystemColorField({ Well, trigger, selectedColor, alpha, showAlpha, presetColors, disabled, a11yLabel, onPick, onSelectPreset, }: SystemColorFieldProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=SystemColorField.d.ts.map
|
|
@@ -0,0 +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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/ColorPicker/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAQ/D,OAAO,EAAE,KAAK,cAAc,EAAqD,MAAM,OAAO,CAAC;AAU/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/ColorPicker/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAQ/D,OAAO,EAAE,KAAK,cAAc,EAAqD,MAAM,OAAO,CAAC;AAU/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA2BlE,KAAK,UAAU,GAAG,cAAc,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAEzD,MAAM,MAAM,gBAAgB,CAC1B,WAAW,GAAG,OAAO,EACrB,KAAK,SAAS,QAAQ,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,EAC3D,eAAe,SAAS,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EACjG,cAAc,SAAS,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EAC9E,KAAK,SAAS,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,IACzE,IAAI,CACN,cAAc,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,EAG1E,UAAU,GAAG,OAAO,GAAG,UAAU,CAClC,GACC,OAAO,CACL,IAAI,CACF,mBAAmB,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,EAC/E,UAAU,CACX,CACF,GAAG;IACF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,cAAc,GAAG,KAAK,CAAC,CAAC;IAChE,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,0CAA0C;IAC1C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAqnBJ,wBAAgB,WAAW,CACzB,WAAW,EACX,KAAK,SAAS,QAAQ,CAAC,WAAW,CAAC,EACnC,eAAe,SAAS,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EACjG,cAAc,SAAS,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EAC9E,KAAK,SAAS,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,EAC3E,KAAK,EAAE,gBAAgB,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,2CAqMpF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ComponentType } from "react";
|
|
2
|
+
import type { StyleProp, ViewStyle } from "react-native";
|
|
3
|
+
export interface SystemColorWellProps {
|
|
4
|
+
/** `#RRGGBB`, or `#RRGGBBAA` with opacity; empty for no colour. */
|
|
5
|
+
selection: string;
|
|
6
|
+
supportsOpacity: boolean;
|
|
7
|
+
/** Spoken name; the visible label stays the field's. */
|
|
8
|
+
label: string;
|
|
9
|
+
colorScheme: "light" | "dark";
|
|
10
|
+
/** The area the well covers, in points. */
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
onSelectionChange: (hex: string) => void;
|
|
14
|
+
style?: StyleProp<ViewStyle>;
|
|
15
|
+
}
|
|
16
|
+
/** Web: the MPO picker is the platform form (LC-266). */
|
|
17
|
+
export declare function useSystemColorWell(): ComponentType<SystemColorWellProps> | null;
|
|
18
|
+
//# sourceMappingURL=systemColorWell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemColorWell.d.ts","sourceRoot":"","sources":["../../../src/fields/ColorPicker/systemColorWell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,WAAW,oBAAoB;IACnC,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED,yDAAyD;AACzD,wBAAgB,kBAAkB,IAAI,aAAa,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAE/E"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ComponentType } from "react";
|
|
2
|
+
import type { SystemColorWellProps } from "./systemColorWell";
|
|
3
|
+
/** GNOME: the MPO picker is the platform form (LC-266). */
|
|
4
|
+
export declare function useSystemColorWell(): ComponentType<SystemColorWellProps> | null;
|
|
5
|
+
//# sourceMappingURL=systemColorWell.gnome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemColorWell.gnome.d.ts","sourceRoot":"","sources":["../../../src/fields/ColorPicker/systemColorWell.gnome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,2DAA2D;AAC3D,wBAAgB,kBAAkB,IAAI,aAAa,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAE/E"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LC-266: on iOS the Color field opens the system colour picker
|
|
3
|
+
* (UIColorPickerViewController) through @expo/ui's SwiftUI ColorPicker.
|
|
4
|
+
*
|
|
5
|
+
* @expo/ui is native code, so an OTA can carry this JS to a binary built
|
|
6
|
+
* without it. `requireOptionalNativeModule("ExpoUI")` answers null there and
|
|
7
|
+
* the field keeps the MPO picker. The probe runs before `@expo/ui` is
|
|
8
|
+
* required: its views call `requireNativeView` at module load, which throws
|
|
9
|
+
* on a binary that lacks them.
|
|
10
|
+
*/
|
|
11
|
+
import type { ComponentType, ReactNode } from "react";
|
|
12
|
+
import type { SystemColorWellProps } from "./systemColorWell";
|
|
13
|
+
export type { SystemColorWellProps } from "./systemColorWell";
|
|
14
|
+
export declare const expoUiNativeModule = "ExpoUI";
|
|
15
|
+
/**
|
|
16
|
+
* The SwiftUI well is a 28pt circle and only the well opens the picker, so it
|
|
17
|
+
* is drawn nearly transparent and scaled past the field's bounds: the whole
|
|
18
|
+
* field becomes the well's hit area while the MPO swatch and hex stay visible.
|
|
19
|
+
* Below 0.01 alpha UIKit stops hit-testing a view.
|
|
20
|
+
*/
|
|
21
|
+
export declare const wellPoints = 28;
|
|
22
|
+
export declare const wellOpacity = 0.02;
|
|
23
|
+
export declare function wellScale(width: number, height: number): number;
|
|
24
|
+
type Modifier = unknown;
|
|
25
|
+
export interface SwiftUiColorModule {
|
|
26
|
+
Host: ComponentType<{
|
|
27
|
+
children?: ReactNode;
|
|
28
|
+
colorScheme?: "light" | "dark";
|
|
29
|
+
style?: SystemColorWellProps["style"];
|
|
30
|
+
}>;
|
|
31
|
+
ColorPicker: ComponentType<{
|
|
32
|
+
selection: string | null;
|
|
33
|
+
label?: string;
|
|
34
|
+
supportsOpacity?: boolean;
|
|
35
|
+
onSelectionChange?: (value: string) => void;
|
|
36
|
+
modifiers?: Modifier[];
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
export interface SwiftUiModifiers {
|
|
40
|
+
labelsHidden: () => Modifier;
|
|
41
|
+
scaleEffect: (scale: number) => Modifier;
|
|
42
|
+
opacity: (value: number) => Modifier;
|
|
43
|
+
}
|
|
44
|
+
export interface SystemColorWellSources {
|
|
45
|
+
core: () => {
|
|
46
|
+
requireOptionalNativeModule?: (name: string) => unknown;
|
|
47
|
+
};
|
|
48
|
+
ui: () => Partial<SwiftUiColorModule>;
|
|
49
|
+
modifiers: () => Partial<SwiftUiModifiers>;
|
|
50
|
+
}
|
|
51
|
+
export declare function makeSystemColorWell(ui: SwiftUiColorModule, modifiers: SwiftUiModifiers): ComponentType<SystemColorWellProps>;
|
|
52
|
+
/** The system colour well, or null when this platform or binary cannot draw it. */
|
|
53
|
+
export declare function resolveSystemColorWell(sources: SystemColorWellSources, os: string): ComponentType<SystemColorWellProps> | null;
|
|
54
|
+
export declare function useSystemColorWell(): ComponentType<SystemColorWellProps> | null;
|
|
55
|
+
//# sourceMappingURL=systemColorWell.native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemColorWell.native.d.ts","sourceRoot":"","sources":["../../../src/fields/ColorPicker/systemColorWell.native.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,eAAO,MAAM,WAAW,OAAO,CAAC;AAEhC,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,KAAK,QAAQ,GAAG,OAAO,CAAC;AAExB,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,aAAa,CAAC;QAClB,QAAQ,CAAC,EAAE,SAAS,CAAC;QACrB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;QAC/B,KAAK,CAAC,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;KACvC,CAAC,CAAC;IACH,WAAW,EAAE,aAAa,CAAC;QACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;QAC5C,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;KACxB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,QAAQ,CAAC;IAC7B,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ,CAAC;IACzC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ,CAAC;CACtC;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM;QAAE,2BAA2B,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;KAAE,CAAC;IACxE,EAAE,EAAE,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACtC,SAAS,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC5C;AA8BD,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,kBAAkB,EACtB,SAAS,EAAE,gBAAgB,GAC1B,aAAa,CAAC,oBAAoB,CAAC,CA2BrC;AAED,mFAAmF;AACnF,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,GACT,aAAa,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAY5C;AAID,wBAAgB,kBAAkB,IAAI,aAAa,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAG/E"}
|
|
@@ -4,7 +4,7 @@ import type { FormFieldProps } from "../../fieldLayout";
|
|
|
4
4
|
import { Input as InputParts } from "../../InputParts";
|
|
5
5
|
import type { FieldComponentProps, Validator } from "../../types";
|
|
6
6
|
type TimeFormat = "12h" | "24h";
|
|
7
|
-
export type DatetimePickerProps<TParentData = any, TName extends DeepKeys<TParentData> = any, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = Omit<FormFieldProps<TParentData, TName, TFieldValidator, TFormValidator, TData>, "children" | "field"> & Partial<Omit<FieldComponentProps<TParentData, TName, TFieldValidator, TFormValidator, TData>, "children">> & {
|
|
7
|
+
export type DatetimePickerProps<TParentData = any, TName extends DeepKeys<TParentData> = any, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = Omit<FormFieldProps<TParentData, TName, TFieldValidator, TFormValidator, TData>, "children" | "field" | "onChange"> & Partial<Omit<FieldComponentProps<TParentData, TName, TFieldValidator, TFormValidator, TData>, "children">> & {
|
|
8
8
|
readOnly?: boolean;
|
|
9
9
|
placeholder?: string;
|
|
10
10
|
minDate?: Date;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatetimePicker.catalog.d.ts","sourceRoot":"","sources":["../../../src/fields/DatePicker/DatetimePicker.catalog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,KAAK,cAAc,EAAqD,MAAM,OAAO,CAAC;AAe/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"DatetimePicker.catalog.d.ts","sourceRoot":"","sources":["../../../src/fields/DatePicker/DatetimePicker.catalog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,KAAK,cAAc,EAAqD,MAAM,OAAO,CAAC;AAe/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA2BlE,KAAK,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;AAEhC,MAAM,MAAM,mBAAmB,CAC7B,WAAW,GAAG,GAAG,EACjB,KAAK,SAAS,QAAQ,CAAC,WAAW,CAAC,GAAG,GAAG,EACzC,eAAe,SAAS,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EACjG,cAAc,SAAS,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EAC9E,KAAK,SAAS,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,IACzE,IAAI,CACN,cAAc,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,EAG1E,UAAU,GAAG,OAAO,GAAG,UAAU,CAClC,GACC,OAAO,CACL,IAAI,CACF,mBAAmB,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,EAC/E,UAAU,CACX,CACF,GAAG;IACF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,cAAc,GAAG,KAAK,CAAC,CAAC;IAC5F,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yFAAyF;IACzF,KAAK,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACxC,0CAA0C;IAC1C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7C,8EAA8E;IAC9E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAmQJ,wBAAgB,cAAc,CAC5B,WAAW,EACX,KAAK,SAAS,QAAQ,CAAC,WAAW,CAAC,EACnC,eAAe,SAAS,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EACjG,cAAc,SAAS,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EAC9E,KAAK,SAAS,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,EAC3E,KAAK,EAAE,mBAAmB,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,2CAsRvF"}
|