@blokkli/editor 2.0.0-alpha.47 → 2.0.0-alpha.49

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 (42) hide show
  1. package/dist/chunks/tailwindConfig.mjs +222 -0
  2. package/dist/global/types/definitions.d.ts +1 -1
  3. package/dist/module.d.mts +2 -2
  4. package/dist/module.json +1 -1
  5. package/dist/module.mjs +164 -16
  6. package/dist/modules/agent/index.d.mts +1 -1
  7. package/dist/modules/agent/index.mjs +6 -29
  8. package/dist/modules/charts/index.d.mts +1 -1
  9. package/dist/modules/charts/index.mjs +3 -3
  10. package/dist/modules/charts/runtime/features/charts/Editor/index.d.vue.ts +1 -0
  11. package/dist/modules/charts/runtime/features/charts/Editor/index.vue +50 -53
  12. package/dist/modules/charts/runtime/features/charts/Editor/index.vue.d.ts +1 -0
  13. package/dist/modules/drupal/index.d.mts +1 -1
  14. package/dist/modules/drupal/index.mjs +1 -1
  15. package/dist/modules/index.d.mts +7 -0
  16. package/dist/{shared/editor.CGf7C_0M.mjs → modules/index.mjs} +1 -1
  17. package/dist/modules/table-of-contents/index.d.mts +1 -1
  18. package/dist/modules/table-of-contents/index.mjs +1 -1
  19. package/dist/modules/tailwind/index.d.mts +5 -0
  20. package/dist/modules/tailwind/index.mjs +2 -0
  21. package/dist/runtime/editor/components/NestedEditorOverlay/index.vue +4 -4
  22. package/dist/runtime/editor/css/output.css +1 -1
  23. package/dist/runtime/editor/features/add-list/index.vue +1 -1
  24. package/dist/runtime/editor/features/anchors/Overlay/index.vue +25 -7
  25. package/dist/runtime/editor/features/changelog/changelog.json +9 -1
  26. package/dist/runtime/editor/features/complex-options/index.vue +98 -0
  27. package/dist/runtime/editor/features/dragging-overlay/index.vue +29 -13
  28. package/dist/runtime/editor/features/media-library/Library/FilterSelect/index.d.vue.ts +15 -0
  29. package/dist/runtime/editor/features/media-library/Library/FilterSelect/index.vue +168 -0
  30. package/dist/runtime/editor/features/media-library/Library/FilterSelect/index.vue.d.ts +15 -0
  31. package/dist/runtime/editor/features/media-library/Library/index.vue +21 -16
  32. package/dist/runtime/editor/providers/keyboard.js +8 -5
  33. package/dist/runtime/editor/translations/de.json +22 -14
  34. package/dist/runtime/editor/translations/fr.json +21 -13
  35. package/dist/runtime/editor/translations/gsw_CH.json +459 -451
  36. package/dist/runtime/editor/translations/it.json +21 -13
  37. package/dist/shared/{editor.BVregnEC.d.mts → editor.DsGJIlGn.d.mts} +19 -2
  38. package/dist/types.d.mts +1 -1
  39. package/package.json +36 -1
  40. package/dist/modules/charts/runtime/features/charts/index.vue +0 -72
  41. /package/dist/{modules/charts/runtime/features/charts → runtime/editor/features/complex-options}/index.d.vue.ts +0 -0
  42. /package/dist/{modules/charts/runtime/features/charts → runtime/editor/features/complex-options}/index.vue.d.ts +0 -0
