@myissue/vue-website-page-builder 3.3.68 → 3.3.71
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.
- package/README.md +1 -66
- package/dist/vue-website-page-builder.js +11682 -14535
- package/dist/vue-website-page-builder.umd.cjs +57 -78
- package/package.json +1 -1
- package/src/Components/PageBuilder/EditorMenu/Editables/BackgroundColorEditor.vue +2 -2
- package/src/Components/PageBuilder/EditorMenu/Editables/BorderRadius.vue +13 -19
- package/src/Components/PageBuilder/EditorMenu/Editables/Borders.vue +7 -9
- package/src/Components/PageBuilder/EditorMenu/Editables/ClassEditor.vue +7 -8
- package/src/Components/PageBuilder/EditorMenu/Editables/ManageBackgroundOpacity.vue +3 -7
- package/src/Components/PageBuilder/EditorMenu/Editables/ManageOpacity.vue +3 -5
- package/src/Components/PageBuilder/EditorMenu/Editables/Margin.vue +5 -9
- package/src/Components/PageBuilder/EditorMenu/Editables/OpacityEditor.vue +1 -1
- package/src/Components/PageBuilder/EditorMenu/Editables/Padding.vue +5 -9
- package/src/Components/PageBuilder/EditorMenu/Editables/StyleEditor.vue +7 -8
- package/src/Components/PageBuilder/EditorMenu/Editables/Typography.vue +9 -25
- package/src/Components/PageBuilder/EditorMenu/RightSidebarEditor.vue +12 -9
- package/src/Components/PageBuilder/Settings/PageBuilderSettings.vue +3 -3
- package/src/Components/PageBuilder/ToolbarOption/ToolbarOption.vue +4 -4
- package/src/PageBuilder/PageBuilder.vue +10 -76
- package/src/composables/builderInstance.ts +2 -3
- package/src/main.ts +5 -10
- package/src/services/PageBuilderService.ts +28 -120
- package/src/stores/page-builder-state.ts +6 -0
- package/src/tests/PageBuilderTest.vue +53 -21
- package/src/tests/pageBuilderService.test.ts +1 -7
- package/src/types/index.ts +1 -1
- package/src/i18n.ts +0 -28
- package/src/locales/ar.json +0 -136
- package/src/locales/de.json +0 -136
- package/src/locales/en.json +0 -136
- package/src/locales/es.json +0 -136
- package/src/locales/fr.json +0 -136
- package/src/locales/hi.json +0 -136
- package/src/locales/ja.json +0 -136
- package/src/locales/pt.json +0 -136
- package/src/locales/ru.json +0 -136
- package/src/locales/zh-Hans.json +0 -136
|
@@ -13,8 +13,6 @@ import { useDebounce } from '../composables/useDebounce.ts'
|
|
|
13
13
|
import DynamicModalBuilder from '../Components/Modals/DynamicModalBuilder.vue'
|
|
14
14
|
import GlobalLoader from '../Components/Loaders/GlobalLoader.vue'
|
|
15
15
|
import { getPageBuilder } from '../composables/builderInstance'
|
|
16
|
-
import { useI18n } from 'vue-i18n'
|
|
17
|
-
|
|
18
16
|
const pageBuilderService = getPageBuilder()
|
|
19
17
|
/**
|
|
20
18
|
* Props for PageBuilder component
|
|
@@ -71,6 +69,10 @@ const closeAddComponentModal = () => {
|
|
|
71
69
|
}
|
|
72
70
|
provide('closeAddComponentModal', closeAddComponentModal)
|
|
73
71
|
|
|
72
|
+
const getCurrentLanguage = computed(() => {
|
|
73
|
+
return pageBuilderStateStore.getCurrentLanguage
|
|
74
|
+
})
|
|
75
|
+
|
|
74
76
|
const getBuilderStarted = computed(() => {
|
|
75
77
|
return pageBuilderStateStore.getBuilderStarted
|
|
76
78
|
})
|
|
@@ -151,28 +153,6 @@ const getHasLocalDraftForUpdate = computed(() => {
|
|
|
151
153
|
return pageBuilderStateStore.getHasLocalDraftForUpdate
|
|
152
154
|
})
|
|
153
155
|
|
|
154
|
-
const { locale } = useI18n()
|
|
155
|
-
|
|
156
|
-
watch(locale, (newLocale) => {
|
|
157
|
-
const config = pageBuilderStateStore.getPageBuilderConfig
|
|
158
|
-
if (config && config.userSettings && config.userSettings.language) {
|
|
159
|
-
// Update the store with a full config (if you want to update the store)
|
|
160
|
-
const updatedConfig = {
|
|
161
|
-
...config,
|
|
162
|
-
userSettings: {
|
|
163
|
-
...config.userSettings,
|
|
164
|
-
language: {
|
|
165
|
-
...config.userSettings.language,
|
|
166
|
-
default: newLocale,
|
|
167
|
-
},
|
|
168
|
-
},
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
pageBuilderStateStore.setPageBuilderConfig(updatedConfig)
|
|
172
|
-
pageBuilderService.saveBuilderConfigToLocalStorage(updatedConfig)
|
|
173
|
-
}
|
|
174
|
-
})
|
|
175
|
-
|
|
176
156
|
watch(getHasLocalDraftForUpdate, (newVal) => {
|
|
177
157
|
if (newVal) {
|
|
178
158
|
handlerRumeEditingForUpdate()
|
|
@@ -563,7 +543,7 @@ onMounted(async () => {
|
|
|
563
543
|
></span>
|
|
564
544
|
</span>
|
|
565
545
|
</div>
|
|
566
|
-
<div>
|
|
546
|
+
<div>Save</div>
|
|
567
547
|
</button>
|
|
568
548
|
<!-- Save End -->
|
|
569
549
|
|
|
@@ -606,7 +586,7 @@ onMounted(async () => {
|
|
|
606
586
|
</span>
|
|
607
587
|
</div>
|
|
608
588
|
<div class="lg:pbx-block pbx-hidden">
|
|
609
|
-
<span>
|
|
589
|
+
<span> Reset Page </span>
|
|
610
590
|
</div>
|
|
611
591
|
</button>
|
|
612
592
|
</template>
|
|
@@ -643,9 +623,7 @@ onMounted(async () => {
|
|
|
643
623
|
class="pbx-flex pbx-items-center pbx-justify-center pbx-gap-2 pbx-border-gray-200"
|
|
644
624
|
>
|
|
645
625
|
<span class="lg:pbx-block pbx-hidden">
|
|
646
|
-
<div class="pbx-whitespace-nowrap pbx-cursor-pointer">
|
|
647
|
-
{{ $t('button.addComponents') }}
|
|
648
|
-
</div>
|
|
626
|
+
<div class="pbx-whitespace-nowrap pbx-cursor-pointer">Add new Components</div>
|
|
649
627
|
</span>
|
|
650
628
|
<span
|
|
651
629
|
class="pbx-h-10 pbx-w-10 pbx-cursor-pointer pbx-rounded-full pbx-flex pbx-items-center pbx-border-none pbx-justify-center pbx-bg-gray-50 pbx-aspect-square hover:pbx-bg-myPrimaryLinkColor hover:pbx-text-white focus-visible:pbx-ring-0"
|
|
@@ -724,62 +702,18 @@ onMounted(async () => {
|
|
|
724
702
|
}
|
|
725
703
|
"
|
|
726
704
|
>
|
|
727
|
-
|
|
705
|
+
Publish
|
|
728
706
|
</button>
|
|
729
707
|
</div>
|
|
730
708
|
</template>
|
|
731
|
-
<!-- Select language -->
|
|
732
709
|
<template
|
|
733
710
|
v-if="
|
|
734
711
|
getPageBuilderConfig &&
|
|
735
712
|
getPageBuilderConfig.userSettings &&
|
|
736
|
-
getPageBuilderConfig.userSettings.language
|
|
737
|
-
!getPageBuilderConfig.userSettings.language.disableLanguageDropDown
|
|
713
|
+
getPageBuilderConfig.userSettings.language
|
|
738
714
|
"
|
|
739
715
|
>
|
|
740
|
-
<template
|
|
741
|
-
v-if="
|
|
742
|
-
getPageBuilderConfig &&
|
|
743
|
-
getPageBuilderConfig.userSettings &&
|
|
744
|
-
getPageBuilderConfig.userSettings.language
|
|
745
|
-
"
|
|
746
|
-
>
|
|
747
|
-
<div class="pbx-flex pbx-justify-center pbx-items-center pbx-ml-2">
|
|
748
|
-
<select
|
|
749
|
-
class="pbx-myPrimarySelect pbx-min-w-20 pbx-max-w-2pbx-min-w-20 pbx-w-max"
|
|
750
|
-
v-model="$i18n.locale"
|
|
751
|
-
>
|
|
752
|
-
<template
|
|
753
|
-
v-if="
|
|
754
|
-
Array.isArray(getPageBuilderConfig.userSettings.language.enable) &&
|
|
755
|
-
getPageBuilderConfig.userSettings.language.enable.length >= 1
|
|
756
|
-
"
|
|
757
|
-
>
|
|
758
|
-
<template
|
|
759
|
-
v-for="lang in pageBuilderService
|
|
760
|
-
.availableLanguage()
|
|
761
|
-
.filter((l) => getPageBuilderConfig.userSettings.language.enable.includes(l))"
|
|
762
|
-
:key="lang"
|
|
763
|
-
>
|
|
764
|
-
<option :value="lang">{{ lang }}</option>
|
|
765
|
-
</template>
|
|
766
|
-
</template>
|
|
767
|
-
<template
|
|
768
|
-
v-if="
|
|
769
|
-
!getPageBuilderConfig.userSettings.language.enable ||
|
|
770
|
-
(Array.isArray(getPageBuilderConfig.userSettings.language.enable) &&
|
|
771
|
-
getPageBuilderConfig.userSettings.language.enable.length === 0)
|
|
772
|
-
"
|
|
773
|
-
>
|
|
774
|
-
<template v-for="lang in pageBuilderService.availableLanguage()" :key="lang">
|
|
775
|
-
<option :value="lang">{{ lang }}</option>
|
|
776
|
-
</template>
|
|
777
|
-
</template>
|
|
778
|
-
</select>
|
|
779
|
-
</div>
|
|
780
|
-
</template>
|
|
781
716
|
</template>
|
|
782
|
-
|
|
783
717
|
<template v-if="showCloseButton">
|
|
784
718
|
<div class="pbx-ml-2">
|
|
785
719
|
<button
|
|
@@ -932,7 +866,7 @@ onMounted(async () => {
|
|
|
932
866
|
class="pbx-flex pbx-items-center pbx-justify-center pbx-gap-2 pbx-cursor-pointer"
|
|
933
867
|
>
|
|
934
868
|
<span class="lg:pbx-block pbx-hidden">
|
|
935
|
-
<div class="pbx-whitespace-nowrap">
|
|
869
|
+
<div class="pbx-whitespace-nowrap">Add to the bottom</div>
|
|
936
870
|
</span>
|
|
937
871
|
<div class="pbx-flex pbx-gap-2 pbx-items-center pbx-justify-center">
|
|
938
872
|
<button
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
// builderInstance.ts
|
|
2
2
|
import { PageBuilderService } from '../services/PageBuilderService'
|
|
3
|
-
import type { I18n } from 'vue-i18n'
|
|
4
3
|
import { sharedPageBuilderStore } from '../stores/shared-store'
|
|
5
4
|
|
|
6
5
|
// Singleton instance
|
|
7
6
|
let instance: PageBuilderService | null = null
|
|
8
7
|
|
|
9
8
|
// Used to create and store the single instance
|
|
10
|
-
export function initPageBuilder(
|
|
9
|
+
export function initPageBuilder(): PageBuilderService {
|
|
11
10
|
if (!instance) {
|
|
12
11
|
const pageBuilderStateStore = sharedPageBuilderStore
|
|
13
|
-
instance = new PageBuilderService(pageBuilderStateStore
|
|
12
|
+
instance = new PageBuilderService(pageBuilderStateStore)
|
|
14
13
|
}
|
|
15
14
|
return instance
|
|
16
15
|
}
|
package/src/main.ts
CHANGED
|
@@ -5,16 +5,11 @@ import { initPageBuilder } from './composables/builderInstance'
|
|
|
5
5
|
import { createApp } from 'vue'
|
|
6
6
|
import { createPinia } from 'pinia'
|
|
7
7
|
import App from './App.vue'
|
|
8
|
-
import { setupI18n } from './i18n'
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
const i18n = await setupI18n()
|
|
12
|
-
initPageBuilder(i18n)
|
|
9
|
+
initPageBuilder()
|
|
13
10
|
|
|
14
|
-
|
|
15
|
-
app.use(createPinia())
|
|
16
|
-
app.use(i18n)
|
|
17
|
-
app.mount('#app')
|
|
18
|
-
}
|
|
11
|
+
const app = createApp(App)
|
|
19
12
|
|
|
20
|
-
|
|
13
|
+
app.use(createPinia())
|
|
14
|
+
|
|
15
|
+
app.mount('#app')
|
|
@@ -7,7 +7,6 @@ import type {
|
|
|
7
7
|
StartBuilderResult,
|
|
8
8
|
} from '../types'
|
|
9
9
|
import type { usePageBuilderStateStore } from '../stores/page-builder-state'
|
|
10
|
-
// import { i18n } from '../i18n' // i18n is now async and must be passed in, not imported
|
|
11
10
|
|
|
12
11
|
import tailwindFontSizes from '../utils/builder/tailwind-font-sizes'
|
|
13
12
|
import tailwindColors from '../utils/builder/tailwaind-colors'
|
|
@@ -49,10 +48,7 @@ export const AVAILABLE_LANGUAGES: AvailableLanguage[] = [
|
|
|
49
48
|
'hi',
|
|
50
49
|
]
|
|
51
50
|
|
|
52
|
-
import type { I18n } from 'vue-i18n'
|
|
53
|
-
|
|
54
51
|
export class PageBuilderService {
|
|
55
|
-
private i18n: I18n
|
|
56
52
|
// Class properties with types
|
|
57
53
|
private fontSizeRegex =
|
|
58
54
|
/^(sm:|md:|lg:|xl:|2xl:)?pbx-text-(xs|sm|base|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)$/
|
|
@@ -77,8 +73,7 @@ export class PageBuilderService {
|
|
|
77
73
|
private pendingMountComponents: BuilderResourceData | null = null
|
|
78
74
|
private isPageBuilderMissingOnStart: boolean = false
|
|
79
75
|
|
|
80
|
-
constructor(pageBuilderStateStore: ReturnType<typeof usePageBuilderStateStore
|
|
81
|
-
this.i18n = i18n
|
|
76
|
+
constructor(pageBuilderStateStore: ReturnType<typeof usePageBuilderStateStore>) {
|
|
82
77
|
this.hasStartedEditing = false
|
|
83
78
|
this.pageBuilderStateStore = pageBuilderStateStore
|
|
84
79
|
this.getApplyImageToSelection = computed(
|
|
@@ -269,55 +264,6 @@ export class PageBuilderService {
|
|
|
269
264
|
return
|
|
270
265
|
}
|
|
271
266
|
|
|
272
|
-
private ensureLanguage(config: PageBuilderConfig): void {
|
|
273
|
-
// Set default language config if missing, empty, or language missing/empty
|
|
274
|
-
const defaultLang = 'en'
|
|
275
|
-
const defaultEnable = ['en', 'zh-Hans', 'fr', 'ja', 'ru', 'es', 'pt', 'de', 'ar', 'hi'] as const
|
|
276
|
-
|
|
277
|
-
let needsDefault = false
|
|
278
|
-
const userSettings = config.userSettings
|
|
279
|
-
const language = userSettings && userSettings.language
|
|
280
|
-
|
|
281
|
-
if (!userSettings || isEmptyObject(userSettings)) {
|
|
282
|
-
needsDefault = true
|
|
283
|
-
} else if (!language || isEmptyObject(language)) {
|
|
284
|
-
needsDefault = true
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
if (needsDefault) {
|
|
288
|
-
const updatedLanguage = {
|
|
289
|
-
...config,
|
|
290
|
-
userSettings: {
|
|
291
|
-
...userSettings,
|
|
292
|
-
language: {
|
|
293
|
-
default: defaultLang,
|
|
294
|
-
enable: defaultEnable as typeof defaultEnable,
|
|
295
|
-
},
|
|
296
|
-
},
|
|
297
|
-
} as const
|
|
298
|
-
this.pageBuilderStateStore.setPageBuilderConfig(updatedLanguage)
|
|
299
|
-
return
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// Ensure default is in enable array
|
|
303
|
-
if (language && Array.isArray(language.enable) && language.default) {
|
|
304
|
-
if (!language.enable.includes(language.default)) {
|
|
305
|
-
const updatedEnable = [...language.enable, language.default]
|
|
306
|
-
const updatedLanguage = {
|
|
307
|
-
...config,
|
|
308
|
-
userSettings: {
|
|
309
|
-
...userSettings,
|
|
310
|
-
language: {
|
|
311
|
-
...language,
|
|
312
|
-
enable: updatedEnable,
|
|
313
|
-
},
|
|
314
|
-
},
|
|
315
|
-
} as const
|
|
316
|
-
this.pageBuilderStateStore.setPageBuilderConfig(updatedLanguage)
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
267
|
private validateConfig(config: PageBuilderConfig): void {
|
|
322
268
|
const defaultConfigValues = {
|
|
323
269
|
updateOrCreate: {
|
|
@@ -334,52 +280,6 @@ export class PageBuilderService {
|
|
|
334
280
|
if (config && Object.keys(config).length !== 0 && config.constructor === Object) {
|
|
335
281
|
this.ensureUpdateOrCreateConfig(config)
|
|
336
282
|
}
|
|
337
|
-
|
|
338
|
-
this.ensureLanguage(config)
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
public saveBuilderConfigToLocalStorage(specificConfig: PageBuilderConfig) {
|
|
342
|
-
// Only save userSettings to localStorage
|
|
343
|
-
if (specificConfig && specificConfig.userSettings) {
|
|
344
|
-
localStorage.setItem(
|
|
345
|
-
'pageBuilderConfig',
|
|
346
|
-
JSON.stringify({ userSettings: specificConfig.userSettings }),
|
|
347
|
-
)
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
private checkBuilderConfigToLocalStorage(currentConfig: PageBuilderConfig) {
|
|
352
|
-
const savedConfigRaw = localStorage.getItem('pageBuilderConfig')
|
|
353
|
-
|
|
354
|
-
if (savedConfigRaw) {
|
|
355
|
-
try {
|
|
356
|
-
const savedConfig = JSON.parse(savedConfigRaw)
|
|
357
|
-
// Deep merge: prefer all keys from savedConfig, fallback to currentConfig
|
|
358
|
-
const mergedConfig = {
|
|
359
|
-
...currentConfig,
|
|
360
|
-
...savedConfig,
|
|
361
|
-
userSettings: {
|
|
362
|
-
...currentConfig.userSettings,
|
|
363
|
-
...savedConfig.userSettings,
|
|
364
|
-
},
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
this.pageBuilderStateStore.setPageBuilderConfig(mergedConfig)
|
|
368
|
-
|
|
369
|
-
const saveLang =
|
|
370
|
-
this.pageBuilderStateStore.getPageBuilderConfig &&
|
|
371
|
-
this.pageBuilderStateStore.getPageBuilderConfig.userSettings &&
|
|
372
|
-
this.pageBuilderStateStore.getPageBuilderConfig.userSettings.language &&
|
|
373
|
-
this.pageBuilderStateStore.getPageBuilderConfig.userSettings.language.default
|
|
374
|
-
|
|
375
|
-
if (saveLang) {
|
|
376
|
-
this.i18n.global.locale = saveLang
|
|
377
|
-
}
|
|
378
|
-
return
|
|
379
|
-
} catch (e) {
|
|
380
|
-
console.warn('Failed to parse saved pageBuilderConfig from localStorage:', e)
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
283
|
}
|
|
384
284
|
|
|
385
285
|
/**
|
|
@@ -408,20 +308,6 @@ export class PageBuilderService {
|
|
|
408
308
|
// Validate and normalize the config (ensure required fields are present)
|
|
409
309
|
this.validateConfig(config)
|
|
410
310
|
|
|
411
|
-
if (
|
|
412
|
-
this.pageBuilderStateStore.getPageBuilderConfig &&
|
|
413
|
-
this.pageBuilderStateStore.getPageBuilderConfig.userSettings &&
|
|
414
|
-
this.pageBuilderStateStore.getPageBuilderConfig.userSettings.language &&
|
|
415
|
-
this.pageBuilderStateStore.getPageBuilderConfig.userSettings.language.default
|
|
416
|
-
) {
|
|
417
|
-
this.i18n.global.locale =
|
|
418
|
-
this.pageBuilderStateStore.getPageBuilderConfig.userSettings.language.default
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
if (this.pageBuilderStateStore.getPageBuilderConfig) {
|
|
422
|
-
this.checkBuilderConfigToLocalStorage(this.pageBuilderStateStore.getPageBuilderConfig)
|
|
423
|
-
}
|
|
424
|
-
|
|
425
311
|
validation = this.validateUserProvidedComponents(passedComponentsArray)
|
|
426
312
|
|
|
427
313
|
// Update the localStorage key name based on the config/resource
|
|
@@ -549,7 +435,7 @@ export class PageBuilderService {
|
|
|
549
435
|
}
|
|
550
436
|
|
|
551
437
|
if (!passedComponentsArray && !localStorageData && this.isPageBuilderMissingOnStart) {
|
|
552
|
-
console.log('
|
|
438
|
+
console.log('10000:', internalPageBuilderCall)
|
|
553
439
|
await this.completeMountProcess(JSON.stringify(this.pendingMountComponents), true)
|
|
554
440
|
this.saveDomComponentsToLocalStorage()
|
|
555
441
|
return
|
|
@@ -913,11 +799,33 @@ export class PageBuilderService {
|
|
|
913
799
|
|
|
914
800
|
public handleManualSave = async () => {
|
|
915
801
|
this.startEditing()
|
|
802
|
+
const passedConfig = this.pageBuilderStateStore.getPageBuilderConfig
|
|
916
803
|
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
804
|
+
// Check if config is set
|
|
805
|
+
if (passedConfig && passedConfig.userSettings) {
|
|
806
|
+
//
|
|
807
|
+
//
|
|
808
|
+
// Enabled auto save
|
|
809
|
+
if (
|
|
810
|
+
(typeof passedConfig.userSettings.autoSave === 'boolean' &&
|
|
811
|
+
!passedConfig.userSettings.autoSave) ||
|
|
812
|
+
(typeof passedConfig.userSettings.autoSave === 'boolean' &&
|
|
813
|
+
passedConfig.userSettings.autoSave)
|
|
814
|
+
) {
|
|
815
|
+
this.pageBuilderStateStore.setIsSaving(true)
|
|
816
|
+
this.saveDomComponentsToLocalStorage()
|
|
817
|
+
await delay(400)
|
|
818
|
+
|
|
819
|
+
this.pageBuilderStateStore.setIsSaving(false)
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
if (passedConfig && !passedConfig.userSettings) {
|
|
823
|
+
this.pageBuilderStateStore.setIsSaving(true)
|
|
824
|
+
this.saveDomComponentsToLocalStorage()
|
|
825
|
+
await delay(400)
|
|
826
|
+
|
|
827
|
+
this.pageBuilderStateStore.setIsSaving(false)
|
|
828
|
+
}
|
|
921
829
|
}
|
|
922
830
|
|
|
923
831
|
public cloneCompObjForDOMInsertion(componentObject: ComponentObject): ComponentObject {
|
|
@@ -67,6 +67,7 @@ interface PageBuilderState {
|
|
|
67
67
|
hasLocalDraftForUpdate: boolean
|
|
68
68
|
isResumeEditing: boolean
|
|
69
69
|
isRestoring: boolean
|
|
70
|
+
currentLanguage: string
|
|
70
71
|
}
|
|
71
72
|
|
|
72
73
|
export const usePageBuilderStateStore = defineStore('pageBuilderState', {
|
|
@@ -129,6 +130,7 @@ export const usePageBuilderStateStore = defineStore('pageBuilderState', {
|
|
|
129
130
|
hasLocalDraftForUpdate: false,
|
|
130
131
|
isResumeEditing: false,
|
|
131
132
|
isRestoring: false,
|
|
133
|
+
currentLanguage: 'en',
|
|
132
134
|
}),
|
|
133
135
|
getters: {
|
|
134
136
|
// Core Page Builder Getters
|
|
@@ -284,6 +286,7 @@ export const usePageBuilderStateStore = defineStore('pageBuilderState', {
|
|
|
284
286
|
getHasLocalDraftForUpdate: (state: PageBuilderState): boolean => state.hasLocalDraftForUpdate,
|
|
285
287
|
getIsLoadingResumeEditing: (state: PageBuilderState): boolean => state.isResumeEditing,
|
|
286
288
|
getIsRestoring: (state: PageBuilderState): boolean => state.isRestoring,
|
|
289
|
+
getCurrentLanguage: (state: PageBuilderState): string => state.currentLanguage,
|
|
287
290
|
},
|
|
288
291
|
actions: {
|
|
289
292
|
setComponentArrayAddMethod(payload: string | null): void {
|
|
@@ -489,5 +492,8 @@ export const usePageBuilderStateStore = defineStore('pageBuilderState', {
|
|
|
489
492
|
setIsRestoring(payload: boolean): void {
|
|
490
493
|
this.isRestoring = payload
|
|
491
494
|
},
|
|
495
|
+
setCurrentLanguage(payload: string): void {
|
|
496
|
+
this.currentLanguage = payload
|
|
497
|
+
},
|
|
492
498
|
},
|
|
493
499
|
})
|
|
@@ -6,19 +6,49 @@ import DemoBuilderComponentsTest from '../tests/TestComponents/DemoBuilderCompon
|
|
|
6
6
|
import { onMounted } from 'vue'
|
|
7
7
|
import componentsArray from '../tests/componentsArray.test.json'
|
|
8
8
|
import { getPageBuilder } from '../composables/builderInstance'
|
|
9
|
-
import { useI18n } from 'vue-i18n'
|
|
10
9
|
const pageBuilderService = getPageBuilder()
|
|
11
|
-
const { t } = useI18n()
|
|
12
10
|
|
|
13
11
|
const features = [
|
|
14
|
-
{
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
{
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
{
|
|
13
|
+
name: 'Live Drag & Drop Builder',
|
|
14
|
+
description:
|
|
15
|
+
'Click & Drop content on a page and watch your pages come to life. Bring your vision to life and create impressive pages using a click & drop Page Builder',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'True Visual Editing',
|
|
19
|
+
description:
|
|
20
|
+
'See your changes in real-time as you make them. Elevate your creative vision and create pages using an intuitive click & drop page builder. Break free from design limitations and turn your visions into reality.',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'Features',
|
|
24
|
+
description:
|
|
25
|
+
'Click & Drop, Reordering, True Visual Editing, Responsive Editing, Font Customization, Undo & Redo, Text Editing, Media Library, Unsplash Integration, YouTube Videos.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'Technologies',
|
|
29
|
+
description:
|
|
30
|
+
'Developed with TypeScript, Vue 3, Composition API, Pinia, CSS, Tailwind CSS and HTML.',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'Set Brand and Link Colors one place',
|
|
34
|
+
description:
|
|
35
|
+
'Global Styles for fonts, designs, & colors. Set Brand and Link Colors once and apply them across the entire Platform with ease.',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Mobile-First Approach',
|
|
39
|
+
description:
|
|
40
|
+
'Developed with Mobile-First approach. The Page Builder even works on mobile phones.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Media Library',
|
|
44
|
+
description:
|
|
45
|
+
'A beautiful and user-friendly media library that allows you to change and update images. Unsplash Integration is included.',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'Minimal and Intuitive Design',
|
|
49
|
+
description:
|
|
50
|
+
'Beautiful, elegant and intuitive design. Enhance user engagement with amazing visual experience.',
|
|
51
|
+
},
|
|
22
52
|
]
|
|
23
53
|
|
|
24
54
|
const publishPageBuilder = function () {}
|
|
@@ -30,7 +60,7 @@ const htmlString =
|
|
|
30
60
|
'</div>'
|
|
31
61
|
|
|
32
62
|
// Parse as HTML (not JSON)
|
|
33
|
-
const {
|
|
63
|
+
const { components, pageSettings } = pageBuilderService.parsePageBuilderHTML(htmlString)
|
|
34
64
|
|
|
35
65
|
const configPageBuilder = {
|
|
36
66
|
userForPageBuilder: {
|
|
@@ -52,10 +82,8 @@ const configPageBuilder = {
|
|
|
52
82
|
theme: 'light',
|
|
53
83
|
language: {
|
|
54
84
|
default: 'en',
|
|
55
|
-
|
|
56
|
-
disableLanguageDropDown: false,
|
|
85
|
+
disable: ['fr', 'es'],
|
|
57
86
|
},
|
|
58
|
-
autoSave: true,
|
|
59
87
|
},
|
|
60
88
|
settings: {
|
|
61
89
|
brandColor: '#DB93B0',
|
|
@@ -64,7 +92,7 @@ const configPageBuilder = {
|
|
|
64
92
|
} as const
|
|
65
93
|
|
|
66
94
|
onMounted(async () => {
|
|
67
|
-
const result = await pageBuilderService.startBuilder(configPageBuilder)
|
|
95
|
+
const result = await pageBuilderService.startBuilder(configPageBuilder, components)
|
|
68
96
|
console.log('Page Builder inspect the result for message, status, or error::', result)
|
|
69
97
|
})
|
|
70
98
|
</script>
|
|
@@ -74,15 +102,19 @@ onMounted(async () => {
|
|
|
74
102
|
<div class="pbx-myPrimaryWidthScreenModule pbx-bg-red-50 lg:pbx-block">
|
|
75
103
|
<div class="pbx-myPrimaryContentSection">
|
|
76
104
|
<h2 class="pbx-mySecondaryHeader">
|
|
77
|
-
|
|
105
|
+
Bring your vision to life and create impressive pages using a click & drop Page Builder
|
|
78
106
|
</h2>
|
|
79
107
|
<p class="pbx-myPrimaryParagraph pbx-font-normal">
|
|
80
|
-
|
|
108
|
+
The web builder for stunning pages. Enable users to design and publish modern pages at any
|
|
109
|
+
scale. Build responsive pages like listings, jobs or blog posts and manage content easily
|
|
110
|
+
using the free click & drop Page Builder. Developed with TypeScript, Vue 3, Composition
|
|
111
|
+
API, Pinia, CSS, Tailwind CSS and HTML.
|
|
112
|
+
|
|
81
113
|
<br />
|
|
82
114
|
</p>
|
|
83
115
|
<div class="pbx-mt-4">
|
|
84
116
|
<p class="pbx-myPrimaryParagraph pbx-font-normal">
|
|
85
|
-
|
|
117
|
+
Download or install our powerful, flexible, and easy-to-use free Vue 3 Page Builder via
|
|
86
118
|
<br />
|
|
87
119
|
<strong> npm:</strong>
|
|
88
120
|
<a
|
|
@@ -120,16 +152,16 @@ onMounted(async () => {
|
|
|
120
152
|
>
|
|
121
153
|
<div
|
|
122
154
|
v-for="feature in features"
|
|
123
|
-
:key="feature.
|
|
155
|
+
:key="feature.name"
|
|
124
156
|
class="pbx-bg-red-200 pbx-bg-opacity-20 hover:pbx-bg-opacity-10 pbx-w-full lg:pbx-min-h-[20rem] pbx-min-h-[12rem] pbx-relative pbx-col-span-1 pbx-flex pbx-flex-col pbx-text-center pbx-rounded-lg pbx-shadow-sm pbx-outline pbx-outline-2 pbx-outline-offset-8 pbx-outline-yellow-400"
|
|
125
157
|
>
|
|
126
158
|
<div
|
|
127
159
|
class="pbx-bg-black/0 pbx-absolute pbx-top-0 pbx-left-0 pbx-w-full pbx-h-full pbx-rounded-lg"
|
|
128
160
|
></div>
|
|
129
161
|
<div class="pbx-px-2 pbx-pt-8 pbx-absolute pbx-top-0 pbx-w-full">
|
|
130
|
-
<p class="pbx-myTertiaryHeader">{{
|
|
162
|
+
<p class="pbx-myTertiaryHeader">{{ feature.name }}</p>
|
|
131
163
|
<p class="pbx-myPrimaryParagraph pbx-font-medium pbx-drop-shadow-sm">
|
|
132
|
-
{{
|
|
164
|
+
{{ feature.description }}
|
|
133
165
|
</p>
|
|
134
166
|
</div>
|
|
135
167
|
</div>
|
|
@@ -47,13 +47,7 @@ describe('PageBuilderService', () => {
|
|
|
47
47
|
typeof (fn as { mockClear?: () => void }).mockClear === 'function' &&
|
|
48
48
|
(fn as { mockClear: () => void }).mockClear(),
|
|
49
49
|
)
|
|
50
|
-
|
|
51
|
-
const mockI18n = {
|
|
52
|
-
global: {
|
|
53
|
-
locale: 'en',
|
|
54
|
-
},
|
|
55
|
-
} as any
|
|
56
|
-
service = new PageBuilderService(mockStore, mockI18n)
|
|
50
|
+
service = new PageBuilderService(mockStore)
|
|
57
51
|
})
|
|
58
52
|
|
|
59
53
|
it('should start builder and return a success message', async () => {
|
package/src/types/index.ts
CHANGED
|
@@ -229,7 +229,7 @@ export interface PageBuilderConfig {
|
|
|
229
229
|
theme?: 'light' | 'dark' | 'auto'
|
|
230
230
|
language?: {
|
|
231
231
|
default: 'en' | 'zh-Hans' | 'fr' | 'ja' | 'ru' | 'es' | 'pt' | 'de' | 'ar' | 'hi'
|
|
232
|
-
|
|
232
|
+
disable?: ReadonlyArray<
|
|
233
233
|
'en' | 'zh-Hans' | 'fr' | 'ja' | 'ru' | 'es' | 'pt' | 'de' | 'ar' | 'hi'
|
|
234
234
|
>
|
|
235
235
|
}
|
package/src/i18n.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { createI18n } from 'vue-i18n'
|
|
2
|
-
|
|
3
|
-
// Function to load all locale messages from JSON files
|
|
4
|
-
async function loadLocaleMessages() {
|
|
5
|
-
const locales = import.meta.glob('./locales/*.json')
|
|
6
|
-
const messages: Record<string, object> = {}
|
|
7
|
-
for (const path in locales) {
|
|
8
|
-
const matched = path.match(/([A-Za-z0-9-_]+)\.json$/i)
|
|
9
|
-
if (matched && matched.length > 1) {
|
|
10
|
-
const locale = matched[1]
|
|
11
|
-
const module = (await locales[path]()) as { default: object }
|
|
12
|
-
messages[locale] = module.default
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
return messages
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Use this in main.ts: const i18n = await setupI18n()
|
|
19
|
-
export async function setupI18n() {
|
|
20
|
-
const messages = await loadLocaleMessages()
|
|
21
|
-
return createI18n({
|
|
22
|
-
legacy: false, // you must set `false`, to use Composition API
|
|
23
|
-
locale: 'en', // set locale
|
|
24
|
-
fallbackLocale: 'en', // set fallback locale
|
|
25
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
26
|
-
messages: messages as any, // typecast to satisfy vue-i18n
|
|
27
|
-
})
|
|
28
|
-
}
|