@chemistry/crystalview 1.0.9 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +61 -31
  3. package/dist/{src/camera → camera}/Camera.d.ts +69 -63
  4. package/dist/camera/Camera.d.ts.map +1 -0
  5. package/dist/camera/Camera.js +257 -0
  6. package/dist/camera/Camera.js.map +1 -0
  7. package/dist/camera/ICamera.d.ts +9 -0
  8. package/dist/camera/ICamera.d.ts.map +1 -0
  9. package/dist/camera/ICamera.js +2 -0
  10. package/dist/camera/ICamera.js.map +1 -0
  11. package/dist/{src/crystal-view.d.ts → crystal-view.d.ts} +25 -24
  12. package/dist/crystal-view.d.ts.map +1 -0
  13. package/dist/crystal-view.js +181 -0
  14. package/dist/crystal-view.js.map +1 -0
  15. package/dist/crystalview.css +47 -0
  16. package/dist/index.d.ts +2 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +2 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/{src/molecule3d → molecule3d}/Atom.d.ts +14 -13
  21. package/dist/molecule3d/Atom.d.ts.map +1 -0
  22. package/dist/molecule3d/Atom.js +19 -0
  23. package/dist/molecule3d/Atom.js.map +1 -0
  24. package/dist/{src/molecule3d → molecule3d}/Bond.d.ts +8 -7
  25. package/dist/molecule3d/Bond.d.ts.map +1 -0
  26. package/dist/molecule3d/Bond.js +11 -0
  27. package/dist/molecule3d/Bond.js.map +1 -0
  28. package/dist/{src/molecule3d → molecule3d}/CellAtom.d.ts +96 -96
  29. package/dist/molecule3d/CellAtom.d.ts.map +1 -0
  30. package/dist/molecule3d/CellAtom.js +132 -0
  31. package/dist/molecule3d/CellAtom.js.map +1 -0
  32. package/dist/{src/molecule3d → molecule3d}/Link.d.ts +15 -14
  33. package/dist/molecule3d/Link.d.ts.map +1 -0
  34. package/dist/molecule3d/Link.js +17 -0
  35. package/dist/molecule3d/Link.js.map +1 -0
  36. package/dist/{src/molecule3d → molecule3d}/Marker.d.ts +9 -8
  37. package/dist/molecule3d/Marker.d.ts.map +1 -0
  38. package/dist/molecule3d/Marker.js +11 -0
  39. package/dist/molecule3d/Marker.js.map +1 -0
  40. package/dist/{src/molecule3d → molecule3d}/MarkerContact.d.ts +7 -6
  41. package/dist/molecule3d/MarkerContact.d.ts.map +1 -0
  42. package/dist/molecule3d/MarkerContact.js +9 -0
  43. package/dist/molecule3d/MarkerContact.js.map +1 -0
  44. package/dist/{src/molecule3d → molecule3d}/Molecule3D.d.ts +45 -44
  45. package/dist/molecule3d/Molecule3D.d.ts.map +1 -0
  46. package/dist/molecule3d/Molecule3D.js +139 -0
  47. package/dist/molecule3d/Molecule3D.js.map +1 -0
  48. package/dist/{src/molecule3d → molecule3d}/MoleculeBuilder.d.ts +20 -19
  49. package/dist/molecule3d/MoleculeBuilder.d.ts.map +1 -0
  50. package/dist/molecule3d/MoleculeBuilder.js +131 -0
  51. package/dist/molecule3d/MoleculeBuilder.js.map +1 -0
  52. package/dist/molecule3d/MoleculeConnector.d.ts +10 -0
  53. package/dist/molecule3d/MoleculeConnector.d.ts.map +1 -0
  54. package/dist/molecule3d/MoleculeConnector.js +107 -0
  55. package/dist/molecule3d/MoleculeConnector.js.map +1 -0
  56. package/dist/{src/molecule3d → molecule3d}/UnitCell.d.ts +36 -35
  57. package/dist/molecule3d/UnitCell.d.ts.map +1 -0
  58. package/dist/molecule3d/UnitCell.js +238 -0
  59. package/dist/molecule3d/UnitCell.js.map +1 -0
  60. package/dist/molecule3d/io/IMoleculeReader.d.ts +8 -0
  61. package/dist/molecule3d/io/IMoleculeReader.d.ts.map +1 -0
  62. package/dist/molecule3d/io/IMoleculeReader.js +2 -0
  63. package/dist/molecule3d/io/IMoleculeReader.js.map +1 -0
  64. package/dist/{src/molecule3d → molecule3d}/io/MoleculeReaderJCIF.d.ts +12 -11
  65. package/dist/molecule3d/io/MoleculeReaderJCIF.d.ts.map +1 -0
  66. package/dist/molecule3d/io/MoleculeReaderJCIF.js +115 -0
  67. package/dist/molecule3d/io/MoleculeReaderJCIF.js.map +1 -0
  68. package/dist/{src/painter → painter}/CanvasContext.d.ts +15 -14
  69. package/dist/painter/CanvasContext.d.ts.map +1 -0
  70. package/dist/painter/CanvasContext.js +68 -0
  71. package/dist/painter/CanvasContext.js.map +1 -0
  72. package/dist/painter/Painter.d.ts +36 -0
  73. package/dist/painter/Painter.d.ts.map +1 -0
  74. package/dist/painter/Painter.js +237 -0
  75. package/dist/painter/Painter.js.map +1 -0
  76. package/dist/ui/ContextMenu.d.ts +24 -0
  77. package/dist/ui/ContextMenu.d.ts.map +1 -0
  78. package/dist/ui/ContextMenu.js +147 -0
  79. package/dist/ui/ContextMenu.js.map +1 -0
  80. package/dist/{src/ui → ui}/ContextMenuItem.d.ts +18 -17
  81. package/dist/ui/ContextMenuItem.d.ts.map +1 -0
  82. package/dist/ui/ContextMenuItem.js +72 -0
  83. package/dist/ui/ContextMenuItem.js.map +1 -0
  84. package/package.json +68 -87
  85. package/dist/crystal-view.min.js +0 -24
  86. package/dist/src/molecule3d/MoleculeConnector.d.ts +0 -9
  87. package/dist/src/painter/Painter.d.ts +0 -35
  88. package/dist/src/ui/ContextMenu.d.ts +0 -24
  89. package/package-lock.json +0 -9410
