@trycourier/react-designer 0.0.0-canary-20251202152218 → 0.0.0-canary-20251205100831

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.
@@ -259,15 +259,15 @@
259
259
  pointer-events: none;
260
260
  width: 100%;
261
261
  } */
262
- .ProseMirror>*:first-child:first-child,
263
- .ProseMirror [data-type="column"]>*:first-child {
262
+ .ProseMirror > *:first-child:first-child,
263
+ .ProseMirror [data-type="column"] > *:first-child {
264
264
  margin-top: 0px;
265
265
  }
266
- .ProseMirror>*:first-child:last-child,
267
- .ProseMirror [data-type="column"]>*:last-child {
266
+ .ProseMirror > *:first-child:last-child,
267
+ .ProseMirror [data-type="column"] > *:last-child {
268
268
  margin-bottom: 0px;
269
269
  }
270
- .ProseMirror>*+* {
270
+ .ProseMirror > * + * {
271
271
  margin-top: 0.75em;
272
272
  }
273
273
  .ProseMirror .node-imageUpload {
@@ -375,9 +375,6 @@
375
375
  .ProseMirror .node-imageBlock img {
376
376
  overflow: hidden;
377
377
  }
378
- .ProseMirror .node-imageBlock img {
379
- border-radius: 0.75rem;
380
- }
381
378
  .ProseMirror .node-imageBlock img {
382
379
  border-width: 2px;
383
380
  }
@@ -409,45 +406,45 @@
409
406
  --tw-border-opacity: 1;
410
407
  border-color: rgb(229 229 229 / var(--tw-border-opacity, 1));
411
408
  }
412
- .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper]>* {
409
+ .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper] > * {
413
410
  border-radius: var(--radius);
414
411
  }
415
- .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper]>* {
412
+ .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper] > * {
416
413
  --tw-shadow: 0 0 0 2px;
417
414
  --tw-shadow-colored: 0 0 0 2px var(--tw-shadow-color);
418
415
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
419
416
  }
420
- .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper]>* {
417
+ .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper] > * {
421
418
  --tw-shadow-color: rgb(0 0 0 / 0.3);
422
419
  --tw-shadow: var(--tw-shadow-colored);
423
420
  }
424
- .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper]>* {
421
+ .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper] > * {
425
422
  transition-property: all;
426
423
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
427
424
  transition-duration: 150ms;
428
425
  }
429
- .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper]>*:is(.courier-dark *), .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper]>*:is(.courier-dark *), .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper]>*:is(.courier-dark *) {
426
+ .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper] > *:is(.courier-dark *), .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper] > *:is(.courier-dark *), .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper] > *:is(.courier-dark *) {
430
427
  --tw-shadow-color: rgb(255 255 255 / 0.3);
431
428
  --tw-shadow: var(--tw-shadow-colored);
432
429
  }