@@ -0,0 +1,222 @@
1
+ import plugin from 'tailwindcss/plugin';
2
+
3
+ const z = (index, key) => {
4
+ return `calc(var(--bk-z-index-base) + ${index}) /* "${key}" */`;
5
+ };
6
+ const zIndexKeys = [
7
+ "main-layout",
8
+ "canvas-overlay",
9
+ "animation-canvas",
10
+ "selection",
11
+ "analyze-tooltip",
12
+ "interaction-overlay",
13
+ "comments-overlay",
14
+ "comments-overlay-active",
15
+ "artboard-scrollbar",
16
+ "artboard-overview",
17
+ "translations-banner-mobile",
18
+ "editable-field",
19
+ "translations-banner-desktop",
20
+ "actions",
21
+ "sidebar",
22
+ "sidebar-tabs",
23
+ "toolbar",
24
+ "selection-add",
25
+ "add-buttons-label",
26
+ "add-list",
27
+ "add-list-info",
28
+ "tour-popup",
29
+ "preview",
30
+ "toolbar-dropdown",
31
+ "drop-targets",
32
+ "dragging-overlay",
33
+ "touch-action-bar",
34
+ "tour-overlay",
35
+ "tour-item",
36
+ "context-menu",
37
+ "search",
38
+ "resizable",
39
+ "transform-overlay",
40
+ "overlay",
41
+ "sidebar-detached",
42
+ "form-overlay",
43
+ "form-overlay-header",
44
+ "dialog",
45
+ "messages",
46
+ "menu",
47
+ "command-palette",
48
+ "library-edit-dialog",
49
+ "nested-editor-overlay-bg",
50
+ "nested-editor-overlay-iframe",
51
+ "init-overlay"
52
+ ];
53
+ const zIndexCssVars = ["sidebar-detached"];
54
+ const zIndex = zIndexKeys.reduce((acc, key, index) => {
55
+ acc[key] = z(index * 1e4, key);
56
+ return acc;
57
+ }, {});
58
+ const tailwindConfig = {
59
+ content: [],
60
+ corePlugins: {
61
+ preflight: false,
62
+ container: false
63
+ },
64
+ theme: {
65
+ fontFamily: {
66
+ sans: ["PB Inter, sans-serif"],
67
+ mono: ["monospace"]
68
+ },
69
+ colors: {
70
+ accent: {
71
+ 50: "rgb(var(--bk-theme-accent-50) / <alpha-value>)",
72
+ 100: "rgb(var(--bk-theme-accent-100) / <alpha-value>)",
73
+ 200: "rgb(var(--bk-theme-accent-200) / <alpha-value>)",
74
+ 300: "rgb(var(--bk-theme-accent-300) / <alpha-value>)",
75
+ 400: "rgb(var(--bk-theme-accent-400) / <alpha-value>)",
76
+ 500: "rgb(var(--bk-theme-accent-500) / <alpha-value>)",
77
+ 600: "rgb(var(--bk-theme-accent-600) / <alpha-value>)",
78
+ 700: "rgb(var(--bk-theme-accent-700) / <alpha-value>)",
79
+ 800: "rgb(var(--bk-theme-accent-800) / <alpha-value>)",
80
+ 900: "rgb(var(--bk-theme-accent-900) / <alpha-value>)",
81
+ 950: "rgb(var(--bk-theme-accent-950) / <alpha-value>)"
82
+ },
83
+ mono: {
84
+ 50: "rgb(var(--bk-theme-mono-50) / <alpha-value>)",
85
+ 100: "rgb(var(--bk-theme-mono-100) / <alpha-value>)",
86
+ 200: "rgb(var(--bk-theme-mono-200) / <alpha-value>)",
87
+ 300: "rgb(var(--bk-theme-mono-300) / <alpha-value>)",
88
+ 400: "rgb(var(--bk-theme-mono-400) / <alpha-value>)",
89
+ 500: "rgb(var(--bk-theme-mono-500) / <alpha-value>)",
90
+ 600: "rgb(var(--bk-theme-mono-600) / <alpha-value>)",
91
+ 700: "rgb(var(--bk-theme-mono-700) / <alpha-value>)",
92
+ 800: "rgb(var(--bk-theme-mono-800) / <alpha-value>)",
93
+ 900: "rgb(var(--bk-theme-mono-900) / <alpha-value>)",
94
+ 950: "rgb(var(--bk-theme-mono-950) / <alpha-value>)"
95
+ },
96
+ teal: {
97
+ light: "rgb(var(--bk-theme-teal-light) / <alpha-value>)",
98
+ normal: "rgb(var(--bk-theme-teal-normal) / <alpha-value>)",
99
+ dark: "rgb(var(--bk-theme-teal-dark) / <alpha-value>)"
100
+ },
101
+ yellow: {
102
+ light: "rgb(var(--bk-theme-yellow-light) / <alpha-value>)",
103
+ normal: "rgb(var(--bk-theme-yellow-normal) / <alpha-value>)",
104
+ dark: "rgb(var(--bk-theme-yellow-dark) / <alpha-value>)"
105
+ },
106
+ red: {
107
+ light: "rgb(var(--bk-theme-red-light) / <alpha-value>)",
108
+ normal: "rgb(var(--bk-theme-red-normal) / <alpha-value>)",
109
+ dark: "rgb(var(--bk-theme-red-dark) / <alpha-value>)"
110
+ },
111
+ lime: {
112
+ light: "rgb(var(--bk-theme-lime-light) / <alpha-value>)",
113
+ normal: "rgb(var(--bk-theme-lime-normal) / <alpha-value>)",
114
+ dark: "rgb(var(--bk-theme-lime-dark) / <alpha-value>)"
115
+ },
116
+ orange: {
117
+ light: "rgb(var(--bk-theme-orange-light) / <alpha-value>)",
118
+ normal: "rgb(var(--bk-theme-orange-normal) / <alpha-value>)",
119
+ dark: "rgb(var(--bk-theme-orange-dark) / <alpha-value>)"
120
+ },
121
+ scheme: {
122
+ light: "rgb(var(--bk-scheme-light, var(--bk-theme-accent-100)) / <alpha-value>)",
123
+ normal: "rgb(var(--bk-scheme-normal, var(--bk-theme-accent-600)) / <alpha-value>)",
124
+ dark: "rgb(var(--bk-scheme-dark, var(--bk-theme-accent-800)) / <alpha-value>)",
125
+ text: "rgb(var(--bk-scheme-text, var(--bk-scheme-dark)) / <alpha-value>)"
126
+ },
127
+ white: "white",
128
+ black: "black",
129
+ transparent: "transparent",
130
+ current: "currentColor"
131
+ },
132
+ extend: {
133
+ screens: {
134
+ "3xl": "1920px"
135
+ },
136
+ transitionTimingFunction: {
137
+ swing: "cubic-bezier(0.56, 0.04, 0.25, 1)"
138
+ },
139
+ zIndex: {
140
+ ...zIndex
141
+ },
142
+ boxShadow: {
143
+ sm: "0 1px 2px 0 rgb(0 0 0 / 0.05)",
144
+ DEFAULT: "0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)",
145
+ md: "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)",
146
+ "md-even": "0 0px 10px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)",
147
+ lg: "0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)",
148
+ xl: "0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)",
149
+ "2xl": "0 25px 50px -12px rgb(0 0 0 / 0.25)",
150
+ inner: "inset 0 2px 4px 0 rgb(0 0 0 / 0.05)",
151
+ none: "none",
152
+ "lg-inverted": "0 -10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)",
153
+ "xl-inverted": "0 -20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)",
154
+ "xl-left": "-20px 0px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)",
155
+ "xl-even": "0 0px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)"
156
+ }
157
+ },
158
+ spacing: {
159
+ 770: "770px",
160
+ 340: "340px",
161
+ 300: "300px",
162
+ 200: "200px",
163
+ 120: "120px",
164
+ 100: "100px",
165
+ 90: "90px",
166
+ 80: "80px",
167
+ 70: "70px",
168
+ 60: "60px",
169
+ 50: "50px",
170
+ 40: "40px",
171
+ 30: "30px",
172
+ 25: "25px",
173
+ 24: "24px",
174
+ 20: "20px",
175
+ 18: "18px",
176
+ 15: "15px",
177
+ 10: "10px",
178
+ 8: "8px",
179
+ 5: "5px",
180
+ 3: "3px",
181
+ 2: "2px",
182
+ 1: "1px",
183
+ 0: "0px",
184
+ "offset-t": "var(--bk-root-offset-top)",
185
+ "offset-r": "var(--bk-root-offset-right)",
186
+ "offset-b": "var(--bk-root-offset-bottom)",
187
+ scrollbar: "var(--bk-artboard-scrollbar-size)",
188
+ "sidebar-right": "var(--bk-sidebar-width-right)",
189
+ "toolbar-left": "var(--bk-toolbar-left-width)"
190
+ },
191
+ borderWidth: {
192
+ DEFAULT: "1px",
193
+ 0: "0",
194
+ 2: "2px",
195
+ 3: "3px",
196
+ 4: "4px"
197
+ }
198
+ },
199
+ plugins: [
200
+ plugin(function({ addVariant, addBase }) {
201
+ addVariant(
202
+ "mobile-only",
203
+ "@media screen and (max-width: theme('screens.sm'))"
204
+ );
205
+ const cssVars = zIndexCssVars.reduce(
206
+ (acc, key) => {
207
+ const index = zIndexKeys.indexOf(key);
208
+ if (index !== -1) {
209
+ acc[`--bk-z-index-${key}`] = `calc(var(--bk-z-index-base) + ${index * 1e4})`;
210
+ }
211
+ return acc;
212
+ },
213
+ {}
214
+ );
215
+ addBase({
216
+ ":root": cssVars
217
+ });
218
+ })
219
+ ]
220
+ };
221
+
222
+ export { tailwindConfig as default };
@@ -2,7 +2,7 @@ import type { BlockOptionDefinitionBase } from './blockOptions';
2
2
  export type BlockDefinitionOptionsInputBase = {
3
3
  [key: string]: BlockOptionDefinitionBase;
4
4
  };
