@trycourier/react-designer 0.1.0 → 0.2.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.
@@ -1534,6 +1534,11 @@ body {
1534
1534
  .courier-overflow-y-auto {
1535
1535
  overflow-y: auto;
1536
1536
  }
1537
+ .courier-truncate {
1538
+ overflow: hidden;
1539
+ text-overflow: ellipsis;
1540
+ white-space: nowrap;
1541
+ }
1537
1542
  .courier-whitespace-nowrap {
1538
1543
  white-space: nowrap;
1539
1544
  }
@@ -1635,6 +1640,10 @@ body {
1635
1640
  --tw-border-opacity: 1;
1636
1641
  border-color: rgb(59 130 246 / var(--tw-border-opacity, 1));
1637
1642
  }
1643
+ .courier-border-\[\#BFDBFE\] {
1644
+ --tw-border-opacity: 1;
1645
+ border-color: rgb(191 219 254 / var(--tw-border-opacity, 1));
1646
+ }
1638
1647
  .courier-border-accent-foreground {
1639
1648
  border-color: var(--accent-foreground);
1640
1649
  }
@@ -1658,10 +1667,6 @@ body {
1658
1667
  --tw-border-opacity: 1;
1659
1668
  border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));
1660
1669
  }
1661
- .courier-border-gray-400 {
1662
- --tw-border-opacity: 1;
1663
- border-color: rgb(156 163 175 / var(--tw-border-opacity, 1));
1664
- }
1665
1670
  .courier-border-input {
1666
1671
  border-color: var(--input);
1667
1672
  }
@@ -1738,6 +1743,10 @@ body {
1738
1743
  --tw-bg-opacity: 1;
1739
1744
  background-color: rgb(229 229 229 / var(--tw-bg-opacity, 1));
1740
1745
  }
