@object-ui/fields 17.3.0 → 17.6.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.
Files changed (265) hide show
  1. package/CHANGELOG.md +1655 -0
  2. package/README.md +1 -12
  3. package/dist/FieldEditWidget.d.ts +23 -3
  4. package/dist/currency.d.ts +46 -0
  5. package/dist/field-type-alias.d.ts +35 -1
  6. package/dist/index.cjs +4 -4
  7. package/dist/index.css +651 -0
  8. package/dist/index.d.ts +474 -85
  9. package/dist/index.js +5418 -5023
  10. package/dist/widgets/AddressField.d.ts +4 -12
  11. package/dist/widgets/AutoNumberField.d.ts +1 -1
  12. package/dist/widgets/AvatarField.d.ts +1 -1
  13. package/dist/widgets/BooleanField.d.ts +1 -1
  14. package/dist/widgets/CapabilityMultiSelectField.d.ts +1 -1
  15. package/dist/widgets/CheckboxesField.d.ts +1 -1
  16. package/dist/widgets/CodeField.d.ts +1 -1
  17. package/dist/widgets/ColorField.d.ts +1 -1
  18. package/dist/widgets/CurrencyField.d.ts +1 -1
  19. package/dist/widgets/DateField.d.ts +1 -1
  20. package/dist/widgets/DateTimeField.d.ts +1 -1
  21. package/dist/widgets/EmailField.d.ts +1 -1
  22. package/dist/widgets/FileField.d.ts +18 -2
  23. package/dist/widgets/FilterConditionField.d.ts +28 -1
  24. package/dist/widgets/FormulaField.d.ts +1 -1
  25. package/dist/widgets/FullscreenFieldEditor.d.ts +49 -152
  26. package/dist/widgets/GeolocationField.d.ts +1 -1
  27. package/dist/widgets/GridField.d.ts +68 -6
  28. package/dist/widgets/ImageField.d.ts +1 -1
  29. package/dist/widgets/LocationField.d.ts +1 -1
  30. package/dist/widgets/LookupField.d.ts +1 -1
  31. package/dist/widgets/MasterDetailField.d.ts +1 -1
  32. package/dist/widgets/MultiSelectField.d.ts +1 -1
  33. package/dist/widgets/NumberField.d.ts +1 -1
  34. package/dist/widgets/ObjectField.d.ts +1 -1
  35. package/dist/widgets/ObjectRefField.d.ts +1 -1
  36. package/dist/widgets/OptionsEmptyState.d.ts +21 -1
  37. package/dist/widgets/PasswordField.d.ts +1 -1
  38. package/dist/widgets/PercentField.d.ts +1 -1
  39. package/dist/widgets/PhoneField.d.ts +1 -1
  40. package/dist/widgets/QRCodeField.d.ts +1 -1
  41. package/dist/widgets/RadioField.d.ts +1 -1
  42. package/dist/widgets/RatingField.d.ts +1 -1
  43. package/dist/widgets/RecipientPickerField.d.ts +1 -1
  44. package/dist/widgets/RecordPickerDialog.d.ts +34 -10
  45. package/dist/widgets/RichTextField.d.ts +37 -1
  46. package/dist/widgets/SelectField.d.ts +26 -6
  47. package/dist/widgets/SignatureField.d.ts +32 -2
  48. package/dist/widgets/SliderField.d.ts +37 -2
  49. package/dist/widgets/SummaryField.d.ts +1 -1
  50. package/dist/widgets/TagsField.d.ts +1 -1
  51. package/dist/widgets/TextAreaField.d.ts +6 -2
  52. package/dist/widgets/TextField.d.ts +1 -1
  53. package/dist/widgets/TimeField.d.ts +1 -1
  54. package/dist/widgets/UrlField.d.ts +1 -1
  55. package/dist/widgets/UserField.d.ts +1 -1
  56. package/dist/widgets/VectorField.d.ts +1 -1
  57. package/dist/widgets/_cell-renderer-bridge.d.ts +1 -1
  58. package/dist/widgets/address-format.d.ts +88 -0
  59. package/dist/widgets/file-size-guard.d.ts +41 -0
  60. package/dist/widgets/lookupColumnDisplay.d.ts +93 -0
  61. package/dist/widgets/nativeDateValue.d.ts +37 -0
  62. package/dist/widgets/richTextDisplay.d.ts +80 -0
  63. package/dist/widgets/toDomProps.d.ts +30 -10
  64. package/dist/widgets/toHostGroupProps.d.ts +189 -0
  65. package/dist/widgets/types.d.ts +8 -3
  66. package/dist/widgets/useRecordQuery.d.ts +7 -1
  67. package/package.json +17 -14
  68. package/dist/FieldEditWidget.test.d.ts +0 -8
  69. package/dist/__tests__/DateCellRenderer.test.d.ts +0 -0
  70. package/dist/__tests__/NumberCellRenderer.test.d.ts +0 -0
  71. package/dist/__tests__/cell-truncation.test.d.ts +0 -0
  72. package/dist/__tests__/field-carrier-sdui.test.d.ts +0 -0
  73. package/dist/__tests__/lookupCellDisplayField.test.d.ts +0 -0
  74. package/dist/__tests__/lookupCellDisplayName.test.d.ts +0 -0
  75. package/dist/__tests__/lookupCellReferenceKey.test.d.ts +0 -0
  76. package/dist/__tests__/registry-collision.test.d.ts +0 -0
  77. package/dist/__tests__/resolveFieldCurrency.test.d.ts +0 -1
  78. package/dist/__tests__/spec-symbol-batch7.test.d.ts +0 -8
  79. package/dist/__tests__/validation-feedback.test.d.ts +0 -0
  80. package/dist/__tests__/widget-aria-invalid-e2e.test.d.ts +0 -0
  81. package/dist/__tests__/widget-aria-invalid-registry-e2e.test.d.ts +0 -0
  82. package/dist/__tests__/widget-dom-leak-e2e.test.d.ts +0 -0
  83. package/dist/__tests__/widget-props-contract.test.d.ts +0 -8
  84. package/dist/coerce-safe-value.test.d.ts +0 -1
  85. package/dist/complex-widgets.test.d.ts +0 -1
  86. package/dist/datetime-widgets.test.d.ts +0 -1
  87. package/dist/field-type-coverage.test.d.ts +0 -1
  88. package/dist/standard-widgets.test.d.ts +0 -0
  89. package/dist/widgets/AddressField.uniqueIds.test.d.ts +0 -0
  90. package/dist/widgets/CapabilityMultiSelectField.test.d.ts +0 -0
  91. package/dist/widgets/CharacterCount.d.ts +0 -56
  92. package/dist/widgets/CheckboxesField.cascade.test.d.ts +0 -0
  93. package/dist/widgets/GeolocationField.uniqueIds.test.d.ts +0 -0
  94. package/dist/widgets/GridField.test.d.ts +0 -1
  95. package/dist/widgets/ImageLightbox.test.d.ts +0 -1
  96. package/dist/widgets/LookupField.dependsOn.test.d.ts +0 -8
  97. package/dist/widgets/LookupField.gateHintLabel.test.d.ts +0 -8
  98. package/dist/widgets/LookupField.hydration.test.d.ts +0 -1
  99. package/dist/widgets/LookupField.idField.test.d.ts +0 -1
  100. package/dist/widgets/MultiSelectField.cascade.test.d.ts +0 -0
  101. package/dist/widgets/OptionsEmptyState.no-provider.test.d.ts +0 -0
  102. package/dist/widgets/OptionsEmptyState.test.d.ts +0 -0
  103. package/dist/widgets/PeoplePicker.test.d.ts +0 -8
  104. package/dist/widgets/PeoplePickerComponents.test.d.ts +0 -8
  105. package/dist/widgets/RadioField.cascade.test.d.ts +0 -0
  106. package/dist/widgets/RecipientPickerField.test.d.ts +0 -0
  107. package/dist/widgets/RecordPickerDialog.filterOptions.test.d.ts +0 -8
  108. package/dist/widgets/RecordPickerDialog.selectLabel.test.d.ts +0 -8
  109. package/dist/widgets/SelectField.cascade.test.d.ts +0 -0
  110. package/dist/widgets/TagsField.placeholder.no-provider.test.d.ts +0 -0
  111. package/dist/widgets/TagsField.placeholder.test.d.ts +0 -0
  112. package/dist/widgets/UserFieldPicker.test.d.ts +0 -8
  113. package/dist/widgets/__tests__/FilterConditionField.matchAll.test.d.ts +0 -8
  114. package/dist/widgets/__tests__/FilterConditionField.operators.test.d.ts +0 -8
  115. package/dist/widgets/__tests__/FullscreenFieldEditor.i18n.test.d.ts +0 -0
  116. package/dist/widgets/__tests__/FullscreenFieldEditor.no-provider.test.d.ts +0 -0
  117. package/dist/widgets/__tests__/RichTextField.fullscreenDisabled.test.d.ts +0 -0
  118. package/dist/widgets/__tests__/RichTextField.mobileFullscreen.test.d.ts +0 -0
  119. package/dist/widgets/__tests__/TextAreaField.characterCount.announcements.test.d.ts +0 -0
  120. package/dist/widgets/__tests__/TextAreaField.characterCount.i18n.test.d.ts +0 -0
  121. package/dist/widgets/__tests__/TextAreaField.characterCount.no-provider.test.d.ts +0 -0
  122. package/dist/widgets/__tests__/TextAreaField.fullscreenCharacterCount.i18n.test.d.ts +0 -0
  123. package/dist/widgets/__tests__/TextAreaField.fullscreenCharacterCount.test.d.ts +0 -0
  124. package/dist/widgets/__tests__/TextAreaField.fullscreenDisabled.test.d.ts +0 -0
  125. package/dist/widgets/__tests__/TextAreaField.mobileFullscreen.test.d.ts +0 -0
  126. package/dist/widgets/deriveLookupColumns.test.d.ts +0 -1
  127. package/dist/widgets/file-value.test.d.ts +0 -1
  128. package/dist/widgets/personDisplay.test.d.ts +0 -8
  129. package/dist/widgets/recentLookups.test.d.ts +0 -1
  130. package/dist/widgets/useRecordQuery.test.d.ts +0 -8
  131. package/dist/widgets/useUploadingSignal.test.d.ts +0 -1
  132. package/src/FieldEditWidget.test.ts +0 -133
  133. package/src/FieldEditWidget.tsx +0 -191
  134. package/src/__tests__/DateCellRenderer.test.tsx +0 -73
  135. package/src/__tests__/NumberCellRenderer.test.tsx +0 -60
  136. package/src/__tests__/cell-truncation.test.tsx +0 -96
  137. package/src/__tests__/field-carrier-sdui.test.tsx +0 -169
  138. package/src/__tests__/lookupCellDisplayField.test.tsx +0 -107
  139. package/src/__tests__/lookupCellDisplayName.test.tsx +0 -119
  140. package/src/__tests__/lookupCellReferenceKey.test.tsx +0 -57
  141. package/src/__tests__/registry-collision.test.ts +0 -91
  142. package/src/__tests__/resolveFieldCurrency.test.ts +0 -20
  143. package/src/__tests__/spec-symbol-batch7.test.ts +0 -126
  144. package/src/__tests__/validation-feedback.test.tsx +0 -361
  145. package/src/__tests__/widget-aria-invalid-e2e.test.tsx +0 -265
  146. package/src/__tests__/widget-aria-invalid-registry-e2e.test.tsx +0 -338
  147. package/src/__tests__/widget-dom-leak-e2e.test.tsx +0 -598
  148. package/src/__tests__/widget-props-contract.test.tsx +0 -142
  149. package/src/coerce-safe-value.test.ts +0 -34
  150. package/src/complex-widgets.test.tsx +0 -908
  151. package/src/currency.ts +0 -14
  152. package/src/datetime-widgets.test.tsx +0 -93
  153. package/src/field-type-alias.ts +0 -100
  154. package/src/field-type-coverage.test.ts +0 -67
  155. package/src/index.tsx +0 -2503
  156. package/src/standard-widgets.test.tsx +0 -357
  157. package/src/widgets/AddressField.tsx +0 -132
  158. package/src/widgets/AddressField.uniqueIds.test.tsx +0 -92
  159. package/src/widgets/AutoNumberField.tsx +0 -18
  160. package/src/widgets/AvatarField.tsx +0 -117
  161. package/src/widgets/BooleanField.tsx +0 -52
  162. package/src/widgets/CapabilityMultiSelectField.test.tsx +0 -168
  163. package/src/widgets/CapabilityMultiSelectField.tsx +0 -229
  164. package/src/widgets/CharacterCount.tsx +0 -263
  165. package/src/widgets/CheckboxesField.cascade.test.tsx +0 -143
  166. package/src/widgets/CheckboxesField.tsx +0 -136
  167. package/src/widgets/CodeField.tsx +0 -41
  168. package/src/widgets/ColorField.tsx +0 -53
  169. package/src/widgets/CurrencyField.tsx +0 -95
  170. package/src/widgets/DateField.tsx +0 -31
  171. package/src/widgets/DateTimeField.tsx +0 -37
  172. package/src/widgets/EmailField.tsx +0 -37
  173. package/src/widgets/FileField.tsx +0 -494
  174. package/src/widgets/FilterConditionField.tsx +0 -454
  175. package/src/widgets/FormulaField.tsx +0 -33
  176. package/src/widgets/FullscreenFieldEditor.tsx +0 -271
  177. package/src/widgets/GeolocationField.tsx +0 -167
  178. package/src/widgets/GeolocationField.uniqueIds.test.tsx +0 -88
  179. package/src/widgets/GridField.test.tsx +0 -406
  180. package/src/widgets/GridField.tsx +0 -966
  181. package/src/widgets/ImageCropperDialog.tsx +0 -245
  182. package/src/widgets/ImageField.tsx +0 -255
  183. package/src/widgets/ImageLightbox.test.tsx +0 -52
  184. package/src/widgets/ImageLightbox.tsx +0 -108
  185. package/src/widgets/LocationField.tsx +0 -57
  186. package/src/widgets/LookupField.dependsOn.test.tsx +0 -233
  187. package/src/widgets/LookupField.gateHintLabel.test.tsx +0 -135
  188. package/src/widgets/LookupField.hydration.test.tsx +0 -136
  189. package/src/widgets/LookupField.idField.test.tsx +0 -61
  190. package/src/widgets/LookupField.tsx +0 -1291
  191. package/src/widgets/MarkdownContent.tsx +0 -19
  192. package/src/widgets/MasterDetailField.tsx +0 -131
  193. package/src/widgets/MultiSelectField.cascade.test.tsx +0 -143
  194. package/src/widgets/MultiSelectField.tsx +0 -142
  195. package/src/widgets/NumberField.tsx +0 -49
  196. package/src/widgets/ObjectField.tsx +0 -94
  197. package/src/widgets/ObjectRefField.tsx +0 -121
  198. package/src/widgets/OptionsEmptyState.no-provider.test.tsx +0 -88
  199. package/src/widgets/OptionsEmptyState.test.tsx +0 -169
  200. package/src/widgets/OptionsEmptyState.tsx +0 -83
  201. package/src/widgets/PasswordField.tsx +0 -49
  202. package/src/widgets/PeoplePicker.test.tsx +0 -360
  203. package/src/widgets/PeoplePicker.tsx +0 -579
  204. package/src/widgets/PeoplePickerComponents.test.tsx +0 -104
  205. package/src/widgets/PercentField.tsx +0 -95
  206. package/src/widgets/PersonRow.tsx +0 -117
  207. package/src/widgets/PhoneField.tsx +0 -37
  208. package/src/widgets/QRCodeField.tsx +0 -103
  209. package/src/widgets/RadioField.cascade.test.tsx +0 -141
  210. package/src/widgets/RadioField.tsx +0 -111
  211. package/src/widgets/RatingField.tsx +0 -81
  212. package/src/widgets/RecipientPickerField.test.tsx +0 -157
  213. package/src/widgets/RecipientPickerField.tsx +0 -188
  214. package/src/widgets/RecordPickerDialog.filterOptions.test.tsx +0 -611
  215. package/src/widgets/RecordPickerDialog.selectLabel.test.tsx +0 -112
  216. package/src/widgets/RecordPickerDialog.tsx +0 -1316
  217. package/src/widgets/RichTextField.tsx +0 -176
  218. package/src/widgets/SelectField.cascade.test.tsx +0 -138
  219. package/src/widgets/SelectField.tsx +0 -162
  220. package/src/widgets/SelectionTray.tsx +0 -110
  221. package/src/widgets/SignatureField.tsx +0 -140
  222. package/src/widgets/SliderField.tsx +0 -39
  223. package/src/widgets/SummaryField.tsx +0 -31
  224. package/src/widgets/TagsField.placeholder.no-provider.test.tsx +0 -68
  225. package/src/widgets/TagsField.placeholder.test.tsx +0 -95
  226. package/src/widgets/TagsField.tsx +0 -88
  227. package/src/widgets/TextAreaField.tsx +0 -213
  228. package/src/widgets/TextField.tsx +0 -45
  229. package/src/widgets/TimeField.tsx +0 -31
  230. package/src/widgets/UrlField.tsx +0 -46
  231. package/src/widgets/UserField.tsx +0 -58
  232. package/src/widgets/UserFieldPicker.test.tsx +0 -78
  233. package/src/widgets/VectorField.tsx +0 -29
  234. package/src/widgets/__tests__/FilterConditionField.matchAll.test.ts +0 -66
  235. package/src/widgets/__tests__/FilterConditionField.operators.test.ts +0 -142
  236. package/src/widgets/__tests__/FullscreenFieldEditor.i18n.test.tsx +0 -248
  237. package/src/widgets/__tests__/FullscreenFieldEditor.no-provider.test.tsx +0 -116
  238. package/src/widgets/__tests__/RichTextField.fullscreenDisabled.test.tsx +0 -244
  239. package/src/widgets/__tests__/RichTextField.mobileFullscreen.test.tsx +0 -195
  240. package/src/widgets/__tests__/TextAreaField.characterCount.announcements.test.tsx +0 -417
  241. package/src/widgets/__tests__/TextAreaField.characterCount.i18n.test.tsx +0 -287
  242. package/src/widgets/__tests__/TextAreaField.characterCount.no-provider.test.tsx +0 -160
  243. package/src/widgets/__tests__/TextAreaField.fullscreenCharacterCount.i18n.test.tsx +0 -161
  244. package/src/widgets/__tests__/TextAreaField.fullscreenCharacterCount.test.tsx +0 -346
  245. package/src/widgets/__tests__/TextAreaField.fullscreenDisabled.test.tsx +0 -246
  246. package/src/widgets/__tests__/TextAreaField.mobileFullscreen.test.tsx +0 -175
  247. package/src/widgets/_cell-renderer-bridge.ts +0 -19
  248. package/src/widgets/deriveLookupColumns.test.ts +0 -112
  249. package/src/widgets/deriveLookupColumns.ts +0 -108
  250. package/src/widgets/file-value.test.ts +0 -230
  251. package/src/widgets/file-value.ts +0 -246
  252. package/src/widgets/openNativePicker.ts +0 -18
  253. package/src/widgets/personDisplay.test.ts +0 -113
  254. package/src/widgets/personDisplay.ts +0 -92
  255. package/src/widgets/recentLookups.test.ts +0 -45
  256. package/src/widgets/recentLookups.ts +0 -47
  257. package/src/widgets/toDomProps.ts +0 -175
  258. package/src/widgets/types.ts +0 -242
  259. package/src/widgets/useCascadingOptions.ts +0 -46
  260. package/src/widgets/useFieldTranslation.ts +0 -150
  261. package/src/widgets/useRecordQuery.test.ts +0 -174
  262. package/src/widgets/useRecordQuery.ts +0 -264
  263. package/src/widgets/useUploadingSignal.test.tsx +0 -62
  264. package/src/widgets/useUploadingSignal.ts +0 -20
  265. package/src/withFieldCarrier.tsx +0 -75
