@multiplatform.one/frappe-ui 7.39.0 → 7.41.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 (59) hide show
  1. package/dist/cjs/FrappeTable.cjs +6 -3
  2. package/dist/cjs/FrappeTable.native.js +8 -3
  3. package/dist/cjs/FrappeTable.native.js.map +1 -1
  4. package/dist/cjs/list/listColumns.cjs +41 -4
  5. package/dist/cjs/list/listColumns.native.js +51 -8
  6. package/dist/cjs/list/listColumns.native.js.map +1 -1
  7. package/dist/cjs/list/listFields.cjs +2 -0
  8. package/dist/cjs/list/listFields.native.js +5 -0
  9. package/dist/cjs/list/listFields.native.js.map +1 -1
  10. package/dist/cjs/schemaForm/index.cjs +21 -2
  11. package/dist/cjs/schemaForm/index.native.js +43 -3
  12. package/dist/cjs/schemaForm/index.native.js.map +1 -1
  13. package/dist/esm/FrappeTable.mjs +6 -3
  14. package/dist/esm/FrappeTable.mjs.map +1 -1
  15. package/dist/esm/FrappeTable.native.js +8 -3
  16. package/dist/esm/FrappeTable.native.js.map +1 -1
  17. package/dist/esm/list/listColumns.mjs +43 -7
  18. package/dist/esm/list/listColumns.mjs.map +1 -1
  19. package/dist/esm/list/listColumns.native.js +53 -11
  20. package/dist/esm/list/listColumns.native.js.map +1 -1
  21. package/dist/esm/list/listFields.mjs +2 -0
  22. package/dist/esm/list/listFields.mjs.map +1 -1
  23. package/dist/esm/list/listFields.native.js +5 -0
  24. package/dist/esm/list/listFields.native.js.map +1 -1
  25. package/dist/esm/schemaForm/index.mjs +20 -2
  26. package/dist/esm/schemaForm/index.mjs.map +1 -1
  27. package/dist/esm/schemaForm/index.native.js +42 -3
  28. package/dist/esm/schemaForm/index.native.js.map +1 -1
  29. package/dist/jsx/FrappeTable.mjs +6 -3
  30. package/dist/jsx/FrappeTable.mjs.map +1 -1
  31. package/dist/jsx/FrappeTable.native.js +8 -3
  32. package/dist/jsx/FrappeTable.native.js.map +1 -1
  33. package/dist/jsx/list/listColumns.mjs +43 -7
  34. package/dist/jsx/list/listColumns.mjs.map +1 -1
  35. package/dist/jsx/list/listColumns.native.js +51 -8
  36. package/dist/jsx/list/listColumns.native.js.map +1 -1
  37. package/dist/jsx/list/listFields.mjs +2 -0
  38. package/dist/jsx/list/listFields.mjs.map +1 -1
  39. package/dist/jsx/list/listFields.native.js +5 -0
  40. package/dist/jsx/list/listFields.native.js.map +1 -1
  41. package/dist/jsx/schemaForm/index.mjs +20 -2
  42. package/dist/jsx/schemaForm/index.mjs.map +1 -1
  43. package/dist/jsx/schemaForm/index.native.js +43 -3
  44. package/dist/jsx/schemaForm/index.native.js.map +1 -1
  45. package/package.json +16 -16
  46. package/src/FrappeTable.tsx +17 -12
  47. package/src/list/listColumns.spec.tsx +37 -1
  48. package/src/list/listColumns.tsx +67 -21
  49. package/src/list/listFields.spec.ts +15 -0
  50. package/src/list/listFields.ts +5 -0
  51. package/src/schemaForm/SchemaForm.flat.spec.tsx +27 -1
  52. package/src/schemaForm/index.tsx +32 -1
  53. package/types/FrappeTable.d.ts +1 -1
  54. package/types/FrappeTable.d.ts.map +1 -1
  55. package/types/list/listColumns.d.ts +9 -1
  56. package/types/list/listColumns.d.ts.map +1 -1
  57. package/types/list/listFields.d.ts.map +1 -1
  58. package/types/schemaForm/index.d.ts +5 -0
  59. package/types/schemaForm/index.d.ts.map +1 -1
