@designcrowd/library.brand-page 5.12.8 → 5.12.10-shape-1

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 (34) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-CMdOb_u_.js → CreatedOnBrandCrowd-de-de-B1UmWzii.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-BP1ZZR89.js → CreatedOnBrandCrowd-en-us-BRK1hM-D.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-dQ5Xb_xX.js → CreatedOnBrandCrowd-es-es-CN_2N7lq.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-Bfx1tpC3.js → CreatedOnBrandCrowd-fr-fr-BLLKZAU4.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-pt-pt-BQg2zn8K.js → CreatedOnBrandCrowd-pt-pt-Btsu98RA.js} +1 -1
  6. package/lib/src/{CreatedOnDcom-de-de-B2cv6BwQ.js → CreatedOnDcom-de-de-t1layjdN.js} +1 -1
  7. package/lib/src/{CreatedOnDcom-en-us-CYt5rPlz.js → CreatedOnDcom-en-us-Cgr8OWqD.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-es-es-DtJ-6-Wv.js → CreatedOnDcom-es-es-BU30p1A3.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-fr-fr-CuzsQXTy.js → CreatedOnDcom-fr-fr-0WKXggE1.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-pt-pt-Bh7goB5_.js → CreatedOnDcom-pt-pt-DugorNKz.js} +1 -1
  11. package/lib/src/brand-page/components/background-shape/BackgroundShape.mixin.d.ts +3 -1
  12. package/lib/src/brand-page/components/background-shape/BackgroundShape.mixin.js +49 -8
  13. package/lib/src/brand-page/components/media/Shape.mixin.d.ts +3 -2
  14. package/lib/src/brand-page/components/media/Shape.mixin.js +44 -11
  15. package/lib/src/brand-page/utils/svg.util.d.ts +1 -0
  16. package/lib/src/brand-page/utils/svg.util.js +3 -0
  17. package/lib/src/brand-page-maker/utils/url.util.js +1 -1
  18. package/lib/src/css/library.brand-page-brandCrowd.min.css +43 -40
  19. package/lib/src/css/library.brand-page-brandPage.min.css +43 -40
  20. package/lib/src/css/library.brand-page-designCom.min.css +43 -40
  21. package/lib/src/css/library.brand-page-preview.min.css +43 -40
  22. package/lib/src/index.mjs +1 -1
  23. package/lib/src/{lib-Bq-YSuEE.js → lib-CjyTfIxl.js} +11607 -11586
  24. package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.js +5 -0
  25. package/package.json +1 -1
  26. package/src/brand-page/components/background-shape/BackgroundShape.mixin.ts +64 -12
  27. package/src/brand-page/components/background-shape/BackgroundShape.vue +2 -12
  28. package/src/brand-page/components/media/Shape.mixin.ts +56 -17
  29. package/src/brand-page/components/media/Shape.vue +0 -7
  30. package/src/brand-page/utils/svg.util.ts +4 -0
  31. package/src/brand-page-maker/components/rich-text-editor/RichTextEditor.vue +7 -1
  32. package/src/brand-page-maker/utils/url.util.test.ts +6 -0
  33. package/src/brand-page-maker/utils/url.util.ts +1 -1
  34. package/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.ts +5 -0
@@ -125,6 +125,11 @@ export default defineComponent({
125
125
  CUSTOM_DOMAIN_STATUSES.active);
126
126
  },
127
127
  },
