@multiplatform.one/forms 7.51.0 → 7.53.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 (252) hide show
  1. package/dist/cjs/AdaptivePopup/index.native.js +1 -1
  2. package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
  3. package/dist/cjs/Button/index.native.js +2 -2
  4. package/dist/cjs/Button/index.native.js.map +1 -1
  5. package/dist/cjs/Chip/index.native.js.map +1 -1
  6. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -1
  7. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  8. package/dist/cjs/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  9. package/dist/cjs/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  10. package/dist/cjs/ContextualSaveBar/index.native.js +3 -3
  11. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  12. package/dist/cjs/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  13. package/dist/cjs/ControlGroup/index.native.js +1 -1
  14. package/dist/cjs/ControlGroup/index.native.js.map +1 -1
  15. package/dist/cjs/DescriptionList/index.native.js +2 -2
  16. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  17. package/dist/cjs/ErrorSummary.native.js.map +1 -1
  18. package/dist/cjs/FieldDisplay/editMode.native.js.map +1 -1
  19. package/dist/cjs/FieldDisplay/formatters.native.js.map +1 -1
  20. package/dist/cjs/FieldDisplay/index.native.js +1 -1
  21. package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
  22. package/dist/cjs/FieldGroup.cjs +1 -1
  23. package/dist/cjs/FieldGroup.native.js +1 -1
  24. package/dist/cjs/FieldGroup.native.js.map +1 -1
  25. package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -1
  26. package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
  27. package/dist/cjs/FloatingPanel/trailingAction.native.js +1 -1
  28. package/dist/cjs/FloatingPanel/trailingAction.native.js.map +1 -1
  29. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  30. package/dist/cjs/Form/index.cjs +2 -2
  31. package/dist/cjs/Form/index.native.js +3 -3
  32. package/dist/cjs/Form/index.native.js.map +1 -1
  33. package/dist/cjs/Form/submissionController.native.js.map +1 -1
  34. package/dist/cjs/Form/validateOn.native.js.map +1 -1
  35. package/dist/cjs/FormGrid.cjs +1 -1
  36. package/dist/cjs/FormGrid.native.js +1 -1
  37. package/dist/cjs/FormGrid.native.js.map +1 -1
  38. package/dist/cjs/FormSection.cjs +1 -1
  39. package/dist/cjs/FormSection.native.js +1 -1
  40. package/dist/cjs/FormSection.native.js.map +1 -1
  41. package/dist/cjs/InputParts/PasswordReveal.native.js.map +1 -1
  42. package/dist/cjs/InputParts/index.native.js.map +1 -1
  43. package/dist/cjs/Label/index.native.js.map +1 -1
  44. package/dist/cjs/MediaPicker/base64.native.js.map +1 -1
  45. package/dist/cjs/MediaPicker/payload.native.js.map +1 -1
  46. package/dist/cjs/MediaPicker/types.native.js.map +1 -1
  47. package/dist/cjs/MediaPicker/useMediaPicker.native.js.map +1 -1
  48. package/dist/cjs/Skeleton/index.native.js.map +1 -1
  49. package/dist/cjs/Spinner/SpinnerGlyph.native.js.map +1 -1
  50. package/dist/cjs/Spinner/spinnerSize.native.js.map +1 -1
  51. package/dist/cjs/Table/index.native.js.map +1 -1
  52. package/dist/cjs/Wheel/haptic.native.js.map +1 -1
  53. package/dist/cjs/Wheel/index.native.js.map +1 -1
  54. package/dist/cjs/Wheel/wheelShared.native.js.map +1 -1
  55. package/dist/cjs/actionLabel.native.js.map +1 -1
  56. package/dist/cjs/fieldDefaults.native.js.map +1 -1
  57. package/dist/cjs/fieldLayout.native.js +1 -1
  58. package/dist/cjs/fieldLayout.native.js.map +1 -1
  59. package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
  60. package/dist/cjs/fields/Barcode/BarcodeScanner.native.js +1 -1
  61. package/dist/cjs/fields/Barcode/code128.native.js.map +1 -1
  62. package/dist/cjs/fields/Barcode/index.native.js +2 -2
  63. package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
  64. package/dist/cjs/fields/Barcode/qr.native.js.map +1 -1
  65. package/dist/cjs/fields/Barcode/scannerTypes.native.js.map +1 -1
  66. package/dist/cjs/fields/Checkbox/Checkbox.native.js +1 -1
  67. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  68. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  69. package/dist/cjs/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  70. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  71. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +1 -1
  72. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  73. package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  74. package/dist/cjs/fields/Checkbox/index.native.js.map +1 -1
  75. package/dist/cjs/fields/ColorPicker/index.native.js +2 -2
  76. package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
  77. package/dist/cjs/fields/ColorPicker/parts.native.js +2 -2
  78. package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
  79. package/dist/cjs/fields/Combobox/authorOptions.native.js.map +1 -1
  80. package/dist/cjs/fields/Combobox/index.native.js +5 -5
  81. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  82. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  83. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
  84. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  85. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +3 -3
  86. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  87. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +2 -2
  88. package/dist/cjs/fields/DatePicker/MonthPicker.native.js +2 -2
  89. package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
  90. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
  91. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  92. package/dist/cjs/fields/DatePicker/catalog.native.js +2 -2
  93. package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -1
  94. package/dist/cjs/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  95. package/dist/cjs/fields/DatePicker/index.native.js +2 -2
  96. package/dist/cjs/fields/DatePicker/parts.native.js +2 -2
  97. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  98. package/dist/cjs/fields/DatePicker/utils.native.js.map +1 -1
  99. package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
  100. package/dist/cjs/fields/Duration/index.native.js +3 -3
  101. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  102. package/dist/cjs/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  103. package/dist/cjs/fields/FileUpload/index.native.js +2 -2
  104. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  105. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  106. package/dist/cjs/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  107. package/dist/cjs/fields/Geolocation/geoValue.native.js.map +1 -1
  108. package/dist/cjs/fields/Geolocation/geocoder.native.js.map +1 -1
  109. package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -1
  110. package/dist/cjs/fields/Geolocation/index.native.js +5 -5
  111. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  112. package/dist/cjs/fields/Geolocation/mapMath.native.js.map +1 -1
  113. package/dist/cjs/fields/Geolocation/mapTypes.native.js.map +1 -1
  114. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
  115. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -1
  116. package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
  117. package/dist/cjs/fields/Icon/index.native.js +3 -3
  118. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  119. package/dist/cjs/fields/ImageField/index.native.js +2 -2
  120. package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
  121. package/dist/cjs/fields/Input/index.native.js +3 -3
  122. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  123. package/dist/cjs/fields/MentionInput/index.native.js +3 -3
  124. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  125. package/dist/cjs/fields/OTPInput/index.native.js +3 -3
  126. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  127. package/dist/cjs/fields/OTPInput/otpCellCss.native.js.map +1 -1
  128. package/dist/cjs/fields/PhoneInput/dialCodes.native.js.map +1 -1
  129. package/dist/cjs/fields/PhoneInput/index.native.js +3 -3
  130. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  131. package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
  132. package/dist/cjs/fields/PhoneInput/regionNames.native.js.map +1 -1
  133. package/dist/cjs/fields/Progress/index.native.js +1 -1
  134. package/dist/cjs/fields/Progress/index.native.js.map +1 -1
  135. package/dist/cjs/fields/RadioGroup/index.native.js +1 -1
  136. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  137. package/dist/cjs/fields/Rating/index.native.js +1 -1
  138. package/dist/cjs/fields/Rating/index.native.js.map +1 -1
  139. package/dist/cjs/fields/Rating/ratingMath.native.js.map +1 -1
  140. package/dist/cjs/fields/Rating/types.native.js.map +1 -1
  141. package/dist/cjs/fields/SearchInput/index.native.js +2 -2
  142. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  143. package/dist/cjs/fields/Select/index.native.js +4 -4
  144. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  145. package/dist/cjs/fields/Signature/index.native.js +2 -2
  146. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  147. package/dist/cjs/fields/Slider/index.native.js +1 -1
  148. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  149. package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
  150. package/dist/cjs/fields/Stepper/index.native.js +2 -2
  151. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  152. package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  153. package/dist/cjs/fields/Switch/footprint.native.js.map +1 -1
  154. package/dist/cjs/fields/Switch/index.native.js +2 -2
  155. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  156. package/dist/cjs/fields/TextArea/index.native.js +2 -2
  157. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  158. package/dist/cjs/fields/TimePicker/catalog.native.js +3 -3
  159. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
  160. package/dist/cjs/fields/TimePicker/index.native.js +2 -2
  161. package/dist/cjs/fields/TimePicker/parts.native.js +1 -1
  162. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  163. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  164. package/dist/cjs/fields/TimeRangeScrubber/index.native.js +2 -2
  165. package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
  166. package/dist/cjs/fields/ToggleGroup/index.native.js +1 -1
  167. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  168. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  169. package/dist/cjs/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
  170. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  171. package/dist/cjs/fields/nativeSelect.native.js.map +1 -1
  172. package/dist/cjs/fields/selectedOrder.native.js.map +1 -1
  173. package/dist/cjs/formSpacing.native.js.map +1 -1
  174. package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
  175. package/dist/cjs/index.native.js +45 -45
  176. package/dist/cjs/index.native.js.map +1 -1
  177. package/dist/cjs/keyboard/KeyboardDoneBar.native.js +1 -1
  178. package/dist/cjs/keyboard/chain.native.js.map +1 -1
  179. package/dist/cjs/keyboard/index.native.js.map +1 -1
  180. package/dist/cjs/keyboard/types.native.js.map +1 -1
  181. package/dist/cjs/requiredMarking.native.js.map +1 -1
  182. package/dist/cjs/shared/TimeColumn.native.js +1 -1
  183. package/dist/cjs/shared/TimeColumn.native.js.map +1 -1
  184. package/dist/cjs/shared/capabilityPreflight.native.js.map +1 -1
  185. package/dist/cjs/shared/colorRamps.native.js.map +1 -1
  186. package/dist/cjs/shared/devWarn.native.js.map +1 -1
  187. package/dist/cjs/shared/floatingList.native.js +1 -1
  188. package/dist/cjs/shared/floatingList.native.js.map +1 -1
  189. package/dist/cjs/shared/focusManagement.native.js.map +1 -1
  190. package/dist/cjs/shared/groupContext.native.js.map +1 -1
  191. package/dist/cjs/shared/i18n.native.js.map +1 -1
  192. package/dist/cjs/shared/instantMotion.native.js.map +1 -1
  193. package/dist/cjs/shared/nativeA11y.native.js.map +1 -1
  194. package/dist/cjs/shared/nativeAutoFocus.native.js.map +1 -1
  195. package/dist/cjs/shared/overlayStack.native.js.map +1 -1
  196. package/dist/cjs/shared/panelPortal.native.js.map +1 -1
  197. package/dist/cjs/shared/pickerTriggerContract.native.js.map +1 -1
  198. package/dist/cjs/shared/pressSlopProps.native.js.map +1 -1
  199. package/dist/cjs/shared/restoreRetries.native.js.map +1 -1
  200. package/dist/cjs/shared/t.native.js.map +1 -1
  201. package/dist/cjs/shared/tableCellContext.native.js.map +1 -1
  202. package/dist/cjs/shared/useDragScroll.native.js.map +1 -1
  203. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  204. package/dist/cjs/shared/useSheetEscapeDismiss.native.js.map +1 -1
  205. package/dist/cjs/shared/useWheelIncrement.native.js.map +1 -1
  206. package/dist/cjs/shared/utils.native.js +1 -1
  207. package/dist/cjs/shared/utils.native.js.map +1 -1
  208. package/dist/cjs/shared/zIndex.native.js.map +1 -1
  209. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  210. package/dist/cjs/types.native.js.map +1 -1
  211. package/dist/cjs/utils/LinkCell.native.js.map +1 -1
  212. package/dist/esm/FieldGroup.mjs +1 -1
  213. package/dist/esm/FieldGroup.mjs.map +1 -1
  214. package/dist/esm/FieldGroup.native.js +1 -1
  215. package/dist/esm/FieldGroup.native.js.map +1 -1
  216. package/dist/esm/Form/index.mjs +2 -2
  217. package/dist/esm/Form/index.mjs.map +1 -1
  218. package/dist/esm/Form/index.native.js +2 -2
  219. package/dist/esm/Form/index.native.js.map +1 -1
  220. package/dist/esm/FormGrid.mjs +1 -1
  221. package/dist/esm/FormGrid.mjs.map +1 -1
  222. package/dist/esm/FormGrid.native.js +1 -1
  223. package/dist/esm/FormGrid.native.js.map +1 -1
  224. package/dist/esm/FormSection.mjs +1 -1
  225. package/dist/esm/FormSection.mjs.map +1 -1
  226. package/dist/esm/FormSection.native.js +1 -1
  227. package/dist/esm/FormSection.native.js.map +1 -1
  228. package/dist/jsx/FieldGroup.mjs +1 -1
  229. package/dist/jsx/FieldGroup.mjs.map +1 -1
  230. package/dist/jsx/FieldGroup.native.js +1 -1
  231. package/dist/jsx/FieldGroup.native.js.map +1 -1
  232. package/dist/jsx/Form/index.mjs +2 -2
  233. package/dist/jsx/Form/index.mjs.map +1 -1
  234. package/dist/jsx/Form/index.native.js +2 -2
  235. package/dist/jsx/Form/index.native.js.map +1 -1
  236. package/dist/jsx/FormGrid.mjs +1 -1
  237. package/dist/jsx/FormGrid.mjs.map +1 -1
  238. package/dist/jsx/FormGrid.native.js +1 -1
  239. package/dist/jsx/FormGrid.native.js.map +1 -1
  240. package/dist/jsx/FormSection.mjs +1 -1
  241. package/dist/jsx/FormSection.mjs.map +1 -1
  242. package/dist/jsx/FormSection.native.js +1 -1
  243. package/dist/jsx/FormSection.native.js.map +1 -1
  244. package/package.json +8 -8
  245. package/src/FieldGroup.tsx +2 -2
  246. package/src/Form/index.tsx +2 -2
  247. package/src/FormGrid.tsx +2 -2
  248. package/src/FormSection.tsx +4 -4
  249. package/src/fieldRhythm.spec.tsx +48 -0
  250. package/types/FieldGroup.d.ts +1 -1
  251. package/types/FormGrid.d.ts +1 -1
  252. package/types/FormSection.d.ts +3 -3
