@forumone/throughline-design-system 2.3.1-pr-317-97d9e21 → 2.4.0-next-c49a98b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,19 @@
1
1
  # @forumone/throughline-design-system
2
2
 
3
- ## 2.3.1-pr-317-97d9e21
3
+ ## 2.4.0-next-c49a98b
4
+
5
+ ### Minor Changes
6
+
7
+ - c49a98b: A block with an empty required field no longer passes `check` or takes a page down (forumone-2026#840).
8
+
9
+ - **Publishing:** the composition step reports a `required-field` issue for each required field inside a block that is empty, for example "Block 3 (Featured Work) › Item 2 › Image is required before this can be published."
10
+ - `check`, `get_publish_status` and the admin's publish all see it before the write.
11
+ - Before this, only Payload's write enforced `required`, and `check` called such a page ready.
12
+ - The rule walks the block's Payload config. So a field the site adds counts, such as a form block's `source.form`. A field the site omits or hides doesn't. A required link counts too, because the contract says so even though a generated link enforces it with a validate.
13
+ - **Render:** `RenderBlocks` no longer renders a component whose required image didn't arrive, whether the slot is empty in a draft or the image no longer resolves.
14
+ - The component would read `item.image.src` from nothing and throw, and one card took Live Preview down to the error page.
15
+ - The new `onIncompleteBlock` decides what renders instead. It defaults to nothing.
16
+ - `missingRequiredImages` is exported for a host to ask the same question.
4
17
 
5
18
  ## 2.3.0
6
19
 
@@ -55,6 +55,23 @@ export interface RenderBlocksProps {
55
55
  * Applied before `slots`, so a route still outranks a block.
56
56
  */
57
57
  resolveProps?: (block: StoredBlock) => Record<string, unknown> | undefined;
58
+ /**
59
+ * What to render instead of a block whose required image did not arrive —
60
+ * an empty slot in a draft, or an image that no longer resolves.
61
+ *
62
+ * The component would throw on it (`item.image.src`) and take the page down
63
+ * with it, so it is never rendered with one missing. Defaults to rendering
64
+ * nothing; a host typically says what is missing in a draft and renders
65
+ * nothing on a published page. `missing` is the contract's paths, e.g.
66
+ * `items[1].image.src`. forumone-2026#840.
67
+ */
68
+ onIncompleteBlock?: (incomplete: IncompleteBlock) => ReactNode;
69
+ }
70
+ export interface IncompleteBlock {
71
+ blockType: string;
72
+ block: StoredBlock;
73
+ /** The required images that did not arrive, by contract path. */
74
+ missing: string[];
58
75
  }
59
76
  /**
60
77
  * Renders a stored `layout` as design-system components.
@@ -63,5 +80,5 @@ export interface RenderBlocksProps {
63
80
  * `'use client'`, so the boundary is drawn per component by the design system
64
81
  * rather than here — which is what keeps the rest out of the client bundle.
65
82
  */
66
- export declare function RenderBlocks({ blocks, registry, fields, context, onUnknownBlock, slots, resolveProps, }: RenderBlocksProps): JSX.Element | null;
83
+ export declare function RenderBlocks({ blocks, registry, fields, context, onUnknownBlock, slots, resolveProps, onIncompleteBlock, }: RenderBlocksProps): JSX.Element | null;
67
84
  //# sourceMappingURL=RenderBlocks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RenderBlocks.d.ts","sourceRoot":"","sources":["../../src/render/RenderBlocks.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAE7D,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI,GAAG,SAAS,CAAA;IACjD,uDAAuD;IACvD,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1E,oEAAoE;IACpE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;IAChD,OAAO,EAAE,aAAa,CAAA;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,CAAA;IACjD;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IACzD;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;CAC3E;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,EACR,MAAM,EACN,OAAO,EACP,cAAc,EACd,KAAK,EACL,YAAY,GACb,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CA2BxC"}
1
+ {"version":3,"file":"RenderBlocks.d.ts","sourceRoot":"","sources":["../../src/render/RenderBlocks.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAG7D,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI,GAAG,SAAS,CAAA;IACjD,uDAAuD;IACvD,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1E,oEAAoE;IACpE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;IAChD,OAAO,EAAE,aAAa,CAAA;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,CAAA;IACjD;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IACzD;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;IAC1E;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,SAAS,CAAA;CAC/D;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,WAAW,CAAA;IAClB,iEAAiE;IACjE,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,EACR,MAAM,EACN,OAAO,EACP,cAAc,EACd,KAAK,EACL,YAAY,EACZ,iBAAiB,GAClB,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAwCxC"}
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { Fragment } from 'react';
3
3
  import { coerceBlock } from './coerce.js';
4
+ import { missingRequiredImages } from './incomplete.js';
4
5
  /**
5
6
  * Renders a stored `layout` as design-system components.
6
7
  *
@@ -8,7 +9,7 @@ import { coerceBlock } from './coerce.js';
8
9
  * `'use client'`, so the boundary is drawn per component by the design system
9
10
  * rather than here — which is what keeps the rest out of the client bundle.
10
11
  */
11
- export function RenderBlocks({ blocks, registry, fields, context, onUnknownBlock, slots, resolveProps, }) {
12
+ export function RenderBlocks({ blocks, registry, fields, context, onUnknownBlock, slots, resolveProps, onIncompleteBlock, }) {
12
13
  if (!blocks || blocks.length === 0)
13
14
  return null;
14
15
  return (_jsx(_Fragment, { children: blocks.map((block, index) => {
@@ -25,6 +26,10 @@ export function RenderBlocks({ blocks, registry, fields, context, onUnknownBlock
25
26
  ...resolveProps?.(block),
26
27
  ...slots?.[block.blockType],
27
28
  };
29
+ const missing = missingRequiredImages(block.blockType, contractFields, props, context.overrides);
30
+ if (missing.length > 0) {
31
+ return (_jsx(Fragment, { children: onIncompleteBlock?.({ blockType: block.blockType, block, missing }) ?? null }, block.id ?? index));
32
+ }
28
33
  return _jsx(Component, { ...props }, block.id ?? index);
29
34
  }) }));
30
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RenderBlocks.js","sourceRoot":"","sources":["../../src/render/RenderBlocks.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAgD,MAAM,OAAO,CAAA;AAE9E,OAAO,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAA;AA2D7D;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,EACR,MAAM,EACN,OAAO,EACP,cAAc,EACd,KAAK,EACL,YAAY,GACM;IAClB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAE/C,OAAO,CACL,4BACG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC3B,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAC3C,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAE9C,IAAI,CAAC,SAAS,IAAI,CAAC,cAAc,EAAE,CAAC;gBAClC,OAAO,CACL,KAAC,QAAQ,cAA0B,cAAc,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,IAA7D,KAAK,CAAC,EAAE,IAAI,KAAK,CAAwD,CACzF,CAAA;YACH,CAAC;YAED;;kCAEsB;YACtB,MAAM,KAAK,GAAG;gBACZ,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC;gBAC/D,GAAG,YAAY,EAAE,CAAC,KAAK,CAAC;gBACxB,GAAG,KAAK,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;aAC5B,CAAA;YACD,OAAO,KAAC,SAAS,OAA6B,KAAK,IAA5B,KAAK,CAAC,EAAE,IAAI,KAAK,CAAe,CAAA;QACzD,CAAC,CAAC,GACD,CACJ,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"RenderBlocks.js","sourceRoot":"","sources":["../../src/render/RenderBlocks.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAgD,MAAM,OAAO,CAAA;AAE9E,OAAO,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AA6EvD;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,EACR,MAAM,EACN,OAAO,EACP,cAAc,EACd,KAAK,EACL,YAAY,EACZ,iBAAiB,GACC;IAClB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAE/C,OAAO,CACL,4BACG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC3B,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAC3C,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAE9C,IAAI,CAAC,SAAS,IAAI,CAAC,cAAc,EAAE,CAAC;gBAClC,OAAO,CACL,KAAC,QAAQ,cAA0B,cAAc,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,IAA7D,KAAK,CAAC,EAAE,IAAI,KAAK,CAAwD,CACzF,CAAA;YACH,CAAC;YAED;;kCAEsB;YACtB,MAAM,KAAK,GAAG;gBACZ,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC;gBAC/D,GAAG,YAAY,EAAE,CAAC,KAAK,CAAC;gBACxB,GAAG,KAAK,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;aAC5B,CAAA;YACD,MAAM,OAAO,GAAG,qBAAqB,CACnC,KAAK,CAAC,SAAS,EACf,cAAc,EACd,KAAK,EACL,OAAO,CAAC,SAAS,CAClB,CAAA;YACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CACL,KAAC,QAAQ,cACN,iBAAiB,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,IAAI,IAD/D,KAAK,CAAC,EAAE,IAAI,KAAK,CAErB,CACZ,CAAA;YACH,CAAC;YACD,OAAO,KAAC,SAAS,OAA6B,KAAK,IAA5B,KAAK,CAAC,EAAE,IAAI,KAAK,CAAe,CAAA;QACzD,CAAC,CAAC,GACD,CACJ,CAAA;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type Overrides } from '../overrides.js';
2
+ import type { ContentField } from '../generate/fields.js';
3
+ export declare function missingRequiredImages(component: string, fields: readonly ContentField[], props: Record<string, unknown>, overrides: Overrides, parentPath?: string, displayPath?: string): string[];
4
+ //# sourceMappingURL=incomplete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incomplete.d.ts","sourceRoot":"","sources":["../../src/render/incomplete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAyBzD,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,SAAS,EAAE,SAAS,EACpB,UAAU,SAAK,EACf,WAAW,SAAK,GACf,MAAM,EAAE,CAiDV"}
@@ -0,0 +1,65 @@
1
+ import { fieldOverride } from '../overrides.js';
2
+ /*
3
+ A block whose required image did not arrive. forumone-2026#840.
4
+
5
+ A component trusts its contract: an image the contract requires is read as
6
+ `item.image.src` with no guard, because a published block cannot lack one —
7
+ publishing refuses an empty required field. A draft can, by design, and so can
8
+ a published block whose image no longer resolves. Rendered anyway, the
9
+ component throws on `undefined.src`, and one card takes the whole page down
10
+ with it: Live Preview showed the site's error page for a landing page with one
11
+ empty image slot.
12
+
13
+ So the props are checked against the contract after coercion, which is when
14
+ "no usable image" is known — an id for a media document that is gone resolves
15
+ to nothing, exactly as an empty slot does — and the block is handed to the host
16
+ to decide about instead of to the component.
17
+
18
+ Images only, deliberately. A missing image is the shape that throws; an empty
19
+ required heading renders an empty heading, which the publish checks catch and
20
+ which does not take a page down.
21
+
22
+ Paths are the contract's names with row numbers, `items[1].image.src`, for a
23
+ host to put in front of an editor.
24
+ */
25
+ export function missingRequiredImages(component, fields, props, overrides, parentPath = '', displayPath = '') {
26
+ const out = [];
27
+ for (const field of fields) {
28
+ const path = parentPath ? `${parentPath}.${field.name}` : field.name;
29
+ const shown = displayPath ? `${displayPath}.${field.name}` : field.name;
30
+ const override = fieldOverride(overrides, component, path);
31
+ if (override?.omit || override?.as === 'icon')
32
+ continue;
33
+ const value = props[override?.propName ?? field.name];
34
+ if (field.type === 'image') {
35
+ if (field.required && (typeof value !== 'string' || value === ''))
36
+ out.push(shown);
37
+ continue;
38
+ }
39
+ if (field.type === 'group' && field.of) {
40
+ if (value && typeof value === 'object') {
41
+ out.push(...missingRequiredImages(component, field.of, value, overrides, path, shown));
42
+ }
43
+ else if (field.required && containsRequiredImage(field.of)) {
44
+ out.push(shown);
45
+ }
46
+ continue;
47
+ }
48
+ if (field.type === 'array' && field.of && Array.isArray(value)) {
49
+ value.forEach((row, index) => {
50
+ if (!row || typeof row !== 'object')
51
+ return;
52
+ out.push(...missingRequiredImages(component, field.of ?? [], row, overrides, path, `${shown}[${index}]`));
53
+ });
54
+ }
55
+ }
56
+ return out;
57
+ }
58
+ function containsRequiredImage(fields) {
59
+ return fields.some((field) => (field.type === 'image' && field.required) ||
60
+ (field.type === 'group' &&
61
+ field.required &&
62
+ field.of !== undefined &&
63
+ containsRequiredImage(field.of)));
64
+ }
65
+ //# sourceMappingURL=incomplete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incomplete.js","sourceRoot":"","sources":["../../src/render/incomplete.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export { coerceBlock } from './coerce.js';
2
2
  export type { CoerceContext, LinkValue, MediaLike } from './coerce.js';
3
3
  export { RenderBlocks } from './RenderBlocks.js';
4
- export type { RenderBlocksProps, StoredBlock } from './RenderBlocks.js';
4
+ export type { IncompleteBlock, RenderBlocksProps, StoredBlock } from './RenderBlocks.js';
5
+ export { missingRequiredImages } from './incomplete.js';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA"}
@@ -1,3 +1,4 @@
1
1
  export { coerceBlock } from './coerce.js';
2
2
  export { RenderBlocks } from './RenderBlocks.js';
3
+ export { missingRequiredImages } from './incomplete.js';
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forumone/throughline-design-system",
3
- "version": "2.3.1-pr-317-97d9e21",
3
+ "version": "2.4.0-next-c49a98b",
4
4
  "description": "The design-system side of Throughline: the component contract and manifest a design system publishes, its linter, and the Payload blocks, rendering and admin components generated from it.",
5
5
  "type": "module",
6
6
  "exports": {