@@ -14,6 +14,7 @@ import {
14
14
  Avatar,
15
15
  Anchor,
16
16
  Chip,
17
+ Image,
17
18
  Text,
18
19
  XStack,
19
20
  isWeb,
@@ -25,7 +26,7 @@ import {
25
26
  import { Button } from "@multiplatform.one/forms";
26
27
  import { ChatCircleIcon, HeartIcon } from "@phosphor-icons/react";
27
28
  import type { DataTableColumn } from "@multiplatform.one/table";
28
- import { formatAbsoluteDateTime } from "@multiplatform.one/theme";
29
+ import { formatAbsoluteDateTime, useLayoutSizeClass } from "@multiplatform.one/theme";
29
30
  import type { PermLevelMatrix } from "../formEngine/fieldPermissions";
30
31
  import type { DocFieldMeta, DoctypeMeta } from "../formEngine/doctypeMeta";
31
32
  // Field selection + permlevel pruning live in the pure listFields module
@@ -70,6 +71,19 @@ export interface BuildListColumnsArgs {
70
71
  * remaining values add (or toggle off) a tuple instead of opening the doc.
71
72
  */
72
73
  onFilterClick?: (fieldname: string, value: string) => void;
74
+ /**
75
+ * Site origin for relative `/files/...` image paths. With `meta.image_field`
76
+ * set, the list gets a `media` column: the document list's leading
77
+ * thumbnail (desk list_view fetches the image field the same way).
78
+ */
79
+ baseURL?: string;
80
+ }
81
+
82
+ /** A relative Frappe file path joined to the site origin. */
83
+ export function absoluteFileUrl(value: unknown, baseURL?: string): string | undefined {
84
+ if (typeof value !== "string" || value === "") return undefined;
85
+ if (/^(?:https?:|data:|blob:)/.test(value) || !baseURL) return value;
86
+ return `${baseURL.replace(/\/$/, "")}${value.startsWith("/") ? "" : "/"}${value}`;
73
87
  }
74
88
 
75
89
  const NUMERIC_FIELDTYPES = new Set(["Currency", "Float", "Int", "Percent", "Duration"]);
@@ -273,6 +287,7 @@ function ActivityCluster({
273
287
  onToggleLike?: (name: string, nextLiked: boolean) => void;
274
288
  likeOverrides?: Record<string, boolean>;
275
289
  }) {
290
+ const compact = useLayoutSizeClass() === "compact";
276
291
  const assignees = parseUserListField(doc._assign);
277
292
  const comments = commentCount(doc);
278
293
  const modified = doc.modified ? String(doc.modified) : "";
@@ -285,9 +300,13 @@ function ActivityCluster({
285
300
  minWidth={0}
286
301
  testID="list-activity"
287
302
  >
288
- {assignees.slice(0, 3).map((user) => (
289
- <Avatar key={user} name={user} size={20} circular aria-label={user} />
290
- ))}
303
+ {/* Desk hides assignees, comments and likes on phones
304
+ (list_view.js `list-row-activity hidden-xs`). */}
305
+ {compact
306
+ ? null
307
+ : assignees
308
+ .slice(0, 3)
309
+ .map((user) => <Avatar key={user} name={user} size={20} circular aria-label={user} />)}
291
310
  {modified ? (
292
311
  <Text
293
312
  fontSize="$2"
@@ -297,23 +316,27 @@ function ActivityCluster({
297
316
  {formatTimeAgo(modified)}
298
317
  </Text>
299
318
  ) : null}
300
- <XStack
301
- alignItems="center"
302
- gap="$1"
303
- {...({ "aria-label": t("list.comments", "Comments") } as Record<string, unknown>)}
304
- >
305
- <ChatCircleIcon size={14} />
306
- <Text fontSize="$2" color="$color9">
307
- {comments}
308
- </Text>
309
- </XStack>
310
- <LikeControl
311
- doc={doc}
312
- t={t}
313
- sessionUser={sessionUser}
314
- onToggleLike={onToggleLike}
315
- likeOverrides={likeOverrides}
316
- />
319
+ {compact ? null : (
320
+ <XStack
321
+ alignItems="center"
322
+ gap="$1"
323
+ {...({ "aria-label": t("list.comments", "Comments") } as Record<string, unknown>)}
324
+ >
325
+ <ChatCircleIcon size={14} />
326
+ <Text fontSize="$2" color="$color9">
327
+ {comments}
328
+ </Text>
329
+ </XStack>
330
+ )}
331
+ {compact ? null : (
332
+ <LikeControl
333
+ doc={doc}
334
+ t={t}
335
+ sessionUser={sessionUser}
336
+ onToggleLike={onToggleLike}
337
+ likeOverrides={likeOverrides}
338
+ />
339
+ )}
317
340
  </XStack>
318
341
  );
319
342
  }
@@ -409,9 +432,14 @@ export function buildListColumns({
409
432
  permMatrix,
410
433
  getDocHref,
411
434
  onFilterClick,
435
+ baseURL,
412
436
  }: BuildListColumnsArgs): DataTableColumn<ListRow>[] {
413
437
  const titleField = meta?.title_field || "name";
414
438
  const columns: DataTableColumn<ListRow>[] = [];
439
+ const imageField = meta?.image_field;
440
+ const imageMeta = imageField
441
+ ? meta?.fields?.find((field) => field.fieldname === imageField)
442
+ : undefined;
415
443
 
416
444
  const titleMeta = meta?.fields?.find((field) => field.fieldname === titleField);
417
445
  columns.push({
@@ -457,7 +485,25 @@ export function buildListColumns({
457
485
  },
458
486
  });
459
487
 
488
+ if (imageField) {
489
+ const label = imageMeta?.label || imageField;
490
+ columns.push({
491
+ id: imageField,
492
+ header: label,
493
+ accessorKey: imageField,
494
+ meta: { role: "media", label },
495
+ sortable: false,
496
+ filterable: false,
497
+ enableHiding: true,
498
+ cell: ({ getValue }) => {
499
+ const src = absoluteFileUrl(getValue(), baseURL);
500
+ return src ? <Image src={src} alt="" size="extraSmall" framed /> : null;
501
+ },
502
+ });
503
+ }
504
+
460
505
  for (const field of listViewFields(meta, titleField, permMatrix)) {
506
+ if (field.fieldname === imageField) continue;
461
507
  columns.push({
462
508
  id: field.fieldname,
463
509
  header: field.label || field.fieldname,
@@ -145,3 +145,18 @@ describe("listDocumentColumnIds desk list anatomy", () => {
145
145
  ]);
146
146
  });
147
147
  });
148
+
149
+ describe("listFieldsToFetch image field", () => {
150
+ it("fetches the doctype's image field like desk's list_view", () => {
151
+ const withImage: DoctypeMeta = {
152
+ name: "Pokemon",
153
+ title_field: "pokemon_name",
154
+ image_field: "sprite_front",
155
+ fields: [
156
+ { fieldname: "pokemon_name", fieldtype: "Data", label: "Pokemon Name", in_list_view: 1 },
157
+ { fieldname: "sprite_front", fieldtype: "Attach Image", label: "Sprite (Front)" },
158
+ ],
159
+ };
160
+ expect(listFieldsToFetch(withImage)).toContain("sprite_front");
161
+ });
162
+ });
@@ -26,6 +26,11 @@ export function listFieldsToFetch(meta?: DoctypeMeta, permMatrix?: PermLevelMatr
26
26
  "_comments",
27
27
  ]);
28
28
  if (meta?.title_field) fields.add(meta.title_field);
29
+ // Desk list_view.js fetches the image field beside the title field.
30
+ const image = meta?.image_field
31
+ ? meta.fields?.find((field) => field.fieldname === meta.image_field)
32
+ : undefined;
33
+ if (image && fieldLevelReadable(image, permMatrix)) fields.add(image.fieldname);
29
34
  for (const field of meta?.fields ?? []) {
30
35
  if (field.in_list_view && field.fieldname && fieldLevelReadable(field, permMatrix)) {
31
36
  fields.add(field.fieldname);
@@ -8,7 +8,7 @@ import { screen } from "@testing-library/react";
8
8
  import { renderWithProviders } from "@multiplatform.one/test-utils";
9
9
  import { describe, expect, it, vi } from "vitest";
10
10
  import type { FieldSchema } from "../fieldRegistry";
11
- import { SchemaForm, type FormSchema } from "./index";
11
+ import { SchemaForm, hugRuns, type FormSchema } from "./index";
12
12
 
13
13
  const vitals: FieldSchema[] = [
14
14
  { type: "Data", name: "pokemon_name", label: "Name" },
@@ -189,4 +189,30 @@ describe("flat columns", () => {
189
189
  expect(columns[0].textContent).toContain("Weight");
190
190
  expect(columns[1].textContent).toContain("Front");
191
191
  });
192
+
193
+ it("puts adjacent number fields in one wrapping row", () => {
194
+ renderCompact();
195
+ const runs = document.querySelectorAll("[data-mpo-schema-form-hug-run]");
196
+ expect(runs.length).toBe(1);
197
+ expect(runs[0].textContent).toContain("Height");
198
+ expect(runs[0].textContent).toContain("Weight");
199
+ expect(runs[0].textContent).not.toContain("Name");
200
+ });
201
+ });
202
+
203
+ describe("hugRuns", () => {
204
+ it("groups consecutive numbers and leaves other fields alone", () => {
205
+ const runs = hugRuns([
206
+ { type: "Int", name: "a", label: "A" },
207
+ { type: "Data", name: "b", label: "B" },
208
+ { type: "Int", name: "c", label: "C" },
209
+ { type: "Float", name: "d", label: "D" },
210
+ { type: "Currency", name: "e", label: "E" },
211
+ ]);
212
+ expect(runs.map((run) => run.map((field) => field.name))).toEqual([
213
+ ["a"],
214
+ ["b"],
215
+ ["c", "d", "e"],
216
+ ]);
217
+ });
192
218
  });
@@ -436,7 +436,21 @@ function SchemaFormSectionCard({
436
436
  data-mpo-schema-form-col=""
437
437
  data-mpo-schema-form-col-hug=""
438
438
  >
439
- {column.fields.map((field) => renderField(field))}
439
+ {hugRuns(column.fields).map((run) =>
440
+ run.length > 1 ? (
441
+ <XStack
442
+ key={run[0].name}
443
+ {...knobProps.gapLg}
444
+ flexWrap="wrap"
445
+ alignItems="flex-start"
446
+ data-mpo-schema-form-hug-run=""
447
+ >
448
+ {run.map((field) => renderField(field))}
449
+ </XStack>
450
+ ) : (
451
+ renderField(run[0])
452
+ ),
453
+ )}
440
454
  </YStack>
441
455
  ))}
442
456
  </XStack>
@@ -470,6 +484,23 @@ function SchemaFormSectionCard({
470
484
  );
471
485
  }
472
486
 
487
+ /**
488
+ * A flat column's adjacent number fields share one wrapping row: each hugs
489
+ * its value, so stacking them one per line leaves the row mostly empty.
490
+ */
491
+ export function hugRuns(fields: FieldSchema[]): FieldSchema[][] {
492
+ const runs: FieldSchema[][] = [];
493
+ for (const field of fields) {
494
+ const last = runs[runs.length - 1];
495
+ if (numericFieldTypes.has(field.type) && last && numericFieldTypes.has(last[0].type)) {
496
+ last.push(field);
497
+ } else {
498
+ runs.push([field]);
499
+ }
500
+ }
501
+ return runs;
502
+ }
503
+
473
504
  // Even columns split the row and stack under ~250px each (DG-FORM-09).
474
505
  const evenColumn = { flex: 1, flexBasis: 250, minWidth: 250, maxWidth: "100%" } as const;
475
506
  // Hugging columns take their fields' width and wrap when the row runs out;
@@ -91,7 +91,7 @@ export interface FrappeTableProps<TDoc extends {
91
91
  * Requires onStateChange for state sync; fetches data based on table state.
92
92
  */
93
93
  serverSide?: boolean;
94
- /** Infinite mode may omit totals when the host owns the count. */
94
+ /** Ask the server for a total (default true). Off when the host owns the count; either page mode then skips get_count. */
95
95
  fetchTotalCount?: boolean;
96
96
  /**
97
97
  * Callback when filters, sort, or pagination change.
@@ -1 +1 @@
1
- {"version":3,"file":"FrappeTable.d.ts","sourceRoot":"","sources":["../src/FrappeTable.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FrappeTable.d.ts","sourceRoot":"","sources":["../src/FrappeTable.tsx"],"names":[],"mappings":"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"}
@@ -34,8 +34,16 @@ export interface BuildListColumnsArgs {
34
34
  * remaining values add (or toggle off) a tuple instead of opening the doc.
35
35
  */
36
36
  onFilterClick?: (fieldname: string, value: string) => void;
37
+ /**
38
+ * Site origin for relative `/files/...` image paths. With `meta.image_field`
39
+ * set, the list gets a `media` column: the document list's leading
40
+ * thumbnail (desk list_view fetches the image field the same way).
41
+ */
42
+ baseURL?: string;
37
43
  }
44
+ /** A relative Frappe file path joined to the site origin. */
45
+ export declare function absoluteFileUrl(value: unknown, baseURL?: string): string | undefined;
38
46
  /** Build the DataTable columns for a doctype list from its meta. */
39
- export declare function buildListColumns({ meta, t, sessionUser, onToggleLike, likeOverrides, permMatrix, getDocHref, onFilterClick, }: BuildListColumnsArgs): DataTableColumn<ListRow>[];
47
+ export declare function buildListColumns({ meta, t, sessionUser, onToggleLike, likeOverrides, permMatrix, getDocHref, onFilterClick, baseURL, }: BuildListColumnsArgs): DataTableColumn<ListRow>[];
40
48
  export {};
41
49
  //# sourceMappingURL=listColumns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"listColumns.d.ts","sourceRoot":"","sources":["../../src/list/listColumns.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO3E,6EAA6E;AAC7E,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEvC,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,CAAC,EAAE,SAAS,CAAC;IACb,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1D,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5D;AAyUD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,CAAC,EACD,WAAW,EACX,YAAY,EACZ,aAAa,EACb,UAAU,EACV,UAAU,EACV,aAAa,GACd,EAAE,oBAAoB,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,CA0FnD"}
1
+ {"version":3,"file":"listColumns.d.ts","sourceRoot":"","sources":["../../src/list/listColumns.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO3E,6EAA6E;AAC7E,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEvC,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,CAAC,EAAE,SAAS,CAAC;IACb,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1D,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIpF;AAkVD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,CAAC,EACD,WAAW,EACX,YAAY,EACZ,aAAa,EACb,UAAU,EACV,UAAU,EACV,aAAa,EACb,OAAO,GACR,EAAE,oBAAoB,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,CAgHnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"listFields.d.ts","sourceRoot":"","sources":["../../src/list/listFields.ts"],"names":[],"mappings":"AAQA,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO3E,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,MAAM,EAAE,CAiB5F;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,eAAe,GAC3B,YAAY,EAAE,CAShB;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,MAAM,EAAE,CAOhG"}
1
+ {"version":3,"file":"listFields.d.ts","sourceRoot":"","sources":["../../src/list/listFields.ts"],"names":[],"mappings":"AAQA,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO3E,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,MAAM,EAAE,CAsB5F;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,eAAe,GAC3B,YAAY,EAAE,CAShB;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,MAAM,EAAE,CAOhG"}
@@ -99,4 +99,9 @@ export interface SchemaFormProps {
99
99
  layout?: "cards" | "flat";
100
100
  }
101
101
  export declare function SchemaForm({ schema, doc, setValue, errors, disabled, overrides, hideFields, readOnlyFields, requiredMarking, sectionHeadingLevel, renderFieldWrapper, order, layout, }: SchemaFormProps): import("react/jsx-runtime").JSX.Element;
102
+ /**
103
+ * A flat column's adjacent number fields share one wrapping row: each hugs
104
+ * its value, so stacking them one per line leaves the row mostly empty.
105
+ */
106
+ export declare function hugRuns(fields: FieldSchema[]): FieldSchema[][];
102
107
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemaForm/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAGlC,OAAO,KAAkB,MAAM,OAAO,CAAC;AAKvC,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGtE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAMxE,oEAAoE;AACpE,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,mEAAmE;AACnE,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,gEAAgE;IAChE,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,wDAAwD;AACxD,MAAM,MAAM,aAAa,GACrB,CAAC,CAAC,KAAK,EAAE,gBAAgB,KAAK,KAAK,CAAC,SAAS,CAAC,GAC9C;IAAE,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAA;CAAE,GACpD;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,CAAC;AAEnC,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,MAAM,EAAE,UAAU,CAAC;IACnB,4DAA4D;IAC5D,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzB,4CAA4C;IAC5C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,oBAAoB,CAAC;IACvC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,YAAY,CAAC;IACnC;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,KAAK,KAAK,CAAC,SAAS,CAAC;IACxF;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC3B;AAmCD,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,GAAG,EACH,QAAQ,EACR,MAAW,EACX,QAAgB,EAChB,SAAc,EACd,UAAe,EACf,cAAmB,EACnB,eAAwB,EACxB,mBAAuB,EACvB,kBAAkB,EAClB,KAAK,EACL,MAAgB,GACjB,EAAE,eAAe,2CAuKjB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemaForm/index.tsx"],"names":[],"mappings":"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"}