@@ -325,14 +325,14 @@ export function Form<TFormData extends Record<string, any>, TFormValidator = any
325
325
  <TamaguiForm ref={setFormRef} onSubmit={handleSubmit} {...tamaguiFormProps}>
326
326
  <YStack
327
327
  data-mpo-form-layout=""
328
- data-gap={knobProps.gap.gap}
328
+ data-gap={knobProps.fieldGap.gap}
329
329
  data-size-token={knobProps.sizeToken}
330
330
  width="100%"
331
331
  minWidth={0}
332
332
  // A readable column: fields and actions read as one group on a
333
333
  // wide screen. `maxWidth` on the Form ejects (e.g. "100%").
334
334
  maxWidth={(tamaguiFormProps.maxWidth as never) ?? FORM_READABLE_WIDTH}
335
- {...knobProps.gap}
335
+ {...knobProps.fieldGap}
336
336
  {...(tamaguiFormProps.flex != null
337
337
  ? { flex: tamaguiFormProps.flex as never }
338
338
  : {})}
package/src/FormGrid.tsx CHANGED
@@ -27,7 +27,7 @@ export interface FormGridProps {
27
27
  */
28
28
  maxColumns?: FormGridColumns;
29
29
  /**
30
- * Gap between fields. Defaults to the within-group role (`knobProps.gap`),
30
+ * Gap between fields. Defaults to the field rhythm (`knobProps.fieldGap`, LC-154),
31
31
  * never `sizeToken`. Number = px eject; token string allowed.
32
32
  */
33
33
  gap?: number | string;
@@ -52,7 +52,7 @@ function resolveWideColumns(
52
52
  */
53
53
  export function FormGrid({ columns = 1, maxColumns = 2, gap, children }: FormGridProps) {
54
54
  const { knobProps } = useResolvedKnobs();
55
- const gapFragment = gap === undefined ? knobProps.gap : { gap };
55
+ const gapFragment = gap === undefined ? knobProps.fieldGap : { gap };
56
56
  const resolvedGap = gapFragment.gap;
57
57
  const wideColumns = resolveWideColumns(columns, maxColumns);
58
58
 
@@ -13,8 +13,8 @@ export interface FormSectionProps {
13
13
  */
14
14
  maxWidth?: number | "fluid";
15
15
  /**
16
- * Gap between fields inside the section. Defaults to the semantic
17
- * within-group gap (`knobProps.gap`, DG-LAY-03) so the preset's scale
16
+ * Gap between fields inside the section. Defaults to the field rhythm
17
+ * (`knobProps.fieldGap`, LC-154; DG-LAY-03) so the preset's scale
18
18
  * restyles form rhythm; explicit values eject.
19
19
  */
20
20
  gap?: number | string;
@@ -30,7 +30,7 @@ export interface FormSectionProps {
30
30
  /**
31
31
  * Labeled form section with semantic gap rhythm.
32
32
  *
33
- * Field gap defaults to the within-group semantic gap (`knobProps.gap`);
33
+ * Field gap defaults to the field rhythm (`knobProps.fieldGap`, LC-154);
34
34
  * stack multiple sections with {@link FormSectionStack}, whose gap defaults
35
35
  * to the between-groups gap (`knobProps.gapLg`) — always one step larger, so
36
36
  * section rhythm stays larger than field rhythm on every scale
@@ -47,7 +47,7 @@ export function FormSection({
47
47
  }: FormSectionProps) {
48
48
  const useFieldset = fieldset && isWeb;
49
49
  const { knobProps } = useResolvedKnobs();
50
- const resolvedGap = gap ?? knobProps.gap.gap;
50
+ const resolvedGap = gap ?? knobProps.fieldGap.gap;
51
51
 
52
52
  return (
53
53
  <YStack
@@ -0,0 +1,48 @@
1
+ /**
2
+ * LC-154 COMPACT-FORM-HEAD, field rhythm: a label sits closer to its own
3
+ * control than to the field above it. Field stacks take the `fieldGap` role
4
+ * ($4), one step wider than the label-to-control gap's floor ($2) and the
5
+ * row role ($3).
6
+ */
7
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
8
+ import { defaultKnobs, resolveKnobs, spacingRoles } from "@multiplatform.one/theme";
9
+ import { cleanup } from "@testing-library/react";
10
+ import { afterEach, describe, expect, it } from "vitest";
11
+ import { FieldLayout } from "./fieldLayout";
12
+ import { FormGrid } from "./FormGrid";
13
+ import { FormSection } from "./FormSection";
14
+
15
+ afterEach(cleanup);
16
+
17
+ const step = (token: string) => Number(token.replace(/^\$/, ""));
18
+
19
+ describe("field rhythm (LC-154)", () => {
20
+ it("the fieldGap role is $4 and wider than the label gap and the row role", () => {
21
+ expect(spacingRoles.fieldGap).toBe("$4");
22
+ expect(step(spacingRoles.fieldGap)).toBeGreaterThan(step(spacingRoles.gap));
23
+ expect(step(spacingRoles.fieldGap)).toBeGreaterThan(step(spacingRoles.gapSm));
24
+ expect(resolveKnobs(defaultKnobs).knobProps.fieldGap).toEqual({ gap: "$4" });
25
+ });
26
+
27
+ it("FormGrid and FormSection stack fields at the field rhythm", () => {
28
+ const { container } = renderWithProviders(
29
+ <FormSection label="Details">
30
+ <FormGrid>
31
+ <FieldLayout label="Description" id="d">
32
+ <input id="d" />
33
+ </FieldLayout>
34
+ <FieldLayout label="Status" id="s">
35
+ <input id="s" />
36
+ </FieldLayout>
37
+ </FormGrid>
38
+ </FormSection>,
39
+ );
40
+ const gaps = [...container.querySelectorAll("[data-gap]")].map((el) =>
41
+ el.getAttribute("data-gap"),
42
+ );
43
+ expect(gaps).toContain("$4");
44
+ expect(gaps).not.toContain("$3");
45
+ const labelGap = container.querySelector("[data-label-gap]")?.getAttribute("data-label-gap");
46
+ expect(step(labelGap ?? "$9")).toBeLessThan(step("$4"));
47
+ });
48
+ });
@@ -10,7 +10,7 @@ export interface FieldGroupProps {
10
10
  */
11
11
  columns?: FormGridColumns;
12
12
  /**
13
- * Gap between fields. Defaults to the within-group role (`knobProps.gap`),
13
+ * Gap between fields. Defaults to the field rhythm (`knobProps.fieldGap`, LC-154),
14
14
  * never `sizeToken`.
15
15
  */
16
16
  gap?: number | string;
@@ -14,7 +14,7 @@ export interface FormGridProps {
14
14
  */
15
15
  maxColumns?: FormGridColumns;
16
16
  /**
17
- * Gap between fields. Defaults to the within-group role (`knobProps.gap`),
17
+ * Gap between fields. Defaults to the field rhythm (`knobProps.fieldGap`, LC-154),
18
18
  * never `sizeToken`. Number = px eject; token string allowed.
19
19
  */
20
20
  gap?: number | string;
@@ -9,8 +9,8 @@ export interface FormSectionProps {
9
9
  */
10
10
  maxWidth?: number | "fluid";
11
11
  /**
12
- * Gap between fields inside the section. Defaults to the semantic
13
- * within-group gap (`knobProps.gap`, DG-LAY-03) so the preset's scale
12
+ * Gap between fields inside the section. Defaults to the field rhythm
13
+ * (`knobProps.fieldGap`, LC-154; DG-LAY-03) so the preset's scale
14
14
  * restyles form rhythm; explicit values eject.
15
15
  */
16
16
  gap?: number | string;
@@ -25,7 +25,7 @@ export interface FormSectionProps {
25
25
  /**
26
26
  * Labeled form section with semantic gap rhythm.
27
27
  *
28
- * Field gap defaults to the within-group semantic gap (`knobProps.gap`);
28
+ * Field gap defaults to the field rhythm (`knobProps.fieldGap`, LC-154);
29
29
  * stack multiple sections with {@link FormSectionStack}, whose gap defaults
30
30
  * to the between-groups gap (`knobProps.gapLg`) — always one step larger, so
31
31
  * section rhythm stays larger than field rhythm on every scale