433
- .ProseMirror .ProseMirror-gapcursor+.node-imageBlock,
434
- .ProseMirror .ProseMirror-gapcursor+.node-imageUpload,
435
- .ProseMirror .ProseMirror-gapcursor+.node-blockquote {
430
+ .ProseMirror .ProseMirror-gapcursor + .node-imageBlock,
431
+ .ProseMirror .ProseMirror-gapcursor + .node-imageUpload,
432
+ .ProseMirror .ProseMirror-gapcursor + .node-blockquote {
436
433
  outline-color: #404040;
437
434
  }
438
- .ProseMirror .ProseMirror-gapcursor+.node-imageBlock:hover,
439
- .ProseMirror .ProseMirror-gapcursor+.node-imageUpload:hover,
440
- .ProseMirror .ProseMirror-gapcursor+.node-blockquote:hover {
435
+ .ProseMirror .ProseMirror-gapcursor + .node-imageBlock:hover,
436
+ .ProseMirror .ProseMirror-gapcursor + .node-imageUpload:hover,
437
+ .ProseMirror .ProseMirror-gapcursor + .node-blockquote:hover {
441
438
  outline-color: #525252;
442
439
  }
443
- .ProseMirror .ProseMirror-gapcursor+.node-imageBlock:is(.courier-dark *),
444
- .ProseMirror .ProseMirror-gapcursor+.node-imageUpload:is(.courier-dark *),
445
- .ProseMirror .ProseMirror-gapcursor+.node-blockquote:is(.courier-dark *) {
440
+ .ProseMirror .ProseMirror-gapcursor + .node-imageBlock:is(.courier-dark *),
441
+ .ProseMirror .ProseMirror-gapcursor + .node-imageUpload:is(.courier-dark *),
442
+ .ProseMirror .ProseMirror-gapcursor + .node-blockquote:is(.courier-dark *) {
446
443
  outline-color: #d4d4d4;
447
444
  }
448
- .ProseMirror .ProseMirror-gapcursor+.node-imageBlock:hover:is(.courier-dark *),
449
- .ProseMirror .ProseMirror-gapcursor+.node-imageUpload:hover:is(.courier-dark *),
450
- .ProseMirror .ProseMirror-gapcursor+.node-blockquote:hover:is(.courier-dark *) {
445
+ .ProseMirror .ProseMirror-gapcursor + .node-imageBlock:hover:is(.courier-dark *),
446
+ .ProseMirror .ProseMirror-gapcursor + .node-imageUpload:hover:is(.courier-dark *),
447
+ .ProseMirror .ProseMirror-gapcursor + .node-blockquote:hover:is(.courier-dark *) {
451
448
  outline-color: #a3a3a3;
452
449
  }
453
450
  *, ::before, ::after {
@@ -1626,9 +1623,6 @@ body {
1626
1623
  .courier-rounded-sm {
1627
1624
  border-radius: calc(var(--radius) - 4px);
1628
1625
  }
1629
- .courier-rounded-xl {
1630
- border-radius: 0.75rem;
1631
- }
1632
1626
  .courier-rounded-b-none {
1633
1627
  border-bottom-right-radius: 0px;
1634
1628
  border-bottom-left-radius: 0px;
@@ -2193,6 +2187,9 @@ body {
2193
2187
  .courier-leading-relaxed {
2194
2188
  line-height: 1.625;
2195
2189
  }
2190
+ .courier-leading-tight {
2191
+ line-height: 1.25;
2192
+ }
2196
2193
  .courier-tracking-\[0\.64px\] {
2197
2194
  letter-spacing: 0.64px;
2198
2195
  }
@@ -2711,6 +2708,10 @@ body {
2711
2708
  .courier-sms-editor .ProseMirror > .react-renderer .draggable-item > div {
2712
2709
  padding-left: 0px;
2713
2710
  }
2711
+ .courier-sms-editor .ProseMirror > .react-renderer.node-paragraph p {
2712
+ overflow-wrap: break-word;
2713
+ word-break: break-word;
2714
+ }
2714
2715
  .courier-sms-editor .ProseMirror > .react-renderer.node-paragraph .selected-element .node-element::before {
2715
2716
  display: none;
2716
2717
  }
@@ -1,5 +1,10 @@
1
1
  export declare const MAX_IMAGE_DIMENSION = 800;
2
2
  export declare const MAX_FILE_SIZE: number;
3
+ export declare const BLANK_IMAGE_PLACEHOLDER = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
4
+ /**
5
+ * Check if an image source is effectively blank (empty or placeholder)
6
+ */
7
+ export declare function isBlankImageSrc(src: string | undefined | null): boolean;
3
8
  export declare const resizeImage: (file: File, maxDimension: number) => Promise<{
4
9
  dataUrl: string;
5
10
  width: number;
package/dist/styles.css CHANGED
@@ -259,15 +259,15 @@
259
259
  pointer-events: none;
260
260
  width: 100%;
261
261
  } */
262
- .ProseMirror>*:first-child:first-child,
263
- .ProseMirror [data-type="column"]>*:first-child {
262
+ .ProseMirror > *:first-child:first-child,
263
+ .ProseMirror [data-type="column"] > *:first-child {
264
264
  margin-top: 0px;
265
265
  }
266
- .ProseMirror>*:first-child:last-child,
267
- .ProseMirror [data-type="column"]>*:last-child {
266
+ .ProseMirror > *:first-child:last-child,
267
+ .ProseMirror [data-type="column"] > *:last-child {
268
268
  margin-bottom: 0px;
269
269
  }
270
- .ProseMirror>*+* {
270
+ .ProseMirror > * + * {
271
271
  margin-top: 0.75em;
272
272
  }
273
273
  .ProseMirror .node-imageUpload {
@@ -375,9 +375,6 @@
375
375
  .ProseMirror .node-imageBlock img {
376
376
  overflow: hidden;
377
377
  }
378
- .ProseMirror .node-imageBlock img {
379
- border-radius: 0.75rem;
380
- }
381
378
  .ProseMirror .node-imageBlock img {
382
379
  border-width: 2px;
383
380
  }
@@ -409,45 +406,45 @@
409
406
  --tw-border-opacity: 1;
410
407
  border-color: rgb(229 229 229 / var(--tw-border-opacity, 1));
411
408
  }
412
- .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper]>* {
409
+ .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper] > * {
413
410
  border-radius: var(--radius);
414
411
  }
415
- .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper]>* {
412
+ .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper] > * {
416
413
  --tw-shadow: 0 0 0 2px;
417
414
  --tw-shadow-colored: 0 0 0 2px var(--tw-shadow-color);
418
415
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
419
416
  }
420
- .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper]>* {
417
+ .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper] > * {
421
418
  --tw-shadow-color: rgb(0 0 0 / 0.3);
422
419
  --tw-shadow: var(--tw-shadow-colored);
423
420
  }
424
- .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper]>*, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper]>* {
421
+ .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper] > *, .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper] > * {
425
422
  transition-property: all;
426
423
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
427
424
  transition-duration: 150ms;
428
425
  }
429
- .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper]>*:is(.courier-dark *), .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper]>*:is(.courier-dark *), .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper]>*:is(.courier-dark *) {
426
+ .ProseMirror .node-aiWriter.has-focus [data-node-view-wrapper] > *:is(.courier-dark *), .ProseMirror .node-aiImage.has-focus [data-node-view-wrapper] > *:is(.courier-dark *), .ProseMirror .node-tableOfContentsNode.has-focus [data-node-view-wrapper] > *:is(.courier-dark *) {
430
427
  --tw-shadow-color: rgb(255 255 255 / 0.3);
431
428
  --tw-shadow: var(--tw-shadow-colored);
432
429
  }
433
- .ProseMirror .ProseMirror-gapcursor+.node-imageBlock,
434
- .ProseMirror .ProseMirror-gapcursor+.node-imageUpload,
435
- .ProseMirror .ProseMirror-gapcursor+.node-blockquote {
430
+ .ProseMirror .ProseMirror-gapcursor + .node-imageBlock,
431
+ .ProseMirror .ProseMirror-gapcursor + .node-imageUpload,
432
+ .ProseMirror .ProseMirror-gapcursor + .node-blockquote {
436
433
  outline-color: #404040;
437
434
  }
438
- .ProseMirror .ProseMirror-gapcursor+.node-imageBlock:hover,
439
- .ProseMirror .ProseMirror-gapcursor+.node-imageUpload:hover,
440
- .ProseMirror .ProseMirror-gapcursor+.node-blockquote:hover {
435
+ .ProseMirror .ProseMirror-gapcursor + .node-imageBlock:hover,
436
+ .ProseMirror .ProseMirror-gapcursor + .node-imageUpload:hover,
437
+ .ProseMirror .ProseMirror-gapcursor + .node-blockquote:hover {
441
438
  outline-color: #525252;
442
439
  }
443
- .ProseMirror .ProseMirror-gapcursor+.node-imageBlock:is(.courier-dark *),
444
- .ProseMirror .ProseMirror-gapcursor+.node-imageUpload:is(.courier-dark *),
445
- .ProseMirror .ProseMirror-gapcursor+.node-blockquote:is(.courier-dark *) {
440
+ .ProseMirror .ProseMirror-gapcursor + .node-imageBlock:is(.courier-dark *),
441
+ .ProseMirror .ProseMirror-gapcursor + .node-imageUpload:is(.courier-dark *),
442
+ .ProseMirror .ProseMirror-gapcursor + .node-blockquote:is(.courier-dark *) {
446
443
  outline-color: #d4d4d4;
447
444
  }
448
- .ProseMirror .ProseMirror-gapcursor+.node-imageBlock:hover:is(.courier-dark *),
449
- .ProseMirror .ProseMirror-gapcursor+.node-imageUpload:hover:is(.courier-dark *),
450
- .ProseMirror .ProseMirror-gapcursor+.node-blockquote:hover:is(.courier-dark *) {
445
+ .ProseMirror .ProseMirror-gapcursor + .node-imageBlock:hover:is(.courier-dark *),
446
+ .ProseMirror .ProseMirror-gapcursor + .node-imageUpload:hover:is(.courier-dark *),
447
+ .ProseMirror .ProseMirror-gapcursor + .node-blockquote:hover:is(.courier-dark *) {
451
448
  outline-color: #a3a3a3;
452
449
  }
453
450
  *, ::before, ::after {
@@ -1626,9 +1623,6 @@ body {
1626
1623
  .courier-rounded-sm {
1627
1624
  border-radius: calc(var(--radius) - 4px);
1628
1625
  }
1629
- .courier-rounded-xl {
1630
- border-radius: 0.75rem;
1631
- }
1632
1626
  .courier-rounded-b-none {
1633
1627
  border-bottom-right-radius: 0px;
1634
1628
  border-bottom-left-radius: 0px;
@@ -2193,6 +2187,9 @@ body {
2193
2187
  .courier-leading-relaxed {
2194
2188
  line-height: 1.625;
2195
2189
  }
2190
+ .courier-leading-tight {
2191
+ line-height: 1.25;
2192
+ }
2196
2193
  .courier-tracking-\[0\.64px\] {
2197
2194
  letter-spacing: 0.64px;
2198
2195
  }
@@ -2711,6 +2708,10 @@ body {
2711
2708
  .courier-sms-editor .ProseMirror > .react-renderer .draggable-item > div {
2712
2709
  padding-left: 0px;
2713
2710
  }
2711
+ .courier-sms-editor .ProseMirror > .react-renderer.node-paragraph p {
2712
+ overflow-wrap: break-word;
2713
+ word-break: break-word;
2714
+ }
2714
2715
  .courier-sms-editor .ProseMirror > .react-renderer.node-paragraph .selected-element .node-element::before {
2715
2716
  display: none;
2716
2717
  }
@@ -45,8 +45,13 @@ export interface IsElementalTextNode extends IsElementalNode {
45
45
  background_color?: string;
46
46
  format?: "markdown";
47
47
  padding?: string;
48
- color?: string;
49
- border?: BorderConfig;
48
+ border_color?: string;
49
+ border_size?: string;
50
+ /**
51
+ * @deprecated Legacy nested border format. Use flat `border_color` and `border_size` instead.
52
+ * Kept for backward compatibility when reading old templates.
53
+ */
54
+ border?: IBorderConfig;
50
55
  locales?: ElementalLocales<{
51
56
  content?: string;
52
57
  }>;
@@ -113,7 +118,16 @@ export interface ElementalImageNode extends IsElementalNode {
113
118
  href?: string;
114
119
  align?: Align;
115
120
  alt_text?: string;
121
+ /** Width in pixels (e.g., "50px") - MJML only supports pixel values */
116
122
  width?: string;
123
+ /** Natural width of the image in pixels - used to convert between percentage (UI) and pixels (storage) */
124
+ image_natural_width?: number;
125
+ border_color?: string;
126
+ border_size?: string;
127
+ /**
128
+ * @deprecated Legacy nested border format. Use flat `border_color` and `border_size` instead.
129
+ * Kept for backward compatibility when reading old templates.
130
+ */
117
131
  border?: IBorderConfig;
118
132
  locales?: ElementalLocales<{
119
133
  href?: string;
@@ -128,10 +142,22 @@ export interface ElementalActionNode extends IsElementalNode {
128
142
  style?: IActionButtonStyle;
129
143
  align?: Align;
130
144
  background_color?: string;
131
- color?: string;
132
- border?: BorderConfig;
145
+ /** Border radius in pixels */
146
+ border_radius?: string;
147
+ /** Border size in pixels (e.g., "1px") */
148
+ border_size?: string;
133
149
  padding?: string;
134
150
  disable_tracking?: boolean;
151
+ /**
152
+ * @deprecated Legacy text color. Not supported by Elemental.
153
+ * Kept for backward compatibility when reading old templates.
154
+ */
155
+ color?: string;
156
+ /**
157
+ * @deprecated Legacy nested border format. Use flat `border_radius` and `border_size` instead.
158
+ * Kept for backward compatibility when reading old templates.
159
+ */
160
+ border?: BorderConfig;
135
161
  locales?: ElementalLocales<{
136
162
  content?: string;
137
163
  href?: string;
@@ -140,6 +166,12 @@ export interface ElementalActionNode extends IsElementalNode {
140
166
  export interface ElementalDividerNode extends IsElementalNode {
141
167
  type: "divider";
142
168
  color?: string;
169
+ /** Border width in pixels (e.g., "15px") */
170
+ border_width?: string;
171
+ /**
172
+ * @deprecated Legacy width property. Use `border_width` instead.
173
+ * Kept for backward compatibility when reading old templates.
174
+ */
143
175
  width?: string;
144
176
  padding?: string;
145
177
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trycourier/react-designer",
3
- "version": "0.0.0-canary-20251202152218",
3
+ "version": "0.0.0-canary-20251205100831",
4
4
  "description": "React-based rich text designer component",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",