@@ -1,17 +1,9 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
3
- /**
4
- * Address data structure
5
- */
6
- export interface AddressValue {
7
- street?: string;
8
- city?: string;
9
- state?: string;
10
- zipCode?: string;
11
- country?: string;
12
- }
2
+ import { FieldWidgetComponentProps } from './types.js';
3
+ import { AddressValue } from './address-format.js';
4
+ export type { AddressValue } from './address-format.js';
13
5
  /**
14
6
  * Address field widget - provides a structured address input
15
- * Supports street, city, state, zip code, and country
7
+ * Supports street, city, state, postal code, and country
16
8
  */
17
9
  export declare function AddressField({ value, onChange, field, readonly, error, ...props }: FieldWidgetComponentProps<AddressValue>): React.JSX.Element;
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * AutoNumberField - Read-only auto-generated field
5
5
  * Values are automatically generated by the system and cannot be edited
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * Avatar field widget - provides an avatar/profile picture uploader
5
5
  * Supports image URLs or file uploads
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * BooleanField - Toggle input supporting switch and checkbox variants
5
5
  * Renders as Switch or Checkbox based on field widget configuration
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * Parse the stored value into the selected capability-name list. The canonical
5
5
  * storage is a JSON-string array; we also tolerate an already-parsed array (in
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * CheckboxesField - select zero or more values from a fixed option set, rendered
5
5
  * as a list of checkboxes. The stored value is a string[]. Used for the
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * Code field widget - provides a code editor with syntax highlighting
5
5
  * Uses a simple textarea with monospace font
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * Color field widget - provides a color picker input
5
5
  * Supports hex color values (e.g., #ff0000)
@@ -1,3 +1,3 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  export declare function CurrencyField({ value, onChange, field, readonly, error, className, ...props }: FieldWidgetComponentProps<number>): React.JSX.Element;
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * DateField - Date picker input widget
5
5
  * Uses native date input and displays locale-formatted date in readonly mode
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * DateTimeField - Combined date and time picker widget
5
5
  * Displays both date and time in locale format when readonly
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * EmailField - Email address input with mailto link in readonly mode
5
5
  * Renders as a clickable mailto link when readonly, standard email input otherwise
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * FileField - File upload widget with drag-and-drop support
5
5
  * Supports single and multiple file uploads with configurable accepted file types.
@@ -15,7 +15,7 @@ export declare function FileField({ value, onChange, field, readonly, onUploadin
15
15
  * drag-and-drop zone — a grid cell has no room for one; the per-row expand
16
16
  * form still offers the full-size FileField.
17
17
  */
18
- export declare function FileCell({ value, onChange, disabled, multiple, accept, maxSize, 'aria-label': ariaLabel, 'data-cell': dataCell, }: {
18
+ export declare function FileCell({ value, onChange, disabled, multiple, accept, maxSize, error, 'aria-label': ariaLabel, 'data-cell': dataCell, }: {
19
19
  value: any;
20
20
  onChange: (value: any) => void;
21
21
  disabled?: boolean;
@@ -24,6 +24,22 @@ export declare function FileCell({ value, onChange, disabled, multiple, accept,
24
24
  accept?: string;
25
25
  /** Max file size in bytes (oversize picks are rejected with an inline error). */
26
26
  maxSize?: number;
27
+ /**
28
+ * The active validation message for this cell, named as
29
+ * `@objectstack/spec/ui`'s `FieldWidgetPropsSchema` names it — the same
30
+ * published slot `FieldWidgetComponentProps` declares and `LookupField` /
31
+ * `FileField` above already consume (objectui#5431, completing #3318's
32
+ * per-cell delivery). NOT the per-pick upload `errors` this component
33
+ * computes itself — this is the HOST's verdict on the cell's value.
34
+ *
35
+ * **Producer**: `GridField`, for a required-but-empty `file` cell.
36
+ * **Consumer**: drives `aria-invalid` on the picker button — the focusable
37
+ * control assistive tech reads a control state from (objectui#5223; a mark
38
+ * on the non-focusable wrapper is exactly what the registry sweep forbids).
39
+ * The message TEXT stays with the cell's `title` in `GridField`; rendering
40
+ * it here would double-display it.
41
+ */
42
+ error?: string;
27
43
  'aria-label'?: string;
28
44
  /** Focus-grid coordinate (see GridField keyboard navigation). */
29
45
  'data-cell'?: string;
@@ -1,11 +1,38 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  interface BuilderCondition {
4
4
  id: string;
5
5
  field: string;
6
6
  operator: string;
7
7
  value: any;
8
8
  }
9
+ /**
10
+ * Opt-in FilterBuilder operators this widget offers (objectui#4023,
11
+ * objectui#4736).
12
+ *
13
+ * The shared dropdown withholds these because two of its three consumers
14
+ * persist into dialects that cannot carry them (see `OPT_IN_OPERATORS` in
15
+ * `@object-ui/components`'s `filter-builder.tsx`). THIS widget can: its value
16
+ * is a MongoDB-style `FieldOperatorsSchema` criteria that the server's engine
17
+ * evaluates directly — never lowered through the array/triplet AST and never
18
+ * folded into a `ViewFilterRule` — so the spec's `FILTER_OPERATORS` is the only
19
+ * vocabulary it has to satisfy.
20
+ *
21
+ * - `containsCaseInsensitive` authors `$icontains`, executable on every
22
+ * driver and evaluation face the platform ships (objectstack#5702 +
23
+ * objectstack#6520).
24
+ * - `exists` / `notExists` author `$exists`, which `condToMongo` has emitted
25
+ * and `kvToCondition` has read back since objectui#2942. Naming them here
26
+ * is what KEEPS them reachable now that the shared dropdown no longer
27
+ * offers them to the list and view surfaces, whose dialects have no
28
+ * existence operator at all (objectui#4736).
29
+ *
30
+ * Module scope, not an inline literal: a fresh array each render would reset
31
+ * `FilterBuilder`'s memo inputs on every keystroke.
32
+ *
33
+ * @internal exported for tests
34
+ */
35
+ export declare const FILTER_CONDITION_EXTRA_OPERATORS: readonly string[];
9
36
  /**
10
37
  * Builder condition → `$`-operator criteria. Exported for tests: this is the
11
38
  * chokepoint where a builder token becomes a spec `FieldOperatorsSchema` key,
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * FormulaField - Read-only computed field
5
5
  * Values are computed on the backend and cannot be edited
@@ -1,155 +1,52 @@
1
1
  import { default as React } from 'react';
2
+ import { FullscreenEditorProps } from '@object-ui/components';
2
3
  /**
3
- * The fullscreen-edit affordance shared by every long-text widget: the "expand"
4
- * button plus the full-height dialog it opens.
5
- *
6
- * ## Why this is shared rather than copied
7
- *
8
- * `ObjectFormSchema.mobile.fullscreenLongText` is ONE form-level promise, and
9
- * `ObjectForm` projects it onto EVERY long-text field as `mobile_fullscreen`
10
- * (`field:textarea` → `TextAreaField`, `field:markdown` / `field:html` →
11
- * `RichTextField`). A user who turns the setting on gets one behaviour, so the
12
- * behaviour has one implementation. objectui#3301 is what the other
13
- * arrangement costs: the flag reached `RichTextField` for as long as the
14
- * feature has existed and that widget simply never read it, so half the
15
- * documented promise ("textarea/rich-text get an expand button") silently did
16
- * nothing. A second hand-written copy of the state machine is the same failure
17
- * with an extra step — it drifts, and nothing reports the drift.
18
- *
19
- * What is genuinely per-widget is the EDITOR, so that is the only thing
20
- * injected: `children` renders it against the draft. Everything a user can
21
- * observe about the *interaction* — when the affordance appears, that the
22
- * dialog seeds from the committed value, that typing stays local until "Done",
23
- * that "Cancel" discards — lives here, once.
24
- *
25
- * ## Draft semantics (unchanged from the original `TextAreaField` behaviour)
26
- *
27
- * The dialog edits a LOCAL draft seeded from `value` at open time and commits
28
- * once, on "Done". It deliberately does not stream every keystroke to the host:
29
- * these widgets sit in a react-hook-form field, and per-keystroke `onChange`
30
- * during a modal edit would mark the form dirty (and fire validation) for an
31
- * edit the user may still cancel. "Cancel" therefore needs no undo — nothing
32
- * was written.
33
- *
34
- * ## `disabled` (objectui#3402)
35
- *
36
- * The dialog is a SECOND editing surface for the same value, so a field that is
37
- * not interactive has to be not interactive here too. It was not: hosts landed
38
- * `disabled` on their inline control only, this component never declared the
39
- * prop at all, and a disabled long-text field therefore sat correctly greyed out
40
- * next to a live expand button — click it, type anything, press "Done", and the
41
- * edit went into form state through `onCommit`. Measured on `origin/main`
42
- * before the fix: inline `disabled=true`, toggle `disabled=false`, dialog input
43
- * `disabled=false`, `onChange` called with "EDITED WHILE DISABLED".
44
- *
45
- * The gate is shaped like the built-in path's (`FullscreenTextarea` in
46
- * `components/src/renderers/form/form.tsx`, objectui#3400/PR #3401), because
47
- * one form-level setting must keep producing one behaviour on both paths:
48
- *
49
- * - the toggle STAYS but is `disabled` — `disabled` means "not interactive,
50
- * muted", not "shown plainly", which is `readonly`'s job (and `readonly`
51
- * never reaches this component at all — see below);
52
- * - `openFullscreen` refuses independently of the attribute, since a
53
- * programmatic dispatch and a lost `pointer-events` rule both get past it;
54
- * - the dialog locks on its OWN — `disabled` is not merely a static flag, it is
55
- * also the form's `isSubmitting`, which flips to true while the dialog may
56
- * already be open. At that moment the toggle is no longer the gate. So the
57
- * editor is told (third `children` argument) and "Done" is disabled;
58
- * - and `onCommit` is gated, because that is the single point where a value can
59
- * leave this component for host state. Nothing native guards it: it is a
60
- * click handler on a different control reading React state.
61
- *
62
- * "Cancel" and `Esc` stay live in every state — a dialog that goes disabled
63
- * mid-edit must still be closable, or a submit in flight traps the user in it.
64
- *
65
- * ## Why there is no `readonly` prop
66
- *
67
- * Both hosts early-return a read-only DISPLAY before they compute the affordance
68
- * (`TextAreaField.tsx`, `RichTextField.tsx`), so this component is never
69
- * rendered for a read-only field and a `readonly` prop here would be declared
70
- * with no producer — the shape this package keeps deleting (objectui#3232/#3233).
71
- * A future host that renders an editor for read-only fields must add the prop
72
- * AND the producer together; do not add it "for symmetry" beforehand.
73
- *
74
- * ## `testIdPrefix`
75
- *
76
- * Each host passes its own (`textarea`, `richtext`), yielding the same
77
- * convention with a per-widget namespace: `<prefix>-fullscreen-toggle` /
78
- * `-dialog` / `-save`. One form can contain both a textarea and a markdown
79
- * field, so a single shared id would make a test unable to say which widget it
80
- * had found. The editor's own test id belongs to `children` for the same
81
- * reason.
82
- *
83
- * ## Copy (objectui#3404)
84
- *
85
- * Every string here goes through `useFieldTranslation()` and consumes the
86
- * EXISTING `form.fullscreen.*` / `common.cancel` keys — the same ones the
87
- * built-in branch consumes since objectui#3272. Nothing was missing from the
88
- * ten locale packs; this path simply never read them, so a zh session opened a
89
- * dialog reading `Cancel` / `Done` while a long-text field rendered by the
90
- * built-in branch **in the same form** read 「取消 / 完成」.
91
- *
92
- * Sharing the keys rather than minting `fields.fullscreen.*` twins is the
93
- * point: one form-level setting (`mobile.fullscreenLongText`) projects onto
94
- * both render paths, so two copies of this copy could only drift.
95
- *
96
- * `useFieldTranslation` (not bare `useObjectTranslation`) because this widget
97
- * is rendered without an `I18nProvider` by standalone/embedded hosts and by
98
- * every bare-render test in this package. Measured before the change: with no
99
- * provider mounted `useObjectTranslation().t('common.cancel')` returns
100
- * `"common.cancel"` — the raw key — and the `{{label}}` interpolation collapses
101
- * entirely. The safe hook's English defaults are byte-identical to the literals
102
- * they replaced, so the provider-less rendering is unchanged.
103
- *
104
- * Focus management, `Esc`, the overlay and the close button are Radix's, via
105
- * the repo's `Dialog` (`@object-ui/components`) — deliberately not re-answered
106
- * here.
4
+ * The fullscreen-edit affordance shared by every long-text widget in this
5
+ * package (`field:textarea` → `TextAreaField`, `field:markdown` / `field:html`
6
+ * → `RichTextField`).
7
+ *
8
+ * ## This is now a thin wrapper (objectui#3398)
9
+ *
10
+ * The affordance, the dialog, the draft/commit state machine and the
11
+ * `readOnly` / `disabled` semantics all live in `FullscreenEditor`
12
+ * (`@object-ui/components`). They used to live here AND, separately, in the
13
+ * form renderer's built-in `textarea` branch — one form-level promise
14
+ * (`ObjectFormSchema.mobile.fullscreenLongText`, projected onto every long-text
15
+ * field as `mobile_fullscreen`) answered twice, on the two render paths.
16
+ *
17
+ * Two copies of a state machine drift, and these did: objectui#3400 measured a
18
+ * read-only field editable through the built-in branch's dialog, objectui#3402
19
+ * measured the same hole for `disabled` here, and #3393 (label in the dialog
20
+ * title) and #3272 (i18n) each landed on one side before the other. The
21
+ * maintainer's ruling of 2026-08-10 was one implementation hoisted to the
22
+ * dependency-legal side — and the measured import graph allows exactly that
23
+ * direction: this package depends on `@object-ui/components`, which declares no
24
+ * dependency on `@object-ui/fields` in `dependencies` or `peerDependencies`.
25
+ *
26
+ * ## Why the wrapper survives the merge rather than being deleted
27
+ *
28
+ * It carries the one thing that is genuinely about THIS package: `readOnly` is
29
+ * not part of the contract here. Both hosts early-return a read-only DISPLAY
30
+ * before they compute the affordance (`TextAreaField.tsx`, `RichTextField.tsx`),
31
+ * so a `readOnly` reaching this component would be a prop with no producer on
32
+ * this path — the shape this package keeps deleting (objectui#3232/#3233). The
33
+ * `Omit` below is that statement in the type system, and it is why the hoist did
34
+ * not simply re-export the primitive. A future host that renders an editor for
35
+ * read-only fields must widen this type AND pass the prop together; the
36
+ * primitive already answers it (no affordance at all).
37
+ *
38
+ * Everything else — `value` / `onCommit` / `label` / `testIdPrefix` /
39
+ * `disabled` / `error` / `children` / `footer` — passes straight through, so the
40
+ * hosts and their pins are unchanged. `error` is REQUIRED by the primitive
41
+ * (objectui#4824) and stays required here: both hosts already destructure it off
42
+ * the widget props contract (objectui#3222), and it is what the primitive turns
43
+ * into the dialog control's `aria-invalid` / `aria-errormessage` and into the
44
+ * dialog-local message node. A host that omits it gets a dialog announcing
45
+ * `aria-invalid="false"` for an invalid field, which is the defect #4824
46
+ * measured — so the type system asks for it rather than trusting the next
47
+ * author to remember. `testIdPrefix` still namespaces this package's ids
48
+ * (`textarea-`, `richtext-`), distinct from the built-in branch's
49
+ * `form-textarea-`, so a test can still say which render path it found.
107
50
  */
108
- export interface FullscreenFieldEditorProps {
109
- /**
110
- * The committed value. Seeds the draft each time the dialog opens — read at
111
- * open time, not held, so a value that changes underneath while the dialog is
112
- * closed is picked up on the next open.
113
- */
114
- value: string;
115
- /** Called once with the draft when the user confirms. */
116
- onCommit: (next: string) => void;
117
- /** Field label — the dialog title and part of the toggle's accessible name. */
118
- label?: string;
119
- /** Namespace for this widget's fullscreen test ids. See above. */
120
- testIdPrefix: string;
121
- /**
122
- * The host field is not interactive (objectui#3402). Disables the toggle, the
123
- * "Done" button and the write-back, and is handed to `children` so the host's
124
- * own editor renders disabled too. See the `disabled` section above for why
125
- * each of those is a separate line rather than belt-and-braces.
126
- *
127
- * **Producer**: the widget's `disabled` prop, which the form renderer computes
128
- * as `disabled || fieldDisabled || isSubmitting || optionGroupGated` and
129
- * forwards to registered widgets (`stripRegisteredFieldProps` does not strip
130
- * it).
131
- */
132
- disabled?: boolean;
133
- /**
134
- * The editor itself, rendered inside the dialog body against the draft. The
135
- * host passes the SAME editor it renders inline, so "fullscreen" is a size
136
- * change rather than a second, poorer editing surface.
137
- *
138
- * The third argument is this component's `disabled`, and the host is expected
139
- * to put it on the control it renders: only the host knows which element its
140
- * editor's disabled state belongs on. Ignoring it is not a write-back hole —
141
- * `onCommit` is gated here regardless — but it does leave a control that looks
142
- * editable while the field is not, so both in-repo hosts apply it and their
143
- * tests pin it.
144
- */
145
- children: (draft: string, setDraft: (next: string) => void, disabled: boolean) => React.ReactNode;
146
- /** Optional footer status for the draft (e.g. a character counter). */
147
- footer?: (draft: string) => React.ReactNode;
148
- /**
149
- * Extra classes for the toggle button. It is absolutely positioned by
150
- * default and expects a `relative` ancestor; a host whose layout has a
151
- * better home for it can re-place it here.
152
- */
153
- toggleClassName?: string;
154
- }
155
- export declare function FullscreenFieldEditor({ value, onCommit, label, testIdPrefix, disabled, children, footer, toggleClassName, }: FullscreenFieldEditorProps): React.JSX.Element;
51
+ export type FullscreenFieldEditorProps = Omit<FullscreenEditorProps, 'readOnly'>;
52
+ export declare function FullscreenFieldEditor(props: FullscreenFieldEditorProps): React.JSX.Element;
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * Geolocation data structure
5
5
  */
@@ -1,8 +1,45 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * GridField / LineItemsField — editable child-grid ("line items") widget.
5
5
  *
6
+ * ## Where the host's label and help text land, and why (objectui#4857)
7
+ *
8
+ * This widget forwarded nothing a host handed it, so the field's visible label
9
+ * pointed `for` at an id no element carried and the help text had zero
10
+ * consumers. Measured on `origin/main` at `e71c854ce`, a real form, editable
11
+ * state, `description` set:
12
+ *
13
+ * ```
14
+ * bare (no columns) for=DANGLING hostIdEl=NONE consumers=0 focusables=[button]
15
+ * columns + one row for=DANGLING hostIdEl=NONE consumers=0 focusables=[drag,
16
+ * input(Item), input(Qty), button(Duplicate row),
17
+ * button(Remove row), input(Item), input(Qty), button(Add)]
18
+ * ```
19
+ *
20
+ * The bare row's single focusable is the auxiliary "Add line" BUTTON — labelable,
21
+ * but routing the host id (and so the label's `for`) onto it would make the
22
+ * field's label NAME the add-row action and make a click on the label insert a
23
+ * row. Every realistic config is a composite: many cell inputs, each with its
24
+ * own `aria-label`, under one container. So this widget declares
25
+ * `labelling: 'group'` (see `FIELD_WIDGET_LABELLING` in `../index`) — the
26
+ * objectui#3961 composite shape, like `address` — and the CONTAINER consumes the
27
+ * host's keys:
28
+ *
29
+ * - editable / list mode: the root div takes the DOM pass-through minus `name`
30
+ * (DOM-legal on form controls only — the objectui#3291 leak) and minus
31
+ * `aria-invalid` (control-channel state; this grid reports validity per CELL,
32
+ * with its own inline marks), answering `role="group"` only when a host
33
+ * actually named it — `CheckboxesField`'s split, key for key.
34
+ *
35
+ * That strip STANDS (objectui#3318 upheld it rather than overturning it):
36
+ * the container is not a control, so the host's state is not re-routed onto
37
+ * it. What #3318 added is the other half the strip implied but nobody had
38
+ * built — the host's failure now DRIVES the per-cell channel this comment
39
+ * already claimed as the reporting path. See `hostFailedEmpty`.
40
+ * - readonly: the table replaces the inputs entirely, so that surface takes the
41
+ * name AND the description via `toHostGroupProps` — `'instead-of-the-inputs'`.
42
+ *
6
43
  * A controlled component: `value` is an array of row objects, `onChange`
7
44
  * receives the next array. It renders one editable cell per configured
8
45
  * column, supports add / delete row, and shows a running total of a numeric
@@ -10,16 +47,41 @@ import { FieldWidgetComponentProps } from './types';
10
47
  * engine behind the master-detail subform (see ADR-0001).
11
48
  *
12
49
  * Column config (a subset of `GridColumnDefinition`):
13
- * { field, label?, type?, options?, width?, required?, prefix?, step? }
14
- * type ∈ 'text' | 'number' | 'currency' | 'date' | 'select' | 'lookup' | 'file'
50
+ * { name, label?, type?, options?, width?, required?, prefix?, step? }
51
+ * type ∈ 'text' | 'number' | 'currency' | 'date' | 'datetime' | 'time'
52
+ * | 'select' | 'lookup' | 'file'
15
53
  *
16
54
  * Field-level config (from `GridFieldMetadata`):
17
55
  * columns, min_rows, max_rows, allow_add, allow_delete, total_field
18
56
  */
19
57
  export interface GridColumn {
20
- field: string;
58
+ /**
59
+ * The column's field name — the key it reads and writes on each row object.
60
+ *
61
+ * Spelled `name`, exactly as the declared `GridColumnDefinition`
62
+ * (`@object-ui/types`) and the grid docs page say (objectui#3951). This
63
+ * widget used to read a divergent `field` key, so metadata authored against
64
+ * the published type rendered every cell empty plus a React key warning.
65
+ * There is deliberately no tolerant alias bridging the retired spelling to
66
+ * this one: a single spelling, enforced at the producer — AGENTS.md #0.1.
67
+ *
68
+ * (Wording note: do not restate that rule as an alternation expression over
69
+ * the two key names. `column-identity.ratchet.test.ts` (objectui#3104) scans
70
+ * these files line by line and cannot tell prose from code, so spelling the
71
+ * shape out here registers as a new dual read and fails the gate.)
72
+ */
73
+ name: string;
21
74
  label?: string;
22
- type?: 'text' | 'number' | 'currency' | 'date' | 'select' | 'lookup' | 'file';
75
+ /**
76
+ * Cell control + read/write adapter for the column.
77
+ *
78
+ * `date` / `datetime` / `time` are three DISTINCT controls, not one
79
+ * (objectui#3569). Collapsing `datetime` onto the `date` control did not
80
+ * merely under-render it — `<input type="date">` hands back a bare
81
+ * `YYYY-MM-DD` on change, so touching the day of a `datetime` cell silently
82
+ * DELETED its time component from the record.
83
+ */
84
+ type?: 'text' | 'number' | 'currency' | 'date' | 'datetime' | 'time' | 'select' | 'lookup' | 'file';
23
85
  options?: Array<{
24
86
  label: string;
25
87
  value: string;
@@ -104,7 +166,7 @@ export declare function lookupAutofillPatch(columns: GridColumn[], col: GridColu
104
166
  export declare function computeRow(columns: GridColumn[], row: Row): Row;
105
167
  /** Sum a numeric column across rows (ignoring blanks/NaN). */
106
168
  export declare function sumColumn(rows: Row[], field: string): number;
107
- export declare function GridField({ value, onChange, field, readonly, disabled, className, onRowExpand, displayMode, onAdd, ...props }: FieldWidgetComponentProps<Row[]> & {
169
+ export declare function GridField({ value, onChange, field, readonly, disabled, className, error, onRowExpand, displayMode, onAdd, ...props }: FieldWidgetComponentProps<Row[]> & {
108
170
  /** When provided, each row shows an "expand" button that opens the row in a
109
171
  * full form (the host — e.g. MasterDetailForm — renders the drawer/modal and
110
172
  * writes the edited values back). Lets a "fat" child be edited in a real form
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * ImageField - Image upload widget with preview thumbnails
5
5
  * Supports single and multiple image uploads with drag-and-drop and preview display
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * LocationField - Geographic coordinate input for latitude and longitude
5
5
  * Stores location as { latitude, longitude } object and displays as comma-separated pair
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  export interface LookupOption {
4
4
  value: string | number;
5
5
  label: string;
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * Master-Detail relationship data structure
5
5
  */
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * MultiSelectField - select zero or more values from a fixed option set.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * NumberField - Numeric input with optional decimal precision
5
5
  * Supports min/max/step constraints and configurable decimal precision
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * ObjectField - JSON object editor
5
5
  * Allows editing structured JSON data
@@ -1,4 +1,4 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  export declare function ObjectRefField({ value, onChange, readonly, className, error, ...props }: FieldWidgetComponentProps<string>): React.JSX.Element;
4
4
  export default ObjectRefField;
@@ -1,4 +1,5 @@
1
1
  import { default as React } from 'react';
2
+ import { HostGroupProps } from './toHostGroupProps.js';
2
3
  /**
3
4
  * The "this option list cannot be filled" state shared by every fixed-option
4
5
  * widget (`SelectField` single, `MultiSelectField`, `RadioField`,
@@ -41,5 +42,24 @@ export interface OptionsEmptyStateProps {
41
42
  testId?: string;
42
43
  /** Widget-specific sizing (the dropdown is a fixed `h-9`, lists grow). */
43
44
  className?: string;
45
+ /**
46
+ * The host label's IDREF plumbing, when this box is the whole rendered surface
47
+ * of a group-labelled field (objectui#3990) — a `checkboxes` / `radio` /
48
+ * `multiselect` whose option list came back empty renders NOTHING but this
49
+ * box, so the visible label named zero elements until it landed here. Its
50
+ * help text described zero elements for the same reason, which is why the
51
+ * callers ask `toHostGroupProps` for the `'instead-of-the-inputs'` surface:
52
+ * there is no option control in this state to announce the description on
53
+ * (objectui#4005).
54
+ *
55
+ * A closed type rather than an open props tail: only `id`, `aria-labelledby`,
56
+ * `aria-describedby` and the `role` that makes them meaningful may reach this
57
+ * element, and reopening a spread is what objectui#3291 exists to prevent —
58
+ * `aria-invalid` / `aria-required` are control-channel state and stay off this
59
+ * surface. Absent for the single `SelectField` — it is not group-labelled, its
60
+ * label still uses a plain `for`, and it must keep emitting no such
61
+ * attributes.
62
+ */
63
+ hostGroupProps?: HostGroupProps;
44
64
  }
45
- export declare function OptionsEmptyState({ emptyHint, gated, dependsOnFields, testId, className, }: OptionsEmptyStateProps): React.JSX.Element;
65
+ export declare function OptionsEmptyState({ emptyHint, gated, dependsOnFields, testId, className, hostGroupProps, }: OptionsEmptyStateProps): React.JSX.Element;
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { FieldWidgetComponentProps } from './types';
2
+ import { FieldWidgetComponentProps } from './types.js';
3
3
  /**
4
4
  * PasswordField - Secure password input with visibility toggle
5
5
  * Includes show/hide toggle button and masks value in readonly mode