@@ -0,0 +1,147 @@
1
+ export class ContextMenu {
2
+ static initDone;
3
+ static instances;
4
+ static subscription;
5
+ static getInstances() {
6
+ return ContextMenu.instances;
7
+ }
8
+ static init() {
9
+ if (ContextMenu.initDone) {
10
+ return;
11
+ }
12
+ ContextMenu.initDone = true;
13
+ ContextMenu.instances = [];
14
+ // hide all menu on Mouse Click or Esc
15
+ const hideAll = () => {
16
+ ContextMenu.hideAll();
17
+ };
18
+ document.body.addEventListener('click', hideAll);
19
+ document.body.addEventListener('contextmenu', hideAll);
20
+ const escHandler = (e) => {
21
+ if (e.key === 'Escape') {
22
+ ContextMenu.hideAll();
23
+ }
24
+ };
25
+ document.body.addEventListener('keyup', escHandler);
26
+ ContextMenu.subscription = () => {
27
+ document.body.removeEventListener('click', hideAll);
28
+ document.body.removeEventListener('contextmenu', hideAll);
29
+ document.body.removeEventListener('keyup', escHandler);
30
+ };
31
+ }
32
+ static off() {
33
+ if (ContextMenu.instances?.length) {
34
+ return;
35
+ }
36
+ ContextMenu.initDone = false;
37
+ if (ContextMenu.subscription) {
38
+ ContextMenu.subscription();
39
+ ContextMenu.subscription = null;
40
+ }
41
+ }
42
+ // hide all opened context menus
43
+ static hideAll() {
44
+ for (const menu of ContextMenu.getInstances()) {
45
+ menu.hide();
46
+ }
47
+ }
48
+ static addInstance(menu) {
49
+ ContextMenu.instances.push(menu);
50
+ }
51
+ static removeInstance(menu) {
52
+ const instances = ContextMenu.instances;
53
+ const idx = instances.indexOf(menu);
54
+ if (idx > -1) {
55
+ instances.splice(idx, 1);
56
+ }
57
+ }
58
+ widget;
59
+ view;
60
+ intervalID;
61
+ menuItems;
62
+ constructor(menuItems) {
63
+ this.widget = null;
64
+ this.view = null;
65
+ this.intervalID = null;
66
+ this.menuItems = menuItems;
67
+ }
68
+ onInit(element) {
69
+ ContextMenu.init();
70
+ ContextMenu.addInstance(this);
71
+ this.attach(element);
72
+ this.view = this.getView();
73
+ }
74
+ onDestroy() {
75
+ ContextMenu.removeInstance(this);
76
+ if (!ContextMenu.getInstances().length) {
77
+ ContextMenu.off();
78
+ }
79
+ this.menuItems?.forEach((item) => {
80
+ item.onDestroy();
81
+ });
82
+ this.menuItems = null;
83
+ if (this.view?.parentNode) {
84
+ this.view.parentNode.removeChild(this.view);
85
+ }
86
+ this.widget = null;
87
+ }
88
+ hide() {
89
+ if (this.intervalID) {
90
+ clearTimeout(this.intervalID);
91
+ }
92
+ if (this.view) {
93
+ this.view.style.display = 'none';
94
+ }
95
+ }
96
+ show(posX, posY) {
97
+ const view = this.view;
98
+ if (!view || !this.widget) {
99
+ return;
100
+ }
101
+ this.widget.appendChild(view);
102
+ view.style.display = 'block';
103
+ view.style.position = 'absolute';
104
+ view.style.left = posX - 8 + 'px';
105
+ view.style.top = posY - 8 + 'px';
106
+ view.addEventListener('mouseenter', () => {
107
+ if (this.intervalID) {
108
+ clearTimeout(this.intervalID);
109
+ }
110
+ });
111
+ view.addEventListener('mouseleave', () => {
112
+ if (this.intervalID) {
113
+ clearTimeout(this.intervalID);
114
+ }
115
+ this.intervalID = setTimeout(() => {
116
+ this.hide();
117
+ }, 300);
118
+ });
119
+ }
120
+ attach(widget) {
121
+ this.widget = widget;
122
+ widget.style.position = 'relative';
123
+ widget.addEventListener('contextmenu', (event) => {
124
+ event.preventDefault();
125
+ event.stopPropagation();
126
+ const rect = widget.getBoundingClientRect();
127
+ const x = Math.max(event.clientX - rect.left, 0);
128
+ const y = Math.max(event.clientY - rect.top, 0);
129
+ this.show(x, y);
130
+ });
131
+ }
132
+ getView() {
133
+ if (this.view) {
134
+ return this.view;
135
+ }
136
+ const view = document.createElement('div');
137
+ view.className = 'jcmolview-dropdown-menu';
138
+ if (this.menuItems) {
139
+ this.menuItems.forEach((menuItem) => {
140
+ const itemView = menuItem.getView();
141
+ view.appendChild(itemView);
142
+ });
143
+ }
144
+ return view;
145
+ }
146
+ }
147
+ //# sourceMappingURL=ContextMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextMenu.js","sourceRoot":"","sources":["../../src/ui/ContextMenu.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,18 @@
1
- export declare class ContextMenuItem {
2
- private type;
3
- private title;
4
- private isChecked;
5
- private command;
6
- private view;
7
- private checkbox;
8
- constructor(options: {
9
- type: string;
10
- title: string;
11
- isChecked?: () => void;
12
- command?: (event: any) => void;
13
- });
14
- onDestroy(): void;
15
- getView(): any;
16
- private updateCheckBox();
17
- }
1
+ export declare class ContextMenuItem {
2
+ private type;
3
+ private title;
4
+ private isChecked;
5
+ private command;
6
+ private view;
7
+ private checkbox;
8
+ constructor(options: {
9
+ type: string;
10
+ title: string;
11
+ isChecked?: () => boolean;
12
+ command?: (event: Event) => void;
13
+ });
14
+ onDestroy(): void;
15
+ getView(): HTMLElement;
16
+ private updateCheckBox;
17
+ }
18
+ //# sourceMappingURL=ContextMenuItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextMenuItem.d.ts","sourceRoot":"","sources":["../../src/ui/ContextMenuItem.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAe;IAC1B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,OAAO,CAAuC;IAEtD,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,QAAQ,CAA0B;gBAE9B,OAAO,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;QAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;KAClC;IASM,SAAS;IAMT,OAAO,IAAI,WAAW;IAoD7B,OAAO,CAAC,cAAc;CAMvB"}
@@ -0,0 +1,72 @@
1
+ export class ContextMenuItem {
2
+ type;
3
+ title;
4
+ isChecked;
5
+ command;
6
+ view;
7
+ checkbox;
8
+ constructor(options) {
9
+ this.type = options.type;
10
+ this.title = options.title;
11
+ this.isChecked = options.isChecked;
12
+ this.command = options.command;
13
+ this.view = null;
14
+ this.checkbox = null;
15
+ }
16
+ onDestroy() {
17
+ if (this.view?.parentNode) {
18
+ this.view.parentNode.removeChild(this.view);
19
+ }
20
+ }
21
+ getView() {
22
+ if (this.view) {
23
+ return this.view;
24
+ }
25
+ if (this.type === 'delimer' || this.title === '----') {
26
+ const view = document.createElement('div');
27
+ view.className = 'jcmolview-dropdown-divider';
28
+ this.view = view;
29
+ return view;
30
+ }
31
+ if (this.type === 'item') {
32
+ const view = document.createElement('a');
33
+ view.className = 'jcmolview-dropdown-item';
34
+ view.textContent = this.title || '';
35
+ this.view = view;
36
+ this.view.addEventListener('click', (event) => {
37
+ if (this.command) {
38
+ this.command(event);
39
+ }
40
+ });
41
+ return view;
42
+ }
43
+ if (this.type === 'checkbox') {
44
+ const view = document.createElement('div');
45
+ view.className = 'jcmolview-dropdown-item';
46
+ this.checkbox = document.createElement('input');
47
+ this.checkbox.type = 'checkbox';
48
+ this.checkbox.checked = true;
49
+ this.updateCheckBox();
50
+ view.appendChild(this.checkbox);
51
+ view.appendChild(document.createTextNode(this.title || ''));
52
+ view.addEventListener('click', (event) => {
53
+ if (this.command) {
54
+ this.command(event);
55
+ }
56
+ this.updateCheckBox();
57
+ });
58
+ this.view = view;
59
+ return view;
60
+ }
61
+ const fallback = document.createElement('div');
62
+ this.view = fallback;
63
+ return fallback;
64
+ }
65
+ updateCheckBox() {
66
+ if (this.isChecked && this.checkbox) {
67
+ const checked = this.isChecked();
68
+ this.checkbox.checked = checked;
69
+ }
70
+ }
71
+ }
72
+ //# sourceMappingURL=ContextMenuItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextMenuItem.js","sourceRoot":"","sources":["../../src/ui/ContextMenuItem.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,89 +1,70 @@
1
1
  {
2
- "name": "@chemistry/crystalview",
3
- "version": "v1.0.9",
4
- "description": "Simple Crystal Viewer v1",
5
- "main": "dist/crystal-view.min.js",
6
- "typings": "dist/src/crystal-view.d.ts",
7
- "author": {
8
- "name": "Volodymyr Vreshch",
9
- "url": "http://vreshch.com/"
2
+ "name": "@chemistry/crystalview",
3
+ "version": "3.1.1",
4
+ "description": "Crystal Structure Visualization Library",
5
+ "type": "module",
6
+ "author": {
7
+ "name": "Volodymyr Vreshch",
8
+ "url": "https://vreshch.com/"
9
+ },
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "cheminformatics",
13
+ "crystallography",
14
+ "cod",
15
+ "crystal structure",
16
+ "3d visualization"
17
+ ],
18
+ "engines": {
19
+ "node": ">=22.0.0",
20
+ "npm": ">=10.0.0"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/chemistry/crystalview"
25
+ },
26
+ "publishConfig": {
27
+ "registry": "https://registry.npmjs.org/",
28
+ "access": "public"
29
+ },
30
+ "private": false,
31
+ "sideEffects": false,
32
+ "files": [
33
+ "dist",
34
+ "README.md"
35
+ ],
36
+ "main": "./dist/index.js",
37
+ "types": "./dist/index.d.ts",
38
+ "exports": {
39
+ ".": {
40
+ "types": "./dist/index.d.ts",
41
+ "import": "./dist/index.js"
10
42
  },
11
- "license": "MIT",
12
- "keywords": [
13
- "cheminformatics",
14
- "crystallography",
15
- "cod"
16
- ],
17
- "engines": {
18
- "node": ">=10.0.0"
19
- },
20
- "devEngines": {
21
- "node": ">=10.0.0"
22
- },
23
- "repository": {
24
- "type": "git",
25
- "url": "https://github.com/chemistry/crystalview"
26
- },
27
- "publishConfig": {
28
- "registry": "https://registry.npmjs.org/"
29
- },
30
- "files": [
31
- "package-lock.json",
32
- "package.json",
33
- "dist",
34
- "README.md"
35
- ],
36
- "scripts": {
37
- "build": "npm run clean && npm run build:prod",
38
- "build:dev": "webpack --output-filename crystal-view.js --config etc/webpack.config.dev.js",
39
- "build:prod": "webpack --output-filename crystal-view.min.js --config etc/webpack.config.prd.js",
40
- "serve": "webpack-dev-server --config ./etc/webpack.config.example.js",
41
- "clean": "rimraf dist/* coverage/*",
42
- "test": "rimraf coverage/* && npm run test:node && npm run test:browser && npm run test:node-coverage",
43
- "test:node": "ts-node node_modules/jasmine/bin/jasmine.js JASMINE_CONFIG_PATH=etc/jasmine.json",
44
- "test:node-coverage": "ts-node node_modules/istanbul/lib/cli.js cover -e .ts -x \"*.d.ts\" -x \"*.spec.ts\" node_modules/jasmine/bin/jasmine.js -- JASMINE_CONFIG_PATH=etc/jasmine.json",
45
- "test:browser": "karma start --single-run --no-auto-watch etc/karma.conf.js",
46
- "lint": "tslint 'src/**/*.ts'",
47
- "lintfix": "tslint --fix 'src/**/*.ts'",
48
- "do-publish": "npm run build && npm publish"
49
- },
50
- "dependencies": {
51
- "@chemistry/math": "2.1.5",
52
- "@chemistry/elements": "1.1.0",
53
- "@crystallography/space-groups": "1.0.3",
54
- "jquery": "3.5.1"
55
- },
56
- "devDependencies": {
57
- "@types/jasmine": "2.5.53",
58
- "@types/jquery": "3.2.11",
59
- "awesome-typescript-loader": "3.2.3",
60
- "babel-cli": "6.26.0",
61
- "babel-core": "6.26.0",
62
- "babel-loader": "7.1.2",
63
- "babel-plugin-add-module-exports": "0.2.1",
64
- "babel-preset-es2015": "6.24.1",
65
- "cross-env": "5.0.5",
66
- "css-loader": "0.28.5",
67
- "html-webpack-plugin": "2.30.1",
68
- "istanbul": "1.1.0-alpha.1",
69
- "jasmine": "2.7.0",
70
- "jasmine-core": "2.7.0",
71
- "karma": "1.7.0",
72
- "karma-jasmine": "1.1.0",
73
- "karma-mocha-reporter": "2.2.3",
74
- "karma-phantomjs-launcher": "1.0.4",
75
- "karma-webpack": "2.0.4",
76
- "less": "2.7.2",
77
- "less-loader": "4.0.5",
78
- "loader-utils": "1.1.0",
79
- "postcss-loader": "2.0.6",
80
- "rimraf": "2.6.1",
81
- "source-map-loader": "0.2.1",
82
- "style-loader": "0.18.2",
83
- "ts-node": "3.3.0",
84
- "tslint": "5.6.0",
85
- "typescript": "2.4.2",
86
- "webpack": "3.5.5",
87
- "webpack-dev-server": "2.7.1"
88
- }
89
- }
43
+ "./crystalview.css": "./dist/crystalview.css"
44
+ },
45
+ "scripts": {
46
+ "build": "tsc && npm run copy:css",
47
+ "copy:css": "cp src/crystal-view.css dist/crystalview.css",
48
+ "test": "vitest run",
49
+ "lint": "eslint src/",
50
+ "format": "prettier --write .",
51
+ "format:check": "prettier --check .",
52
+ "type-check": "tsc --noEmit",
53
+ "verify": "npm run type-check && npm run lint && npm run format:check && npm run test && npm run build"
54
+ },
55
+ "dependencies": {
56
+ "@chemistry/elements": "^3.1.3",
57
+ "@chemistry/math": "^3.1.3",
58
+ "@chemistry/space-groups": "^3.1.3"
59
+ },
60
+ "devDependencies": {
61
+ "@eslint/js": "^10.0.0",
62
+ "@vitest/coverage-v8": "^4.0.0",
63
+ "eslint": "^10.0.0",
64
+ "jsdom": "^30.0.1",
65
+ "prettier": "^3.4.0",
66
+ "typescript": "^6.0.3",
67
+ "typescript-eslint": "^8.66.0",
68
+ "vitest": "^4.0.0"
69
+ }
70
+ }