5
- export type BlokkliDefinitionAddBehaviour = 'no-form' | 'form' | `editable:${string}`;
5
+ export type BlokkliDefinitionAddBehaviour = 'no-form' | 'form' | `editable:${string}` | `complex-option:${string}`;
6
6
  export type BlockDefinitionRenderForParentBase<BundleWithNested extends string = string> = {
7
7
  parentBundle: BundleWithNested;
8
8
  };
package/dist/module.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { NuxtModule } from 'nuxt/schema';
2
- import { M as ModuleOptions } from './shared/editor.BVregnEC.mjs';
3
- export { a as ModuleHooks } from './shared/editor.BVregnEC.mjs';
2
+ import { M as ModuleOptions } from './shared/editor.DsGJIlGn.mjs';
3
+ export { a as ModuleHooks } from './shared/editor.DsGJIlGn.mjs';
4
4
  import 'consola';
5
5
  import '../dist/global/types/definitions.js';
6
6
  import '../dist/global/types/theme.js';
package/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@blokkli/editor",
3
3
  "configKey": "blokkli",
4
- "version": "2.0.0-alpha.47",
4
+ "version": "2.0.0-alpha.49",
5
5
  "compatibility": {
6
6
  "nuxt": ">=3.15.0"
7
7
  },
package/dist/module.mjs CHANGED
@@ -1,11 +1,11 @@
1
- import { resolveAlias, resolveFiles, createResolver, addComponent, addImports, addTemplate, useLogger, defineNuxtModule, addPlugin, addBuildPlugin } from '@nuxt/kit';
1
+ import { resolveAlias, resolveFiles, createResolver, addComponent, addImports, addTemplate, useLogger, defineNuxtModule, addPlugin, addBuildPlugin, updateTemplates } from '@nuxt/kit';
2
+ import path__default, { basename, dirname as dirname$1, resolve as resolve$1, join } from 'node:path';
2
3
  import { createUnplugin } from 'unplugin';