1746
+ .courier-bg-\[\#EFF6FF\] {
1747
+ --tw-bg-opacity: 1;
1748
+ background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));
1749
+ }
1741
1750
  .courier-bg-\[\#F5F5F5\] {
1742
1751
  --tw-bg-opacity: 1;
1743
1752
  background-color: rgb(245 245 245 / var(--tw-bg-opacity, 1));
@@ -1995,6 +2004,9 @@ body {
1995
2004
  .courier-pb-6 {
1996
2005
  padding-bottom: 1.5rem;
1997
2006
  }
2007
+ .courier-pl-1 {
2008
+ padding-left: 0.25rem;
2009
+ }
1998
2010
  .courier-pl-2 {
1999
2011
  padding-left: 0.5rem;
2000
2012
  }
@@ -2013,9 +2025,6 @@ body {
2013
2025
  .courier-pr-2 {
2014
2026
  padding-right: 0.5rem;
2015
2027
  }
2016
- .courier-pr-3 {
2017
- padding-right: 0.75rem;
2018
- }
2019
2028
  .courier-pr-4 {
2020
2029
  padding-right: 1rem;
2021
2030
  }
@@ -2046,6 +2055,9 @@ body {
2046
2055
  .courier-text-center {
2047
2056
  text-align: center;
2048
2057
  }
2058
+ .courier-font-mono {
2059
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
2060
+ }
2049
2061
  .courier-font-sans {
2050
2062
  font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
2051
2063
  }
@@ -2110,6 +2122,9 @@ body {
2110
2122
  .courier-leading-relaxed {
2111
2123
  line-height: 1.625;
2112
2124
  }
2125
+ .courier-tracking-\[0\.64px\] {
2126
+ letter-spacing: 0.64px;
2127
+ }
2113
2128
  .courier-tracking-widest {
2114
2129
  letter-spacing: 0.1em;
2115
2130
  }
@@ -3584,17 +3599,9 @@ body {
3584
3599
  .read-only\:courier-border-transparent:read-only {
3585
3600
  border-color: transparent;
3586
3601
  }
3587
- .hover\:courier-border-\[\#3B82F6\]:hover {
3588
- --tw-border-opacity: 1;
3589
- border-color: rgb(59 130 246 / var(--tw-border-opacity, 1));
3590
- }
3591
3602
  .hover\:courier-border-accent-foreground:hover {
3592
3603
  border-color: var(--accent-foreground);
3593
3604
  }
3594
- .hover\:courier-bg-\[\#3B82F6\]:hover {
3595
- --tw-bg-opacity: 1;
3596
- background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1));
3597
- }
3598
3605
  .hover\:courier-bg-accent:hover {
3599
3606
  background-color: var(--accent);
3600
3607
  }
@@ -3633,10 +3640,6 @@ body {
3633
3640
  .hover\:courier-bg-opacity-20:hover {
3634
3641
  --tw-bg-opacity: 0.2;
3635
3642
  }
3636
- .hover\:courier-text-\[\#ffffff\]:hover {
3637
- --tw-text-opacity: 1;
3638
- color: rgb(255 255 255 / var(--tw-text-opacity, 1));
3639
- }
3640
3643
  .hover\:courier-text-accent-foreground:hover {
3641
3644
  color: var(--accent-foreground);
3642
3645
  }
@@ -3718,9 +3721,6 @@ body {
3718
3721
  .disabled\:courier-opacity-50:disabled {
3719
3722
  opacity: 0.5;
3720
3723
  }
3721
- .courier-group:hover .group-hover\:courier-stroke-primary {
3722
- stroke: var(--primary);
3723
- }
3724
3724
  .courier-group.toaster .group-\[\.toaster\]\:courier-border-border {
3725
3725
  border-color: var(--border);
3726
3726
  }
@@ -1,5 +1,6 @@
1
1
  import type { ElementalContent } from "@/types/elemental.types";
2
2
  import type { TemplateError } from "@/lib/utils/errors";
3
+ import type { ContentTransformer } from "../TemplateEditor/store";
3
4
  export type MessageRoutingMethod = "all" | "single";
4
5
  export type MessageRoutingChannel = string | MessageRouting;
5
6
  export interface MessageRouting {
@@ -122,4 +123,8 @@ export interface TemplateActions {
122
123
  setTemplateEditorContent: (content: ElementalContent | null) => void;
123
124
  createCustomError: (message: string, details?: Record<string, unknown>) => TemplateError;
124
125
  convertLegacyError: (error: string | TemplateError) => TemplateError;
126
+ /** @internal Experimental API - subject to change */
127
+ contentTransformer: ContentTransformer | null;
128
+ /** @internal Experimental API - subject to change */
129
+ setContentTransformer: (transformer: ContentTransformer | null) => void;
125
130
  }
@@ -1,4 +1,6 @@
1
+ import { type ContentTransformer } from "../TemplateEditor/store";
1
2
  import { type TemplateError } from "@/lib/utils/errors";
3
+ export type { ContentTransformer };
2
4
  export declare function useTemplateActions(): {
3
5
  getTemplate: (options?: {
4
6
  includeBrand?: boolean;
@@ -16,7 +18,25 @@ export declare function useTemplateActions(): {
16
18
  templateData: import("./store").TenantData | null;
17
19
  setTemplateData: (args_0: import("./store").TenantData | ((prev: import("./store").TenantData | null) => import("./store").TenantData | null) | null) => void;
18
20
  templateEditorContent: import("../TemplateEditor").ElementalContent | null | undefined;
19
- setTemplateEditorContent: (args_0: import("../TemplateEditor").ElementalContent | ((prev: import("../TemplateEditor").ElementalContent | null | undefined) => import("../TemplateEditor").ElementalContent | null | undefined) | null | undefined) => void;
21
+ setTemplateEditorContent: (content: import("../TemplateEditor").ElementalContent | null | undefined) => void;
20
22
  createCustomError: (message: string, toastProps?: import("sonner").ExternalToast) => TemplateError;
21
23
  convertLegacyError: (error: string | TemplateError) => TemplateError;
24
+ /**
25
+ * @internal Experimental API - subject to change
26
+ * Synchronous function to transform content before it's stored in the atom.
27
+ * Useful for adding metadata (e.g., locales) that shouldn't affect editor display.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * setContentTransformer((content) => ({
32
+ * ...content,
33
+ * elements: content.elements?.map(el => ({
34
+ * ...el,
35
+ * locales: { 'fr': { content: translateToFrench(el.content) } }
36
+ * }))
37
+ * }));
38
+ * ```
39
+ */
40
+ contentTransformer: ContentTransformer | null;
41
+ setContentTransformer: (args_0: ContentTransformer | ((prev: ContentTransformer | null) => ContentTransformer | null) | null) => void;
22
42
  };
@@ -28,6 +28,7 @@ export interface EmailProps extends Pick<TemplateEditorProps, "hidePublish" | "b
28
28
  channels?: ChannelType[];
29
29
  routing?: MessageRouting;
30
30
  }) => React.ReactNode;
31
+ hidePreviewPanelExitButton?: boolean;
31
32
  render?: ({ subject, handleSubjectChange, selectedNode, setSelectedNode, previewMode, templateEditor, ref, isBrandApply, brandSettings, items, content, strategy, syncEditorItems, brandEditorContent, templateData, togglePreviewMode, }: {
32
33
  subject: string | null;
33
34
  handleSubjectChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
@@ -45,6 +46,7 @@ export interface EmailProps extends Pick<TemplateEditorProps, "hidePublish" | "b
45
46
  brandEditorContent: string | null;
46
47
  templateData: TenantData | null;
47
48
  togglePreviewMode: (mode: "desktop" | "mobile" | undefined) => void;
49
+ hidePreviewPanelExitButton?: boolean;
48
50
  }) => React.ReactNode;
49
51
  }
50
52
  interface Items {
@@ -1,4 +1,5 @@
1
1
  import type { MSTeamsRenderProps } from "./MSTeams";
2
2
  export interface MSTeamsEditorProps extends MSTeamsRenderProps {
3
+ readOnly?: boolean;
3
4
  }
4
- export declare const MSTeamsEditor: ({ content, extensions, editable, autofocus, onUpdate, items, }: MSTeamsEditorProps) => import("react/jsx-runtime").JSX.Element | null;
5
+ export declare const MSTeamsEditor: ({ content, extensions, editable, autofocus, onUpdate, items, readOnly, }: MSTeamsEditorProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -1,4 +1,5 @@
1
1
  import type { SlackRenderProps } from "./Slack";
2
2
  export interface SlackEditorProps extends SlackRenderProps {
3
+ readOnly?: boolean;
3
4
  }
4
- export declare const SlackEditor: ({ content, extensions, editable, autofocus, onUpdate, items, }: SlackEditorProps) => import("react/jsx-runtime").JSX.Element | null;
5
+ export declare const SlackEditor: ({ content, extensions, editable, autofocus, onUpdate, items, readOnly, }: SlackEditorProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,7 @@
1
+ import type { TiptapDoc } from "@/lib/utils";
2
+ import type { ElementalNode } from "@/types/elemental.types";
3
+ export interface ReadOnlyEditorContentProps {
4
+ value?: TiptapDoc;
5
+ defaultValue: ElementalNode[];
6
+ }
7
+ export declare const ReadOnlyEditorContent: ({ value, defaultValue }: ReadOnlyEditorContentProps) => null;
@@ -3,9 +3,11 @@ import type { Editor } from "@tiptap/react";
3
3
  export declare const subjectAtom: import("jotai").PrimitiveAtom<string | null> & {
4
4
  init: string | null;
5
5
  };
6
- export declare const templateEditorContentAtom: import("jotai").PrimitiveAtom<ElementalContent | null | undefined> & {
7
- init: ElementalContent | null | undefined;
6
+ export type ContentTransformer = (content: ElementalContent) => ElementalContent;
7
+ export declare const contentTransformerAtom: import("jotai").PrimitiveAtom<ContentTransformer | null> & {
8
+ init: ContentTransformer | null;
8
9
  };
10
+ export declare const templateEditorContentAtom: import("jotai").WritableAtom<ElementalContent | null | undefined, [content: ElementalContent | null | undefined], void>;
9
11
  export declare const templateEditorPublishedAtAtom: import("jotai").PrimitiveAtom<string | null | undefined> & {
10
12
  init: string | null | undefined;
11
13
  };
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const VariableIcon: React.FC;
@@ -3,6 +3,7 @@ interface PreviewPanelProps extends HTMLAttributes<HTMLDivElement> {
3
3
  previewMode: "desktop" | "mobile" | undefined;
4
4
  togglePreviewMode: (mode?: "desktop" | "mobile" | undefined) => void;
5
5
  hideMobileToggle?: boolean;
6
+ hideExitButton?: boolean;
6
7
  }
7
- export declare const PreviewPanel: ({ previewMode, togglePreviewMode, hideMobileToggle, ...props }: PreviewPanelProps) => import("react/jsx-runtime").JSX.Element;
8
+ export declare const PreviewPanel: ({ previewMode, togglePreviewMode, hideMobileToggle, hideExitButton, ...props }: PreviewPanelProps) => import("react/jsx-runtime").JSX.Element;
8
9
  export {};