@node-projects/web-component-designer 0.0.267 → 0.0.269

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 (36) hide show
  1. package/dist/elements/helper/NpmPackageLoader.d.ts +2 -1
  2. package/dist/elements/helper/NpmPackageLoader.js +89 -22
  3. package/dist/elements/item/DesignItem.d.ts +1 -0
  4. package/dist/elements/item/DesignItem.js +12 -0
  5. package/dist/elements/services/DefaultServiceBootstrap.js +2 -2
  6. package/dist/elements/services/copyPasteService/CopyPasteAsJsonService.js +10 -0
  7. package/dist/elements/services/demoProviderService/DemoProviderService.js +11 -2
  8. package/dist/elements/services/demoProviderService/IframeDemoProviderService copy.d.ts +6 -0
  9. package/dist/elements/services/demoProviderService/IframeDemoProviderService copy.js +38 -0
  10. package/dist/elements/services/demoProviderService/IframeDemoProviderService.d.ts +6 -0
  11. package/dist/elements/services/demoProviderService/IframeDemoProviderService.js +38 -0
  12. package/dist/elements/services/demoProviderService/SimpleDemoProviderService.d.ts +6 -0
  13. package/dist/elements/services/demoProviderService/SimpleDemoProviderService.js +27 -0
  14. package/dist/elements/services/designerAddons/IDesignerAddonJson copy.d.ts +3 -0
  15. package/dist/elements/services/designerAddons/IDesignerAddonJson copy.js +1 -0
  16. package/dist/elements/services/designerAddons/IDesignerAddonJson.d.ts +0 -3
  17. package/dist/elements/services/designerAddons/IDesignerInfoJson.d.ts +7 -0
  18. package/dist/elements/services/designerAddons/IDesignerInfoJson.js +19 -0
  19. package/dist/elements/services/dragDropService/ExternalDragDropService.d.ts +1 -1
  20. package/dist/elements/services/dragDropService/ExternalDragDropService.js +10 -16
  21. package/dist/elements/services/elementsService/WebcomponentManifestElementsService.js +6 -0
  22. package/dist/elements/services/propertiesService/DefaultEditorTypesService.js +5 -0
  23. package/dist/elements/services/propertiesService/propertyEditors/FontPropertyEditor.d.ts +9 -0
  24. package/dist/elements/services/propertiesService/propertyEditors/FontPropertyEditor.js +37 -0
  25. package/dist/elements/services/propertiesService/propertyEditors/SelectPropertyEditor copy.d.ts +7 -0
  26. package/dist/elements/services/propertiesService/propertyEditors/SelectPropertyEditor copy.js +28 -0
  27. package/dist/elements/services/propertiesService/services/CssProperties.json +3 -1
  28. package/dist/elements/services/propertiesService/services/CssPropertiesService.js +1 -0
  29. package/dist/elements/widgets/debugView/debug-view.js +6 -1
  30. package/dist/elements/widgets/designerView/DesignContext.d.ts +1 -0
  31. package/dist/elements/widgets/designerView/DesignContext.js +1 -0
  32. package/dist/elements/widgets/designerView/IDesignContext.d.ts +1 -0
  33. package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +1 -0
  34. package/dist/index.d.ts +2 -1
  35. package/dist/index.js +2 -1
  36. package/package.json +1 -1
@@ -6,12 +6,13 @@ export declare class NpmPackageLoader {
6
6
  private _dependecies;
7
7
  constructor(packageSource?: string);
8
8
  static patchCustomElementsRegistryToHandleErrors(): void;
9
- loadNpmPackage(pkg: string, serviceContainer: ServiceContainer, paletteTree: PaletteTreeView, loadAllImports: boolean, reportState?: (state: string) => void): Promise<void>;
9
+ loadNpmPackage(pkg: string, serviceContainer?: ServiceContainer, paletteTree?: PaletteTreeView, loadAllImports?: boolean, reportState?: (state: string) => void): Promise<void>;
10
10
  loadDependency(dependency: string, version?: string, reportState?: (state: string) => void): Promise<void>;
11
11
  addToImportmap(baseUrl: string, packageJsonObj: {
12
12
  name?: string;
13
13
  module?: string;
14
14
  main?: string;
15
+ unpkg?: string;
15
16
  exports?: Record<string, string>;
16
17
  }): Promise<void>;
17
18
  }
@@ -83,37 +83,44 @@ export class NpmPackageLoader {
83
83
  console.warn("github custom elments json fallback", err);
84
84
  }
85
85
  }
