@squiz/formatted-text-editor 1.21.1-alpha.1 → 1.21.1-alpha.10

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 (102) hide show
  1. package/.eslintrc.json +7 -0
  2. package/demo/App.tsx +18 -4
  3. package/demo/index.scss +16 -10
  4. package/lib/EditorToolbar/FloatingToolbar.js +1 -1
  5. package/lib/EditorToolbar/Toolbar.js +3 -1
  6. package/lib/EditorToolbar/Tools/Bold/BoldButton.js +2 -2
  7. package/lib/EditorToolbar/Tools/Image/Form/ImageForm.d.ts +17 -0
  8. package/lib/EditorToolbar/Tools/Image/Form/ImageForm.js +84 -0
  9. package/lib/EditorToolbar/Tools/Image/ImageButton.d.ts +2 -0
  10. package/lib/EditorToolbar/Tools/Image/ImageButton.js +67 -0
  11. package/lib/EditorToolbar/Tools/Image/ImageModal.d.ts +8 -0
  12. package/lib/EditorToolbar/Tools/Image/ImageModal.js +19 -0
  13. package/lib/EditorToolbar/Tools/Italic/ItalicButton.js +2 -2
  14. package/lib/EditorToolbar/Tools/Link/Form/LinkForm.js +5 -5
  15. package/lib/EditorToolbar/Tools/Link/LinkButton.js +2 -2
  16. package/lib/EditorToolbar/Tools/Link/RemoveLinkButton.js +2 -2
  17. package/lib/EditorToolbar/Tools/Redo/RedoButton.js +2 -2
  18. package/lib/EditorToolbar/Tools/TextAlign/CenterAlign/CenterAlignButton.js +2 -2
  19. package/lib/EditorToolbar/Tools/TextAlign/JustifyAlign/JustifyAlignButton.js +2 -2
  20. package/lib/EditorToolbar/Tools/TextAlign/LeftAlign/LeftAlignButton.js +2 -2
  21. package/lib/EditorToolbar/Tools/TextAlign/RightAlign/RightAlignButton.js +2 -2
  22. package/lib/EditorToolbar/Tools/Underline/UnderlineButton.js +2 -2
  23. package/lib/EditorToolbar/Tools/Undo/UndoButton.js +2 -2
  24. package/lib/Extensions/Extensions.d.ts +2 -4
  25. package/lib/Extensions/Extensions.js +3 -1
  26. package/lib/Extensions/ImageExtension/ImageExtension.d.ts +3 -0
  27. package/lib/Extensions/ImageExtension/ImageExtension.js +7 -0
  28. package/lib/Extensions/LinkExtension/LinkExtension.js +6 -4
  29. package/lib/Extensions/PreformattedExtension/PreformattedExtension.d.ts +1 -1
  30. package/lib/index.css +133 -76
  31. package/lib/index.d.ts +3 -1
  32. package/lib/index.js +5 -1
  33. package/lib/ui/Button/Button.d.ts +11 -0
  34. package/lib/ui/Button/Button.js +14 -0
  35. package/lib/ui/Fields/Input/Input.d.ts +4 -0
  36. package/lib/ui/{Inputs/Text/TextInput.js → Fields/Input/Input.js} +4 -4
  37. package/lib/ui/Modal/Modal.js +1 -1
  38. package/lib/ui/ToolbarDropdown/ToolbarDropdown.js +1 -1
  39. package/lib/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.d.ts +10 -0
  40. package/lib/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.js +160 -0
  41. package/lib/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.d.ts +9 -0
  42. package/lib/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.js +105 -0
  43. package/lib/utils/converters/validNodeTypes.d.ts +2 -0
  44. package/lib/utils/converters/validNodeTypes.js +21 -0
  45. package/package.json +6 -3
  46. package/src/Editor/_editor.scss +2 -49
  47. package/src/EditorToolbar/FloatingToolbar.tsx +1 -1
  48. package/src/EditorToolbar/Toolbar.tsx +2 -0
  49. package/src/EditorToolbar/Tools/Bold/BoldButton.spec.tsx +1 -1
  50. package/src/EditorToolbar/Tools/Bold/BoldButton.tsx +2 -2
  51. package/src/EditorToolbar/Tools/Image/Form/ImageForm.spec.tsx +23 -0
  52. package/src/EditorToolbar/Tools/Image/Form/ImageForm.tsx +92 -0
  53. package/src/EditorToolbar/Tools/Image/ImageButton.spec.tsx +79 -0
  54. package/src/EditorToolbar/Tools/Image/ImageButton.tsx +57 -0
  55. package/src/EditorToolbar/Tools/Image/ImageModal.spec.tsx +83 -0
  56. package/src/EditorToolbar/Tools/Image/ImageModal.tsx +29 -0
  57. package/src/EditorToolbar/Tools/Italic/ItalicButton.spec.tsx +1 -1
  58. package/src/EditorToolbar/Tools/Italic/ItalicButton.tsx +2 -2
  59. package/src/EditorToolbar/Tools/Link/Form/LinkForm.tsx +5 -5
  60. package/src/EditorToolbar/Tools/Link/LinkButton.tsx +2 -2
  61. package/src/EditorToolbar/Tools/Link/RemoveLinkButton.tsx +2 -2
  62. package/src/EditorToolbar/Tools/Redo/RedoButton.tsx +2 -2
  63. package/src/EditorToolbar/Tools/TextAlign/CenterAlign/CenterAlignButton.tsx +2 -2
  64. package/src/EditorToolbar/Tools/TextAlign/JustifyAlign/JustifyAlignButton.tsx +2 -2
  65. package/src/EditorToolbar/Tools/TextAlign/LeftAlign/LeftAlignButton.tsx +2 -2
  66. package/src/EditorToolbar/Tools/TextAlign/RightAlign/RightAlignButton.tsx +2 -2
  67. package/src/EditorToolbar/Tools/Underline/Underline.spec.tsx +1 -1
  68. package/src/EditorToolbar/Tools/Underline/UnderlineButton.tsx +2 -2
  69. package/src/EditorToolbar/Tools/Undo/UndoButton.tsx +2 -2
  70. package/src/EditorToolbar/_floating-toolbar.scss +6 -0
  71. package/src/EditorToolbar/_toolbar.scss +8 -2
  72. package/src/Extensions/Extensions.ts +5 -2
  73. package/src/Extensions/ImageExtension/ImageExtension.ts +3 -0
  74. package/src/Extensions/LinkExtension/LinkExtension.ts +8 -5
  75. package/src/index.scss +2 -2
  76. package/src/index.ts +3 -1
  77. package/src/ui/Button/Button.spec.tsx +44 -0
  78. package/src/ui/Button/Button.tsx +31 -0
  79. package/src/ui/{_buttons.scss → Button/_button.scss} +19 -1
  80. package/src/ui/{Inputs/Text/TextInput.spec.tsx → Fields/Input/Input.spec.tsx} +8 -8
  81. package/src/ui/{Inputs/Text/TextInput.tsx → Fields/Input/Input.tsx} +4 -4
  82. package/src/ui/Modal/Modal.tsx +1 -0
  83. package/src/ui/ToolbarDropdown/ToolbarDropdown.spec.tsx +4 -2
  84. package/src/ui/ToolbarDropdown/ToolbarDropdown.tsx +1 -1
  85. package/src/ui/_typography.scss +46 -0
  86. package/src/utils/converters/mocks/squizNodeJson.mock.ts +75 -0
  87. package/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.spec.ts +445 -0
  88. package/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.ts +191 -0
  89. package/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.spec.ts +307 -0
  90. package/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.ts +123 -0
  91. package/src/utils/converters/validNodeTypes.spec.ts +33 -0
  92. package/src/utils/converters/validNodeTypes.ts +21 -0
  93. package/tests/renderWithEditor.tsx +2 -2
  94. package/lib/ui/Inputs/Text/TextInput.d.ts +0 -4
  95. package/lib/ui/ToolbarButton/ToolbarButton.d.ts +0 -10
  96. package/lib/ui/ToolbarButton/ToolbarButton.js +0 -10
  97. package/src/ui/ToolbarButton/ToolbarButton.tsx +0 -26
  98. package/src/ui/ToolbarButton/_toolbar-button.scss +0 -17
  99. /package/lib/ui/{Inputs → Fields}/Select/Select.d.ts +0 -0
  100. /package/lib/ui/{Inputs → Fields}/Select/Select.js +0 -0
  101. /package/src/ui/{Inputs → Fields}/Select/Select.spec.tsx +0 -0
  102. /package/src/ui/{Inputs → Fields}/Select/Select.tsx +0 -0
