@react-email/editor 0.0.0-experimental.42 → 0.0.0-experimental.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/index.cjs +4 -3
- package/dist/core/index.d.cts +2 -2
- package/dist/core/index.d.mts +3 -3
- package/dist/core/index.mjs +3 -3
- package/dist/{create-paste-handler-CGR738bC.d.mts → create-paste-handler-DsJYKisA.d.mts} +1 -1
- package/dist/{create-paste-handler-CGR738bC.d.mts.map → create-paste-handler-DsJYKisA.d.mts.map} +1 -1
- package/dist/{event-bus-fb8U7hrl.cjs → event-bus-BJn1dJM1.cjs} +20 -3
- package/dist/{event-bus-CHEzOS_O.mjs → event-bus-DJpnfDHw.mjs} +14 -3
- package/dist/{event-bus-CHEzOS_O.mjs.map → event-bus-DJpnfDHw.mjs.map} +1 -1
- package/dist/{extension-D23sh0Nj.cjs → extension-CF0s-pGh.cjs} +298 -35
- package/dist/{extension-BZsTEb_s.mjs → extension-DcToBuV0.mjs} +298 -11
- package/dist/extension-DcToBuV0.mjs.map +1 -0
- package/dist/extensions/index.cjs +3 -3
- package/dist/extensions/index.d.cts +1 -1
- package/dist/extensions/index.d.cts.map +1 -1
- package/dist/extensions/index.d.mts +2 -2
- package/dist/extensions/index.d.mts.map +1 -1
- package/dist/extensions/index.mjs +3 -3
- package/dist/{extensions-wGY7l1wH.cjs → extensions-B6VCxUmi.cjs} +67 -25
- package/dist/{extensions-D-VkzZTa.mjs → extensions-mStGDfMH.mjs} +62 -20
- package/dist/extensions-mStGDfMH.mjs.map +1 -0
- package/dist/{styles-C-cCyJCn.cjs → global-content-C5WjNoMX.cjs} +88 -0
- package/dist/{styles-_TMw3YxC.mjs → global-content-CjA49_jE.mjs} +78 -2
- package/dist/global-content-CjA49_jE.mjs.map +1 -0
- package/dist/{index-C4KcMQ0R.d.cts → index-LCPnE_xx.d.cts} +66 -3
- package/dist/index-LCPnE_xx.d.cts.map +1 -0
- package/dist/{index-CxX7W63O.d.mts → index-i5JdL0UD.d.mts} +67 -4
- package/dist/index-i5JdL0UD.d.mts.map +1 -0
- package/dist/index.cjs +4 -4
- package/dist/index.d.cts +2 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +3 -3
- package/dist/plugins/index.cjs +1 -5
- package/dist/plugins/index.d.cts +5 -123
- package/dist/plugins/index.d.cts.map +1 -1
- package/dist/plugins/index.d.mts +5 -123
- package/dist/plugins/index.d.mts.map +1 -1
- package/dist/plugins/index.mjs +2 -2
- package/dist/{root-pS4l8bVZ.mjs → root-BVs63m-4.mjs} +39 -39
- package/dist/root-BVs63m-4.mjs.map +1 -0
- package/dist/{root-Jq1R3tkX.cjs → root-D6lslKju.cjs} +2 -2
- package/dist/{set-text-alignment-OA8IMWmO.mjs → set-text-alignment-GMXOPMlJ.mjs} +1 -1
- package/dist/{set-text-alignment-OA8IMWmO.mjs.map → set-text-alignment-GMXOPMlJ.mjs.map} +1 -1
- package/dist/types-BNEbRz-a.d.cts +47 -0
- package/dist/types-BNEbRz-a.d.cts.map +1 -0
- package/dist/types-C8k-blF7.d.mts +47 -0
- package/dist/types-C8k-blF7.d.mts.map +1 -0
- package/dist/ui/index.cjs +645 -2
- package/dist/ui/index.d.cts +307 -128
- package/dist/ui/index.d.cts.map +1 -1
- package/dist/ui/index.d.mts +307 -128
- package/dist/ui/index.d.mts.map +1 -1
- package/dist/ui/index.mjs +630 -3
- package/dist/ui/index.mjs.map +1 -1
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.mjs +1 -1
- package/package.json +2 -2
- package/dist/extension-BZsTEb_s.mjs.map +0 -1
- package/dist/extensions-D-VkzZTa.mjs.map +0 -1
- package/dist/global-content-D_WYaFgX.mjs +0 -78
- package/dist/global-content-D_WYaFgX.mjs.map +0 -1
- package/dist/global-content-bJgotqmA.cjs +0 -89
- package/dist/index-C4KcMQ0R.d.cts.map +0 -1
- package/dist/index-CxX7W63O.d.mts.map +0 -1
- package/dist/root-pS4l8bVZ.mjs.map +0 -1
- package/dist/styles-_TMw3YxC.mjs.map +0 -1
- /package/dist/{set-text-alignment-Cv72txmv.cjs → set-text-alignment-aNb7Ml9N.cjs} +0 -0
package/dist/ui/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/ui/bubble-menu/separator.tsx","../../src/ui/bubble-menu/index.ts","../../src/ui/slash-command/index.ts"],"sourcesContent":["export interface BubbleMenuSeparatorProps {\n className?: string;\n}\n\nexport function BubbleMenuSeparator({ className }: BubbleMenuSeparatorProps) {\n return <hr className={className} data-re-bubble-menu-separator=\"\" />;\n}\n","import { BubbleMenuAlignCenter } from './align-center';\nimport { BubbleMenuAlignLeft } from './align-left';\nimport { BubbleMenuAlignRight } from './align-right';\nimport { BubbleMenuBold } from './bold';\nimport { BubbleMenuButtonDefault } from './button-default';\nimport { BubbleMenuButtonEditLink } from './button-edit-link';\nimport { BubbleMenuButtonForm } from './button-form';\nimport { BubbleMenuButtonToolbar } from './button-toolbar';\nimport { BubbleMenuButtonUnlink } from './button-unlink';\nimport { BubbleMenuCode } from './code';\nimport { BubbleMenuDefault } from './default';\nimport { BubbleMenuItemGroup } from './group';\nimport { BubbleMenuImageDefault } from './image-default';\nimport { BubbleMenuImageEditLink } from './image-edit-link';\nimport { BubbleMenuImageToolbar } from './image-toolbar';\nimport { BubbleMenuItalic } from './italic';\nimport { BubbleMenuItem } from './item';\nimport { BubbleMenuLinkDefault } from './link-default';\nimport { BubbleMenuLinkEditLink } from './link-edit-link';\nimport { BubbleMenuLinkForm } from './link-form';\nimport { BubbleMenuLinkOpenLink } from './link-open-link';\nimport { BubbleMenuLinkSelector } from './link-selector';\nimport { BubbleMenuLinkToolbar } from './link-toolbar';\nimport { BubbleMenuLinkUnlink } from './link-unlink';\nimport {\n BubbleMenuNodeSelector,\n NodeSelectorContent,\n NodeSelectorRoot,\n NodeSelectorTrigger,\n} from './node-selector';\nimport { BubbleMenuRoot } from './root';\nimport { BubbleMenuSeparator } from './separator';\nimport { BubbleMenuStrike } from './strike';\nimport { BubbleMenuUnderline } from './underline';\nimport { BubbleMenuUppercase } from './uppercase';\n\n// Named exports\nexport { BubbleMenuAlignCenter } from './align-center';\nexport { BubbleMenuAlignLeft } from './align-left';\nexport { BubbleMenuAlignRight } from './align-right';\nexport { BubbleMenuBold } from './bold';\nexport type { BubbleMenuButtonDefaultProps } from './button-default';\nexport { BubbleMenuButtonDefault } from './button-default';\nexport type { BubbleMenuButtonEditLinkProps } from './button-edit-link';\nexport { BubbleMenuButtonEditLink } from './button-edit-link';\nexport type { BubbleMenuButtonFormProps } from './button-form';\nexport { BubbleMenuButtonForm } from './button-form';\nexport type { BubbleMenuButtonToolbarProps } from './button-toolbar';\nexport { BubbleMenuButtonToolbar } from './button-toolbar';\nexport type { BubbleMenuButtonUnlinkProps } from './button-unlink';\nexport { BubbleMenuButtonUnlink } from './button-unlink';\nexport { BubbleMenuCode } from './code';\nexport type { BubbleMenuContextValue } from './context';\nexport { useBubbleMenuContext } from './context';\nexport type { PreWiredItemProps } from './create-mark-bubble-item';\nexport type { BubbleMenuDefaultProps } from './default';\nexport { BubbleMenuDefault } from './default';\nexport type { BubbleMenuItemGroupProps } from './group';\nexport { BubbleMenuItemGroup } from './group';\nexport type { BubbleMenuImageDefaultProps } from './image-default';\nexport { BubbleMenuImageDefault } from './image-default';\nexport type { BubbleMenuImageEditLinkProps } from './image-edit-link';\nexport { BubbleMenuImageEditLink } from './image-edit-link';\nexport type { BubbleMenuImageToolbarProps } from './image-toolbar';\nexport { BubbleMenuImageToolbar } from './image-toolbar';\nexport { BubbleMenuItalic } from './italic';\nexport type { BubbleMenuItemProps } from './item';\nexport { BubbleMenuItem } from './item';\nexport type { BubbleMenuLinkDefaultProps } from './link-default';\nexport { BubbleMenuLinkDefault } from './link-default';\nexport type { BubbleMenuLinkEditLinkProps } from './link-edit-link';\nexport { BubbleMenuLinkEditLink } from './link-edit-link';\nexport type { BubbleMenuLinkFormProps } from './link-form';\nexport { BubbleMenuLinkForm } from './link-form';\nexport type { BubbleMenuLinkOpenLinkProps } from './link-open-link';\nexport { BubbleMenuLinkOpenLink } from './link-open-link';\nexport type { BubbleMenuLinkSelectorProps } from './link-selector';\nexport { BubbleMenuLinkSelector } from './link-selector';\nexport type { BubbleMenuLinkToolbarProps } from './link-toolbar';\nexport { BubbleMenuLinkToolbar } from './link-toolbar';\nexport type { BubbleMenuLinkUnlinkProps } from './link-unlink';\nexport { BubbleMenuLinkUnlink } from './link-unlink';\nexport type {\n BubbleMenuNodeSelectorProps,\n NodeSelectorContentProps,\n NodeSelectorItem,\n NodeSelectorRootProps,\n NodeSelectorTriggerProps,\n NodeType,\n} from './node-selector';\nexport {\n BubbleMenuNodeSelector,\n NodeSelectorContent,\n NodeSelectorRoot,\n NodeSelectorTrigger,\n} from './node-selector';\nexport type { BubbleMenuRootProps } from './root';\nexport { BubbleMenuRoot } from './root';\nexport type { BubbleMenuSeparatorProps } from './separator';\nexport { BubbleMenuSeparator } from './separator';\nexport { BubbleMenuStrike } from './strike';\nexport type { TriggerFn, TriggerParams } from './triggers';\nexport { bubbleMenuTriggers } from './triggers';\nexport { BubbleMenuUnderline } from './underline';\nexport { BubbleMenuUppercase } from './uppercase';\n\nexport const BubbleMenu = {\n Root: BubbleMenuRoot,\n ItemGroup: BubbleMenuItemGroup,\n Separator: BubbleMenuSeparator,\n Item: BubbleMenuItem,\n Bold: BubbleMenuBold,\n Italic: BubbleMenuItalic,\n Underline: BubbleMenuUnderline,\n Strike: BubbleMenuStrike,\n Code: BubbleMenuCode,\n Uppercase: BubbleMenuUppercase,\n AlignLeft: BubbleMenuAlignLeft,\n AlignCenter: BubbleMenuAlignCenter,\n AlignRight: BubbleMenuAlignRight,\n NodeSelector: Object.assign(BubbleMenuNodeSelector, {\n Root: NodeSelectorRoot,\n Trigger: NodeSelectorTrigger,\n Content: NodeSelectorContent,\n }),\n LinkSelector: BubbleMenuLinkSelector,\n Default: BubbleMenuDefault,\n ButtonToolbar: BubbleMenuButtonToolbar,\n ButtonEditLink: BubbleMenuButtonEditLink,\n ButtonUnlink: BubbleMenuButtonUnlink,\n ButtonForm: BubbleMenuButtonForm,\n ButtonDefault: BubbleMenuButtonDefault,\n LinkToolbar: BubbleMenuLinkToolbar,\n LinkEditLink: BubbleMenuLinkEditLink,\n LinkUnlink: BubbleMenuLinkUnlink,\n LinkOpenLink: BubbleMenuLinkOpenLink,\n LinkForm: BubbleMenuLinkForm,\n LinkDefault: BubbleMenuLinkDefault,\n ImageToolbar: BubbleMenuImageToolbar,\n ImageEditLink: BubbleMenuImageEditLink,\n ImageDefault: BubbleMenuImageDefault,\n} as const;\n","import { CommandList } from './command-list';\nimport { SlashCommandRoot } from './root';\n\nexport const SlashCommand = {\n Root: SlashCommandRoot,\n CommandList,\n} as const;\n\nexport { CommandList } from './command-list';\nexport {\n BULLET_LIST,\n BUTTON,\n CODE,\n DIVIDER,\n defaultSlashCommands,\n FOUR_COLUMNS,\n H1,\n H2,\n H3,\n NUMBERED_LIST,\n QUOTE,\n SECTION,\n TEXT,\n THREE_COLUMNS,\n TWO_COLUMNS,\n} from './commands';\nexport { filterAndRankItems, scoreItem } from './search';\nexport type {\n CommandListProps,\n SearchableItem,\n SlashCommandItem,\n SlashCommandProps,\n SlashCommandRenderProps,\n SlashCommandRootProps,\n} from './types';\nexport { isAtMaxColumnsDepth, isInsideNode } from './utils';\n"],"mappings":";;;;AAIA,SAAgB,oBAAoB,EAAE,aAAuC;AAC3E,QAAO,oBAAC;EAAc;EAAW,iCAA8B;GAAK;;;;;ACqGtE,MAAa,aAAa;CACxB,MAAM;CACN,WAAW;CACX,WAAW;CACX,MAAM;CACN,MAAM;CACN,QAAQ;CACR,WAAW;CACX,QAAQ;CACR,MAAM;CACN,WAAW;CACX,WAAW;CACX,aAAa;CACb,YAAY;CACZ,cAAc,OAAO,OAAO,wBAAwB;EAClD,MAAM;EACN,SAAS;EACT,SAAS;EACV,CAAC;CACF,cAAc;CACd,SAAS;CACT,eAAe;CACf,gBAAgB;CAChB,cAAc;CACd,YAAY;CACZ,eAAe;CACf,aAAa;CACb,cAAc;CACd,YAAY;CACZ,cAAc;CACd,UAAU;CACV,aAAa;CACb,cAAc;CACd,eAAe;CACf,cAAc;CACf;;;;AC1ID,MAAa,eAAe;CAC1B,MAAM;CACN;CACD"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["React"],"sources":["../../src/ui/icons/align-center-vertical.tsx","../../src/ui/icons/align-end-vertical.tsx","../../src/ui/icons/align-start-vertical.tsx","../../src/ui/icons/box.tsx","../../src/ui/icons/image.tsx","../../src/ui/icons/layout.tsx","../../src/ui/icons/minus.tsx","../../src/ui/icons/mouse-pointer-click.tsx","../../src/ui/icons/square-round-corner.tsx","../../src/ui/icons/table.tsx","../../src/ui/icons/type.tsx","../../src/ui/bubble-menu/separator.tsx","../../src/ui/bubble-menu/index.ts","../../src/ui/inspector/provider.tsx","../../src/ui/inspector/breadcrumb.tsx","../../src/ui/inspector/document.tsx","../../src/ui/inspector/index.tsx","../../src/ui/slash-command/index.ts"],"sourcesContent":["import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function AlignCenterVerticalIcon({\n size,\n width,\n height,\n ...props\n}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M12 2v20\" />\n <path d=\"M8 10H4a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h4\" />\n <path d=\"M16 10h4a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2h-4\" />\n <path d=\"M8 20H7a2 2 0 0 1-2-2v-2c0-1.1.9-2 2-2h1\" />\n <path d=\"M16 14h1a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2h-1\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function AlignEndVerticalIcon({\n size,\n width,\n height,\n ...props\n}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <rect width=\"9\" height=\"6\" x=\"9\" y=\"14\" rx=\"2\" />\n <rect width=\"16\" height=\"6\" x=\"2\" y=\"4\" rx=\"2\" />\n <path d=\"M22 2v20\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function AlignStartVerticalIcon({\n size,\n width,\n height,\n ...props\n}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <rect width=\"9\" height=\"6\" x=\"6\" y=\"14\" rx=\"2\" />\n <rect width=\"16\" height=\"6\" x=\"6\" y=\"4\" rx=\"2\" />\n <path d=\"M2 2v20\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function BoxIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\" />\n <path d=\"m3.3 7 8.7 5 8.7-5\" />\n <path d=\"M12 22V12\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function ImageIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function LayoutIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M9 21V9\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function MinusIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M5 12h14\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function MousePointerClickIcon({\n size,\n width,\n height,\n ...props\n}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M14 4.1 12 6\" />\n <path d=\"m5.1 8-2.9-.8\" />\n <path d=\"m6 12-1.9 2\" />\n <path d=\"M7.2 2.2 8 5.1\" />\n <path d=\"M9.037 9.69a.498.498 0 0 1 .653-.653l11 4.5a.5.5 0 0 1-.074.949l-4.349 1.041a1 1 0 0 0-.74.739l-1.04 4.35a.5.5 0 0 1-.95.074z\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function SquareRoundCornerIcon({\n size,\n width,\n height,\n ...props\n}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\" />\n <path d=\"M14 3a8 8 0 0 1 8 8\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function TableIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M12 3v18\" />\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M3 15h18\" />\n </svg>\n );\n}\n","import type * as React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n size?: number | string;\n}\n\nexport function TypeIcon({ size, width, height, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? width ?? 24}\n height={size ?? height ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <polyline points=\"4 7 4 4 20 4 20 7\" />\n <line x1=\"9\" x2=\"15\" y1=\"20\" y2=\"20\" />\n <line x1=\"12\" x2=\"12\" y1=\"4\" y2=\"20\" />\n </svg>\n );\n}\n","export interface BubbleMenuSeparatorProps {\n className?: string;\n}\n\nexport function BubbleMenuSeparator({ className }: BubbleMenuSeparatorProps) {\n return <hr className={className} data-re-bubble-menu-separator=\"\" />;\n}\n","import { BubbleMenuAlignCenter } from './align-center';\nimport { BubbleMenuAlignLeft } from './align-left';\nimport { BubbleMenuAlignRight } from './align-right';\nimport { BubbleMenuBold } from './bold';\nimport { BubbleMenuButtonDefault } from './button-default';\nimport { BubbleMenuButtonEditLink } from './button-edit-link';\nimport { BubbleMenuButtonForm } from './button-form';\nimport { BubbleMenuButtonToolbar } from './button-toolbar';\nimport { BubbleMenuButtonUnlink } from './button-unlink';\nimport { BubbleMenuCode } from './code';\nimport { BubbleMenuDefault } from './default';\nimport { BubbleMenuItemGroup } from './group';\nimport { BubbleMenuImageDefault } from './image-default';\nimport { BubbleMenuImageEditLink } from './image-edit-link';\nimport { BubbleMenuImageToolbar } from './image-toolbar';\nimport { BubbleMenuItalic } from './italic';\nimport { BubbleMenuItem } from './item';\nimport { BubbleMenuLinkDefault } from './link-default';\nimport { BubbleMenuLinkEditLink } from './link-edit-link';\nimport { BubbleMenuLinkForm } from './link-form';\nimport { BubbleMenuLinkOpenLink } from './link-open-link';\nimport { BubbleMenuLinkSelector } from './link-selector';\nimport { BubbleMenuLinkToolbar } from './link-toolbar';\nimport { BubbleMenuLinkUnlink } from './link-unlink';\nimport {\n BubbleMenuNodeSelector,\n NodeSelectorContent,\n NodeSelectorRoot,\n NodeSelectorTrigger,\n} from './node-selector';\nimport { BubbleMenuRoot } from './root';\nimport { BubbleMenuSeparator } from './separator';\nimport { BubbleMenuStrike } from './strike';\nimport { BubbleMenuUnderline } from './underline';\nimport { BubbleMenuUppercase } from './uppercase';\n\n// Named exports\nexport { BubbleMenuAlignCenter } from './align-center';\nexport { BubbleMenuAlignLeft } from './align-left';\nexport { BubbleMenuAlignRight } from './align-right';\nexport { BubbleMenuBold } from './bold';\nexport type { BubbleMenuButtonDefaultProps } from './button-default';\nexport { BubbleMenuButtonDefault } from './button-default';\nexport type { BubbleMenuButtonEditLinkProps } from './button-edit-link';\nexport { BubbleMenuButtonEditLink } from './button-edit-link';\nexport type { BubbleMenuButtonFormProps } from './button-form';\nexport { BubbleMenuButtonForm } from './button-form';\nexport type { BubbleMenuButtonToolbarProps } from './button-toolbar';\nexport { BubbleMenuButtonToolbar } from './button-toolbar';\nexport type { BubbleMenuButtonUnlinkProps } from './button-unlink';\nexport { BubbleMenuButtonUnlink } from './button-unlink';\nexport { BubbleMenuCode } from './code';\nexport type { BubbleMenuContextValue } from './context';\nexport { useBubbleMenuContext } from './context';\nexport type { PreWiredItemProps } from './create-mark-bubble-item';\nexport type { BubbleMenuDefaultProps } from './default';\nexport { BubbleMenuDefault } from './default';\nexport type { BubbleMenuItemGroupProps } from './group';\nexport { BubbleMenuItemGroup } from './group';\nexport type { BubbleMenuImageDefaultProps } from './image-default';\nexport { BubbleMenuImageDefault } from './image-default';\nexport type { BubbleMenuImageEditLinkProps } from './image-edit-link';\nexport { BubbleMenuImageEditLink } from './image-edit-link';\nexport type { BubbleMenuImageToolbarProps } from './image-toolbar';\nexport { BubbleMenuImageToolbar } from './image-toolbar';\nexport { BubbleMenuItalic } from './italic';\nexport type { BubbleMenuItemProps } from './item';\nexport { BubbleMenuItem } from './item';\nexport type { BubbleMenuLinkDefaultProps } from './link-default';\nexport { BubbleMenuLinkDefault } from './link-default';\nexport type { BubbleMenuLinkEditLinkProps } from './link-edit-link';\nexport { BubbleMenuLinkEditLink } from './link-edit-link';\nexport type { BubbleMenuLinkFormProps } from './link-form';\nexport { BubbleMenuLinkForm } from './link-form';\nexport type { BubbleMenuLinkOpenLinkProps } from './link-open-link';\nexport { BubbleMenuLinkOpenLink } from './link-open-link';\nexport type { BubbleMenuLinkSelectorProps } from './link-selector';\nexport { BubbleMenuLinkSelector } from './link-selector';\nexport type { BubbleMenuLinkToolbarProps } from './link-toolbar';\nexport { BubbleMenuLinkToolbar } from './link-toolbar';\nexport type { BubbleMenuLinkUnlinkProps } from './link-unlink';\nexport { BubbleMenuLinkUnlink } from './link-unlink';\nexport type {\n BubbleMenuNodeSelectorProps,\n NodeSelectorContentProps,\n NodeSelectorItem,\n NodeSelectorRootProps,\n NodeSelectorTriggerProps,\n NodeType,\n} from './node-selector';\nexport {\n BubbleMenuNodeSelector,\n NodeSelectorContent,\n NodeSelectorRoot,\n NodeSelectorTrigger,\n} from './node-selector';\nexport type { BubbleMenuRootProps } from './root';\nexport { BubbleMenuRoot } from './root';\nexport type { BubbleMenuSeparatorProps } from './separator';\nexport { BubbleMenuSeparator } from './separator';\nexport { BubbleMenuStrike } from './strike';\nexport type { TriggerFn, TriggerParams } from './triggers';\nexport { bubbleMenuTriggers } from './triggers';\nexport { BubbleMenuUnderline } from './underline';\nexport { BubbleMenuUppercase } from './uppercase';\n\nexport const BubbleMenu = {\n Root: BubbleMenuRoot,\n ItemGroup: BubbleMenuItemGroup,\n Separator: BubbleMenuSeparator,\n Item: BubbleMenuItem,\n Bold: BubbleMenuBold,\n Italic: BubbleMenuItalic,\n Underline: BubbleMenuUnderline,\n Strike: BubbleMenuStrike,\n Code: BubbleMenuCode,\n Uppercase: BubbleMenuUppercase,\n AlignLeft: BubbleMenuAlignLeft,\n AlignCenter: BubbleMenuAlignCenter,\n AlignRight: BubbleMenuAlignRight,\n NodeSelector: Object.assign(BubbleMenuNodeSelector, {\n Root: NodeSelectorRoot,\n Trigger: NodeSelectorTrigger,\n Content: NodeSelectorContent,\n }),\n LinkSelector: BubbleMenuLinkSelector,\n Default: BubbleMenuDefault,\n ButtonToolbar: BubbleMenuButtonToolbar,\n ButtonEditLink: BubbleMenuButtonEditLink,\n ButtonUnlink: BubbleMenuButtonUnlink,\n ButtonForm: BubbleMenuButtonForm,\n ButtonDefault: BubbleMenuButtonDefault,\n LinkToolbar: BubbleMenuLinkToolbar,\n LinkEditLink: BubbleMenuLinkEditLink,\n LinkUnlink: BubbleMenuLinkUnlink,\n LinkOpenLink: BubbleMenuLinkOpenLink,\n LinkForm: BubbleMenuLinkForm,\n LinkDefault: BubbleMenuLinkDefault,\n ImageToolbar: BubbleMenuImageToolbar,\n ImageEditLink: BubbleMenuImageEditLink,\n ImageDefault: BubbleMenuImageDefault,\n} as const;\n","import { extensions } from '@tiptap/core';\nimport type { Attrs } from '@tiptap/pm/model';\nimport {\n NodeSelection,\n Plugin,\n PluginKey,\n TextSelection,\n} from '@tiptap/pm/state';\nimport { useCurrentEditor, useEditorState } from '@tiptap/react';\nimport * as React from 'react';\nimport type { NodeClickedEvent } from '../../core';\n\nconst IGNORED_NODES = ['doc', 'text'];\n\nfunction getHierarchyAtPosition(\n editor: ReturnType<typeof useCurrentEditor>['editor'],\n pos: number,\n): NodeClickedEvent[] {\n if (!editor) {\n return [];\n }\n\n const { doc } = editor.state;\n const hierarchy: NodeClickedEvent[] = [];\n\n const nodeAtPos = doc.nodeAt(pos);\n if (nodeAtPos && !IGNORED_NODES.includes(nodeAtPos.type.name)) {\n hierarchy.push({\n nodeType: nodeAtPos.type.name,\n nodeAttrs: { ...nodeAtPos.attrs },\n nodePos: { pos, inside: pos },\n });\n }\n\n const resolvedPos = doc.resolve(pos);\n for (let depth = resolvedPos.depth; depth > 0; depth--) {\n const node = resolvedPos.node(depth);\n const nodePos = resolvedPos.before(depth);\n\n if (node && !IGNORED_NODES.includes(node.type.name)) {\n const isDuplicate = hierarchy.some((h) => h.nodePos.pos === nodePos);\n if (!isDuplicate) {\n hierarchy.push({\n nodeType: node.type.name,\n nodeAttrs: { ...node.attrs },\n nodePos: { pos: nodePos, inside: nodePos },\n });\n }\n }\n }\n\n return hierarchy;\n}\n\nfunction getNodeHierarchy(\n editor: ReturnType<typeof useCurrentEditor>['editor'],\n): NodeClickedEvent[] {\n if (!editor) {\n return [];\n }\n\n const { selection } = editor.state;\n const hierarchy: NodeClickedEvent[] = [];\n\n if (selection instanceof NodeSelection) {\n const node = selection.node;\n if (node && !IGNORED_NODES.includes(node.type.name)) {\n hierarchy.push({\n nodeType: node.type.name,\n nodeAttrs: { ...node.attrs },\n nodePos: { pos: selection.from, inside: selection.from },\n });\n }\n }\n\n const { from } = selection;\n const resolvedPos = editor.state.doc.resolve(from);\n\n for (let depth = resolvedPos.depth; depth > 0; depth--) {\n const node = resolvedPos.node(depth);\n const pos = resolvedPos.before(depth);\n\n if (node && !IGNORED_NODES.includes(node.type.name)) {\n const isDuplicate = hierarchy.some((h) => h.nodePos.pos === pos);\n if (!isDuplicate) {\n hierarchy.push({\n nodeType: node.type.name,\n nodeAttrs: { ...node.attrs },\n nodePos: { pos, inside: pos },\n });\n }\n }\n }\n\n return hierarchy;\n}\n\nexport interface FocusedNode {\n nodeType: string;\n nodeAttrs: Attrs;\n nodePos: { pos: number; inside: number };\n}\n\ntype InspectorTarget = 'doc' | 'text' | FocusedNode | null;\n\nexport interface RootProps {\n children: React.ReactNode;\n}\n\nexport interface InspectorContextValue {\n target: InspectorTarget;\n pathFromRoot: FocusedNode[];\n\n focus: (event: Event) => void;\n blur: (event: Event) => void;\n}\n\nexport const InspectorContext =\n React.createContext<InspectorContextValue | null>(null);\n\nexport function useInspector() {\n const context = React.useContext(InspectorContext);\n if (!context) {\n throw new Error(\n 'useInspector can only be called from inside the InspectorContext. This probably means you forgot the <Inspector.Provider>',\n );\n }\n return context;\n}\n\nexport function InspectorProvider({ children }: RootProps) {\n const { editor } = useCurrentEditor();\n\n const target = useEditorState({\n editor,\n selector(context): InspectorTarget {\n if (!context.editor) {\n return null;\n }\n\n if (!context.editor.isFocused) {\n return 'doc';\n }\n\n const { selection } = context.editor.state;\n\n if (selection.content().size > 0 && selection instanceof TextSelection) {\n const { $from } = selection;\n for (let depth = $from.depth; depth > 0; depth--) {\n if ($from.node(depth).type.name === 'button') {\n const pos = $from.before(depth);\n const node = context.editor.state.doc.nodeAt(pos);\n if (node) {\n return {\n nodeType: 'button',\n nodeAttrs: { ...node.attrs },\n nodePos: { pos, inside: pos },\n };\n }\n break;\n }\n }\n\n return 'text';\n }\n\n const hierarchy = getNodeHierarchy(context.editor);\n\n if (hierarchy.length > 0) {\n const innermost = hierarchy[0];\n const columnEntry = hierarchy.find(\n (h) => h.nodeType === 'columnsColumn',\n );\n const preferColumn = columnEntry && innermost.nodeType === 'paragraph';\n return preferColumn ? columnEntry : innermost;\n }\n\n return 'doc';\n },\n });\n\n const pathFromRoot = React.useMemo(() => {\n if (!editor) {\n return [];\n }\n if (typeof target === 'object' && target) {\n const atPos = getHierarchyAtPosition(editor, target.nodePos.pos);\n const path = [...atPos].reverse();\n return path.length > 0 ? path : [target];\n }\n if (target === 'text') {\n const hierarchy = getNodeHierarchy(editor);\n return [...hierarchy].reverse();\n }\n return [];\n }, [editor, target]);\n\n const editorDomFocused = React.useRef(false);\n const inspectorFocused = React.useRef(false);\n React.useEffect(() => {\n const defaultFocusPlugin = editor?.state.plugins.find(\n (plugin) => plugin.spec.key === extensions.focusEventsPluginKey,\n );\n if (editor && defaultFocusPlugin) {\n editor?.unregisterPlugin(extensions.focusEventsPluginKey);\n const pluginKey = new PluginKey('inspectorReactEmailFocusEvents');\n editor.registerPlugin(\n new Plugin({\n key: pluginKey,\n props: {\n handleDOMEvents: {\n focus: (view, event: Event) => {\n editorDomFocused.current = true;\n editor.isFocused = true;\n\n const transaction = editor.state.tr\n .setMeta('focus', { event })\n .setMeta('addToHistory', false);\n\n view.dispatch(transaction);\n\n return false;\n },\n blur: (view, event: Event) => {\n editorDomFocused.current = false;\n\n if (!inspectorFocused.current) {\n editor.isFocused = false;\n\n const transaction = editor.state.tr\n .setMeta('blur', { event })\n .setMeta('addToHistory', false);\n\n view.dispatch(transaction);\n }\n\n return false;\n },\n },\n },\n }),\n );\n\n return () => {\n editor?.unregisterPlugin(pluginKey);\n editor?.registerPlugin(defaultFocusPlugin);\n };\n }\n }, [editor]);\n\n return (\n <InspectorContext.Provider\n value={{\n target,\n pathFromRoot,\n focus: (event: Event) => {\n inspectorFocused.current = true;\n if (editor) {\n editor.isFocused = true;\n\n const transaction = editor.state.tr\n .setMeta('focus', { event })\n .setMeta('addToHistory', false);\n\n editor.view.dispatch(transaction);\n }\n },\n blur: (event: Event) => {\n inspectorFocused.current = false;\n if (!editorDomFocused.current && editor) {\n editor.isFocused = false;\n\n const transaction = editor.state.tr\n .setMeta('blur', { event })\n .setMeta('addToHistory', false);\n\n editor.view.dispatch(transaction);\n }\n },\n }}\n >\n {children}\n </InspectorContext.Provider>\n );\n}\n","import { useCurrentEditor } from '@tiptap/react';\nimport React from 'react';\nimport { type FocusedNode, useInspector } from './provider';\n\nexport interface InspectorBreadcrumbSegment {\n node: FocusedNode | null;\n focus: () => void;\n}\n\nexport interface InspectorBreadcrumbProps {\n children: (segments: InspectorBreadcrumbSegment[]) => React.ReactNode;\n}\n\nexport function InspectorBreadcrumb({ children }: InspectorBreadcrumbProps) {\n const { editor } = useCurrentEditor();\n const { pathFromRoot } = useInspector();\n\n const segments = React.useMemo(() => {\n return [\n {\n node: null,\n focus() {\n editor?.commands.setTextSelection(0);\n },\n },\n ...pathFromRoot.map((focusedNode) => ({\n node: focusedNode,\n focus() {\n editor?.commands.setNodeSelection(focusedNode.nodePos.pos);\n editor?.commands.focus();\n },\n })),\n ] satisfies InspectorBreadcrumbSegment[];\n }, [pathFromRoot]);\n\n return children(segments);\n}\n","import { useCurrentEditor } from '@tiptap/react';\nimport {\n setGlobalStyles,\n useEmailTheming,\n} from '../../plugins/email-theming/extension';\nimport {\n EDITOR_THEMES,\n SUPPORTED_CSS_PROPERTIES,\n} from '../../plugins/email-theming/themes';\nimport type {\n KnownCssProperties,\n KnownThemeComponents,\n PanelGroup,\n} from '../../plugins/email-theming/types';\nimport { useInspector } from './provider';\n\nfunction ensureAllProperties(\n currentStyles: PanelGroup[],\n themeDefaults: PanelGroup[],\n): PanelGroup[] {\n return currentStyles.map((group) => {\n const defaultGroup = themeDefaults.find((g) =>\n group.id ? g.id === group.id : g.title === group.title,\n );\n\n if (!defaultGroup || defaultGroup.inputs.length === 0) {\n return group;\n }\n\n const existingProps = new Set(\n group.inputs.map((i) => `${i.classReference}:${i.prop}`),\n );\n\n const missingInputs = defaultGroup.inputs\n .filter(\n (defaultInput) =>\n !existingProps.has(\n `${defaultInput.classReference}:${defaultInput.prop}`,\n ),\n )\n .map((defaultInput) => {\n const propDef = SUPPORTED_CSS_PROPERTIES[defaultInput.prop];\n\n if (propDef && propDef.type === 'number') {\n return {\n ...defaultInput,\n value: '' as string | number,\n placeholder: String(propDef.defaultValue),\n };\n }\n\n return { ...defaultInput };\n });\n\n if (missingInputs.length === 0) {\n return group;\n }\n\n return {\n ...group,\n inputs: [...group.inputs, ...missingInputs],\n };\n });\n}\n\nfunction applyStyleChange(\n styles: PanelGroup[],\n themeName: 'basic' | 'minimal',\n {\n classReference,\n prop,\n newValue,\n }: {\n classReference?: string;\n prop: string;\n newValue: string | number;\n },\n): PanelGroup[] {\n let found = false;\n\n const updatedStyles = styles.map((styleGroup) => {\n const matchingInput = styleGroup.inputs.find(\n (input) => input.classReference === classReference && input.prop === prop,\n );\n\n if (matchingInput) {\n found = true;\n return {\n ...styleGroup,\n inputs: styleGroup.inputs.map((input) => {\n if (input.classReference === classReference && input.prop === prop) {\n return { ...input, value: newValue };\n }\n return input;\n }),\n };\n }\n\n return styleGroup;\n });\n\n if (found) {\n return updatedStyles;\n }\n\n const propDef = SUPPORTED_CSS_PROPERTIES[prop as KnownCssProperties] ?? null;\n\n return updatedStyles.map((styleGroup) => {\n if (styleGroup.classReference !== classReference) {\n return styleGroup;\n }\n\n const themeDefaults = EDITOR_THEMES[themeName];\n const defaultGroup = themeDefaults.find((g) =>\n styleGroup.id ? g.id === styleGroup.id : g.title === styleGroup.title,\n );\n const defaultInput = defaultGroup?.inputs.find(\n (i) => i.prop === prop && i.classReference === classReference,\n );\n\n if (defaultInput) {\n return {\n ...styleGroup,\n inputs: [...styleGroup.inputs, { ...defaultInput, value: newValue }],\n };\n }\n\n if (propDef) {\n return {\n ...styleGroup,\n inputs: [\n ...styleGroup.inputs,\n {\n label: propDef.label,\n type: propDef.type,\n value: newValue,\n prop: prop as KnownCssProperties,\n classReference: classReference as KnownThemeComponents | undefined,\n unit: propDef.unit,\n options: propDef.options,\n },\n ],\n };\n }\n\n return styleGroup;\n });\n}\n\nexport type SetGlobalStyle = (\n classReference: KnownThemeComponents,\n property: KnownCssProperties,\n value: unknown,\n) => void;\n\nexport type BatchSetGlobalStyle = (\n changes: Array<{\n classReference: KnownThemeComponents;\n property: KnownCssProperties;\n value: unknown;\n }>,\n) => void;\n\nexport type FindStyleValue = (\n classReference: KnownThemeComponents,\n prop: KnownCssProperties,\n) => string | number;\n\nexport interface InspectorDocumentContext {\n styles: PanelGroup[];\n setGlobalStyle: SetGlobalStyle;\n batchSetGlobalStyle: BatchSetGlobalStyle;\n findStyleValue: FindStyleValue;\n}\n\nexport interface InspectorDocumentProps {\n children: (context: InspectorDocumentContext) => React.ReactNode;\n}\n\nexport function InspectorDocument({ children }: InspectorDocumentProps) {\n const { editor } = useCurrentEditor();\n const theming = useEmailTheming(editor);\n const { target } = useInspector();\n\n if (!editor || !theming) {\n return null;\n }\n\n const themeDefaults = EDITOR_THEMES[theming.theme];\n\n const groups = ensureAllProperties(theming.styles, themeDefaults);\n\n function setGlobalStyle(\n classReference: KnownThemeComponents,\n property: KnownCssProperties,\n value: unknown,\n ) {\n const newStyles = applyStyleChange(theming!.styles, theming!.theme, {\n classReference,\n prop: property,\n newValue: value as string | number,\n });\n setGlobalStyles(editor!, newStyles);\n }\n\n function batchSetGlobalStyle(\n changes: Array<{\n classReference: KnownThemeComponents;\n property: KnownCssProperties;\n value: unknown;\n }>,\n ) {\n let styles = theming!.styles;\n for (const change of changes) {\n styles = applyStyleChange(styles, theming!.theme, {\n classReference: change.classReference,\n prop: change.property,\n newValue: change.value as string | number,\n });\n }\n setGlobalStyles(editor!, styles);\n }\n\n function findStyleValue(\n classReference: KnownThemeComponents,\n prop: KnownCssProperties,\n ): string | number {\n for (const group of groups) {\n const input = group.inputs.find(\n (i) => i.classReference === classReference && i.prop === prop,\n );\n if (input) return input.value;\n }\n\n for (const group of themeDefaults) {\n const input = group.inputs.find(\n (i) => i.classReference === classReference && i.prop === prop,\n );\n if (input) return input.value;\n }\n\n const propDef = SUPPORTED_CSS_PROPERTIES[prop];\n return propDef?.defaultValue ?? '';\n }\n\n if (target === 'doc') {\n return (\n <>\n {children({\n styles: groups,\n setGlobalStyle,\n batchSetGlobalStyle,\n findStyleValue,\n })}\n </>\n );\n }\n}\n","'use client';\n\nimport { InspectorBreadcrumb } from './breadcrumb';\nimport { InspectorDocument } from './document';\nimport { InspectorProvider } from './provider';\n\nexport const Inspector = {\n Provider: InspectorProvider,\n Breadcrumb: InspectorBreadcrumb,\n Document: InspectorDocument,\n};\n\nexport type { InspectorDocumentProps } from './document';\n","import { CommandList } from './command-list';\nimport { SlashCommandRoot } from './root';\n\nexport const SlashCommand = {\n Root: SlashCommandRoot,\n CommandList,\n} as const;\n\nexport { CommandList } from './command-list';\nexport {\n BULLET_LIST,\n BUTTON,\n CODE,\n DIVIDER,\n defaultSlashCommands,\n FOUR_COLUMNS,\n H1,\n H2,\n H3,\n NUMBERED_LIST,\n QUOTE,\n SECTION,\n TEXT,\n THREE_COLUMNS,\n TWO_COLUMNS,\n} from './commands';\nexport { filterAndRankItems, scoreItem } from './search';\nexport type {\n CommandListProps,\n SearchableItem,\n SlashCommandItem,\n SlashCommandProps,\n SlashCommandRenderProps,\n SlashCommandRootProps,\n} from './types';\nexport { isAtMaxColumnsDepth, isInsideNode } from './utils';\n"],"mappings":"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"}
|
package/dist/utils/index.cjs
CHANGED
package/dist/utils/index.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-email/editor",
|
|
3
|
-
"version": "0.0.0-experimental.
|
|
3
|
+
"version": "0.0.0-experimental.43",
|
|
4
4
|
"description": "",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"**/*.css"
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
"@floating-ui/react-dom": "^2.1.8",
|
|
100
100
|
"@tiptap/core": "^3.17.1",
|
|
101
101
|
"@tiptap/extension-blockquote": "^3.17.1",
|
|
102
|
-
"@tiptap/extension-bold": "^3.
|
|
102
|
+
"@tiptap/extension-bold": "^3.17.1",
|
|
103
103
|
"@tiptap/extension-bullet-list": "^3.17.1",
|
|
104
104
|
"@tiptap/extension-code": "^3.17.1",
|
|
105
105
|
"@tiptap/extension-code-block": "^3.17.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extension-BZsTEb_s.mjs","names":["acc"],"sources":["../src/plugins/email-theming/css-transforms.ts","../src/plugins/email-theming/themes.ts","../src/plugins/email-theming/normalization.ts","../src/plugins/email-theming/extension.tsx"],"sourcesContent":["import { ensureBorderStyleFallback } from '../../utils/styles';\nimport type { CssJs, PanelGroup } from './types';\n\nexport function transformToCssJs(\n styleArray: PanelGroup[],\n baseFontSize: number,\n): CssJs {\n const cssJS = {} as CssJs;\n\n if (!Array.isArray(styleArray)) {\n return cssJS;\n }\n\n for (const style of styleArray) {\n for (const input of style.inputs) {\n let value = input.value;\n\n // If there's a unit property, append it to the value\n if (input.unit && typeof value === 'number') {\n // if font size prop convert px unit to em to adjust size in mobile\n if (input.prop === 'fontSize') {\n value = `${value / baseFontSize}em`;\n } else {\n value = `${value}${input.unit}`;\n }\n }\n\n if (!input.classReference) {\n continue;\n }\n\n if (!cssJS[input.classReference]) {\n cssJS[input.classReference] = {};\n }\n\n // @ts-expect-error -- backward compatibility: 'h-padding' is a legacy prop not in KnownCssProperties\n if (input.prop === 'h-padding') {\n cssJS[input.classReference].paddingLeft = value;\n cssJS[input.classReference].paddingRight = value;\n\n continue;\n }\n\n // @ts-expect-error -- input.prop is KnownCssProperties but CssJs values are React.CSSProperties; dynamic assignment is intentional\n cssJS[input.classReference][input.prop] = value;\n }\n }\n\n for (const key of Object.keys(cssJS)) {\n ensureBorderStyleFallback(\n cssJS[key as keyof CssJs] as Record<string, string | number>,\n );\n }\n\n return cssJS;\n}\n\nexport function mergeCssJs(original: CssJs, newCssJs: CssJs) {\n const merged = { ...original };\n\n for (const key in newCssJs) {\n const keyType = key as keyof CssJs;\n\n if (\n Object.hasOwn(merged, key) &&\n typeof merged[keyType] === 'object' &&\n !Array.isArray(merged[keyType])\n ) {\n merged[keyType] = {\n ...merged[keyType],\n ...newCssJs[keyType],\n };\n } else {\n merged[keyType] = newCssJs[keyType];\n }\n }\n\n return merged;\n}\n\nexport function injectThemeCss(\n styles: CssJs,\n options: { styleId?: string; scopeSelector?: string } = {},\n) {\n const container =\n options.scopeSelector ?? '.tiptap-extended .tiptap.ProseMirror';\n const prefix = '.node-';\n const styleId = options.styleId ?? 'tiptap-extended-theme-css';\n\n const css = Object.entries(styles).reduce((acc, [key, value]) => {\n const className =\n key === 'body' ? container : `${container} ${prefix}${key}`;\n\n const cssString = Object.entries(value).reduce((acc, [prop, val]) => {\n const normalizeProp = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n\n return `${acc}${normalizeProp}:${val};`;\n }, '');\n\n return `${acc}${className}{${cssString}}`;\n }, '');\n\n let styleTag = document.getElementById(styleId) as HTMLStyleElement;\n\n if (!styleTag) {\n styleTag = document.createElement('style');\n styleTag.textContent = css;\n styleTag.id = styleId;\n\n document.head.appendChild(styleTag);\n\n return;\n }\n\n styleTag.textContent = css;\n}\n\nexport function injectGlobalPlainCss(\n css?: string | null,\n options: { styleId?: string; scopeSelector?: string } = {},\n) {\n if (!css) {\n return;\n }\n\n const styleId = options.styleId ?? 'global-editor-style';\n const container = options.scopeSelector ?? '.tiptap-extended .ProseMirror';\n let styleElement = document.getElementById(styleId);\n\n if (!styleElement) {\n styleElement = document.createElement('style');\n styleElement.id = styleId;\n document.head.appendChild(styleElement);\n }\n\n // Remove CSS within @media (prefers-color-scheme: dark) blocks\n const cleanedCSS = css.replace(\n /@media\\s?\\(prefers-color-scheme:\\s?dark\\)\\s?{([\\s\\S]+?})\\s*}/g,\n '',\n );\n\n // TODO: Figure out a way to extract the body and apply the styles out of the nested .tiptap-extended\n styleElement.textContent = `${container} { ${cleanedCSS} }`;\n}\n","import type {\n EditorTheme,\n PanelGroup,\n PanelSectionId,\n ResetTheme,\n SupportedCssProperties,\n} from './types';\n\n/**\n * Single source of truth for panel section display titles.\n * Titles are resolved from here at render time via `getPanelTitle`,\n * so they never depend on what's persisted in the DB.\n */\nconst PANEL_SECTION_TITLES: Record<PanelSectionId, string> = {\n body: 'Background',\n container: 'Body',\n typography: 'Text',\n h1: 'Title',\n h2: 'Subtitle',\n h3: 'Heading',\n link: 'Link',\n image: 'Image',\n button: 'Button',\n 'code-block': 'Code Block',\n 'inline-code': 'Inline Code',\n};\n\n/**\n * Resolves the display title for a panel group.\n * Uses the `id` lookup when available, falls back to the\n * DB-persisted `title` for backwards compatibility.\n */\nexport function getPanelTitle(group: PanelGroup): string {\n if (group.id && group.id in PANEL_SECTION_TITLES) {\n return PANEL_SECTION_TITLES[group.id];\n }\n return group.title;\n}\n\nconst THEME_BASIC: PanelGroup[] = [\n {\n id: 'body',\n title: 'Background',\n classReference: 'body',\n inputs: [],\n },\n {\n id: 'container',\n title: 'Content',\n classReference: 'container',\n inputs: [\n {\n label: 'Align',\n type: 'select',\n value: 'left',\n options: {\n left: 'Left',\n center: 'Center',\n right: 'Right',\n },\n prop: 'align',\n classReference: 'container',\n },\n {\n label: 'Width',\n type: 'number',\n value: 600,\n unit: 'px',\n prop: 'width',\n classReference: 'container',\n },\n {\n label: 'Padding Left',\n type: 'number',\n value: 0,\n unit: 'px',\n prop: 'paddingLeft',\n classReference: 'container',\n },\n {\n label: 'Padding Right',\n type: 'number',\n value: 0,\n unit: 'px',\n prop: 'paddingRight',\n classReference: 'container',\n },\n ],\n },\n {\n id: 'typography',\n title: 'Text',\n classReference: 'body',\n inputs: [\n {\n label: 'Font size',\n type: 'number',\n value: 14,\n unit: 'px',\n prop: 'fontSize',\n classReference: 'body',\n },\n {\n label: 'Line Height',\n type: 'number',\n value: 155,\n unit: '%',\n prop: 'lineHeight',\n classReference: 'container',\n },\n ],\n },\n {\n id: 'h1',\n title: 'Title',\n category: 'Text',\n classReference: 'h1',\n inputs: [],\n },\n {\n id: 'h2',\n title: 'Subtitle',\n category: 'Text',\n classReference: 'h2',\n inputs: [],\n },\n {\n id: 'h3',\n title: 'Heading',\n category: 'Text',\n classReference: 'h3',\n inputs: [],\n },\n {\n id: 'link',\n title: 'Link',\n classReference: 'link',\n inputs: [\n {\n label: 'Color',\n type: 'color',\n value: '#0670DB',\n prop: 'color',\n classReference: 'link',\n },\n {\n label: 'Decoration',\n type: 'select',\n value: 'underline',\n prop: 'textDecoration',\n options: {\n underline: 'Underline',\n none: 'None',\n },\n classReference: 'link',\n },\n ],\n },\n {\n id: 'image',\n title: 'Image',\n classReference: 'image',\n inputs: [\n {\n label: 'Border radius',\n type: 'number',\n value: 8,\n unit: 'px',\n prop: 'borderRadius',\n classReference: 'image',\n },\n ],\n },\n {\n id: 'button',\n title: 'Button',\n classReference: 'button',\n inputs: [\n {\n label: 'Background',\n type: 'color',\n value: '#000000',\n prop: 'backgroundColor',\n classReference: 'button',\n },\n {\n label: 'Text color',\n type: 'color',\n value: '#ffffff',\n prop: 'color',\n classReference: 'button',\n },\n {\n label: 'Radius',\n type: 'number',\n value: 4,\n unit: 'px',\n prop: 'borderRadius',\n classReference: 'button',\n },\n {\n label: 'Padding Top',\n type: 'number',\n value: 7,\n unit: 'px',\n prop: 'paddingTop',\n classReference: 'button',\n },\n {\n label: 'Padding Right',\n type: 'number',\n value: 12,\n unit: 'px',\n prop: 'paddingRight',\n classReference: 'button',\n },\n {\n label: 'Padding Bottom',\n type: 'number',\n value: 7,\n unit: 'px',\n prop: 'paddingBottom',\n classReference: 'button',\n },\n {\n label: 'Padding Left',\n type: 'number',\n value: 12,\n unit: 'px',\n prop: 'paddingLeft',\n classReference: 'button',\n },\n ],\n },\n {\n id: 'code-block',\n title: 'Code Block',\n classReference: 'codeBlock',\n inputs: [\n {\n label: 'Border Radius',\n type: 'number',\n value: 4,\n unit: 'px',\n prop: 'borderRadius',\n classReference: 'codeBlock',\n },\n {\n label: 'Padding Top',\n type: 'number',\n value: 12,\n unit: 'px',\n prop: 'paddingTop',\n classReference: 'codeBlock',\n },\n {\n label: 'Padding Bottom',\n type: 'number',\n value: 12,\n unit: 'px',\n prop: 'paddingBottom',\n classReference: 'codeBlock',\n },\n {\n label: 'Padding Left',\n type: 'number',\n value: 16,\n unit: 'px',\n prop: 'paddingLeft',\n classReference: 'codeBlock',\n },\n {\n label: 'Padding Right',\n type: 'number',\n value: 16,\n unit: 'px',\n prop: 'paddingRight',\n classReference: 'codeBlock',\n },\n ],\n },\n {\n id: 'inline-code',\n title: 'Inline Code',\n classReference: 'inlineCode',\n inputs: [\n {\n label: 'Background',\n type: 'color',\n value: '#e5e7eb',\n prop: 'backgroundColor',\n classReference: 'inlineCode',\n },\n {\n label: 'Text color',\n type: 'color',\n value: '#1e293b',\n prop: 'color',\n classReference: 'inlineCode',\n },\n {\n label: 'Radius',\n type: 'number',\n value: 4,\n unit: 'px',\n prop: 'borderRadius',\n classReference: 'inlineCode',\n },\n ],\n },\n];\n\nconst THEME_MINIMAL = THEME_BASIC.map((item) => ({ ...item, inputs: [] }));\n\nconst RESET_BASIC: ResetTheme = {\n reset: {\n margin: '0',\n padding: '0',\n },\n body: {\n fontFamily:\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif\",\n fontSize: '14px',\n minHeight: '100%',\n lineHeight: '155%',\n },\n container: {},\n h1: {\n fontSize: '2.25em',\n lineHeight: '1.44em',\n paddingTop: '0.389em',\n fontWeight: 600,\n },\n h2: {\n fontSize: '1.8em',\n lineHeight: '1.44em',\n paddingTop: '0.389em',\n fontWeight: 600,\n },\n h3: {\n fontSize: '1.4em',\n lineHeight: '1.08em',\n paddingTop: '0.389em',\n fontWeight: 600,\n },\n paragraph: {\n fontSize: '1em',\n paddingTop: '0.5em',\n paddingBottom: '0.5em',\n },\n list: {\n paddingLeft: '1.1em',\n paddingBottom: '1em',\n },\n nestedList: {\n paddingLeft: '1.1em',\n paddingBottom: '0',\n },\n listItem: {\n marginLeft: '1em',\n marginBottom: '0.3em',\n marginTop: '0.3em',\n },\n listParagraph: { padding: '0', margin: '0' },\n blockquote: {\n borderLeft: '3px solid #acb3be',\n color: '#7e8a9a',\n marginLeft: 0,\n paddingLeft: '0.8em',\n fontSize: '1.1em',\n fontFamily:\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif\",\n },\n link: { textDecoration: 'underline' },\n footer: {\n fontSize: '0.8em',\n },\n hr: {\n paddingBottom: '1em',\n borderWidth: '2px',\n },\n image: {\n maxWidth: '100%',\n },\n button: {\n lineHeight: '100%',\n display: 'inline-block',\n },\n inlineCode: {\n paddingTop: '0.25em',\n paddingBottom: '0.25em',\n paddingLeft: '0.4em',\n paddingRight: '0.4em',\n background: '#e5e7eb',\n color: '#1e293b',\n borderRadius: '4px',\n },\n codeBlock: {\n fontFamily: 'monospace',\n fontWeight: '500',\n fontSize: '.92em',\n },\n codeTag: {\n lineHeight: '130%',\n fontFamily: 'monospace',\n fontSize: '.92em',\n },\n section: {\n padding: '10px 20px 10px 20px',\n boxSizing: 'border-box' as const,\n },\n};\n\nconst RESET_MINIMAL: ResetTheme = {\n ...Object.keys(RESET_BASIC).reduce<ResetTheme>((acc, key) => {\n acc[key as keyof ResetTheme] = {};\n return acc;\n }, {} as ResetTheme),\n reset: RESET_BASIC.reset,\n button: RESET_BASIC.button,\n image: RESET_BASIC.image,\n};\n\nexport const RESET_THEMES: Record<EditorTheme, ResetTheme> = {\n basic: RESET_BASIC,\n minimal: RESET_MINIMAL,\n};\n\nexport function resolveResetValue(\n value: string | number | undefined,\n targetUnit: 'px' | '%',\n bodyFontSizePx: number,\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n const str = String(value);\n const num = Number.parseFloat(str);\n if (Number.isNaN(num)) {\n return undefined;\n }\n if (str.endsWith('em')) {\n return targetUnit === 'px' ? Math.floor(num * bodyFontSizePx) : num * 100;\n }\n return num;\n}\n\nexport const EDITOR_THEMES: Record<EditorTheme, PanelGroup[]> = {\n minimal: THEME_MINIMAL,\n basic: THEME_BASIC,\n};\n\nexport function getThemeBodyFontSizePx(theme: EditorTheme): number {\n for (const group of EDITOR_THEMES[theme]) {\n if (group.classReference !== 'body') {\n continue;\n }\n for (const input of group.inputs) {\n if (input.prop === 'fontSize' && typeof input.value === 'number') {\n return input.value;\n }\n }\n }\n return 14;\n}\n\n/**\n * Use to make the preview nicer once the theme might miss some\n * important properties to make layout accurate\n */\nexport const DEFAULT_INBOX_FONT_SIZE_PX = 14;\nexport const INBOX_EMAIL_DEFAULTS: Partial<ResetTheme> = {\n body: {\n color: '#000000',\n fontFamily:\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif\",\n fontSize: `${DEFAULT_INBOX_FONT_SIZE_PX}px`,\n lineHeight: '155%',\n },\n container: {\n width: 600,\n },\n};\n\nexport const SUPPORTED_CSS_PROPERTIES: SupportedCssProperties = {\n align: {\n label: 'Align',\n type: 'select',\n options: {\n left: 'Left',\n center: 'Center',\n right: 'Right',\n },\n defaultValue: 'left',\n category: 'layout',\n },\n backgroundColor: {\n label: 'Background',\n type: 'color',\n excludeNodes: ['image', 'youtube'],\n defaultValue: '#ffffff',\n category: 'appearance',\n },\n color: {\n label: 'Text color',\n type: 'color',\n excludeNodes: ['image', 'youtube'],\n defaultValue: '#000000',\n category: 'typography',\n },\n fontSize: {\n label: 'Font size',\n type: 'number',\n unit: 'px',\n excludeNodes: ['image', 'youtube'],\n defaultValue: 14,\n category: 'typography',\n },\n fontWeight: {\n label: 'Font weight',\n type: 'select',\n options: {\n 300: 'Light',\n 400: 'Normal',\n 600: 'Semi Bold',\n 700: 'Bold',\n 800: 'Extra Bold',\n },\n excludeNodes: ['image', 'youtube'],\n defaultValue: 400,\n category: 'typography',\n },\n letterSpacing: {\n label: 'Letter spacing',\n type: 'number',\n unit: 'px',\n excludeNodes: ['image', 'youtube'],\n defaultValue: 0,\n category: 'typography',\n },\n lineHeight: {\n label: 'Line height',\n type: 'number',\n unit: '%',\n defaultValue: 155,\n category: 'typography',\n },\n textDecoration: {\n label: 'Text decoration',\n type: 'select',\n options: {\n none: 'None',\n underline: 'Underline',\n 'line-through': 'Line-through',\n },\n defaultValue: 'none',\n category: 'typography',\n },\n borderRadius: {\n label: 'Border Radius',\n type: 'number',\n unit: 'px',\n defaultValue: 8,\n category: 'appearance',\n },\n borderTopLeftRadius: {\n label: 'Border Radius (Top-Left)',\n type: 'number',\n unit: 'px',\n defaultValue: 8,\n category: 'appearance',\n },\n borderTopRightRadius: {\n label: 'Border Radius (Top-Right)',\n type: 'number',\n unit: 'px',\n defaultValue: 8,\n category: 'appearance',\n },\n borderBottomLeftRadius: {\n label: 'Border Radius (Bottom-Left)',\n type: 'number',\n unit: 'px',\n defaultValue: 8,\n category: 'appearance',\n },\n borderBottomRightRadius: {\n label: 'Border Radius (Bottom-Right)',\n type: 'number',\n unit: 'px',\n defaultValue: 8,\n category: 'appearance',\n },\n borderWidth: {\n label: 'Border Width',\n type: 'number',\n unit: 'px',\n defaultValue: 1,\n category: 'appearance',\n },\n borderTopWidth: {\n label: 'Border Top Width',\n type: 'number',\n unit: 'px',\n defaultValue: 1,\n category: 'appearance',\n },\n borderRightWidth: {\n label: 'Border Right Width',\n type: 'number',\n unit: 'px',\n defaultValue: 1,\n category: 'appearance',\n },\n borderBottomWidth: {\n label: 'Border Bottom Width',\n type: 'number',\n unit: 'px',\n defaultValue: 1,\n category: 'appearance',\n },\n borderLeftWidth: {\n label: 'Border Left Width',\n type: 'number',\n unit: 'px',\n defaultValue: 1,\n category: 'appearance',\n },\n borderStyle: {\n label: 'Border Style',\n type: 'select',\n options: {\n solid: 'Solid',\n dashed: 'Dashed',\n dotted: 'Dotted',\n },\n defaultValue: 'solid',\n category: 'appearance',\n },\n borderTopStyle: {\n label: 'Border Top Style',\n type: 'select',\n options: {\n solid: 'Solid',\n dashed: 'Dashed',\n dotted: 'Dotted',\n },\n defaultValue: 'solid',\n category: 'appearance',\n },\n borderRightStyle: {\n label: 'Border Right Style',\n type: 'select',\n options: {\n solid: 'Solid',\n dashed: 'Dashed',\n dotted: 'Dotted',\n },\n defaultValue: 'solid',\n category: 'appearance',\n },\n borderBottomStyle: {\n label: 'Border Bottom Style',\n type: 'select',\n options: {\n solid: 'Solid',\n dashed: 'Dashed',\n dotted: 'Dotted',\n },\n defaultValue: 'solid',\n category: 'appearance',\n },\n borderLeftStyle: {\n label: 'Border Left Style',\n type: 'select',\n options: {\n solid: 'Solid',\n dashed: 'Dashed',\n dotted: 'Dotted',\n },\n defaultValue: 'solid',\n category: 'appearance',\n },\n borderColor: {\n label: 'Border Color',\n type: 'color',\n defaultValue: '#000000',\n category: 'appearance',\n },\n borderTopColor: {\n label: 'Border Top Color',\n type: 'color',\n defaultValue: '#000000',\n category: 'appearance',\n },\n borderRightColor: {\n label: 'Border Right Color',\n type: 'color',\n defaultValue: '#000000',\n category: 'appearance',\n },\n borderBottomColor: {\n label: 'Border Bottom Color',\n type: 'color',\n defaultValue: '#000000',\n category: 'appearance',\n },\n borderLeftColor: {\n label: 'Border Left Color',\n type: 'color',\n defaultValue: '#000000',\n category: 'appearance',\n },\n padding: {\n label: 'Padding',\n type: 'number',\n unit: 'px',\n defaultValue: 8,\n category: 'layout',\n },\n paddingTop: {\n label: 'Padding Top',\n type: 'number',\n unit: 'px',\n defaultValue: 8,\n category: 'layout',\n },\n paddingLeft: {\n label: 'Padding Left',\n type: 'number',\n unit: 'px',\n defaultValue: 8,\n category: 'layout',\n },\n paddingBottom: {\n label: 'Padding Bottom',\n type: 'number',\n unit: 'px',\n defaultValue: 8,\n category: 'layout',\n },\n paddingRight: {\n label: 'Padding Right',\n type: 'number',\n unit: 'px',\n defaultValue: 8,\n category: 'layout',\n },\n width: {\n label: 'Width',\n type: 'number',\n unit: 'px',\n defaultValue: 600,\n category: 'layout',\n },\n height: {\n label: 'Height',\n type: 'number',\n unit: 'px',\n defaultValue: 400,\n category: 'layout',\n },\n};\n","import { EDITOR_THEMES } from './themes';\nimport type {\n EditorTheme,\n KnownThemeComponents,\n PanelGroup,\n PanelSectionId,\n} from './types';\n\nconst PANEL_SECTION_IDS = new Set<PanelSectionId>([\n 'body',\n 'container',\n 'typography',\n 'link',\n 'image',\n 'button',\n 'code-block',\n 'inline-code',\n]);\n\nconst PANEL_SECTION_IDS_BY_TITLE: Record<string, PanelSectionId> = {\n background: 'body',\n body: 'body',\n content: 'container',\n container: 'container',\n typography: 'typography',\n link: 'link',\n image: 'image',\n button: 'button',\n 'code block': 'code-block',\n 'inline code': 'inline-code',\n};\n\nconst PANEL_SECTION_IDS_BY_CLASS_REFERENCE: Partial<\n Record<KnownThemeComponents, PanelSectionId>\n> = {\n container: 'container',\n link: 'link',\n image: 'image',\n button: 'button',\n codeBlock: 'code-block',\n inlineCode: 'inline-code',\n};\n\nfunction isPanelSectionId(value: unknown): value is PanelSectionId {\n return (\n typeof value === 'string' && PANEL_SECTION_IDS.has(value as PanelSectionId)\n );\n}\n\nfunction normalizeTitle(title: string | undefined): string {\n return title?.trim().toLowerCase().replace(/\\s+/g, ' ') ?? '';\n}\n\nfunction resolvePanelSectionId(group: PanelGroup): PanelSectionId | null {\n if (isPanelSectionId(group.id)) {\n return group.id;\n }\n\n const normalizedTitle = normalizeTitle(group.title);\n\n if (group.classReference === 'body') {\n if (normalizedTitle === 'typography') {\n return 'typography';\n }\n\n return 'body';\n }\n\n if (\n group.classReference &&\n PANEL_SECTION_IDS_BY_CLASS_REFERENCE[group.classReference]\n ) {\n return PANEL_SECTION_IDS_BY_CLASS_REFERENCE[group.classReference] ?? null;\n }\n\n return PANEL_SECTION_IDS_BY_TITLE[normalizedTitle] ?? null;\n}\n\nfunction normalizePanelInputs(\n inputs: PanelGroup['inputs'],\n defaultInputs: PanelGroup['inputs'],\n fallbackClassReference?: KnownThemeComponents,\n): PanelGroup['inputs'] {\n if (!Array.isArray(inputs)) {\n return [];\n }\n\n return inputs.map((input) => {\n const defaultInput = defaultInputs.find(\n (candidate) => candidate.prop === input.prop,\n );\n\n return {\n ...defaultInput,\n ...input,\n classReference:\n input.classReference ??\n defaultInput?.classReference ??\n fallbackClassReference,\n };\n });\n}\n\nexport function inferThemeFromPanelStyles(\n panelStyles: PanelGroup[] | null | undefined,\n): EditorTheme | null {\n if (!Array.isArray(panelStyles) || panelStyles.length === 0) {\n return null;\n }\n\n let finalTheme: EditorTheme | null = null;\n for (const group of panelStyles) {\n if (!Array.isArray(group?.inputs)) {\n finalTheme = null;\n break;\n }\n\n if (group.inputs.length !== 0) {\n finalTheme = 'basic';\n break;\n }\n\n finalTheme = 'minimal';\n }\n\n return finalTheme;\n}\n\nexport function normalizeThemePanelStyles(\n theme: EditorTheme,\n panelStyles: PanelGroup[] | null | undefined,\n): PanelGroup[] | null {\n if (!Array.isArray(panelStyles)) {\n return null;\n }\n\n return panelStyles.map((group) => {\n const panelId = resolvePanelSectionId(group);\n\n if (!panelId) {\n return group;\n }\n\n const defaultGroup = EDITOR_THEMES[theme].find(\n (candidate) => candidate.id === panelId,\n );\n\n if (!defaultGroup) {\n return group;\n }\n\n return {\n ...group,\n id: panelId,\n title: defaultGroup.title,\n classReference: defaultGroup.classReference,\n inputs: normalizePanelInputs(\n group.inputs,\n defaultGroup.inputs,\n defaultGroup.classReference,\n ),\n };\n });\n}\n","import { Body, Head, Html, Preview } from '@react-email/components';\nimport type { Editor, JSONContent } from '@tiptap/core';\nimport { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { useEditorState } from '@tiptap/react';\nimport type * as React from 'react';\nimport type { SerializerPlugin } from '../../core/serializer/serializer-plugin';\nimport { getGlobalContent } from '../../extensions/global-content';\nimport {\n injectGlobalPlainCss,\n injectThemeCss,\n mergeCssJs,\n transformToCssJs,\n} from './css-transforms';\nimport {\n inferThemeFromPanelStyles,\n normalizeThemePanelStyles,\n} from './normalization';\nimport {\n DEFAULT_INBOX_FONT_SIZE_PX,\n EDITOR_THEMES,\n RESET_THEMES,\n} from './themes';\nimport type {\n CssJs,\n EditorTheme,\n KnownThemeComponents,\n PanelGroup,\n} from './types';\n\n/**\n * Maps a document node (type + attrs) to the theme component key used for style lookup.\n * Centralizes all node-type → theme-component knowledge.\n */\nexport function getThemeComponentKey(\n nodeType: string,\n depth: number,\n attrs: Record<string, unknown> = {},\n): KnownThemeComponents | null {\n switch (nodeType) {\n case 'paragraph':\n if (depth > 0) {\n return 'listParagraph';\n }\n return 'paragraph';\n case 'heading': {\n const level = attrs.level as number | undefined;\n return `h${level ?? 1}` as KnownThemeComponents;\n }\n case 'blockquote':\n return 'blockquote';\n case 'button':\n return 'button';\n case 'container':\n return 'container';\n case 'section':\n return 'section';\n case 'footer':\n return 'footer';\n case 'image':\n return 'image';\n case 'youtube':\n case 'twitter':\n return 'image';\n case 'orderedList':\n case 'bulletList':\n if (depth > 0) {\n return 'nestedList';\n }\n return 'list';\n case 'listItem':\n return 'listItem';\n case 'codeBlock':\n return 'codeBlock';\n case 'code':\n return 'inlineCode';\n case 'link':\n return 'link';\n case 'horizontalRule':\n return 'hr';\n default:\n return null;\n }\n}\n\n/**\n * Returns merged theme styles (reset + panel styles) for the given editor.\n * Use when you have editor access and need the full CssJs map.\n */\nexport function getMergedCssJs(\n theme: EditorTheme,\n panelStyles: PanelGroup[] | undefined,\n): CssJs {\n const panels: PanelGroup[] =\n normalizeThemePanelStyles(theme, panelStyles) ?? EDITOR_THEMES[theme];\n const parsed = transformToCssJs(panels, DEFAULT_INBOX_FONT_SIZE_PX);\n const merged = mergeCssJs(RESET_THEMES[theme], parsed);\n\n return merged;\n}\n\n/**\n * Returns resolved React.CSSProperties for a node when you already have merged CssJs\n * (e.g. in the serializer where there is no editor). Centralizes which theme keys\n * apply to which node type.\n */\nconst RESET_NODE_TYPES = new Set([\n 'body',\n 'bulletList',\n 'button',\n 'columns',\n 'div',\n 'h1',\n 'h2',\n 'h3',\n 'list',\n 'listItem',\n 'listParagraph',\n 'nestedList',\n 'orderedList',\n 'table',\n 'paragraph',\n 'tableCell',\n 'tableHeader',\n 'tableRow',\n 'youtube',\n]);\n\nexport function getResolvedNodeStyles(\n node: JSONContent,\n depth: number,\n mergedCssJs: CssJs,\n): React.CSSProperties {\n const key = getThemeComponentKey(node.type ?? '', depth, node.attrs ?? {});\n if (!key) {\n if (RESET_NODE_TYPES.has(node.type ?? '')) {\n return mergedCssJs.reset ?? {};\n }\n return {};\n }\n const component = mergedCssJs[key] ?? {};\n const shouldReset =\n RESET_NODE_TYPES.has(key) || RESET_NODE_TYPES.has(node.type ?? '');\n if (shouldReset) {\n const reset = mergedCssJs.reset ?? {};\n return { ...reset, ...component };\n }\n return { ...component };\n}\n\nexport function stylesToCss(\n styles: PanelGroup[],\n theme: EditorTheme,\n): Record<KnownThemeComponents, React.CSSProperties> {\n const parsed = transformToCssJs(\n normalizeThemePanelStyles(theme, styles) ?? EDITOR_THEMES[theme],\n DEFAULT_INBOX_FONT_SIZE_PX,\n );\n return mergeCssJs(RESET_THEMES[theme], parsed);\n}\n\nfunction getEmailTheming(editor: Editor) {\n const theme = getEmailTheme(editor);\n const normalizedStyles =\n normalizeThemePanelStyles(theme, getEmailStyles(editor)) ??\n EDITOR_THEMES[theme];\n\n return {\n styles: normalizedStyles,\n theme,\n css: getEmailCss(editor),\n };\n}\n\nexport function useEmailTheming(editor: Editor | null) {\n return useEditorState({\n editor,\n selector({ editor: ed }) {\n if (!ed) {\n return null;\n }\n return getEmailTheming(ed);\n },\n });\n}\n\nfunction getEmailStyles(editor: Editor) {\n return getGlobalContent('styles', editor) as PanelGroup[] | null;\n}\n\n/**\n * Sets the global panel styles on the editor document.\n * Persists into the `GlobalContent` node under the `'styles'` key.\n */\nexport function setGlobalStyles(editor: Editor, styles: PanelGroup[]): boolean {\n return editor.commands.setGlobalContent('styles', styles);\n}\n\n/**\n * Sets the current email theme on the editor document.\n * Persists into the `GlobalContent` node under the `'theme'` key.\n */\nexport function setCurrentTheme(editor: Editor, theme: EditorTheme): boolean {\n return editor.commands.setGlobalContent('theme', theme);\n}\n\n/**\n * Sets the global CSS string injected into the email `<head>`.\n * Persists into the `GlobalContent` node under the `'css'` key.\n */\nexport function setGlobalCssInjected(editor: Editor, css: string): boolean {\n return editor.commands.setGlobalContent('css', css);\n}\n\nfunction getEmailTheme(editor: Editor) {\n const extensionTheme = (\n editor.extensionManager.extensions.find(\n (extension) => extension.name === 'theming',\n ) as { options?: { theme?: EditorTheme } }\n )?.options?.theme;\n if (extensionTheme === 'basic' || extensionTheme === 'minimal') {\n return extensionTheme;\n }\n\n const globalTheme = getGlobalContent('theme', editor) as EditorTheme | null;\n if (globalTheme === 'basic' || globalTheme === 'minimal') {\n return globalTheme;\n }\n\n const inferredTheme = inferThemeFromPanelStyles(getEmailStyles(editor));\n if (inferredTheme) {\n return inferredTheme;\n }\n\n return 'basic';\n}\n\nfunction getEmailCss(editor: Editor) {\n return getGlobalContent('css', editor) as string | null;\n}\n\nexport const EmailTheming = Extension.create<{\n theme?: EditorTheme;\n serializerPlugin: SerializerPlugin;\n}>({\n name: 'theming',\n\n addOptions() {\n return {\n theme: undefined as EditorTheme | undefined,\n serializerPlugin: {\n getNodeStyles(node, depth, editor): React.CSSProperties {\n const theming = getEmailTheming(editor);\n\n return getResolvedNodeStyles(\n node,\n depth,\n getMergedCssJs(theming.theme, theming.styles),\n );\n },\n BaseTemplate({ previewText, children, editor }) {\n const { css: globalCss, styles, theme } = getEmailTheming(editor);\n const mergedStyles = getMergedCssJs(theme, styles);\n\n return (\n <Html>\n <Head>\n <meta content=\"width=device-width\" name=\"viewport\" />\n <meta content=\"IE=edge\" httpEquiv=\"X-UA-Compatible\" />\n <meta name=\"x-apple-disable-message-reformatting\" />\n <meta\n content=\"telephone=no,address=no,email=no,date=no,url=no\"\n name=\"format-detection\"\n />\n\n {globalCss && <style>{globalCss}</style>}\n </Head>\n {previewText && previewText !== '' && (\n <Preview>{previewText}</Preview>\n )}\n\n <Body style={mergedStyles.body}>{children}</Body>\n </Html>\n );\n },\n } satisfies SerializerPlugin,\n };\n },\n\n addProseMirrorPlugins() {\n const { editor } = this;\n const scopeId = `tiptap-theme-${Math.random().toString(36).slice(2, 10)}`;\n const scopeAttribute = 'data-editor-theme-scope';\n const scopeSelector = `.tiptap.ProseMirror[${scopeAttribute}=\"${scopeId}\"]`;\n const themeStyleId = `${scopeId}-theme`;\n const globalStyleId = `${scopeId}-global`;\n\n return [\n new Plugin({\n key: new PluginKey('themingStyleInjector'),\n view(view) {\n let prevStyles: PanelGroup[] | null = null;\n let prevTheme: EditorTheme | null = null;\n let prevCss: string | null = null;\n\n view.dom.setAttribute(scopeAttribute, scopeId);\n\n const sync = () => {\n const theme = getEmailTheme(editor);\n const styles = getEmailStyles(editor);\n const resolvedStyles = styles ?? EDITOR_THEMES[theme];\n const css = getEmailCss(editor);\n\n if (styles !== prevStyles || theme !== prevTheme) {\n prevStyles = styles as PanelGroup[] | null;\n prevTheme = theme;\n const mergedCssJs = getMergedCssJs(theme, resolvedStyles);\n injectThemeCss(mergedCssJs, {\n scopeSelector,\n styleId: themeStyleId,\n });\n }\n\n if (css !== prevCss) {\n prevCss = css;\n injectGlobalPlainCss(css, {\n scopeSelector,\n styleId: globalStyleId,\n });\n }\n };\n\n sync();\n\n return {\n update: sync,\n destroy() {\n document.getElementById(themeStyleId)?.remove();\n document.getElementById(globalStyleId)?.remove();\n view.dom.removeAttribute(scopeAttribute);\n },\n };\n },\n }),\n ];\n },\n});\n"],"mappings":"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AAQ,CACN;GACE,OAAO;GACP,MAAM;GACN,OAAO;GACP,MAAM;GACN,MAAM;GACN,gBAAgB;GACjB,EACD;GACE,OAAO;GACP,MAAM;GACN,OAAO;GACP,MAAM;GACN,MAAM;GACN,gBAAgB;GACjB,CACF;EACF;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,gBAAgB;EAChB,QAAQ,EAAE;EACX;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,gBAAgB;EAChB,QAAQ,EAAE;EACX;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,gBAAgB;EAChB,QAAQ,EAAE;EACX;CACD;EACE,IAAI;EACJ,OAAO;EACP,gBAAgB;EAChB,QAAQ,CACN;GACE,OAAO;GACP,MAAM;GACN,OAAO;GACP,MAAM;GACN,gBAAgB;GACjB,EACD;GACE,OAAO;GACP,MAAM;GACN,OAAO;GACP,MAAM;GACN,SAAS;IACP,WAAW;IACX,MAAM;IACP;GACD,gBAAgB;GACjB,CACF;EACF;CACD;EACE,IAAI;EACJ,OAAO;EACP,gBAAgB;EAChB,QAAQ,CACN;GACE,OAAO;GACP,MAAM;GACN,OAAO;GACP,MAAM;GACN,MAAM;GACN,gBAAgB;GACjB,CACF;EACF;CACD;EACE,IAAI;EACJ,OAAO;EACP,gBAAgB;EAChB,QAAQ;GACN;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,gBAAgB;IACjB;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,gBAAgB;IACjB;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,gBAAgB;IACjB;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,gBAAgB;IACjB;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,gBAAgB;IACjB;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,gBAAgB;IACjB;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,gBAAgB;IACjB;GACF;EACF;CACD;EACE,IAAI;EACJ,OAAO;EACP,gBAAgB;EAChB,QAAQ;GACN;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,gBAAgB;IACjB;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,gBAAgB;IACjB;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,gBAAgB;IACjB;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,gBAAgB;IACjB;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,gBAAgB;IACjB;GACF;EACF;CACD;EACE,IAAI;EACJ,OAAO;EACP,gBAAgB;EAChB,QAAQ;GACN;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,gBAAgB;IACjB;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,gBAAgB;IACjB;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,gBAAgB;IACjB;GACF;EACF;CACF;AAED,MAAM,gBAAgB,YAAY,KAAK,UAAU;CAAE,GAAG;CAAM,QAAQ,EAAE;CAAE,EAAE;AAE1E,MAAM,cAA0B;CAC9B,OAAO;EACL,QAAQ;EACR,SAAS;EACV;CACD,MAAM;EACJ,YACE;EACF,UAAU;EACV,WAAW;EACX,YAAY;EACb;CACD,WAAW,EAAE;CACb,IAAI;EACF,UAAU;EACV,YAAY;EACZ,YAAY;EACZ,YAAY;EACb;CACD,IAAI;EACF,UAAU;EACV,YAAY;EACZ,YAAY;EACZ,YAAY;EACb;CACD,IAAI;EACF,UAAU;EACV,YAAY;EACZ,YAAY;EACZ,YAAY;EACb;CACD,WAAW;EACT,UAAU;EACV,YAAY;EACZ,eAAe;EAChB;CACD,MAAM;EACJ,aAAa;EACb,eAAe;EAChB;CACD,YAAY;EACV,aAAa;EACb,eAAe;EAChB;CACD,UAAU;EACR,YAAY;EACZ,cAAc;EACd,WAAW;EACZ;CACD,eAAe;EAAE,SAAS;EAAK,QAAQ;EAAK;CAC5C,YAAY;EACV,YAAY;EACZ,OAAO;EACP,YAAY;EACZ,aAAa;EACb,UAAU;EACV,YACE;EACH;CACD,MAAM,EAAE,gBAAgB,aAAa;CACrC,QAAQ,EACN,UAAU,SACX;CACD,IAAI;EACF,eAAe;EACf,aAAa;EACd;CACD,OAAO,EACL,UAAU,QACX;CACD,QAAQ;EACN,YAAY;EACZ,SAAS;EACV;CACD,YAAY;EACV,YAAY;EACZ,eAAe;EACf,aAAa;EACb,cAAc;EACd,YAAY;EACZ,OAAO;EACP,cAAc;EACf;CACD,WAAW;EACT,YAAY;EACZ,YAAY;EACZ,UAAU;EACX;CACD,SAAS;EACP,YAAY;EACZ,YAAY;EACZ,UAAU;EACX;CACD,SAAS;EACP,SAAS;EACT,WAAW;EACZ;CACF;AAED,MAAM,gBAA4B;CAChC,GAAG,OAAO,KAAK,YAAY,CAAC,QAAoB,KAAK,QAAQ;AAC3D,MAAI,OAA2B,EAAE;AACjC,SAAO;IACN,EAAE,CAAe;CACpB,OAAO,YAAY;CACnB,QAAQ,YAAY;CACpB,OAAO,YAAY;CACpB;AAED,MAAa,eAAgD;CAC3D,OAAO;CACP,SAAS;CACV;AAED,SAAgB,kBACd,OACA,YACA,gBACoB;AACpB,KAAI,UAAU,OACZ;CAEF,MAAM,MAAM,OAAO,MAAM;CACzB,MAAM,MAAM,OAAO,WAAW,IAAI;AAClC,KAAI,OAAO,MAAM,IAAI,CACnB;AAEF,KAAI,IAAI,SAAS,KAAK,CACpB,QAAO,eAAe,OAAO,KAAK,MAAM,MAAM,eAAe,GAAG,MAAM;AAExE,QAAO;;AAGT,MAAa,gBAAmD;CAC9D,SAAS;CACT,OAAO;CACR;AAED,SAAgB,uBAAuB,OAA4B;AACjE,MAAK,MAAM,SAAS,cAAc,QAAQ;AACxC,MAAI,MAAM,mBAAmB,OAC3B;AAEF,OAAK,MAAM,SAAS,MAAM,OACxB,KAAI,MAAM,SAAS,cAAc,OAAO,MAAM,UAAU,SACtD,QAAO,MAAM;;AAInB,QAAO;;;;;;AAOT,MAAa,6BAA6B;AAC1C,MAAa,uBAA4C;CACvD,MAAM;EACJ,OAAO;EACP,YACE;EACF,UAAU,GAAG,2BAA2B;EACxC,YAAY;EACb;CACD,WAAW,EACT,OAAO,KACR;CACF;AAED,MAAa,2BAAmD;CAC9D,OAAO;EACL,OAAO;EACP,MAAM;EACN,SAAS;GACP,MAAM;GACN,QAAQ;GACR,OAAO;GACR;EACD,cAAc;EACd,UAAU;EACX;CACD,iBAAiB;EACf,OAAO;EACP,MAAM;EACN,cAAc,CAAC,SAAS,UAAU;EAClC,cAAc;EACd,UAAU;EACX;CACD,OAAO;EACL,OAAO;EACP,MAAM;EACN,cAAc,CAAC,SAAS,UAAU;EAClC,cAAc;EACd,UAAU;EACX;CACD,UAAU;EACR,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc,CAAC,SAAS,UAAU;EAClC,cAAc;EACd,UAAU;EACX;CACD,YAAY;EACV,OAAO;EACP,MAAM;EACN,SAAS;GACP,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACN;EACD,cAAc,CAAC,SAAS,UAAU;EAClC,cAAc;EACd,UAAU;EACX;CACD,eAAe;EACb,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc,CAAC,SAAS,UAAU;EAClC,cAAc;EACd,UAAU;EACX;CACD,YAAY;EACV,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,gBAAgB;EACd,OAAO;EACP,MAAM;EACN,SAAS;GACP,MAAM;GACN,WAAW;GACX,gBAAgB;GACjB;EACD,cAAc;EACd,UAAU;EACX;CACD,cAAc;EACZ,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,qBAAqB;EACnB,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,sBAAsB;EACpB,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,wBAAwB;EACtB,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,yBAAyB;EACvB,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,aAAa;EACX,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,gBAAgB;EACd,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,kBAAkB;EAChB,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,mBAAmB;EACjB,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,iBAAiB;EACf,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,aAAa;EACX,OAAO;EACP,MAAM;EACN,SAAS;GACP,OAAO;GACP,QAAQ;GACR,QAAQ;GACT;EACD,cAAc;EACd,UAAU;EACX;CACD,gBAAgB;EACd,OAAO;EACP,MAAM;EACN,SAAS;GACP,OAAO;GACP,QAAQ;GACR,QAAQ;GACT;EACD,cAAc;EACd,UAAU;EACX;CACD,kBAAkB;EAChB,OAAO;EACP,MAAM;EACN,SAAS;GACP,OAAO;GACP,QAAQ;GACR,QAAQ;GACT;EACD,cAAc;EACd,UAAU;EACX;CACD,mBAAmB;EACjB,OAAO;EACP,MAAM;EACN,SAAS;GACP,OAAO;GACP,QAAQ;GACR,QAAQ;GACT;EACD,cAAc;EACd,UAAU;EACX;CACD,iBAAiB;EACf,OAAO;EACP,MAAM;EACN,SAAS;GACP,OAAO;GACP,QAAQ;GACR,QAAQ;GACT;EACD,cAAc;EACd,UAAU;EACX;CACD,aAAa;EACX,OAAO;EACP,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,gBAAgB;EACd,OAAO;EACP,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,kBAAkB;EAChB,OAAO;EACP,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,mBAAmB;EACjB,OAAO;EACP,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,iBAAiB;EACf,OAAO;EACP,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,SAAS;EACP,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,YAAY;EACV,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,aAAa;EACX,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,eAAe;EACb,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,cAAc;EACZ,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,OAAO;EACL,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACD,QAAQ;EACN,OAAO;EACP,MAAM;EACN,MAAM;EACN,cAAc;EACd,UAAU;EACX;CACF;;;;AClvBD,MAAM,oBAAoB,IAAI,IAAoB;CAChD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,6BAA6D;CACjE,YAAY;CACZ,MAAM;CACN,SAAS;CACT,WAAW;CACX,YAAY;CACZ,MAAM;CACN,OAAO;CACP,QAAQ;CACR,cAAc;CACd,eAAe;CAChB;AAED,MAAM,uCAEF;CACF,WAAW;CACX,MAAM;CACN,OAAO;CACP,QAAQ;CACR,WAAW;CACX,YAAY;CACb;AAED,SAAS,iBAAiB,OAAyC;AACjE,QACE,OAAO,UAAU,YAAY,kBAAkB,IAAI,MAAwB;;AAI/E,SAAS,eAAe,OAAmC;AACzD,QAAO,OAAO,MAAM,CAAC,aAAa,CAAC,QAAQ,QAAQ,IAAI,IAAI;;AAG7D,SAAS,sBAAsB,OAA0C;AACvE,KAAI,iBAAiB,MAAM,GAAG,CAC5B,QAAO,MAAM;CAGf,MAAM,kBAAkB,eAAe,MAAM,MAAM;AAEnD,KAAI,MAAM,mBAAmB,QAAQ;AACnC,MAAI,oBAAoB,aACtB,QAAO;AAGT,SAAO;;AAGT,KACE,MAAM,kBACN,qCAAqC,MAAM,gBAE3C,QAAO,qCAAqC,MAAM,mBAAmB;AAGvE,QAAO,2BAA2B,oBAAoB;;AAGxD,SAAS,qBACP,QACA,eACA,wBACsB;AACtB,KAAI,CAAC,MAAM,QAAQ,OAAO,CACxB,QAAO,EAAE;AAGX,QAAO,OAAO,KAAK,UAAU;EAC3B,MAAM,eAAe,cAAc,MAChC,cAAc,UAAU,SAAS,MAAM,KACzC;AAED,SAAO;GACL,GAAG;GACH,GAAG;GACH,gBACE,MAAM,kBACN,cAAc,kBACd;GACH;GACD;;AAGJ,SAAgB,0BACd,aACoB;AACpB,KAAI,CAAC,MAAM,QAAQ,YAAY,IAAI,YAAY,WAAW,EACxD,QAAO;CAGT,IAAI,aAAiC;AACrC,MAAK,MAAM,SAAS,aAAa;AAC/B,MAAI,CAAC,MAAM,QAAQ,OAAO,OAAO,EAAE;AACjC,gBAAa;AACb;;AAGF,MAAI,MAAM,OAAO,WAAW,GAAG;AAC7B,gBAAa;AACb;;AAGF,eAAa;;AAGf,QAAO;;AAGT,SAAgB,0BACd,OACA,aACqB;AACrB,KAAI,CAAC,MAAM,QAAQ,YAAY,CAC7B,QAAO;AAGT,QAAO,YAAY,KAAK,UAAU;EAChC,MAAM,UAAU,sBAAsB,MAAM;AAE5C,MAAI,CAAC,QACH,QAAO;EAGT,MAAM,eAAe,cAAc,OAAO,MACvC,cAAc,UAAU,OAAO,QACjC;AAED,MAAI,CAAC,aACH,QAAO;AAGT,SAAO;GACL,GAAG;GACH,IAAI;GACJ,OAAO,aAAa;GACpB,gBAAgB,aAAa;GAC7B,QAAQ,qBACN,MAAM,QACN,aAAa,QACb,aAAa,eACd;GACF;GACD;;;;;;;;;AChIJ,SAAgB,qBACd,UACA,OACA,QAAiC,EAAE,EACN;AAC7B,SAAQ,UAAR;EACE,KAAK;AACH,OAAI,QAAQ,EACV,QAAO;AAET,UAAO;EACT,KAAK,UAEH,QAAO,IADO,MAAM,SACA;EAEtB,KAAK,aACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,YACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK;EACL,KAAK,UACH,QAAO;EACT,KAAK;EACL,KAAK;AACH,OAAI,QAAQ,EACV,QAAO;AAET,UAAO;EACT,KAAK,WACH,QAAO;EACT,KAAK,YACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,iBACH,QAAO;EACT,QACE,QAAO;;;;;;;AAQb,SAAgB,eACd,OACA,aACO;CAGP,MAAM,SAAS,iBADb,0BAA0B,OAAO,YAAY,IAAI,cAAc,QACzB,2BAA2B;AAGnE,QAFe,WAAW,aAAa,QAAQ,OAAO;;;;;;;AAUxD,MAAM,mBAAmB,IAAI,IAAI;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,sBACd,MACA,OACA,aACqB;CACrB,MAAM,MAAM,qBAAqB,KAAK,QAAQ,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;AAC1E,KAAI,CAAC,KAAK;AACR,MAAI,iBAAiB,IAAI,KAAK,QAAQ,GAAG,CACvC,QAAO,YAAY,SAAS,EAAE;AAEhC,SAAO,EAAE;;CAEX,MAAM,YAAY,YAAY,QAAQ,EAAE;AAGxC,KADE,iBAAiB,IAAI,IAAI,IAAI,iBAAiB,IAAI,KAAK,QAAQ,GAAG,CAGlE,QAAO;EAAE,GADK,YAAY,SAAS,EAAE;EAClB,GAAG;EAAW;AAEnC,QAAO,EAAE,GAAG,WAAW;;AAGzB,SAAgB,YACd,QACA,OACmD;CACnD,MAAM,SAAS,iBACb,0BAA0B,OAAO,OAAO,IAAI,cAAc,QAC1D,2BACD;AACD,QAAO,WAAW,aAAa,QAAQ,OAAO;;AAGhD,SAAS,gBAAgB,QAAgB;CACvC,MAAM,QAAQ,cAAc,OAAO;AAKnC,QAAO;EACL,QAJA,0BAA0B,OAAO,eAAe,OAAO,CAAC,IACxD,cAAc;EAId;EACA,KAAK,YAAY,OAAO;EACzB;;AAGH,SAAgB,gBAAgB,QAAuB;AACrD,QAAO,eAAe;EACpB;EACA,SAAS,EAAE,QAAQ,MAAM;AACvB,OAAI,CAAC,GACH,QAAO;AAET,UAAO,gBAAgB,GAAG;;EAE7B,CAAC;;AAGJ,SAAS,eAAe,QAAgB;AACtC,QAAO,iBAAiB,UAAU,OAAO;;;;;;AAO3C,SAAgB,gBAAgB,QAAgB,QAA+B;AAC7E,QAAO,OAAO,SAAS,iBAAiB,UAAU,OAAO;;;;;;AAO3D,SAAgB,gBAAgB,QAAgB,OAA6B;AAC3E,QAAO,OAAO,SAAS,iBAAiB,SAAS,MAAM;;;;;;AAOzD,SAAgB,qBAAqB,QAAgB,KAAsB;AACzE,QAAO,OAAO,SAAS,iBAAiB,OAAO,IAAI;;AAGrD,SAAS,cAAc,QAAgB;CACrC,MAAM,iBACJ,OAAO,iBAAiB,WAAW,MAChC,cAAc,UAAU,SAAS,UACnC,EACA,SAAS;AACZ,KAAI,mBAAmB,WAAW,mBAAmB,UACnD,QAAO;CAGT,MAAM,cAAc,iBAAiB,SAAS,OAAO;AACrD,KAAI,gBAAgB,WAAW,gBAAgB,UAC7C,QAAO;CAGT,MAAM,gBAAgB,0BAA0B,eAAe,OAAO,CAAC;AACvE,KAAI,cACF,QAAO;AAGT,QAAO;;AAGT,SAAS,YAAY,QAAgB;AACnC,QAAO,iBAAiB,OAAO,OAAO;;AAGxC,MAAa,eAAe,UAAU,OAGnC;CACD,MAAM;CAEN,aAAa;AACX,SAAO;GACL,OAAO;GACP,kBAAkB;IAChB,cAAc,MAAM,OAAO,QAA6B;KACtD,MAAM,UAAU,gBAAgB,OAAO;AAEvC,YAAO,sBACL,MACA,OACA,eAAe,QAAQ,OAAO,QAAQ,OAAO,CAC9C;;IAEH,aAAa,EAAE,aAAa,UAAU,UAAU;KAC9C,MAAM,EAAE,KAAK,WAAW,QAAQ,UAAU,gBAAgB,OAAO;KACjE,MAAM,eAAe,eAAe,OAAO,OAAO;AAElD,YACE,qBAAC;MACC,qBAAC;OACC,oBAAC;QAAK,SAAQ;QAAqB,MAAK;SAAa;OACrD,oBAAC;QAAK,SAAQ;QAAU,WAAU;SAAoB;OACtD,oBAAC,UAAK,MAAK,yCAAyC;OACpD,oBAAC;QACC,SAAQ;QACR,MAAK;SACL;OAED,aAAa,oBAAC,qBAAO,YAAkB;UACnC;MACN,eAAe,gBAAgB,MAC9B,oBAAC,qBAAS,cAAsB;MAGlC,oBAAC;OAAK,OAAO,aAAa;OAAO;QAAgB;SAC5C;;IAGZ;GACF;;CAGH,wBAAwB;EACtB,MAAM,EAAE,WAAW;EACnB,MAAM,UAAU,gBAAgB,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,GAAG,GAAG;EACvE,MAAM,iBAAiB;EACvB,MAAM,gBAAgB,uBAAuB,eAAe,IAAI,QAAQ;EACxE,MAAM,eAAe,GAAG,QAAQ;EAChC,MAAM,gBAAgB,GAAG,QAAQ;AAEjC,SAAO,CACL,IAAI,OAAO;GACT,KAAK,IAAI,UAAU,uBAAuB;GAC1C,KAAK,MAAM;IACT,IAAI,aAAkC;IACtC,IAAI,YAAgC;IACpC,IAAI,UAAyB;AAE7B,SAAK,IAAI,aAAa,gBAAgB,QAAQ;IAE9C,MAAM,aAAa;KACjB,MAAM,QAAQ,cAAc,OAAO;KACnC,MAAM,SAAS,eAAe,OAAO;KACrC,MAAM,iBAAiB,UAAU,cAAc;KAC/C,MAAM,MAAM,YAAY,OAAO;AAE/B,SAAI,WAAW,cAAc,UAAU,WAAW;AAChD,mBAAa;AACb,kBAAY;AAEZ,qBADoB,eAAe,OAAO,eAAe,EAC7B;OAC1B;OACA,SAAS;OACV,CAAC;;AAGJ,SAAI,QAAQ,SAAS;AACnB,gBAAU;AACV,2BAAqB,KAAK;OACxB;OACA,SAAS;OACV,CAAC;;;AAIN,UAAM;AAEN,WAAO;KACL,QAAQ;KACR,UAAU;AACR,eAAS,eAAe,aAAa,EAAE,QAAQ;AAC/C,eAAS,eAAe,cAAc,EAAE,QAAQ;AAChD,WAAK,IAAI,gBAAgB,eAAe;;KAE3C;;GAEJ,CAAC,CACH;;CAEJ,CAAC"}
|