@hanzo/ui 8.4.13 → 8.5.1

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 (161) hide show
  1. package/dist/backends/gui/index.cjs +11 -1
  2. package/dist/backends/gui/index.d.ts +3 -0
  3. package/dist/backends/gui/index.d.ts.map +1 -1
  4. package/dist/backends/gui/index.js +3 -0
  5. package/dist/backends/gui/index.js.map +1 -1
  6. package/dist/backends/gui/link.cjs +126 -0
  7. package/dist/backends/gui/link.d.ts +65 -0
  8. package/dist/backends/gui/link.d.ts.map +1 -0
  9. package/dist/backends/gui/link.js +88 -0
  10. package/dist/backends/gui/link.js.map +1 -0
  11. package/dist/backends/gui/prose.cjs +33 -0
  12. package/dist/backends/gui/prose.d.ts +39 -0
  13. package/dist/backends/gui/prose.d.ts.map +1 -0
  14. package/dist/backends/gui/prose.js +30 -0
  15. package/dist/backends/gui/prose.js.map +1 -0
  16. package/dist/backends/gui/video.cjs +89 -0
  17. package/dist/backends/gui/video.d.ts +33 -0
  18. package/dist/backends/gui/video.d.ts.map +1 -0
  19. package/dist/backends/gui/video.js +53 -0
  20. package/dist/backends/gui/video.js.map +1 -0
  21. package/dist/blocks/accordian.cjs +19 -0
  22. package/dist/blocks/accordian.d.ts +4 -0
  23. package/dist/blocks/accordian.d.ts.map +1 -0
  24. package/dist/blocks/accordian.js +16 -0
  25. package/dist/blocks/accordian.js.map +1 -0
  26. package/dist/blocks/bullet-cards.cjs +40 -0
  27. package/dist/blocks/bullet-cards.d.ts +10 -0
  28. package/dist/blocks/bullet-cards.d.ts.map +1 -0
  29. package/dist/blocks/bullet-cards.js +37 -0
  30. package/dist/blocks/bullet-cards.js.map +1 -0
  31. package/dist/blocks/card.cjs +58 -0
  32. package/dist/blocks/card.d.ts +14 -0
  33. package/dist/blocks/card.d.ts.map +1 -0
  34. package/dist/blocks/card.js +55 -0
  35. package/dist/blocks/card.js.map +1 -0
  36. package/dist/blocks/carte-blanche.cjs +38 -0
  37. package/dist/blocks/carte-blanche.d.ts +13 -0
  38. package/dist/blocks/carte-blanche.d.ts.map +1 -0
  39. package/dist/blocks/carte-blanche.js +35 -0
  40. package/dist/blocks/carte-blanche.js.map +1 -0
  41. package/dist/blocks/content.cjs +65 -0
  42. package/dist/blocks/content.d.ts +11 -0
  43. package/dist/blocks/content.d.ts.map +1 -0
  44. package/dist/blocks/content.js +61 -0
  45. package/dist/blocks/content.js.map +1 -0
  46. package/dist/blocks/cta.cjs +103 -0
  47. package/dist/blocks/cta.d.ts +13 -0
  48. package/dist/blocks/cta.d.ts.map +1 -0
  49. package/dist/blocks/cta.js +67 -0
  50. package/dist/blocks/cta.js.map +1 -0
  51. package/dist/blocks/def.cjs +24 -0
  52. package/dist/blocks/def.d.ts +191 -0
  53. package/dist/blocks/def.d.ts.map +1 -0
  54. package/dist/blocks/def.js +22 -0
  55. package/dist/blocks/def.js.map +1 -0
  56. package/dist/blocks/enh-heading.cjs +86 -0
  57. package/dist/blocks/enh-heading.d.ts +7 -0
  58. package/dist/blocks/enh-heading.d.ts.map +1 -0
  59. package/dist/blocks/enh-heading.js +83 -0
  60. package/dist/blocks/enh-heading.js.map +1 -0
  61. package/dist/blocks/grid.cjs +98 -0
  62. package/dist/blocks/grid.d.ts +18 -0
  63. package/dist/blocks/grid.d.ts.map +1 -0
  64. package/dist/blocks/grid.js +62 -0
  65. package/dist/blocks/grid.js.map +1 -0
  66. package/dist/blocks/group.cjs +43 -0
  67. package/dist/blocks/group.d.ts +4 -0
  68. package/dist/blocks/group.d.ts.map +1 -0
  69. package/dist/blocks/group.js +40 -0
  70. package/dist/blocks/group.js.map +1 -0
  71. package/dist/blocks/heading.cjs +22 -0
  72. package/dist/blocks/heading.d.ts +4 -0
  73. package/dist/blocks/heading.d.ts.map +1 -0
  74. package/dist/blocks/heading.js +19 -0
  75. package/dist/blocks/heading.js.map +1 -0
  76. package/dist/blocks/image.cjs +54 -0
  77. package/dist/blocks/image.d.ts +19 -0
  78. package/dist/blocks/image.d.ts.map +1 -0
  79. package/dist/blocks/image.js +51 -0
  80. package/dist/blocks/image.js.map +1 -0
  81. package/dist/blocks/index.cjs +65 -0
  82. package/dist/blocks/index.d.ts +18 -0
  83. package/dist/blocks/index.d.ts.map +1 -0
  84. package/dist/blocks/index.js +30 -0
  85. package/dist/blocks/index.js.map +1 -0
  86. package/dist/blocks/screenful.cjs +139 -0
  87. package/dist/blocks/screenful.d.ts +18 -0
  88. package/dist/blocks/screenful.d.ts.map +1 -0
  89. package/dist/blocks/screenful.js +103 -0
  90. package/dist/blocks/screenful.js.map +1 -0
  91. package/dist/blocks/space.cjs +38 -0
  92. package/dist/blocks/space.d.ts +4 -0
  93. package/dist/blocks/space.d.ts.map +1 -0
  94. package/dist/blocks/space.js +35 -0
  95. package/dist/blocks/space.js.map +1 -0
  96. package/dist/blocks/spec.cjs +58 -0
  97. package/dist/blocks/spec.d.ts +60 -0
  98. package/dist/blocks/spec.d.ts.map +1 -0
  99. package/dist/blocks/spec.js +52 -0
  100. package/dist/blocks/spec.js.map +1 -0
  101. package/dist/blocks/video.cjs +103 -0
  102. package/dist/blocks/video.d.ts +22 -0
  103. package/dist/blocks/video.d.ts.map +1 -0
  104. package/dist/blocks/video.js +67 -0
  105. package/dist/blocks/video.js.map +1 -0
  106. package/dist/gallery.html +102 -1
  107. package/dist/index.cjs +9 -2
  108. package/dist/index.d.ts +1 -1
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js +1 -1
  111. package/dist/index.js.map +1 -1
  112. package/dist/index.node.js +1 -1
  113. package/dist/primitives/ApplyTypography.cjs +8 -0
  114. package/dist/primitives/ApplyTypography.d.ts +2 -0
  115. package/dist/primitives/ApplyTypography.d.ts.map +1 -0
  116. package/dist/primitives/ApplyTypography.js +5 -0
  117. package/dist/primitives/ApplyTypography.js.map +1 -0
  118. package/dist/primitives/Link.cjs +8 -0
  119. package/dist/primitives/Link.d.ts +2 -0
  120. package/dist/primitives/Link.d.ts.map +1 -0
  121. package/dist/primitives/Link.js +5 -0
  122. package/dist/primitives/Link.js.map +1 -0
  123. package/dist/primitives/LinkElement.cjs +8 -0
  124. package/dist/primitives/LinkElement.d.ts +2 -0
  125. package/dist/primitives/LinkElement.d.ts.map +1 -0
  126. package/dist/primitives/LinkElement.js +5 -0
  127. package/dist/primitives/LinkElement.js.map +1 -0
  128. package/dist/primitives/MDXLink.cjs +8 -0
  129. package/dist/primitives/MDXLink.d.ts +2 -0
  130. package/dist/primitives/MDXLink.d.ts.map +1 -0
  131. package/dist/primitives/MDXLink.js +5 -0
  132. package/dist/primitives/MDXLink.js.map +1 -0
  133. package/dist/primitives/VideoPlayer.cjs +8 -0
  134. package/dist/primitives/VideoPlayer.d.ts +2 -0
  135. package/dist/primitives/VideoPlayer.d.ts.map +1 -0
  136. package/dist/primitives/VideoPlayer.js +5 -0
  137. package/dist/primitives/VideoPlayer.js.map +1 -0
  138. package/dist/primitives/YouTubeEmbed.cjs +8 -0
  139. package/dist/primitives/YouTubeEmbed.d.ts +2 -0
  140. package/dist/primitives/YouTubeEmbed.d.ts.map +1 -0
  141. package/dist/primitives/YouTubeEmbed.js +5 -0
  142. package/dist/primitives/YouTubeEmbed.js.map +1 -0
  143. package/dist/primitives/useLink.cjs +8 -0
  144. package/dist/primitives/useLink.d.ts +2 -0
  145. package/dist/primitives/useLink.d.ts.map +1 -0
  146. package/dist/primitives/useLink.js +5 -0
  147. package/dist/primitives/useLink.js.map +1 -0
  148. package/dist/product/menu/items.d.ts +1 -1
  149. package/dist/product/menu/items.d.ts.map +1 -1
  150. package/dist/styles.css +101 -0
  151. package/dist/theme.css +101 -0
  152. package/dist/tw.cjs +62 -1
  153. package/dist/tw.d.ts.map +1 -1
  154. package/dist/tw.js +62 -1
  155. package/dist/tw.js.map +1 -1
  156. package/dist/types.cjs +32 -0
  157. package/dist/types.d.ts +136 -0
  158. package/dist/types.d.ts.map +1 -0
  159. package/dist/types.js +30 -0
  160. package/dist/types.js.map +1 -0
  161. package/package.json +13 -1