@@ -1,7 +1,7 @@
1
1
  import { ApplySchemaAttributes, CommandFunction, NodeExtension, NodeExtensionSpec, NodeSpecOverride } from '@remirror/core';
2
2
  export declare class PreformattedExtension extends NodeExtension {
3
3
  get name(): "preformatted";
4
- createTags(): ("formattingNode" | "block" | "textBlock")[];
4
+ createTags(): ("block" | "formattingNode" | "textBlock")[];
5
5
  createNodeSpec(extra: ApplySchemaAttributes, override: NodeSpecOverride): NodeExtensionSpec;
6
6
  /**
7
7
  * Toggle the <pre> for the current block.
package/lib/index.css CHANGED
@@ -376,6 +376,10 @@
376
376
  .squiz-fte-scope .z-40 {
377
377
  z-index: 40 !important;
378
378
  }
379
+ .squiz-fte-scope .mx-1 {
380
+ margin-left: 0.25rem !important;
381
+ margin-right: 0.25rem !important;
382
+ }
379
383
  .squiz-fte-scope .mx-auto {
380
384
  margin-left: auto !important;
381
385
  margin-right: auto !important;
@@ -437,6 +441,12 @@
437
441
  -moz-user-select: none !important;
438
442
  user-select: none !important;
439
443
  }
444
+ .squiz-fte-scope .flex-row {
445
+ flex-direction: row !important;
446
+ }
447
+ .squiz-fte-scope .items-end {
448
+ align-items: flex-end !important;
449
+ }
440
450
  .squiz-fte-scope .items-center {
441
451
  align-items: center !important;
442
452
  }
@@ -566,6 +576,50 @@
566
576
  --tw-blur: blur(8px) !important;
567
577
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) !important;
568
578
  }
579
+ .squiz-fte-scope .filter {
580
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) !important;
581
+ }
582
+ .squiz-fte-scope a {
583
+ --tw-text-opacity: 1;
584
+ color: rgb(7 116 210 / var(--tw-text-opacity));
585
+ text-decoration: underline;
586
+ }
587
+ .squiz-fte-scope h1 {
588
+ font-size: 1.625rem;
589
+ font-weight: 600;
590
+ letter-spacing: -0.2px;
591
+ line-height: 2rem;
592
+ }
593
+ .squiz-fte-scope h2 {
594
+ font-size: 1.25rem;
595
+ font-weight: 600;
596
+ letter-spacing: -0.5px;
597
+ line-height: 1.5rem;
598
+ }
599
+ .squiz-fte-scope h3 {
600
+ font-size: 1.125rem;
601
+ font-weight: 600;
602
+ letter-spacing: -0.2px;
603
+ line-height: 1.375rem;
604
+ }
605
+ .squiz-fte-scope h4 {
606
+ font-size: 1rem;
607
+ font-weight: 700;
608
+ letter-spacing: -0.2px;
609
+ line-height: 1.25rem;
610
+ }
611
+ .squiz-fte-scope h5 {
612
+ font-size: 1rem;
613
+ font-weight: 600;
614
+ letter-spacing: -0.2px;
615
+ line-height: 1.25rem;
616
+ }
617
+ .squiz-fte-scope h6 {
618
+ font-size: 0.875rem;
619
+ font-weight: 600;
620
+ letter-spacing: -0.2px;
621
+ line-height: 1.25rem;
622
+ }
569
623
  .squiz-fte-scope .squiz-fte-form-group {
570
624
  display: flex;
571
625
  flex-direction: column;
@@ -611,29 +665,6 @@
611
665
  .squiz-fte-scope .squiz-fte-form-control:active {
612
666
  box-shadow: none;
613
667
  }
614
- .squiz-fte-scope .squiz-fte-btn {
615
- border-radius: 4px;
616
- font-weight: 400;
617
- transition-property: all;
618
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
619
- transition-duration: 150ms;
620
- transition-timing-function: linear;
621
- display: flex;
622
- align-items: center;
623
- text-align: center;
624
- white-space: nowrap;
625
- vertical-align: middle;
626
- touch-action: manipulation;
627
- cursor: pointer;
628
- background-image: none;
629
- border: 1px solid transparent;
630
- padding: 6px 12px;
631
- }
632
- .squiz-fte-scope .squiz-fte-btn.disabled,
633
- .squiz-fte-scope .squiz-fte-btn[disabled] {
634
- cursor: not-allowed;
635
- opacity: 0.5;
636
- }
637
668
  .squiz-fte-scope .formatted-text-editor {
638
669
  font-family: "Open Sans" !important;
639
670
  }
@@ -649,7 +680,7 @@
649
680
  .squiz-fte-scope .formatted-text-editor .remirror-editor-wrapper {
650
681
  padding-top: 0px;
651
682
  --tw-text-opacity: 1;
652
- color: rgb(112 112 112 / var(--tw-text-opacity));
683
+ color: rgb(61 61 61 / var(--tw-text-opacity));
653
684
  }
654
685
  .squiz-fte-scope .formatted-text-editor .remirror-editor {
655
686
  border-bottom-right-radius: 4px;
@@ -663,7 +694,7 @@
663
694
  var(--tw-ring-offset-shadow, 0 0 #0000),
664
695
  var(--tw-ring-shadow, 0 0 #0000),
665
696
  var(--tw-shadow);
666
- min-height: 6rem;
697
+ overflow: auto;
667
698
  }
668
699
  .squiz-fte-scope .formatted-text-editor .remirror-editor:active,
669
700
  .squiz-fte-scope .formatted-text-editor .remirror-editor:focus {
@@ -681,48 +712,7 @@
681
712
  --tw-text-opacity: 1;
682
713
  color: rgb(148 148 148 / var(--tw-text-opacity));
683
714
  }
684
- .squiz-fte-scope a {
685
- --tw-text-opacity: 1;
686
- color: rgb(7 116 210 / var(--tw-text-opacity));
687
- text-decoration: underline;
688
- }
689
- .squiz-fte-scope .remirror-theme h1 {
690
- font-size: 1.625rem;
691
- font-weight: 600;
692
- letter-spacing: -0.2px;
693
- line-height: 2rem;
694
- }
695
- .squiz-fte-scope .remirror-theme h2 {
696
- font-size: 1.25rem;
697
- font-weight: 600;
698
- letter-spacing: -0.5px;
699
- line-height: 1.5rem;
700
- }
701
- .squiz-fte-scope .remirror-theme h3 {
702
- font-size: 1.125rem;
703
- font-weight: 600;
704
- letter-spacing: -0.2px;
705
- line-height: 1.375rem;
706
- }
707
- .squiz-fte-scope .remirror-theme h4 {
708
- font-size: 1rem;
709
- font-weight: 700;
710
- letter-spacing: -0.2px;
711
- line-height: 1.25rem;
712
- }
713
- .squiz-fte-scope .remirror-theme h5 {
714
- font-size: 1rem;
715
- font-weight: 600;
716
- letter-spacing: -0.2px;
717
- line-height: 1.25rem;
718
- }
719
- .squiz-fte-scope .remirror-theme h6 {
720
- font-size: 0.875rem;
721
- font-weight: 600;
722
- letter-spacing: -0.2px;
723
- line-height: 1.25rem;
724
- }
725
- .squiz-fte-scope .formatted-text-editor .editor-toolbar {
715
+ .squiz-fte-scope .editor-toolbar {
726
716
  border-bottom-width: 2px;
727
717
  border-style: solid;
728
718
  --tw-border-opacity: 1;
@@ -733,10 +723,10 @@
733
723
  display: flex;
734
724
  justify-items: center;
735
725
  }
736
- .squiz-fte-scope .formatted-text-editor .editor-toolbar > *:not(:first-child) {
726
+ .squiz-fte-scope .editor-toolbar > *:not(:first-child, .editor-divider) {
737
727
  margin: 0 0 0 2px;
738
728
  }
739
- .squiz-fte-scope .formatted-text-editor .editor-toolbar .editor-divider {
729
+ .squiz-fte-scope .editor-toolbar .editor-divider {
740
730
  margin-top: -0.25rem;
741
731
  margin-bottom: -0.25rem;
742
732
  margin-left: 0.25rem;
@@ -745,6 +735,12 @@
745
735
  margin-right: 2px;
746
736
  height: auto;
747
737
  }
738
+ .squiz-fte-scope .editor-toolbar .squiz-fte-btn {
739
+ padding: 0.25rem;
740
+ }
741
+ .squiz-fte-scope .editor-toolbar .squiz-fte-btn ~ .squiz-fte-btn {
742
+ margin-left: 2px;
743
+ }
748
744
  .squiz-fte-scope__floating-popover {
749
745
  display: flex;
750
746
  border-radius: 6px;
@@ -761,22 +757,51 @@
761
757
  var(--tw-ring-shadow, 0 0 #0000),
762
758
  var(--tw-shadow);
763
759
  }
764
- .squiz-fte-scope .toolbar-button {
760
+ .squiz-fte-scope .squiz-fte-scope__floating-popover .squiz-fte-btn {
761
+ padding: 0.25rem;
762
+ }
763
+ .squiz-fte-scope .squiz-fte-scope__floating-popover .squiz-fte-btn ~ .squiz-fte-btn {
764
+ margin-left: 2px;
765
+ }
766
+ .squiz-fte-scope .squiz-fte-btn {
767
+ border-radius: 4px;
765
768
  --tw-bg-opacity: 1;
766
769
  background-color: rgb(255 255 255 / var(--tw-bg-opacity));
767
- padding: 0.25rem;
770
+ font-weight: 400;
768
771
  --tw-text-opacity: 1;
769
772
  color: rgb(112 112 112 / var(--tw-text-opacity));
773
+ transition-property: all;
774
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
775
+ transition-duration: 150ms;
776
+ transition-timing-function: linear;
777
+ display: flex;
778
+ align-items: center;
779
+ text-align: center;
780
+ white-space: nowrap;
781
+ vertical-align: middle;
782
+ touch-action: manipulation;
783
+ cursor: pointer;
784
+ background-image: none;
785
+ border: 1px solid transparent;
786
+ padding: 6px 12px;
787
+ }
788
+ .squiz-fte-scope .squiz-fte-btn--is-icon {
789
+ padding: 6px;
770
790
  }
771
- .squiz-fte-scope .toolbar-button ~ .toolbar-button {
791
+ .squiz-fte-scope .squiz-fte-btn ~ .squiz-fte-btn {
772
792
  margin-left: 2px;
773
793
  }
774
- .squiz-fte-scope .toolbar-button:hover,
775
- .squiz-fte-scope .toolbar-button:focus {
794
+ .squiz-fte-scope .squiz-fte-btn.disabled,
795
+ .squiz-fte-scope .squiz-fte-btn[disabled] {
796
+ cursor: not-allowed;
797
+ opacity: 0.5;
798
+ }
799
+ .squiz-fte-scope .squiz-fte-btn:hover,
800
+ .squiz-fte-scope .squiz-fte-btn:focus {
776
801
  background-color: rgba(0, 0, 0, 0.04);
777
802
  }
778
- .squiz-fte-scope .toolbar-button.is-active,
779
- .squiz-fte-scope .toolbar-button:active {
803
+ .squiz-fte-scope .squiz-fte-btn--is-active,
804
+ .squiz-fte-scope .squiz-fte-btn:active {
780
805
  --tw-bg-opacity: 1;
781
806
  background-color: rgb(230 241 250 / var(--tw-bg-opacity));
782
807
  --tw-text-opacity: 1;
@@ -899,8 +924,27 @@
899
924
  }
900
925
  .squiz-fte-scope .squiz-fte-modal-footer__button {
901
926
  font-size: 0.875rem;
927
+ font-weight: 700;
928
+ }
929
+ .squiz-fte-scope .editor-toolbar .squiz-fte-modal-footer__button {
930
+ padding: 0.25rem;
931
+ }
932
+ .squiz-fte-scope .editor-toolbar .squiz-fte-modal-footer__button ~ .squiz-fte-btn {
933
+ margin-left: 2px;
934
+ }
935
+ .squiz-fte-scope .squiz-fte-scope__floating-popover .squiz-fte-modal-footer__button {
936
+ padding: 0.25rem;
937
+ }
938
+ .squiz-fte-scope .squiz-fte-scope__floating-popover .squiz-fte-modal-footer__button ~ .squiz-fte-btn {
939
+ margin-left: 2px;
940
+ }
941
+ .squiz-fte-scope .squiz-fte-modal-footer__button {
902
942
  border-radius: 4px;
943
+ --tw-bg-opacity: 1;
944
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
903
945
  font-weight: 400;
946
+ --tw-text-opacity: 1;
947
+ color: rgb(112 112 112 / var(--tw-text-opacity));
904
948
  transition-property: all;
905
949
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
906
950
  transition-duration: 150ms;
@@ -916,11 +960,24 @@
916
960
  border: 1px solid transparent;
917
961
  padding: 6px 12px;
918
962
  }
963
+ .squiz-fte-scope .squiz-fte-modal-footer__button ~ .squiz-fte-btn {
964
+ margin-left: 2px;
965
+ }
919
966
  .squiz-fte-scope .squiz-fte-modal-footer__button.disabled,
920
967
  .squiz-fte-scope .squiz-fte-modal-footer__button[disabled] {
921
968
  cursor: not-allowed;
922
969
  opacity: 0.5;
923
970
  }
971
+ .squiz-fte-scope .squiz-fte-modal-footer__button:hover,
972
+ .squiz-fte-scope .squiz-fte-modal-footer__button:focus {
973
+ background-color: rgba(0, 0, 0, 0.04);
974
+ }
975
+ .squiz-fte-scope .squiz-fte-modal-footer__button:active {
976
+ --tw-bg-opacity: 1;
977
+ background-color: rgb(230 241 250 / var(--tw-bg-opacity));
978
+ --tw-text-opacity: 1;
979
+ color: rgb(7 116 210 / var(--tw-text-opacity));
980
+ }
924
981
  .squiz-fte-scope .hover\:bg-blue-400:hover {
925
982
  --tw-bg-opacity: 1 !important;
926
983
  background-color: rgb(4 73 133 / var(--tw-bg-opacity)) !important;
package/lib/index.d.ts CHANGED
@@ -1,2 +1,4 @@
1
1
  import FormattedTextEditor from './FormattedTextEditor';
2
- export { FormattedTextEditor };
2
+ import { remirrorNodeToSquizNode } from './utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode';
3
+ import { squizNodeToRemirrorNode } from './utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode';
4
+ export { FormattedTextEditor, remirrorNodeToSquizNode, squizNodeToRemirrorNode };
package/lib/index.js CHANGED
@@ -3,6 +3,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.FormattedTextEditor = void 0;
6
+ exports.squizNodeToRemirrorNode = exports.remirrorNodeToSquizNode = exports.FormattedTextEditor = void 0;
7
7
  const FormattedTextEditor_1 = __importDefault(require("./FormattedTextEditor"));
8
8
  exports.FormattedTextEditor = FormattedTextEditor_1.default;
9
+ const remirrorNodeToSquizNode_1 = require("./utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode");
10
+ Object.defineProperty(exports, "remirrorNodeToSquizNode", { enumerable: true, get: function () { return remirrorNodeToSquizNode_1.remirrorNodeToSquizNode; } });
11
+ const squizNodeToRemirrorNode_1 = require("./utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode");
12
+ Object.defineProperty(exports, "squizNodeToRemirrorNode", { enumerable: true, get: function () { return squizNodeToRemirrorNode_1.squizNodeToRemirrorNode; } });
@@ -0,0 +1,11 @@
1
+ import { ReactElement } from 'react';
2
+ type ButtonProps = {
3
+ handleOnClick: () => void;
4
+ isDisabled?: boolean;
5
+ isActive: boolean;
6
+ label: string;
7
+ text?: string;
8
+ icon?: ReactElement;
9
+ };
10
+ declare const Button: ({ handleOnClick, isDisabled, isActive, label, text, icon }: ButtonProps) => JSX.Element;
11
+ export default Button;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const clsx_1 = __importDefault(require("clsx"));
8
+ const Button = ({ handleOnClick, isDisabled, isActive, label, text, icon }) => {
9
+ return (react_1.default.createElement("button", { "aria-label": label, title: label, type: "button", onClick: handleOnClick, disabled: isDisabled, className: (0, clsx_1.default)('squiz-fte-btn', isActive && 'squiz-fte-btn--is-active', icon && ' squiz-fte-btn--is-icon') },
10
+ react_1.default.createElement(react_1.default.Fragment, null,
11
+ text && react_1.default.createElement("span", null, text),
12
+ icon && icon)));
13
+ };
14
+ exports.default = Button;
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare const Input: React.ForwardRefExoticComponent<React.InputHTMLAttributes<HTMLInputElement> & {
3
+ label?: string | undefined;
4
+ } & React.RefAttributes<HTMLInputElement>>;
@@ -23,11 +23,11 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.TextInput = void 0;
26
+ exports.Input = void 0;
27
27
  const react_1 = __importStar(require("react"));
28
- const TextInputInternal = ({ name, label, ...rest }, ref) => {
28
+ const InputInternal = ({ name, label, type = 'text', ...rest }, ref) => {
29
29
  return (react_1.default.createElement(react_1.default.Fragment, null,
30
30
  label && (react_1.default.createElement("label", { htmlFor: name, className: "squiz-fte-form-label" }, label)),
31
- react_1.default.createElement("input", { ref: ref, id: name, name: name, type: "text", className: "squiz-fte-form-control", ...rest })));
31
+ react_1.default.createElement("input", { ref: ref, id: name, name: name, type: type, className: "squiz-fte-form-control", ...rest })));
32
32
  };
33
- exports.TextInput = (0, react_1.forwardRef)(TextInputInternal);
33
+ exports.Input = (0, react_1.forwardRef)(InputInternal);
@@ -65,7 +65,7 @@ const Modal = ({ children, title, onCancel, onSubmit, className }, ref) => {
65
65
  react_1.default.createElement("div", { className: "squiz-fte-modal" },
66
66
  react_1.default.createElement("div", { className: "squiz-fte-modal-header p-6 pb-2" },
67
67
  react_1.default.createElement("h2", { className: "font-semibold text-gray-900 text-heading-2" }, title),
68
- react_1.default.createElement("button", { className: "ml-auto -mr-3 -mt-3 bg-transparent border-0 text-gray-600 font-semibold outline-none focus:outline-none hover:text-color-gray-800", onClick: onCancel, "aria-label": "Close" },
68
+ react_1.default.createElement("button", { type: "button", className: "ml-auto -mr-3 -mt-3 bg-transparent border-0 text-gray-600 font-semibold outline-none focus:outline-none hover:text-color-gray-800", onClick: onCancel, "aria-label": "Close" },
69
69
  react_1.default.createElement(CloseRounded_1.default, null))),
70
70
  react_1.default.createElement("div", { className: "squiz-fte-modal-content" }, children),
71
71
  react_1.default.createElement("div", { className: "squiz-fte-modal-footer p-6 pt-3" },
@@ -39,7 +39,7 @@ const ToolbarDropdown = ({ children, label }) => {
39
39
  }
40
40
  };
41
41
  return (react_1.default.createElement("div", { className: "toolbar-dropdown", onBlur: handleBlur },
42
- react_1.default.createElement("button", { id: "dropdownHoverButton", className: "toolbar-dropdown__button", onClick: handleDropDown },
42
+ react_1.default.createElement("button", { id: "dropdownHoverButton", className: "toolbar-dropdown__button", type: "button", onClick: handleDropDown },
43
43
  react_1.default.createElement("span", { className: "toolbar-dropdown__label" }, label),
44
44
  react_1.default.createElement(ExpandMore_1.default, { className: "toolbar-dropdown__icon", "aria-hidden": "true" })),
45
45
  react_1.default.createElement("div", { id: "dropdown", className: `toolbar-dropdown__menu z-10 ${isOpen ? 'block' : 'hidden'} bg-white divide-y w-169` },
@@ -0,0 +1,10 @@
1
+ import { ProsemirrorNode } from 'remirror';
2
+ import { FORMATTED_TEXT_MODELS as FormattedTextModels } from '@squiz/dx-json-schema-lib';
3
+ export declare const resolveNodeTag: (node: ProsemirrorNode) => string | null;
4
+ /**
5
+ * Converts Remirror node JSON structure to Squiz component JSON structure.
6
+ * @param {ProsemirrorNode} node Remirror node to convert to component.
7
+ * @export
8
+ * @returns {FormattedText} The converted Squiz component JSON.
9
+ */
10
+ export declare const remirrorNodeToSquizNode: (node: ProsemirrorNode) => FormattedTextModels.v1.FormattedText;
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.remirrorNodeToSquizNode = exports.resolveNodeTag = void 0;
4
+ const validNodeTypes_1 = require("../validNodeTypes");
5
+ const resolveNodeTag = (node) => {
6
+ if (node.type.spec?.toDOM) {
7
+ const domNode = node.type.spec.toDOM(node);
8
+ if (domNode instanceof window.Node) {
9
+ return domNode.nodeName.toLowerCase();
10
+ }
11
+ if (domNode?.dom instanceof window.Node) {
12
+ return domNode.dom.nodeName.toLowerCase();
13
+ }
14
+ if (domNode instanceof Array) {
15
+ // [ tag, attributes, ...children ]
16
+ return domNode[0].toLowerCase();
17
+ }
18
+ }
19
+ return null;
20
+ };
21
+ exports.resolveNodeTag = resolveNodeTag;
22
+ const resolveFormattingOptions = (node) => {
23
+ const formattingOptions = {};
24
+ if (node.attrs.nodeTextAlignment) {
25
+ formattingOptions.alignment = node.attrs.nodeTextAlignment;
26
+ }
27
+ return formattingOptions;
28
+ };
29
+ const resolveFontOptions = (node) => {
30
+ const fontOptions = {};
31
+ node.marks.forEach((mark) => {
32
+ switch (mark.type.name) {
33
+ case 'bold':
34
+ fontOptions.bold = true;
35
+ break;
36
+ case 'italic':
37
+ fontOptions.italics = true;
38
+ break;
39
+ case 'underline':
40
+ fontOptions.underline = true;
41
+ break;
42
+ default:
43
+ // Currently unsupported mark type
44
+ break;
45
+ }
46
+ });
47
+ return fontOptions;
48
+ };
49
+ const resolveAttributeOptions = (node, nodeType) => {
50
+ let attributeOptions = {};
51
+ if (nodeType === 'image') {
52
+ attributeOptions = { ...node.attrs };
53
+ }
54
+ else {
55
+ node.marks.forEach((mark) => {
56
+ switch (mark.type.name) {
57
+ case 'link':
58
+ attributeOptions = { ...mark.attrs };
59
+ break;
60
+ default:
61
+ // Currently unsupported mark type
62
+ break;
63
+ }
64
+ });
65
+ }
66
+ // Remove any non string elements from attributes, squiz component only accepts strings.
67
+ Object.keys(attributeOptions).forEach((key) => {
68
+ if (typeof attributeOptions[key] !== 'string' && typeof attributeOptions[key] !== 'number') {
69
+ delete attributeOptions[key];
70
+ // If it's a number we make it a string so its accepted by component service
71
+ }
72
+ else {
73
+ attributeOptions[key] = String(attributeOptions[key]);
74
+ }
75
+ });
76
+ return attributeOptions;
77
+ };
78
+ /**
79
+ * Converts Remirror node JSON structure to Squiz component JSON structure.
80
+ * @param {ProsemirrorNode} node Remirror node to convert to component.
81
+ * @export
82
+ * @returns {FormattedText} The converted Squiz component JSON.
83
+ */
84
+ const remirrorNodeToSquizNode = (node) => {
85
+ if (!(0, validNodeTypes_1.validRemirrorNode)(node))
86
+ return [];
87
+ const nodeType = node.type.name;
88
+ let nodeTag = (0, exports.resolveNodeTag)(node);
89
+ // Filter out any children nodes that aren't currently supported.
90
+ const children = (node.content.content || []).map((child) => (0, exports.remirrorNodeToSquizNode)(child));
91
+ let transformed = {
92
+ children,
93
+ formattingOptions: resolveFormattingOptions(node),
94
+ attributes: resolveAttributeOptions(node, nodeType),
95
+ font: resolveFontOptions(node),
96
+ };
97
+ if (nodeType === 'doc') {
98
+ return transformed.children;
99
+ }
100
+ // If we don't have a node tag yet, check if there is one needed
101
+ if (!nodeTag) {
102
+ node.marks.forEach((mark) => {
103
+ switch (mark.type.name) {
104
+ case 'link':
105
+ nodeTag = 'a';
106
+ break;
107
+ default:
108
+ // Currently unsupported mark type
109
+ break;
110
+ }
111
+ });
112
+ }
113
+ if (nodeTag) {
114
+ transformed = {
115
+ ...transformed,
116
+ type: 'tag',
117
+ tag: nodeTag,
118
+ };
119
+ }
120
+ if ((Object.keys(transformed.font).length > 0 || Object.keys(transformed.attributes).length > 0) &&
121
+ !transformed.type) {
122
+ // Wrap in span so we can apply formatting to it
123
+ transformed = { ...transformed, tag: 'span', type: 'tag' };
124
+ }
125
+ if (nodeType === 'text') {
126
+ if (transformed.type) {
127
+ // If we have a tag already nest the text beneath it so we can preserve formatting options, etc.
128
+ transformed = {
129
+ ...transformed,
130
+ children: [
131
+ {
132
+ type: 'text',
133
+ value: node.text,
134
+ },
135
+ ],
136
+ };
137
+ }
138
+ else {
139
+ // If we don't have a tag just rewrite the transformed value to be the text.
140
+ transformed = {
141
+ type: 'text',
142
+ value: node.text,
143
+ };
144
+ }
145
+ }
146
+ // Remove empty formatting options from transformed object.
147
+ if (transformed.formattingOptions && Object.keys(transformed.formattingOptions).length === 0) {
148
+ delete transformed.formattingOptions;
149
+ }
150
+ // Remove empty font options from transformed object.
151
+ if (transformed.font && Object.keys(transformed.font).length === 0) {
152
+ delete transformed.font;
153
+ }
154
+ // Remove empty attributes options from transformed object.
155
+ if (transformed.attributes && Object.keys(transformed.attributes).length === 0) {
156
+ delete transformed.attributes;
157
+ }
158
+ return transformed;
159
+ };
160
+ exports.remirrorNodeToSquizNode = remirrorNodeToSquizNode;
@@ -0,0 +1,9 @@
1
+ import { RemirrorJSON } from '@remirror/core';
2
+ import { FORMATTED_TEXT_MODELS as FormattedTextModels } from '@squiz/dx-json-schema-lib';
3
+ /**
4
+ * Converts Squiz component JSON structure to Remirror node JSON structure.
5
+ * @param {FormattedText} nodes Squiz nodes to convert to Remirror.
6
+ * @export
7
+ * @returns {RemirrorJSON} The converted Remirror JSON.
8
+ */
9
+ export declare const squizNodeToRemirrorNode: (nodes: FormattedTextModels.v1.FormattedText) => RemirrorJSON;