@multiplatform.one/forms 7.55.0 → 7.56.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 (193) hide show
  1. package/dist/cjs/DescriptionList/index.cjs +216 -54
  2. package/dist/cjs/DescriptionList/index.native.js +226 -57
  3. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  4. package/dist/cjs/FieldDisplay/index.cjs +8 -2
  5. package/dist/cjs/FieldDisplay/index.native.js +8 -2
  6. package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
  7. package/dist/cjs/fields/Switch/index.cjs +13 -0
  8. package/dist/cjs/fields/Switch/index.native.js +13 -0
  9. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  10. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  11. package/dist/esm/Button/index.native.js.map +1 -1
  12. package/dist/esm/Chip/index.native.js.map +1 -1
  13. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  14. package/dist/esm/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  15. package/dist/esm/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  16. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  17. package/dist/esm/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  18. package/dist/esm/ControlGroup/index.native.js.map +1 -1
  19. package/dist/esm/DescriptionList/index.mjs +217 -56
  20. package/dist/esm/DescriptionList/index.mjs.map +1 -1
  21. package/dist/esm/DescriptionList/index.native.js +227 -59
  22. package/dist/esm/DescriptionList/index.native.js.map +1 -1
  23. package/dist/esm/ErrorSummary.native.js.map +1 -1
  24. package/dist/esm/FieldDisplay/editMode.native.js.map +1 -1
  25. package/dist/esm/FieldDisplay/formatters.native.js.map +1 -1
  26. package/dist/esm/FieldDisplay/index.mjs +8 -2
  27. package/dist/esm/FieldDisplay/index.mjs.map +1 -1
  28. package/dist/esm/FieldDisplay/index.native.js +8 -2
  29. package/dist/esm/FieldDisplay/index.native.js.map +1 -1
  30. package/dist/esm/FieldGroup.native.js.map +1 -1
  31. package/dist/esm/FloatingPanel/nestedAction.native.js.map +1 -1
  32. package/dist/esm/FloatingPanel/pointAnchor.native.js.map +1 -1
  33. package/dist/esm/FloatingPanel/trailingAction.native.js.map +1 -1
  34. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  35. package/dist/esm/Form/index.native.js.map +1 -1
  36. package/dist/esm/Form/submissionController.native.js.map +1 -1
  37. package/dist/esm/Form/validateOn.native.js.map +1 -1
  38. package/dist/esm/FormGrid.native.js.map +1 -1
  39. package/dist/esm/FormSection.native.js.map +1 -1
  40. package/dist/esm/InputParts/PasswordReveal.native.js.map +1 -1
  41. package/dist/esm/InputParts/index.native.js.map +1 -1
  42. package/dist/esm/Label/index.native.js.map +1 -1
  43. package/dist/esm/MediaPicker/base64.native.js.map +1 -1
  44. package/dist/esm/MediaPicker/payload.native.js.map +1 -1
  45. package/dist/esm/MediaPicker/types.native.js.map +1 -1
  46. package/dist/esm/MediaPicker/useMediaPicker.native.js.map +1 -1
  47. package/dist/esm/Skeleton/index.native.js.map +1 -1
  48. package/dist/esm/Spinner/SpinnerGlyph.native.js.map +1 -1
  49. package/dist/esm/Spinner/spinnerSize.native.js.map +1 -1
  50. package/dist/esm/Table/index.native.js.map +1 -1
  51. package/dist/esm/Wheel/haptic.native.js.map +1 -1
  52. package/dist/esm/Wheel/index.native.js.map +1 -1
  53. package/dist/esm/Wheel/wheelShared.native.js.map +1 -1
  54. package/dist/esm/actionLabel.native.js.map +1 -1
  55. package/dist/esm/fieldDefaults.native.js.map +1 -1
  56. package/dist/esm/fieldLayout.native.js.map +1 -1
  57. package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
  58. package/dist/esm/fields/Barcode/code128.native.js.map +1 -1
  59. package/dist/esm/fields/Barcode/index.native.js.map +1 -1
  60. package/dist/esm/fields/Barcode/qr.native.js.map +1 -1
  61. package/dist/esm/fields/Barcode/scannerTypes.native.js.map +1 -1
  62. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  63. package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  64. package/dist/esm/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  65. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  66. package/dist/esm/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  67. package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  68. package/dist/esm/fields/Checkbox/index.native.js.map +1 -1
  69. package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
  70. package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
  71. package/dist/esm/fields/Combobox/authorOptions.native.js.map +1 -1
  72. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  73. package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
  74. package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  75. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  76. package/dist/esm/fields/DatePicker/MonthPicker.native.js.map +1 -1
  77. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  78. package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -1
  79. package/dist/esm/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  80. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  81. package/dist/esm/fields/DatePicker/utils.native.js.map +1 -1
  82. package/dist/esm/fields/Duration/durationMath.native.js.map +1 -1
  83. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  84. package/dist/esm/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  85. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  86. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  87. package/dist/esm/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  88. package/dist/esm/fields/Geolocation/geoValue.native.js.map +1 -1
  89. package/dist/esm/fields/Geolocation/geocoder.native.js.map +1 -1
  90. package/dist/esm/fields/Geolocation/geocoderContext.native.js.map +1 -1
  91. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  92. package/dist/esm/fields/Geolocation/mapMath.native.js.map +1 -1
  93. package/dist/esm/fields/Geolocation/mapTypes.native.js.map +1 -1
  94. package/dist/esm/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
  95. package/dist/esm/fields/Geolocation/photonGeocoder.native.js.map +1 -1
  96. package/dist/esm/fields/Icon/drawnSet.native.js.map +1 -1
  97. package/dist/esm/fields/Icon/index.native.js.map +1 -1
  98. package/dist/esm/fields/ImageField/index.native.js.map +1 -1
  99. package/dist/esm/fields/Input/index.native.js.map +1 -1
  100. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  101. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  102. package/dist/esm/fields/OTPInput/otpCellCss.native.js.map +1 -1
  103. package/dist/esm/fields/PhoneInput/dialCodes.native.js.map +1 -1
  104. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  105. package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
  106. package/dist/esm/fields/PhoneInput/regionNames.native.js.map +1 -1
  107. package/dist/esm/fields/Progress/index.native.js.map +1 -1
  108. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  109. package/dist/esm/fields/Rating/index.native.js.map +1 -1
  110. package/dist/esm/fields/Rating/ratingMath.native.js.map +1 -1
  111. package/dist/esm/fields/Rating/types.native.js.map +1 -1
  112. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  113. package/dist/esm/fields/Select/index.native.js.map +1 -1
  114. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  115. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  116. package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
  117. package/dist/esm/fields/Stepper/index.native.js.map +1 -1
  118. package/dist/esm/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  119. package/dist/esm/fields/Switch/footprint.native.js.map +1 -1
  120. package/dist/esm/fields/Switch/index.mjs +13 -0
  121. package/dist/esm/fields/Switch/index.mjs.map +1 -1
  122. package/dist/esm/fields/Switch/index.native.js +13 -0
  123. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  124. package/dist/esm/fields/TextArea/index.native.js.map +1 -1
  125. package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -1
  126. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  127. package/dist/esm/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  128. package/dist/esm/fields/TimeRangeScrubber/index.native.js.map +1 -1
  129. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  130. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  131. package/dist/esm/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
  132. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  133. package/dist/esm/fields/nativeSelect.native.js.map +1 -1
  134. package/dist/esm/fields/selectedOrder.native.js.map +1 -1
  135. package/dist/esm/formSpacing.native.js.map +1 -1
  136. package/dist/esm/hooks/useFocusManagement.native.js.map +1 -1
  137. package/dist/esm/index.native.js.map +1 -1
  138. package/dist/esm/keyboard/chain.native.js.map +1 -1
  139. package/dist/esm/keyboard/index.native.js.map +1 -1
  140. package/dist/esm/keyboard/types.native.js.map +1 -1
  141. package/dist/esm/requiredMarking.native.js.map +1 -1
  142. package/dist/esm/shared/TimeColumn.native.js.map +1 -1
  143. package/dist/esm/shared/capabilityPreflight.native.js.map +1 -1
  144. package/dist/esm/shared/colorRamps.native.js.map +1 -1
  145. package/dist/esm/shared/devWarn.native.js.map +1 -1
  146. package/dist/esm/shared/floatingList.native.js.map +1 -1
  147. package/dist/esm/shared/focusManagement.native.js.map +1 -1
  148. package/dist/esm/shared/groupContext.native.js.map +1 -1
  149. package/dist/esm/shared/i18n.native.js.map +1 -1
  150. package/dist/esm/shared/instantMotion.native.js.map +1 -1
  151. package/dist/esm/shared/nativeA11y.native.js.map +1 -1
  152. package/dist/esm/shared/nativeAutoFocus.native.js.map +1 -1
  153. package/dist/esm/shared/overlayStack.native.js.map +1 -1
  154. package/dist/esm/shared/panelPortal.native.js.map +1 -1
  155. package/dist/esm/shared/pickerTriggerContract.native.js.map +1 -1
  156. package/dist/esm/shared/pressSlopProps.native.js.map +1 -1
  157. package/dist/esm/shared/restoreRetries.native.js.map +1 -1
  158. package/dist/esm/shared/t.native.js.map +1 -1
  159. package/dist/esm/shared/tableCellContext.native.js.map +1 -1
  160. package/dist/esm/shared/useDragScroll.native.js.map +1 -1
  161. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  162. package/dist/esm/shared/useSheetEscapeDismiss.native.js.map +1 -1
  163. package/dist/esm/shared/useWheelIncrement.native.js.map +1 -1
  164. package/dist/esm/shared/utils.native.js.map +1 -1
  165. package/dist/esm/shared/zIndex.native.js.map +1 -1
  166. package/dist/esm/themedPrimitives.native.js.map +1 -1
  167. package/dist/esm/types.native.js.map +1 -1
  168. package/dist/esm/utils/LinkCell.native.js.map +1 -1
  169. package/dist/jsx/DescriptionList/index.mjs +217 -56
  170. package/dist/jsx/DescriptionList/index.mjs.map +1 -1
  171. package/dist/jsx/DescriptionList/index.native.js +226 -57
  172. package/dist/jsx/DescriptionList/index.native.js.map +1 -1
  173. package/dist/jsx/FieldDisplay/index.mjs +8 -2
  174. package/dist/jsx/FieldDisplay/index.mjs.map +1 -1
  175. package/dist/jsx/FieldDisplay/index.native.js +8 -2
  176. package/dist/jsx/FieldDisplay/index.native.js.map +1 -1
  177. package/dist/jsx/fields/Switch/index.mjs +13 -0
  178. package/dist/jsx/fields/Switch/index.mjs.map +1 -1
  179. package/dist/jsx/fields/Switch/index.native.js +13 -0
  180. package/dist/jsx/fields/Switch/index.native.js.map +1 -1
  181. package/dist/jsx/index.native.js.map +1 -1
  182. package/package.json +8 -8
  183. package/src/DescriptionList/DescriptionList.secondaryInk.spec.tsx +49 -0
  184. package/src/DescriptionList/DescriptionList.spec.tsx +87 -1
  185. package/src/DescriptionList/index.tsx +235 -81
  186. package/src/FieldDisplay/index.tsx +4 -2
  187. package/src/fields/Switch/Switch.spec.tsx +21 -0
  188. package/src/fields/Switch/index.tsx +20 -0
  189. package/types/DescriptionList/index.d.ts +27 -4
  190. package/types/DescriptionList/index.d.ts.map +1 -1
  191. package/types/FieldDisplay/index.d.ts.map +1 -1
  192. package/types/fields/Switch/index.d.ts +7 -1
  193. package/types/fields/Switch/index.d.ts.map +1 -1
