@01.software/sdk 0.25.0 → 0.26.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.
@@ -1,4 +1,4 @@
1
- import { C as CustomerProfile, a as CustomerProfileList, P as Post, b as Comment, R as Reaction, c as Config } from './payload-types-BaK4zCQ8.js';
1
+ import { C as CustomerProfile, a as CustomerProfileList, P as Post, b as Comment, R as Reaction, c as Config } from './payload-types-BF8VVFt6.js';
2
2
 
3
3
  type PublicCustomerProfile = Omit<CustomerProfile, 'tenant' | 'customer' | 'isPublic' | 'anonymizedAt' | 'metadata'>;
4
4
  type PublicProfileRelation = string | PublicCustomerProfile;
@@ -1,4 +1,4 @@
1
- import { C as CustomerProfile, a as CustomerProfileList, P as Post, b as Comment, R as Reaction, c as Config } from './payload-types-BaK4zCQ8.cjs';
1
+ import { C as CustomerProfile, a as CustomerProfileList, P as Post, b as Comment, R as Reaction, c as Config } from './payload-types-BF8VVFt6.cjs';
2
2
 
3
3
  type PublicCustomerProfile = Omit<CustomerProfile, 'tenant' | 'customer' | 'isPublic' | 'anonymizedAt' | 'metadata'>;
4
4
  type PublicProfileRelation = string | PublicCustomerProfile;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as Form } from '../payload-types-BaK4zCQ8.cjs';
2
+ import { F as Form } from '../payload-types-BF8VVFt6.cjs';
3
3
  import { RichTextData } from './rich-text.cjs';
4
4
  import '@payloadcms/richtext-lexical';
5
5
  import '@payloadcms/richtext-lexical/lexical';
package/dist/ui/form.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as Form } from '../payload-types-BaK4zCQ8.js';
2
+ import { F as Form } from '../payload-types-BF8VVFt6.js';
3
3
  import { RichTextData } from './rich-text.js';
4
4
  import '@payloadcms/richtext-lexical';
5
5
  import '@payloadcms/richtext-lexical/lexical';
@@ -195,6 +195,141 @@ function CodeView(props) {
195
195
  }
196
196
  return /* @__PURE__ */ import_react2.default.createElement("pre", { style: { overflow: "auto", whiteSpace: "pre-wrap" } }, /* @__PURE__ */ import_react2.default.createElement("code", { "data-language": language }, code));
197
197
  }
