@trycourier/react-designer 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/cjs/index.js +61 -57
  2. package/dist/cjs/index.js.map +4 -4
  3. package/dist/cjs/styles.css +420 -145
  4. package/dist/components/Providers/useTemplateActions.d.ts +2 -2
  5. package/dist/components/TemplateEditor/Channels/Email/SideBar/SideBarItemDetails/SideBarItemDetails.d.ts +2 -1
  6. package/dist/components/TemplateEditor/index.d.ts +1 -13
  7. package/dist/components/extensions/Blockquote/BlockquoteForm.d.ts +2 -1
  8. package/dist/components/extensions/Button/ButtonForm.d.ts +2 -1
  9. package/dist/components/extensions/Column/ColumnForm.d.ts +2 -1
  10. package/dist/components/extensions/CustomCode/CustomCodeForm.d.ts +2 -1
  11. package/dist/components/extensions/Divider/DividerForm.d.ts +2 -1
  12. package/dist/components/extensions/ImageBlock/components/ImageBlockForm.d.ts +2 -1
  13. package/dist/components/extensions/List/List.d.ts +15 -0
  14. package/dist/components/extensions/List/List.types.d.ts +38 -0
  15. package/dist/components/extensions/List/ListComponent.d.ts +12 -0
  16. package/dist/components/extensions/List/ListForm.d.ts +9 -0
  17. package/dist/components/extensions/List/index.d.ts +4 -0
  18. package/dist/components/extensions/ListItem/ListItem.d.ts +34 -0
  19. package/dist/components/extensions/ListItem/ListItem.types.d.ts +7 -0
  20. package/dist/components/extensions/ListItem/ListItemComponent.d.ts +7 -0
  21. package/dist/components/extensions/ListItem/index.d.ts +2 -0
  22. package/dist/components/extensions/TextBlock/TextBlockForm.d.ts +2 -1
  23. package/dist/components/extensions/index.d.ts +2 -0
  24. package/dist/components/ui/Blocks/ListBlock/ListBlock.d.ts +2 -0
  25. package/dist/components/ui/Blocks/ListBlock/index.d.ts +1 -0
  26. package/dist/components/ui/Blocks/index.d.ts +1 -0
  27. package/dist/components/ui/FormHeader/FormHeader.d.ts +3 -2
  28. package/dist/components/ui/SortableItemWrapper/SortableItemWrapper.d.ts +3 -1
  29. package/dist/components/ui/TextMenu/config.d.ts +2 -0
  30. package/dist/components/ui/TextMenu/hooks/useTextmenuCommands.d.ts +4 -0
  31. package/dist/components/ui/TextMenu/hooks/useTextmenuStates.d.ts +2 -0
  32. package/dist/components/ui/VariableEditor/VariableChipBase.d.ts +2 -0
  33. package/dist/components/ui-kit/Icon/UnorderedListIcon.d.ts +3 -0
  34. package/dist/components/ui-kit/Icon/index.d.ts +1 -1
  35. package/dist/esm/index.js +61 -57
  36. package/dist/esm/index.js.map +4 -4
  37. package/dist/esm/styles.css +420 -145
  38. package/dist/index.d.ts +13 -0
  39. package/dist/lib/utils/index.d.ts +1 -0
  40. package/dist/styles.css +420 -145
  41. package/dist/types/elemental.types.d.ts +6 -0
  42. package/package.json +1 -1
  43. package/dist/components/ui-kit/Icon/BulletListIcon.d.ts +0 -3
