@servicetitan/anvil2-ext-common 0.5.1 → 0.7.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/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @servicetitan/anvil2-ext-common
2
2
 
3
+ ## 0.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#2454](https://github.com/servicetitan/hammer/pull/2454) [`988c46f`](https://github.com/servicetitan/hammer/commit/988c46f8f510181efd1977908ecf33c38d14691f) Thanks [@rhassan-eng](https://github.com/rhassan-eng)! - [Form] Add `Form.SelectSync` and `Form.MultiSelectSync` for synchronous select fields
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [[`e53dab6`](https://github.com/servicetitan/hammer/commit/e53dab6877ed9ed0a0a01697eeda1f01553e6bac), [`d35066d`](https://github.com/servicetitan/hammer/commit/d35066d4075a66e506b0d528023d6fb8d0553bc2), [`e53dab6`](https://github.com/servicetitan/hammer/commit/e53dab6877ed9ed0a0a01697eeda1f01553e6bac), [`c398449`](https://github.com/servicetitan/hammer/commit/c398449fc4f5b6681f9406ccbd3896b10713df21)]:
12
+ - @servicetitan/anvil2@3.4.1
13
+
14
+ ## 0.6.0
15
+
16
+ ### Minor Changes
17
+
18
+ - [#2442](https://github.com/servicetitan/hammer/pull/2442) [`83b1b92`](https://github.com/servicetitan/hammer/commit/83b1b920092dd6b0c6a8c35a1a6b33241f7100af) Thanks [@hbartlett-st](https://github.com/hbartlett-st)! - [Form] Add `FormSelectSync` and `FormMultiSelectSync` binding components that wrap `SelectFieldSync` and `MultiSelectFieldSync` for client-side option sets passed via `options`, instead of asynchronous `loadOptions`
19
+
20
+ ### Patch Changes
21
+
22
+ - Updated dependencies [[`b49ded5`](https://github.com/servicetitan/hammer/commit/b49ded52333b9d65a73c869298b08d787b37802a), [`7eaf679`](https://github.com/servicetitan/hammer/commit/7eaf6799ae352e17b117675013164c9d74212c7a)]:
23
+ - @servicetitan/anvil2@3.4.0
24
+
3
25
  ## 0.5.1
4
26
 
5
27
  ### Patch Changes
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ export { default as ExampleProvider } from './ExampleProvider.js';
6
6
  import { FieldState } from 'formstate';
7
7
  import { makeObservable, observable, action } from 'mobx';
8
8
  import { jsx } from 'react/jsx-runtime';
9
- import { TextField, Textarea, NumberField, DateFieldSingle, DateFieldRange, DateFieldYearless, DateFieldYearlessRange, TimeField, SelectField, MultiSelectField, Radio, Checkbox } from '@servicetitan/anvil2';
9
+ import { TextField, Textarea, NumberField, DateFieldSingle, DateFieldRange, DateFieldYearless, DateFieldYearlessRange, TimeField, SelectField, SelectFieldSync, MultiSelectField, MultiSelectFieldSync, Radio, Checkbox } from '@servicetitan/anvil2';
10
10
  import { observer } from 'mobx-react';
11
11
  import { TreeSelectField } from '@servicetitan/anvil2/beta';
12
12
  import { useId } from 'react';
@@ -392,6 +392,24 @@ const FormSelect = observer(function FormSelect2({
392
392
  );
393
393
  });
394
394
 
395
+ const FormSelectSync = observer(function FormSelectSync2({
396
+ fieldState,
397
+ disabled,
398
+ ...props
399
+ }) {
400
+ return /* @__PURE__ */ jsx(
401
+ SelectFieldSync,
402
+ {
403
+ ...props,
404
+ value: fieldState.value,
405
+ onSelectedOptionChange: (option) => fieldState.onChange(option),
406
+ error: fieldState.hasError ? fieldState.error : void 0,
407
+ warning: fieldState.warning,
408
+ disabled: disabled ?? fieldState.disabled
409
+ }
410
+ );
411
+ });
412
+
395
413
  const FormMultiSelect = observer(function FormMultiSelect2({
396
414
  fieldState,
397
415
  disabled,
@@ -410,6 +428,24 @@ const FormMultiSelect = observer(function FormMultiSelect2({
410
428
  );
411
429
  });
412
430
 
431
+ const FormMultiSelectSync = observer(function FormMultiSelectSync2({
432
+ fieldState,
433
+ disabled,
434
+ ...props
435
+ }) {
436
+ return /* @__PURE__ */ jsx(
437
+ MultiSelectFieldSync,
438
+ {
439
+ ...props,
440
+ value: fieldState.value,
441
+ onSelectedOptionsChange: (options) => fieldState.onChange(options),
442
+ error: fieldState.hasError ? fieldState.error : void 0,
443
+ warning: fieldState.warning,
444
+ disabled: disabled ?? fieldState.disabled
445
+ }
446
+ );
447
+ });
448
+
413
449
  const FormTreeSelect = observer(function FormTreeSelect2({
414
450
  fieldState,
415
451
  disabled,
@@ -510,11 +546,13 @@ const Form = {
510
546
  DateFieldYearlessRange: FormDateFieldYearlessRange,
511
547
  TimeField: FormTimeField,
512
548
  Select: FormSelect,
549
+ SelectSync: FormSelectSync,
513
550
  MultiSelect: FormMultiSelect,
551
+ MultiSelectSync: FormMultiSelectSync,
514
552
  TreeSelect: FormTreeSelect,
515
553
  RadioGroup: FormRadioGroup,
516
554
  CheckboxGroup: FormCheckboxGroup
517
555
  };
518
556
 
519
- export { A2InputFieldState, Form, FormCheckboxGroup, FormDateFieldRange, FormDateFieldSingle, FormDateFieldYearless, FormDateFieldYearlessRange, FormMultiSelect, FormNumberField, FormRadioGroup, FormSelect, FormTextField, FormTextarea, FormTimeField, FormTreeSelect, SelectableOptionsArrayFieldState, SelectableOptionsFieldState, UpdateMode };
557
+ export { A2InputFieldState, Form, FormCheckboxGroup, FormDateFieldRange, FormDateFieldSingle, FormDateFieldYearless, FormDateFieldYearlessRange, FormMultiSelect, FormMultiSelectSync, FormNumberField, FormRadioGroup, FormSelect, FormSelectSync, FormTextField, FormTextarea, FormTimeField, FormTreeSelect, SelectableOptionsArrayFieldState, SelectableOptionsFieldState, UpdateMode };
520
558
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/form/state/types.ts","../src/form/state/A2InputFieldState.ts","../src/form/state/SelectableOptionsFieldState.ts","../src/form/components/FormTextField/FormTextField.tsx","../src/form/components/FormTextarea/FormTextarea.tsx","../src/form/components/FormNumberField/FormNumberField.tsx","../src/form/components/FormDateFieldSingle/FormDateFieldSingle.tsx","../src/form/components/FormDateFieldRange/FormDateFieldRange.tsx","../src/form/components/FormDateFieldYearless/FormDateFieldYearless.tsx","../src/form/components/FormDateFieldYearlessRange/FormDateFieldYearlessRange.tsx","../src/form/components/FormTimeField/FormTimeField.tsx","../src/form/components/FormSelect/FormSelect.tsx","../src/form/components/FormMultiSelect/FormMultiSelect.tsx","../src/form/components/FormTreeSelect/FormTreeSelect.tsx","../src/form/components/FormRadioGroup/FormRadioGroup.tsx","../src/form/components/FormCheckboxGroup/FormCheckboxGroup.tsx","../src/form/components/Form.ts"],"sourcesContent":["import { Validator } from \"formstate\";\n\n/**\n * How a value-update control should apply its value. Ported from the app's\n * A2InputFieldState. Primarily useful for value-update controls.\n */\nexport enum UpdateMode {\n Keep = \"Keep\",\n Replace = \"Replace\",\n Append = \"Append\",\n Remove = \"Remove\",\n Clear = \"Clear\",\n}\n\n/** A validator that returns a message string (truthy) or a falsy value when OK. */\nexport type WarningValidator<T> = (\n value: T,\n) => string | false | null | undefined;\n\n/** Minimal selectable option shape used by the SelectableOptions field states. */\nexport type OptionType<T> = {\n id: T;\n disabled?: boolean;\n};\n\n/**\n * Rule that flags a tracked option as invalid. When a selected value matches a\n * tracked option, the field reports `errorCode` as its error.\n */\nexport type OptionValidationRule<T, G extends OptionType<T>> = {\n /** Return true if this option should be tracked as a validation trigger. */\n shouldTrack: (option: G) => boolean;\n /** The error code/message returned when a tracked value is selected. */\n errorCode: string;\n};\n\nexport type { Validator };\n\nexport type DistributiveOmit<T, K extends keyof never> = T extends unknown\n ? Omit<T, K>\n : never;\n","import { FieldState } from \"formstate\";\nimport { ChangeEvent, SyntheticEvent } from \"react\";\nimport { action, makeObservable, observable } from \"mobx\";\nimport { UpdateMode, Validator, WarningValidator } from \"./types\";\n\n/**\n * Base field-state for Anvil2 form fields. Extends formstate's `FieldState` with\n * non-blocking warnings, dynamic disablers, soft validation, hard-set helpers,\n * an optional update-mode sub-field, and `@servicetitan/form`-compatible change\n * handlers. Ported from the app's `A2InputFieldState` onto formstate directly.\n */\nexport class A2InputFieldState<T> extends FieldState<T> {\n warning: string | undefined = undefined;\n disabled = false;\n /** Optional sub-field tracking how the value should be applied. */\n updateMode?: FieldState<UpdateMode>;\n\n private _warnings: WarningValidator<T>[] = [];\n private _disablers: WarningValidator<T>[] = [];\n private additionalValidations = new Set<string>();\n private _onReset: (() => void) | undefined = undefined;\n\n constructor(initValue: T) {\n super(initValue);\n makeObservable(this, {\n warning: observable,\n disabled: observable,\n updateMode: observable,\n });\n }\n\n /** `@servicetitan/form`-compatible handler: `(event, { value })`. */\n onChangeHandler = (\n _event: SyntheticEvent<HTMLInputElement>,\n data: { value: T },\n ) => {\n this.onChange(data.value);\n };\n\n /** `@servicetitan/form`-compatible native handler: reads `event.currentTarget.value`. */\n onChangeNativeHandler = (event: ChangeEvent<HTMLInputElement>) => {\n this.onChange(event.currentTarget.value as unknown as T);\n };\n\n onChange(value: T) {\n if (this.disabled) {\n return;\n }\n super.onChange(value);\n }\n\n async validate() {\n this.checkDisablers();\n this.checkWarnings();\n return super.validate();\n }\n\n /** Run disablers + warnings without committing a full validation. */\n async softValidate() {\n this.checkDisablers();\n this.checkWarnings();\n }\n\n /** Register a handler that runs after the field is reset. */\n onReset(handler: () => void): this {\n this._onReset = handler;\n return this;\n }\n\n reset(value?: T) {\n this.warning = undefined;\n if (value === undefined) {\n super.reset();\n } else {\n super.reset(value);\n }\n this._onReset?.();\n }\n\n // A \"hard\" (programmatic) set: bypasses the `disabled` guard, then confirms\n // the value as the new initial value (clears `dirty`).\n hardSetValue = (value: T) => {\n FieldState.prototype.onChange.call(this, value);\n this.hardConfirmValue();\n };\n\n hardConfirmValue = () => {\n this.dirty = false;\n (this as unknown as { _initValue: T })._initValue = this.value;\n };\n\n // Silently seed the field with a value as a clean baseline: sets `value` and\n // `$`, clears `dirty`/`error`/`warning`, and updates the initial value so\n // `hasValueChanged()` stays false until the user edits. Unlike `hardSetValue`,\n // this does NOT call `onChange`, so `onDidChange` listeners do not fire. Use\n // it when populating fields from a fresh API response without triggering\n // reactions that listen to those fields.\n seedValue = action((value: T) => {\n this.value = value;\n this.$ = value;\n this.dirty = false;\n this.error = undefined;\n this.warning = undefined;\n (this as unknown as { _initValue: T })._initValue = value;\n });\n\n /** Add a validator once per key (guards against double registration). */\n addValidator(validationKey: string, validator: Validator<T>) {\n if (!this.additionalValidations.has(validationKey)) {\n this.additionalValidations.add(validationKey);\n this._validators.push(validator);\n }\n }\n\n disablers(...validators: WarningValidator<T>[]) {\n this._disablers = validators;\n }\n\n checkDisablers = () => {\n this.disabled = false;\n this._disablers.forEach((validator) => {\n const result = validator(this.value);\n if (result !== null && result !== undefined && result !== false) {\n this.disabled = true;\n }\n });\n };\n\n warnings(...validators: WarningValidator<T>[]) {\n this._warnings = validators;\n }\n\n checkWarnings = () => {\n this.warning = undefined;\n this._warnings.forEach((validator) => {\n const result = validator(this.value);\n if (result !== null && result !== undefined && result !== false) {\n this.warning = result;\n }\n });\n };\n\n enableUpdateMode(initUpdateMode: UpdateMode = UpdateMode.Keep) {\n this.updateMode = new FieldState<UpdateMode>(initUpdateMode);\n }\n\n disableUpdateMode() {\n this.updateMode = undefined;\n }\n\n hasValueChanged = () => this.value !== this.initValue;\n\n hasUpdateModeValueChanged = () =>\n !!this.updateMode &&\n this.updateMode.value !== this.getInitValue(this.updateMode);\n\n /** The field's initial value (public so consumers can compare against it). */\n get initValue(): T {\n return (this as unknown as { _initValue: T })._initValue;\n }\n\n private getInitValue<TValue>(field: FieldState<TValue>): TValue {\n return (field as unknown as { _initValue: TValue })._initValue;\n }\n}\n","import { makeObservable, observable } from \"mobx\";\nimport { Validator } from \"formstate\";\nimport { A2InputFieldState } from \"./A2InputFieldState\";\nimport { OptionType, OptionValidationRule } from \"./types\";\n\nexport type SelectableOptionsConfig<T, G extends OptionType<T>> = {\n validationRules?: OptionValidationRule<T, G>[];\n};\n\nexport class SelectableOptionsFieldState<\n T,\n G extends OptionType<T>,\n> extends A2InputFieldState<T> {\n options: G[] = [];\n private validationTrackers = new Map<string, Set<T>>();\n private config?: SelectableOptionsConfig<T, G>;\n\n constructor(initValue: T, config?: SelectableOptionsConfig<T, G>) {\n super(initValue);\n this.config = config;\n makeObservable(this, { options: observable });\n\n if (config?.validationRules) {\n const validators: Validator<T>[] = [];\n config.validationRules.forEach((rule) => {\n this.validationTrackers.set(rule.errorCode, new Set());\n validators.push((value: T) => {\n const tracker = this.validationTrackers.get(rule.errorCode);\n return value !== undefined && !!tracker?.has(value) && rule.errorCode;\n });\n });\n this.validators(...validators);\n }\n }\n\n setOptions(newOptions: G[]) {\n this.validationTrackers.forEach((tracker) => tracker.clear());\n this.options = newOptions.map((option) => {\n this.config?.validationRules?.forEach((rule) => {\n if (rule.shouldTrack(option)) {\n this.validationTrackers.get(rule.errorCode)?.add(option.id);\n }\n });\n return option;\n });\n }\n}\n\nexport class SelectableOptionsArrayFieldState<\n T,\n G extends OptionType<T>,\n> extends A2InputFieldState<T[]> {\n options: G[] = [];\n private validationTrackers = new Map<string, Set<T>>();\n private config?: SelectableOptionsConfig<T, G>;\n\n constructor(initValue: T[], config?: SelectableOptionsConfig<T, G>) {\n super(initValue);\n this.config = config;\n makeObservable(this, { options: observable });\n\n if (config?.validationRules) {\n const validators: Validator<T[]>[] = [];\n config.validationRules.forEach((rule) => {\n this.validationTrackers.set(rule.errorCode, new Set());\n validators.push((values: T[]) => {\n if (!values || values.length === 0) {\n return false;\n }\n const tracker = this.validationTrackers.get(rule.errorCode);\n return values.some((value) => tracker?.has(value)) && rule.errorCode;\n });\n });\n this.validators(...validators);\n }\n }\n\n setOptions(newOptions: G[]) {\n this.validationTrackers.forEach((tracker) => tracker.clear());\n this.options = newOptions.map((option) => {\n this.config?.validationRules?.forEach((rule) => {\n if (rule.shouldTrack(option)) {\n this.validationTrackers.get(rule.errorCode)?.add(option.id);\n }\n });\n return option;\n });\n }\n\n hasValueChanged = () => {\n const current = this.value;\n const initial = this.initValue;\n if (current === initial) return false;\n if (!current || !initial) return true;\n if (current.length !== initial.length) return true;\n return current.some((val, i) => val !== initial[i]);\n };\n}\n","import { TextField, TextFieldProps } from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormTextFieldProps extends Omit<\n TextFieldProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<string>;\n}\n\nexport const FormTextField = observer(function FormTextField({\n fieldState,\n disabled,\n ...props\n}: FormTextFieldProps) {\n return (\n <TextField\n {...(props as TextFieldProps)}\n value={fieldState.value}\n onChange={(e) => fieldState.onChange(e.target.value)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import { Textarea, TextareaProps } from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormTextareaProps extends Omit<\n TextareaProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<string>;\n}\n\nexport const FormTextarea = observer(function FormTextarea({\n fieldState,\n disabled,\n ...props\n}: FormTextareaProps) {\n return (\n <Textarea\n {...(props as TextareaProps)}\n value={fieldState.value}\n onChange={(e) => fieldState.onChange(e.target.value)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import { NumberField, NumberFieldProps } from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormNumberFieldProps extends Omit<\n NumberFieldProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<number | null>;\n}\n\nexport const FormNumberField = observer(function FormNumberField({\n fieldState,\n disabled,\n ...props\n}: FormNumberFieldProps) {\n return (\n <NumberField\n {...props}\n value={fieldState.value}\n onChange={(value) => fieldState.onChange(value)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import { DateFieldSingle, DateFieldSingleProps } from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormDateFieldSingleProps extends Omit<\n DateFieldSingleProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<string | null>;\n}\n\nexport const FormDateFieldSingle = observer(function FormDateFieldSingle({\n fieldState,\n disabled,\n ...props\n}: FormDateFieldSingleProps) {\n return (\n <DateFieldSingle\n {...props}\n value={fieldState.value}\n onChange={(change) => fieldState.onChange(change.date)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import {\n DateFieldRange,\n DateFieldRangeProps,\n DateFieldRangeValue,\n} from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormDateFieldRangeProps extends Omit<\n DateFieldRangeProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<DateFieldRangeValue | null>;\n}\n\nexport const FormDateFieldRange = observer(function FormDateFieldRange({\n fieldState,\n disabled,\n ...props\n}: FormDateFieldRangeProps) {\n return (\n <DateFieldRange\n {...props}\n value={fieldState.value ?? undefined}\n onChange={(change) =>\n fieldState.onChange(\n change.isInputEmpty\n ? null\n : { startDate: change.startDate, endDate: change.endDate },\n )\n }\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import {\n DateFieldYearless,\n DateFieldYearlessProps,\n YearlessDate,\n} from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormDateFieldYearlessProps extends Omit<\n DateFieldYearlessProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<YearlessDate | null>;\n}\n\nexport const FormDateFieldYearless = observer(function FormDateFieldYearless({\n fieldState,\n disabled,\n ...props\n}: FormDateFieldYearlessProps) {\n return (\n <DateFieldYearless\n {...props}\n value={fieldState.value}\n onChange={(change) => fieldState.onChange(change.value)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import {\n DateFieldYearlessRange,\n DateFieldYearlessRangeProps,\n DateFieldYearlessRangeValue,\n} from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormDateFieldYearlessRangeProps extends Omit<\n DateFieldYearlessRangeProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<DateFieldYearlessRangeValue>;\n}\n\nexport const FormDateFieldYearlessRange = observer(\n function FormDateFieldYearlessRange({\n fieldState,\n disabled,\n ...props\n }: FormDateFieldYearlessRangeProps) {\n return (\n <DateFieldYearlessRange\n {...props}\n value={fieldState.value}\n onChange={(change) =>\n fieldState.onChange({\n startDate: change.startDate,\n endDate: change.endDate,\n })\n }\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n },\n);\n","import { TimeField, TimeFieldProps } from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormTimeFieldProps extends Omit<\n TimeFieldProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<string | null>;\n}\n\nexport const FormTimeField = observer(function FormTimeField({\n fieldState,\n disabled,\n ...props\n}: FormTimeFieldProps) {\n return (\n <TimeField\n {...(props as TimeFieldProps)}\n value={fieldState.value}\n onChange={(change) => fieldState.onChange(change.time)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import {\n SelectField,\n SelectFieldOption,\n SelectFieldProps,\n} from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState, DistributiveOmit } from \"../../state\";\n\n/**\n * FormSelect wraps the beta SelectField and binds it to an A2InputFieldState.\n * Supports all loader modes (eager and all lazy variants) because the props\n * type uses DistributiveOmit to preserve each union member's loader type.\n */\nexport type FormSelectProps = DistributiveOmit<\n SelectFieldProps,\n \"value\" | \"onSelectedOptionChange\" | \"error\" | \"warning\"\n> & { fieldState: A2InputFieldState<SelectFieldOption | null> };\n\nexport const FormSelect = observer(function FormSelect({\n fieldState,\n disabled,\n ...props\n}: FormSelectProps) {\n return (\n <SelectField\n {...(props as SelectFieldProps)}\n value={fieldState.value}\n onSelectedOptionChange={(option) => fieldState.onChange(option)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import {\n MultiSelectField,\n MultiSelectFieldOption,\n MultiSelectFieldProps,\n} from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState, DistributiveOmit } from \"../../state\";\n\n/**\n * FormMultiSelect wraps the beta MultiSelectField and binds it to an\n * A2InputFieldState. Supports all loader modes (eager and all lazy variants)\n * because the props type uses DistributiveOmit to preserve each union member's\n * loader type.\n */\nexport type FormMultiSelectProps = DistributiveOmit<\n MultiSelectFieldProps,\n \"value\" | \"onSelectedOptionsChange\" | \"error\" | \"warning\"\n> & { fieldState: A2InputFieldState<MultiSelectFieldOption[]> };\n\nexport const FormMultiSelect = observer(function FormMultiSelect({\n fieldState,\n disabled,\n ...props\n}: FormMultiSelectProps) {\n return (\n <MultiSelectField\n {...(props as MultiSelectFieldProps)}\n value={fieldState.value}\n onSelectedOptionsChange={(options) => fieldState.onChange(options)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import {\n TreeSelectField,\n TreeSelectFieldValue,\n TreeSelectFieldProps,\n} from \"@servicetitan/anvil2/beta\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\n/**\n * FormTreeSelect wraps the beta TreeSelectField and binds it to an\n * A2InputFieldState. TreeSelectFieldProps is a flat (non-union) type so we can\n * use Omit directly. The loadOptions signature is:\n * (searchValue: string, parentNode?: TreeSelectFieldNode) => TreeSelectFieldNode[] | Promise<TreeSelectFieldNode[]>\n */\nexport interface FormTreeSelectProps extends Omit<\n TreeSelectFieldProps,\n \"value\" | \"onSelectedOptionsChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<TreeSelectFieldValue[]>;\n}\n\nexport const FormTreeSelect = observer(function FormTreeSelect({\n fieldState,\n disabled,\n ...props\n}: FormTreeSelectProps) {\n return (\n <TreeSelectField\n {...props}\n value={fieldState.value}\n onSelectedOptionsChange={(nodes: TreeSelectFieldValue[]) =>\n fieldState.onChange(nodes)\n }\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import { ReactElement, ReactNode, useId } from \"react\";\nimport { Radio, RadioGroupProps } from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { SelectableOptionsFieldState, OptionType } from \"../../state\";\n\nexport interface FormRadioGroupItem<T> extends OptionType<T> {\n label: ReactNode;\n}\n\nexport interface FormRadioGroupProps<\n T,\n G extends FormRadioGroupItem<T>,\n> extends Omit<RadioGroupProps, \"error\" | \"warning\" | \"children\"> {\n fieldState: SelectableOptionsFieldState<T, G>;\n items: G[];\n}\n\nfunction FormRadioGroupInner<T, G extends FormRadioGroupItem<T>>({\n fieldState,\n items,\n disabled,\n ...props\n}: FormRadioGroupProps<T, G>) {\n const name = useId();\n const effectiveDisabled = disabled ?? fieldState.disabled;\n return (\n <Radio.Group\n {...props}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n >\n {items.map((item) => (\n <Radio\n key={String(item.id)}\n name={name}\n label={item.label as string | ReactElement}\n disabled={effectiveDisabled || item.disabled}\n checked={fieldState.value === item.id}\n onChange={(e) => {\n if (e.target.checked) {\n fieldState.onChange(item.id);\n }\n }}\n />\n ))}\n </Radio.Group>\n );\n}\n\nexport const FormRadioGroup = observer(\n FormRadioGroupInner,\n) as typeof FormRadioGroupInner;\n","import { ReactElement, ReactNode, useId } from \"react\";\nimport { Checkbox, CheckboxGroupProps } from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { SelectableOptionsArrayFieldState, OptionType } from \"../../state\";\n\nexport interface FormCheckboxGroupItem<T> extends OptionType<T> {\n label: ReactNode;\n}\n\nexport interface FormCheckboxGroupProps<\n T,\n G extends FormCheckboxGroupItem<T>,\n> extends Omit<CheckboxGroupProps, \"error\" | \"warning\" | \"children\"> {\n fieldState: SelectableOptionsArrayFieldState<T, G>;\n items: G[];\n}\n\nfunction FormCheckboxGroupInner<T, G extends FormCheckboxGroupItem<T>>({\n fieldState,\n items,\n disabled,\n ...props\n}: FormCheckboxGroupProps<T, G>) {\n const name = useId();\n const selected = fieldState.value ?? [];\n const effectiveDisabled = disabled ?? fieldState.disabled;\n return (\n <Checkbox.Group\n {...props}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n >\n {items.map((item) => (\n <Checkbox\n key={String(item.id)}\n name={name}\n label={item.label as string | ReactElement}\n disabled={effectiveDisabled || item.disabled}\n checked={selected.includes(item.id)}\n onChange={(e) => {\n const next = e.target.checked\n ? [...selected, item.id]\n : selected.filter((id) => id !== item.id);\n fieldState.onChange(next);\n }}\n />\n ))}\n </Checkbox.Group>\n );\n}\n\nexport const FormCheckboxGroup = observer(\n FormCheckboxGroupInner,\n) as typeof FormCheckboxGroupInner;\n","import { FormTextField } from \"./FormTextField\";\nimport { FormTextarea } from \"./FormTextarea\";\nimport { FormNumberField } from \"./FormNumberField\";\nimport { FormDateFieldSingle } from \"./FormDateFieldSingle\";\nimport { FormDateFieldRange } from \"./FormDateFieldRange\";\nimport { FormDateFieldYearless } from \"./FormDateFieldYearless\";\nimport { FormDateFieldYearlessRange } from \"./FormDateFieldYearlessRange\";\nimport { FormTimeField } from \"./FormTimeField\";\nimport { FormSelect } from \"./FormSelect\";\nimport { FormMultiSelect } from \"./FormMultiSelect\";\nimport { FormTreeSelect } from \"./FormTreeSelect\";\nimport { FormRadioGroup } from \"./FormRadioGroup\";\nimport { FormCheckboxGroup } from \"./FormCheckboxGroup\";\n\nexport const Form = {\n TextField: FormTextField,\n Textarea: FormTextarea,\n NumberField: FormNumberField,\n DateFieldSingle: FormDateFieldSingle,\n DateFieldRange: FormDateFieldRange,\n DateFieldYearless: FormDateFieldYearless,\n DateFieldYearlessRange: FormDateFieldYearlessRange,\n TimeField: FormTimeField,\n Select: FormSelect,\n MultiSelect: FormMultiSelect,\n TreeSelect: FormTreeSelect,\n RadioGroup: FormRadioGroup,\n CheckboxGroup: FormCheckboxGroup,\n};\n"],"names":["UpdateMode","FormTextField","FormTextarea","FormNumberField","FormDateFieldSingle","FormDateFieldRange","FormDateFieldYearless","FormDateFieldYearlessRange","FormTimeField","FormSelect","FormMultiSelect","FormTreeSelect"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/form/state/types.ts","../src/form/state/A2InputFieldState.ts","../src/form/state/SelectableOptionsFieldState.ts","../src/form/components/FormTextField/FormTextField.tsx","../src/form/components/FormTextarea/FormTextarea.tsx","../src/form/components/FormNumberField/FormNumberField.tsx","../src/form/components/FormDateFieldSingle/FormDateFieldSingle.tsx","../src/form/components/FormDateFieldRange/FormDateFieldRange.tsx","../src/form/components/FormDateFieldYearless/FormDateFieldYearless.tsx","../src/form/components/FormDateFieldYearlessRange/FormDateFieldYearlessRange.tsx","../src/form/components/FormTimeField/FormTimeField.tsx","../src/form/components/FormSelect/FormSelect.tsx","../src/form/components/FormSelect/FormSelectSync.tsx","../src/form/components/FormMultiSelect/FormMultiSelect.tsx","../src/form/components/FormMultiSelect/FormMultiSelectSync.tsx","../src/form/components/FormTreeSelect/FormTreeSelect.tsx","../src/form/components/FormRadioGroup/FormRadioGroup.tsx","../src/form/components/FormCheckboxGroup/FormCheckboxGroup.tsx","../src/form/components/Form.ts"],"sourcesContent":["import { Validator } from \"formstate\";\n\n/**\n * How a value-update control should apply its value. Ported from the app's\n * A2InputFieldState. Primarily useful for value-update controls.\n */\nexport enum UpdateMode {\n Keep = \"Keep\",\n Replace = \"Replace\",\n Append = \"Append\",\n Remove = \"Remove\",\n Clear = \"Clear\",\n}\n\n/** A validator that returns a message string (truthy) or a falsy value when OK. */\nexport type WarningValidator<T> = (\n value: T,\n) => string | false | null | undefined;\n\n/** Minimal selectable option shape used by the SelectableOptions field states. */\nexport type OptionType<T> = {\n id: T;\n disabled?: boolean;\n};\n\n/**\n * Rule that flags a tracked option as invalid. When a selected value matches a\n * tracked option, the field reports `errorCode` as its error.\n */\nexport type OptionValidationRule<T, G extends OptionType<T>> = {\n /** Return true if this option should be tracked as a validation trigger. */\n shouldTrack: (option: G) => boolean;\n /** The error code/message returned when a tracked value is selected. */\n errorCode: string;\n};\n\nexport type { Validator };\n\nexport type DistributiveOmit<T, K extends keyof never> = T extends unknown\n ? Omit<T, K>\n : never;\n","import { FieldState } from \"formstate\";\nimport { ChangeEvent, SyntheticEvent } from \"react\";\nimport { action, makeObservable, observable } from \"mobx\";\nimport { UpdateMode, Validator, WarningValidator } from \"./types\";\n\n/**\n * Base field-state for Anvil2 form fields. Extends formstate's `FieldState` with\n * non-blocking warnings, dynamic disablers, soft validation, hard-set helpers,\n * an optional update-mode sub-field, and `@servicetitan/form`-compatible change\n * handlers. Ported from the app's `A2InputFieldState` onto formstate directly.\n */\nexport class A2InputFieldState<T> extends FieldState<T> {\n warning: string | undefined = undefined;\n disabled = false;\n /** Optional sub-field tracking how the value should be applied. */\n updateMode?: FieldState<UpdateMode>;\n\n private _warnings: WarningValidator<T>[] = [];\n private _disablers: WarningValidator<T>[] = [];\n private additionalValidations = new Set<string>();\n private _onReset: (() => void) | undefined = undefined;\n\n constructor(initValue: T) {\n super(initValue);\n makeObservable(this, {\n warning: observable,\n disabled: observable,\n updateMode: observable,\n });\n }\n\n /** `@servicetitan/form`-compatible handler: `(event, { value })`. */\n onChangeHandler = (\n _event: SyntheticEvent<HTMLInputElement>,\n data: { value: T },\n ) => {\n this.onChange(data.value);\n };\n\n /** `@servicetitan/form`-compatible native handler: reads `event.currentTarget.value`. */\n onChangeNativeHandler = (event: ChangeEvent<HTMLInputElement>) => {\n this.onChange(event.currentTarget.value as unknown as T);\n };\n\n onChange(value: T) {\n if (this.disabled) {\n return;\n }\n super.onChange(value);\n }\n\n async validate() {\n this.checkDisablers();\n this.checkWarnings();\n return super.validate();\n }\n\n /** Run disablers + warnings without committing a full validation. */\n async softValidate() {\n this.checkDisablers();\n this.checkWarnings();\n }\n\n /** Register a handler that runs after the field is reset. */\n onReset(handler: () => void): this {\n this._onReset = handler;\n return this;\n }\n\n reset(value?: T) {\n this.warning = undefined;\n if (value === undefined) {\n super.reset();\n } else {\n super.reset(value);\n }\n this._onReset?.();\n }\n\n // A \"hard\" (programmatic) set: bypasses the `disabled` guard, then confirms\n // the value as the new initial value (clears `dirty`).\n hardSetValue = (value: T) => {\n FieldState.prototype.onChange.call(this, value);\n this.hardConfirmValue();\n };\n\n hardConfirmValue = () => {\n this.dirty = false;\n (this as unknown as { _initValue: T })._initValue = this.value;\n };\n\n // Silently seed the field with a value as a clean baseline: sets `value` and\n // `$`, clears `dirty`/`error`/`warning`, and updates the initial value so\n // `hasValueChanged()` stays false until the user edits. Unlike `hardSetValue`,\n // this does NOT call `onChange`, so `onDidChange` listeners do not fire. Use\n // it when populating fields from a fresh API response without triggering\n // reactions that listen to those fields.\n seedValue = action((value: T) => {\n this.value = value;\n this.$ = value;\n this.dirty = false;\n this.error = undefined;\n this.warning = undefined;\n (this as unknown as { _initValue: T })._initValue = value;\n });\n\n /** Add a validator once per key (guards against double registration). */\n addValidator(validationKey: string, validator: Validator<T>) {\n if (!this.additionalValidations.has(validationKey)) {\n this.additionalValidations.add(validationKey);\n this._validators.push(validator);\n }\n }\n\n disablers(...validators: WarningValidator<T>[]) {\n this._disablers = validators;\n }\n\n checkDisablers = () => {\n this.disabled = false;\n this._disablers.forEach((validator) => {\n const result = validator(this.value);\n if (result !== null && result !== undefined && result !== false) {\n this.disabled = true;\n }\n });\n };\n\n warnings(...validators: WarningValidator<T>[]) {\n this._warnings = validators;\n }\n\n checkWarnings = () => {\n this.warning = undefined;\n this._warnings.forEach((validator) => {\n const result = validator(this.value);\n if (result !== null && result !== undefined && result !== false) {\n this.warning = result;\n }\n });\n };\n\n enableUpdateMode(initUpdateMode: UpdateMode = UpdateMode.Keep) {\n this.updateMode = new FieldState<UpdateMode>(initUpdateMode);\n }\n\n disableUpdateMode() {\n this.updateMode = undefined;\n }\n\n hasValueChanged = () => this.value !== this.initValue;\n\n hasUpdateModeValueChanged = () =>\n !!this.updateMode &&\n this.updateMode.value !== this.getInitValue(this.updateMode);\n\n /** The field's initial value (public so consumers can compare against it). */\n get initValue(): T {\n return (this as unknown as { _initValue: T })._initValue;\n }\n\n private getInitValue<TValue>(field: FieldState<TValue>): TValue {\n return (field as unknown as { _initValue: TValue })._initValue;\n }\n}\n","import { makeObservable, observable } from \"mobx\";\nimport { Validator } from \"formstate\";\nimport { A2InputFieldState } from \"./A2InputFieldState\";\nimport { OptionType, OptionValidationRule } from \"./types\";\n\nexport type SelectableOptionsConfig<T, G extends OptionType<T>> = {\n validationRules?: OptionValidationRule<T, G>[];\n};\n\nexport class SelectableOptionsFieldState<\n T,\n G extends OptionType<T>,\n> extends A2InputFieldState<T> {\n options: G[] = [];\n private validationTrackers = new Map<string, Set<T>>();\n private config?: SelectableOptionsConfig<T, G>;\n\n constructor(initValue: T, config?: SelectableOptionsConfig<T, G>) {\n super(initValue);\n this.config = config;\n makeObservable(this, { options: observable });\n\n if (config?.validationRules) {\n const validators: Validator<T>[] = [];\n config.validationRules.forEach((rule) => {\n this.validationTrackers.set(rule.errorCode, new Set());\n validators.push((value: T) => {\n const tracker = this.validationTrackers.get(rule.errorCode);\n return value !== undefined && !!tracker?.has(value) && rule.errorCode;\n });\n });\n this.validators(...validators);\n }\n }\n\n setOptions(newOptions: G[]) {\n this.validationTrackers.forEach((tracker) => tracker.clear());\n this.options = newOptions.map((option) => {\n this.config?.validationRules?.forEach((rule) => {\n if (rule.shouldTrack(option)) {\n this.validationTrackers.get(rule.errorCode)?.add(option.id);\n }\n });\n return option;\n });\n }\n}\n\nexport class SelectableOptionsArrayFieldState<\n T,\n G extends OptionType<T>,\n> extends A2InputFieldState<T[]> {\n options: G[] = [];\n private validationTrackers = new Map<string, Set<T>>();\n private config?: SelectableOptionsConfig<T, G>;\n\n constructor(initValue: T[], config?: SelectableOptionsConfig<T, G>) {\n super(initValue);\n this.config = config;\n makeObservable(this, { options: observable });\n\n if (config?.validationRules) {\n const validators: Validator<T[]>[] = [];\n config.validationRules.forEach((rule) => {\n this.validationTrackers.set(rule.errorCode, new Set());\n validators.push((values: T[]) => {\n if (!values || values.length === 0) {\n return false;\n }\n const tracker = this.validationTrackers.get(rule.errorCode);\n return values.some((value) => tracker?.has(value)) && rule.errorCode;\n });\n });\n this.validators(...validators);\n }\n }\n\n setOptions(newOptions: G[]) {\n this.validationTrackers.forEach((tracker) => tracker.clear());\n this.options = newOptions.map((option) => {\n this.config?.validationRules?.forEach((rule) => {\n if (rule.shouldTrack(option)) {\n this.validationTrackers.get(rule.errorCode)?.add(option.id);\n }\n });\n return option;\n });\n }\n\n hasValueChanged = () => {\n const current = this.value;\n const initial = this.initValue;\n if (current === initial) return false;\n if (!current || !initial) return true;\n if (current.length !== initial.length) return true;\n return current.some((val, i) => val !== initial[i]);\n };\n}\n","import { TextField, TextFieldProps } from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormTextFieldProps extends Omit<\n TextFieldProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<string>;\n}\n\nexport const FormTextField = observer(function FormTextField({\n fieldState,\n disabled,\n ...props\n}: FormTextFieldProps) {\n return (\n <TextField\n {...(props as TextFieldProps)}\n value={fieldState.value}\n onChange={(e) => fieldState.onChange(e.target.value)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import { Textarea, TextareaProps } from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormTextareaProps extends Omit<\n TextareaProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<string>;\n}\n\nexport const FormTextarea = observer(function FormTextarea({\n fieldState,\n disabled,\n ...props\n}: FormTextareaProps) {\n return (\n <Textarea\n {...(props as TextareaProps)}\n value={fieldState.value}\n onChange={(e) => fieldState.onChange(e.target.value)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import { NumberField, NumberFieldProps } from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormNumberFieldProps extends Omit<\n NumberFieldProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<number | null>;\n}\n\nexport const FormNumberField = observer(function FormNumberField({\n fieldState,\n disabled,\n ...props\n}: FormNumberFieldProps) {\n return (\n <NumberField\n {...props}\n value={fieldState.value}\n onChange={(value) => fieldState.onChange(value)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import { DateFieldSingle, DateFieldSingleProps } from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormDateFieldSingleProps extends Omit<\n DateFieldSingleProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<string | null>;\n}\n\nexport const FormDateFieldSingle = observer(function FormDateFieldSingle({\n fieldState,\n disabled,\n ...props\n}: FormDateFieldSingleProps) {\n return (\n <DateFieldSingle\n {...props}\n value={fieldState.value}\n onChange={(change) => fieldState.onChange(change.date)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import {\n DateFieldRange,\n DateFieldRangeProps,\n DateFieldRangeValue,\n} from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormDateFieldRangeProps extends Omit<\n DateFieldRangeProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<DateFieldRangeValue | null>;\n}\n\nexport const FormDateFieldRange = observer(function FormDateFieldRange({\n fieldState,\n disabled,\n ...props\n}: FormDateFieldRangeProps) {\n return (\n <DateFieldRange\n {...props}\n value={fieldState.value ?? undefined}\n onChange={(change) =>\n fieldState.onChange(\n change.isInputEmpty\n ? null\n : { startDate: change.startDate, endDate: change.endDate },\n )\n }\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import {\n DateFieldYearless,\n DateFieldYearlessProps,\n YearlessDate,\n} from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormDateFieldYearlessProps extends Omit<\n DateFieldYearlessProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<YearlessDate | null>;\n}\n\nexport const FormDateFieldYearless = observer(function FormDateFieldYearless({\n fieldState,\n disabled,\n ...props\n}: FormDateFieldYearlessProps) {\n return (\n <DateFieldYearless\n {...props}\n value={fieldState.value}\n onChange={(change) => fieldState.onChange(change.value)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import {\n DateFieldYearlessRange,\n DateFieldYearlessRangeProps,\n DateFieldYearlessRangeValue,\n} from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormDateFieldYearlessRangeProps extends Omit<\n DateFieldYearlessRangeProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<DateFieldYearlessRangeValue>;\n}\n\nexport const FormDateFieldYearlessRange = observer(\n function FormDateFieldYearlessRange({\n fieldState,\n disabled,\n ...props\n }: FormDateFieldYearlessRangeProps) {\n return (\n <DateFieldYearlessRange\n {...props}\n value={fieldState.value}\n onChange={(change) =>\n fieldState.onChange({\n startDate: change.startDate,\n endDate: change.endDate,\n })\n }\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n },\n);\n","import { TimeField, TimeFieldProps } from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\nexport interface FormTimeFieldProps extends Omit<\n TimeFieldProps,\n \"value\" | \"onChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<string | null>;\n}\n\nexport const FormTimeField = observer(function FormTimeField({\n fieldState,\n disabled,\n ...props\n}: FormTimeFieldProps) {\n return (\n <TimeField\n {...(props as TimeFieldProps)}\n value={fieldState.value}\n onChange={(change) => fieldState.onChange(change.time)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import {\n SelectField,\n SelectFieldOption,\n SelectFieldProps,\n} from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState, DistributiveOmit } from \"../../state\";\n\n/**\n * FormSelect wraps the beta SelectField and binds it to an A2InputFieldState.\n * Supports all loader modes (eager and all lazy variants) because the props\n * type uses DistributiveOmit to preserve each union member's loader type.\n */\nexport type FormSelectProps = DistributiveOmit<\n SelectFieldProps,\n \"value\" | \"onSelectedOptionChange\" | \"error\" | \"warning\"\n> & { fieldState: A2InputFieldState<SelectFieldOption | null> };\n\nexport const FormSelect = observer(function FormSelect({\n fieldState,\n disabled,\n ...props\n}: FormSelectProps) {\n return (\n <SelectField\n {...(props as SelectFieldProps)}\n value={fieldState.value}\n onSelectedOptionChange={(option) => fieldState.onChange(option)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import {\n SelectFieldSync,\n SelectFieldSyncProps,\n SelectFieldOption,\n} from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\n/**\n * FormSelectSync wraps the beta SelectFieldSync and binds it to an\n * A2InputFieldState. Use this when the full option set is available client-side\n * (passed via `options`) instead of loaded asynchronously through `loadOptions`.\n * SelectFieldSyncProps is a flat (non-union) type so we can use Omit directly.\n */\nexport interface FormSelectSyncProps extends Omit<\n SelectFieldSyncProps,\n \"value\" | \"onSelectedOptionChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<SelectFieldOption | null>;\n}\n\nexport const FormSelectSync = observer(function FormSelectSync({\n fieldState,\n disabled,\n ...props\n}: FormSelectSyncProps) {\n return (\n <SelectFieldSync\n {...props}\n value={fieldState.value}\n onSelectedOptionChange={(option) => fieldState.onChange(option)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import {\n MultiSelectField,\n MultiSelectFieldOption,\n MultiSelectFieldProps,\n} from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState, DistributiveOmit } from \"../../state\";\n\n/**\n * FormMultiSelect wraps the beta MultiSelectField and binds it to an\n * A2InputFieldState. Supports all loader modes (eager and all lazy variants)\n * because the props type uses DistributiveOmit to preserve each union member's\n * loader type.\n */\nexport type FormMultiSelectProps = DistributiveOmit<\n MultiSelectFieldProps,\n \"value\" | \"onSelectedOptionsChange\" | \"error\" | \"warning\"\n> & { fieldState: A2InputFieldState<MultiSelectFieldOption[]> };\n\nexport const FormMultiSelect = observer(function FormMultiSelect({\n fieldState,\n disabled,\n ...props\n}: FormMultiSelectProps) {\n return (\n <MultiSelectField\n {...(props as MultiSelectFieldProps)}\n value={fieldState.value}\n onSelectedOptionsChange={(options) => fieldState.onChange(options)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import {\n MultiSelectFieldSync,\n MultiSelectFieldSyncProps,\n MultiSelectFieldOption,\n} from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\n/**\n * FormMultiSelectSync wraps the beta MultiSelectFieldSync and binds it to an\n * A2InputFieldState. Use this when the full option set is available client-side\n * (passed via `options`) instead of loaded asynchronously through `loadOptions`.\n * MultiSelectFieldSyncProps is a flat (non-union) type so we can use Omit directly.\n */\nexport interface FormMultiSelectSyncProps extends Omit<\n MultiSelectFieldSyncProps,\n \"value\" | \"onSelectedOptionsChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<MultiSelectFieldOption[]>;\n}\n\nexport const FormMultiSelectSync = observer(function FormMultiSelectSync({\n fieldState,\n disabled,\n ...props\n}: FormMultiSelectSyncProps) {\n return (\n <MultiSelectFieldSync\n {...props}\n value={fieldState.value}\n onSelectedOptionsChange={(options) => fieldState.onChange(options)}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import {\n TreeSelectField,\n TreeSelectFieldValue,\n TreeSelectFieldProps,\n} from \"@servicetitan/anvil2/beta\";\nimport { observer } from \"mobx-react\";\nimport { A2InputFieldState } from \"../../state\";\n\n/**\n * FormTreeSelect wraps the beta TreeSelectField and binds it to an\n * A2InputFieldState. TreeSelectFieldProps is a flat (non-union) type so we can\n * use Omit directly. The loadOptions signature is:\n * (searchValue: string, parentNode?: TreeSelectFieldNode) => TreeSelectFieldNode[] | Promise<TreeSelectFieldNode[]>\n */\nexport interface FormTreeSelectProps extends Omit<\n TreeSelectFieldProps,\n \"value\" | \"onSelectedOptionsChange\" | \"error\" | \"warning\"\n> {\n fieldState: A2InputFieldState<TreeSelectFieldValue[]>;\n}\n\nexport const FormTreeSelect = observer(function FormTreeSelect({\n fieldState,\n disabled,\n ...props\n}: FormTreeSelectProps) {\n return (\n <TreeSelectField\n {...props}\n value={fieldState.value}\n onSelectedOptionsChange={(nodes: TreeSelectFieldValue[]) =>\n fieldState.onChange(nodes)\n }\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n disabled={disabled ?? fieldState.disabled}\n />\n );\n});\n","import { ReactElement, ReactNode, useId } from \"react\";\nimport { Radio, RadioGroupProps } from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { SelectableOptionsFieldState, OptionType } from \"../../state\";\n\nexport interface FormRadioGroupItem<T> extends OptionType<T> {\n label: ReactNode;\n}\n\nexport interface FormRadioGroupProps<\n T,\n G extends FormRadioGroupItem<T>,\n> extends Omit<RadioGroupProps, \"error\" | \"warning\" | \"children\"> {\n fieldState: SelectableOptionsFieldState<T, G>;\n items: G[];\n}\n\nfunction FormRadioGroupInner<T, G extends FormRadioGroupItem<T>>({\n fieldState,\n items,\n disabled,\n ...props\n}: FormRadioGroupProps<T, G>) {\n const name = useId();\n const effectiveDisabled = disabled ?? fieldState.disabled;\n return (\n <Radio.Group\n {...props}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n >\n {items.map((item) => (\n <Radio\n key={String(item.id)}\n name={name}\n label={item.label as string | ReactElement}\n disabled={effectiveDisabled || item.disabled}\n checked={fieldState.value === item.id}\n onChange={(e) => {\n if (e.target.checked) {\n fieldState.onChange(item.id);\n }\n }}\n />\n ))}\n </Radio.Group>\n );\n}\n\nexport const FormRadioGroup = observer(\n FormRadioGroupInner,\n) as typeof FormRadioGroupInner;\n","import { ReactElement, ReactNode, useId } from \"react\";\nimport { Checkbox, CheckboxGroupProps } from \"@servicetitan/anvil2\";\nimport { observer } from \"mobx-react\";\nimport { SelectableOptionsArrayFieldState, OptionType } from \"../../state\";\n\nexport interface FormCheckboxGroupItem<T> extends OptionType<T> {\n label: ReactNode;\n}\n\nexport interface FormCheckboxGroupProps<\n T,\n G extends FormCheckboxGroupItem<T>,\n> extends Omit<CheckboxGroupProps, \"error\" | \"warning\" | \"children\"> {\n fieldState: SelectableOptionsArrayFieldState<T, G>;\n items: G[];\n}\n\nfunction FormCheckboxGroupInner<T, G extends FormCheckboxGroupItem<T>>({\n fieldState,\n items,\n disabled,\n ...props\n}: FormCheckboxGroupProps<T, G>) {\n const name = useId();\n const selected = fieldState.value ?? [];\n const effectiveDisabled = disabled ?? fieldState.disabled;\n return (\n <Checkbox.Group\n {...props}\n error={fieldState.hasError ? fieldState.error : undefined}\n warning={fieldState.warning}\n >\n {items.map((item) => (\n <Checkbox\n key={String(item.id)}\n name={name}\n label={item.label as string | ReactElement}\n disabled={effectiveDisabled || item.disabled}\n checked={selected.includes(item.id)}\n onChange={(e) => {\n const next = e.target.checked\n ? [...selected, item.id]\n : selected.filter((id) => id !== item.id);\n fieldState.onChange(next);\n }}\n />\n ))}\n </Checkbox.Group>\n );\n}\n\nexport const FormCheckboxGroup = observer(\n FormCheckboxGroupInner,\n) as typeof FormCheckboxGroupInner;\n","import { FormTextField } from \"./FormTextField\";\nimport { FormTextarea } from \"./FormTextarea\";\nimport { FormNumberField } from \"./FormNumberField\";\nimport { FormDateFieldSingle } from \"./FormDateFieldSingle\";\nimport { FormDateFieldRange } from \"./FormDateFieldRange\";\nimport { FormDateFieldYearless } from \"./FormDateFieldYearless\";\nimport { FormDateFieldYearlessRange } from \"./FormDateFieldYearlessRange\";\nimport { FormTimeField } from \"./FormTimeField\";\nimport { FormSelect, FormSelectSync } from \"./FormSelect\";\nimport { FormMultiSelect, FormMultiSelectSync } from \"./FormMultiSelect\";\nimport { FormTreeSelect } from \"./FormTreeSelect\";\nimport { FormRadioGroup } from \"./FormRadioGroup\";\nimport { FormCheckboxGroup } from \"./FormCheckboxGroup\";\n\nexport const Form = {\n TextField: FormTextField,\n Textarea: FormTextarea,\n NumberField: FormNumberField,\n DateFieldSingle: FormDateFieldSingle,\n DateFieldRange: FormDateFieldRange,\n DateFieldYearless: FormDateFieldYearless,\n DateFieldYearlessRange: FormDateFieldYearlessRange,\n TimeField: FormTimeField,\n Select: FormSelect,\n SelectSync: FormSelectSync,\n MultiSelect: FormMultiSelect,\n MultiSelectSync: FormMultiSelectSync,\n TreeSelect: FormTreeSelect,\n RadioGroup: FormRadioGroup,\n CheckboxGroup: FormCheckboxGroup,\n};\n"],"names":["UpdateMode","FormTextField","FormTextarea","FormNumberField","FormDateFieldSingle","FormDateFieldRange","FormDateFieldYearless","FormDateFieldYearlessRange","FormTimeField","FormSelect","FormSelectSync","FormMultiSelect","FormMultiSelectSync","FormTreeSelect"],"mappings":";;;;;;;;;;;;;AAMO,IAAK,UAAA,qBAAAA,WAAAA,KAAL;AACL,EAAAA,YAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,YAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,YAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,YAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,YAAA,OAAA,CAAA,GAAQ,OAAA;AALE,EAAA,OAAAA,WAAAA;AAAA,CAAA,EAAA,UAAA,IAAA,EAAA;;ACKL,MAAM,0BAA6B,UAAA,CAAc;AAAA,EACtD,OAAA,GAA8B,MAAA;AAAA,EAC9B,QAAA,GAAW,KAAA;AAAA;AAAA,EAEX,UAAA;AAAA,EAEQ,YAAmC,EAAC;AAAA,EACpC,aAAoC,EAAC;AAAA,EACrC,qBAAA,uBAA4B,GAAA,EAAY;AAAA,EACxC,QAAA,GAAqC,MAAA;AAAA,EAE7C,YAAY,SAAA,EAAc;AACxB,IAAA,KAAA,CAAM,SAAS,CAAA;AACf,IAAA,cAAA,CAAe,IAAA,EAAM;AAAA,MACnB,OAAA,EAAS,UAAA;AAAA,MACT,QAAA,EAAU,UAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,eAAA,GAAkB,CAChB,MAAA,EACA,IAAA,KACG;AACH,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,EAC1B,CAAA;AAAA;AAAA,EAGA,qBAAA,GAAwB,CAAC,KAAA,KAAyC;AAChE,IAAA,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,aAAA,CAAc,KAAqB,CAAA;AAAA,EACzD,CAAA;AAAA,EAEA,SAAS,KAAA,EAAU;AACjB,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,EACtB;AAAA,EAEA,MAAM,QAAA,GAAW;AACf,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,OAAO,MAAM,QAAA,EAAS;AAAA,EACxB;AAAA;AAAA,EAGA,MAAM,YAAA,GAAe;AACnB,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA;AAAA,EAGA,QAAQ,OAAA,EAA2B;AACjC,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,EAAW;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,KAAA,CAAM,KAAA,EAAM;AAAA,IACd,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,MAAM,KAAK,CAAA;AAAA,IACnB;AACA,IAAA,IAAA,CAAK,QAAA,IAAW;AAAA,EAClB;AAAA;AAAA;AAAA,EAIA,YAAA,GAAe,CAAC,KAAA,KAAa;AAC3B,IAAA,UAAA,CAAW,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAC9C,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EACxB,CAAA;AAAA,EAEA,mBAAmB,MAAM;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAC,IAAA,CAAsC,aAAa,IAAA,CAAK,KAAA;AAAA,EAC3D,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAA,GAAY,MAAA,CAAO,CAAC,KAAA,KAAa;AAC/B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,CAAA,GAAI,KAAA;AACT,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAC,KAAsC,UAAA,GAAa,KAAA;AAAA,EACtD,CAAC,CAAA;AAAA;AAAA,EAGD,YAAA,CAAa,eAAuB,SAAA,EAAyB;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,aAAa,CAAA,EAAG;AAClD,MAAA,IAAA,CAAK,qBAAA,CAAsB,IAAI,aAAa,CAAA;AAC5C,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,SAAS,CAAA;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,aAAa,UAAA,EAAmC;AAC9C,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA,EAEA,iBAAiB,MAAM;AACrB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,CAAC,SAAA,KAAc;AACrC,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AACnC,MAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,MAAA,IAAa,WAAW,KAAA,EAAO;AAC/D,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,MAClB;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AAAA,EAEA,YAAY,UAAA,EAAmC;AAC7C,IAAA,IAAA,CAAK,SAAA,GAAY,UAAA;AAAA,EACnB;AAAA,EAEA,gBAAgB,MAAM;AACpB,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,SAAA,KAAc;AACpC,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AACnC,MAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,MAAA,IAAa,WAAW,KAAA,EAAO;AAC/D,QAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,MACjB;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AAAA,EAEA,gBAAA,CAAiB,cAAA,GAA6B,UAAA,CAAW,IAAA,EAAM;AAC7D,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAuB,cAAc,CAAA;AAAA,EAC7D;AAAA,EAEA,iBAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,EACpB;AAAA,EAEA,eAAA,GAAkB,MAAM,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,SAAA;AAAA,EAE5C,yBAAA,GAA4B,MAC1B,CAAC,CAAC,IAAA,CAAK,UAAA,IACP,IAAA,CAAK,UAAA,CAAW,KAAA,KAAU,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA;AAAA;AAAA,EAG7D,IAAI,SAAA,GAAe;AACjB,IAAA,OAAQ,IAAA,CAAsC,UAAA;AAAA,EAChD;AAAA,EAEQ,aAAqB,KAAA,EAAmC;AAC9D,IAAA,OAAQ,KAAA,CAA4C,UAAA;AAAA,EACtD;AACF;;AC3JO,MAAM,oCAGH,iBAAA,CAAqB;AAAA,EAC7B,UAAe,EAAC;AAAA,EACR,kBAAA,uBAAyB,GAAA,EAAoB;AAAA,EAC7C,MAAA;AAAA,EAER,WAAA,CAAY,WAAc,MAAA,EAAwC;AAChE,IAAA,KAAA,CAAM,SAAS,CAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,cAAA,CAAe,IAAA,EAAM,EAAE,OAAA,EAAS,UAAA,EAAY,CAAA;AAE5C,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,MAAM,aAA6B,EAAC;AACpC,MAAA,MAAA,CAAO,eAAA,CAAgB,OAAA,CAAQ,CAAC,IAAA,KAAS;AACvC,QAAA,IAAA,CAAK,mBAAmB,GAAA,CAAI,IAAA,CAAK,SAAA,kBAAW,IAAI,KAAK,CAAA;AACrD,QAAA,UAAA,CAAW,IAAA,CAAK,CAAC,KAAA,KAAa;AAC5B,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,KAAK,SAAS,CAAA;AAC1D,UAAA,OAAO,KAAA,KAAU,UAAa,CAAC,CAAC,SAAS,GAAA,CAAI,KAAK,KAAK,IAAA,CAAK,SAAA;AAAA,QAC9D,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,UAAA,CAAW,GAAG,UAAU,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,WAAW,UAAA,EAAiB;AAC1B,IAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,CAAC,OAAA,KAAY,OAAA,CAAQ,OAAO,CAAA;AAC5D,IAAA,IAAA,CAAK,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,CAAC,MAAA,KAAW;AACxC,MAAA,IAAA,CAAK,MAAA,EAAQ,eAAA,EAAiB,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC9C,QAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,EAAG;AAC5B,UAAA,IAAA,CAAK,mBAAmB,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA,EAAG,GAAA,CAAI,OAAO,EAAE,CAAA;AAAA,QAC5D;AAAA,MACF,CAAC,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AACF;AAEO,MAAM,yCAGH,iBAAA,CAAuB;AAAA,EAC/B,UAAe,EAAC;AAAA,EACR,kBAAA,uBAAyB,GAAA,EAAoB;AAAA,EAC7C,MAAA;AAAA,EAER,WAAA,CAAY,WAAgB,MAAA,EAAwC;AAClE,IAAA,KAAA,CAAM,SAAS,CAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,cAAA,CAAe,IAAA,EAAM,EAAE,OAAA,EAAS,UAAA,EAAY,CAAA;AAE5C,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,MAAM,aAA+B,EAAC;AACtC,MAAA,MAAA,CAAO,eAAA,CAAgB,OAAA,CAAQ,CAAC,IAAA,KAAS;AACvC,QAAA,IAAA,CAAK,mBAAmB,GAAA,CAAI,IAAA,CAAK,SAAA,kBAAW,IAAI,KAAK,CAAA;AACrD,QAAA,UAAA,CAAW,IAAA,CAAK,CAAC,MAAA,KAAgB;AAC/B,UAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAClC,YAAA,OAAO,KAAA;AAAA,UACT;AACA,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,KAAK,SAAS,CAAA;AAC1D,UAAA,OAAO,MAAA,CAAO,KAAK,CAAC,KAAA,KAAU,SAAS,GAAA,CAAI,KAAK,CAAC,CAAA,IAAK,IAAA,CAAK,SAAA;AAAA,QAC7D,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,UAAA,CAAW,GAAG,UAAU,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,WAAW,UAAA,EAAiB;AAC1B,IAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,CAAC,OAAA,KAAY,OAAA,CAAQ,OAAO,CAAA;AAC5D,IAAA,IAAA,CAAK,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,CAAC,MAAA,KAAW;AACxC,MAAA,IAAA,CAAK,MAAA,EAAQ,eAAA,EAAiB,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC9C,QAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,EAAG;AAC5B,UAAA,IAAA,CAAK,mBAAmB,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA,EAAG,GAAA,CAAI,OAAO,EAAE,CAAA;AAAA,QAC5D;AAAA,MACF,CAAC,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,kBAAkB,MAAM;AACtB,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA;AACrB,IAAA,MAAM,UAAU,IAAA,CAAK,SAAA;AACrB,IAAA,IAAI,OAAA,KAAY,SAAS,OAAO,KAAA;AAChC,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS,OAAO,IAAA;AACjC,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ,OAAO,IAAA;AAC9C,IAAA,OAAO,OAAA,CAAQ,KAAK,CAAC,GAAA,EAAK,MAAM,GAAA,KAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,EACpD,CAAA;AACF;;ACtFO,MAAM,aAAA,GAAgB,QAAA,CAAS,SAASC,cAAAA,CAAc;AAAA,EAC3D,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAuB;AACrB,EAAA,uBACE,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACE,GAAI,KAAA;AAAA,MACL,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,UAAU,CAAC,CAAA,KAAM,WAAW,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACnD,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,MAChD,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,QAAA,EAAU,YAAY,UAAA,CAAW;AAAA;AAAA,GACnC;AAEJ,CAAC;;ACfM,MAAM,YAAA,GAAe,QAAA,CAAS,SAASC,aAAAA,CAAa;AAAA,EACzD,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsB;AACpB,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACE,GAAI,KAAA;AAAA,MACL,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,UAAU,CAAC,CAAA,KAAM,WAAW,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACnD,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,MAChD,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,QAAA,EAAU,YAAY,UAAA,CAAW;AAAA;AAAA,GACnC;AAEJ,CAAC;;ACfM,MAAM,eAAA,GAAkB,QAAA,CAAS,SAASC,gBAAAA,CAAgB;AAAA,EAC/D,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,uBACE,GAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,QAAA,EAAU,CAAC,KAAA,KAAU,UAAA,CAAW,SAAS,KAAK,CAAA;AAAA,MAC9C,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,MAChD,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,QAAA,EAAU,YAAY,UAAA,CAAW;AAAA;AAAA,GACnC;AAEJ,CAAC;;ACfM,MAAM,mBAAA,GAAsB,QAAA,CAAS,SAASC,oBAAAA,CAAoB;AAAA,EACvE,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA6B;AAC3B,EAAA,uBACE,GAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,UAAU,CAAC,MAAA,KAAW,UAAA,CAAW,QAAA,CAAS,OAAO,IAAI,CAAA;AAAA,MACrD,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,MAChD,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,QAAA,EAAU,YAAY,UAAA,CAAW;AAAA;AAAA,GACnC;AAEJ,CAAC;;ACXM,MAAM,kBAAA,GAAqB,QAAA,CAAS,SAASC,mBAAAA,CAAmB;AAAA,EACrE,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA4B;AAC1B,EAAA,uBACE,GAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,KAAA,EAAO,WAAW,KAAA,IAAS,MAAA;AAAA,MAC3B,QAAA,EAAU,CAAC,MAAA,KACT,UAAA,CAAW,QAAA;AAAA,QACT,MAAA,CAAO,eACH,IAAA,GACA,EAAE,WAAW,MAAA,CAAO,SAAA,EAAW,OAAA,EAAS,MAAA,CAAO,OAAA;AAAQ,OAC7D;AAAA,MAEF,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,MAChD,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,QAAA,EAAU,YAAY,UAAA,CAAW;AAAA;AAAA,GACnC;AAEJ,CAAC;;ACrBM,MAAM,qBAAA,GAAwB,QAAA,CAAS,SAASC,sBAAAA,CAAsB;AAAA,EAC3E,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+B;AAC7B,EAAA,uBACE,GAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,UAAU,CAAC,MAAA,KAAW,UAAA,CAAW,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,MACtD,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,MAChD,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,QAAA,EAAU,YAAY,UAAA,CAAW;AAAA;AAAA,GACnC;AAEJ,CAAC;;ACfM,MAAM,0BAAA,GAA6B,QAAA;AAAA,EACxC,SAASC,2BAAAA,CAA2B;AAAA,IAClC,UAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,GACL,EAAoC;AAClC,IAAA,uBACE,GAAA;AAAA,MAAC,sBAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,OAAO,UAAA,CAAW,KAAA;AAAA,QAClB,QAAA,EAAU,CAAC,MAAA,KACT,UAAA,CAAW,QAAA,CAAS;AAAA,UAClB,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,SAAS,MAAA,CAAO;AAAA,SACjB,CAAA;AAAA,QAEH,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,QAChD,SAAS,UAAA,CAAW,OAAA;AAAA,QACpB,QAAA,EAAU,YAAY,UAAA,CAAW;AAAA;AAAA,KACnC;AAAA,EAEJ;AACF;;AC1BO,MAAM,aAAA,GAAgB,QAAA,CAAS,SAASC,cAAAA,CAAc;AAAA,EAC3D,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAuB;AACrB,EAAA,uBACE,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACE,GAAI,KAAA;AAAA,MACL,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,UAAU,CAAC,MAAA,KAAW,UAAA,CAAW,QAAA,CAAS,OAAO,IAAI,CAAA;AAAA,MACrD,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,MAChD,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,QAAA,EAAU,YAAY,UAAA,CAAW;AAAA;AAAA,GACnC;AAEJ,CAAC;;ACRM,MAAM,UAAA,GAAa,QAAA,CAAS,SAASC,WAAAA,CAAW;AAAA,EACrD,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,uBACE,GAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACE,GAAI,KAAA;AAAA,MACL,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,sBAAA,EAAwB,CAAC,MAAA,KAAW,UAAA,CAAW,SAAS,MAAM,CAAA;AAAA,MAC9D,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,MAChD,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,QAAA,EAAU,YAAY,UAAA,CAAW;AAAA;AAAA,GACnC;AAEJ,CAAC;;ACZM,MAAM,cAAA,GAAiB,QAAA,CAAS,SAASC,eAAAA,CAAe;AAAA,EAC7D,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAwB;AACtB,EAAA,uBACE,GAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,sBAAA,EAAwB,CAAC,MAAA,KAAW,UAAA,CAAW,SAAS,MAAM,CAAA;AAAA,MAC9D,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,MAChD,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,QAAA,EAAU,YAAY,UAAA,CAAW;AAAA;AAAA,GACnC;AAEJ,CAAC;;ACjBM,MAAM,eAAA,GAAkB,QAAA,CAAS,SAASC,gBAAAA,CAAgB;AAAA,EAC/D,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,uBACE,GAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACE,GAAI,KAAA;AAAA,MACL,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,uBAAA,EAAyB,CAAC,OAAA,KAAY,UAAA,CAAW,SAAS,OAAO,CAAA;AAAA,MACjE,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,MAChD,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,QAAA,EAAU,YAAY,UAAA,CAAW;AAAA;AAAA,GACnC;AAEJ,CAAC;;ACbM,MAAM,mBAAA,GAAsB,QAAA,CAAS,SAASC,oBAAAA,CAAoB;AAAA,EACvE,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA6B;AAC3B,EAAA,uBACE,GAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,uBAAA,EAAyB,CAAC,OAAA,KAAY,UAAA,CAAW,SAAS,OAAO,CAAA;AAAA,MACjE,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,MAChD,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,QAAA,EAAU,YAAY,UAAA,CAAW;AAAA;AAAA,GACnC;AAEJ,CAAC;;ACfM,MAAM,cAAA,GAAiB,QAAA,CAAS,SAASC,eAAAA,CAAe;AAAA,EAC7D,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAwB;AACtB,EAAA,uBACE,GAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,uBAAA,EAAyB,CAAC,KAAA,KACxB,UAAA,CAAW,SAAS,KAAK,CAAA;AAAA,MAE3B,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,MAChD,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,QAAA,EAAU,YAAY,UAAA,CAAW;AAAA;AAAA,GACnC;AAEJ,CAAC;;ACrBD,SAAS,mBAAA,CAAwD;AAAA,EAC/D,UAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA8B;AAC5B,EAAA,MAAM,OAAO,KAAA,EAAM;AACnB,EAAA,MAAM,iBAAA,GAAoB,YAAY,UAAA,CAAW,QAAA;AACjD,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA,CAAM,KAAA;AAAA,IAAN;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,MAChD,SAAS,UAAA,CAAW,OAAA;AAAA,MAEnB,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACV,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,IAAA;AAAA,UACA,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,QAAA,EAAU,qBAAqB,IAAA,CAAK,QAAA;AAAA,UACpC,OAAA,EAAS,UAAA,CAAW,KAAA,KAAU,IAAA,CAAK,EAAA;AAAA,UACnC,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,YAAA,IAAI,CAAA,CAAE,OAAO,OAAA,EAAS;AACpB,cAAA,UAAA,CAAW,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,YAC7B;AAAA,UACF;AAAA,SAAA;AAAA,QATK,MAAA,CAAO,KAAK,EAAE;AAAA,OAWtB;AAAA;AAAA,GACH;AAEJ;AAEO,MAAM,cAAA,GAAiB,QAAA;AAAA,EAC5B;AACF;;AClCA,SAAS,sBAAA,CAA8D;AAAA,EACrE,UAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiC;AAC/B,EAAA,MAAM,OAAO,KAAA,EAAM;AACnB,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,KAAA,IAAS,EAAC;AACtC,EAAA,MAAM,iBAAA,GAAoB,YAAY,UAAA,CAAW,QAAA;AACjD,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA,CAAS,KAAA;AAAA,IAAT;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,KAAA,EAAO,UAAA,CAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAQ,MAAA;AAAA,MAChD,SAAS,UAAA,CAAW,OAAA;AAAA,MAEnB,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACV,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA;AAAA,UACA,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,QAAA,EAAU,qBAAqB,IAAA,CAAK,QAAA;AAAA,UACpC,OAAA,EAAS,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AAAA,UAClC,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,YAAA,MAAM,OAAO,CAAA,CAAE,MAAA,CAAO,OAAA,GAClB,CAAC,GAAG,QAAA,EAAU,IAAA,CAAK,EAAE,CAAA,GACrB,SAAS,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,KAAO,KAAK,EAAE,CAAA;AAC1C,YAAA,UAAA,CAAW,SAAS,IAAI,CAAA;AAAA,UAC1B;AAAA,SAAA;AAAA,QAVK,MAAA,CAAO,KAAK,EAAE;AAAA,OAYtB;AAAA;AAAA,GACH;AAEJ;AAEO,MAAM,iBAAA,GAAoB,QAAA;AAAA,EAC/B;AACF;;ACvCO,MAAM,IAAA,GAAO;AAAA,EAClB,SAAA,EAAW,aAAA;AAAA,EACX,QAAA,EAAU,YAAA;AAAA,EACV,WAAA,EAAa,eAAA;AAAA,EACb,eAAA,EAAiB,mBAAA;AAAA,EACjB,cAAA,EAAgB,kBAAA;AAAA,EAChB,iBAAA,EAAmB,qBAAA;AAAA,EACnB,sBAAA,EAAwB,0BAAA;AAAA,EACxB,SAAA,EAAW,aAAA;AAAA,EACX,MAAA,EAAQ,UAAA;AAAA,EACR,UAAA,EAAY,cAAA;AAAA,EACZ,WAAA,EAAa,eAAA;AAAA,EACb,eAAA,EAAiB,mBAAA;AAAA,EACjB,UAAA,EAAY,cAAA;AAAA,EACZ,UAAA,EAAY,cAAA;AAAA,EACZ,aAAA,EAAe;AACjB;;;;"}
@@ -8,7 +8,9 @@ export declare const Form: {
8
8
  DateFieldYearlessRange: ({ fieldState, disabled, ...props }: import('./FormDateFieldYearlessRange').FormDateFieldYearlessRangeProps) => import("react/jsx-runtime").JSX.Element;
9
9
  TimeField: ({ fieldState, disabled, ...props }: import('./FormTimeField').FormTimeFieldProps) => import("react/jsx-runtime").JSX.Element;
10
10
  Select: ({ fieldState, disabled, ...props }: import('./FormSelect').FormSelectProps) => import("react/jsx-runtime").JSX.Element;
11
+ SelectSync: ({ fieldState, disabled, ...props }: import('./FormSelect').FormSelectSyncProps) => import("react/jsx-runtime").JSX.Element;
11
12
  MultiSelect: ({ fieldState, disabled, ...props }: import('./FormMultiSelect').FormMultiSelectProps) => import("react/jsx-runtime").JSX.Element;
13
+ MultiSelectSync: ({ fieldState, disabled, ...props }: import('./FormMultiSelect').FormMultiSelectSyncProps) => import("react/jsx-runtime").JSX.Element;
12
14
  TreeSelect: ({ fieldState, disabled, ...props }: import('./FormTreeSelect').FormTreeSelectProps) => import("react/jsx-runtime").JSX.Element;
13
15
  RadioGroup: <T, G extends import('./FormRadioGroup').FormRadioGroupItem<T>>({ fieldState, items, disabled, ...props }: import('./FormRadioGroup').FormRadioGroupProps<T, G>) => import("react/jsx-runtime").JSX.Element;
14
16
  CheckboxGroup: <T, G extends import('./FormCheckboxGroup').FormCheckboxGroupItem<T>>({ fieldState, items, disabled, ...props }: import('./FormCheckboxGroup').FormCheckboxGroupProps<T, G>) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,12 @@
1
+ import { MultiSelectFieldSyncProps, MultiSelectFieldOption } from '@servicetitan/anvil2';
2
+ import { A2InputFieldState } from '../../state';
3
+ /**
4
+ * FormMultiSelectSync wraps the beta MultiSelectFieldSync and binds it to an
5
+ * A2InputFieldState. Use this when the full option set is available client-side
6
+ * (passed via `options`) instead of loaded asynchronously through `loadOptions`.
7
+ * MultiSelectFieldSyncProps is a flat (non-union) type so we can use Omit directly.
8
+ */
9
+ export interface FormMultiSelectSyncProps extends Omit<MultiSelectFieldSyncProps, "value" | "onSelectedOptionsChange" | "error" | "warning"> {
10
+ fieldState: A2InputFieldState<MultiSelectFieldOption[]>;
11
+ }
12
+ export declare const FormMultiSelectSync: ({ fieldState, disabled, ...props }: FormMultiSelectSyncProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,2 @@
1
1
  export * from './FormMultiSelect';
2
+ export * from './FormMultiSelectSync';
@@ -0,0 +1,12 @@
1
+ import { SelectFieldSyncProps, SelectFieldOption } from '@servicetitan/anvil2';
2
+ import { A2InputFieldState } from '../../state';
3
+ /**
4
+ * FormSelectSync wraps the beta SelectFieldSync and binds it to an
5
+ * A2InputFieldState. Use this when the full option set is available client-side
6
+ * (passed via `options`) instead of loaded asynchronously through `loadOptions`.
7
+ * SelectFieldSyncProps is a flat (non-union) type so we can use Omit directly.
8
+ */
9
+ export interface FormSelectSyncProps extends Omit<SelectFieldSyncProps, "value" | "onSelectedOptionChange" | "error" | "warning"> {
10
+ fieldState: A2InputFieldState<SelectFieldOption | null>;
11
+ }
12
+ export declare const FormSelectSync: ({ fieldState, disabled, ...props }: FormSelectSyncProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,2 @@
1
1
  export * from './FormSelect';
2
+ export * from './FormSelectSync';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/anvil2-ext-common",
3
- "version": "0.5.1",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "types": "./dist/src/index.d.ts",
6
6
  "main": "./dist/index.js",
@@ -33,7 +33,7 @@
33
33
  "uuid": "^14.0.0"
34
34
  },
35
35
  "peerDependencies": {
36
- "@servicetitan/anvil2": "^3.3.0",
36
+ "@servicetitan/anvil2": "^3.4.1",
37
37
  "@types/react": "^18 || ^19",
38
38
  "@types/react-dom": "^18 || ^19",
39
39
  "formstate": "^2.1.0",
@@ -84,7 +84,7 @@
84
84
  "vite": "6.4.2",
85
85
  "vitest": "^3.2.4",
86
86
  "vitest-axe": "^0.1.0",
87
- "@servicetitan/anvil2": "3.3.0"
87
+ "@servicetitan/anvil2": "3.4.1"
88
88
  },
89
89
  "scripts": {
90
90
  "dev": "vite",