@trycourier/react-designer 0.0.3 → 0.0.5

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/README.md +206 -22
  2. package/dist/cjs/index.js +41 -35
  3. package/dist/cjs/index.js.map +4 -4
  4. package/dist/cjs/styles.css +20 -0
  5. package/dist/components/Providers/BrandProvider.d.ts +0 -12
  6. package/dist/components/Providers/Providers.types.d.ts +1 -0
  7. package/dist/components/Providers/TemplateProvider.d.ts +7 -12
  8. package/dist/components/Providers/api/common.d.ts +1 -1
  9. package/dist/components/Providers/index.d.ts +4 -2
  10. package/dist/components/Providers/store.d.ts +41 -6
  11. package/dist/components/Providers/useBrandActions.d.ts +22 -0
  12. package/dist/components/Providers/useTemplateActions.d.ts +23 -0
  13. package/dist/components/TemplateEditor/Channels/Email/Email.d.ts +3 -3
  14. package/dist/components/TemplateEditor/Channels/Inbox/Inbox.d.ts +6 -2
  15. package/dist/components/TemplateEditor/Channels/Inbox/InboxEditor.d.ts +1 -1
  16. package/dist/components/TemplateEditor/Channels/Push/Push.d.ts +11 -5
  17. package/dist/components/TemplateEditor/Channels/SMS/SMS.d.ts +10 -5
  18. package/dist/components/TemplateEditor/TemplateEditor.d.ts +1 -1
  19. package/dist/components/TemplateEditor/index.d.ts +5 -1
  20. package/dist/components/TemplateEditor/store.d.ts +3 -0
  21. package/dist/components/extensions/Divider/Divider.types.d.ts +2 -2
  22. package/dist/components/ui/Status/Status.d.ts +4 -1
  23. package/dist/components/ui-kit/Button/Button.d.ts +1 -1
  24. package/dist/components/ui-kit/ErrorBoundary/ErrorBoundary.d.ts +22 -0
  25. package/dist/components/ui-kit/ErrorBoundary/index.d.ts +1 -0
  26. package/dist/components/ui-kit/index.d.ts +1 -0
  27. package/dist/esm/index.js +41 -35
  28. package/dist/esm/index.js.map +4 -4
  29. package/dist/esm/styles.css +20 -0
  30. package/dist/index.d.ts +2 -0
  31. package/dist/lib/api/uploadImage.d.ts +0 -1
  32. package/dist/lib/utils/errors.d.ts +26 -0
  33. package/dist/lib/utils/getTitle/demo.d.ts +1 -0
  34. package/dist/lib/utils/getTitle/getTitle.d.ts +18 -0
  35. package/dist/lib/utils/getTitle/getTitle.test.d.ts +1 -0
  36. package/dist/lib/utils/getTitle/index.d.ts +2 -0
  37. package/dist/lib/utils/getTitle/preserveStorageFormat.d.ts +30 -0
  38. package/dist/lib/utils/getTitle/preserveStorageFormat.test.d.ts +1 -0
  39. package/dist/lib/utils/index.d.ts +1 -0
  40. package/dist/lib/utils/updateElemental/updateElemental.d.ts +1 -1
  41. package/dist/styles.css +20 -0
  42. package/dist/types/elemental.types.d.ts +1 -0
  43. package/package.json +1 -1
@@ -1637,6 +1637,10 @@ body {
1637
1637
  .courier-border-primary {
1638
1638
  border-color: var(--primary);
1639
1639
  }
1640
+ .courier-border-red-200 {
1641
+ --tw-border-opacity: 1;
1642
+ border-color: rgb(254 202 202 / var(--tw-border-opacity, 1));
1643
+ }
1640
1644
  .courier-border-transparent {
1641
1645
  border-color: transparent;
1642
1646
  }
@@ -1745,6 +1749,10 @@ body {
1745
1749
  .courier-bg-primary {
1746
1750
  background-color: var(--primary);
1747
1751
  }
1752
+ .courier-bg-red-50 {
1753
+ --tw-bg-opacity: 1;
1754
+ background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1));
1755
+ }
1748
1756
  .courier-bg-red-500 {
1749
1757
  --tw-bg-opacity: 1;
1750
1758
  background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1));
@@ -2052,6 +2060,10 @@ body {
2052
2060
  --tw-text-opacity: 1;
2053
2061
  color: rgb(107 114 128 / var(--tw-text-opacity, 1));
2054
2062
  }
