@hanzo/ui 8.4.12 → 8.5.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 (207) hide show
  1. package/dist/backends/gui/band.cjs +46 -0
  2. package/dist/backends/gui/band.d.ts +43 -0
  3. package/dist/backends/gui/band.d.ts.map +1 -0
  4. package/dist/backends/gui/band.js +44 -0
  5. package/dist/backends/gui/band.js.map +1 -0
  6. package/dist/backends/gui/index.cjs +15 -6
  7. package/dist/backends/gui/index.d.ts +5 -3
  8. package/dist/backends/gui/index.d.ts.map +1 -1
  9. package/dist/backends/gui/index.js +5 -3
  10. package/dist/backends/gui/index.js.map +1 -1
  11. package/dist/backends/gui/layout.cjs +12 -2
  12. package/dist/backends/gui/layout.d.ts +1 -1
  13. package/dist/backends/gui/layout.d.ts.map +1 -1
  14. package/dist/backends/gui/layout.js +11 -2
  15. package/dist/backends/gui/layout.js.map +1 -1
  16. package/dist/backends/gui/link.cjs +126 -0
  17. package/dist/backends/gui/link.d.ts +65 -0
  18. package/dist/backends/gui/link.d.ts.map +1 -0
  19. package/dist/backends/gui/link.js +88 -0
  20. package/dist/backends/gui/link.js.map +1 -0
  21. package/dist/backends/gui/prose.cjs +33 -0
  22. package/dist/backends/gui/prose.d.ts +39 -0
  23. package/dist/backends/gui/prose.d.ts.map +1 -0
  24. package/dist/backends/gui/prose.js +30 -0
  25. package/dist/backends/gui/prose.js.map +1 -0
  26. package/dist/backends/gui/video.cjs +89 -0
  27. package/dist/backends/gui/video.d.ts +33 -0
  28. package/dist/backends/gui/video.d.ts.map +1 -0
  29. package/dist/backends/gui/video.js +53 -0
  30. package/dist/backends/gui/video.js.map +1 -0
  31. package/dist/blocks/accordian.cjs +19 -0
  32. package/dist/blocks/accordian.d.ts +4 -0
  33. package/dist/blocks/accordian.d.ts.map +1 -0
  34. package/dist/blocks/accordian.js +16 -0
  35. package/dist/blocks/accordian.js.map +1 -0
  36. package/dist/blocks/bullet-cards.cjs +40 -0
  37. package/dist/blocks/bullet-cards.d.ts +10 -0
  38. package/dist/blocks/bullet-cards.d.ts.map +1 -0
  39. package/dist/blocks/bullet-cards.js +37 -0
  40. package/dist/blocks/bullet-cards.js.map +1 -0
  41. package/dist/blocks/card.cjs +58 -0
  42. package/dist/blocks/card.d.ts +14 -0
  43. package/dist/blocks/card.d.ts.map +1 -0
  44. package/dist/blocks/card.js +55 -0
  45. package/dist/blocks/card.js.map +1 -0
  46. package/dist/blocks/carte-blanche.cjs +38 -0
  47. package/dist/blocks/carte-blanche.d.ts +13 -0
  48. package/dist/blocks/carte-blanche.d.ts.map +1 -0
  49. package/dist/blocks/carte-blanche.js +35 -0
  50. package/dist/blocks/carte-blanche.js.map +1 -0
  51. package/dist/blocks/content.cjs +65 -0
  52. package/dist/blocks/content.d.ts +11 -0
  53. package/dist/blocks/content.d.ts.map +1 -0
  54. package/dist/blocks/content.js +61 -0
  55. package/dist/blocks/content.js.map +1 -0
  56. package/dist/blocks/cta.cjs +103 -0
  57. package/dist/blocks/cta.d.ts +13 -0
  58. package/dist/blocks/cta.d.ts.map +1 -0
  59. package/dist/blocks/cta.js +67 -0
  60. package/dist/blocks/cta.js.map +1 -0
  61. package/dist/blocks/def.cjs +24 -0
  62. package/dist/blocks/def.d.ts +191 -0
  63. package/dist/blocks/def.d.ts.map +1 -0
  64. package/dist/blocks/def.js +22 -0
  65. package/dist/blocks/def.js.map +1 -0
  66. package/dist/blocks/enh-heading.cjs +86 -0
  67. package/dist/blocks/enh-heading.d.ts +7 -0
  68. package/dist/blocks/enh-heading.d.ts.map +1 -0
  69. package/dist/blocks/enh-heading.js +83 -0
  70. package/dist/blocks/enh-heading.js.map +1 -0
  71. package/dist/blocks/grid.cjs +98 -0
  72. package/dist/blocks/grid.d.ts +18 -0
  73. package/dist/blocks/grid.d.ts.map +1 -0
  74. package/dist/blocks/grid.js +62 -0
  75. package/dist/blocks/grid.js.map +1 -0
  76. package/dist/blocks/group.cjs +43 -0
  77. package/dist/blocks/group.d.ts +4 -0
  78. package/dist/blocks/group.d.ts.map +1 -0
  79. package/dist/blocks/group.js +40 -0
  80. package/dist/blocks/group.js.map +1 -0
  81. package/dist/blocks/heading.cjs +22 -0
  82. package/dist/blocks/heading.d.ts +4 -0
  83. package/dist/blocks/heading.d.ts.map +1 -0
  84. package/dist/blocks/heading.js +19 -0
  85. package/dist/blocks/heading.js.map +1 -0
  86. package/dist/blocks/image.cjs +54 -0
  87. package/dist/blocks/image.d.ts +19 -0
  88. package/dist/blocks/image.d.ts.map +1 -0
  89. package/dist/blocks/image.js +51 -0
  90. package/dist/blocks/image.js.map +1 -0
  91. package/dist/blocks/index.cjs +65 -0
  92. package/dist/blocks/index.d.ts +18 -0
  93. package/dist/blocks/index.d.ts.map +1 -0
  94. package/dist/blocks/index.js +30 -0
  95. package/dist/blocks/index.js.map +1 -0
  96. package/dist/blocks/screenful.cjs +139 -0
  97. package/dist/blocks/screenful.d.ts +18 -0
  98. package/dist/blocks/screenful.d.ts.map +1 -0
  99. package/dist/blocks/screenful.js +103 -0
  100. package/dist/blocks/screenful.js.map +1 -0
  101. package/dist/blocks/space.cjs +38 -0
  102. package/dist/blocks/space.d.ts +4 -0
  103. package/dist/blocks/space.d.ts.map +1 -0
  104. package/dist/blocks/space.js +35 -0
  105. package/dist/blocks/space.js.map +1 -0
  106. package/dist/blocks/spec.cjs +58 -0
  107. package/dist/blocks/spec.d.ts +60 -0
  108. package/dist/blocks/spec.d.ts.map +1 -0
  109. package/dist/blocks/spec.js +52 -0
  110. package/dist/blocks/spec.js.map +1 -0
  111. package/dist/blocks/video.cjs +103 -0
  112. package/dist/blocks/video.d.ts +22 -0
  113. package/dist/blocks/video.d.ts.map +1 -0
  114. package/dist/blocks/video.js +67 -0
  115. package/dist/blocks/video.js.map +1 -0
  116. package/dist/gallery.cjs +1 -1
  117. package/dist/gallery.html +104 -7
  118. package/dist/gallery.js +2 -2
  119. package/dist/gallery.js.map +1 -1
  120. package/dist/index.cjs +12 -5
  121. package/dist/index.d.ts +1 -1
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +2 -2
  124. package/dist/index.js.map +1 -1
  125. package/dist/index.node.js +2 -2
  126. package/dist/primitives/ApplyTypography.cjs +8 -0
  127. package/dist/primitives/ApplyTypography.d.ts +2 -0
  128. package/dist/primitives/ApplyTypography.d.ts.map +1 -0
  129. package/dist/primitives/ApplyTypography.js +5 -0
  130. package/dist/primitives/ApplyTypography.js.map +1 -0
  131. package/dist/primitives/{Section.cjs → Band.cjs} +3 -3
  132. package/dist/primitives/Band.d.ts +2 -0
  133. package/dist/primitives/Band.d.ts.map +1 -0
  134. package/dist/primitives/{Section.js → Band.js} +2 -2
  135. package/dist/primitives/Band.js.map +1 -0
  136. package/dist/primitives/Fill.cjs +8 -0
  137. package/dist/primitives/Fill.d.ts +2 -0
  138. package/dist/primitives/Fill.d.ts.map +1 -0
  139. package/dist/primitives/Fill.js +5 -0
  140. package/dist/primitives/Fill.js.map +1 -0
  141. package/dist/primitives/Link.cjs +8 -0
  142. package/dist/primitives/Link.d.ts +2 -0
  143. package/dist/primitives/Link.d.ts.map +1 -0
  144. package/dist/primitives/Link.js +5 -0
  145. package/dist/primitives/Link.js.map +1 -0
  146. package/dist/primitives/LinkElement.cjs +8 -0
  147. package/dist/primitives/LinkElement.d.ts +2 -0
  148. package/dist/primitives/LinkElement.d.ts.map +1 -0
  149. package/dist/primitives/LinkElement.js +5 -0
  150. package/dist/primitives/LinkElement.js.map +1 -0
  151. package/dist/primitives/MDXLink.cjs +8 -0
  152. package/dist/primitives/MDXLink.d.ts +2 -0
  153. package/dist/primitives/MDXLink.d.ts.map +1 -0
  154. package/dist/primitives/MDXLink.js +5 -0
  155. package/dist/primitives/MDXLink.js.map +1 -0
  156. package/dist/primitives/Screen.cjs +8 -0
  157. package/dist/primitives/Screen.d.ts +2 -0
  158. package/dist/primitives/Screen.d.ts.map +1 -0
  159. package/dist/primitives/Screen.js +5 -0
  160. package/dist/primitives/Screen.js.map +1 -0
  161. package/dist/primitives/Separator.cjs +2 -2
  162. package/dist/primitives/Separator.d.ts +1 -1
  163. package/dist/primitives/Separator.d.ts.map +1 -1
  164. package/dist/primitives/Separator.js +1 -1
  165. package/dist/primitives/Separator.js.map +1 -1
  166. package/dist/primitives/VideoPlayer.cjs +8 -0
  167. package/dist/primitives/VideoPlayer.d.ts +2 -0
  168. package/dist/primitives/VideoPlayer.d.ts.map +1 -0
  169. package/dist/primitives/VideoPlayer.js +5 -0
  170. package/dist/primitives/VideoPlayer.js.map +1 -0
  171. package/dist/primitives/YouTubeEmbed.cjs +8 -0
  172. package/dist/primitives/YouTubeEmbed.d.ts +2 -0
  173. package/dist/primitives/YouTubeEmbed.d.ts.map +1 -0
  174. package/dist/primitives/YouTubeEmbed.js +5 -0
  175. package/dist/primitives/YouTubeEmbed.js.map +1 -0
  176. package/dist/primitives/useLink.cjs +8 -0
  177. package/dist/primitives/useLink.d.ts +2 -0
  178. package/dist/primitives/useLink.d.ts.map +1 -0
  179. package/dist/primitives/useLink.js +5 -0
  180. package/dist/primitives/useLink.js.map +1 -0
  181. package/dist/product/menu/items.d.ts +1 -1
  182. package/dist/product/menu/items.d.ts.map +1 -1
  183. package/dist/styles.css +101 -4
  184. package/dist/theme.css +101 -0
  185. package/dist/tw.cjs +52 -1
  186. package/dist/tw.d.ts.map +1 -1
  187. package/dist/tw.js +52 -1
  188. package/dist/tw.js.map +1 -1
  189. package/dist/types.cjs +32 -0
  190. package/dist/types.d.ts +136 -0
  191. package/dist/types.d.ts.map +1 -0
  192. package/dist/types.js +30 -0
  193. package/dist/types.js.map +1 -0
  194. package/package.json +29 -17
  195. package/dist/backends/gui/section.cjs +0 -39
  196. package/dist/backends/gui/section.d.ts +0 -29
  197. package/dist/backends/gui/section.d.ts.map +0 -1
  198. package/dist/backends/gui/section.js +0 -37
  199. package/dist/backends/gui/section.js.map +0 -1
  200. package/dist/backends/gui/separator.cjs +0 -10
  201. package/dist/backends/gui/separator.d.ts +0 -11
  202. package/dist/backends/gui/separator.d.ts.map +0 -1
  203. package/dist/backends/gui/separator.js +0 -8
  204. package/dist/backends/gui/separator.js.map +0 -1
  205. package/dist/primitives/Section.d.ts +0 -2
  206. package/dist/primitives/Section.d.ts.map +0 -1
  207. package/dist/primitives/Section.js.map +0 -1