198
+ var carouselAspectRatios = {
199
+ "1:1": "1 / 1",
200
+ "3:4": "3 / 4",
201
+ "4:3": "4 / 3",
202
+ "16:9": "16 / 9"
203
+ };
204
+ function isPopulatedCarouselImage(image) {
205
+ return typeof image === "object" && image !== null && typeof image.url === "string" && image.url.trim().length > 0;
206
+ }
207
+ function isSafeCarouselHref(href) {
208
+ if (!href) return false;
209
+ return /^(https?:\/\/|\/|#|mailto:|tel:)/.test(href);
210
+ }
211
+ function getRenderableCarouselSlides(slides) {
212
+ return (slides ?? []).reduce((valid, slide) => {
213
+ if (!isPopulatedCarouselImage(slide.image)) return valid;
214
+ valid.push({ ...slide, image: slide.image });
215
+ return valid;
216
+ }, []);
217
+ }
218
+ function CarouselView(props) {
219
+ const fields = getBlockFields(props);
220
+ const reactId = import_react2.default.useId().replace(/[^a-zA-Z0-9_-]/g, "");
221
+ const slides = getRenderableCarouselSlides(fields.slides);
222
+ if (slides.length === 0) {
223
+ if (props.isEditor) {
224
+ const { BlockCollapsible } = props.useBlockComponentContext();
225
+ return /* @__PURE__ */ import_react2.default.createElement(BlockCollapsible, { className: props.className }, /* @__PURE__ */ import_react2.default.createElement("p", { style: { margin: 0 } }, "Carousel block has no populated images."));
226
+ }
227
+ return null;
228
+ }
229
+ const aspectRatio = carouselAspectRatios[fields.aspectRatio ?? "16:9"] ?? carouselAspectRatios["16:9"];
230
+ const objectFit = fields.fit === "contain" ? "contain" : "cover";
231
+ const showCaptions = fields.showCaptions !== false;
232
+ const showControls = fields.showControls !== false && slides.length > 1;
233
+ const showDots = fields.showDots !== false && slides.length > 1;
234
+ const content = /* @__PURE__ */ import_react2.default.createElement(
235
+ "div",
236
+ {
237
+ "aria-label": fields.blockName ?? "Image carousel",
238
+ role: "group",
239
+ style: { margin: 0 }
240
+ },
241
+ /* @__PURE__ */ import_react2.default.createElement(
242
+ "div",
243
+ {
244
+ style: {
245
+ display: "flex",
246
+ gap: 12,
247
+ overflowX: "auto",
248
+ scrollSnapType: "x mandatory"
249
+ }
250
+ },
251
+ slides.map((slide, index) => {
252
+ const slideId = `${reactId}-carousel-slide-${index + 1}`;
253
+ const previousSlideId = `${reactId}-carousel-slide-${index === 0 ? slides.length : index}`;
254
+ const nextSlideId = `${reactId}-carousel-slide-${index === slides.length - 1 ? 1 : index + 2}`;
255
+ const image = slide.image;
256
+ const imageElement = /* @__PURE__ */ import_react2.default.createElement(
257
+ "img",
258
+ {
259
+ src: image.url,
260
+ alt: slide.alt ?? image.alt ?? "",
261
+ width: image.width ?? void 0,
262
+ height: image.height ?? void 0,
263
+ loading: "lazy",
264
+ style: {
265
+ aspectRatio,
266
+ background: "Canvas",
267
+ display: "block",
268
+ height: "auto",
269
+ objectFit,
270
+ width: "100%"
271
+ }
272
+ }
273
+ );
274
+ return /* @__PURE__ */ import_react2.default.createElement(
275
+ "figure",
276
+ {
277
+ id: slideId,
278
+ key: slideId,
279
+ style: {
280
+ flex: "0 0 100%",
281
+ margin: 0,
282
+ minWidth: 0,
283
+ scrollSnapAlign: "start"
284
+ }
285
+ },
286
+ isSafeCarouselHref(slide.href) ? /* @__PURE__ */ import_react2.default.createElement("a", { href: slide.href }, imageElement) : imageElement,
287
+ showCaptions && slide.caption ? /* @__PURE__ */ import_react2.default.createElement("figcaption", { style: { marginTop: 8 } }, slide.caption) : null,
288
+ showControls ? /* @__PURE__ */ import_react2.default.createElement(
289
+ "nav",
290
+ {
291
+ "aria-label": `Carousel controls for slide ${index + 1}`,
292
+ style: {
293
+ display: "flex",
294
+ gap: 8,
295
+ justifyContent: "space-between",
296
+ marginTop: 8
297
+ }
298
+ },
299
+ /* @__PURE__ */ import_react2.default.createElement("a", { "aria-label": "Previous slide", href: `#${previousSlideId}` }, "Previous"),
300
+ /* @__PURE__ */ import_react2.default.createElement("a", { "aria-label": "Next slide", href: `#${nextSlideId}` }, "Next")
301
+ ) : null
302
+ );
303
+ })
304
+ ),
305
+ showDots ? /* @__PURE__ */ import_react2.default.createElement(
306
+ "nav",
307
+ {
308
+ "aria-label": "Carousel slide navigation",
309
+ style: {
310
+ display: "flex",
311
+ gap: 8,
312
+ justifyContent: "center",
313
+ marginTop: 8
314
+ }
315
+ },
316
+ slides.map((_, index) => /* @__PURE__ */ import_react2.default.createElement(
317
+ "a",
318
+ {
319
+ "aria-label": `Go to slide ${index + 1}`,
320
+ href: `#${reactId}-carousel-slide-${index + 1}`,
321
+ key: `${reactId}-carousel-dot-${index + 1}`
322
+ },
323
+ index + 1
324
+ ))
325
+ ) : null
326
+ );
327
+ if (props.isEditor) {
328
+ const { BlockCollapsible } = props.useBlockComponentContext();
329
+ return /* @__PURE__ */ import_react2.default.createElement(BlockCollapsible, { className: props.className }, content);
330
+ }
331
+ return content;
332
+ }
198
333
  function IframeView(props) {
199
334
  const fields = getBlockFields(props);
200
335
  const url = fields.url ?? "";
@@ -321,6 +456,9 @@ var richTextTextState = {
321
456
  };
322
457
  var richTextNodeMap = {
323
458
  blocks: {
459
+ Carousel: {
460
+ Block: CarouselView
461
+ },
324
462
  Code: {
325
463
  Block: CodeView
326
464
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/RichText/index.tsx","../../src/ui/RichText/styled.tsx","../../src/ui/RichText/views.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\nimport type {\n LexicalEditorNodeMap,\n SerializedBlockNode,\n SerializedLinkNode,\n} from '@payloadcms/richtext-lexical'\nimport type {\n SerializedEditorState,\n SerializedLexicalNode,\n} from '@payloadcms/richtext-lexical/lexical'\nimport {\n defaultJSXConverters,\n LinkJSXConverter,\n RichText,\n TextJSXConverter,\n} from '@payloadcms/richtext-lexical/react'\nimport type {\n JSXConverter,\n JSXConverters,\n} from '@payloadcms/richtext-lexical/react'\n\n/**\n * Accepts both Lexical's strict `SerializedEditorState` and Payload's generated\n * richText type (which includes index signatures like `[k: string]: unknown`).\n */\nexport type RichTextData =\n | SerializedEditorState<SerializedLexicalNode>\n | {\n root: {\n type: string\n children: { type: string; version: number; [k: string]: unknown }[]\n direction: string | null\n format: string\n indent: number\n version: number\n [k: string]: unknown\n }\n [k: string]: unknown\n }\n\nexport type TextStateConfig = {\n [stateKey: string]: {\n [stateValue: string]: {\n css: Record<string, string>\n label: string\n }\n }\n}\n\nexport interface RichTextContentProps {\n data: RichTextData\n className?: string\n internalDocToHref?: (args: { linkNode: SerializedLinkNode }) => string\n converters?: Partial<JSXConverters>\n blocks?: Record<string, JSXConverter<SerializedBlockNode>>\n disableDefaultConverters?: boolean\n nodeMap?: LexicalEditorNodeMap\n textState?: TextStateConfig\n}\n\nexport { StyledRichTextContent } from './styled'\nexport { richTextNodeMap, richTextTextState, richTextViewMap } from './views'\nexport type {\n RichTextComponents,\n StyledRichTextContentProps,\n HeadingSlotProps,\n ParagraphSlotProps,\n BlockquoteSlotProps,\n ListSlotProps,\n ListItemSlotProps,\n LinkSlotProps,\n HorizontalRuleSlotProps,\n UploadSlotProps,\n TableSlotProps,\n TableRowSlotProps,\n TableCellSlotProps,\n} from './styled'\n\nfunction hyphenToCamel(str: string): string {\n return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase())\n}\n\nfunction createTextStateConverter(\n state: TextStateConfig,\n): JSXConverters['text'] {\n const defaultTextConverter = TextJSXConverter.text\n // eslint-disable-next-line react/display-name\n return ({ node, ...rest }) => {\n const base = (\n defaultTextConverter as (...args: unknown[]) => React.ReactNode\n )({ node, ...rest })\n const nodeState = (node as Record<string, unknown>).$ as\n | Record<string, string>\n | undefined\n if (!nodeState || typeof nodeState !== 'object') return base\n\n const style: Record<string, string> = {}\n for (const stateKey in nodeState) {\n const stateValue = nodeState[stateKey]\n if (!stateValue) continue\n const css = state[stateKey]?.[stateValue]?.css\n if (css) {\n for (const prop in css) {\n const val = css[prop]\n if (val) style[hyphenToCamel(prop)] = val\n }\n }\n }\n\n if (Object.keys(style).length === 0) return base\n return <span style={style}>{base}</span>\n }\n}\n\nexport function RichTextContent({\n data,\n className,\n internalDocToHref,\n converters,\n blocks,\n disableDefaultConverters,\n nodeMap,\n textState,\n}: RichTextContentProps) {\n const baseConverters: JSXConverters = {\n ...(disableDefaultConverters ? {} : defaultJSXConverters),\n ...LinkJSXConverter({ internalDocToHref }),\n ...(textState ? { text: createTextStateConverter(textState) } : {}),\n ...converters,\n ...(blocks ? { blocks } : {}),\n }\n\n return (\n <RichText\n data={data as SerializedEditorState<SerializedLexicalNode>}\n className={className}\n converters={baseConverters}\n nodeMap={nodeMap}\n />\n )\n}\n","'use client'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React from 'react'\nimport { SerializedLinkNode } from '@payloadcms/richtext-lexical'\nimport { JSXConverters } from '@payloadcms/richtext-lexical/react'\nimport { RichTextContent, RichTextContentProps } from './index'\n\n// --- Slot prop types (each slot gets structured data + raw node) ---\n\nexport interface HeadingSlotProps {\n tag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'\n children: React.ReactNode\n node: any\n}\n\nexport interface ParagraphSlotProps {\n children: React.ReactNode\n isEmpty: boolean\n node: any\n}\n\nexport interface BlockquoteSlotProps {\n children: React.ReactNode\n node: any\n}\n\nexport interface ListSlotProps {\n tag: 'ul' | 'ol'\n listType: string\n children: React.ReactNode\n node: any\n}\n\nexport interface ListItemSlotProps {\n children: React.ReactNode\n hasSubLists: boolean\n checked?: boolean\n value?: number\n node: any\n}\n\nexport interface LinkSlotProps {\n href: string\n target?: string\n rel?: string\n children: React.ReactNode\n node: any\n}\n\nexport interface HorizontalRuleSlotProps {\n node?: any\n}\n\nexport interface UploadSlotProps {\n src: string\n alt: string\n width?: number\n height?: number\n mimeType: string\n filename: string\n sizes?: Record<string, any>\n node: any\n}\n\nexport interface TableSlotProps {\n children: React.ReactNode\n node: any\n}\n\nexport interface TableRowSlotProps {\n children: React.ReactNode\n node: any\n}\n\nexport interface TableCellSlotProps {\n tag: 'th' | 'td'\n children: React.ReactNode\n colSpan?: number\n rowSpan?: number\n backgroundColor?: string\n node: any\n}\n\n// --- Components map ---\n\nexport interface RichTextComponents {\n Heading?: React.ComponentType<HeadingSlotProps>\n Paragraph?: React.ComponentType<ParagraphSlotProps>\n Blockquote?: React.ComponentType<BlockquoteSlotProps>\n List?: React.ComponentType<ListSlotProps>\n ListItem?: React.ComponentType<ListItemSlotProps>\n Link?: React.ComponentType<LinkSlotProps>\n HorizontalRule?: React.ComponentType<HorizontalRuleSlotProps>\n Upload?: React.ComponentType<UploadSlotProps>\n Table?: React.ComponentType<TableSlotProps>\n TableRow?: React.ComponentType<TableRowSlotProps>\n TableCell?: React.ComponentType<TableCellSlotProps>\n}\n\nexport interface StyledRichTextContentProps extends Omit<\n RichTextContentProps,\n 'converters' | 'disableDefaultConverters'\n> {\n components?: RichTextComponents\n}\n\nfunction createComponentConverters(\n components: RichTextComponents,\n internalDocToHref?: (args: { linkNode: SerializedLinkNode }) => string,\n): Partial<JSXConverters> {\n const converters: Partial<JSXConverters> = {}\n\n if (components.Heading) {\n const Heading = components.Heading\n converters.heading = ({ node, nodesToJSX }) => (\n <Heading tag={node.tag} node={node}>\n {nodesToJSX({ nodes: node.children })}\n </Heading>\n )\n }\n\n if (components.Paragraph) {\n const Paragraph = components.Paragraph\n converters.paragraph = ({ node, nodesToJSX }) => {\n const children = nodesToJSX({ nodes: node.children })\n return (\n <Paragraph isEmpty={!children?.length} node={node}>\n {children?.length ? children : <br />}\n </Paragraph>\n )\n }\n }\n\n if (components.Blockquote) {\n const Blockquote = components.Blockquote\n converters.quote = ({ node, nodesToJSX }) => (\n <Blockquote node={node}>\n {nodesToJSX({ nodes: node.children })}\n </Blockquote>\n )\n }\n\n if (components.List) {\n const List = components.List\n converters.list = ({ node, nodesToJSX }) => (\n <List tag={node.tag} listType={node.listType} node={node}>\n {nodesToJSX({ nodes: node.children })}\n </List>\n )\n }\n\n if (components.ListItem) {\n const ListItem = components.ListItem\n converters.listitem = ({ node, nodesToJSX }) => {\n const hasSubLists = node.children.some(\n (child: { type: string }) => child.type === 'list',\n )\n return (\n <ListItem\n hasSubLists={hasSubLists}\n checked={node.checked}\n value={node.value}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </ListItem>\n )\n }\n }\n\n if (components.Link) {\n const Link = components.Link\n\n const resolveHref = (node: any): string => {\n if (node.fields.linkType === 'internal') {\n return internalDocToHref ? internalDocToHref({ linkNode: node }) : '#'\n }\n return node.fields.url ?? ''\n }\n\n converters.link = ({ node, nodesToJSX }) => (\n <Link\n href={resolveHref(node)}\n rel={node.fields.newTab ? 'noopener noreferrer' : undefined}\n target={node.fields.newTab ? '_blank' : undefined}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </Link>\n )\n\n converters.autolink = ({ node, nodesToJSX }) => (\n <Link\n href={node.fields.url ?? ''}\n rel={node.fields.newTab ? 'noopener noreferrer' : undefined}\n target={node.fields.newTab ? '_blank' : undefined}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </Link>\n )\n }\n\n if (components.HorizontalRule) {\n const HorizontalRule = components.HorizontalRule\n converters.horizontalrule = <HorizontalRule />\n }\n\n if (components.Upload) {\n const Upload = components.Upload\n converters.upload = ({ node }) => {\n const uploadNode = node as any\n if (typeof uploadNode.value !== 'object') return null\n const doc = uploadNode.value\n return (\n <Upload\n src={doc.url}\n alt={uploadNode.fields?.alt || doc?.alt || ''}\n width={doc.width}\n height={doc.height}\n mimeType={doc.mimeType}\n filename={doc.filename}\n sizes={doc.sizes}\n node={node}\n />\n )\n }\n }\n\n if (components.Table) {\n const Table = components.Table\n converters.table = ({ node, nodesToJSX }) => (\n <Table node={node}>{nodesToJSX({ nodes: node.children })}</Table>\n )\n }\n\n if (components.TableRow) {\n const TableRow = components.TableRow\n converters.tablerow = ({ node, nodesToJSX }) => (\n <TableRow node={node}>{nodesToJSX({ nodes: node.children })}</TableRow>\n )\n }\n\n if (components.TableCell) {\n const TableCell = components.TableCell\n converters.tablecell = ({ node, nodesToJSX }) => (\n <TableCell\n tag={node.headerState > 0 ? 'th' : 'td'}\n colSpan={node.colSpan > 1 ? node.colSpan : undefined}\n rowSpan={node.rowSpan > 1 ? node.rowSpan : undefined}\n backgroundColor={node.backgroundColor || undefined}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </TableCell>\n )\n }\n\n return converters\n}\n\nexport function StyledRichTextContent({\n components = {},\n internalDocToHref,\n blocks,\n textState,\n ...props\n}: StyledRichTextContentProps) {\n const converters = createComponentConverters(components, internalDocToHref)\n\n return (\n <RichTextContent\n {...props}\n internalDocToHref={internalDocToHref}\n converters={converters}\n blocks={blocks}\n textState={textState}\n />\n )\n}\n","'use client'\n\nimport React from 'react'\nimport type {\n LexicalEditorNodeMap,\n LexicalEditorViewMap,\n SerializedBlockNode,\n ViewMapBlockComponentProps,\n} from '@payloadcms/richtext-lexical'\nimport type { TextStateConfig } from './index'\n\ntype CodeBlockFields = {\n blockName?: null | string\n blockType: 'Code'\n code?: string | null\n language?: string | null\n}\n\ntype IframeBlockFields = {\n blockName?: null | string\n blockType: 'Iframe'\n height?: number | null\n url?: string | null\n width?: number | null\n}\n\ntype SupportedRichTextBlockNode =\n | SerializedBlockNode<CodeBlockFields>\n | SerializedBlockNode<IframeBlockFields>\n\ntype RichTextBlockProps<TFields extends CodeBlockFields | IframeBlockFields> =\n ViewMapBlockComponentProps<SerializedBlockNode<TFields>>\n\nfunction getBlockFields<TFields extends CodeBlockFields | IframeBlockFields>(\n props: RichTextBlockProps<TFields>,\n): TFields {\n return props.formData as TFields\n}\n\nfunction CodeView(props: RichTextBlockProps<CodeBlockFields>) {\n const fields = getBlockFields(props)\n const code = fields.code ?? ''\n const language = fields.language ?? 'plaintext'\n\n if (props.isEditor) {\n const { BlockCollapsible } = props.useBlockComponentContext()\n\n return (\n <BlockCollapsible className={props.className}>\n <pre style={{ margin: 0, overflow: 'auto', whiteSpace: 'pre-wrap' }}>\n <code data-language={language}>{code}</code>\n </pre>\n </BlockCollapsible>\n )\n }\n\n return (\n <pre style={{ overflow: 'auto', whiteSpace: 'pre-wrap' }}>\n <code data-language={language}>{code}</code>\n </pre>\n )\n}\n\nfunction IframeView(props: RichTextBlockProps<IframeBlockFields>) {\n const fields = getBlockFields(props)\n const url = fields.url ?? ''\n const width = fields.width ?? undefined\n const height = fields.height ?? undefined\n\n if (!url) return null\n\n if (props.isEditor) {\n const { BlockCollapsible } = props.useBlockComponentContext()\n\n return (\n <BlockCollapsible className={props.className}>\n <iframe\n src={url}\n title={fields.blockName ?? 'Embedded content'}\n width={width}\n height={height}\n style={{\n aspectRatio: width && height ? `${width} / ${height}` : '16 / 9',\n width: '100%',\n }}\n />\n </BlockCollapsible>\n )\n }\n\n return (\n <iframe\n src={url}\n title={fields.blockName ?? 'Embedded content'}\n width={width}\n height={height}\n style={{\n aspectRatio: width && height ? `${width} / ${height}` : '16 / 9',\n width: '100%',\n }}\n />\n )\n}\n\nexport const richTextTextState: TextStateConfig = {\n color: {\n 'text-red': {\n css: {\n color:\n 'light-dark(oklch(0.577 0.245 27.325), oklch(0.704 0.191 22.216))',\n },\n label: 'Red',\n },\n 'text-orange': {\n css: {\n color:\n 'light-dark(oklch(0.646 0.222 41.116), oklch(0.75 0.183 55.934))',\n },\n label: 'Orange',\n },\n 'text-yellow': {\n css: {\n color:\n 'light-dark(oklch(0.554 0.135 66.442), oklch(0.905 0.182 98.111))',\n },\n label: 'Yellow',\n },\n 'text-green': {\n css: {\n color:\n 'light-dark(oklch(0.527 0.154 150.069), oklch(0.792 0.209 151.711))',\n },\n label: 'Green',\n },\n 'text-blue': {\n css: {\n color:\n 'light-dark(oklch(0.546 0.245 262.881), oklch(0.707 0.165 254.624))',\n },\n label: 'Blue',\n },\n 'text-purple': {\n css: {\n color:\n 'light-dark(oklch(0.558 0.288 302.321), oklch(0.714 0.203 305.504))',\n },\n label: 'Purple',\n },\n 'text-pink': {\n css: {\n color:\n 'light-dark(oklch(0.592 0.249 0.584), oklch(0.718 0.202 349.761))',\n },\n label: 'Pink',\n },\n 'bg-red': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.704 0.191 22.216), oklch(0.577 0.245 27.325))',\n },\n label: 'Red',\n },\n 'bg-orange': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.75 0.183 55.934), oklch(0.646 0.222 41.116))',\n },\n label: 'Orange',\n },\n 'bg-yellow': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.905 0.182 98.111), oklch(0.554 0.135 66.442))',\n },\n label: 'Yellow',\n },\n 'bg-green': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.792 0.209 151.711), oklch(0.527 0.154 150.069))',\n },\n label: 'Green',\n },\n 'bg-blue': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.707 0.165 254.624), oklch(0.546 0.245 262.881))',\n },\n label: 'Blue',\n },\n 'bg-purple': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.714 0.203 305.504), oklch(0.558 0.288 302.321))',\n },\n label: 'Purple',\n },\n 'bg-pink': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.718 0.202 349.761), oklch(0.592 0.249 0.584))',\n },\n label: 'Pink',\n },\n },\n}\n\nexport const richTextNodeMap: LexicalEditorNodeMap<SupportedRichTextBlockNode> =\n {\n blocks: {\n Code: {\n Block: CodeView,\n },\n Iframe: {\n Block: IframeView,\n },\n },\n }\n\nexport const richTextViewMap: LexicalEditorViewMap<SupportedRichTextBlockNode> =\n {\n default: {\n nodes: richTextNodeMap,\n },\n }\n"],"mappings":"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","names":["import_react","React","import_react","React","React"]}
1
+ {"version":3,"sources":["../../src/ui/RichText/index.tsx","../../src/ui/RichText/styled.tsx","../../src/ui/RichText/views.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\nimport type {\n LexicalEditorNodeMap,\n SerializedBlockNode,\n SerializedLinkNode,\n} from '@payloadcms/richtext-lexical'\nimport type {\n SerializedEditorState,\n SerializedLexicalNode,\n} from '@payloadcms/richtext-lexical/lexical'\nimport {\n defaultJSXConverters,\n LinkJSXConverter,\n RichText,\n TextJSXConverter,\n} from '@payloadcms/richtext-lexical/react'\nimport type {\n JSXConverter,\n JSXConverters,\n} from '@payloadcms/richtext-lexical/react'\n\n/**\n * Accepts both Lexical's strict `SerializedEditorState` and Payload's generated\n * richText type (which includes index signatures like `[k: string]: unknown`).\n */\nexport type RichTextData =\n | SerializedEditorState<SerializedLexicalNode>\n | {\n root: {\n type: string\n children: { type: string; version: number; [k: string]: unknown }[]\n direction: string | null\n format: string\n indent: number\n version: number\n [k: string]: unknown\n }\n [k: string]: unknown\n }\n\nexport type TextStateConfig = {\n [stateKey: string]: {\n [stateValue: string]: {\n css: Record<string, string>\n label: string\n }\n }\n}\n\nexport interface RichTextContentProps {\n data: RichTextData\n className?: string\n internalDocToHref?: (args: { linkNode: SerializedLinkNode }) => string\n converters?: Partial<JSXConverters>\n blocks?: Record<string, JSXConverter<SerializedBlockNode>>\n disableDefaultConverters?: boolean\n nodeMap?: LexicalEditorNodeMap\n textState?: TextStateConfig\n}\n\nexport { StyledRichTextContent } from './styled'\nexport { richTextNodeMap, richTextTextState, richTextViewMap } from './views'\nexport type {\n RichTextComponents,\n StyledRichTextContentProps,\n HeadingSlotProps,\n ParagraphSlotProps,\n BlockquoteSlotProps,\n ListSlotProps,\n ListItemSlotProps,\n LinkSlotProps,\n HorizontalRuleSlotProps,\n UploadSlotProps,\n TableSlotProps,\n TableRowSlotProps,\n TableCellSlotProps,\n} from './styled'\n\nfunction hyphenToCamel(str: string): string {\n return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase())\n}\n\nfunction createTextStateConverter(\n state: TextStateConfig,\n): JSXConverters['text'] {\n const defaultTextConverter = TextJSXConverter.text\n // eslint-disable-next-line react/display-name\n return ({ node, ...rest }) => {\n const base = (\n defaultTextConverter as (...args: unknown[]) => React.ReactNode\n )({ node, ...rest })\n const nodeState = (node as Record<string, unknown>).$ as\n | Record<string, string>\n | undefined\n if (!nodeState || typeof nodeState !== 'object') return base\n\n const style: Record<string, string> = {}\n for (const stateKey in nodeState) {\n const stateValue = nodeState[stateKey]\n if (!stateValue) continue\n const css = state[stateKey]?.[stateValue]?.css\n if (css) {\n for (const prop in css) {\n const val = css[prop]\n if (val) style[hyphenToCamel(prop)] = val\n }\n }\n }\n\n if (Object.keys(style).length === 0) return base\n return <span style={style}>{base}</span>\n }\n}\n\nexport function RichTextContent({\n data,\n className,\n internalDocToHref,\n converters,\n blocks,\n disableDefaultConverters,\n nodeMap,\n textState,\n}: RichTextContentProps) {\n const baseConverters: JSXConverters = {\n ...(disableDefaultConverters ? {} : defaultJSXConverters),\n ...LinkJSXConverter({ internalDocToHref }),\n ...(textState ? { text: createTextStateConverter(textState) } : {}),\n ...converters,\n ...(blocks ? { blocks } : {}),\n }\n\n return (\n <RichText\n data={data as SerializedEditorState<SerializedLexicalNode>}\n className={className}\n converters={baseConverters}\n nodeMap={nodeMap}\n />\n )\n}\n","'use client'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React from 'react'\nimport { SerializedLinkNode } from '@payloadcms/richtext-lexical'\nimport { JSXConverters } from '@payloadcms/richtext-lexical/react'\nimport { RichTextContent, RichTextContentProps } from './index'\n\n// --- Slot prop types (each slot gets structured data + raw node) ---\n\nexport interface HeadingSlotProps {\n tag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'\n children: React.ReactNode\n node: any\n}\n\nexport interface ParagraphSlotProps {\n children: React.ReactNode\n isEmpty: boolean\n node: any\n}\n\nexport interface BlockquoteSlotProps {\n children: React.ReactNode\n node: any\n}\n\nexport interface ListSlotProps {\n tag: 'ul' | 'ol'\n listType: string\n children: React.ReactNode\n node: any\n}\n\nexport interface ListItemSlotProps {\n children: React.ReactNode\n hasSubLists: boolean\n checked?: boolean\n value?: number\n node: any\n}\n\nexport interface LinkSlotProps {\n href: string\n target?: string\n rel?: string\n children: React.ReactNode\n node: any\n}\n\nexport interface HorizontalRuleSlotProps {\n node?: any\n}\n\nexport interface UploadSlotProps {\n src: string\n alt: string\n width?: number\n height?: number\n mimeType: string\n filename: string\n sizes?: Record<string, any>\n node: any\n}\n\nexport interface TableSlotProps {\n children: React.ReactNode\n node: any\n}\n\nexport interface TableRowSlotProps {\n children: React.ReactNode\n node: any\n}\n\nexport interface TableCellSlotProps {\n tag: 'th' | 'td'\n children: React.ReactNode\n colSpan?: number\n rowSpan?: number\n backgroundColor?: string\n node: any\n}\n\n// --- Components map ---\n\nexport interface RichTextComponents {\n Heading?: React.ComponentType<HeadingSlotProps>\n Paragraph?: React.ComponentType<ParagraphSlotProps>\n Blockquote?: React.ComponentType<BlockquoteSlotProps>\n List?: React.ComponentType<ListSlotProps>\n ListItem?: React.ComponentType<ListItemSlotProps>\n Link?: React.ComponentType<LinkSlotProps>\n HorizontalRule?: React.ComponentType<HorizontalRuleSlotProps>\n Upload?: React.ComponentType<UploadSlotProps>\n Table?: React.ComponentType<TableSlotProps>\n TableRow?: React.ComponentType<TableRowSlotProps>\n TableCell?: React.ComponentType<TableCellSlotProps>\n}\n\nexport interface StyledRichTextContentProps extends Omit<\n RichTextContentProps,\n 'converters' | 'disableDefaultConverters'\n> {\n components?: RichTextComponents\n}\n\nfunction createComponentConverters(\n components: RichTextComponents,\n internalDocToHref?: (args: { linkNode: SerializedLinkNode }) => string,\n): Partial<JSXConverters> {\n const converters: Partial<JSXConverters> = {}\n\n if (components.Heading) {\n const Heading = components.Heading\n converters.heading = ({ node, nodesToJSX }) => (\n <Heading tag={node.tag} node={node}>\n {nodesToJSX({ nodes: node.children })}\n </Heading>\n )\n }\n\n if (components.Paragraph) {\n const Paragraph = components.Paragraph\n converters.paragraph = ({ node, nodesToJSX }) => {\n const children = nodesToJSX({ nodes: node.children })\n return (\n <Paragraph isEmpty={!children?.length} node={node}>\n {children?.length ? children : <br />}\n </Paragraph>\n )\n }\n }\n\n if (components.Blockquote) {\n const Blockquote = components.Blockquote\n converters.quote = ({ node, nodesToJSX }) => (\n <Blockquote node={node}>\n {nodesToJSX({ nodes: node.children })}\n </Blockquote>\n )\n }\n\n if (components.List) {\n const List = components.List\n converters.list = ({ node, nodesToJSX }) => (\n <List tag={node.tag} listType={node.listType} node={node}>\n {nodesToJSX({ nodes: node.children })}\n </List>\n )\n }\n\n if (components.ListItem) {\n const ListItem = components.ListItem\n converters.listitem = ({ node, nodesToJSX }) => {\n const hasSubLists = node.children.some(\n (child: { type: string }) => child.type === 'list',\n )\n return (\n <ListItem\n hasSubLists={hasSubLists}\n checked={node.checked}\n value={node.value}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </ListItem>\n )\n }\n }\n\n if (components.Link) {\n const Link = components.Link\n\n const resolveHref = (node: any): string => {\n if (node.fields.linkType === 'internal') {\n return internalDocToHref ? internalDocToHref({ linkNode: node }) : '#'\n }\n return node.fields.url ?? ''\n }\n\n converters.link = ({ node, nodesToJSX }) => (\n <Link\n href={resolveHref(node)}\n rel={node.fields.newTab ? 'noopener noreferrer' : undefined}\n target={node.fields.newTab ? '_blank' : undefined}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </Link>\n )\n\n converters.autolink = ({ node, nodesToJSX }) => (\n <Link\n href={node.fields.url ?? ''}\n rel={node.fields.newTab ? 'noopener noreferrer' : undefined}\n target={node.fields.newTab ? '_blank' : undefined}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </Link>\n )\n }\n\n if (components.HorizontalRule) {\n const HorizontalRule = components.HorizontalRule\n converters.horizontalrule = <HorizontalRule />\n }\n\n if (components.Upload) {\n const Upload = components.Upload\n converters.upload = ({ node }) => {\n const uploadNode = node as any\n if (typeof uploadNode.value !== 'object') return null\n const doc = uploadNode.value\n return (\n <Upload\n src={doc.url}\n alt={uploadNode.fields?.alt || doc?.alt || ''}\n width={doc.width}\n height={doc.height}\n mimeType={doc.mimeType}\n filename={doc.filename}\n sizes={doc.sizes}\n node={node}\n />\n )\n }\n }\n\n if (components.Table) {\n const Table = components.Table\n converters.table = ({ node, nodesToJSX }) => (\n <Table node={node}>{nodesToJSX({ nodes: node.children })}</Table>\n )\n }\n\n if (components.TableRow) {\n const TableRow = components.TableRow\n converters.tablerow = ({ node, nodesToJSX }) => (\n <TableRow node={node}>{nodesToJSX({ nodes: node.children })}</TableRow>\n )\n }\n\n if (components.TableCell) {\n const TableCell = components.TableCell\n converters.tablecell = ({ node, nodesToJSX }) => (\n <TableCell\n tag={node.headerState > 0 ? 'th' : 'td'}\n colSpan={node.colSpan > 1 ? node.colSpan : undefined}\n rowSpan={node.rowSpan > 1 ? node.rowSpan : undefined}\n backgroundColor={node.backgroundColor || undefined}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </TableCell>\n )\n }\n\n return converters\n}\n\nexport function StyledRichTextContent({\n components = {},\n internalDocToHref,\n blocks,\n textState,\n ...props\n}: StyledRichTextContentProps) {\n const converters = createComponentConverters(components, internalDocToHref)\n\n return (\n <RichTextContent\n {...props}\n internalDocToHref={internalDocToHref}\n converters={converters}\n blocks={blocks}\n textState={textState}\n />\n )\n}\n","'use client'\n\nimport React from 'react'\nimport type {\n LexicalEditorNodeMap,\n LexicalEditorViewMap,\n SerializedBlockNode,\n ViewMapBlockComponentProps,\n} from '@payloadcms/richtext-lexical'\nimport type { TextStateConfig } from './index'\n\ntype CodeBlockFields = {\n blockName?: null | string\n blockType: 'Code'\n code?: string | null\n language?: string | null\n}\n\ntype IframeBlockFields = {\n blockName?: null | string\n blockType: 'Iframe'\n height?: number | null\n url?: string | null\n width?: number | null\n}\n\ntype CarouselImage = {\n alt?: string | null\n height?: number | null\n url?: string | null\n width?: number | null\n}\n\ntype CarouselSlide = {\n alt?: string | null\n caption?: string | null\n href?: string | null\n image?: CarouselImage | null | string\n}\n\ntype RenderableCarouselSlide = Omit<CarouselSlide, 'image'> & {\n image: CarouselImage & { url: string }\n}\n\ntype CarouselBlockFields = {\n aspectRatio?: '16:9' | '4:3' | '1:1' | '3:4' | null\n blockName?: null | string\n blockType: 'Carousel'\n fit?: 'cover' | 'contain' | null\n showCaptions?: boolean | null\n showControls?: boolean | null\n showDots?: boolean | null\n slides?: CarouselSlide[] | null\n}\n\ntype SupportedRichTextBlockNode =\n | SerializedBlockNode<CodeBlockFields>\n | SerializedBlockNode<IframeBlockFields>\n | SerializedBlockNode<CarouselBlockFields>\n\ntype SupportedRichTextBlockFields =\n | CarouselBlockFields\n | CodeBlockFields\n | IframeBlockFields\n\ntype RichTextBlockProps<TFields extends SupportedRichTextBlockFields> =\n ViewMapBlockComponentProps<SerializedBlockNode<TFields>>\n\nfunction getBlockFields<TFields extends SupportedRichTextBlockFields>(\n props: RichTextBlockProps<TFields>,\n): TFields {\n return props.formData as TFields\n}\n\nfunction CodeView(props: RichTextBlockProps<CodeBlockFields>) {\n const fields = getBlockFields(props)\n const code = fields.code ?? ''\n const language = fields.language ?? 'plaintext'\n\n if (props.isEditor) {\n const { BlockCollapsible } = props.useBlockComponentContext()\n\n return (\n <BlockCollapsible className={props.className}>\n <pre style={{ margin: 0, overflow: 'auto', whiteSpace: 'pre-wrap' }}>\n <code data-language={language}>{code}</code>\n </pre>\n </BlockCollapsible>\n )\n }\n\n return (\n <pre style={{ overflow: 'auto', whiteSpace: 'pre-wrap' }}>\n <code data-language={language}>{code}</code>\n </pre>\n )\n}\n\nconst carouselAspectRatios: Record<\n NonNullable<CarouselBlockFields['aspectRatio']>,\n string\n> = {\n '1:1': '1 / 1',\n '3:4': '3 / 4',\n '4:3': '4 / 3',\n '16:9': '16 / 9',\n}\n\nfunction isPopulatedCarouselImage(\n image: CarouselSlide['image'],\n): image is CarouselImage & { url: string } {\n return (\n typeof image === 'object' &&\n image !== null &&\n typeof image.url === 'string' &&\n image.url.trim().length > 0\n )\n}\n\nfunction isSafeCarouselHref(href: string | null | undefined): href is string {\n if (!href) return false\n return /^(https?:\\/\\/|\\/|#|mailto:|tel:)/.test(href)\n}\n\nfunction getRenderableCarouselSlides(\n slides: CarouselSlide[] | null | undefined,\n): RenderableCarouselSlide[] {\n return (slides ?? []).reduce<RenderableCarouselSlide[]>((valid, slide) => {\n if (!isPopulatedCarouselImage(slide.image)) return valid\n valid.push({ ...slide, image: slide.image })\n return valid\n }, [])\n}\n\nfunction CarouselView(props: RichTextBlockProps<CarouselBlockFields>) {\n const fields = getBlockFields(props)\n const reactId = React.useId().replace(/[^a-zA-Z0-9_-]/g, '')\n const slides = getRenderableCarouselSlides(fields.slides)\n\n // The schema requires two slides at write time, but public reads can contain\n // deleted or unpopulated uploads. Rendering skips invalid slide objects.\n if (slides.length === 0) {\n if (props.isEditor) {\n const { BlockCollapsible } = props.useBlockComponentContext()\n return (\n <BlockCollapsible className={props.className}>\n <p style={{ margin: 0 }}>Carousel block has no populated images.</p>\n </BlockCollapsible>\n )\n }\n\n return null\n }\n\n const aspectRatio =\n carouselAspectRatios[fields.aspectRatio ?? '16:9'] ??\n carouselAspectRatios['16:9']\n const objectFit = fields.fit === 'contain' ? 'contain' : 'cover'\n const showCaptions = fields.showCaptions !== false\n const showControls = fields.showControls !== false && slides.length > 1\n const showDots = fields.showDots !== false && slides.length > 1\n\n const content = (\n <div\n aria-label={fields.blockName ?? 'Image carousel'}\n role=\"group\"\n style={{ margin: 0 }}\n >\n <div\n style={{\n display: 'flex',\n gap: 12,\n overflowX: 'auto',\n scrollSnapType: 'x mandatory',\n }}\n >\n {slides.map((slide, index) => {\n const slideId = `${reactId}-carousel-slide-${index + 1}`\n const previousSlideId = `${reactId}-carousel-slide-${\n index === 0 ? slides.length : index\n }`\n const nextSlideId = `${reactId}-carousel-slide-${\n index === slides.length - 1 ? 1 : index + 2\n }`\n const image = slide.image\n const imageElement = (\n <img\n src={image.url}\n alt={slide.alt ?? image.alt ?? ''}\n width={image.width ?? undefined}\n height={image.height ?? undefined}\n loading=\"lazy\"\n style={{\n aspectRatio,\n background: 'Canvas',\n display: 'block',\n height: 'auto',\n objectFit,\n width: '100%',\n }}\n />\n )\n\n return (\n <figure\n id={slideId}\n key={slideId}\n style={{\n flex: '0 0 100%',\n margin: 0,\n minWidth: 0,\n scrollSnapAlign: 'start',\n }}\n >\n {isSafeCarouselHref(slide.href) ? (\n <a href={slide.href}>{imageElement}</a>\n ) : (\n imageElement\n )}\n {showCaptions && slide.caption ? (\n <figcaption style={{ marginTop: 8 }}>\n {slide.caption}\n </figcaption>\n ) : null}\n {showControls ? (\n <nav\n aria-label={`Carousel controls for slide ${index + 1}`}\n style={{\n display: 'flex',\n gap: 8,\n justifyContent: 'space-between',\n marginTop: 8,\n }}\n >\n <a aria-label=\"Previous slide\" href={`#${previousSlideId}`}>\n Previous\n </a>\n <a aria-label=\"Next slide\" href={`#${nextSlideId}`}>\n Next\n </a>\n </nav>\n ) : null}\n </figure>\n )\n })}\n </div>\n {showDots ? (\n <nav\n aria-label=\"Carousel slide navigation\"\n style={{\n display: 'flex',\n gap: 8,\n justifyContent: 'center',\n marginTop: 8,\n }}\n >\n {slides.map((_, index) => (\n <a\n aria-label={`Go to slide ${index + 1}`}\n href={`#${reactId}-carousel-slide-${index + 1}`}\n key={`${reactId}-carousel-dot-${index + 1}`}\n >\n {index + 1}\n </a>\n ))}\n </nav>\n ) : null}\n </div>\n )\n\n if (props.isEditor) {\n const { BlockCollapsible } = props.useBlockComponentContext()\n return (\n <BlockCollapsible className={props.className}>{content}</BlockCollapsible>\n )\n }\n\n return content\n}\n\nfunction IframeView(props: RichTextBlockProps<IframeBlockFields>) {\n const fields = getBlockFields(props)\n const url = fields.url ?? ''\n const width = fields.width ?? undefined\n const height = fields.height ?? undefined\n\n if (!url) return null\n\n if (props.isEditor) {\n const { BlockCollapsible } = props.useBlockComponentContext()\n\n return (\n <BlockCollapsible className={props.className}>\n <iframe\n src={url}\n title={fields.blockName ?? 'Embedded content'}\n width={width}\n height={height}\n style={{\n aspectRatio: width && height ? `${width} / ${height}` : '16 / 9',\n width: '100%',\n }}\n />\n </BlockCollapsible>\n )\n }\n\n return (\n <iframe\n src={url}\n title={fields.blockName ?? 'Embedded content'}\n width={width}\n height={height}\n style={{\n aspectRatio: width && height ? `${width} / ${height}` : '16 / 9',\n width: '100%',\n }}\n />\n )\n}\n\nexport const richTextTextState: TextStateConfig = {\n color: {\n 'text-red': {\n css: {\n color:\n 'light-dark(oklch(0.577 0.245 27.325), oklch(0.704 0.191 22.216))',\n },\n label: 'Red',\n },\n 'text-orange': {\n css: {\n color:\n 'light-dark(oklch(0.646 0.222 41.116), oklch(0.75 0.183 55.934))',\n },\n label: 'Orange',\n },\n 'text-yellow': {\n css: {\n color:\n 'light-dark(oklch(0.554 0.135 66.442), oklch(0.905 0.182 98.111))',\n },\n label: 'Yellow',\n },\n 'text-green': {\n css: {\n color:\n 'light-dark(oklch(0.527 0.154 150.069), oklch(0.792 0.209 151.711))',\n },\n label: 'Green',\n },\n 'text-blue': {\n css: {\n color:\n 'light-dark(oklch(0.546 0.245 262.881), oklch(0.707 0.165 254.624))',\n },\n label: 'Blue',\n },\n 'text-purple': {\n css: {\n color:\n 'light-dark(oklch(0.558 0.288 302.321), oklch(0.714 0.203 305.504))',\n },\n label: 'Purple',\n },\n 'text-pink': {\n css: {\n color:\n 'light-dark(oklch(0.592 0.249 0.584), oklch(0.718 0.202 349.761))',\n },\n label: 'Pink',\n },\n 'bg-red': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.704 0.191 22.216), oklch(0.577 0.245 27.325))',\n },\n label: 'Red',\n },\n 'bg-orange': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.75 0.183 55.934), oklch(0.646 0.222 41.116))',\n },\n label: 'Orange',\n },\n 'bg-yellow': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.905 0.182 98.111), oklch(0.554 0.135 66.442))',\n },\n label: 'Yellow',\n },\n 'bg-green': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.792 0.209 151.711), oklch(0.527 0.154 150.069))',\n },\n label: 'Green',\n },\n 'bg-blue': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.707 0.165 254.624), oklch(0.546 0.245 262.881))',\n },\n label: 'Blue',\n },\n 'bg-purple': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.714 0.203 305.504), oklch(0.558 0.288 302.321))',\n },\n label: 'Purple',\n },\n 'bg-pink': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.718 0.202 349.761), oklch(0.592 0.249 0.584))',\n },\n label: 'Pink',\n },\n },\n}\n\nexport const richTextNodeMap: LexicalEditorNodeMap<SupportedRichTextBlockNode> =\n {\n blocks: {\n Carousel: {\n Block: CarouselView,\n },\n Code: {\n Block: CodeView,\n },\n Iframe: {\n Block: IframeView,\n },\n },\n }\n\nexport const richTextViewMap: LexicalEditorViewMap<SupportedRichTextBlockNode> =\n {\n default: {\n nodes: richTextNodeMap,\n },\n }\n"],"mappings":"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","names":["import_react","React","import_react","React","React"]}
@@ -97,7 +97,29 @@ type IframeBlockFields = {
97
97
  url?: string | null;
98
98
  width?: number | null;
99
99
  };
100
- type SupportedRichTextBlockNode = SerializedBlockNode<CodeBlockFields> | SerializedBlockNode<IframeBlockFields>;
100
+ type CarouselImage = {
101
+ alt?: string | null;
102
+ height?: number | null;
103
+ url?: string | null;
104
+ width?: number | null;
105
+ };
106
+ type CarouselSlide = {
107
+ alt?: string | null;
108
+ caption?: string | null;
109
+ href?: string | null;
110
+ image?: CarouselImage | null | string;
111
+ };
112
+ type CarouselBlockFields = {
113
+ aspectRatio?: '16:9' | '4:3' | '1:1' | '3:4' | null;
114
+ blockName?: null | string;
115
+ blockType: 'Carousel';
116
+ fit?: 'cover' | 'contain' | null;
117
+ showCaptions?: boolean | null;
118
+ showControls?: boolean | null;
119
+ showDots?: boolean | null;
120
+ slides?: CarouselSlide[] | null;
121
+ };
122
+ type SupportedRichTextBlockNode = SerializedBlockNode<CodeBlockFields> | SerializedBlockNode<IframeBlockFields> | SerializedBlockNode<CarouselBlockFields>;
101
123
  declare const richTextTextState: TextStateConfig;
102
124
  declare const richTextNodeMap: LexicalEditorNodeMap<SupportedRichTextBlockNode>;
103
125
  declare const richTextViewMap: LexicalEditorViewMap<SupportedRichTextBlockNode>;
@@ -97,7 +97,29 @@ type IframeBlockFields = {
97
97
  url?: string | null;
98
98
  width?: number | null;
99
99
  };
100
- type SupportedRichTextBlockNode = SerializedBlockNode<CodeBlockFields> | SerializedBlockNode<IframeBlockFields>;
100
+ type CarouselImage = {
101
+ alt?: string | null;
102
+ height?: number | null;
103
+ url?: string | null;
104
+ width?: number | null;
105
+ };
106
+ type CarouselSlide = {
107
+ alt?: string | null;
108
+ caption?: string | null;
109
+ href?: string | null;
110
+ image?: CarouselImage | null | string;
111
+ };
112
+ type CarouselBlockFields = {
113
+ aspectRatio?: '16:9' | '4:3' | '1:1' | '3:4' | null;
114
+ blockName?: null | string;
115
+ blockType: 'Carousel';
116
+ fit?: 'cover' | 'contain' | null;
117
+ showCaptions?: boolean | null;
118
+ showControls?: boolean | null;
119
+ showDots?: boolean | null;
120
+ slides?: CarouselSlide[] | null;
121
+ };
122
+ type SupportedRichTextBlockNode = SerializedBlockNode<CodeBlockFields> | SerializedBlockNode<IframeBlockFields> | SerializedBlockNode<CarouselBlockFields>;
101
123
  declare const richTextTextState: TextStateConfig;
102
124
  declare const richTextNodeMap: LexicalEditorNodeMap<SupportedRichTextBlockNode>;
103
125
  declare const richTextViewMap: LexicalEditorViewMap<SupportedRichTextBlockNode>;
@@ -163,6 +163,141 @@ function CodeView(props) {
163
163
  }
164
164
  return /* @__PURE__ */ React2.createElement("pre", { style: { overflow: "auto", whiteSpace: "pre-wrap" } }, /* @__PURE__ */ React2.createElement("code", { "data-language": language }, code));
165
165
  }
166
+ var carouselAspectRatios = {
167
+ "1:1": "1 / 1",
168
+ "3:4": "3 / 4",
169
+ "4:3": "4 / 3",
170
+ "16:9": "16 / 9"
171
+ };
172
+ function isPopulatedCarouselImage(image) {
173
+ return typeof image === "object" && image !== null && typeof image.url === "string" && image.url.trim().length > 0;
174
+ }
175
+ function isSafeCarouselHref(href) {
176
+ if (!href) return false;
177
+ return /^(https?:\/\/|\/|#|mailto:|tel:)/.test(href);
178
+ }
179
+ function getRenderableCarouselSlides(slides) {
180
+ return (slides ?? []).reduce((valid, slide) => {
181
+ if (!isPopulatedCarouselImage(slide.image)) return valid;
182
+ valid.push({ ...slide, image: slide.image });
183
+ return valid;
184
+ }, []);
185
+ }
186
+ function CarouselView(props) {
187
+ const fields = getBlockFields(props);
188
+ const reactId = React2.useId().replace(/[^a-zA-Z0-9_-]/g, "");
189
+ const slides = getRenderableCarouselSlides(fields.slides);
190
+ if (slides.length === 0) {
191
+ if (props.isEditor) {
192
+ const { BlockCollapsible } = props.useBlockComponentContext();
193
+ return /* @__PURE__ */ React2.createElement(BlockCollapsible, { className: props.className }, /* @__PURE__ */ React2.createElement("p", { style: { margin: 0 } }, "Carousel block has no populated images."));
194
+ }
195
+ return null;
196
+ }
197
+ const aspectRatio = carouselAspectRatios[fields.aspectRatio ?? "16:9"] ?? carouselAspectRatios["16:9"];
198
+ const objectFit = fields.fit === "contain" ? "contain" : "cover";
199
+ const showCaptions = fields.showCaptions !== false;
200
+ const showControls = fields.showControls !== false && slides.length > 1;
201
+ const showDots = fields.showDots !== false && slides.length > 1;
202
+ const content = /* @__PURE__ */ React2.createElement(
203
+ "div",
204
+ {
205
+ "aria-label": fields.blockName ?? "Image carousel",
206
+ role: "group",
207
+ style: { margin: 0 }
208
+ },
209
+ /* @__PURE__ */ React2.createElement(
210
+ "div",
211
+ {
212
+ style: {
213
+ display: "flex",
214
+ gap: 12,
215
+ overflowX: "auto",
216
+ scrollSnapType: "x mandatory"
217
+ }
218
+ },
219
+ slides.map((slide, index) => {
220
+ const slideId = `${reactId}-carousel-slide-${index + 1}`;
221
+ const previousSlideId = `${reactId}-carousel-slide-${index === 0 ? slides.length : index}`;
222
+ const nextSlideId = `${reactId}-carousel-slide-${index === slides.length - 1 ? 1 : index + 2}`;
223
+ const image = slide.image;
224
+ const imageElement = /* @__PURE__ */ React2.createElement(
225
+ "img",
226
+ {
227
+ src: image.url,
228
+ alt: slide.alt ?? image.alt ?? "",
229
+ width: image.width ?? void 0,
230
+ height: image.height ?? void 0,
231
+ loading: "lazy",
232
+ style: {
233
+ aspectRatio,
234
+ background: "Canvas",
235
+ display: "block",
236
+ height: "auto",
237
+ objectFit,
238
+ width: "100%"
239
+ }
240
+ }
241
+ );
242
+ return /* @__PURE__ */ React2.createElement(
243
+ "figure",
244
+ {
245
+ id: slideId,
246
+ key: slideId,
247
+ style: {
248
+ flex: "0 0 100%",
249
+ margin: 0,
250
+ minWidth: 0,
251
+ scrollSnapAlign: "start"
252
+ }
253
+ },
254
+ isSafeCarouselHref(slide.href) ? /* @__PURE__ */ React2.createElement("a", { href: slide.href }, imageElement) : imageElement,
255
+ showCaptions && slide.caption ? /* @__PURE__ */ React2.createElement("figcaption", { style: { marginTop: 8 } }, slide.caption) : null,
256
+ showControls ? /* @__PURE__ */ React2.createElement(
257
+ "nav",
258
+ {
259
+ "aria-label": `Carousel controls for slide ${index + 1}`,
260
+ style: {
261
+ display: "flex",
262
+ gap: 8,
263
+ justifyContent: "space-between",
264
+ marginTop: 8
265
+ }
266
+ },
267
+ /* @__PURE__ */ React2.createElement("a", { "aria-label": "Previous slide", href: `#${previousSlideId}` }, "Previous"),
268
+ /* @__PURE__ */ React2.createElement("a", { "aria-label": "Next slide", href: `#${nextSlideId}` }, "Next")
269
+ ) : null
270
+ );
271
+ })
272
+ ),
273
+ showDots ? /* @__PURE__ */ React2.createElement(
274
+ "nav",
275
+ {
276
+ "aria-label": "Carousel slide navigation",
277
+ style: {
278
+ display: "flex",
279
+ gap: 8,
280
+ justifyContent: "center",
281
+ marginTop: 8
282
+ }
283
+ },
284
+ slides.map((_, index) => /* @__PURE__ */ React2.createElement(
285
+ "a",
286
+ {
287
+ "aria-label": `Go to slide ${index + 1}`,
288
+ href: `#${reactId}-carousel-slide-${index + 1}`,
289
+ key: `${reactId}-carousel-dot-${index + 1}`
290
+ },
291
+ index + 1
292
+ ))
293
+ ) : null
294
+ );
295
+ if (props.isEditor) {
296
+ const { BlockCollapsible } = props.useBlockComponentContext();
297
+ return /* @__PURE__ */ React2.createElement(BlockCollapsible, { className: props.className }, content);
298
+ }
299
+ return content;
300
+ }
166
301
  function IframeView(props) {
167
302
  const fields = getBlockFields(props);
168
303
  const url = fields.url ?? "";
@@ -289,6 +424,9 @@ var richTextTextState = {
289
424
  };
290
425
  var richTextNodeMap = {
291
426
  blocks: {
427
+ Carousel: {
428
+ Block: CarouselView
429
+ },
292
430
  Code: {
293
431
  Block: CodeView
294
432
  },