@@ -0,0 +1,83 @@
1
+ 'use client';import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ApplyTypography } from '../backends/gui/prose.js';
3
+ import { Box } from '../box.js';
4
+ import { cn } from '../core/cn.js';
5
+ import { has } from './spec.js';
6
+ const DEFAULT = {
7
+ preheading: { tag: 'h4', mb: 2 },
8
+ heading: { tag: 'h1', mb: 2 },
9
+ byline: { tag: 'h6' },
10
+ };
11
+ /** 0 is a paragraph; 1–6 are the heading tags. */
12
+ const tag = (level, fallback) => level === undefined ? fallback : level >= 1 && level <= 6 ? `h${level}` : 'p';
13
+ /** An icon given as a url is drawn at `size`; given as a node it renders as-is. */
14
+ const Mark = ({ icon, size, phone, }) => {
15
+ if (!icon)
16
+ return null;
17
+ if (typeof icon === 'string') {
18
+ const s = phone ? size * 0.75 : size;
19
+ return _jsx(Box, { tag: "img", src: icon, width: s, height: s, alt: "" });
20
+ }
21
+ return _jsx(Box, { children: icon });
22
+ };
23
+ /**
24
+ * Where the three parts sit.
25
+ *
26
+ * The byline is tracked separately from the heading because it aligns
27
+ * independently — a centred heading over a left-aligned byline is a normal
28
+ * layout, and one value could not express it.
29
+ */
30
+ const place = (spec, phone) => {
31
+ const centre = spec('center');
32
+ const right = spec('right');
33
+ const at = (c, r) => c ? 'self-center text-center' : r ? 'self-end text-right' : 'self-start text-left';
34
+ let heading = at(centre, right);
35
+ let byline = at(spec('byline-center'), spec('byline-right'));
36
+ if (phone) {
37
+ if (spec('mobile-heading-left'))
38
+ heading = 'self-start text-left';
39
+ else
40
+ heading = at(spec('mobile-heading-centered') || centre, right);
41
+ if (spec('mobile-byline-left'))
42
+ byline = 'self-start text-left';
43
+ }
44
+ else if (spec('mobile-heading-centered')) {
45
+ // Centred on a phone, and whatever was asked for from `md` up.
46
+ heading = `self-center text-center ${heading.split(' ').map((c) => `md:${c}`).join(' ')}`;
47
+ }
48
+ return { heading, byline };
49
+ };
50
+ export const EnhHeadingBlockComponent = ({ block, className, agent, applyTypography = true, extraSpecifiers = '', }) => {
51
+ if (block.blockType !== 'enh-heading')
52
+ return _jsx(_Fragment, { children: "enh-heading block required" });
53
+ const b = block;
54
+ const spec = (s) => has(`${b.specifiers ?? ''} ${extraSpecifiers}`.trim(), s);
55
+ const phone = agent === 'phone';
56
+ const at = place(spec, phone);
57
+ const headFont = spec('preheading-heading-font') ? 'font-heading' : '';
58
+ const parts = [
59
+ b.preheading && {
60
+ Tag: tag(b.preheading.level, DEFAULT.preheading.tag),
61
+ cls: cn(`mb-${b.preheading.mb ?? DEFAULT.preheading.mb}`, at.heading, headFont),
62
+ text: b.preheading.text,
63
+ },
64
+ {
65
+ Tag: tag(b.heading.level, DEFAULT.heading.tag),
66
+ cls: cn(`mb-${b.heading.mb ?? DEFAULT.heading.mb}`, at.heading),
67
+ text: b.heading.text,
68
+ },
69
+ b.byline && {
70
+ Tag: tag(b.byline.level, DEFAULT.byline.tag),
71
+ cls: at.byline,
72
+ text: b.byline.text,
73
+ },
74
+ ].filter(Boolean);
75
+ // The icon rides the FIRST part that renders, whichever that turns out to be.
76
+ const inner = parts.map(({ Tag, cls, text }, i) => b.icon && i === 0 ? (_jsxs(Box, { className: cn('flex flex-row items-center gap-2 sm:gap-4', cls), children: [_jsx(Mark, { icon: b.icon, size: b.iconSize ?? 32, phone: phone }), _jsx(Box, { tag: Tag, children: text })] }, i)) : (_jsx(Box, { tag: Tag, className: cls, children: text }, i)));
77
+ // `gap-0` because each part carries its own bottom margin — a gap on the
78
+ // column would add to every one of them and double the spacing.
79
+ const cls = cn('flex flex-col w-full gap-0', className, spec('align-middle') && 'my-auto');
80
+ return applyTypography ? (_jsx(ApplyTypography, { className: cls, children: inner })) : (_jsx(Box, { className: cls, children: inner }));
81
+ };
82
+ export default EnhHeadingBlockComponent;
83
+ //# sourceMappingURL=enh-heading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enh-heading.js","sourceRoot":"","sources":["../../src/blocks/enh-heading.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ 'use client';"use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.GridBlockComponent = void 0;
37
+ const jsx_runtime_1 = require("react/jsx-runtime");
38
+ const React = __importStar(require("react"));
39
+ const box_1 = require("../box.cjs");
40
+ const cn_1 = require("../core/cn.cjs");
41
+ const content_1 = require("./content.cjs");
42
+ const spec_1 = require("./spec.cjs");
43
+ const cols = (d, at = '') => typeof d === 'number'
44
+ ? `${at}grid-cols-${d}`
45
+ : `${at}grid-cols-${d.columns} ${at}gap-${d.gap}`;
46
+ /**
47
+ * Cells drawn as a table: every cell carries its own right and bottom rule, and
48
+ * the edges of the whole are closed by the first row and first column adding
49
+ * theirs. Corners round outward only.
50
+ *
51
+ * Below `md` the grid is a single column, so the vertical rules are dropped and
52
+ * each cell keeps just its bottom one — which reads as a list, correctly.
53
+ */
54
+ const table = (i, count, columns) => {
55
+ const first = i < columns;
56
+ return (0, cn_1.cn)('border-b md:border-r p-4 md:p-8 lg:p-12', first && 'border-t', i % columns === 0 && 'md:border-l', i === 0 && 'md:rounded-tl-lg', i === columns - 1 && 'md:rounded-tr-lg', i === count - columns && 'md:rounded-bl-lg', i === count - 1 && 'md:rounded-br-lg');
57
+ };
58
+ /**
59
+ * Blocks laid out on a grid.
60
+ *
61
+ * Rendered with children, those replace `cells` — which is how BulletCards uses
62
+ * it: same layout, different cell content.
63
+ *
64
+ * The first rung in `grid.at` is written WITHOUT a prefix so the grid always has
65
+ * a base to fall back to, whichever rung a site chose to start at. The rest are
66
+ * prefixed and take over as the viewport grows.
67
+ */
68
+ const GridBlockComponent = ({ block, className, agent, children, }) => {
69
+ if (block.blockType !== 'grid')
70
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "grid block required" });
71
+ const { cells, grid, specifiers } = block;
72
+ let layout = '';
73
+ if (agent === 'phone') {
74
+ layout = cols(grid.mobile ?? grid.at.xs ?? grid.at.sm ?? 1);
75
+ }
76
+ else {
77
+ let base = false;
78
+ for (const [rung, spec] of Object.entries(grid.at)) {
79
+ layout += `${cols(spec, base ? `${rung}:` : '')} `;
80
+ base = true;
81
+ }
82
+ }
83
+ const ruled = (0, spec_1.has)(specifiers, 'style-table-borders');
84
+ let cell = (_) => '';
85
+ if (ruled && cells?.length) {
86
+ const md = grid.at.md;
87
+ const columns = typeof md === 'number' ? md : (md?.columns ?? 1);
88
+ cell = (i) => table(i, cells.length, columns);
89
+ }
90
+ return ((0, jsx_runtime_1.jsx)(box_1.Box, { className: (0, cn_1.cn)('grid gap-2 md:gap-4 xl:gap-6', layout,
91
+ // Ruled cells own their spacing: a gap would open a gutter through the
92
+ // rules and the table would stop reading as one.
93
+ ruled && 'gap-0 md:gap-0 xl:gap-0', className), children: React.Children.count(children) > 0
94
+ ? children
95
+ : cells?.map((c, i) => ((0, jsx_runtime_1.jsx)(content_1.Content, { blocks: c, agent: agent, className: cell(i) }, i))) }));
96
+ };
97
+ exports.GridBlockComponent = GridBlockComponent;
98
+ exports.default = exports.GridBlockComponent;
@@ -0,0 +1,18 @@
1
+ import * as React from 'react';
2
+ import type { Block, GridBlock } from './def.js';
3
+ import { type BlockComponentProps } from './spec.js';
4
+ /**
5
+ * Blocks laid out on a grid.
6
+ *
7
+ * Rendered with children, those replace `cells` — which is how BulletCards uses
8
+ * it: same layout, different cell content.
9
+ *
10
+ * The first rung in `grid.at` is written WITHOUT a prefix so the grid always has
11
+ * a base to fall back to, whichever rung a site chose to start at. The rest are
12
+ * prefixed and take over as the viewport grows.
13
+ */
14
+ export declare const GridBlockComponent: ({ block, className, agent, children, }: Omit<BlockComponentProps, 'block'> & React.PropsWithChildren<{
15
+ block: Block | GridBlock;
16
+ }>) => import("react/jsx-runtime").JSX.Element;
17
+ export default GridBlockComponent;
18
+ //# sourceMappingURL=grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../src/blocks/grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAE7C,OAAO,EAAE,KAAK,mBAAmB,EAAO,MAAM,QAAQ,CAAA;AA4BtD;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,2CAK5B,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,GACnC,KAAK,CAAC,iBAAiB,CAAC;IAAE,KAAK,EAAE,KAAK,GAAG,SAAS,CAAA;CAAE,CAAC,4CAyCtD,CAAA;eAEc,kBAAkB"}
@@ -0,0 +1,62 @@
1
+ 'use client';import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { Box } from '../box.js';
4
+ import { cn } from '../core/cn.js';
5
+ import { Content } from './content.js';
6
+ import { has } from './spec.js';
7
+ const cols = (d, at = '') => typeof d === 'number'
8
+ ? `${at}grid-cols-${d}`
9
+ : `${at}grid-cols-${d.columns} ${at}gap-${d.gap}`;
10
+ /**
11
+ * Cells drawn as a table: every cell carries its own right and bottom rule, and
12
+ * the edges of the whole are closed by the first row and first column adding
13
+ * theirs. Corners round outward only.
14
+ *
15
+ * Below `md` the grid is a single column, so the vertical rules are dropped and
16
+ * each cell keeps just its bottom one — which reads as a list, correctly.
17
+ */
18
+ const table = (i, count, columns) => {
19
+ const first = i < columns;
20
+ return cn('border-b md:border-r p-4 md:p-8 lg:p-12', first && 'border-t', i % columns === 0 && 'md:border-l', i === 0 && 'md:rounded-tl-lg', i === columns - 1 && 'md:rounded-tr-lg', i === count - columns && 'md:rounded-bl-lg', i === count - 1 && 'md:rounded-br-lg');
21
+ };
22
+ /**
23
+ * Blocks laid out on a grid.
24
+ *
25
+ * Rendered with children, those replace `cells` — which is how BulletCards uses
26
+ * it: same layout, different cell content.
27
+ *
28
+ * The first rung in `grid.at` is written WITHOUT a prefix so the grid always has
29
+ * a base to fall back to, whichever rung a site chose to start at. The rest are
30
+ * prefixed and take over as the viewport grows.
31
+ */
32
+ export const GridBlockComponent = ({ block, className, agent, children, }) => {
33
+ if (block.blockType !== 'grid')
34
+ return _jsx(_Fragment, { children: "grid block required" });
35
+ const { cells, grid, specifiers } = block;
36
+ let layout = '';
37
+ if (agent === 'phone') {
38
+ layout = cols(grid.mobile ?? grid.at.xs ?? grid.at.sm ?? 1);
39
+ }
40
+ else {
41
+ let base = false;
42
+ for (const [rung, spec] of Object.entries(grid.at)) {
43
+ layout += `${cols(spec, base ? `${rung}:` : '')} `;
44
+ base = true;
45
+ }
46
+ }
47
+ const ruled = has(specifiers, 'style-table-borders');
48
+ let cell = (_) => '';
49
+ if (ruled && cells?.length) {
50
+ const md = grid.at.md;
51
+ const columns = typeof md === 'number' ? md : (md?.columns ?? 1);
52
+ cell = (i) => table(i, cells.length, columns);
53
+ }
54
+ return (_jsx(Box, { className: cn('grid gap-2 md:gap-4 xl:gap-6', layout,
55
+ // Ruled cells own their spacing: a gap would open a gutter through the
56
+ // rules and the table would stop reading as one.
57
+ ruled && 'gap-0 md:gap-0 xl:gap-0', className), children: React.Children.count(children) > 0
58
+ ? children
59
+ : cells?.map((c, i) => (_jsx(Content, { blocks: c, agent: agent, className: cell(i) }, i))) }));
60
+ };
61
+ export default GridBlockComponent;
62
+ //# sourceMappingURL=grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.js","sourceRoot":"","sources":["../../src/blocks/grid.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ 'use client';"use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GroupBlockComponent = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const box_1 = require("../box.cjs");
6
+ const cn_1 = require("../core/cn.cjs");
7
+ const types_1 = require("../types.cjs");
8
+ const content_1 = require("./content.cjs");
9
+ /**
10
+ * Reads a layout hint: `layout-grid-3-starting-md` — three columns, from `md`
11
+ * up, one column below it.
12
+ *
13
+ * The bounds are real: one column is not a grid, and past six the cells are
14
+ * narrower than the words in them. Out of range returns nothing, and the block
15
+ * says so rather than rendering a layout nobody asked for.
16
+ */
17
+ const layout = (specifiers) => {
18
+ const hint = specifiers.split(/\s+/).find((t) => t.startsWith('layout-'));
19
+ if (!hint)
20
+ return undefined;
21
+ const [, kind, count, , from] = hint.split('-');
22
+ if (kind !== 'grid')
23
+ return undefined;
24
+ const columns = parseInt(count, 10);
25
+ if (Number.isNaN(columns) || columns < 2 || columns > 6)
26
+ return undefined;
27
+ if (!types_1.Breakpoints.includes(from))
28
+ return undefined;
29
+ return { columns, from: from };
30
+ };
31
+ const GroupBlockComponent = ({ block, className, agent }) => {
32
+ if (block.blockType !== 'group')
33
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "group block required" });
34
+ const b = block;
35
+ if (!b.specifiers?.includes('layout'))
36
+ return null;
37
+ const spec = layout(b.specifiers);
38
+ if (!spec)
39
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "invalid or missing layout specifier in group block" });
40
+ return ((0, jsx_runtime_1.jsx)(box_1.Box, { className: (0, cn_1.cn)('grid grid-cols-1 gap-2 sm:gap-3', `${spec.from}:grid-cols-${spec.columns}`, className), children: (0, jsx_runtime_1.jsx)(content_1.Content, { blocks: b.elements, agent: agent }) }));
41
+ };
42
+ exports.GroupBlockComponent = GroupBlockComponent;
43
+ exports.default = exports.GroupBlockComponent;
@@ -0,0 +1,4 @@
1
+ import type { BlockComponentProps } from './spec.js';
2
+ export declare const GroupBlockComponent: ({ block, className, agent }: BlockComponentProps) => import("react/jsx-runtime").JSX.Element | null;
3
+ export default GroupBlockComponent;
4
+ //# sourceMappingURL=group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../src/blocks/group.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAA;AAqBjD,eAAO,MAAM,mBAAmB,gCAAiC,mBAAmB,mDAoBnF,CAAA;eAEc,mBAAmB"}
@@ -0,0 +1,40 @@
1
+ 'use client';import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box } from '../box.js';
3
+ import { cn } from '../core/cn.js';
4
+ import { Breakpoints } from '../types.js';
5
+ import { Content } from './content.js';
6
+ /**
7
+ * Reads a layout hint: `layout-grid-3-starting-md` — three columns, from `md`
8
+ * up, one column below it.
9
+ *
10
+ * The bounds are real: one column is not a grid, and past six the cells are
11
+ * narrower than the words in them. Out of range returns nothing, and the block
12
+ * says so rather than rendering a layout nobody asked for.
13
+ */
14
+ const layout = (specifiers) => {
15
+ const hint = specifiers.split(/\s+/).find((t) => t.startsWith('layout-'));
16
+ if (!hint)
17
+ return undefined;
18
+ const [, kind, count, , from] = hint.split('-');
19
+ if (kind !== 'grid')
20
+ return undefined;
21
+ const columns = parseInt(count, 10);
22
+ if (Number.isNaN(columns) || columns < 2 || columns > 6)
23
+ return undefined;
24
+ if (!Breakpoints.includes(from))
25
+ return undefined;
26
+ return { columns, from: from };
27
+ };
28
+ export const GroupBlockComponent = ({ block, className, agent }) => {
29
+ if (block.blockType !== 'group')
30
+ return _jsx(_Fragment, { children: "group block required" });
31
+ const b = block;
32
+ if (!b.specifiers?.includes('layout'))
33
+ return null;
34
+ const spec = layout(b.specifiers);
35
+ if (!spec)
36
+ return _jsx(_Fragment, { children: "invalid or missing layout specifier in group block" });
37
+ return (_jsx(Box, { className: cn('grid grid-cols-1 gap-2 sm:gap-3', `${spec.from}:grid-cols-${spec.columns}`, className), children: _jsx(Content, { blocks: b.elements, agent: agent }) }));
38
+ };
39
+ export default GroupBlockComponent;
40
+ //# sourceMappingURL=group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.js","sourceRoot":"","sources":["../../src/blocks/group.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAGtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC;;;;;;;GAOG;AACH,MAAM,MAAM,GAAG,CAAC,UAAkB,EAAqD,EAAE;IACvF,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAA;IACzE,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAA;IAC3B,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,AAAD,EAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC/C,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,SAAS,CAAA;IACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACnC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IACzE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAkB,CAAC;QAAE,OAAO,SAAS,CAAA;IAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAkB,EAAE,CAAA;AAC9C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAuB,EAAE,EAAE;IACtF,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO;QAAE,OAAO,qDAAyB,CAAA;IACjE,MAAM,CAAC,GAAG,KAAmB,CAAA;IAE7B,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAA;IAElD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO,mFAAuD,CAAA;IAEzE,OAAO,CACL,KAAC,GAAG,IACF,SAAS,EAAE,EAAE,CACX,iCAAiC,EACjC,GAAG,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,OAAO,EAAE,EACxC,SAAS,CACV,YAED,KAAC,OAAO,IAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAI,GACzC,CACP,CAAA;AACH,CAAC,CAAA;AAED,eAAe,mBAAmB,CAAA"}
@@ -0,0 +1,22 @@
1
+ 'use client';"use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HeadingBlockComponent = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const prose_1 = require("../backends/gui/prose.cjs");
6
+ const box_1 = require("../box.cjs");
7
+ /** 0 is a paragraph; 1–6 are the heading tags. */
8
+ const tag = (level, fallback) => level === undefined ? fallback : level === 0 ? 'p' : `h${Math.min(6, Math.max(1, level))}`;
9
+ /** A byline sits two rungs below its heading unless it says otherwise. */
10
+ const BYLINE = {
11
+ p: 'p', h1: 'h3', h2: 'h4', h3: 'h5', h4: 'h6', h5: 'p', h6: 'p',
12
+ };
13
+ const HeadingBlockComponent = ({ block, className }) => {
14
+ if (block.blockType !== 'heading')
15
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "heading block required" });
16
+ const b = block;
17
+ const Head = tag(b.level, 'h3');
18
+ const Byline = b.bylineLevel !== undefined ? tag(b.bylineLevel, 'h5') : BYLINE[Head];
19
+ return ((0, jsx_runtime_1.jsxs)(prose_1.ApplyTypography, { className: className, children: [(0, jsx_runtime_1.jsx)(box_1.Box, { tag: Head, children: b.heading }), b.spaceBetween ? (0, jsx_runtime_1.jsx)(box_1.Box, { className: `w-[1px] h-${b.spaceBetween}` }) : null, b.byline && (0, jsx_runtime_1.jsx)(box_1.Box, { tag: Byline, children: b.byline }), b.spaceAfter ? (0, jsx_runtime_1.jsx)(box_1.Box, { className: `w-[1px] h-${b.spaceAfter}` }) : null] }));
20
+ };
21
+ exports.HeadingBlockComponent = HeadingBlockComponent;
22
+ exports.default = exports.HeadingBlockComponent;
@@ -0,0 +1,4 @@
1
+ import type { BlockComponentProps } from './spec.js';
2
+ export declare const HeadingBlockComponent: ({ block, className }: BlockComponentProps) => import("react/jsx-runtime").JSX.Element;
3
+ export default HeadingBlockComponent;
4
+ //# sourceMappingURL=heading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heading.d.ts","sourceRoot":"","sources":["../../src/blocks/heading.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAA;AAWjD,eAAO,MAAM,qBAAqB,yBAA0B,mBAAmB,4CAe9E,CAAA;eAEc,qBAAqB"}
@@ -0,0 +1,19 @@
1
+ 'use client';import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ApplyTypography } from '../backends/gui/prose.js';
3
+ import { Box } from '../box.js';
4
+ /** 0 is a paragraph; 1–6 are the heading tags. */
5
+ const tag = (level, fallback) => level === undefined ? fallback : level === 0 ? 'p' : `h${Math.min(6, Math.max(1, level))}`;
6
+ /** A byline sits two rungs below its heading unless it says otherwise. */
7
+ const BYLINE = {
8
+ p: 'p', h1: 'h3', h2: 'h4', h3: 'h5', h4: 'h6', h5: 'p', h6: 'p',
9
+ };
10
+ export const HeadingBlockComponent = ({ block, className }) => {
11
+ if (block.blockType !== 'heading')
12
+ return _jsx(_Fragment, { children: "heading block required" });
13
+ const b = block;
14
+ const Head = tag(b.level, 'h3');
15
+ const Byline = b.bylineLevel !== undefined ? tag(b.bylineLevel, 'h5') : BYLINE[Head];
16
+ return (_jsxs(ApplyTypography, { className: className, children: [_jsx(Box, { tag: Head, children: b.heading }), b.spaceBetween ? _jsx(Box, { className: `w-[1px] h-${b.spaceBetween}` }) : null, b.byline && _jsx(Box, { tag: Byline, children: b.byline }), b.spaceAfter ? _jsx(Box, { className: `w-[1px] h-${b.spaceAfter}` }) : null] }));
17
+ };
18
+ export default HeadingBlockComponent;
19
+ //# sourceMappingURL=heading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heading.js","sourceRoot":"","sources":["../../src/blocks/heading.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAI5B,kDAAkD;AAClD,MAAM,GAAG,GAAG,CAAC,KAAyB,EAAE,QAAgB,EAAU,EAAE,CAClE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAA;AAE5F,0EAA0E;AAC1E,MAAM,MAAM,GAA2B;IACrC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG;CACjE,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAuB,EAAE,EAAE;IACjF,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,uDAA2B,CAAA;IACrE,MAAM,CAAC,GAAG,KAAqB,CAAA;IAE/B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAEpF,OAAO,CACL,MAAC,eAAe,IAAC,SAAS,EAAE,SAAS,aACnC,KAAC,GAAG,IAAC,GAAG,EAAE,IAAY,YAAG,CAAC,CAAC,OAAO,GAAO,EACxC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAC,GAAG,IAAC,SAAS,EAAE,aAAa,CAAC,CAAC,YAAY,EAAE,GAAI,CAAC,CAAC,CAAC,IAAI,EACzE,CAAC,CAAC,MAAM,IAAI,KAAC,GAAG,IAAC,GAAG,EAAE,MAAc,YAAG,CAAC,CAAC,MAAM,GAAO,EACtD,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAC,GAAG,IAAC,SAAS,EAAE,aAAa,CAAC,CAAC,UAAU,EAAE,GAAI,CAAC,CAAC,CAAC,IAAI,IACtD,CACnB,CAAA;AACH,CAAC,CAAA;AAED,eAAe,qBAAqB,CAAA"}
@@ -0,0 +1,54 @@
1
+ 'use client';"use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ImageBlockComponent = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const box_1 = require("../box.cjs");
6
+ const cn_1 = require("../core/cn.cjs");
7
+ const spec_1 = require("./spec.cjs");
8
+ /** How much an unconstrained image shrinks on a phone. */
9
+ const PHONE = 0.75;
10
+ /**
11
+ * An image, sized before it loads.
12
+ *
13
+ * Width and height are always emitted — even when a style overrides them —
14
+ * because they are what lets the browser reserve the right box and not shift
15
+ * the page when the bytes arrive.
16
+ *
17
+ * This renders a plain `<img>`: nothing in this package imports a framework. A
18
+ * host that wants its own optimizing image registers one for this block type —
19
+ * `registerBlockType('image', MyImage)` — which is the same door every other
20
+ * substitution goes through.
21
+ */
22
+ const ImageBlockComponent = ({ block, className, agent, constrainTo, }) => {
23
+ if (block.blockType !== 'image')
24
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "image block required" });
25
+ const { src, alt, dim, props, sizes, fullWidthOnMobile, svgFillClass, specifiers } = block;
26
+ const spec = (s) => (0, spec_1.has)(specifiers, s);
27
+ const phone = agent === 'phone';
28
+ // The 5.x original read one past the end of the split, so every image without
29
+ // an explicit alt got `undefined` — silently, and only where it mattered.
30
+ const label = alt ?? (0, spec_1.name)(src);
31
+ const size = {};
32
+ if (props?.fill === undefined) {
33
+ const box = constrainTo ? (0, spec_1.fit)(dim, constrainTo) : dim;
34
+ size.width = box.w;
35
+ size.height = box.h;
36
+ }
37
+ if (sizes)
38
+ size.sizes = sizes;
39
+ if (phone && (spec('mobile-full-width') || fullWidthOnMobile)) {
40
+ return ((0, jsx_runtime_1.jsx)(box_1.Box, { className: "flex flex-col items-center w-full", children: (0, jsx_runtime_1.jsx)(box_1.Box, { tag: "img", src: src, alt: label, width: dim.w, height: dim.h, sizes: "100vw", style: { width: '100%', height: 'auto', maxWidth: 420 }, className: (0, cn_1.cn)(svgFillClass, className) }) }));
41
+ }
42
+ if (phone && !spec('mobile-no-scale') && props?.fill === undefined) {
43
+ const box = constrainTo ? (0, spec_1.fit)(dim, constrainTo) : dim;
44
+ size.width = box.w * PHONE;
45
+ size.height = box.h * PHONE;
46
+ }
47
+ const align = spec('right') ? 'self-end' : spec('center') ? 'self-center' : 'self-start';
48
+ if (props?.fill) {
49
+ return ((0, jsx_runtime_1.jsx)(box_1.Box, { className: "relative w-full h-full", children: (0, jsx_runtime_1.jsx)(box_1.Box, { tag: "img", src: src, alt: label, ...size, ...props, className: (0, cn_1.cn)(svgFillClass, 'max-w-[70vw] mx-auto', className) }) }));
50
+ }
51
+ return ((0, jsx_runtime_1.jsx)(box_1.Box, { tag: "img", src: src, alt: label, ...size, ...props, className: (0, cn_1.cn)(align, svgFillClass, 'max-w-[70vw] mx-auto', className) }));
52
+ };
53
+ exports.ImageBlockComponent = ImageBlockComponent;
54
+ exports.default = exports.ImageBlockComponent;
@@ -0,0 +1,19 @@
1
+ import type { Dimensions } from '../types.js';
2
+ import { type BlockComponentProps } from './spec.js';
3
+ /**
4
+ * An image, sized before it loads.
5
+ *
6
+ * Width and height are always emitted — even when a style overrides them —
7
+ * because they are what lets the browser reserve the right box and not shift
8
+ * the page when the bytes arrive.
9
+ *
10
+ * This renders a plain `<img>`: nothing in this package imports a framework. A
11
+ * host that wants its own optimizing image registers one for this block type —
12
+ * `registerBlockType('image', MyImage)` — which is the same door every other
13
+ * substitution goes through.
14
+ */
15
+ export declare const ImageBlockComponent: ({ block, className, agent, constrainTo, }: BlockComponentProps & {
16
+ constrainTo?: Dimensions;
17
+ }) => import("react/jsx-runtime").JSX.Element;
18
+ export default ImageBlockComponent;
19
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/blocks/image.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,OAAO,EAAE,KAAK,mBAAmB,EAAkB,MAAM,QAAQ,CAAA;AAKjE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,8CAK7B,mBAAmB,GAAG;IAAE,WAAW,CAAC,EAAE,UAAU,CAAA;CAAE,4CAqEpD,CAAA;eAEc,mBAAmB"}
@@ -0,0 +1,51 @@
1
+ 'use client';import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box } from '../box.js';
3
+ import { cn } from '../core/cn.js';
4
+ import { fit, has, name } from './spec.js';
5
+ /** How much an unconstrained image shrinks on a phone. */
6
+ const PHONE = 0.75;
7
+ /**
8
+ * An image, sized before it loads.
9
+ *
10
+ * Width and height are always emitted — even when a style overrides them —
11
+ * because they are what lets the browser reserve the right box and not shift
12
+ * the page when the bytes arrive.
13
+ *
14
+ * This renders a plain `<img>`: nothing in this package imports a framework. A
15
+ * host that wants its own optimizing image registers one for this block type —
16
+ * `registerBlockType('image', MyImage)` — which is the same door every other
17
+ * substitution goes through.
18
+ */
19
+ export const ImageBlockComponent = ({ block, className, agent, constrainTo, }) => {
20
+ if (block.blockType !== 'image')
21
+ return _jsx(_Fragment, { children: "image block required" });
22
+ const { src, alt, dim, props, sizes, fullWidthOnMobile, svgFillClass, specifiers } = block;
23
+ const spec = (s) => has(specifiers, s);
24
+ const phone = agent === 'phone';
25
+ // The 5.x original read one past the end of the split, so every image without
26
+ // an explicit alt got `undefined` — silently, and only where it mattered.
27
+ const label = alt ?? name(src);
28
+ const size = {};
29
+ if (props?.fill === undefined) {
30
+ const box = constrainTo ? fit(dim, constrainTo) : dim;
31
+ size.width = box.w;
32
+ size.height = box.h;
33
+ }
34
+ if (sizes)
35
+ size.sizes = sizes;
36
+ if (phone && (spec('mobile-full-width') || fullWidthOnMobile)) {
37
+ return (_jsx(Box, { className: "flex flex-col items-center w-full", children: _jsx(Box, { tag: "img", src: src, alt: label, width: dim.w, height: dim.h, sizes: "100vw", style: { width: '100%', height: 'auto', maxWidth: 420 }, className: cn(svgFillClass, className) }) }));
38
+ }
39
+ if (phone && !spec('mobile-no-scale') && props?.fill === undefined) {
40
+ const box = constrainTo ? fit(dim, constrainTo) : dim;
41
+ size.width = box.w * PHONE;
42
+ size.height = box.h * PHONE;
43
+ }
44
+ const align = spec('right') ? 'self-end' : spec('center') ? 'self-center' : 'self-start';
45
+ if (props?.fill) {
46
+ return (_jsx(Box, { className: "relative w-full h-full", children: _jsx(Box, { tag: "img", src: src, alt: label, ...size, ...props, className: cn(svgFillClass, 'max-w-[70vw] mx-auto', className) }) }));
47
+ }
48
+ return (_jsx(Box, { tag: "img", src: src, alt: label, ...size, ...props, className: cn(align, svgFillClass, 'max-w-[70vw] mx-auto', className) }));
49
+ };
50
+ export default ImageBlockComponent;
51
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/blocks/image.tsx"],"names":[],"mappings":"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"}