128
+ watch: {
129
+ customDomain(newCustomDomain) {
130
+ this.selectedDomain = newCustomDomain;
131
+ },
132
+ },
128
133
  methods: {
129
134
  closeModal() {
130
135
  this.$emit('on-close');
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@designcrowd/library.brand-page",
3
3
  "description": "A collection of Maker/Designer applications",
4
- "version": "5.12.8",
4
+ "version": "5.12.10-shape-1",
5
5
  "author": "Design.com Eng",
6
6
  "license": "UNLICENSED",
7
7
  "type": "module",
@@ -6,6 +6,7 @@ import axios from 'axios';
6
6
  import { applyColorToSvgString } from '../../utils/svg-color.util';
7
7
  import { isURL } from '../../../utils/validator.util';
8
8
  import { PROXY_SHAPE_URL_REGEX } from '../../../brand-page/constants';
9
+ import { getRegexToMatchAttributeInSvgTag } from '../../../brand-page/utils/svg.util';
9
10
 
10
11
  const SUPPORTED_SHAPE_HOSTS = [
11
12
  'https://bc-user-uploads.brandcrowd.com/public',
@@ -21,7 +22,7 @@ export default defineComponent({
21
22
  },
22
23
  },
23
24
  data() {
24
- return { svgData: '', originalSvgData: '' };
25
+ return { svgData: '', svgDataObjectUrl: '', originalSvgData: '' };
25
26
  },
26
27
  computed: {
27
28
  useObjectElement(): boolean {
@@ -39,15 +40,12 @@ export default defineComponent({
39
40
  );
40
41
  },
41
42
 
42
- svgAttributes(): string {
43
- const attributes: string[] = [];
44
-
45
- if (this.isFullBackground) {
46
- attributes.push('preserveAspectRatio="xMidYMid slice"');
47
- attributes.push('style="width: 100%; height: 100%;"');
43
+ objectUrl(): string {
44
+ if (!this.useObjectElement) {
45
+ return this.svgDataObjectUrl;
48
46
  }
49
47
 
50
- return attributes.join(' ');
48
+ return this.viewModel.name;
51
49
  },
52
50
  },
53
51
  watch: {
@@ -74,6 +72,49 @@ export default defineComponent({
74
72
  );
75
73
  },
76
74
 
75
+ applySvgAttributes(svgData: string): string {
76
+ const attributes: string[] = [];
77
+
78
+ if (this.isFullBackground) {
79
+ const widthRegex = getRegexToMatchAttributeInSvgTag('width');
80
+
81
+ if (svgData.match(widthRegex)) {
82
+ svgData = svgData.replace(widthRegex, `$1width="100%"`);
83
+ } else {
84
+ attributes.push(`width="100%"`);
85
+ }
86
+
87
+ const heightRegex = getRegexToMatchAttributeInSvgTag('height');
88
+
89
+ if (svgData.match(heightRegex)) {
90
+ svgData = svgData.replace(heightRegex, `$1height="100%"`);
91
+ } else {
92
+ attributes.push(`height="100%"`);
93
+ }
94
+
95
+ const preserveAspectRatioRegex = getRegexToMatchAttributeInSvgTag(
96
+ 'preserveAspectRatio',
97
+ );
98
+
99
+ if (svgData.match(preserveAspectRatioRegex)) {
100
+ svgData = svgData.replace(
101
+ preserveAspectRatioRegex,
102
+ `$1preserveAspectRatio="xMidYMid slice"`,
103
+ );
104
+ } else {
105
+ attributes.push(`preserveAspectRatio="xMidYMid slice"`);
106
+ }
107
+ }
108
+
109
+ const svgAttributes = attributes.join(' ');
110
+
111
+ if (svgAttributes) {
112
+ svgData = svgData.replace('<svg ', `<svg ${svgAttributes} `);
113
+ }
114
+
115
+ return svgData;
116
+ },
117
+
77
118
  async render() {
78
119
  if (this.useObjectElement) {
79
120
  return;
@@ -96,12 +137,23 @@ export default defineComponent({
96
137
  this.originalSvgData,
97
138
  this.viewModel.style.color,
98
139
  );
140
+ } else {
141
+ this.svgData = this.originalSvgData;
99
142
  }
100
143
 
101
- this.svgData = this.svgData.replace(
102
- '<svg ',
103
- `<svg ${this.svgAttributes} `,
104
- );
144
+ this.svgData = this.applySvgAttributes(this.svgData);
145
+
146
+ const blob = new Blob([this.svgData], { type: 'image/svg+xml' });
147
+
148
+ const oldSvgDataObjectUrl = this.svgDataObjectUrl;
149
+
150
+ // Create an Object URL
151
+ this.svgDataObjectUrl = URL.createObjectURL(blob);
152
+
153
+ if (oldSvgDataObjectUrl) {
154
+ // clean up previous Object URL
155
+ URL.revokeObjectURL(oldSvgDataObjectUrl);
156
+ }
105
157
  },
106
158
  },
107
159
  });
@@ -1,18 +1,8 @@
1
1
  <template>
2
2
  <div class="c-shape-background">
3
- <div
4
- v-if="useObjectElement"
5
- :style="backgroundShapesStyle"
6
- class="c-shape c-shape-object"
7
- >
8
- <object class="tw-w-full tw-h-full" :data="viewModel.name" />
3
+ <div :style="backgroundShapesStyle" class="c-shape c-shape-object">
4
+ <object class="tw-w-full tw-h-full" :data="objectUrl" />
9
5
  </div>
10
- <div
11
- v-else
12
- :style="backgroundShapesStyle"
13
- class="c-shape"
14
- v-html="svgData"
15
- />
16
6
  </div>
17
7
  </template>
18
8
  <script>
@@ -5,6 +5,7 @@ import ComponentCommonMixin from '../mixins/component-common.mixin';
5
5
  import axios from 'axios';
6
6
  import { applyColorReplacementsToSvgString } from '../../utils/svg-color.util';
7
7
  import { PROXY_SHAPE_URL_REGEX } from '../../../brand-page/constants';
8
+ import { getRegexToMatchAttributeInSvgTag } from '../../../brand-page/utils/svg.util';
8
9
 
9
10
  export default defineComponent({
10
11
  mixins: [ComponentCommonMixin],
@@ -34,7 +35,7 @@ export default defineComponent({
34
35
  },
35
36
  },
36
37
  data() {
37
- return { svgData: '', originalSvgData: '' };
38
+ return { svgData: '', svgDataObjectUrl: '', originalSvgData: '' };
38
39
  },
39
40
  computed: {
40
41
  useObjectElement(): boolean {
@@ -53,6 +54,10 @@ export default defineComponent({
53
54
  },
54
55
 
55
56
  objectUrl() {
57
+ if (!this.useObjectElement) {
58
+ return this.svgDataObjectUrl;
59
+ }
60
+
56
61
  let dimensionQuery = ``;
57
62
 
58
63
  if (this.size) {
@@ -63,21 +68,17 @@ export default defineComponent({
63
68
 
64
69
  return `${this.imageUrl}${dimensionQuery}`;
65
70
  },
66
-
67
- svgAttributes(): string {
68
- const attributes: string[] = [];
69
-
70
- if (this.size) {
71
- attributes.push(`height=${this.size} width=${this.size}`);
72
- }
73
-
74
- return attributes.join(' ');
75
- },
76
71
  },
77
72
  watch: {
78
73
  colorReplacements: {
79
- handler() {
80
- this.renderAsInnerHtml();
74
+ handler(newVal, oldVal) {
75
+ if (
76
+ newVal &&
77
+ oldVal &&
78
+ JSON.stringify(newVal) !== JSON.stringify(oldVal)
79
+ ) {
80
+ this.renderAsInnerHtml();
81
+ }
81
82
  },
82
83
  deep: true,
83
84
  },
@@ -120,6 +121,35 @@ export default defineComponent({
120
121
  }
121
122
  },
122
123
  methods: {
124
+ applySvgAttributes(svgData: string): string {
125
+ const attributes: string[] = [];
126
+
127
+ if (this.size) {
128
+ const widthRegex = getRegexToMatchAttributeInSvgTag('width');
129
+
130
+ if (svgData.match(widthRegex)) {
131
+ svgData = svgData.replace(widthRegex, `$1width="${this.size}"`);
132
+ } else {
133
+ attributes.push(`width="${this.size}"`);
134
+ }
135
+
136
+ const heightRegex = getRegexToMatchAttributeInSvgTag('height');
137
+
138
+ if (svgData.match(heightRegex)) {
139
+ svgData = svgData.replace(heightRegex, `$1height="${this.size}"`);
140
+ } else {
141
+ attributes.push(`height="${this.size}"`);
142
+ }
143
+ }
144
+
145
+ const svgAttributes = attributes.join(' ');
146
+
147
+ if (svgAttributes) {
148
+ svgData = svgData.replace('<svg ', `<svg ${svgAttributes} `);
149
+ }
150
+
151
+ return svgData;
152
+ },
123
153
  async renderAsInnerHtml() {
124
154
  if (!this.originalSvgData) {
125
155
  return;
@@ -130,10 +160,19 @@ export default defineComponent({
130
160
  this.colorReplacements,
131
161
  );
132
162
 
133
- this.svgData = this.svgData.replace(
134
- '<svg ',
135
- `<svg ${this.svgAttributes} `,
136
- );
163
+ this.svgData = this.applySvgAttributes(this.svgData);
164
+
165
+ const blob = new Blob([this.svgData], { type: 'image/svg+xml' });
166
+
167
+ const oldSvgDataObjectUrl = this.svgDataObjectUrl;
168
+
169
+ // Create an Object URL
170
+ this.svgDataObjectUrl = URL.createObjectURL(blob);
171
+
172
+ if (oldSvgDataObjectUrl) {
173
+ // clean up previous Object URL
174
+ URL.revokeObjectURL(oldSvgDataObjectUrl);
175
+ }
137
176
  },
138
177
  },
139
178
  });
@@ -1,18 +1,11 @@
1
1
  <template>
2
2
  <div :class="imgClasses">
3
3
  <div
4
- v-if="useObjectElement"
5
4
  class="c-shape c-shape-object"
6
5
  :class="{ 'tw-flex tw-justify-center tw-items-center': size }"
7
6
  >
8
7
  <object :style="objectStyle" :data="objectUrl" />
9
8
  </div>
10
- <div
11
- v-else
12
- class="c-shape"
13
- :class="{ 'tw-flex tw-justify-center tw-items-center': size }"
14
- v-html="svgData"
15
- />
16
9
  </div>
17
10
  </template>
18
11
  <script>
@@ -24,3 +24,7 @@ export const setSvgCssStyle = (svgData: string, cssStyle: string): string => {
24
24
  export const appendSvgIdSuffix = (svgData: string, svgIdSuffix: string) => {
25
25
  return svgData.replace(/(SVGID(?:_\d+)+)/g, `$1_${svgIdSuffix}`);
26
26
  };
27
+
28
+ export const getRegexToMatchAttributeInSvgTag = (attribute: string) => {
29
+ return new RegExp(`(<svg\\b[^>]*?)${attribute}="[^"]*"`, 'i');
30
+ };
@@ -1083,6 +1083,12 @@ const onClickHyperlink = (href?: string, text?: string) => {
1083
1083
  font-family: 'Lato' !important;
1084
1084
  }
1085
1085
 
1086
+ ::v-deep .ProseMirror a s,
1087
+ ::v-deep .ProseMirror a strike,
1088
+ ::v-deep .ProseMirror a [data-strike] {
1089
+ text-decoration: line-through !important;
1090
+ }
1091
+
1086
1092
  ::v-deep .ProseMirror a,
1087
1093
  ::v-deep .ProseMirror a * {
1088
1094
  color: #0097d7 !important;
@@ -1157,7 +1163,7 @@ const onClickHyperlink = (href?: string, text?: string) => {
1157
1163
  transform: translateX(-50%);
1158
1164
  }
1159
1165
  .hyperlink-popup {
1160
- z-index: 9999;
1166
+ z-index: 10000 !important;
1161
1167
  }
1162
1168
  }
1163
1169
 
@@ -22,6 +22,12 @@ describe('url-util', () => {
22
22
  'https://m.youtube.com/embed/L53gjP-TtGE&rel=0',
23
23
  'http://www.youtube.com/embed/L53gjP-TtGE&rel=0',
24
24
  'https://www.youtube.com/embed/L53gjP-TtGE&rel=0',
25
+ 'http://youtube.com/shorts/L53gjP-TtGE',
26
+ 'https://youtube.com/shorts/L53gjP-TtGE',
27
+ 'http://www.youtube.com/shorts/L53gjP-TtGE',
28
+ 'https://www.youtube.com/shorts/L53gjP-TtGE',
29
+ 'http://m.youtube.com/shorts/L53gjP-TtGE',
30
+ 'https://m.youtube.com/shorts/L53gjP-TtGE',
25
31
  ])('youtubeUrlRe should return match when given a url', (url) => {
26
32
  // Arrange
27
33
  const expected = 'L53gjP-TtGE';
@@ -1,5 +1,5 @@
1
1
  export const YOUTUBE_URL_RE =
2
- /(?:https?:\/\/)?(?:www|m)?\.?(?:youtube|youtu)\.(?:com|be)\/(?!channel\/|c\/|user\/|u\/)(?:embed\/|watch)?(?:\?.*v=)?([^&]+).*/i;
2
+ /(?:https?:\/\/)?(?:www|m)?\.?(?:youtube|youtu)\.(?:com|be)\/(?!channel\/|c\/|user\/|u\/)(?:embed\/|watch|shorts\/)?(?:\?.*v=)?([^&]+).*/i;
3
3
 
4
4
  export const DOMAIN_NAME_RE = /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/;
5
5
 
@@ -167,6 +167,11 @@ export default defineComponent({
167
167
  );
168
168
  },
169
169
  },
170
+ watch: {
171
+ customDomain(newCustomDomain) {
172
+ this.selectedDomain = newCustomDomain;
173
+ },
174
+ },
170
175
  methods: {
171
176
  closeModal() {
172
177
  this.$emit('on-close');