3
4
  import MagicString from 'magic-string';
4
5
  import { walk } from 'estree-walker-ts';
5
6
  import { pathToFileURL } from 'node:url';
6
7
  import { parseURL, parseQuery } from 'ufo';
7
8
  import { C as Collector, a as CollectedFile, b as extractObjectLiteral, p as parseTsObject, t as toValidVariableName, o as onlyUnique, f as falsy, s as sortObjectKeys } from './shared/editor.9vf8ZnOp.mjs';
8
- import path__default, { basename, dirname as dirname$1 } from 'node:path';
9
9
  import { dirname, resolve, relative } from 'pathe';
10
10
  import micromatch from 'micromatch';
11
11
  import { hash } from 'ohash';
@@ -18,7 +18,7 @@ import 'typescript';
18
18
  import 'oxc-walker';
19
19
 
20
20
  const name = "@blokkli/editor";
21
- const version = "2.0.0-alpha.47";
21
+ const version = "2.0.0-alpha.49";
22
22
 
23
23
  function validateOption(optionKey, option, icons) {
24
24
  const errors = [];
@@ -809,16 +809,32 @@ const BlokkliEditingPlugin = (nuxt) => {
809
809
  }
810
810
  },
811
811
  vite: {
812
- handleHotUpdate({ file, server }) {
813
- if (file.endsWith(".vue") && !file.includes(EDITING_MARKER)) {
812
+ hotUpdate: {
813
+ order: "post",
814
+ async handler({ file, modules, server }) {
815
+ if (!file.endsWith(".vue") || file.includes(EDITING_MARKER)) {
816
+ return;
817
+ }
814
818
  const editingVariantPath = file.replace(
815
819
  /\.vue$/,
816
820
  `${EDITING_MARKER}.vue`
817
821
  );
818
- const editingModule = server.moduleGraph.getModuleById(editingVariantPath);
819
- if (editingModule) {
820
- server.reloadModule(editingModule);
822
+ const environment = server.environments["client"];
823
+ if (!environment) {
824
+ return;
825
+ }
826
+ const editingModules = environment.moduleGraph.getModulesByFile(editingVariantPath);
827
+ if (!editingModules || editingModules.size === 0) {
828
+ return;
829
+ }
830
+ const mainModule = [...editingModules].find(
831
+ (m) => !m.url.includes("?")
832
+ );
833
+ if (mainModule) {
834
+ environment.moduleGraph.invalidateModule(mainModule);
835
+ await environment.transformRequest(mainModule.url);
821
836
  }
837
+ return [...modules, ...editingModules];
822
838
  }
823
839
  }
824
840
  }
@@ -1126,6 +1142,25 @@ class ModuleHelper {
1126
1142
  path + "/*"
1127
1143
  ];
1128
1144
  }
1145
+ /**
1146
+ * Add a directory to the app TypeScript tsconfig includes.
1147
+ */
1148
+ addAppTsInclude(absolutePath) {
1149
+ const rel = relative(this.nuxt.options.buildDir, absolutePath);
1150
+ this.nuxt.options.typescript.tsConfig ||= {};
1151
+ this.nuxt.options.typescript.tsConfig.include ||= [];
1152
+ this.nuxt.options.typescript.tsConfig.include.push(rel);
1153
+ }
1154
+ /**
1155
+ * Add a directory to the server/Nitro TypeScript tsconfig includes.
1156
+ */
1157
+ addServerTsInclude(absolutePath) {
1158
+ const rel = relative(this.nuxt.options.buildDir, absolutePath);
1159
+ this.nuxt.options.nitro.typescript ||= {};
1160
+ this.nuxt.options.nitro.typescript.tsConfig ||= {};
1161
+ this.nuxt.options.nitro.typescript.tsConfig.include ||= [];
1162
+ this.nuxt.options.nitro.typescript.tsConfig.include.push(rel);
1163
+ }
1129
1164
  /**
1130
1165
  * Add a path to Nitro's externals.inline for server-side usage.
1131
1166
  * @see https://github.com/nuxt/nuxt/issues/28995
@@ -1175,7 +1210,21 @@ class ModuleContext {
1175
1210
  adapterExtensions = [];
1176
1211
  featureFragments = /* @__PURE__ */ new Set();
1177
1212
  complexOptionTypes = /* @__PURE__ */ new Map();
1213
+ cssFiles = [];
1214
+ additionalIcons = [];
1178
1215
  collectors = [];
1216
+ addCSS(filePath) {
1217
+ this.cssFiles.push(filePath);
1218
+ }
1219
+ getCSSFiles() {
1220
+ return this.cssFiles;
1221
+ }
1222
+ addIcon(...names) {
1223
+ this.additionalIcons.push(...names);
1224
+ }
1225
+ getAdditionalIcons() {
1226
+ return this.additionalIcons;
1227
+ }
1179
1228
  addFeatureFragment(name) {
1180
1229
  if (this.featureFragments.has(name)) {
1181
1230
  throw new Error(`A feature fragment with name "${name}" already exists.`);
@@ -1551,7 +1600,8 @@ const icons = defineCodeTemplate(
1551
1600
  ...blockIcons,
1552
1601
  ...featureIcons,
1553
1602
  ...USED_MATERIAL_ICONS,
1554
- ...globalOptionsIcons
1603
+ ...globalOptionsIcons,
1604
+ ...ctx.getAdditionalIcons()
1555
1605
  ].filter(falsy).filter(onlyUnique);
1556
1606
  for (const file of files) {
1557
1607
  const name = basename(file.filePath, ".svg").toLowerCase();
@@ -1781,16 +1831,94 @@ export default adapterExtensions
1781
1831
  }
1782
1832
  );
1783
1833
 
1784
- const styles = defineFileTemplate("styles.css", (ctx) => {
1785
- const cssFilePath = ctx.helper.resolvers.module.resolve(
1786
- "./runtime/editor/css/output.css"
1787
- );
1788
- return `
1834
+ let processor = null;
1835
+ async function processCSS(css, from) {
1836
+ if (!processor) {
1837
+ processor = await createProcessor();
1838
+ }
1839
+ const result = await processor.process(css, { from: from || "module.css" });
1840
+ return result.css;
1841
+ }
1842
+ function resetProcessor() {
1843
+ processor = null;
1844
+ }
1845
+ async function createProcessor() {
1846
+ const _require = createRequire(import.meta.url);
1847
+ try {
1848
+ const postcss = _require("postcss");
1849
+ const { default: tailwindConfig } = await import('./chunks/tailwindConfig.mjs');
1850
+ const plugins = [
1851
+ _require("postcss-import"),
1852
+ _require("tailwindcss/nesting"),
1853
+ _require("tailwindcss")({
1854
+ ...tailwindConfig,
1855
+ // Empty content prevents Tailwind from scanning the project.
1856
+ // @apply directives are resolved regardless of content scanning.
1857
+ content: [{ raw: " ", extension: "html" }]
1858
+ }),
1859
+ // Same scoping rules as postcss.config.cjs: scope selectors to .bk
1860
+ // and rename Tailwind CSS variables from --tw-* to --bk-tw-*.
1861
+ _require("postcss-replace")({
1862
+ pattern: /(--tw|\*, ::before, ::after)/g,
1863
+ data: {
1864
+ "--tw": "--bk-tw",
1865
+ "*, ::before, ::after": ".bk, .bk *, .bk-sidebar, .bk ::before, .bk ::after, .bk-vars, .bk-vars ::before, .bk-vars ::after",
1866
+ "::backdrop": ".bk::backdrop, .bk ::backdrop"
1867
+ }
1868
+ }),
1869
+ _require("@thedutchcoder/postcss-rem-to-px")({ baseValue: 16 })
1870
+ ];
1871
+ return postcss(plugins);
1872
+ } catch (e) {
1873
+ if (e.code === "MODULE_NOT_FOUND") {
1874
+ const missing = e.message.match(/Cannot find module '([^']+)'/)?.[1] || "unknown";
1875
+ throw new Error(
1876
+ `Missing dependency "${missing}" required for processing module CSS.
1877
+ Install the required PostCSS packages:
1878
+ npm install -D postcss tailwindcss postcss-import postcss-replace @thedutchcoder/postcss-rem-to-px`
1879
+ );
1880
+ }
1881
+ throw e;
1882
+ }
1883
+ }
1884
+
1885
+ const logger$1 = useLogger("@blokkli/editor");
1886
+ const styles = defineFileTemplate(
1887
+ "styles.css",
1888
+ async (ctx) => {
1889
+ const cssFilePath = ctx.helper.resolvers.module.resolve(
1890
+ "./runtime/editor/css/output.css"
1891
+ );
1892
+ let moduleCSS = "";
1893
+ const cssFiles = ctx.getCSSFiles();
1894
+ if (cssFiles.length > 0) {
1895
+ resetProcessor();
1896
+ const processed = [];
1897
+ for (const filePath of cssFiles) {
1898
+ const content = await ctx.helper.fileCache.read(filePath);
1899
+ try {
1900
+ const result = await processCSS(content, filePath);
1901
+ processed.push(result);
1902
+ } catch (e) {
1903
+ logger$1.error(
1904
+ `Failed to process module CSS "${filePath}":
1905
+ ${e.message}`
1906
+ );
1907
+ }
1908
+ }
1909
+ if (processed.length > 0) {
1910
+ moduleCSS = "\n/* Module CSS */\n" + processed.join("\n");
1911
+ }
1912
+ }
1913
+ return `
1789
1914
  @import url("${cssFilePath}");
1790
1915
 
1791
1916
  ${ctx.theme.css}
1917
+ ${moduleCSS}
1792
1918
  `;
1793
- });
1919
+ },
1920
+ { dependencies: ["module-css"] }
1921
+ );
1794
1922
 
1795
1923
  function mapVars(ctx) {
1796
1924
  return {
@@ -3570,6 +3698,7 @@ const complexOptionTypes = defineCodeTemplate(
3570
3698
  editorComponent: defineAsyncComponent(() => import('${ctx.helper.toModuleBuildRelative(t.editorComponentPath)}')),
3571
3699
  editorButtonLabel: '${t.editorButtonLabel}',
3572
3700
  editorIcon: '${t.editorIcon}',
3701
+ editorTitle: '${t.editorTitle || t.editorButtonLabel}',
3573
3702
  }`
3574
3703
  ).join(",\n");
3575
3704
  return `import { defineAsyncComponent } from 'vue'
@@ -3590,15 +3719,17 @@ export const COMPLEX_OPTION_TYPES: Record<string, never>`;
3590
3719
  const entries = types.map((t) => ` '${t.id}': ${t.typeName}`).join("\n");
3591
3720
  return `${imports}
3592
3721
  import type { BlokkliIcon } from './icons'
3722
+ import type { Component } from 'vue'
3593
3723
 
3594
3724
  export interface ComplexOptionTypeMap {
3595
3725
  ${entries}
3596
3726
  }
3597
3727
 
3598
3728
  export const COMPLEX_OPTION_TYPES: Record<string, {
3599
- editorComponent: import('vue').Component
3729
+ editorComponent: Component
3600
3730
  editorButtonLabel: string
3601
3731
  editorIcon: BlokkliIcon
3732
+ editorTitle: string
3602
3733
  }>`;
3603
3734
  },
3604
3735
  {
@@ -3922,6 +4053,9 @@ const module$1 = defineNuxtModule({
3922
4053
  "#blokkli/runtime-helpers",
3923
4054
  resolver.resolve("runtime/helpers/runtimeHelpers")
3924
4055
  );
4056
+ const blokkliModulesDir = resolve$1(nuxt.options.rootDir, "blokkli/modules");
4057
+ helper.addAppTsInclude(join(blokkliModulesDir, "*/app"));
4058
+ helper.addServerTsInclude(join(blokkliModulesDir, "*/server"));
3925
4059
  nuxt.hook("nitro:config", (nitroConfig) => {
3926
4060
  nitroConfig.publicAssets ||= [];
3927
4061
  nitroConfig.publicAssets.push({
@@ -3942,6 +4076,9 @@ const module$1 = defineNuxtModule({
3942
4076
  );
3943
4077
  addBuildPlugin(BlokkliEditingPlugin(nuxt));
3944
4078
  if (nuxt.options.dev) {
4079
+ for (const cssFile of context.getCSSFiles()) {
4080
+ nuxt.options.watch.push(dirname$1(cssFile));
4081
+ }
3945
4082
  nuxt.hook("builder:watch", async (event, providedFilePath) => {
3946
4083
  const filePath = providedFilePath.startsWith("/") ? providedFilePath : helper.resolvers.src.resolve(providedFilePath);
3947
4084
  helper.fileCache.handleWatchEvent(event, filePath);
@@ -3953,8 +4090,19 @@ const module$1 = defineNuxtModule({
3953
4090
  dependenciesToUpdate.push(...collector.getDependencyTypes());
3954
4091
  }
3955
4092
  }
4093
+ const cssFiles = context.getCSSFiles();
4094
+ if (cssFiles.length > 0) {
4095
+ const cssFileDirs = cssFiles.map((f) => dirname$1(f));
4096
+ const isModuleCSSRelated = cssFiles.some(
4097
+ (cssFile, i) => filePath === cssFile || filePath.startsWith(cssFileDirs[i] + "/")
4098
+ );
4099
+ if (isModuleCSSRelated) {
4100
+ dependenciesToUpdate.push("module-css");
4101
+ }
4102
+ }
3956
4103
  if (dependenciesToUpdate.length) {
3957
4104
  await context.generateTemplates(dependenciesToUpdate);
4105
+ await updateTemplates();
3958
4106
  }
3959
4107
  });
3960
4108
  }
@@ -1,4 +1,4 @@
1
- import { B as BlokkliModule } from '../../shared/editor.BVregnEC.mjs';
1
+ import { B as BlokkliModule } from '../../shared/editor.DsGJIlGn.mjs';
2
2
  import 'nuxt/schema';
3
3
  import 'consola';
4
4
  import '../../../dist/global/types/definitions.js';
@@ -1,7 +1,7 @@
1
1
  import { resolveFiles, createResolver, addServerHandler } from '@nuxt/kit';
2
2
  import { fileURLToPath } from 'node:url';
3
3
  import * as path from 'node:path';
4
- import { d as defineBlokkliModule } from '../../shared/editor.CGf7C_0M.mjs';
4
+ import { defineBlokkliModule } from '../index.mjs';
5
5
  import * as fs from 'node:fs';
6
6
  import { C as Collector, a as CollectedFile, e as extractStringProperty } from '../../shared/editor.9vf8ZnOp.mjs';
7
7
  import { d as defineCodeTemplate } from '../../shared/editor.6D5vApr0.mjs';
@@ -651,22 +651,10 @@ export default defineNuxtConfig({
651
651
  ]
652
652
  });
653
653
  ctx.context.addCollector(promptsCollector);
654
- const relativeToolsDir = path.relative(
655
- nuxt.options.buildDir,
656
- projectToolsDir
657
- );
658
- nuxt.options.typescript.tsConfig ||= {};
659
- nuxt.options.typescript.tsConfig.include ||= [];
660
- nuxt.options.typescript.tsConfig.include.push(relativeToolsDir);
661
- const relativePromptsDir = path.relative(
662
- nuxt.options.buildDir,
663
- projectPromptsDir
664
- );
665
- nuxt.options.typescript.tsConfig.include.push(relativePromptsDir);
654
+ ctx.helper.addAppTsInclude(projectToolsDir);
655
+ ctx.helper.addAppTsInclude(projectPromptsDir);
666
656
  for (const dir of moduleBlokkliDirs) {
667
- const toolsDir = path.join(dir, "tools");
668
- const relDir = path.relative(nuxt.options.buildDir, toolsDir);
669
- nuxt.options.typescript.tsConfig.include.push(relDir);
657
+ ctx.helper.addAppTsInclude(path.join(dir, "tools"));
670
658
  }
671
659
  const moduleSkillsDir = moduleResolver.resolve(
672
660
  "./runtime/server/default-skills"
@@ -746,20 +734,9 @@ export default defineNuxtConfig({
746
734
  route: routes.routing,
747
735
  handler: moduleResolver.resolve("./runtime/server/route")
748
736
  });
749
- const relativeSkillsDir = path.relative(
750
- nuxt.options.buildDir,
751
- projectSkillsDir
752
- );
753
- const relativeSystemPromptsDir = path.relative(
754
- nuxt.options.buildDir,
755
- projectSystemPromptsDir
756
- );
737
+ ctx.helper.addServerTsInclude(projectSkillsDir);
738
+ ctx.helper.addServerTsInclude(projectSystemPromptsDir);
757
739
  nuxt.hook("nitro:config", (nitroConfig) => {
758
- nitroConfig.typescript ||= {};
759
- nitroConfig.typescript.tsConfig ||= {};
760
- nitroConfig.typescript.tsConfig.include ||= [];
761
- nitroConfig.typescript.tsConfig.include.push(relativeSkillsDir);
762
- nitroConfig.typescript.tsConfig.include.push(relativeSystemPromptsDir);
763
740
  nitroConfig.rollupConfig ||= {};
764
741
  nitroConfig.rollupConfig.plugins ||= [];
765
742
  nitroConfig.rollupConfig.plugins.push(
@@ -1,4 +1,4 @@
1
- import { B as BlokkliModule } from '../../shared/editor.BVregnEC.mjs';
1
+ import { B as BlokkliModule } from '../../shared/editor.DsGJIlGn.mjs';
2
2
  import 'nuxt/schema';
3
3
  import 'consola';
4
4
  import '../../../dist/global/types/definitions.js';
@@ -1,5 +1,5 @@
1
1
  import { createResolver } from '@nuxt/kit';
2
- import { d as defineBlokkliModule } from '../../shared/editor.CGf7C_0M.mjs';
2
+ import { defineBlokkliModule } from '../index.mjs';
3
3
  import { fileURLToPath } from 'node:url';
4
4
  import { d as defineCodeTemplate } from '../../shared/editor.6D5vApr0.mjs';
5
5
 
@@ -34,7 +34,6 @@ const index = defineBlokkliModule({
34
34
  options.blokkliDirs.push(resolve("./runtime/blokkli"));
35
35
  },
36
36
  setup({ context, helper, $t }, options) {
37
- context.features.addFile(resolve("./runtime/features/charts/index.vue"));
38
37
  context.addTemplate(chartsConfigTemplate(options));
39
38
  helper.addAlias("#blokkli/charts/types", resolve("./runtime/types"));
40
39
  helper.addAlias(
@@ -49,7 +48,8 @@ const index = defineBlokkliModule({
49
48
  "./runtime/features/charts/Editor/index.vue"
50
49
  ),
51
50
  editorButtonLabel: $t("chartsEditButton", "Edit chart..."),
52
- editorIcon: "bk_mdi_area_chart"
51
+ editorIcon: "bk_mdi_area_chart",
52
+ editorTitle: $t("chartsEditorTitle", "Edit chart")
53
53
  });
54
54
  }
55
55
  });
@@ -1,5 +1,6 @@
1
1
  import type { BlokkliChartData } from '../../../types.js';
2
2
  type __VLS_Props = {
3
+ data: BlokkliChartData | null;
3
4
  uuid: string;
4
5
  optionKey: string;
5
6
  };