@@ -19,8 +19,8 @@ export declare function useTemplateActions(): {
19
19
  setTemplateError: (error: string | TemplateError | null) => void;
20
20
  templateData: import("./store").TenantData | null;
21
21
  setTemplateData: (args_0: import("./store").TenantData | ((prev: import("./store").TenantData | null) => import("./store").TenantData | null) | null) => void;
22
- templateEditorContent: import("../TemplateEditor").ElementalContent | null | undefined;
23
- setTemplateEditorContent: (content: import("../TemplateEditor").ElementalContent | null | undefined) => void;
22
+ templateEditorContent: import("../..").ElementalContent | null | undefined;
23
+ setTemplateEditorContent: (content: import("../..").ElementalContent | null | undefined) => void;
24
24
  createCustomError: (message: string, toastProps?: import("sonner").ExternalToast) => TemplateError;
25
25
  convertLegacyError: (error: string | TemplateError) => TemplateError;
26
26
  /**
@@ -3,5 +3,6 @@ import type { Editor } from "@tiptap/react";
3
3
  export interface SideBarItemDetailsProps {
4
4
  element?: ProseMirrorNode;
5
5
  editor: Editor | null;
6
+ hideCloseButton?: boolean;
6
7
  }
7
- export declare const SideBarItemDetails: ({ element, editor }: SideBarItemDetailsProps) => import("react/jsx-runtime").JSX.Element | null;
8
+ export declare const SideBarItemDetails: ({ element, editor, hideCloseButton, }: SideBarItemDetailsProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -1,9 +1,4 @@
1
1
  export { BrandFooter } from "@/components/BrandEditor/Editor/BrandFooter";
2
- export { PreviewPanel } from "@/components/ui/PreviewPanel";
3
- export { TextMenu } from "@/components/ui/TextMenu";
4
- export { cn, convertElementalToTiptap, convertTiptapToElemental } from "@/lib/utils";
5
- export { VariableInput, VariableTextarea } from "@/components/ui/VariableEditor";
6
- export { getFlattenedVariables } from "@/components/utils/getFlattenedVariables";
7
2
  export { useChannels, getChannelDefaults } from "./Channels";
8
3
  export { default as EmailEditor } from "./Channels/Email/EmailEditor";
9
4
  export * from "./TemplateEditor";
@@ -11,20 +6,13 @@ export { SideBar as EmailSideBar, SideBarItemDetails as EmailSideBarItemDetails,
11
6
  export { SideBar as InboxSideBar } from "./Channels/Inbox/SideBar";
12
7
  export { MSTeamsSideBar } from "./Channels/MSTeams/SideBar";
13
8
  export { SlackSideBar, SlackSideBarItemDetails } from "./Channels/Slack/SideBar";
9
+ export { EmailEditorContainer, EmailEditorMain, type EmailEditorProps, type InboxEditorProps, type MSTeamsEditorProps, type PushEditorProps, type SlackEditorProps, type SMSEditorProps, } from "./Channels";
14
10
  export declare const EmailChannel: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<import("./Channels").EmailProps & import("react").RefAttributes<HTMLDivElement>>>;
15
11
  export declare const SMSChannel: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<import("./Channels").SMSProps & import("react").RefAttributes<HTMLDivElement>>>;
16
12
  export declare const PushChannel: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<import("./Channels").PushProps & import("react").RefAttributes<HTMLDivElement>>>;
17
13
  export declare const InboxChannel: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<import("./Channels").InboxProps & import("react").RefAttributes<HTMLDivElement>>>;
18
14
  export declare const MSTeamsChannel: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<import("./Channels").MSTeamsProps & import("react").RefAttributes<HTMLDivElement>>>;
19
15
  export declare const SlackChannel: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<import("./Channels").SlackProps & import("react").RefAttributes<HTMLDivElement>>>;
20
- export { EmailEditorContainer, EmailEditorMain, type EmailEditorProps, type InboxEditorProps, type MSTeamsEditorProps, type PushEditorProps, type SlackEditorProps, type SMSEditorProps, } from "./Channels";
21
- export { CHANNELS } from "@/channels";
22
- export type { ChannelType } from "@/store";
23
- export type { ElementalContent } from "@/types";
24
16
  export { ChannelRootContainer, EditorSidebar } from "./Layout";
25
17
  export { InboxEditor, MSTeamsEditor, PushEditor, SlackEditor, SMSEditor } from "./Channels";
26
- export { useAutoSave } from "@/hooks/useAutoSave";
27
18
  export { useDebouncedFlush } from "./hooks/useDebouncedFlush";
28
- export { Status as TemplateStatus } from "@/components/ui/Status";
29
- export { MonacoCodeEditor } from "@/components/extensions/CustomCode/MonacoCodeEditor";
30
- export { ToggleGroup } from "@/components/ui-kit";
@@ -3,6 +3,7 @@ import type { Editor } from "@tiptap/react";
3
3
  interface BlockquoteFormProps {
4
4
  element?: ProseMirrorNode;
5
5
  editor: Editor | null;
6
+ hideCloseButton?: boolean;
6
7
  }
7
- export declare const BlockquoteForm: ({ element, editor }: BlockquoteFormProps) => import("react/jsx-runtime").JSX.Element | null;
8
+ export declare const BlockquoteForm: ({ element, editor, hideCloseButton, }: BlockquoteFormProps) => import("react/jsx-runtime").JSX.Element | null;
8
9
  export {};
@@ -3,6 +3,7 @@ import type { Editor } from "@tiptap/react";
3
3
  interface ButtonFormProps {
4
4
  element?: ProseMirrorNode;
5
5
  editor: Editor | null;
6
+ hideCloseButton?: boolean;
6
7
  }
7
- export declare const ButtonForm: ({ element, editor }: ButtonFormProps) => import("react/jsx-runtime").JSX.Element | null;
8
+ export declare const ButtonForm: ({ element, editor, hideCloseButton }: ButtonFormProps) => import("react/jsx-runtime").JSX.Element | null;
8
9
  export {};
@@ -3,6 +3,7 @@ import type { Editor } from "@tiptap/react";
3
3
  interface ColumnFormProps {
4
4
  element?: ProseMirrorNode;
5
5
  editor: Editor | null;
6
+ hideCloseButton?: boolean;
6
7
  }
7
- export declare const ColumnForm: ({ element, editor }: ColumnFormProps) => import("react/jsx-runtime").JSX.Element | null;
8
+ export declare const ColumnForm: ({ element, editor, hideCloseButton }: ColumnFormProps) => import("react/jsx-runtime").JSX.Element | null;
8
9
  export {};
@@ -3,6 +3,7 @@ import type { Editor } from "@tiptap/react";
3
3
  interface CustomCodeFormProps {
4
4
  element?: ProseMirrorNode;
5
5
  editor: Editor | null;
6
+ hideCloseButton?: boolean;
6
7
  }
7
- export declare const CustomCodeForm: ({ element, editor }: CustomCodeFormProps) => import("react/jsx-runtime").JSX.Element | null;
8
+ export declare const CustomCodeForm: ({ element, editor, hideCloseButton, }: CustomCodeFormProps) => import("react/jsx-runtime").JSX.Element | null;
8
9
  export {};
@@ -3,6 +3,7 @@ import type { Editor } from "@tiptap/react";
3
3
  interface DividerFormProps {
4
4
  element?: ProseMirrorNode;
5
5
  editor: Editor | null;
6
+ hideCloseButton?: boolean;
6
7
  }
7
- export declare const DividerForm: ({ element, editor }: DividerFormProps) => import("react/jsx-runtime").JSX.Element | null;
8
+ export declare const DividerForm: ({ element, editor, hideCloseButton }: DividerFormProps) => import("react/jsx-runtime").JSX.Element | null;
8
9
  export {};
@@ -3,5 +3,6 @@ import type { Editor } from "@tiptap/react";
3
3
  export interface ImageBlockFormProps {
4
4
  element?: ProseMirrorNode;
5
5
  editor: Editor | null;
6
+ hideCloseButton?: boolean;
6
7
  }
7
- export declare const ImageBlockForm: ({ element, editor }: ImageBlockFormProps) => import("react/jsx-runtime").JSX.Element | null;
8
+ export declare const ImageBlockForm: ({ element, editor, hideCloseButton, }: ImageBlockFormProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,15 @@
1
+ import { Node } from "@tiptap/core";
2
+ import { defaultListProps, type ListProps } from "./List.types";
3
+ declare module "@tiptap/core" {
4
+ interface Commands<ReturnType> {
5
+ list: {
6
+ setList: (props?: Partial<ListProps>) => ReturnType;
7
+ toggleList: () => ReturnType;
8
+ toggleOrderedList: () => ReturnType;
9
+ toggleUnorderedList: () => ReturnType;
10
+ };
11
+ }
12
+ }
13
+ export { defaultListProps };
14
+ export declare const List: Node<any, any>;
15
+ export default List;
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+ export declare const listSchema: z.ZodObject<{
3
+ id: z.ZodOptional<z.ZodString>;
4
+ listType: z.ZodEnum<["ordered", "unordered"]>;
5
+ borderColor: z.ZodString;
6
+ borderWidth: z.ZodNumber;
7
+ paddingVertical: z.ZodNumber;
8
+ paddingHorizontal: z.ZodNumber;
9
+ }, "strip", z.ZodTypeAny, {
10
+ borderColor: string;
11
+ borderWidth: number;
12
+ paddingVertical: number;
13
+ paddingHorizontal: number;
14
+ listType: "ordered" | "unordered";
15
+ id?: string | undefined;
16
+ }, {
17
+ borderColor: string;
18
+ borderWidth: number;
19
+ paddingVertical: number;
20
+ paddingHorizontal: number;
21
+ listType: "ordered" | "unordered";
22
+ id?: string | undefined;
23
+ }>;
24
+ export interface ListProps {
25
+ /** Whether the list is ordered (numbered) or unordered (bulleted) */
26
+ listType: "ordered" | "unordered";
27
+ /** Unique identifier for the list node */
28
+ id?: string;
29
+ /** Border color for list markers (bullets/numbers) */
30
+ borderColor?: string;
31
+ /** Border width in pixels */
32
+ borderWidth?: number;
33
+ /** Vertical padding in pixels */
34
+ paddingVertical?: number;
35
+ /** Horizontal padding in pixels */
36
+ paddingHorizontal?: number;
37
+ }
38
+ export declare const defaultListProps: ListProps;
@@ -0,0 +1,12 @@
1
+ import { type NodeViewProps } from "@tiptap/react";
2
+ /**
3
+ * List NodeView component that renders the list.
4
+ *
5
+ * Uses SortableItemWrapper for proper drag-and-drop reordering,
6
+ * selection styling, and action buttons (duplicate, delete).
7
+ *
8
+ * When nested inside a blockquote, uses a simpler wrapper without
9
+ * drag handles or selection behavior to let the blockquote handle those.
10
+ */
11
+ export declare const ListComponentNode: (props: NodeViewProps) => import("react/jsx-runtime").JSX.Element;
12
+ export default ListComponentNode;
@@ -0,0 +1,9 @@
1
+ import type { Node as ProseMirrorNode } from "@tiptap/pm/model";
2
+ import type { Editor } from "@tiptap/react";
3
+ interface ListFormProps {
4
+ element?: ProseMirrorNode;
5
+ editor: Editor | null;
6
+ hideCloseButton?: boolean;
7
+ }
8
+ export declare const ListForm: ({ element, editor, hideCloseButton }: ListFormProps) => import("react/jsx-runtime").JSX.Element | null;
9
+ export {};
@@ -0,0 +1,4 @@
1
+ export { List, defaultListProps } from "./List";
2
+ export { ListForm } from "./ListForm";
3
+ export type { ListProps } from "./List.types";
4
+ export { listSchema } from "./List.types";
@@ -0,0 +1,34 @@
1
+ import { Node } from "@tiptap/core";
2
+ import type { ListItemProps } from "./ListItem.types";
3
+ declare module "@tiptap/core" {
4
+ interface Commands<ReturnType> {
5
+ listItem: {
6
+ /** Split the list item at the current cursor position */
7
+ splitListItem: (typeOrName: string) => ReturnType;
8
+ /** Lift the list item out of the list (outdent) */
9
+ liftListItem: (typeOrName: string) => ReturnType;
10
+ /** Sink the list item into a nested list (indent) */
11
+ sinkListItem: (typeOrName: string) => ReturnType;
12
+ /** Wrap selection in a list */
13
+ wrapInList: (typeOrName: string, attrs?: Record<string, unknown>) => ReturnType;
14
+ };
15
+ }
16
+ }
17
+ export declare const defaultListItemProps: ListItemProps;
18
+ /**
19
+ * Custom ListItem extension with prosemirror-schema-list commands.
20
+ *
21
+ * Provides commands:
22
+ * - splitListItem: Split list item at cursor (creates new bullet)
23
+ * - liftListItem: Lift list item out of list (outdent)
24
+ * - sinkListItem: Sink list item into nested list (indent)
25
+ * - wrapInList: Wrap selection in a list
26
+ *
27
+ * Keyboard shortcuts:
28
+ * - Enter: Split list item (handled in List extension)
29
+ * - Tab: Sink list item (handled in List extension)
30
+ * - Shift-Tab: Lift list item (handled in List extension)
31
+ * - Shift-Enter: Add a hard break (new line within the paragraph)
32
+ */
33
+ export declare const ListItem: Node<any, any>;
34
+ export default ListItem;
@@ -0,0 +1,7 @@
1
+ export interface ListItemProps {
2
+ /** Background color for the list item */
3
+ backgroundColor?: string;
4
+ /** Unique identifier for the list item node */
5
+ id?: string;
6
+ }
7
+ export declare const defaultListItemProps: ListItemProps;
@@ -0,0 +1,7 @@
1
+ import { type NodeViewProps } from "@tiptap/react";
2
+ /**
3
+ * Simple ListItem NodeView that renders as a standard <li> element.
4
+ * Uses NodeViewContent to allow prosemirror to manage the content.
5
+ */
6
+ export declare const ListItemComponentNode: (props: NodeViewProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default ListItemComponentNode;
@@ -0,0 +1,2 @@
1
+ export { ListItem, defaultListItemProps } from "./ListItem";
2
+ export type { ListItemProps } from "./ListItem.types";
@@ -3,6 +3,7 @@ import type { Editor } from "@tiptap/react";
3
3
  interface TextBlockFormProps {
4
4
  element?: ProseMirrorNode;
5
5
  editor: Editor | null;
6
+ hideCloseButton?: boolean;
6
7
  }
7
- export declare const TextBlockForm: ({ element, editor }: TextBlockFormProps) => import("react/jsx-runtime").JSX.Element | null;
8
+ export declare const TextBlockForm: ({ element, editor, hideCloseButton }: TextBlockFormProps) => import("react/jsx-runtime").JSX.Element | null;
8
9
  export {};
@@ -23,6 +23,8 @@ export { FixedChannelSelection } from "./FixedChannelSelection";
23
23
  export { Heading } from "./Heading";
24
24
  export { ImageBlock } from "./ImageBlock";
25
25
  export { Link } from "./Link";
26
+ export { List } from "./List";
27
+ export { ListItem } from "./ListItem";
26
28
  export { Paragraph } from "./Paragraph";
27
29
  export { Selection } from "./Selection";
28
30
  export { SlashMenu } from "./SlashMenu";
@@ -0,0 +1,2 @@
1
+ import { type BlockBaseProps } from "../Block";
2
+ export declare const ListBlock: ({ draggable }: Pick<BlockBaseProps, "draggable">) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from "./ListBlock";
@@ -6,5 +6,6 @@ export * from "./CustomCodeBlock";
6
6
  export * from "./DividerBlock";
7
7
  export * from "./HeadingBlock";
8
8
  export * from "./ImageBlock";
9
+ export * from "./ListBlock";
9
10
  export * from "./SpacerBlock";
10
11
  export * from "./TextBlock";
@@ -1,6 +1,7 @@
1
1
  interface FormHeaderProps {
2
- type: "text" | "image" | "spacer" | "divider" | "button" | "blockquote" | "heading" | "customCode" | "column";
2
+ type: "text" | "image" | "spacer" | "divider" | "button" | "blockquote" | "heading" | "customCode" | "column" | "list";
3
3
  label?: string;
4
+ hideCloseButton?: boolean;
4
5
  }
5
- export declare const FormHeader: ({ type }: FormHeaderProps) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const FormHeader: ({ type, hideCloseButton }: FormHeaderProps) => import("react/jsx-runtime").JSX.Element;
6
7
  export {};
@@ -7,8 +7,10 @@ export interface SortableItemWrapperProps extends NodeViewWrapperProps {
7
7
  className?: string;
8
8
  editor: Editor;
9
9
  getPos?: (() => number) | boolean;
10
+ /** If true, this element will not accept drops (but can still be dragged) */
11
+ disableDropTarget?: boolean;
10
12
  }
11
- export declare const SortableItemWrapper: ({ children, id, className, editor, getPos: _getPos, ...props }: SortableItemWrapperProps) => import("react/jsx-runtime").JSX.Element;
13
+ export declare const SortableItemWrapper: ({ children, id, className, editor, getPos: _getPos, disableDropTarget, ...props }: SortableItemWrapperProps) => import("react/jsx-runtime").JSX.Element;
12
14
  export interface SortableItemProps {
13
15
  children: React.ReactNode;
14
16
  id?: string;
@@ -28,6 +28,8 @@ export interface TextMenuConfig {
28
28
  alignRight?: TextMenuItem;
29
29
  alignJustify?: TextMenuItem;
30
30
  quote?: TextMenuItem;
31
+ orderedList?: TextMenuItem;
32
+ unorderedList?: TextMenuItem;
31
33
  link?: TextMenuItem;
32
34
  variable?: TextMenuItem;
33
35
  conditionalRules?: ConditionalRule[];
@@ -6,6 +6,8 @@ interface TextMenuStates {
6
6
  isUnderline: boolean;
7
7
  isStrike: boolean;
8
8
  isQuote: boolean;
9
+ isOrderedList: boolean;
10
+ isUnorderedList: boolean;
9
11
  isAlignLeft: boolean;
10
12
  isAlignCenter: boolean;
11
13
  isAlignRight: boolean;
@@ -23,6 +25,8 @@ export declare const useTextmenuCommands: (editor: Editor, config?: TextMenuConf
23
25
  onAlignJustify: () => boolean;
24
26
  onLink: (url: string, inNewTab?: boolean) => boolean;
25
27
  onQuote: () => void;
28
+ onOrderedList: () => void;
29
+ onUnorderedList: () => void;
26
30
  resetButtonFormatting: () => boolean;
27
31
  };
28
32
  export {};
@@ -9,6 +9,8 @@ export declare const useTextmenuStates: (editor: Editor | null) => {
9
9
  isAlignRight: boolean;
10
10
  isAlignJustify: boolean;
11
11
  isQuote: boolean;
12
+ isOrderedList: boolean;
13
+ isUnorderedList: boolean;
12
14
  isLink: boolean;
13
15
  shouldShow: ({ editor }: {
14
16
  editor: Editor;
@@ -31,5 +31,7 @@ export interface VariableChipBaseProps {
31
31
  textColorOverride?: string;
32
32
  /** Custom color getter function (kept for API compatibility, colors handled by CSS) */
33
33
  getColors?: (isInvalid: boolean, hasValue: boolean) => VariableColors;
34
+ /** Whether the chip is read-only (prevents editing) */
35
+ readOnly?: boolean;
34
36
  }
35
37
  export declare const VariableChipBase: React.FC<VariableChipBaseProps>;
@@ -0,0 +1,3 @@
1
+ import type { IconProps } from "./Icon";
2
+ export declare const UnorderedListIcon: ({ color, active, ...props }: IconProps) => import("react/jsx-runtime").JSX.Element;
3
+ export default UnorderedListIcon;
@@ -4,7 +4,7 @@ export { BinIcon } from "./BinIcon";
4
4
  export { BoldIcon } from "./BoldIcon";
5
5
  export { BorderRadiusIcon } from "./BorderRadiusIcon";
6
6
  export { BorderWidthIcon } from "./BorderWidthIcon";
7
- export { BulletListIcon } from "./BulletListIcon";
7
+ export { UnorderedListIcon } from "./UnorderedListIcon";
8
8
  export { CenterAlignIcon } from "./CenterAlignIcon";
9
9
  export { CloseIcon } from "./CloseIcon";
10
10
  export { ColorIcon } from "./ColorIcon";