@@ -7,15 +7,20 @@
7
7
  * read/edit flip moves no label (LC-44). Chromeless by default (LC-39);
8
8
  * the framed variant paints, so it earns the Card inset.
9
9
  *
10
- * House Text (14/25 + body fragment + textAccent) and house Separator
11
- * (1px `$borderColor`, quiet = opacity 0.5) own the term and the row rule.
10
+ * LC-169 CARD-HIERARCHY: the term is the label role (footnote size,
11
+ * secondary ink) and the value the body in the primary ink, so a label never
12
+ * reads at its value's size, weight and ink. An `identifier` row (a URL, an
13
+ * id) is mono, one line, truncated in the middle, with copy. House Separator
14
+ * (1px `$borderColor`, quiet = opacity 0.5) owns the row rule.
12
15
  * Forms cannot import `@multiplatform.one/components` (that package depends
13
16
  * on forms); the recipes are the same measured law.
14
17
  */
15
18
 
16
19
  import {
17
20
  Children,
21
+ createContext,
18
22
  isValidElement,
23
+ useContext,
19
24
  useLayoutEffect,
20
25
  useMemo,
21
26
  useRef,
@@ -25,7 +30,14 @@ import {
25
30
  type ReactNode,
26
31
  type Ref,
27
32
  } from "react";
28
- import { compareSizeTokens, useResolvedKnobs } from "@multiplatform.one/theme";
33
+ import { writeToClipboard } from "@multiplatform.one/platform";
34
+ import {
35
+ IconSlot,
36
+ compareSizeTokens,
37
+ useGlyphColor,
38
+ useResolvedKnobs,
39
+ } from "@multiplatform.one/theme";
40
+ import { CopyIcon } from "@phosphor-icons/react";
29
41
  import { type SizeTokens, Text, View, XStack, YStack, isWeb } from "tamagui";
30
42
  import { Button } from "../Button";
31
43
  import { FORM_GRID_COLLAPSE_WIDTH } from "../FormGrid";
@@ -34,10 +46,17 @@ import { formReadableMaxWidth } from "../formSpacing";
34
46
  import { DescriptionListSlotProvider, FieldDisplay, type FieldDisplayType } from "../FieldDisplay";
35
47
  import { t } from "../shared/t";
36
48
 
37
- export type DescriptionListPlacement = "side" | "top";
49
+ /**
50
+ * `inline` is the card fact row (LC-169): glyph and label leading, the value
51
+ * trailing on the same line, a hairline between rows. An identifier row still
52
+ * stacks, since a long mono id cannot share its line.
53
+ */
54
+ export type DescriptionListPlacement = "side" | "top" | "inline";
38
55
 
39
56
  export interface DescriptionListItem {
40
57
  term: ReactNode;
58
+ /** A glyph that names the fact's kind, before the term in the secondary ink. */
59
+ icon?: ReactNode;
41
60
  /** FieldDisplay type — every typed value mounts FieldDisplay (LC-12). */
42
61
  field?: FieldDisplayType;
43
62
  value?: any;
@@ -45,6 +64,11 @@ export interface DescriptionListItem {
45
64
  linkedValue?: any;
46
65
  /** Opt-in ellipsis for identifier-class values (DG-OVF). */
47
66
  truncate?: boolean;
67
+ /**
68
+ * A long identifier (URL, id, digest): mono, one line, truncated in the
69
+ * middle so both ends stay legible, with a copy action (LC-169).
70
+ */
71
+ identifier?: boolean;
48
72
  /** Optional per-row Change action. */
49
73
  onChange?: () => void;
50
74
  changeLabel?: string;
@@ -83,6 +107,8 @@ export interface DescriptionListProps {
83
107
  * tight rhythm (shorter rows, `gapSm` columns).
84
108
  */
85
109
  size?: SizeTokens;
110
+ /** Called after an identifier row's copy, for the owner's confirm (CopyField precedent). */
111
+ onCopyResult?: (ok: boolean) => void;
86
112
  testID?: string;
87
113
  }
88
114
 
@@ -114,7 +140,7 @@ function resolvePlacement(
114
140
  prop: DescriptionListPlacement | undefined,
115
141
  knobPlacement: string,
116
142
  ): DescriptionListPlacement {
117
- if (prop === "side" || prop === "top") return prop;
143
+ if (prop === "side" || prop === "top" || prop === "inline") return prop;
118
144
  if (knobPlacement === "top" || knobPlacement === "side") {
119
145
  return knobPlacement;
120
146
  }
@@ -154,15 +180,17 @@ function ListRule({ quiet }: { quiet?: boolean }) {
154
180
  );
155
181
  }
156
182
 
157
- function TermText({ children }: { children: ReactNode }) {
183
+ function TermText({ children, inline = false }: { children: ReactNode; inline?: boolean }) {
158
184
  const { knobProps } = useResolvedKnobs();
159
185
  return (
160
186
  <Text
161
187
  data-mpo-description-list-term=""
162
- fontSize={14}
163
- lineHeight={25}
164
- {...knobProps.body}
165
- color="$color11"
188
+ // LC-169: a stacked term is the label role (a size under its value, the
189
+ // secondary ink); an inline one shares the value's line, so it takes the
190
+ // value's size and differs by ink.
191
+ {...(inline
192
+ ? { ...knobProps.body, ...knobProps.label, color: "$textMuted" }
193
+ : knobProps.textRole.label)}
166
194
  minWidth={0}
167
195
  // `overflowWrap` is not a tamagui style prop; passed as one it reaches
168
196
  // the DOM host as an unknown React prop. Web takes it through `style`.
@@ -173,6 +201,24 @@ function TermText({ children }: { children: ReactNode }) {
173
201
  );
174
202
  }
175
203
 
204
+ function TermLead({ row, inline = false }: { row: DescriptionListItem; inline?: boolean }) {
205
+ const { knobProps } = useResolvedKnobs();
206
+ const ink = useGlyphColor("$textMuted");
207
+ if (row.icon == null) return <TermText inline={inline}>{row.term}</TermText>;
208
+ return (
209
+ <XStack alignItems="center" minWidth={0} {...knobProps.gapSm}>
210
+ <View
211
+ aria-hidden
212
+ flexShrink={0}
213
+ {...(isWeb && ink ? ({ style: { color: ink } } as Record<string, unknown>) : {})}
214
+ >
215
+ <IconSlot icon={row.icon} color={ink} size={16} />
216
+ </View>
217
+ <TermText inline={inline}>{row.term}</TermText>
218
+ </XStack>
219
+ );
220
+ }
221
+
176
222
  function ChangeAction({ onChange, label }: { onChange: () => void; label?: string }) {
177
223
  return (
178
224
  <View data-mpo-description-list-action="" alignItems="flex-start" justifyContent="flex-end">
@@ -183,21 +229,105 @@ function ChangeAction({ onChange, label }: { onChange: () => void; label?: strin
183
229
  );
184
230
  }
185
231
 
186
- function ValueSlot({ row }: { row: DescriptionListItem }) {
232
+ /**
233
+ * Where a long identifier splits for middle truncation: the tail keeps the
234
+ * last path segments that fit in 20 characters (`/auth/realms/master`), or
235
+ * the last 12 characters when there is no path.
236
+ */
237
+ export function middleSplit(text: string): [string, string] {
238
+ if (text.length <= 24) return [text, ""];
239
+ let start = text.length - 12;
240
+ let from = text.length - 2;
241
+ for (;;) {
242
+ const slash = text.lastIndexOf("/", from);
243
+ if (slash <= 0 || text.length - slash > 20) break;
244
+ start = slash;
245
+ from = slash - 1;
246
+ }
247
+ return [text.slice(0, start), text.slice(start)];
248
+ }
249
+
250
+ /**
251
+ * The glyph never flips (DG-FB-01 / LC-16): the confirm is the owner's, through
252
+ * `onCopyResult`, the same channel Input's copy end-cap uses (CopyField routes
253
+ * it to notify()).
254
+ */
255
+ const CopyResultContext = createContext<((ok: boolean) => void) | undefined>(undefined);
256
+
257
+ function IdentifierValue({ text }: { text: string }) {
258
+ const onCopyResult = useContext(CopyResultContext);
259
+ const { knobProps } = useResolvedKnobs();
260
+ const [head, tail] = middleSplit(text);
261
+ const ink = { ...knobProps.body, fontFamily: "$mono", color: "$color" } as const;
262
+ const copy = async () => {
263
+ const ok = await writeToClipboard(text);
264
+ onCopyResult?.(ok);
265
+ };
266
+ return (
267
+ <XStack
268
+ data-mpo-description-list-identifier=""
269
+ alignItems="center"
270
+ minWidth={0}
271
+ width="100%"
272
+ {...knobProps.gapSm}
273
+ >
274
+ {isWeb ? (
275
+ <XStack flex={1} minWidth={0} {...({ title: text } as Record<string, unknown>)}>
276
+ <Text {...ink} numberOfLines={1} flexShrink={1} minWidth={0}>
277
+ {head}
278
+ </Text>
279
+ {tail ? (
280
+ <Text {...ink} numberOfLines={1} flexShrink={0}>
281
+ {tail}
282
+ </Text>
283
+ ) : null}
284
+ </XStack>
285
+ ) : (
286
+ <Text {...ink} flex={1} minWidth={0} numberOfLines={1} ellipsizeMode="middle">
287
+ {text}
288
+ </Text>
289
+ )}
290
+ <Button
291
+ nested
292
+ chromeless
293
+ circular
294
+ flexShrink={0}
295
+ icon={<CopyIcon />}
296
+ aria-label={t("Copy to clipboard")}
297
+ onPress={() => void copy()}
298
+ />
299
+ </XStack>
300
+ );
301
+ }
302
+
303
+ function ValueSlot({ row, trailing = false }: { row: DescriptionListItem; trailing?: boolean }) {
187
304
  return (
188
305
  <View data-mpo-description-list-value="" minWidth={0} width="100%">
189
306
  {row.children != null ? (
190
- row.children
307
+ trailing ? (
308
+ <XStack justifyContent="flex-end" alignItems="center" minWidth={0} width="100%">
309
+ {row.children}
310
+ </XStack>
311
+ ) : (
312
+ row.children
313
+ )
314
+ ) : row.identifier && row.value != null && row.value !== "" ? (
315
+ <IdentifierValue text={String(row.value)} />
191
316
  ) : (
192
- <FieldDisplay
193
- field={row.field ?? "input"}
194
- value={row.value}
195
- fieldProps={row.fieldProps}
196
- linkedValue={row.linkedValue}
197
- chromeless
198
- align="left"
199
- truncate={row.truncate}
200
- />
317
+ // FieldDisplay grows on flex 1 from a zero basis; in a column with no
318
+ // height of its own that collapsed it to 0 and the next rule ran
319
+ // through the value. A row lets it grow across and keep its height.
320
+ <XStack minWidth={0} width="100%">
321
+ <FieldDisplay
322
+ field={row.field ?? "input"}
323
+ value={row.value}
324
+ fieldProps={row.fieldProps}
325
+ linkedValue={row.linkedValue}
326
+ chromeless
327
+ align={trailing ? "right" : "left"}
328
+ truncate={trailing || row.truncate}
329
+ />
330
+ </XStack>
201
331
  )}
202
332
  </View>
203
333
  );
@@ -206,6 +336,7 @@ function ValueSlot({ row }: { row: DescriptionListItem }) {
206
336
  function DescriptionListRowView({
207
337
  row,
208
338
  stacked,
339
+ inline = false,
209
340
  hasActionColumn,
210
341
  rhythm,
211
342
  showRule,
@@ -213,6 +344,7 @@ function DescriptionListRowView({
213
344
  }: {
214
345
  row: DescriptionListItem;
215
346
  stacked: boolean;
347
+ inline?: boolean;
216
348
  hasActionColumn: boolean;
217
349
  rhythm: ReturnType<typeof listItemRhythm>;
218
350
  showRule: boolean;
@@ -224,20 +356,23 @@ function DescriptionListRowView({
224
356
  <View data-mpo-description-list-action="" />
225
357
  ) : null;
226
358
 
227
- const rowStyle: CSSProperties | undefined = isWeb
228
- ? stacked
229
- ? {
230
- display: "grid",
231
- gridTemplateColumns: hasActionColumn ? "minmax(0,1fr) max-content" : "minmax(0,1fr)",
232
- columnGap: undefined,
233
- rowGap: undefined,
234
- }
235
- : {
236
- display: "grid",
237
- gridTemplateColumns: "subgrid",
238
- gridColumn: "1 / -1",
239
- }
240
- : undefined;
359
+ const oneLine = inline && !row.identifier;
360
+ const rowStyle: CSSProperties | undefined = oneLine
361
+ ? undefined
362
+ : isWeb
363
+ ? stacked
364
+ ? {
365
+ display: "grid",
366
+ gridTemplateColumns: hasActionColumn ? "minmax(0,1fr) max-content" : "minmax(0,1fr)",
367
+ columnGap: undefined,
368
+ rowGap: undefined,
369
+ }
370
+ : {
371
+ display: "grid",
372
+ gridTemplateColumns: "subgrid",
373
+ gridColumn: "1 / -1",
374
+ }
375
+ : undefined;
241
376
 
242
377
  const termStyle: CSSProperties | undefined = isWeb
243
378
  ? stacked
@@ -255,10 +390,20 @@ function DescriptionListRowView({
255
390
  : { justifySelf: "end" }
256
391
  : undefined;
257
392
 
258
- const body = stacked ? (
393
+ const body = oneLine ? (
394
+ <XStack alignItems="center" width="100%" minWidth={0} gap={rhythm.columnGap as never}>
395
+ <View flexShrink={0} maxWidth="60%" minWidth={0}>
396
+ <TermLead row={row} inline />
397
+ </View>
398
+ <View flex={1} minWidth={0}>
399
+ <ValueSlot row={row} trailing />
400
+ </View>
401
+ {action}
402
+ </XStack>
403
+ ) : stacked ? (
259
404
  <>
260
405
  <View style={termStyle}>
261
- <TermText>{row.term}</TermText>
406
+ <TermLead row={row} />
262
407
  </View>
263
408
  {action ? <View style={actionStyle}>{action}</View> : null}
264
409
  <View style={valueStyle} paddingTop={rhythm.stackGap as never}>
@@ -268,7 +413,7 @@ function DescriptionListRowView({
268
413
  ) : isWeb ? (
269
414
  <>
270
415
  <View style={termStyle}>
271
- <TermText>{row.term}</TermText>
416
+ <TermLead row={row} />
272
417
  </View>
273
418
  <View style={valueStyle}>
274
419
  <ValueSlot row={row} />
@@ -283,7 +428,7 @@ function DescriptionListRowView({
283
428
  flexShrink={0}
284
429
  width={`${purposeMaxCh()}ch` as never}
285
430
  >
286
- <TermText>{row.term}</TermText>
431
+ <TermLead row={row} />
287
432
  </View>
288
433
  <View flex={1} minWidth={0}>
289
434
  <ValueSlot row={row} />
@@ -314,6 +459,7 @@ function DescriptionListRowView({
314
459
  function DescriptionListWeb({
315
460
  rows,
316
461
  stacked,
462
+ inline,
317
463
  hasAction,
318
464
  rhythm,
319
465
  quiet,
@@ -324,6 +470,7 @@ function DescriptionListWeb({
324
470
  }: {
325
471
  rows: DescriptionListItem[];
326
472
  stacked: boolean;
473
+ inline: boolean;
327
474
  hasAction: boolean;
328
475
  rhythm: ReturnType<typeof listItemRhythm>;
329
476
  quiet?: boolean;
@@ -374,6 +521,7 @@ function DescriptionListWeb({
374
521
  key={index}
375
522
  row={row}
376
523
  stacked={stacked}
524
+ inline={inline}
377
525
  hasActionColumn={hasAction}
378
526
  rhythm={rhythm}
379
527
  showRule={index > 0}
@@ -443,6 +591,7 @@ export function DescriptionList({
443
591
  maxWidth = formReadableMaxWidth,
444
592
  labelColumnWidth = LABEL_COLUMN_WIDTH,
445
593
  size,
594
+ onCopyResult,
446
595
  testID,
447
596
  }: DescriptionListProps) {
448
597
  const { knobProps } = useResolvedKnobs({ size });
@@ -456,50 +605,55 @@ export function DescriptionList({
456
605
  const hasAction = rows.some(rowHasAction);
457
606
  const measureCollapse = placement === "side";
458
607
  const { ref, wide, onLayout } = useContainerWide(measureCollapse);
459
- const stacked = placement === "top" || (placement === "side" && !wide);
608
+ const inline = placement === "inline";
609
+ const stacked = placement === "top" || inline || (placement === "side" && !wide);
460
610
 
461
611
  const list = (
462
- <DescriptionListSlotProvider>
463
- {isWeb ? (
464
- <DescriptionListWeb
465
- rows={rows}
466
- stacked={stacked}
467
- hasAction={hasAction}
468
- rhythm={rhythm}
469
- quiet={quiet}
470
- labelColumnWidth={labelColumnWidth}
471
- sizeToken={knobProps.sizeToken}
472
- placement={placement}
473
- framed={framed}
474
- />
475
- ) : (
476
- <YStack
477
- data-mpo-description-list=""
478
- data-placement={placement}
479
- data-stacked={stacked ? "true" : "false"}
480
- data-rhythm={rhythm.tight ? "tight" : "regular"}
481
- data-framed={framed ? "true" : "false"}
482
- data-quiet={quiet ? "true" : "false"}
483
- data-has-action={hasAction ? "true" : "false"}
484
- data-label-column-width={labelColumnWidth}
485
- data-size-token={knobProps.sizeToken}
486
- width="100%"
487
- minWidth={0}
488
- >
489
- {rows.map((row, index) => (
490
- <DescriptionListRowView
491
- key={index}
492
- row={row}
493
- stacked={stacked}
494
- hasActionColumn={hasAction}
495
- rhythm={rhythm}
496
- showRule={index > 0}
497
- quiet={quiet}
498
- />
499
- ))}
500
- </YStack>
501
- )}
502
- </DescriptionListSlotProvider>
612
+ <CopyResultContext.Provider value={onCopyResult}>
613
+ <DescriptionListSlotProvider>
614
+ {isWeb ? (
615
+ <DescriptionListWeb
616
+ rows={rows}
617
+ stacked={stacked}
618
+ inline={inline}
619
+ hasAction={hasAction}
620
+ rhythm={rhythm}
621
+ quiet={quiet}
622
+ labelColumnWidth={labelColumnWidth}
623
+ sizeToken={knobProps.sizeToken}
624
+ placement={placement}
625
+ framed={framed}
626
+ />
627
+ ) : (
628
+ <YStack
629
+ data-mpo-description-list=""
630
+ data-placement={placement}
631
+ data-stacked={stacked ? "true" : "false"}
632
+ data-rhythm={rhythm.tight ? "tight" : "regular"}
633
+ data-framed={framed ? "true" : "false"}
634
+ data-quiet={quiet ? "true" : "false"}
635
+ data-has-action={hasAction ? "true" : "false"}
636
+ data-label-column-width={labelColumnWidth}
637
+ data-size-token={knobProps.sizeToken}
638
+ width="100%"
639
+ minWidth={0}
640
+ >
641
+ {rows.map((row, index) => (
642
+ <DescriptionListRowView
643
+ key={index}
644
+ row={row}
645
+ stacked={stacked}
646
+ inline={inline}
647
+ hasActionColumn={hasAction}
648
+ rhythm={rhythm}
649
+ showRule={index > 0}
650
+ quiet={quiet}
651
+ />
652
+ ))}
653
+ </YStack>
654
+ )}
655
+ </DescriptionListSlotProvider>
656
+ </CopyResultContext.Provider>
503
657
  );
504
658
 
505
659
  const widthProps = {
@@ -193,8 +193,10 @@ function useDisplayChrome() {
193
193
  };
194
194
  }
195
195
 
196
+ const frameJustify = { left: "flex-start", center: "center", right: "flex-end" } as const;
197
+
196
198
  function DisplayFrame({ field, children }: { field: FieldDisplayType; children: ReactNode }) {
197
- const { knobProps, chromeless } = useDisplayChrome();
199
+ const { knobProps, chromeless, align } = useDisplayChrome();
198
200
  if (chromeless) {
199
201
  return (
200
202
  <XStack
@@ -202,7 +204,7 @@ function DisplayFrame({ field, children }: { field: FieldDisplayType; children:
202
204
  data-field={field}
203
205
  data-chromeless=""
204
206
  alignItems="center"
205
- justifyContent="flex-start"
207
+ justifyContent={frameJustify[align ?? "left"]}
206
208
  minWidth={0}
207
209
  flex={1}
208
210
  width="100%"
@@ -534,3 +534,24 @@ describe("Switch thumb and pointer paint", () => {
534
534
  expect(onPressOut).toHaveBeenCalledTimes(1);
535
535
  });
536
536
  });
537
+
538
+ describe("Switch labelPlacement (HIG settings row)", () => {
539
+ it("leading: the label leads and the switch sits at the trailing edge, switch first in the DOM", () => {
540
+ const result = renderWithProviders(
541
+ <Switch id="lead" label="Email notifications" labelPlacement="leading" />,
542
+ );
543
+ const control = result.getByRole("switch");
544
+ const row = result.getByText("Email notifications").parentElement as HTMLElement;
545
+ expect(row.contains(control)).toBe(true);
546
+ expect(String(row.className)).toMatch(/_fd-row-reverse/);
547
+ // LC-102: the label takes the free space; the row is never spaced apart.
548
+ expect(String(row.className)).not.toMatch(/_jc-space-between/);
549
+ expect(String(result.getByText("Email notifications").className)).toMatch(/_fg-1/);
550
+ });
551
+
552
+ it("trailing (default): no reversed row", () => {
553
+ const result = renderWithProviders(<Switch id="trail" label="Push notifications" />);
554
+ const row = result.getByText("Push notifications").parentElement as HTMLElement;
555
+ expect(String(row.className)).not.toMatch(/_fd-row-reverse/);
556
+ });
557
+ });
@@ -721,6 +721,12 @@ export interface SwitchProps {
721
721
  "aria-labelledby"?: string;
722
722
  leftIcon?: ReactNode;
723
723
  rightIcon?: ReactNode;
724
+ /**
725
+ * `leading` puts the label first and the switch at the row's trailing edge,
726
+ * the HIG settings row (label left, control right, full width). Default
727
+ * `trailing`: switch, then label.
728
+ */
729
+ labelPlacement?: "leading" | "trailing";
724
730
  switchProps?: Omit<
725
731
  TamaguiSwitchProps,
726
732
  "checked" | "defaultChecked" | "id" | "onCheckedChange" | "children"
@@ -760,11 +766,21 @@ export function Switch({
760
766
  "aria-labelledby": ariaLabelledBy,
761
767
  leftIcon,
762
768
  rightIcon,
769
+ labelPlacement = "trailing",
763
770
  switchProps,
764
771
  pointy,
765
772
  skeleton,
766
773
  minTargetHeight,
767
774
  }: SwitchProps) {
775
+ // The switch stays first in the DOM (focus and reading order); the row
776
+ // reverses so the label leads and the switch sits at the trailing edge.
777
+ const labelLeadingRow =
778
+ labelPlacement === "leading" && label
779
+ ? ({ flexDirection: "row-reverse", width: "100%" } as const)
780
+ : undefined;
781
+ // LC-102: the leading label takes the free space, so the switch hugs the
782
+ // trailing edge without spacing the row apart.
783
+ const leadingLabelFill = labelLeadingRow ? ({ flex: 1, minWidth: 0 } as const) : undefined;
768
784
  const hydrationTouch = useTouchSurface();
769
785
  // Canonical `onChange` and the alias `onCheckedChange` both fire; standalone
770
786
  // (formless) callers get real toggling from either name.
@@ -1037,6 +1053,7 @@ export function Switch({
1037
1053
  alignItems="center"
1038
1054
  height={sizeToken}
1039
1055
  {...(rowMinHeight !== undefined && { minHeight: rowMinHeight })}
1056
+ {...labelLeadingRow}
1040
1057
  >
1041
1058
  {renderSwitch(
1042
1059
  resolvedChecked,
@@ -1059,6 +1076,7 @@ export function Switch({
1059
1076
  ...text.focusVisibleKnobProps,
1060
1077
  }}
1061
1078
  paddingInlineEnd="$1"
1079
+ {...leadingLabelFill}
1062
1080
  {...labelProps}
1063
1081
  >
1064
1082
  {label}
@@ -1095,6 +1113,7 @@ export function Switch({
1095
1113
  alignItems="center"
1096
1114
  height={sizeToken}
1097
1115
  {...(rowMinHeight !== undefined && { minHeight: rowMinHeight })}
1116
+ {...labelLeadingRow}
1098
1117
  >
1099
1118
  {renderSwitch(
1100
1119
  checked !== undefined ? checked : Boolean(field.state.value),
@@ -1120,6 +1139,7 @@ export function Switch({
1120
1139
  focusStyle={{ color: formLabelColor, ...text.focusKnobProps }}
1121
1140
  focusVisibleStyle={{ color: formLabelColor, ...text.focusVisibleKnobProps }}
1122
1141
  paddingInlineEnd="$1"
1142
+ {...leadingLabelFill}
1123
1143
  {...labelProps}
1124
1144
  >
1125
1145
  {label}
@@ -7,17 +7,27 @@
7
7
  * read/edit flip moves no label (LC-44). Chromeless by default (LC-39);
8
8
  * the framed variant paints, so it earns the Card inset.
9
9
  *
10
- * House Text (14/25 + body fragment + textAccent) and house Separator
11
- * (1px `$borderColor`, quiet = opacity 0.5) own the term and the row rule.
10
+ * LC-169 CARD-HIERARCHY: the term is the label role (footnote size,
11
+ * secondary ink) and the value the body in the primary ink, so a label never
12
+ * reads at its value's size, weight and ink. An `identifier` row (a URL, an
13
+ * id) is mono, one line, truncated in the middle, with copy. House Separator
14
+ * (1px `$borderColor`, quiet = opacity 0.5) owns the row rule.
12
15
  * Forms cannot import `@multiplatform.one/components` (that package depends
13
16
  * on forms); the recipes are the same measured law.
14
17
  */
15
18
  import { type ReactElement, type ReactNode } from "react";
16
19
  import { type SizeTokens } from "tamagui";
17
20
  import { type FieldDisplayType } from "../FieldDisplay";
18
- export type DescriptionListPlacement = "side" | "top";
21
+ /**
22
+ * `inline` is the card fact row (LC-169): glyph and label leading, the value
23
+ * trailing on the same line, a hairline between rows. An identifier row still
24
+ * stacks, since a long mono id cannot share its line.
25
+ */
26
+ export type DescriptionListPlacement = "side" | "top" | "inline";
19
27
  export interface DescriptionListItem {
20
28
  term: ReactNode;
29
+ /** A glyph that names the fact's kind, before the term in the secondary ink. */
30
+ icon?: ReactNode;
21
31
  /** FieldDisplay type — every typed value mounts FieldDisplay (LC-12). */
22
32
  field?: FieldDisplayType;
23
33
  value?: any;
@@ -25,6 +35,11 @@ export interface DescriptionListItem {
25
35
  linkedValue?: any;
26
36
  /** Opt-in ellipsis for identifier-class values (DG-OVF). */
27
37
  truncate?: boolean;
38
+ /**
39
+ * A long identifier (URL, id, digest): mono, one line, truncated in the
40
+ * middle so both ends stay legible, with a copy action (LC-169).
41
+ */
42
+ identifier?: boolean;
28
43
  /** Optional per-row Change action. */
29
44
  onChange?: () => void;
30
45
  changeLabel?: string;
@@ -61,9 +76,17 @@ export interface DescriptionListProps {
61
76
  * tight rhythm (shorter rows, `gapSm` columns).
62
77
  */
63
78
  size?: SizeTokens;
79
+ /** Called after an identifier row's copy, for the owner's confirm (CopyField precedent). */
80
+ onCopyResult?: (ok: boolean) => void;
64
81
  testID?: string;
65
82
  }
66
- export declare function DescriptionList({ items, children, placement: placementProp, framed, quiet, maxWidth, labelColumnWidth, size, testID, }: DescriptionListProps): import("react/jsx-runtime").JSX.Element;
83
+ /**
84
+ * Where a long identifier splits for middle truncation: the tail keeps the
85
+ * last path segments that fit in 20 characters (`/auth/realms/master`), or
86
+ * the last 12 characters when there is no path.
87
+ */
88
+ export declare function middleSplit(text: string): [string, string];
89
+ export declare function DescriptionList({ items, children, placement: placementProp, framed, quiet, maxWidth, labelColumnWidth, size, onCopyResult, testID, }: DescriptionListProps): import("react/jsx-runtime").JSX.Element;
67
90
  export declare namespace DescriptionList {
68
91
  var Row: typeof DescriptionListRow;
69
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/DescriptionList/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAQL,KAAK,YAAY,EACjB,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,KAAK,UAAU,EAAqC,MAAM,SAAS,CAAC;AAK7E,OAAO,EAA6C,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnG,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,KAAK,CAAC;AAEtD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,yEAAyE;IACzE,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,wBAAwB,CAAC;IACrC,0DAA0D;IAC1D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA8VD,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,SAAS,EAAE,aAAa,EACxB,MAAc,EACd,KAAa,EACb,QAA+B,EAC/B,gBAAqC,EACrC,IAAI,EACJ,MAAM,GACP,EAAE,oBAAoB,2CAqFtB;yBA/Fe,eAAe;;;AAiG/B,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,uBAAuB,GAAG,YAAY,GAAG,IAAI,CAEvF;AAID,oDAAoD;AACpD,eAAO,MAAM,YAAY,wBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/DescriptionList/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAUL,KAAK,YAAY,EACjB,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AASf,OAAO,EAAE,KAAK,UAAU,EAAqC,MAAM,SAAS,CAAC;AAK7E,OAAO,EAA6C,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnG;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,gFAAgF;IAChF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,yEAAyE;IACzE,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,wBAAwB,CAAC;IACrC,0DAA0D;IAC1D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,4FAA4F;IAC5F,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAuHD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAW1D;AAiVD,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,SAAS,EAAE,aAAa,EACxB,MAAc,EACd,KAAa,EACb,QAA+B,EAC/B,gBAAqC,EACrC,IAAI,EACJ,YAAY,EACZ,MAAM,GACP,EAAE,oBAAoB,2CA0FtB;yBArGe,eAAe;;;AAuG/B,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,uBAAuB,GAAG,YAAY,GAAG,IAAI,CAEvF;AAID,oDAAoD;AACpD,eAAO,MAAM,YAAY,wBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/FieldDisplay/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAUH,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAgBrF,MAAM,MAAM,gBAAgB,GACxB,OAAO,GACP,UAAU,GACV,cAAc,GACd,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,YAAY,GACZ,aAAa,GACb,UAAU,GACV,QAAQ,GACR,YAAY,GACZ,gBAAgB,GAChB,YAAY,GACZ,iBAAiB,GACjB,iBAAiB,GACjB,UAAU,GACV,aAAa,GACb,YAAY,GACZ,KAAK,GACL,SAAS,GACT,QAAQ,GACR,UAAU,GACV,YAAY,GACZ,OAAO,GACP,WAAW,GACX,aAAa,GACb,gBAAgB,GAChB,gBAAgB,GAChB,YAAY,GACZ,QAAQ,CAAC;AAEb,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,GAAG,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,oCAAoC;IACpC,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAID,oEAAoE;AACpE,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED,wBAAgB,2BAA2B,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAMhF;AAqkBD,wBAAgB,YAAY,CAAC,EAC3B,KAAe,EACf,KAAK,EACL,UAAU,EACV,WAAW,EACX,UAAkB,EAClB,KAAK,EACL,QAAgB,GACjB,EAAE,iBAAiB,2CAgHnB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/FieldDisplay/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAUH,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAgBrF,MAAM,MAAM,gBAAgB,GACxB,OAAO,GACP,UAAU,GACV,cAAc,GACd,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,YAAY,GACZ,aAAa,GACb,UAAU,GACV,QAAQ,GACR,YAAY,GACZ,gBAAgB,GAChB,YAAY,GACZ,iBAAiB,GACjB,iBAAiB,GACjB,UAAU,GACV,aAAa,GACb,YAAY,GACZ,KAAK,GACL,SAAS,GACT,QAAQ,GACR,UAAU,GACV,YAAY,GACZ,OAAO,GACP,WAAW,GACX,aAAa,GACb,gBAAgB,GAChB,gBAAgB,GAChB,YAAY,GACZ,QAAQ,CAAC;AAEb,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,GAAG,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,oCAAoC;IACpC,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAID,oEAAoE;AACpE,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED,wBAAgB,2BAA2B,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAMhF;AAukBD,wBAAgB,YAAY,CAAC,EAC3B,KAAe,EACf,KAAK,EACL,UAAU,EACV,WAAW,EACX,UAAkB,EAClB,KAAK,EACL,QAAgB,GACjB,EAAE,iBAAiB,2CAgHnB"}