86
- fetch(webComponentDesignerUrl).then(async (x) => {
87
- if (x.ok) {
88
- const webComponentDesignerJson = await x.json();
89
- if (webComponentDesignerJson.services) {
90
- for (let o in webComponentDesignerJson.services) {
91
- for (let s of webComponentDesignerJson.services[o]) {
92
- if (s.startsWith('./'))
93
- s = s.substring(2);
94
- //@ts-ignore
95
- const classDefinition = (await importShim(baseUrl + s)).default;
96
- //@ts-ignore
97
- serviceContainer.register(o, new classDefinition());
86
+ if (serviceContainer) {
87
+ fetch(webComponentDesignerUrl).then(async (x) => {
88
+ if (x.ok) {
89
+ const webComponentDesignerJson = await x.json();
90
+ if (webComponentDesignerJson.services) {
91
+ for (let o in webComponentDesignerJson.services) {
92
+ for (let s of webComponentDesignerJson.services[o]) {
93
+ if (s.startsWith('./'))
94
+ s = s.substring(2);
95
+ //@ts-ignore
96
+ const classDefinition = (await importShim(baseUrl + s)).default;
97
+ //@ts-ignore
98
+ serviceContainer.register(o, new classDefinition());
99
+ }
98
100
  }
99
101
  }
100
102
  }
101
- }
102
- });
103
+ });
104
+ }
103
105
  if (customElementsJson.ok) {
104
106
  const customElementsJsonObj = await customElementsJson.json();
105
107
  let elements = new WebcomponentManifestElementsService(packageJsonObj.name, elementsRootPath, customElementsJsonObj);
106
- serviceContainer.register('elementsService', elements);
107
- let properties = new WebcomponentManifestPropertiesService(packageJsonObj.name, customElementsJsonObj);
108
- serviceContainer.register('propertyService', properties);
108
+ if (serviceContainer)
109
+ serviceContainer.register('elementsService', elements);
110
+ if (serviceContainer) {
111
+ let properties = new WebcomponentManifestPropertiesService(packageJsonObj.name, customElementsJsonObj);
112
+ serviceContainer.register('propertyService', properties);
113
+ }
109
114
  if (loadAllImports) {
110
115
  for (let e of await elements.getElements()) {
111
116
  //@ts-ignore
112
117
  importShim(e.import);
113
118
  }
114
119
  }
115
- //todo: should be retriggered by service container, or changeing list in container
116
- paletteTree.loadControls(serviceContainer, serviceContainer.elementsServices);
120
+ if (serviceContainer && paletteTree) {
121
+ //todo: should be retriggered by service container, or changeing list in container
122
+ paletteTree.loadControls(serviceContainer, serviceContainer.elementsServices);
123
+ }
117
124
  }
118
125
  else {
119
126
  console.warn('npm package: ' + pkg + ' - no custom-elements.json found, only loading javascript module');
@@ -153,7 +160,7 @@ export class NpmPackageLoader {
153
160
  else {
154
161
  console.warn('npm package: ' + pkg + ' - no entry point in package found.');
155
162
  }
156
- if (newElements.length > 0) {
163
+ if (newElements.length > 0 && serviceContainer && paletteTree) {
157
164
  const elementsCfg = {
158
165
  elements: newElements
159
166
  };
@@ -196,13 +203,73 @@ export class NpmPackageLoader {
196
203
  async addToImportmap(baseUrl, packageJsonObj) {
197
204
  //@ts-ignore
198
205
  const map = importShim.getImportMap().imports;
206
+ const importMap = { imports: {}, scopes: {} };
199
207
  if (!map.hasOwnProperty(packageJsonObj.name)) {
200
208
  //todo - use exports of package.json for importMap
201
- const importMap = { imports: {}, scopes: {} };
209
+ if (packageJsonObj.exports) {
210
+ /* "exports": {
211
+ ".": {
212
+ "browser": "./index.browser.js",
213
+ "default": "./index.js"
214
+ },
215
+ "./async": {
216
+ "browser": "./async/index.browser.js",
217
+ "default": "./async/index.js"
218
+ },
219
+ "./non-secure": "./non-secure/index.js",
220
+ "./package.json": "./package.json"
221
+ }
222
+
223
+ "exports": {
224
+ "node": {
225
+ "import": "./feature-node.mjs",
226
+ "require": "./feature-node.cjs"
227
+ },
228
+ "default": "./feature.mjs"
229
+ }
230
+
231
+
232
+ "exports": {
233
+ ".": "./index.js",
234
+ "./feature.js": {
235
+ "node": "./feature-node.js",
236
+ "default": "./feature.js"
237
+ }
238
+ }
239
+
240
+ */
241
+ /*
242
+ "exports": {
243
+ "import": "./index-module.js",
244
+ "require": "./index-require.cjs"
245
+ },
246
+ */
247
+ let getImport = (obj) => {
248
+ if (obj?.browser)
249
+ return obj.browser;
250
+ if (obj?.import)
251
+ return obj.import;
252
+ if (obj?.default)
253
+ return obj.default;
254
+ return obj?.node;
255
+ };
256
+ //Names to use: browser, import, default, node
257
+ let imp = getImport(packageJsonObj.exports);
258
+ if (imp) {
259
+ importMap.imports[packageJsonObj.name] = baseUrl + removeTrailing(imp, '/');
260
+ }
261
+ else if (imp = getImport(packageJsonObj?.['.'])) {
262
+ importMap.imports[packageJsonObj.name] = baseUrl + removeTrailing(imp, '/');
263
+ }
264
+ }
202
265
  let mainImport = packageJsonObj.main;
203
266
  if (packageJsonObj.module)
204
267
  mainImport = packageJsonObj.module;
205
- importMap.imports[packageJsonObj.name] = baseUrl + removeTrailing(mainImport, '/');
268
+ if (packageJsonObj.unpkg && !mainImport)
269
+ mainImport = packageJsonObj.unpkg;
270
+ if (!importMap.imports[packageJsonObj.name]) {
271
+ importMap.imports[packageJsonObj.name] = baseUrl + removeTrailing(mainImport, '/');
272
+ }
206
273
  importMap.imports[packageJsonObj.name + '/'] = baseUrl;
207
274
  //@ts-ignore
208
275
  importShim.addImportMap(importMap);
@@ -87,4 +87,5 @@ export declare class DesignItem implements IDesignItem {
87
87
  _removeChildInternal(designItem: IDesignItem): void;
88
88
  _refreshIfStyleSheet(): void;
89
89
  getPlacementService(style?: CSSStyleDeclaration): IPlacementService;
90
+ static createDesignItemFromImageBlob(serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, data: Blob): Promise<IDesignItem>;
90
91
  }
@@ -482,4 +482,16 @@ export class DesignItem {
482
482
  style ??= getComputedStyle(this.element);
483
483
  return this.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(this, style));
484
484
  }
485
+ static createDesignItemFromImageBlob(serviceContainer, instanceServiceContainer, data) {
486
+ return new Promise(resolve => {
487
+ let reader = new FileReader();
488
+ reader.onloadend = () => {
489
+ const img = document.createElement('img');
490
+ img.src = reader.result;
491
+ const di = DesignItem.createDesignItemFromInstance(img, serviceContainer, instanceServiceContainer);
492
+ return resolve(di);
493
+ };
494
+ reader.readAsDataURL(data);
495
+ });
496
+ }
485
497
  }
@@ -45,7 +45,6 @@ import { CopyPasteService } from './copyPasteService/CopyPasteService.js';
45
45
  import { DefaultModelCommandService } from './modelCommandService/DefaultModelCommandService.js';
46
46
  import { ButtonSeperatorProvider } from '../widgets/designerView/extensions/buttons/ButtonSeperatorProvider.js';
47
47
  import { GridExtensionDesignViewConfigButtons } from '../widgets/designerView/extensions/buttons/GridExtensionDesignViewConfigButtons.js';
48
- import { DemoProviderService } from './demoProviderService/DemoProviderService.js';
49
48
  import { DrawRectTool } from '../widgets/designerView/tools/DrawRectTool.js';
50
49
  import { DrawEllipsisTool } from '../widgets/designerView/tools/DrawEllipsisTool.js';
51
50
  import { DrawLineTool } from '../widgets/designerView/tools/DrawLineTool.js';
@@ -84,6 +83,7 @@ import { TransformToolButtonProvider } from '../widgets/designerView/tools/toolB
84
83
  import { MultipleSelectionRectExtensionProvider } from '../widgets/designerView/extensions/MultipleSelectionRectExtensionProvider.js';
85
84
  import { DragDropService } from './dragDropService/DragDropService.js';
86
85
  import { EventsService } from './eventsService/EventsService.js';
86
+ import { SimpleDemoProviderService } from './demoProviderService/SimpleDemoProviderService.js';
87
87
  export function createDefaultServiceContainer() {
88
88
  let serviceContainer = new ServiceContainer();
89
89
  let defaultPlacementService = new DefaultPlacementService();
@@ -107,7 +107,7 @@ export function createDefaultServiceContainer() {
107
107
  serviceContainer.register("dragDropService", new DragDropService());
108
108
  serviceContainer.register("copyPasteService", new CopyPasteService());
109
109
  serviceContainer.register("modelCommandService", new DefaultModelCommandService());
110
- serviceContainer.register("demoProviderService", new DemoProviderService());
110
+ serviceContainer.register("demoProviderService", new SimpleDemoProviderService());
111
111
  serviceContainer.register("eventsService", new EventsService());
112
112
  serviceContainer.register("undoService", (designerCanvas) => new UndoService(designerCanvas));
113
113
  serviceContainer.register("selectionService", (designerCanvas) => new SelectionService(designerCanvas, false));
@@ -1,5 +1,6 @@
1
1
  import { DomConverter } from "../../widgets/designerView/DomConverter.js";
2
2
  import { copyToClipboard, getFromClipboard, getTextFromClipboard } from "../../helper/ClipboardHelper.js";
3
+ import { DesignItem } from "../../item/DesignItem.js";
3
4
  export class CopyPasteAsJsonService {
4
5
  async copyItems(designItems) {
5
6
  const copyText = DomConverter.ConvertToString(designItems, false);
@@ -26,6 +27,15 @@ export class CopyPasteAsJsonService {
26
27
  data = await (await items[0].getType('application/json'))?.text();
27
28
  }
28
29
  catch { }
30
+ try {
31
+ let imageFmt = items[0].types.find(x => x.startsWith("image/"));
32
+ if (imageFmt) {
33
+ let imgData = await items[0].getType(imageFmt);
34
+ let di = await DesignItem.createDesignItemFromImageBlob(serviceContainer, instanceServiceContainer, imgData);
35
+ return [[di]];
36
+ }
37
+ }
38
+ catch { }
29
39
  }
30
40
  else {
31
41
  data = await getTextFromClipboard();
@@ -16,8 +16,17 @@ export class DemoProviderService {
16
16
  const doc = iframe.contentWindow.document;
17
17
  doc.open();
18
18
  doc.write('<script type="module">');
19
- for (let i of instanceServiceContainer.designContext.imports) {
20
- doc.write("import '" + i + "';");
19
+ if (instanceServiceContainer.designContext.npmPackages?.length) {
20
+ doc.write("import { NpmPackageLoader } from '../../helper/NpmPackageLoader.js'");
21
+ doc.write("let loader = new NpmPackageLoader();");
22
+ for (let p of instanceServiceContainer.designContext.npmPackages) {
23
+ doc.write("loader.loadNpmPackage('" + p + "', null, null, true);");
24
+ }
25
+ }
26
+ if (instanceServiceContainer.designContext.imports?.length) {
27
+ for (let i of instanceServiceContainer.designContext.imports) {
28
+ doc.write("import '" + i + "';");
29
+ }
21
30
  }
22
31
  doc.write("document.body.style.display='';");
23
32
  doc.write('</script>');
@@ -0,0 +1,6 @@
1
+ import { InstanceServiceContainer } from "../InstanceServiceContainer.js";
2
+ import { ServiceContainer } from "../ServiceContainer.js";
3
+ import { IDemoProviderService } from "./IDemoProviderService.js";
4
+ export declare class IframeDemoProviderService implements IDemoProviderService {
5
+ provideDemo(container: HTMLElement, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, code: string, style: string): Promise<void>;
6
+ }
@@ -0,0 +1,38 @@
1
+ import { DomHelper } from '@node-projects/base-custom-webcomponent/dist/DomHelper.js';
2
+ export class IframeDemoProviderService {
3
+ provideDemo(container, serviceContainer, instanceServiceContainer, code, style) {
4
+ return new Promise(resolve => {
5
+ const iframe = document.createElement('iframe');
6
+ iframe.style.width = '100%';
7
+ iframe.style.height = '100%';
8
+ iframe.style.border = 'none';
9
+ iframe.style.display = 'none';
10
+ DomHelper.removeAllChildnodes(container);
11
+ container.appendChild(iframe);
12
+ iframe.onload = () => {
13
+ iframe.style.display = 'block';
14
+ resolve();
15
+ };
16
+ const doc = iframe.contentWindow.document;
17
+ doc.open();
18
+ doc.write('<script type="module">');
19
+ if (instanceServiceContainer.designContext.npmPackages?.length) {
20
+ doc.write("import { NpmPackageLoader } from '../../helper/NpmPackageLoader.js'");
21
+ doc.write("let loader = new NpmPackageLoader();");
22
+ for (let p of instanceServiceContainer.designContext.npmPackages) {
23
+ doc.write("loader.loadNpmPackage('" + p + "', null, null, true);");
24
+ }
25
+ }
26
+ if (instanceServiceContainer.designContext.imports?.length) {
27
+ for (let i of instanceServiceContainer.designContext.imports) {
28
+ doc.write("import '" + i + "';");
29
+ }
30
+ }
31
+ doc.write("document.body.style.display='';");
32
+ doc.write('</script>');
33
+ doc.write('<style>' + (style ?? '') + '</style>');
34
+ doc.write('<body style="display:none; width: 100%; height: 100%; margin: 0; padding: 0; position: absolute;">' + code + '</body>');
35
+ doc.close();
36
+ });
37
+ }
38
+ }
@@ -0,0 +1,6 @@
1
+ import { InstanceServiceContainer } from "../InstanceServiceContainer.js";
2
+ import { ServiceContainer } from "../ServiceContainer.js";
3
+ import { IDemoProviderService } from "./IDemoProviderService.js";
4
+ export declare class IframeDemoProviderService implements IDemoProviderService {
5
+ provideDemo(container: HTMLElement, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, code: string, style: string): Promise<void>;
6
+ }
@@ -0,0 +1,38 @@
1
+ import { DomHelper } from '@node-projects/base-custom-webcomponent/dist/DomHelper.js';
2
+ export class IframeDemoProviderService {
3
+ provideDemo(container, serviceContainer, instanceServiceContainer, code, style) {
4
+ return new Promise(resolve => {
5
+ const iframe = document.createElement('iframe');
6
+ iframe.style.width = '100%';
7
+ iframe.style.height = '100%';
8
+ iframe.style.border = 'none';
9
+ iframe.style.display = 'none';
10
+ DomHelper.removeAllChildnodes(container);
11
+ container.appendChild(iframe);
12
+ iframe.onload = () => {
13
+ iframe.style.display = 'block';
14
+ resolve();
15
+ };
16
+ const doc = iframe.contentWindow.document;
17
+ doc.open();
18
+ doc.write('<script type="module">');
19
+ if (instanceServiceContainer.designContext.npmPackages?.length) {
20
+ doc.write("import { NpmPackageLoader } from '../../helper/NpmPackageLoader.js'");
21
+ doc.write("let loader = new NpmPackageLoader();");
22
+ for (let p of instanceServiceContainer.designContext.npmPackages) {
23
+ doc.write("loader.loadNpmPackage('" + p + "', null, null, true);");
24
+ }
25
+ }
26
+ if (instanceServiceContainer.designContext.imports?.length) {
27
+ for (let i of instanceServiceContainer.designContext.imports) {
28
+ doc.write("import '" + i + "';");
29
+ }
30
+ }
31
+ doc.write("document.body.style.display='';");
32
+ doc.write('</script>');
33
+ doc.write('<style>' + (style ?? '') + '</style>');
34
+ doc.write('<body style="display:none; width: 100%; height: 100%; margin: 0; padding: 0; position: absolute;">' + code + '</body>');
35
+ doc.close();
36
+ });
37
+ }
38
+ }
@@ -0,0 +1,6 @@
1
+ import { IDemoProviderService } from "./IDemoProviderService.js";
2
+ import { ServiceContainer } from "../ServiceContainer.js";
3
+ import { InstanceServiceContainer } from "../InstanceServiceContainer.js";
4
+ export declare class SimpleDemoProviderService implements IDemoProviderService {
5
+ provideDemo(container: HTMLElement, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, code: string): Promise<void>;
6
+ }
@@ -0,0 +1,27 @@
1
+ import { DomHelper, cssFromString } from "@node-projects/base-custom-webcomponent";
2
+ export class SimpleDemoProviderService {
3
+ async provideDemo(container, serviceContainer, instanceServiceContainer, code) {
4
+ const contentDiv = document.createElement('div');
5
+ let shadowRoot = contentDiv.attachShadow({ mode: 'open' });
6
+ contentDiv.style.width = '100%';
7
+ contentDiv.style.height = '100%';
8
+ contentDiv.style.border = 'none';
9
+ contentDiv.style.display = 'none';
10
+ contentDiv.style.overflow = 'auto';
11
+ contentDiv.style.position = 'absolute';
12
+ container.style.position = 'relative';
13
+ DomHelper.removeAllChildnodes(container);
14
+ container.appendChild(contentDiv);
15
+ let styles = [];
16
+ if (instanceServiceContainer.designerCanvas.additionalStyles)
17
+ styles.push(...instanceServiceContainer.designerCanvas.additionalStyles);
18
+ if (instanceServiceContainer.stylesheetService) {
19
+ styles.push(...instanceServiceContainer.stylesheetService
20
+ .getStylesheets()
21
+ .map(x => cssFromString(x.content)));
22
+ }
23
+ shadowRoot.adoptedStyleSheets = styles;
24
+ shadowRoot.innerHTML = code;
25
+ contentDiv.style.display = '';
26
+ }
27
+ }
@@ -0,0 +1,3 @@
1
+ export interface IDesignerAddonJson {
2
+ services: Record<string, string>;
3
+ }
@@ -1,6 +1,3 @@
1
1
  export interface IDesignerAddonJson {
2
2
  services: Record<string, string>;
3
- components: Record<string, {
4
- stylesheets: string[];
5
- }>;
6
3
  }
@@ -0,0 +1,7 @@
1
+ type ElementInfo = {
2
+ attributes: Record<string, string>;
3
+ styles: Record<string, string>;
4
+ content: Record<string, string>;
5
+ };
6
+ export type IDesignerInfoJson = Record<string, ElementInfo>;
7
+ export {};
@@ -0,0 +1,19 @@
1
+ export {};
2
+ /*
3
+ sample:
4
+
5
+ {
6
+ "my-tag" : {
7
+ "attributes" : {
8
+ "value": "abcd",
9
+ "max": "200",
10
+ ...
11
+ },
12
+ "styles" : {
13
+ "width": "100px",
14
+ ""
15
+ }
16
+ }
17
+ }
18
+
19
+ */
@@ -2,5 +2,5 @@ import { IDesignerCanvas } from "../../widgets/designerView/IDesignerCanvas.js";
2
2
  import { IExternalDragDropService } from "./IExternalDragDropService.js";
3
3
  export declare class ExternalDragDropService implements IExternalDragDropService {
4
4
  dragOver(event: DragEvent): 'none' | 'copy' | 'link' | 'move';
5
- drop(designerCanvas: IDesignerCanvas, event: DragEvent): void;
5
+ drop(designerCanvas: IDesignerCanvas, event: DragEvent): Promise<void>;
6
6
  }
@@ -6,23 +6,17 @@ export class ExternalDragDropService {
6
6
  return 'copy';
7
7
  return 'none';
8
8
  }
9
- drop(designerCanvas, event) {
9
+ async drop(designerCanvas, event) {
10
10
  if (event.dataTransfer.files[0].type.startsWith('image/')) {
11
- let reader = new FileReader();
12
- reader.onloadend = () => {
13
- const img = document.createElement('img');
14
- img.src = reader.result;
15
- const di = DesignItem.createDesignItemFromInstance(img, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
16
- let grp = di.openGroup("Insert of &lt;img&gt;");
17
- di.setStyle('position', 'absolute');
18
- const targetRect = event.target.getBoundingClientRect();
19
- di.setStyle('top', event.offsetY + targetRect.top - designerCanvas.containerBoundingRect.y + 'px');
20
- di.setStyle('left', event.offsetX + targetRect.left - designerCanvas.containerBoundingRect.x + 'px');
21
- designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
22
- grp.commit();
23
- requestAnimationFrame(() => designerCanvas.instanceServiceContainer.selectionService.setSelectedElements([di]));
24
- };
25
- reader.readAsDataURL(event.dataTransfer.files[0]);
11
+ let di = await DesignItem.createDesignItemFromImageBlob(designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer, event.dataTransfer.files[0]);
12
+ let grp = di.openGroup("Insert of &lt;img&gt;");
13
+ di.setStyle('position', 'absolute');
14
+ const targetRect = event.target.getBoundingClientRect();
15
+ di.setStyle('top', event.offsetY + targetRect.top - designerCanvas.containerBoundingRect.y + 'px');
16
+ di.setStyle('left', event.offsetX + targetRect.left - designerCanvas.containerBoundingRect.x + 'px');
17
+ designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
18
+ grp.commit();
19
+ requestAnimationFrame(() => designerCanvas.instanceServiceContainer.selectionService.setSelectedElements([di]));
26
20
  }
27
21
  }
28
22
  }
@@ -20,6 +20,12 @@ export class WebcomponentManifestElementsService {
20
20
  this._elementList.push(elDef);
21
21
  }
22
22
  }
23
+ for (let d of m.declarations) {
24
+ if (d.tagName) {
25
+ let elDef = { tag: d.tagName, import: removeTrailing(this._importPrefix, '/') + '/' + removeLeading(m.path, '/'), defaultWidth: "200px", defaultHeight: "200px", className: d.name };
26
+ this._elementList.push(elDef);
27
+ }
28
+ }
23
29
  if (this._resolveStored) {
24
30
  this._resolveStored.forEach(x => x(this._elementList));
25
31
  this._resolveStored = null;
@@ -7,6 +7,7 @@ import { TextPropertyEditor } from './propertyEditors/TextPropertyEditor.js';
7
7
  import { BooleanPropertyEditor } from './propertyEditors/BooleanPropertyEditor.js';
8
8
  import { ImageButtonListPropertyEditor } from './propertyEditors/ImageButtonListPropertyEditor.js';
9
9
  import { ThicknessPropertyEditor } from "./propertyEditors/ThicknessPropertyEditor.js";
10
+ import { FontPropertyEditor } from './propertyEditors/FontPropertyEditor.js';
10
11
  export class DefaultEditorTypesService {
11
12
  getEditorForProperty(property) {
12
13
  if (property.createEditor)
@@ -20,6 +21,10 @@ export class DefaultEditorTypesService {
20
21
  {
21
22
  return new ColorPropertyEditor(property);
22
23
  }
24
+ case "font":
25
+ {
26
+ return new FontPropertyEditor(property);
27
+ }
23
28
  case "date":
24
29
  {
25
30
  return new DatePropertyEditor(property);
@@ -0,0 +1,9 @@
1
+ import { IProperty } from '../IProperty.js';
2
+ import { BasePropertyEditor } from './BasePropertyEditor.js';
3
+ import { ValueType } from '../ValueType.js';
4
+ export declare class FontPropertyEditor extends BasePropertyEditor<HTMLSelectElement> {
5
+ static fontList: string[];
6
+ constructor(property: IProperty);
7
+ parseFontList(): void;
8
+ refreshValue(valueType: ValueType, value: any): void;
9
+ }
@@ -0,0 +1,37 @@
1
+ import { BasePropertyEditor } from './BasePropertyEditor.js';
2
+ export class FontPropertyEditor extends BasePropertyEditor {
3
+ static fontList;
4
+ constructor(property) {
5
+ super(property);
6
+ let element = document.createElement("select");
7
+ this.element = element;
8
+ if (FontPropertyEditor.fontList) {
9
+ this.parseFontList();
10
+ //@ts-ignore
11
+ }
12
+ else if (window.queryLocalFonts) {
13
+ //@ts-ignore
14
+ window.queryLocalFonts().then(x => {
15
+ //@ts-ignore
16
+ FontPropertyEditor.fontList = [...new Set(x.map(y => y.family))];
17
+ this.parseFontList();
18
+ });
19
+ }
20
+ else {
21
+ FontPropertyEditor.fontList = ["Verdana", "Arial", "Tahoma", "Trebuchet MS", "Times New Roman", "Georgia", "Garamond", "Courier New", "Brush Script MT"];
22
+ this.parseFontList();
23
+ }
24
+ }
25
+ parseFontList() {
26
+ for (let v of FontPropertyEditor.fontList) {
27
+ let option = document.createElement("option");
28
+ option.value = v;
29
+ option.text = v;
30
+ this.element.appendChild(option);
31
+ }
32
+ this.element.onchange = (e) => this._valueChanged(this.element.value);
33
+ }
34
+ refreshValue(valueType, value) {
35
+ this.element.value = value;
36
+ }
37
+ }
@@ -0,0 +1,7 @@
1
+ import { IProperty } from '../IProperty.js';
2
+ import { BasePropertyEditor } from './BasePropertyEditor.js';
3
+ import { ValueType } from '../ValueType.js';
4
+ export declare class SelectPropertyEditor extends BasePropertyEditor<HTMLSelectElement> {
5
+ constructor(property: IProperty);
6
+ refreshValue(valueType: ValueType, value: any): void;
7
+ }
@@ -0,0 +1,28 @@
1
+ import { BasePropertyEditor } from './BasePropertyEditor.js';
2
+ export class SelectPropertyEditor extends BasePropertyEditor {
3
+ constructor(property) {
4
+ super(property);
5
+ let element = document.createElement("select");
6
+ if (property.type == 'enum') {
7
+ for (let v of property.enumValues) {
8
+ let option = document.createElement("option");
9
+ option.value = v[1];
10
+ option.text = v[0];
11
+ element.appendChild(option);
12
+ }
13
+ }
14
+ else {
15
+ for (let v of property.values) {
16
+ let option = document.createElement("option");
17
+ option.value = v;
18
+ option.text = v;
19
+ element.appendChild(option);
20
+ }
21
+ }
22
+ element.onchange = (e) => this._valueChanged(element.value);
23
+ this.element = element;
24
+ }
25
+ refreshValue(valueType, value) {
26
+ this.element.value = value;
27
+ }
28
+ }
@@ -281,7 +281,9 @@
281
281
  "floodOpacity": {},
282
282
  "font": {},
283
283
  "fontDisplay": {},
284
- "fontFamily": {},
284
+ "fontFamily": {
285
+ "type": "font"
286
+ },
285
287
  "fontFeatureSettings": {},
286
288
  "fontKerning": {},
287
289
  "fontOpticalSizing": {},
@@ -32,6 +32,7 @@ export class CssPropertiesService extends CommonPropertiesService {
32
32
  "box-shadow",
33
33
  "opacity",
34
34
  "position",
35
+ "font-family",
35
36
  "font-size",
36
37
  "font-weight",
37
38
  "inset",
@@ -125,7 +125,12 @@ export class DebugView extends BaseCustomWebComponentConstructorAppend {
125
125
  </div>
126
126
  `;
127
127
  static style = css `
128
- table {
128
+ :host {
129
+ overflow: auto;
130
+ height: 100%;
131
+ display: block;
132
+ }
133
+ table {
129
134
  font-family: Arial, Helvetica, sans-serif;
130
135
  border-collapse: collapse;
131
136
  width: 100%;
@@ -1,6 +1,7 @@
1
1
  import { IDesignContext } from './IDesignContext.js';
2
2
  export declare class DesignContext implements IDesignContext {
3
3
  imports: string[];
4
+ npmPackages: string[];
4
5
  extensionOptions: {
5
6
  [key: string]: any;
6
7
  };
@@ -1,4 +1,5 @@
1
1
  export class DesignContext {
2
2
  imports = [];
3
+ npmPackages = [];
3
4
  extensionOptions = {};
4
5
  }
@@ -1,5 +1,6 @@
1
1
  export interface IDesignContext {
2
2
  imports: string[];
3
+ npmPackages: string[];
3
4
  extensionOptions: {
4
5
  [key: string]: any;
5
6
  };
@@ -31,6 +31,7 @@ export interface IDesignerCanvas extends IPlacementView, IUiCommandHandler {
31
31
  readonly scaleFactor: number;
32
32
  canvasOffset: IPoint;
33
33
  canvas: HTMLElement;
34
+ additionalStyles: CSSStyleSheet[];
34
35
  eatEvents: Element;
35
36
  initialize(serviceContainer: ServiceContainer): any;
36
37
  getNormalizedEventCoordinates(event: MouseEvent): IPoint;
package/dist/index.d.ts CHANGED
@@ -41,7 +41,8 @@ export type { IContentService } from "./elements/services/contentService/IConten
41
41
  export * from "./elements/services/copyPasteService/CopyPasteService.js";
42
42
  export * from "./elements/services/copyPasteService/CopyPasteAsJsonService.js";
43
43
  export type { ICopyPasteService } from "./elements/services/copyPasteService/ICopyPasteService.js";
44
- export * from "./elements/services/demoProviderService/DemoProviderService.js";
44
+ export * from "./elements/services/demoProviderService/IframeDemoProviderService.js";
45
+ export * from "./elements/services/demoProviderService/SimpleDemoProviderService.js";
45
46
  export type { IDemoProviderService } from "./elements/services/demoProviderService/IDemoProviderService.js";
46
47
  export * from "./elements/services/designItemDocumentPositionService/DesignItemDocumentPositionService.js";
47
48
  export type { IDesignItemDocumentPositionService } from "./elements/services/designItemDocumentPositionService/IDesignItemDocumentPositionService.js";
package/dist/index.js CHANGED
@@ -27,7 +27,8 @@ export * from "./elements/services/elementAtPointService/ElementAtPointService.j
27
27
  export * from "./elements/services/contentService/ContentService.js";
28
28
  export * from "./elements/services/copyPasteService/CopyPasteService.js";
29
29
  export * from "./elements/services/copyPasteService/CopyPasteAsJsonService.js";
30
- export * from "./elements/services/demoProviderService/DemoProviderService.js";
30
+ export * from "./elements/services/demoProviderService/IframeDemoProviderService.js";
31
+ export * from "./elements/services/demoProviderService/SimpleDemoProviderService.js";
31
32
  export * from "./elements/services/designItemDocumentPositionService/DesignItemDocumentPositionService.js";
32
33
  export * from "./elements/services/designItemService/DesignItemService.js";
33
34
  export * from "./elements/services/dragDropService/ExternalDragDropService.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "A UI designer for Polymer apps",
3
3
  "name": "@node-projects/web-component-designer",
4
- "version": "0.0.267",
4
+ "version": "0.0.269",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "",