@blokkli/editor 2.0.0-alpha.1 → 2.0.0-alpha.3

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 (44) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/module.mjs +8 -7
  3. package/dist/modules/drupal/graphql/base/fragment.blokkliProps.graphql +8 -0
  4. package/dist/modules/drupal/graphql/base/fragment.paragraphsFieldItem.graphql +6 -0
  5. package/dist/modules/drupal/index.mjs +25 -4
  6. package/dist/runtime/blokkliPlugins/DroppableEdit/index.vue +1 -1
  7. package/dist/runtime/components/BlokkliEditable.vue +1 -0
  8. package/dist/runtime/components/BlokkliEditable.vue.d.ts +4 -18
  9. package/dist/runtime/components/BlokkliField.vue +1 -0
  10. package/dist/runtime/components/BlokkliField.vue.d.ts +8 -92
  11. package/dist/runtime/components/BlokkliProvider.vue +2 -1
  12. package/dist/runtime/components/BlokkliProvider.vue.d.ts +5 -22
  13. package/dist/runtime/components/Edit/BlokkliErrorBoundary.vue +4 -4
  14. package/dist/runtime/components/Edit/EditProvider.vue +4 -3
  15. package/dist/runtime/components/Edit/EditProvider.vue.d.ts +3 -3
  16. package/dist/runtime/components/Edit/Features/Assistant/Overlay/index.vue +4 -4
  17. package/dist/runtime/components/Edit/Features/Clipboard/index.vue +1 -1
  18. package/dist/runtime/components/Edit/Features/Comments/AddForm/index.vue +2 -2
  19. package/dist/runtime/components/Edit/Features/Comments/Comment/index.vue +1 -1
  20. package/dist/runtime/components/Edit/Features/Comments/Overlay/Item/index.vue +2 -2
  21. package/dist/runtime/components/Edit/Features/Diff/DiffView/index.vue +7 -7
  22. package/dist/runtime/components/Edit/Features/EditableField/Overlay/index.vue +2 -2
  23. package/dist/runtime/components/Edit/Features/Fragments/Dialog/index.vue +4 -4
  24. package/dist/runtime/components/Edit/Features/Help/index.vue +2 -2
  25. package/dist/runtime/components/Edit/Features/History/List/index.vue +4 -4
  26. package/dist/runtime/components/Edit/Features/ImportExisting/Dialog/index.vue +5 -5
  27. package/dist/runtime/components/Edit/Features/Library/EditReusable/index.vue +2 -2
  28. package/dist/runtime/components/Edit/Features/Library/LibraryDialog/index.vue +5 -5
  29. package/dist/runtime/components/Edit/Features/Library/ReusableDialog/index.vue +2 -2
  30. package/dist/runtime/components/Edit/Features/MediaLibrary/Library/index.vue +1 -1
  31. package/dist/runtime/components/Edit/Features/Options/Form/Radios/index.vue +1 -1
  32. package/dist/runtime/components/Edit/Features/Ownership/index.vue +1 -1
  33. package/dist/runtime/components/Edit/Features/PreviewGrant/QrCode/index.vue +1 -1
  34. package/dist/runtime/components/Edit/Features/Publish/index.vue +20 -2
  35. package/dist/runtime/components/Edit/Features/Search/Overlay/Results/Content/index.vue +1 -1
  36. package/dist/runtime/components/Edit/Features/Search/index.vue +1 -1
  37. package/dist/runtime/components/Edit/Features/Tour/Overlay/index.vue +2 -2
  38. package/dist/runtime/components/Edit/Features/Tour/Popup/index.vue +4 -4
  39. package/dist/runtime/components/Edit/Features/Translations/Banner/index.vue +1 -1
  40. package/dist/runtime/components/Edit/Features/Validations/index.vue +1 -1
  41. package/dist/runtime/components/Edit/PreviewProvider.vue +1 -0
  42. package/dist/runtime/components/Edit/PreviewProvider.vue.d.ts +3 -3
  43. package/dist/runtime/components/Edit/SystemRequirements/index.vue +2 -2
  44. package/package.json +5 -8
package/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "blokkli",
3
3
  "configKey": "blokkli",
4
- "version": "2.0.0-alpha.1",
4
+ "version": "2.0.0-alpha.3",
5
5
  "compatibility": {
6
6
  "nuxt": "^3.15.0"
7
7
  },
package/dist/module.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { resolveFiles, createResolver, addComponent, addImports, addTemplate, addTypeTemplate, resolveAlias, defineNuxtModule, addPlugin, addBuildPlugin } from '@nuxt/kit';
1
+ import { resolveAlias, resolveFiles, createResolver, addComponent, addImports, addTemplate, addTypeTemplate, defineNuxtModule, addPlugin, addBuildPlugin } from '@nuxt/kit';
2
2
  import { createUnplugin } from 'unplugin';
3
3
  import MagicString from 'magic-string';
4
4
  import { walk } from 'estree-walker-ts';
@@ -13,7 +13,7 @@ import { BK_VISIBLE_LANGUAGES, BK_HIDDEN_GLOBALLY } from '../dist/runtime/helper
13
13
  import fs from 'node:fs';
14
14
  import { defu, createDefu } from 'defu';
15
15
 
16
- const version = "2.0.0-alpha.1";
16
+ const version = "2.0.0-alpha.3";
17
17
 
18
18
  function sortObjectKeys(obj) {
19
19
  if (Array.isArray(obj)) {
@@ -275,8 +275,10 @@ class BlockCollector extends Collector {
275
275
  this.patterns = (helper.options.pattern || []).map((pattern) => {
276
276
  if (pattern.startsWith("/")) {
277
277
  return pattern;
278
+ } else if (pattern.startsWith(".")) {
279
+ return helper.resolvers.src.resolve(pattern);
278
280
  }
279
- return helper.resolvers.src.resolve(pattern);
281
+ return resolveAlias(pattern);
280
282
  });
281
283
  }
282
284
  async init() {
@@ -566,7 +568,7 @@ class ModuleHelper {
566
568
  this.paths = {
567
569
  blokkliBuildDir: this.resolvers.build.resolve("blokkli"),
568
570
  srcDir: nuxt.options.srcDir,
569
- editAdapter: this.findEditAdapterPath()
571
+ editAdapter: ""
570
572
  };
571
573
  this.relativePaths = {
572
574
  TYPES: relative(
@@ -615,6 +617,7 @@ class ModuleHelper {
615
617
  fieldListTypes: fieldListTypes.filter(onlyUnique),
616
618
  chunkNames: chunkNames.filter(onlyUnique)
617
619
  };
620
+ this.paths.editAdapter = this.findEditAdapterPath();
618
621
  }
619
622
  relativePaths;
620
623
  paths;
@@ -8056,7 +8059,6 @@ const module = defineNuxtModule({
8056
8059
  }
8057
8060
  },
8058
8061
  defaults: {
8059
- pattern: ["components/Blokkli/**/*.vue"],
8060
8062
  globalOptions: {
8061
8063
  [BK_VISIBLE_LANGUAGES]: {
8062
8064
  type: "checkboxes",
@@ -8070,8 +8072,7 @@ const module = defineNuxtModule({
8070
8072
  default: false
8071
8073
  }
8072
8074
  },
8073
- chunkNames: ["global"],
8074
- itemEntityType: "block"
8075
+ chunkNames: ["global"]
8075
8076
  },
8076
8077
  async setup(moduleOptions, nuxt) {
8077
8078
  const blokkliModules = moduleOptions.modules || [];
@@ -0,0 +1,8 @@
1
+ fragment blokkliProps on ParagraphsBlokkliProps {
2
+ entityUuid
3
+ entityType
4
+ entityBundle
5
+ canEdit
6
+ editLabel
7
+ language
8
+ }
@@ -0,0 +1,6 @@
1
+ fragment paragraphsFieldItem on Paragraph {
2
+ uuid
3
+ bundle: entityBundle
4
+ isNew
5
+ options: paragraphsBlokkliOptions
6
+ }
@@ -1,4 +1,5 @@
1
1
  import { useLogger, createResolver } from '@nuxt/kit';
2
+ import { fileURLToPath } from 'node:url';
2
3
  import { join } from 'pathe';
3
4
  import { isObjectType, isInterfaceType } from 'graphql';
4
5
  import { useGraphqlModuleContext } from 'nuxt-graphql-middleware/utils';
@@ -14,6 +15,12 @@ function defineBlokkliModule(init) {
14
15
 
15
16
  const logger = useLogger("@blokkli/editor");
16
17
 
18
+ function toPascalCase(text) {
19
+ return text.replace(/(^\w|_\w)/g, clearAndUpper);
20
+ }
21
+ function clearAndUpper(text) {
22
+ return text.replace(/_/, "").toUpperCase();
23
+ }
17
24
  const index = defineBlokkliModule({
18
25
  alterOptions(options) {
19
26
  if (!options.itemEntityType) {
@@ -23,10 +30,20 @@ const index = defineBlokkliModule({
23
30
  options.pattern = ["~/components/Paragraph/**/*.vue"];
24
31
  }
25
32
  if (!options.editAdapterPath) {
26
- const resolver = createResolver(join(import.meta.url));
33
+ const resolver = createResolver(
34
+ fileURLToPath(new URL("./", import.meta.url))
35
+ );
27
36
  const filePath = resolver.resolve("./adapter/index.mjs");
28
37
  options.editAdapterPath = filePath;
29
38
  }
39
+ if (!options.getBundlePropsType) {
40
+ options.getBundlePropsType = function(bundle) {
41
+ return {
42
+ typeName: `Paragraph${toPascalCase(bundle)}Fragment`,
43
+ from: "#graphql-operations"
44
+ };
45
+ };
46
+ }
30
47
  },
31
48
  setup({ context }) {
32
49
  if (!useGraphqlModuleContext({ nullOnMissing: true })) {
@@ -47,7 +64,9 @@ const index = defineBlokkliModule({
47
64
  const queryFields = getTypeFields("Query");
48
65
  const editStateFields = getTypeFields("ParagraphsBlokkliEditState");
49
66
  const editMutationStateFields = getTypeFields("ParagraphsEditMutationState");
50
- const resolver = createResolver(join(import.meta.url, "graphql"));
67
+ const resolver = createResolver(
68
+ join(fileURLToPath(new URL("./", import.meta.url)), "graphql")
69
+ );
51
70
  function addGraphqlDocument(fileName) {
52
71
  const filePath = resolver.resolve(fileName);
53
72
  graphql.addImportFile(filePath);
@@ -65,6 +84,8 @@ const index = defineBlokkliModule({
65
84
  "fragment.paragraphsBlokkliMutationItem.graphql",
66
85
  "fragment.paragraphsBlokkliMutationResult.graphql",
67
86
  "fragment.paragraphsBlokkliViolation.graphql",
87
+ "fragment.blokkliProps.graphql",
88
+ "fragment.paragraphsFieldItem.graphql",
68
89
  "query.pbConfig.graphql",
69
90
  "query.pbEditState.graphql"
70
91
  ];
@@ -141,9 +162,9 @@ const index = defineBlokkliModule({
141
162
  context.features.disableFeature("preview-grant");
142
163
  }
143
164
  if (editStateFields.has("publishOptions") && queryFields.has("pbSearchEditStates")) {
144
- addGraphqlDocument("publishNew.graphql");
165
+ addGraphqlDocument("features/publishNew.graphql");
145
166
  } else {
146
- addGraphqlDocument("publish.graphql");
167
+ addGraphqlDocument("features/publish.graphql");
147
168
  }
148
169
  }
149
170
  });
@@ -11,7 +11,7 @@
11
11
  <slot />
12
12
  <template #footer>
13
13
  <button class="bk-button bk-is-primary" @click="onSubmit">
14
- {{ $t('droppableEditFormSave', 'Save') }}
14
+ {{ $t("droppableEditFormSave", "Save") }}
15
15
  </button>
16
16
  </template>
17
17
  </FormOverlay>
@@ -16,6 +16,7 @@ const props = defineProps({
16
16
  value: { type: String, required: true },
17
17
  tag: { type: String, required: false, default: "div" }
18
18
  });
19
+ defineSlots();
19
20
  const valueOverride = ref("");
20
21
  const isEditing = inject(INJECT_IS_EDITING, false);
21
22
  const entity = inject(INJECT_ENTITY_CONTEXT);
@@ -3,25 +3,11 @@ type __VLS_Props = {
3
3
  value: string;
4
4
  tag?: string;
5
5
  };
6
- declare const renderedValue: import("vue").ComputedRef<string>;
7
- declare const attrs: import("vue").ComputedRef<{
8
- 'data-blokkli-editable-field': string;
9
- 'data-blokkli-editable-component': string;
10
- 'data-blokkli-editable-value': string;
11
- } | undefined>;
12
- declare const __VLS_ctx: InstanceType<__VLS_PickNotAny<typeof __VLS_self, new () => {}>>;
13
- declare var __VLS_6: {
14
- value: string;
6
+ type __VLS_Slots = {
7
+ default(props: {
8
+ value: string;
9
+ }): any;
15
10
  };
16
- type __VLS_Slots = __VLS_PrettifyGlobal<__VLS_OmitStringIndex<typeof __VLS_ctx.$slots> & {
17
- default?: (props: typeof __VLS_6) => any;
18
- }>;
19
- declare const __VLS_self: import("vue").DefineComponent<__VLS_Props, {
20
- renderedValue: typeof renderedValue;
21
- attrs: typeof attrs;
22
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
23
- tag: string;
24
- }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
25
11
  declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
26
12
  tag: string;
27
13
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -89,6 +89,7 @@ const attrs = useAttrs();
89
89
  defineOptions({
90
90
  inheritAttrs: false
91
91
  });
92
+ defineSlots();
92
93
  const isEditing = inject(INJECT_IS_EDITING, false);
93
94
  const isGlobalProxyMode = inject(
94
95
  INJECT_GLOBAL_PROXY_MODE,
@@ -1,56 +1,14 @@
1
- import { type ComputedRef } from '#imports';
2
1
  import type { BlokkliFragmentName } from '#blokkli-build/definitions';
3
- import BlokkliItem from './BlokkliItem.vue.js';
4
- import type { FieldListItem, EntityContext, BlokkliProviderEntityContext } from '#blokkli/types';
2
+ import type { FieldListItem } from '#blokkli/types';
5
3
  import type { ValidFieldListTypes, FieldListItemTyped } from '#blokkli-build/generated-types';
6
- declare const DraggableList: import("vue").DefineComponent<{
7
- name: string;
8
- fieldKey: string;
9
- list: FieldListItem[];
10
- entity: EntityContext;
11
- language?: string;
12
- tag?: string;
13
- isNested: boolean;
14
- fieldListType: string;
15
- allowedFragments?: BlokkliFragmentName[];
16
- dropAlignment?: "vertical" | "horizontal";
17
- proxyMode?: boolean;
18
- globalProxyMode?: boolean;
19
- nestingLevel: number;
20
- shouldRenderItem?: (item: FieldListItem | FieldListItemTyped) => boolean;
21
- }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{
22
- name: string;
23
- fieldKey: string;
24
- list: FieldListItem[];
25
- entity: EntityContext;
26
- language?: string;
27
- tag?: string;
28
- isNested: boolean;
29
- fieldListType: string;
30
- allowedFragments?: BlokkliFragmentName[];
31
- dropAlignment?: "vertical" | "horizontal";
32
- proxyMode?: boolean;
33
- globalProxyMode?: boolean;
34
- nestingLevel: number;
35
- shouldRenderItem?: (item: FieldListItem | FieldListItemTyped) => boolean;
36
- }> & Readonly<{}>, {
37
- allowedFragments: BlokkliFragmentName[];
38
- tag: string;
39
- language: string;
40
- dropAlignment: "vertical" | "horizontal";
41
- shouldRenderItem: (item: FieldListItem | FieldListItemTyped) => boolean;
42
- }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any> | null;
43
- declare const attrs: {
44
- [x: string]: unknown;
4
+ type __VLS_Slots = {
5
+ default(props: {
6
+ items: FieldListItemTyped[];
7
+ }): any;
8
+ after(props: {
9
+ items: FieldListItemTyped[];
10
+ }): any;
45
11
  };
46
- declare const isEditing = false;
47
- declare const isGlobalProxyMode: ComputedRef<boolean> | null;
48
- declare const isInReusable = false;
49
- declare const isPreview: ComputedRef<boolean> | null;
50
- declare const isNested = false;
51
- declare const nestingLevel: number;
52
- declare const entity: EntityContext | undefined;
53
- declare const providerEntity: ComputedRef<BlokkliProviderEntityContext>;
54
12
  type __VLS_Props = {
55
13
  name: string;
56
14
  list?: Array<FieldListItem | null | undefined> | FieldListItem | null;
@@ -71,48 +29,6 @@ type __VLS_Props = {
71
29
  */
72
30
  shouldRenderItem?: (item: FieldListItem | FieldListItemTyped) => boolean;
73
31
  };
74
- declare const canEdit: import("vue").Ref<boolean, boolean>;
75
- declare const fieldKey: ComputedRef<string | undefined>;
76
- declare const fieldListType: ComputedRef<"default">;
77
- declare const filteredList: ComputedRef<FieldListItemTyped[]>;
78
- declare const __VLS_ctx: InstanceType<__VLS_PickNotAny<typeof __VLS_self, new () => {}>>;
79
- declare var __VLS_1: {
80
- items: FieldListItemTyped[];
81
- }, __VLS_14: {
82
- items: FieldListItemTyped[];
83
- };
84
- type __VLS_Slots = __VLS_PrettifyGlobal<__VLS_OmitStringIndex<typeof __VLS_ctx.$slots> & {
85
- default?: (props: typeof __VLS_1) => any;
86
- } & {
87
- after?: (props: typeof __VLS_14) => any;
88
- }>;
89
- declare const __VLS_self: import("vue").DefineComponent<__VLS_Props, {
90
- BlokkliItem: typeof BlokkliItem;
91
- DraggableList: typeof DraggableList;
92
- attrs: typeof attrs;
93
- isEditing: typeof isEditing;
94
- isGlobalProxyMode: typeof isGlobalProxyMode;
95
- isInReusable: typeof isInReusable;
96
- isPreview: typeof isPreview;
97
- isNested: typeof isNested;
98
- nestingLevel: typeof nestingLevel;
99
- entity: typeof entity;
100
- providerEntity: typeof providerEntity;
101
- canEdit: typeof canEdit;
102
- fieldKey: typeof fieldKey;
103
- fieldListType: typeof fieldListType;
104
- filteredList: typeof filteredList;
105
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
106
- list: Array<FieldListItem | null | undefined> | FieldListItem | null;
107
- fieldListType: ValidFieldListTypes;
108
- allowedFragments: BlokkliFragmentName[];
109
- tag: string;
110
- dropAlignment: "vertical" | "horizontal";
111
- shouldRenderItem: (item: FieldListItem | FieldListItemTyped) => boolean;
112
- listClass: string;
113
- editClass: string;
114
- nonEmptyClass: string;
115
- }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
116
32
  declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
117
33
  list: Array<FieldListItem | null | undefined> | FieldListItem | null;
118
34
  fieldListType: ValidFieldListTypes;
@@ -72,6 +72,7 @@ import {
72
72
  INJECT_ENTITY_CONTEXT,
73
73
  INJECT_PROVIDER_CONTEXT
74
74
  } from "../helpers/symbols";
75
+ defineSlots();
75
76
  const PreviewProvider = defineAsyncComponent(
76
77
  () => import("./Edit/PreviewProvider.vue")
77
78
  );
@@ -106,7 +107,7 @@ const isEditing = computed(
106
107
  () => props.canEdit && !!props.entityUuid && route.query.blokkliEditing === props.entityUuid
107
108
  );
108
109
  const isPreviewing = computed(
109
- () => props.entityUuid && route.query.blokkliPreview === props.entityUuid
110
+ () => !!props.entityUuid && route.query.blokkliPreview === props.entityUuid
110
111
  );
111
112
  const showIndicator = computed(
112
113
  () => props.canEdit && !route.query.blokkliEditing && !route.query.blokkliPreview
@@ -1,4 +1,4 @@
1
- declare const _default: <T>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
1
+ declare const _default: <T extends object>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
2
2
  props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{} & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>, never> & {
3
3
  entity?: T;
4
4
  entityType: string;
@@ -17,28 +17,12 @@ declare const _default: <T>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>
17
17
  expose(exposed: import("vue").ShallowUnwrapRef<{}>): void;
18
18
  attrs: any;
19
19
  slots: {
20
- default?: (((props: {
21
- entity: any;
20
+ default(props: {
22
21
  isEditing: boolean;
23
22
  canEdit: boolean;
24
- isPreview: true;
25
- }) => any) & ((props: {
26
- isEditing: true;
27
- canEdit: boolean;
28
- isPreview: false | "";
29
- entity: any;
30
- }) => any) & ((props: {
31
- isEditing: boolean;
32
- canEdit: boolean;
33
- isPreview: boolean | "";
34
- entity: [{
35
- type: import("vue").PropType<__VLS_NonUndefinedable<T>>;
36
- default: undefined;
37
- }] extends [import("vue").Prop<infer V, infer D>] ? unknown extends V ? keyof V extends never ? import("@vue/shared").IfAny<V, V, D> : V : V : {
38
- type: import("vue").PropType<__VLS_NonUndefinedable<T>>;
39
- default: undefined;
40
- };
41
- }) => any)) | undefined;
23
+ isPreview: boolean;
24
+ entity?: T | undefined;
25
+ }): any;
42
26
  };
43
27
  emit: {};
44
28
  }>) => import("vue").VNode & {
@@ -48,4 +32,3 @@ export default _default;
48
32
  type __VLS_PrettifyLocal<T> = {
49
33
  [K in keyof T]: T[K];
50
34
  } & {};
51
- type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
@@ -15,17 +15,17 @@
15
15
  <div class="bk-fatal-error-overlay-info">
16
16
  <Icon name="sad" />
17
17
  <div>
18
- <h2>{{ $t('fatalErrorTitle', 'bl\xF6kkli has stopped working') }}</h2>
18
+ <h2>{{ $t("fatalErrorTitle", "bl\xF6kkli has stopped working") }}</h2>
19
19
  <p>
20
20
  {{
21
21
  $t(
22
- 'fatalErrorText',
23
- 'Unfortunately bl\xF6kkli has encountered a fatal error which prevents it from working normally. You may be able to continue using it, but things may not work as expected.'
22
+ "fatalErrorText",
23
+ "Unfortunately bl\xF6kkli has encountered a fatal error which prevents it from working normally. You may be able to continue using it, but things may not work as expected."
24
24
  )
25
25
  }}
26
26
  </p>
27
27
  <button class="bk-button bk-is-danger" @click="errors = []">
28
- {{ $t('fatalErrorButton', 'Continue anyway...') }}
28
+ {{ $t("fatalErrorButton", "Continue anyway...") }}
29
29
  </button>
30
30
  </div>
31
31
  </div>
@@ -12,14 +12,14 @@
12
12
  <div v-if="!state.stateAvailable.value" class="bk-state-unavailable">
13
13
  <h2>
14
14
  {{
15
- $t('stateUnavailableTitle', 'The edit state could not be loaded.')
15
+ $t("stateUnavailableTitle", "The edit state could not be loaded.")
16
16
  }}
17
17
  </h2>
18
18
  <p>
19
19
  {{
20
20
  $t(
21
- 'stateUnavailableText',
22
- 'This could be due to missing permissions or a temporary problem. Please try again later.'
21
+ "stateUnavailableText",
22
+ "This could be due to missing permissions or a temporary problem. Please try again later."
23
23
  )
24
24
  }}
25
25
  </p>
@@ -102,6 +102,7 @@ const props = defineProps({
102
102
  language: { type: String, required: false, default: "en" },
103
103
  isolate: { type: Boolean, required: false }
104
104
  });
105
+ defineSlots();
105
106
  const context = computed(() => {
106
107
  return {
107
108
  entityType: props.entityType,
@@ -11,10 +11,10 @@ declare const _default: <T>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>
11
11
  expose(exposed: import("vue").ShallowUnwrapRef<{}>): void;
12
12
  attrs: any;
13
13
  slots: {
14
- default?: ((props: {
14
+ default(props: {
15
+ mutatedEntity: T;
15
16
  key: string;
16
- mutatedEntity: any;
17
- }) => any) | undefined;
17
+ }): any;
18
18
  };
19
19
  emit: {};
20
20
  }>) => import("vue").VNode & {
@@ -10,13 +10,13 @@
10
10
  <p class="bk-lead">
11
11
  {{
12
12
  $t(
13
- \"assistantDialogLead\",
14
- \"Please enter what you"d like the assistant to generate.\"
13
+ "assistantDialogLead",
14
+ "Please enter what you'd like the assistant to generate."
15
15
  )
16
16
  }}
17
17
  </p>
18
18
  <label class="bk-form-label" for="assistant_prompt">
19
- {{ $t('assistantPromptLabel', 'Prompt') }}
19
+ {{ $t("assistantPromptLabel", "Prompt") }}
20
20
  </label>
21
21
  <div class="bk-assistant-form-textarea">
22
22
  <textarea
@@ -56,7 +56,7 @@
56
56
  </div>
57
57
  <template #footer>
58
58
  <button class="bk-button bk-is-primary" @click="onSubmit">
59
- {{ $t('assistantDialogSubmit', 'Create blocks') }}
59
+ {{ $t("assistantDialogSubmit", "Create blocks") }}
60
60
  </button>
61
61
  </template>
62
62
  </FormOverlay>
@@ -19,7 +19,7 @@
19
19
  v-if="!pastedItems.length"
20
20
  class="bk bk-clipboard-info bk-sidebar-padding"
21
21
  >
22
- <h4>{{ $t('clipboardEmpty', 'No items in the clipboard') }}</h4>
22
+ <h4>{{ $t("clipboardEmpty", "No items in the clipboard") }}</h4>
23
23
  <div
24
24
  v-if="!ui.isMobile.value"
25
25
  v-html="
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <div class="bk-blokkli-item-actions-comment-dropdown" @keydown.capture.stop>
3
3
  <label for="comment_body" class="bk-form-label">{{
4
- $t('commentBody', 'Comment')
4
+ $t("commentBody", "Comment")
5
5
  }}</label>
6
6
  <textarea
7
7
  id="comment_body"
@@ -12,7 +12,7 @@
12
12
  required
13
13
  />
14
14
  <button class="bk-button bk-is-primary" @click="$emit('add', comment)">
15
- {{ $t('commentSave', 'Submit comment') }}
15
+ {{ $t("commentSave", "Submit comment") }}
16
16
  </button>
17
17
  </div>
18
18
  </template>
@@ -14,7 +14,7 @@
14
14
  @click.capture.stop="$emit('resolve')"
15
15
  >
16
16
  <Icon name="check" />
17
- <span>{{ $t('commentsMarkAsResolved', 'Resolve') }}</span>
17
+ <span>{{ $t("commentsMarkAsResolved", "Resolve") }}</span>
18
18
  </button>
19
19
  </div>
20
20
  </template>
@@ -28,7 +28,7 @@
28
28
  <span
29
29
  >{{ comments.length }}
30
30
  {{
31
- comments.length === 1 ? $t('singleComment', 'comment') : $t('comments', 'Comments')
31
+ comments.length === 1 ? $t("singleComment", "comment") : $t("comments", "Comments")
32
32
  }}</span
33
33
  >
34
34
  </div>
@@ -49,7 +49,7 @@
49
49
  class="bk-button bk-is-primary bk-is-small"
50
50
  @click="addComment"
51
51
  >
52
- {{ $t('commentAdd', 'Add comment') }}
52
+ {{ $t("commentAdd", "Add comment") }}
53
53
  </button>
54
54
  </div>
55
55
  </div>
@@ -3,10 +3,10 @@
3
3
  <table class="bk-diff-table">
4
4
  <thead>
5
5
  <tr>
6
- <th>{{ $t('diffTableChange', 'Change') }}</th>
7
- <th>{{ $t('diffTableBundle', 'Type') }}</th>
8
- <th>{{ $t('diffTableProperty', 'Property') }}</th>
9
- <th>{{ $t('diffTableDiff', 'Diff') }}</th>
6
+ <th>{{ $t("diffTableChange", "Change") }}</th>
7
+ <th>{{ $t("diffTableBundle", "Type") }}</th>
8
+ <th>{{ $t("diffTableProperty", "Property") }}</th>
9
+ <th>{{ $t("diffTableDiff", "Diff") }}</th>
10
10
  </tr>
11
11
  </thead>
12
12
  <tbody>
@@ -20,16 +20,16 @@
20
20
  v-if="item.status === 'added'"
21
21
  class="bk-diff-status-label bk-is-added"
22
22
  >
23
- {{ $t('diffStatusAdded', 'Added') }}
23
+ {{ $t("diffStatusAdded", "Added") }}
24
24
  </div>
25
25
  <div
26
26
  v-else-if="item.status === 'removed'"
27
27
  class="bk-diff-status-label bk-is-removed"
28
28
  >
29
- {{ $t('diffStatusDeleted', 'Deleted') }}
29
+ {{ $t("diffStatusDeleted", "Deleted") }}
30
30
  </div>
31
31
  <div v-else class="bk-diff-status-label">
32
- {{ $t('diffStatusEdited', 'Edited') }}
32
+ {{ $t("diffStatusEdited", "Edited") }}
33
33
  </div>
34
34
  </td>
35
35
  <td
@@ -13,11 +13,11 @@
13
13
  </h3>
14
14
  <button @click.prevent="cancel">
15
15
  <Icon name="close" />
16
- <span>{{ $t('cancel', 'Cancel') }}</span>
16
+ <span>{{ $t("cancel", "Cancel") }}</span>
17
17
  </button>
18
18
  <button :disabled="!hasChanged" type="submit" @click.prevent="save">
19
19
  <Icon name="save" />
20
- <span>{{ $t('save', 'Save') }}</span>
20
+ <span>{{ $t("save", "Save") }}</span>
21
21
  </button>
22
22
  </div>
23
23
 
@@ -9,8 +9,8 @@
9
9
  <p class="bk-lead">
10
10
  {{
11
11
  $t(
12
- 'fragmentsPlaceDialogLead',
13
- 'Select a block fragment to add to the page.'
12
+ "fragmentsPlaceDialogLead",
13
+ "Select a block fragment to add to the page."
14
14
  )
15
15
  }}
16
16
  </p>
@@ -18,7 +18,7 @@
18
18
  <div class="bk-form-group">
19
19
  <div>
20
20
  <label class="bk-form-label" for="library_search">
21
- {{ $t('fragmentsPlaceDialogSearchLabel', 'Filter fragments') }}
21
+ {{ $t("fragmentsPlaceDialogSearchLabel", "Filter fragments") }}
22
22
  </label>
23
23
  <input
24
24
  id="fragments_search"
@@ -56,7 +56,7 @@
56
56
  </div>
57
57
  <template #footer>
58
58
  <button class="bk-button bk-is-primary" @click="onSubmit">
59
- {{ $t('fragmentsPlaceDialogSubmitButton', 'Add selected fragment') }}
59
+ {{ $t("fragmentsPlaceDialogSubmitButton", "Add selected fragment") }}
60
60
  </button>
61
61
  </template>
62
62
  </FormOverlay>
@@ -14,11 +14,11 @@
14
14
  :disabled="tour.isTouring.value"
15
15
  @click="tour.isTouring.value = true"
16
16
  >
17
- {{ $t('tourLabel', 'Take a tour') }}
17
+ {{ $t("tourLabel", "Take a tour") }}
18
18
  </button>
19
19
  </div>
20
20
  <div class="bk-help-section">
21
- <h3>{{ $t('featureHelpShortcuts', 'Shortcuts') }}</h3>
21
+ <h3>{{ $t("featureHelpShortcuts", "Shortcuts") }}</h3>
22
22
  <Shortcuts />
23
23
  </div>
24
24
  </div>
@@ -41,8 +41,8 @@
41
41
  <button class="bk-history-item-button" @click="showAmount += 100">
42
42
  <strong
43
43
  >{{
44
- $t('historyShowMore', 'Show @count more').replace(
45
- '@count',
44
+ $t("historyShowMore", "Show @count more").replace(
45
+ "@count",
46
46
  Math.min(totalMutations - showAmount, 100).toString()
47
47
  )
48
48
  }}
@@ -59,7 +59,7 @@
59
59
  <button class="bk-history-item-button" @click="setHistoryIndex(-1)">
60
60
  <div>
61
61
  <strong>{{
62
- $t('historyCurrentRevision', 'Current revision')
62
+ $t("historyCurrentRevision", "Current revision")
63
63
  }}</strong>
64
64
  </div>
65
65
  <!-- @TODO: Pass in the timestamp of the entity's latest revision. -->
@@ -74,7 +74,7 @@
74
74
  </li>
75
75
  </ul>
76
76
  <div v-else class="bk-history-empty-message">
77
- {{ $t('historyEmpty', 'There are now changes yet.') }}
77
+ {{ $t("historyEmpty", "There are now changes yet.") }}
78
78
  </div>
79
79
  </div>
80
80
  </template>
@@ -19,8 +19,8 @@
19
19
  <h3 class="bk-form-label">
20
20
  {{
21
21
  $t(
22
- 'importExistingFieldsLabel',
23
- 'Which content would you like to import?'
22
+ "importExistingFieldsLabel",
23
+ "Which content would you like to import?"
24
24
  )
25
25
  }}
26
26
  </h3>
@@ -32,8 +32,8 @@
32
32
  <div class="bk-form-section">
33
33
  <label for="pb_search_term" class="bk-form-label">{{
34
34
  $t(
35
- 'importExistingPagesLabel',
36
- 'From which page would you like to import?'
35
+ "importExistingPagesLabel",
36
+ "From which page would you like to import?"
37
37
  )
38
38
  }}</label>
39
39
  <input
@@ -47,7 +47,7 @@
47
47
  </div>
48
48
  <div>
49
49
  {{
50
- $t('importExistingResultsTitle', '@count of @total pages').replace('@count', entities.length.toString()).replace('@total', total.toString())
50
+ $t("importExistingResultsTitle", "@count of @total pages").replace("@count", entities.length.toString()).replace("@total", total.toString())
51
51
  }}
52
52
  </div>
53
53
  <div
@@ -5,13 +5,13 @@
5
5
  <header v-show="isLoaded" class="bk bk-library-edit-overlay-header">
6
6
  <h2>
7
7
  <span>{{
8
- $t('libraryItemEditOverlayTitle', 'Edit reusable block')
8
+ $t("libraryItemEditOverlayTitle", "Edit reusable block")
9
9
  }}</span>
10
10
  <span v-if="label">&nbsp;{{ label }}</span>
11
11
  </h2>
12
12
  <button @click.prevent="closeOverlay">
13
13
  <Icon name="arrow-left" />
14
- <span>{{ $t('libraryItemEditOverlayBack', 'Back to page') }}</span>
14
+ <span>{{ $t("libraryItemEditOverlayBack", "Back to page") }}</span>
15
15
  </button>
16
16
  </header>
17
17
  </Transition>
@@ -10,8 +10,8 @@
10
10
  <p class="bk-lead">
11
11
  {{
12
12
  $t(
13
- 'libraryPlaceDialogLead',
14
- 'Select a reusable block from the library to add it to your layout. You can detach the block later.'
13
+ "libraryPlaceDialogLead",
14
+ "Select a reusable block from the library to add it to your layout. You can detach the block later."
15
15
  )
16
16
  }}
17
17
  </p>
@@ -19,7 +19,7 @@
19
19
  <div class="bk-form-group">
20
20
  <div>
21
21
  <label class="bk-form-label" for="library_search">
22
- {{ $t('libraryPlaceSearchLabel', 'Filter library items') }}
22
+ {{ $t("libraryPlaceSearchLabel", "Filter library items") }}
23
23
  </label>
24
24
  <input
25
25
  id="library_search"
@@ -37,7 +37,7 @@
37
37
  </div>
38
38
  <div>
39
39
  <label class="bk-form-label" for="library_bundle">
40
- {{ $t('libraryPlaceBundleSelectLabel', 'Bundle') }}
40
+ {{ $t("libraryPlaceBundleSelectLabel", "Bundle") }}
41
41
  </label>
42
42
  <select
43
43
  id="library_bundle"
@@ -78,7 +78,7 @@
78
78
 
79
79
  <template #footer>
80
80
  <button class="bk-button bk-is-primary" @click="onSubmit">
81
- {{ $t('libraryPlaceDialogSubmit', 'Add reusable block') }}
81
+ {{ $t("libraryPlaceDialogSubmit", "Add reusable block") }}
82
82
  </button>
83
83
  </template>
84
84
  </FormOverlay>
@@ -24,7 +24,7 @@
24
24
  "
25
25
  />
26
26
  <label for="reusable_label" class="bk-form-label">{{
27
- $t('libraryDialogDescriptionLabel', 'Description')
27
+ $t("libraryDialogDescriptionLabel", "Description")
28
28
  }}</label>
29
29
  <input
30
30
  id="reusable_label"
@@ -38,7 +38,7 @@
38
38
  />
39
39
  </div>
40
40
  <div class="bk-form-label">
41
- {{ $t('libraryPreviewLabel', 'Preview') }}
41
+ {{ $t("libraryPreviewLabel", "Preview") }}
42
42
  </div>
43
43
  <div
44
44
  class="bk-dialog-content-element"
@@ -66,7 +66,7 @@
66
66
 
67
67
  <div v-if="selected.length" class="bk-media-library-cancel">
68
68
  <button class="bk-button bk-is-primary" @click.prevent="selected = []">
69
- {{ $t('cancelSelection', 'Cancel selection') }}
69
+ {{ $t("cancelSelection", "Cancel selection") }}
70
70
  </button>
71
71
  </div>
72
72
 
@@ -42,7 +42,7 @@
42
42
  "
43
43
  >
44
44
  {{
45
- typeof option.value === 'string' ? option.value : option.value.label
45
+ typeof option.value === "string" ? option.value : option.value.label
46
46
  }}
47
47
  </span>
48
48
  </div>
@@ -13,7 +13,7 @@
13
13
  "
14
14
  />
15
15
  <button class="bk-button bk-is-danger" @click="takeOwnership">
16
- {{ $t('ownershipTakeOwnership', 'Assign to me') }}
16
+ {{ $t("ownershipTakeOwnership", "Assign to me") }}
17
17
  </button>
18
18
  </div>
19
19
  </Teleport>
@@ -2,7 +2,7 @@
2
2
  <div class="bk-qr-code">
3
3
  <QrCodeVue :value="fullUrl" :size="430" level="H" />
4
4
  <p>
5
- {{ $t('previewQrCodeText', 'You can also copy the link and share it.') }}
5
+ {{ $t("previewQrCodeText", "You can also copy the link and share it.") }}
6
6
  </p>
7
7
  <input :value="fullUrl" class="bk-form-input" readonly @focus="onFocus" />
8
8
  </div>
@@ -50,8 +50,8 @@ const { adapter, settings } = defineBlokkliFeature({
50
50
  }
51
51
  });
52
52
  const route = useRoute();
53
- const { state, $t, broadcast, context } = useBlokkli();
54
- const { mutations, canEdit } = state;
53
+ const { state, $t, broadcast, context, eventBus } = useBlokkli();
54
+ const { mutations, canEdit, mutateWithLoadingState } = state;
55
55
  const hasPublishOptions = !!adapter.getPublishOptions;
56
56
  const isPublished = computed(() => !!state.entity.value.status);
57
57
  const showDialog = ref(false);
@@ -82,6 +82,24 @@ const onMenuClick = async () => {
82
82
  await publishCurrent();
83
83
  };
84
84
  async function publishCurrent() {
85
+ const success = await mutateWithLoadingState(
86
+ () => adapter.publish({
87
+ hostEntityType: context.value.entityType,
88
+ hostEntityUuid: context.value.entityUuid,
89
+ closeAfterPublish: settings.value.closeAfterPublish
90
+ }),
91
+ $t("publishError", "Changes could not be published."),
92
+ $t("publishSuccess", "Changes published successfully.")
93
+ );
94
+ if (!success) {
95
+ const validations = state.violations.value;
96
+ if (validations.length) {
97
+ eventBus.emit("publish:failed");
98
+ eventBus.emit("sidebar:open", "violations");
99
+ }
100
+ return;
101
+ }
102
+ onSubmit();
85
103
  }
86
104
  function onSubmit() {
87
105
  broadcast.emit("published", { uuid: context.value.entityUuid });
@@ -48,7 +48,7 @@
48
48
  class="bk-search-no-results"
49
49
  >
50
50
  <Icon name="sad" />
51
- <span>{{ $t('searchBoxNoResultsFound', 'No results found') }}</span>
51
+ <span>{{ $t("searchBoxNoResultsFound", "No results found") }}</span>
52
52
  </div>
53
53
  </div>
54
54
  </template>
@@ -67,6 +67,6 @@ onBlokkliEvent("keyPressed", (e) => {
67
67
 
68
68
  <script>
69
69
  export default {
70
- name: "Search"
70
+ name: "ContentSearch"
71
71
  };
72
72
  </script>
@@ -25,7 +25,7 @@
25
25
  <div class="bk-tour-buttons">
26
26
  <button @click.stop.prevent="prev">
27
27
  <Icon name="chevron-left" />
28
- <span>{{ $t('tourPrev', 'Previous') }}</span>
28
+ <span>{{ $t("tourPrev", "Previous") }}</span>
29
29
  <div class="bk-tooltip">
30
30
  <span>Arrow Right</span>
31
31
  <ShortcutIndicator label="Prev Tour Item" key-code="ArrowLeft" />
@@ -37,7 +37,7 @@
37
37
  <span>{{ items.length }}</span>
38
38
  </div>
39
39
  <button @click.stop.prevent="next">
40
- <span>{{ $t('tourNext', 'Next') }}</span>
40
+ <span>{{ $t("tourNext", "Next") }}</span>
41
41
  <Icon name="chevron-right" />
42
42
  <div class="bk-tooltip">
43
43
  <span>Arrow Left</span>
@@ -2,7 +2,7 @@
2
2
  <Teleport to="body">
3
3
  <ViewportBlockingRect id="tour-popup" class="bk bk-tour-popup">
4
4
  <div class="bk-tour-popup-title">
5
- <h2>{{ $t('tourLabel', 'Take a tour') }}</h2>
5
+ <h2>{{ $t("tourLabel", "Take a tour") }}</h2>
6
6
  <button class="bk-tour-popup-close" @click="$emit('close')">
7
7
  <Icon name="close" />
8
8
  </button>
@@ -12,14 +12,14 @@
12
12
  <p>
13
13
  {{
14
14
  $t(
15
- 'tourIntro',
16
- 'Explore the most important features of the editor and learn how to get started using bl\xF6kkli.'
15
+ "tourIntro",
16
+ "Explore the most important features of the editor and learn how to get started using bl\xF6kkli."
17
17
  )
18
18
  }}
19
19
  </p>
20
20
 
21
21
  <button class="bk-button" @click="$emit('start')">
22
- {{ $t('tourStartButton', 'Start the tour') }}
22
+ {{ $t("tourStartButton", "Start the tour") }}
23
23
  </button>
24
24
  </div>
25
25
  </ViewportBlockingRect>
@@ -3,7 +3,7 @@
3
3
  <Icon name="translate" />
4
4
  <p v-html="text" />
5
5
  <button class="bk-translations-banner-close" @click="onClick">
6
- {{ $t('translationsBannerButton', 'Edit source language instead') }}
6
+ {{ $t("translationsBannerButton", "Edit source language instead") }}
7
7
  <Icon name="close" />
8
8
  </button>
9
9
  </div>
@@ -22,7 +22,7 @@
22
22
  <figure>
23
23
  <Icon name="check" />
24
24
  </figure>
25
- <h3>{{ $t('validationsNoneFound', 'No validation errors found.') }}</h3>
25
+ <h3>{{ $t("validationsNoneFound", "No validation errors found.") }}</h3>
26
26
  </div>
27
27
  </div>
28
28
 
@@ -32,6 +32,7 @@ const props = defineProps({
32
32
  entityBundle: { type: String, required: true },
33
33
  language: { type: String, required: true }
34
34
  });
35
+ defineSlots();
35
36
  const context = computed(() => {
36
37
  return {
37
38
  entityType: props.entityType,
@@ -10,9 +10,9 @@ declare const _default: <T>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>
10
10
  expose(exposed: import("vue").ShallowUnwrapRef<{}>): void;
11
11
  attrs: any;
12
12
  slots: {
13
- default?: ((props: {
14
- mutatedEntity: any;
15
- }) => any) | undefined;
13
+ default(props: {
14
+ mutatedEntity: T;
15
+ }): any;
16
16
  };
17
17
  emit: {};
18
18
  }>) => import("vue").VNode & {
@@ -40,8 +40,8 @@
40
40
  <p>
41
41
  {{
42
42
  $t(
43
- 'systemRequirementsDialogText',
44
- 'bl\xF6kkli has been tested and optimized for the latest versions of Chrome, Firefox, Edge, and Safari. Features like WebGL are well supported, but they may sometimes be disabled for performance or security reasons.'
43
+ "systemRequirementsDialogText",
44
+ "bl\xF6kkli has been tested and optimized for the latest versions of Chrome, Firefox, Edge, and Safari. Features like WebGL are well supported, but they may sometimes be disabled for performance or security reasons."
45
45
  )
46
46
  }}
47
47
  </p>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blokkli/editor",
3
- "version": "2.0.0-alpha.1",
3
+ "version": "2.0.0-alpha.3",
4
4
  "description": "Interactive page building experience for Nuxt",
5
5
  "repository": "blokkli/editor",
6
6
  "type": "module",
@@ -70,7 +70,7 @@
70
70
  "@ckeditor/ckeditor5-build-classic": "^43.1.0",
71
71
  "@ckeditor/ckeditor5-vue": "^7.0.0",
72
72
  "@nuxt/devtools": "latest",
73
- "@nuxt/eslint-config": "^0.5.7",
73
+ "@nuxt/eslint-config": "^1.3.0",
74
74
  "@nuxt/kit": "^3.16.2",
75
75
  "@nuxt/module-builder": "^1.0.1",
76
76
  "@nuxt/schema": "^3.16.2",
@@ -84,9 +84,9 @@
84
84
  "@vue/test-utils": "^2.4.6",
85
85
  "changelogen": "^0.5.5",
86
86
  "cypress": "^13.14.2",
87
- "eslint": "^8.57.0",
88
- "eslint-plugin-sonarjs": "^2.0.2",
89
- "eslint-plugin-tailwindcss": "^3.17.4",
87
+ "eslint": "^9.24.0",
88
+ "eslint-plugin-sonarjs": "^3.0.2",
89
+ "eslint-plugin-tailwindcss": "^3.18.0",
90
90
  "gettext-parser": "^8.0.0",
91
91
  "happy-dom": "^15.7.4",
92
92
  "nuxt": "^3.16.2",
@@ -107,8 +107,5 @@
107
107
  "vite-plugin-glsl": "^1.3.0",
108
108
  "vitepress": "^1.3.4",
109
109
  "vitest": "^2.0.5"
110
- },
111
- "overrides": {
112
- "@parcel/watcher": "~2.1.0"
113
110
  }
114
111
  }