2063
+ .courier-text-gray-600 {
2064
+ --tw-text-opacity: 1;
2065
+ color: rgb(75 85 99 / var(--tw-text-opacity, 1));
2066
+ }
2055
2067
  .courier-text-inherit {
2056
2068
  color: inherit;
2057
2069
  }
@@ -2077,6 +2089,14 @@ body {
2077
2089
  --tw-text-opacity: 1;
2078
2090
  color: rgb(239 68 68 / var(--tw-text-opacity, 1));
2079
2091
  }
2092
+ .courier-text-red-600 {
2093
+ --tw-text-opacity: 1;
2094
+ color: rgb(220 38 38 / var(--tw-text-opacity, 1));
2095
+ }
2096
+ .courier-text-red-800 {
2097
+ --tw-text-opacity: 1;
2098
+ color: rgb(153 27 27 / var(--tw-text-opacity, 1));
2099
+ }
2080
2100
  .courier-text-ring {
2081
2101
  color: var(--ring);
2082
2102
  }
package/dist/index.d.ts CHANGED
@@ -2,3 +2,5 @@ import "./styles.css";
2
2
  export * from "./components/TemplateEditor";
3
3
  export * from "./components/BrandEditor";
4
4
  export * from "./components/Providers";
5
+ export * from "./lib/utils/errors";
6
+ export * from "./components/ui-kit/ErrorBoundary";
@@ -1,5 +1,4 @@
1
1
  export declare const uploadImage: (file: File, config: {
2
2
  apiUrl: string;
3
3
  token: string;
4
- tenantId: string;
5
4
  }) => Promise<string>;
@@ -0,0 +1,26 @@
1
+ import type { ExternalToast } from "sonner";
2
+ /**
3
+ * Error handling utilities for the Courier Designer
4
+ */
5
+ export interface TemplateError {
6
+ /** Human-readable error message */
7
+ message: string;
8
+ /** Optional toast configuration (duration, action, description, etc.) */
9
+ toastProps?: ExternalToast;
10
+ }
11
+ /**
12
+ * Creates a custom error (for use in override functions)
13
+ */
14
+ export declare const createCustomError: (message: string, toastProps?: ExternalToast) => TemplateError;
15
+ /**
16
+ * Checks if an error has a retry action configured
17
+ */
18
+ export declare const isRetryableError: (error: TemplateError) => boolean;
19
+ /**
20
+ * Extracts error message from various error formats for backward compatibility
21
+ */
22
+ export declare const extractErrorMessage: (error: unknown) => string;
23
+ /**
24
+ * Converts a legacy string error to a TemplateError
25
+ */
26
+ export declare const convertLegacyError: (error: string | TemplateError) => TemplateError;
@@ -0,0 +1 @@
1
+ export declare function demoTitleExtraction(): void;
@@ -0,0 +1,18 @@
1
+ import type { ElementalContent, ElementalNode } from "@/types/elemental.types";
2
+ /**
3
+ * Extracts the title from Elemental elements following the same logic as the backend.
4
+ * This function searches through elements to find:
5
+ * 1. Meta elements with a title field
6
+ * 2. Channel elements with raw.subject or raw.title
7
+ * 3. Recursively searches within channel elements
8
+ * 4. Fallback: First text element content (for Push/Inbox channels)
9
+ */
10
+ export declare function getTitle(elements: ElementalNode[]): string;
11
+ /**
12
+ * Convenience function to get title from ElementalContent
13
+ */
14
+ export declare function getTitleFromContent(content: ElementalContent | null | undefined): string;
15
+ /**
16
+ * Get title for a specific channel from ElementalContent
17
+ */
18
+ export declare function getTitleForChannel(content: ElementalContent | null | undefined, channelName: string): string;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export { getTitle, getTitleFromContent, getTitleForChannel } from "./getTitle";
2
+ export { getSubjectStorageFormat, createTitleUpdate, extractCurrentTitle, } from "./preserveStorageFormat";
@@ -0,0 +1,30 @@
1
+ import type { ElementalContent, ElementalNode } from "@/types/elemental.types";
2
+ /**
3
+ * Cleans an Inbox element by removing styling properties from text and action elements.
4
+ */
5
+ export declare function cleanInboxElements(elements: ElementalNode[]): ElementalNode[];
6
+ /**
7
+ * Cleans the entire template content by applying Inbox cleaning logic to all Inbox channels.
8
+ */
9
+ export declare function cleanTemplateContent(content: ElementalContent): ElementalContent;
10
+ /**
11
+ * Determines how the subject/title was originally stored in a template
12
+ * Returns "raw" if stored in channel.raw.subject/title, "meta" if stored in meta element
13
+ */
14
+ export declare function getSubjectStorageFormat(content: ElementalContent | null | undefined, channelName: string): "raw" | "meta" | "none";
15
+ /**
16
+ * Creates the appropriate subject/title storage structure based on the detected format.
17
+ * For Push and Inbox channels, extracts the first text element as title.
18
+ */
19
+ export declare function createTitleUpdate(originalContent: ElementalContent | null | undefined, channelName: string, newTitle: string, elementalNodes: ElementalNode[]): {
20
+ elements: ElementalNode[];
21
+ raw?: {
22
+ subject?: string;
23
+ title?: string;
24
+ text?: string;
25
+ };
26
+ };
27
+ /**
28
+ * Helper to extract the current title from a channel element regardless of storage format
29
+ */
30
+ export declare function extractCurrentTitle(channelElement: ElementalNode | undefined, channelName: string): string;
@@ -4,5 +4,6 @@ export * from "./convertElementalToTiptap";
4
4
  export * from "./convertMarkdownToTiptap";