@@ -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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"}
@@ -0,0 +1,65 @@
1
+ 'use client';"use strict";
2
+ // @hanzo/ui/blocks — content as data, and the renderers that draw it.
3
+ //
4
+ // import { Content, type Block } from '@hanzo/ui/blocks'
5
+ // <Content blocks={page} agent={agent} />
6
+ //
7
+ // A page is a `Block[]`. Each block names its type, the type picks a renderer,
8
+ // and the renderer reads the rest of the fields. So the content can be authored
9
+ // in a CMS, checked into a repo or produced by a server, and typed either way.
10
+ //
11
+ // The types and the components are both exported from here because the 5.x line
12
+ // exported them from here, and every consuming site imports both. `Block` is the
13
+ // type, `BlocksComponent` draws a list of them — the `…Component` suffix is what
14
+ // tells the two apart at a call site where both are in scope.
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
27
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.VideoBlockComponent = exports.SpaceBlockComponent = exports.ScreenfulBlockComponent = exports.ImageBlockComponent = exports.HeadingBlockComponent = exports.GroupBlockComponent = exports.GridBlockComponent = exports.EnhHeadingBlockComponent = exports.CTABlockComponent = exports.CarteBlancheBlockComponent = exports.CardBlockComponent = exports.BulletCardsBlockComponent = exports.AccordianBlockComponent = exports.registerBlockType = exports.ContentComponent = exports.BlocksComponent = exports.Content = exports.fit = exports.has = void 0;
31
+ __exportStar(require("./def.cjs"), exports);
32
+ var spec_1 = require("./spec.cjs");
33
+ Object.defineProperty(exports, "has", { enumerable: true, get: function () { return spec_1.has; } });
34
+ Object.defineProperty(exports, "fit", { enumerable: true, get: function () { return spec_1.fit; } });
35
+ var content_1 = require("./content.cjs");
36
+ Object.defineProperty(exports, "Content", { enumerable: true, get: function () { return content_1.Content; } });
37
+ Object.defineProperty(exports, "BlocksComponent", { enumerable: true, get: function () { return content_1.Content; } });
38
+ Object.defineProperty(exports, "ContentComponent", { enumerable: true, get: function () { return content_1.Content; } });
39
+ Object.defineProperty(exports, "registerBlockType", { enumerable: true, get: function () { return content_1.registerBlockType; } });
40
+ var accordian_1 = require("./accordian.cjs");
41
+ Object.defineProperty(exports, "AccordianBlockComponent", { enumerable: true, get: function () { return accordian_1.AccordianBlockComponent; } });
42
+ var bullet_cards_1 = require("./bullet-cards.cjs");
43
+ Object.defineProperty(exports, "BulletCardsBlockComponent", { enumerable: true, get: function () { return bullet_cards_1.BulletCardsBlockComponent; } });
44
+ var card_1 = require("./card.cjs");
45
+ Object.defineProperty(exports, "CardBlockComponent", { enumerable: true, get: function () { return card_1.CardBlockComponent; } });
46
+ var carte_blanche_1 = require("./carte-blanche.cjs");
47
+ Object.defineProperty(exports, "CarteBlancheBlockComponent", { enumerable: true, get: function () { return carte_blanche_1.CarteBlancheBlockComponent; } });
48
+ var cta_1 = require("./cta.cjs");
49
+ Object.defineProperty(exports, "CTABlockComponent", { enumerable: true, get: function () { return cta_1.CTABlockComponent; } });
50
+ var enh_heading_1 = require("./enh-heading.cjs");
51
+ Object.defineProperty(exports, "EnhHeadingBlockComponent", { enumerable: true, get: function () { return enh_heading_1.EnhHeadingBlockComponent; } });
52
+ var grid_1 = require("./grid.cjs");
53
+ Object.defineProperty(exports, "GridBlockComponent", { enumerable: true, get: function () { return grid_1.GridBlockComponent; } });
54
+ var group_1 = require("./group.cjs");
55
+ Object.defineProperty(exports, "GroupBlockComponent", { enumerable: true, get: function () { return group_1.GroupBlockComponent; } });
56
+ var heading_1 = require("./heading.cjs");
57
+ Object.defineProperty(exports, "HeadingBlockComponent", { enumerable: true, get: function () { return heading_1.HeadingBlockComponent; } });
58
+ var image_1 = require("./image.cjs");
59
+ Object.defineProperty(exports, "ImageBlockComponent", { enumerable: true, get: function () { return image_1.ImageBlockComponent; } });
60
+ var screenful_1 = require("./screenful.cjs");
61
+ Object.defineProperty(exports, "ScreenfulBlockComponent", { enumerable: true, get: function () { return screenful_1.ScreenfulBlockComponent; } });
62
+ var space_1 = require("./space.cjs");
63
+ Object.defineProperty(exports, "SpaceBlockComponent", { enumerable: true, get: function () { return space_1.SpaceBlockComponent; } });
64
+ var video_1 = require("./video.cjs");
65
+ Object.defineProperty(exports, "VideoBlockComponent", { enumerable: true, get: function () { return video_1.VideoBlockComponent; } });
@@ -0,0 +1,18 @@
1
+ export * from './def.js';
2
+ export type { BlockComponentProps } from './spec.js';
3
+ export { has, fit } from './spec.js';
4
+ export { Content, Content as BlocksComponent, Content as ContentComponent, registerBlockType } from './content.js';
5
+ export { AccordianBlockComponent } from './accordian.js';
6
+ export { BulletCardsBlockComponent } from './bullet-cards.js';
7
+ export { CardBlockComponent } from './card.js';
8
+ export { CarteBlancheBlockComponent } from './carte-blanche.js';
9
+ export { CTABlockComponent } from './cta.js';
10
+ export { EnhHeadingBlockComponent } from './enh-heading.js';
11
+ export { GridBlockComponent } from './grid.js';
12
+ export { GroupBlockComponent } from './group.js';
13
+ export { HeadingBlockComponent } from './heading.js';
14
+ export { ImageBlockComponent } from './image.js';
15
+ export { ScreenfulBlockComponent } from './screenful.js';
16
+ export { SpaceBlockComponent } from './space.js';
17
+ export { VideoBlockComponent } from './video.js';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/blocks/index.ts"],"names":[],"mappings":"AAcA,cAAc,OAAO,CAAA;AACrB,YAAY,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,OAAO,IAAI,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAE/G,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAA;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAA;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,30 @@
1
+ // @hanzo/ui/blocks — content as data, and the renderers that draw it.
2
+ //
3
+ // import { Content, type Block } from '@hanzo/ui/blocks'
4
+ // <Content blocks={page} agent={agent} />
5
+ //
6
+ // A page is a `Block[]`. Each block names its type, the type picks a renderer,
7
+ // and the renderer reads the rest of the fields. So the content can be authored
8
+ // in a CMS, checked into a repo or produced by a server, and typed either way.
9
+ //
10
+ // The types and the components are both exported from here because the 5.x line
11
+ // exported them from here, and every consuming site imports both. `Block` is the
12
+ // type, `BlocksComponent` draws a list of them — the `…Component` suffix is what
13
+ // tells the two apart at a call site where both are in scope.
14
+ export * from './def.js';
15
+ export { has, fit } from './spec.js';
16
+ export { Content, Content as BlocksComponent, Content as ContentComponent, registerBlockType } from './content.js';
17
+ export { AccordianBlockComponent } from './accordian.js';
18
+ export { BulletCardsBlockComponent } from './bullet-cards.js';
19
+ export { CardBlockComponent } from './card.js';
20
+ export { CarteBlancheBlockComponent } from './carte-blanche.js';
21
+ export { CTABlockComponent } from './cta.js';
22
+ export { EnhHeadingBlockComponent } from './enh-heading.js';
23
+ export { GridBlockComponent } from './grid.js';
24
+ export { GroupBlockComponent } from './group.js';
25
+ export { HeadingBlockComponent } from './heading.js';
26
+ export { ImageBlockComponent } from './image.js';
27
+ export { ScreenfulBlockComponent } from './screenful.js';
28
+ export { SpaceBlockComponent } from './space.js';
29
+ export { VideoBlockComponent } from './video.js';
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/blocks/index.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,EAAE;AACF,2DAA2D;AAC3D,4CAA4C;AAC5C,EAAE;AACF,+EAA+E;AAC/E,gFAAgF;AAChF,+EAA+E;AAC/E,EAAE;AACF,gFAAgF;AAChF,iFAAiF;AACjF,iFAAiF;AACjF,8DAA8D;AAE9D,cAAc,OAAO,CAAA;AAErB,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,OAAO,IAAI,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAE/G,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAA;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAA;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,139 @@
1
+ 'use client';"use strict";
2
+ 'use client';
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.ScreenfulBlockComponent = void 0;
38
+ const jsx_runtime_1 = require("react/jsx-runtime");
39
+ const React = __importStar(require("react"));
40
+ const prose_1 = require("../backends/gui/prose.cjs");
41
+ const box_1 = require("../box.cjs");
42
+ const cn_1 = require("../core/cn.cjs");
43
+ const content_1 = require("./content.cjs");
44
+ const spec_1 = require("./spec.cjs");
45
+ /**
46
+ * Is the element mostly on screen?
47
+ *
48
+ * Native IntersectionObserver rather than a package: this is the only place in
49
+ * the library that needs it, and the hook it would replace is fifteen lines.
50
+ * 0.75 because the caller is deciding whether to PLAY a video — a strip of it
51
+ * appearing at the edge of the viewport is not someone watching.
52
+ */
53
+ const useInView = (threshold = 0.75, initial = false) => {
54
+ const ref = React.useRef(null);
55
+ const [inView, setInView] = React.useState(initial);
56
+ React.useEffect(() => {
57
+ const el = ref.current;
58
+ if (!el || typeof IntersectionObserver === 'undefined')
59
+ return;
60
+ const io = new IntersectionObserver(([e]) => setInView(e.isIntersecting), { threshold });
61
+ io.observe(el);
62
+ return () => io.disconnect();
63
+ }, [threshold]);
64
+ return { ref, inView };
65
+ };
66
+ /**
67
+ * A background video that plays only while it is on screen.
68
+ *
69
+ * Mounted after the first client render, never on the server: a `<video>` in
70
+ * server markup is a download that starts before anything has decided the
71
+ * element is even visible.
72
+ */
73
+ const Backdrop = ({ block, className, initialInView, }) => {
74
+ const [mounted, setMounted] = React.useState(false);
75
+ const { ref, inView } = useInView(0.75, initialInView);
76
+ React.useEffect(() => setMounted(true), []);
77
+ if (!mounted)
78
+ return null;
79
+ return ((0, jsx_runtime_1.jsx)("div", { ref: ref, className: className, children: inView && ((0, jsx_runtime_1.jsx)("video", { autoPlay: true, loop: true, muted: true, playsInline: true, style: { margin: 0, height: '100%', width: '100%', objectFit: 'cover' }, children: block.sources?.map((src, i) => ((0, jsx_runtime_1.jsx)("source", { src: src }, i))) })) }));
80
+ };
81
+ /** The banner, as a still. It is also the video's first frame, so nothing jumps. */
82
+ const Poster = ({ banner, className, children, }) => banner ? ((0, jsx_runtime_1.jsx)(box_1.Box, { className: (0, cn_1.cn)('relative', className), style: {
83
+ height: '100%',
84
+ width: '100%',
85
+ backgroundImage: `url(${typeof banner === 'string' ? banner : banner.poster})`,
86
+ backgroundSize: 'cover',
87
+ backgroundRepeat: 'no-repeat',
88
+ }, children: children })) : ((0, jsx_runtime_1.jsx)(box_1.Box, { className: (0, cn_1.cn)('h-full w-full relative', className), children: children }));
89
+ /** One column of a screenful, placed by its own specifiers. */
90
+ const Column = ({ blocks, specifiers, agent, className, }) => {
91
+ const spec = (s) => (0, spec_1.has)(specifiers, s);
92
+ const phone = agent === 'phone';
93
+ const place = phone
94
+ ? (0, cn_1.cn)('items-start', spec('mobile-vert-center') ? 'justify-center' : 'justify-start')
95
+ : (0, cn_1.cn)(spec('right') ? 'items-end' : spec('center') ? 'items-center' : 'items-start', spec('bottom') ? 'justify-end' : spec('vert-center') ? 'justify-center' : 'justify-start',
96
+ // Right-aligned running text is hard to read at phone widths, so this
97
+ // is a desktop-only hint on purpose.
98
+ spec('text-align-right') ? 'text-right' : 'text-left');
99
+ // h-full is what makes the vertical placement above mean anything — without a
100
+ // height there is no free space for `justify-*` to distribute.
101
+ return ((0, jsx_runtime_1.jsx)(box_1.Box, { className: (0, cn_1.cn)('flex flex-col justify-center h-full', place, className), children: (0, jsx_runtime_1.jsx)(content_1.Content, { blocks: blocks, agent: agent }) }));
102
+ };
103
+ const Columns = ({ block: b, agent, className, }) => {
104
+ if (b.contentColumns.length === 1) {
105
+ return ((0, jsx_runtime_1.jsx)(Column, { blocks: b.contentColumns[0], specifiers: b.columnSpecifiers?.[0], agent: agent, className: className }));
106
+ }
107
+ // `order` is one-based in flex, and the 5.x original tested the index for
108
+ // truthiness — so the column asked to come FIRST was the one that never moved.
109
+ const order = (i) => {
110
+ const at = b.mobileOrder?.indexOf(i);
111
+ return at !== undefined && at >= 0 ? `order-${at + 1} md:order-none` : '';
112
+ };
113
+ return ((0, jsx_runtime_1.jsx)(box_1.Box, { className: (0, cn_1.cn)('flex flex-col gap-2 sm:gap-4 h-full', agent !== 'phone' && `md:grid md:gap-8 md:grid-cols-${b.contentColumns.length}`, className), children: b.contentColumns.map((column, i) => ((0, jsx_runtime_1.jsx)(Column, { blocks: column, specifiers: b.columnSpecifiers?.[i], agent: agent, className: order(i) }, i))) }));
114
+ };
115
+ /**
116
+ * One screenful: a full-height section, optionally over a banner, holding one
117
+ * to three columns of blocks.
118
+ *
119
+ * `snapTile` makes it a stop in a scroll-snapping sequence, which is why it
120
+ * fixes the height rather than setting a minimum — a snap point that can grow
121
+ * past the viewport can never be fully scrolled to.
122
+ */
123
+ const ScreenfulBlockComponent = ({ block, agent, initialInView = false, snapTile = false, className, contentClassName, bottom, }) => {
124
+ if (block.blockType !== 'screenful')
125
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "screenful block required" });
126
+ const b = block;
127
+ const spec = (s) => (0, spec_1.has)(b.specifiers, s);
128
+ const video = b.banner && typeof b.banner === 'object';
129
+ const oneColumn = b.contentColumns.length === 1;
130
+ const vertCenter = spec('vert-center');
131
+ const gutters = spec('narrow-gutters')
132
+ ? (0, cn_1.cn)('px-6 lg:px-8 2xl:px-2 pb-4 lg:pb-6 xl:pb-8', snapTile && 'pt-15 md:pt-26 lg:pt-28')
133
+ : spec('no-gutters')
134
+ ? (0, cn_1.cn)('px-0 pb-0', snapTile && 'pt-11 lg:pt-20')
135
+ : 'px-[8vw] xl:px-[1vw] pb-[8vh] pt-[calc(44px+4vh)] md:pt-[calc(80px+6vh)]';
136
+ return ((0, jsx_runtime_1.jsxs)(box_1.Box, { tag: "section", ...(b.anchorId ? { id: b.anchorId } : {}), className: (0, cn_1.cn)(snapTile ? 'snap-start snap-always h-[100vh]' : 'min-h-screen', bottom && 'flex flex-col', className), children: [(0, jsx_runtime_1.jsx)(prose_1.ApplyTypography, { className: (0, cn_1.cn)('w-full flex flex-row justify-center self-stretch', snapTile && (agent === 'desktop' ? 'h-full' : 'h-[100svh]'), bottom && 'grow'), children: (0, jsx_runtime_1.jsxs)(Poster, { banner: b.banner, children: [video && ((0, jsx_runtime_1.jsx)(Backdrop, { block: b.banner, className: "absolute top-0 left-0 bottom-0 right-0", initialInView: initialInView })), (0, jsx_runtime_1.jsxs)(box_1.Box, { className: (0, cn_1.cn)('xl:mx-auto overflow-y-hidden h-full', !spec('full-screen-width') && 'max-w-screen-xl', gutters, agent && agent !== 'desktop' && 'pt-15 sm:pt-17 pb-0 px-3 sm:px-8', snapTile ? 'absolute left-0 right-0 top-0 bottom-0' : 'flex min-h-screen w-full', contentClassName, vertCenter && (0, cn_1.cn)('self-center', oneColumn && 'py-0')), children: [(0, jsx_runtime_1.jsx)(Columns, { block: b, agent: agent, className: "w-full" }), b.footer] })] }) }), bottom] }));
137
+ };
138
+ exports.ScreenfulBlockComponent = ScreenfulBlockComponent;
139
+ exports.default = exports.ScreenfulBlockComponent;
@@ -0,0 +1,18 @@
1
+ import * as React from 'react';
2
+ import { type BlockComponentProps } from './spec.js';
3
+ /**
4
+ * One screenful: a full-height section, optionally over a banner, holding one
5
+ * to three columns of blocks.
6
+ *
7
+ * `snapTile` makes it a stop in a scroll-snapping sequence, which is why it
8
+ * fixes the height rather than setting a minimum — a snap point that can grow
9
+ * past the viewport can never be fully scrolled to.
10
+ */
11
+ export declare const ScreenfulBlockComponent: ({ block, agent, initialInView, snapTile, className, contentClassName, bottom, }: BlockComponentProps & {
12
+ initialInView?: boolean;
13
+ snapTile?: boolean;
14
+ contentClassName?: string;
15
+ bottom?: React.ReactNode;
16
+ }) => import("react/jsx-runtime").JSX.Element;
17
+ export default ScreenfulBlockComponent;
18
+ //# sourceMappingURL=screenful.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenful.d.ts","sourceRoot":"","sources":["../../src/blocks/screenful.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,OAAO,EAAE,KAAK,mBAAmB,EAAO,MAAM,QAAQ,CAAA;AA0KtD;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,oFAQjC,mBAAmB,GAAG;IACvB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CACzB,4CA2DA,CAAA;eAEc,uBAAuB"}