5
5
  export * from "./convertTiptapToElemental";
6
6
  export * from "./getRenderContainer";
7
+ export * from "./getTitle";
7
8
  export * from "./updateElemental";
8
9
  export * from "./useForwardedRefCallback";
@@ -4,7 +4,7 @@ interface ElementalChannelSpecificProps {
4
4
  [key: string]: any;
5
5
  }
6
6
  export interface UpdateElementalOptions {
7
- elements: ElementalNode[];
7
+ elements?: ElementalNode[];
8
8
  channel?: string | ElementalChannelSpecificProps;
9
9
  }
10
10
  export declare function updateElemental(doc: ElementalContent | null | undefined, updates: UpdateElementalOptions): ElementalContent;
package/dist/styles.css CHANGED
@@ -1637,6 +1637,10 @@ body {
1637
1637
  .courier-border-primary {
1638
1638
  border-color: var(--primary);
1639
1639
  }
1640
+ .courier-border-red-200 {
1641
+ --tw-border-opacity: 1;
1642
+ border-color: rgb(254 202 202 / var(--tw-border-opacity, 1));
1643
+ }
1640
1644
  .courier-border-transparent {
1641
1645
  border-color: transparent;
1642
1646
  }
@@ -1745,6 +1749,10 @@ body {
1745
1749
  .courier-bg-primary {
1746
1750
  background-color: var(--primary);
1747
1751
  }
1752
+ .courier-bg-red-50 {
1753
+ --tw-bg-opacity: 1;
1754
+ background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1));
1755
+ }
1748
1756
  .courier-bg-red-500 {
1749
1757
  --tw-bg-opacity: 1;
1750
1758
  background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1));
@@ -2052,6 +2060,10 @@ body {
2052
2060
  --tw-text-opacity: 1;
2053
2061
  color: rgb(107 114 128 / var(--tw-text-opacity, 1));
2054
2062
  }
2063
+ .courier-text-gray-600 {
2064
+ --tw-text-opacity: 1;
2065
+ color: rgb(75 85 99 / var(--tw-text-opacity, 1));
2066
+ }
2055
2067
  .courier-text-inherit {
2056
2068
  color: inherit;
2057
2069
  }
@@ -2077,6 +2089,14 @@ body {
2077
2089
  --tw-text-opacity: 1;
2078
2090
  color: rgb(239 68 68 / var(--tw-text-opacity, 1));
2079
2091
  }
2092
+ .courier-text-red-600 {
2093
+ --tw-text-opacity: 1;
2094
+ color: rgb(220 38 38 / var(--tw-text-opacity, 1));
2095
+ }
2096
+ .courier-text-red-800 {
2097
+ --tw-text-opacity: 1;
2098
+ color: rgb(153 27 27 / var(--tw-text-opacity, 1));
2099
+ }
2080
2100
  .courier-text-ring {
2081
2101
  color: var(--ring);
2082
2102
  }
@@ -95,6 +95,7 @@ export interface ElementalChannelNode extends IsElementalNode {
95
95
  raw?: {
96
96
  html?: string;
97
97
  transformers?: string[];
98
+ subject?: string;
98
99
  title?: string;
99
100
  text?: string;
100
101
  [templateName: string]: unknown;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trycourier/react-designer",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "React-based rich text designer component",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",