@kabel-project/kabel 1.0.7 → 1.0.9

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 (273) hide show
  1. package/dist/comment-renderer/renderer.d.ts +32 -0
  2. package/dist/comment-renderer/renderer.d.ts.map +1 -0
  3. package/dist/controllers/base.d.ts +39 -0
  4. package/dist/controllers/base.d.ts.map +1 -0
  5. package/dist/controllers/wasd.d.ts +33 -0
  6. package/dist/controllers/wasd.d.ts.map +1 -0
  7. package/dist/events/comment-drag-handle.d.ts +2 -0
  8. package/dist/events/comment-drag-handle.d.ts.map +1 -0
  9. package/dist/events/comment-input.d.ts +4 -0
  10. package/dist/events/comment-input.d.ts.map +1 -0
  11. package/dist/events/connection-line.d.ts +2 -0
  12. package/dist/events/connection-line.d.ts.map +1 -0
  13. package/dist/events/connector.d.ts +2 -0
  14. package/dist/events/connector.d.ts.map +1 -0
  15. package/dist/events/draggable.d.ts +2 -0
  16. package/dist/events/draggable.d.ts.map +1 -0
  17. package/{events/events.ts → dist/events/events.d.ts} +8 -7
  18. package/dist/events/events.d.ts.map +1 -0
  19. package/dist/events/input-box.d.ts +2 -0
  20. package/dist/events/input-box.d.ts.map +1 -0
  21. package/dist/events/node-x-btn.d.ts +2 -0
  22. package/dist/events/node-x-btn.d.ts.map +1 -0
  23. package/dist/kabel.js +2 -0
  24. package/dist/kabel.js.map +1 -0
  25. package/dist/renderers/apollo/apollo.d.ts +12 -0
  26. package/dist/renderers/apollo/apollo.d.ts.map +1 -0
  27. package/dist/renderers/apollo/constants.d.ts +21 -0
  28. package/dist/renderers/apollo/constants.d.ts.map +1 -0
  29. package/dist/renderers/apollo/renderer.d.ts +97 -0
  30. package/dist/renderers/apollo/renderer.d.ts.map +1 -0
  31. package/{renderers/atlas/atlas.ts → dist/renderers/atlas/atlas.d.ts} +6 -15
  32. package/dist/renderers/atlas/atlas.d.ts.map +1 -0
  33. package/dist/renderers/constants.d.ts +51 -0
  34. package/dist/renderers/constants.d.ts.map +1 -0
  35. package/dist/renderers/renderer.d.ts +470 -0
  36. package/dist/renderers/renderer.d.ts.map +1 -0
  37. package/dist/renderers/representer-node.d.ts +27 -0
  38. package/dist/renderers/representer-node.d.ts.map +1 -0
  39. package/dist/renderers/representer.d.ts +13 -0
  40. package/dist/renderers/representer.d.ts.map +1 -0
  41. package/dist/src/category.d.ts +48 -0
  42. package/dist/src/category.d.ts.map +1 -0
  43. package/{src/colors.ts → dist/src/colors.d.ts} +21 -20
  44. package/dist/src/colors.d.ts.map +1 -0
  45. package/dist/src/comment.d.ts +88 -0
  46. package/dist/src/comment.d.ts.map +1 -0
  47. package/dist/src/connection.d.ts +52 -0
  48. package/dist/src/connection.d.ts.map +1 -0
  49. package/dist/src/context-menu.d.ts +76 -0
  50. package/dist/src/context-menu.d.ts.map +1 -0
  51. package/dist/src/coordinates.d.ts +52 -0
  52. package/dist/src/coordinates.d.ts.map +1 -0
  53. package/dist/src/core.d.ts +153 -0
  54. package/dist/src/core.d.ts.map +1 -0
  55. package/dist/src/ctx-menu-registry.d.ts +22 -0
  56. package/dist/src/ctx-menu-registry.d.ts.map +1 -0
  57. package/dist/src/dropdown-menu.d.ts +87 -0
  58. package/dist/src/dropdown-menu.d.ts.map +1 -0
  59. package/dist/src/field.d.ts +305 -0
  60. package/dist/src/field.d.ts.map +1 -0
  61. package/dist/src/flyout.d.ts +41 -0
  62. package/dist/src/flyout.d.ts.map +1 -0
  63. package/dist/src/fonts-manager.d.ts +6 -0
  64. package/dist/src/fonts-manager.d.ts.map +1 -0
  65. package/dist/src/grid.d.ts +60 -0
  66. package/dist/src/grid.d.ts.map +1 -0
  67. package/dist/src/headless-node.d.ts +11 -0
  68. package/dist/src/headless-node.d.ts.map +1 -0
  69. package/dist/src/index.d.ts +38 -0
  70. package/dist/src/index.d.ts.map +1 -0
  71. package/dist/src/inject-headless.d.ts +4 -0
  72. package/dist/src/inject-headless.d.ts.map +1 -0
  73. package/{src/inject.ts → dist/src/inject.d.ts} +142 -213
  74. package/dist/src/inject.d.ts.map +1 -0
  75. package/{src/main-workspace.ts → dist/src/main-workspace.d.ts} +31 -51
  76. package/dist/src/main-workspace.d.ts.map +1 -0
  77. package/dist/src/mutator.d.ts +2 -0
  78. package/dist/src/mutator.d.ts.map +1 -0
  79. package/{src/node-types.ts → dist/src/node-types.d.ts} +26 -27
  80. package/dist/src/node-types.d.ts.map +1 -0
  81. package/dist/src/nodesvg.d.ts +266 -0
  82. package/dist/src/nodesvg.d.ts.map +1 -0
  83. package/{src/prototypes.ts → dist/src/prototypes.d.ts} +10 -9
  84. package/dist/src/prototypes.d.ts.map +1 -0
  85. package/{src/renderer-map.ts → dist/src/renderer-map.d.ts} +51 -86
  86. package/dist/src/renderer-map.d.ts.map +1 -0
  87. package/dist/src/toolbox.d.ts +51 -0
  88. package/dist/src/toolbox.d.ts.map +1 -0
  89. package/{src/types.ts → dist/src/types.d.ts} +159 -205
  90. package/dist/src/types.d.ts.map +1 -0
  91. package/dist/src/undo-redo.d.ts +15 -0
  92. package/dist/src/undo-redo.d.ts.map +1 -0
  93. package/{src/visual-types.ts → dist/src/visual-types.d.ts} +34 -29
  94. package/dist/src/visual-types.d.ts.map +1 -0
  95. package/dist/src/widget-prototypes.d.ts +10 -0
  96. package/dist/src/widget-prototypes.d.ts.map +1 -0
  97. package/dist/src/widget.d.ts +62 -0
  98. package/dist/src/widget.d.ts.map +1 -0
  99. package/{src/workspace-coords.ts → dist/src/workspace-coords.d.ts} +10 -14
  100. package/dist/src/workspace-coords.d.ts.map +1 -0
  101. package/dist/src/workspace-svg.d.ts +371 -0
  102. package/dist/src/workspace-svg.d.ts.map +1 -0
  103. package/dist/src/workspace.d.ts +50 -0
  104. package/dist/src/workspace.d.ts.map +1 -0
  105. package/dist/themes/dark.d.ts +4 -0
  106. package/dist/themes/dark.d.ts.map +1 -0
  107. package/dist/themes/default.d.ts +4 -0
  108. package/dist/themes/default.d.ts.map +1 -0
  109. package/dist/themes/themes.d.ts +6 -0
  110. package/dist/themes/themes.d.ts.map +1 -0
  111. package/dist/util/emitter.d.ts +10 -0
  112. package/dist/util/emitter.d.ts.map +1 -0
  113. package/dist/util/env.d.ts +7 -0
  114. package/dist/util/env.d.ts.map +1 -0
  115. package/{util/escape-html.ts → dist/util/escape-html.d.ts} +16 -22
  116. package/dist/util/escape-html.d.ts.map +1 -0
  117. package/dist/util/eventer.d.ts +29 -0
  118. package/dist/util/eventer.d.ts.map +1 -0
  119. package/dist/util/has-prop.d.ts +2 -0
  120. package/dist/util/has-prop.d.ts.map +1 -0
  121. package/dist/util/parse-color.d.ts +6 -0
  122. package/dist/util/parse-color.d.ts.map +1 -0
  123. package/dist/util/path.d.ts +25 -0
  124. package/dist/util/path.d.ts.map +1 -0
  125. package/dist/util/styler.d.ts +12 -0
  126. package/dist/util/styler.d.ts.map +1 -0
  127. package/dist/util/uid.d.ts +42 -0
  128. package/dist/util/uid.d.ts.map +1 -0
  129. package/{util/unescape-html.ts → dist/util/unescape-html.d.ts} +16 -22
  130. package/dist/util/unescape-html.d.ts.map +1 -0
  131. package/dist/util/user-state.d.ts +37 -0
  132. package/dist/util/user-state.d.ts.map +1 -0
  133. package/{util/wait-anim-frames.ts → dist/util/wait-anim-frames.d.ts} +11 -24
  134. package/dist/util/wait-anim-frames.d.ts.map +1 -0
  135. package/dist/util/window-listeners.d.ts +8 -0
  136. package/dist/util/window-listeners.d.ts.map +1 -0
  137. package/package.json +5 -2
  138. package/(1.0.7)kabel.md +0 -18
  139. package/_READ_ME_MEDIA_/documentation/docs.md +0 -293
  140. package/_READ_ME_MEDIA_/workspace.png +0 -0
  141. package/comment-renderer/renderer.ts +0 -228
  142. package/controllers/base.ts +0 -186
  143. package/controllers/wasd.ts +0 -132
  144. package/docs/README.md +0 -98
  145. package/docs/_media/docs.md +0 -289
  146. package/docs/_media/workspace.png +0 -0
  147. package/docs/classes/CommentModel.md +0 -271
  148. package/docs/classes/CommentRenderer.md +0 -457
  149. package/docs/classes/ConnectableField.md +0 -597
  150. package/docs/classes/Connection.md +0 -191
  151. package/docs/classes/ContextMenuHTML.md +0 -163
  152. package/docs/classes/Coordinates.md +0 -187
  153. package/docs/classes/DropdownContainer.md +0 -300
  154. package/docs/classes/DummyField.md +0 -393
  155. package/docs/classes/Eventer.md +0 -185
  156. package/docs/classes/Field.md +0 -461
  157. package/docs/classes/InjectMsg.md +0 -85
  158. package/docs/classes/NodeSvg.md +0 -1011
  159. package/docs/classes/NumberField.md +0 -559
  160. package/docs/classes/OptConnectField.md +0 -624
  161. package/docs/classes/Renderer.md +0 -1636
  162. package/docs/classes/RendererConstants.md +0 -343
  163. package/docs/classes/Representer.md +0 -95
  164. package/docs/classes/RepresenterNode.md +0 -175
  165. package/docs/classes/TextField.md +0 -559
  166. package/docs/classes/Toolbox.md +0 -172
  167. package/docs/classes/WASDController.md +0 -616
  168. package/docs/classes/Widget.md +0 -195
  169. package/docs/classes/WorkspaceController.md +0 -385
  170. package/docs/classes/WorkspaceCoords.md +0 -218
  171. package/docs/classes/WorkspaceSvg.md +0 -1380
  172. package/docs/functions/clearMainWorkspace.md +0 -20
  173. package/docs/functions/getMainWorkspace.md +0 -19
  174. package/docs/functions/inject.md +0 -35
  175. package/docs/functions/setMainWorkspace.md +0 -28
  176. package/docs/globals.md +0 -95
  177. package/docs/interfaces/ColorStyle.md +0 -43
  178. package/docs/interfaces/ConnectorToFrom.md +0 -57
  179. package/docs/interfaces/DrawState.md +0 -81
  180. package/docs/interfaces/FieldConnectionData.md +0 -25
  181. package/docs/interfaces/FieldOptions.md +0 -63
  182. package/docs/interfaces/FieldRawBoxData.md +0 -25
  183. package/docs/interfaces/FieldVisualInfo.md +0 -65
  184. package/docs/interfaces/GridOptions.md +0 -61
  185. package/docs/interfaces/InjectOptions.md +0 -133
  186. package/docs/interfaces/InputFieldJson.md +0 -50
  187. package/docs/interfaces/KabelCommentRendering.md +0 -31
  188. package/docs/interfaces/KabelInterface.md +0 -469
  189. package/docs/interfaces/KabelNodeRendering.md +0 -77
  190. package/docs/interfaces/KabelUIX.md +0 -105
  191. package/docs/interfaces/KabelUtils.md +0 -215
  192. package/docs/interfaces/NodeEvents.md +0 -42
  193. package/docs/interfaces/NodeJson.md +0 -104
  194. package/docs/interfaces/NodePrototype.md +0 -82
  195. package/docs/interfaces/RegisteredEl.md +0 -53
  196. package/docs/interfaces/SerializedNode.md +0 -128
  197. package/docs/interfaces/TblxCategoryStruct.md +0 -41
  198. package/docs/interfaces/TblxFieldStruct.md +0 -28
  199. package/docs/interfaces/TblxNodeStruct.md +0 -35
  200. package/docs/interfaces/WidgetOptions.md +0 -115
  201. package/docs/interfaces/WidgetPrototypeList.md +0 -15
  202. package/docs/type-aliases/AnyField.md +0 -13
  203. package/docs/type-aliases/AnyFieldCls.md +0 -13
  204. package/docs/type-aliases/Color.md +0 -13
  205. package/docs/type-aliases/Connectable.md +0 -13
  206. package/docs/type-aliases/EventArgs.md +0 -11
  207. package/docs/type-aliases/EventSetupFn.md +0 -25
  208. package/docs/type-aliases/Hex.md +0 -13
  209. package/docs/type-aliases/RGBObject.md +0 -37
  210. package/docs/type-aliases/RGBString.md +0 -13
  211. package/docs/type-aliases/RGBTuple.md +0 -13
  212. package/docs/type-aliases/TblxObjStruct.md +0 -52
  213. package/docs/variables/CategoryColors.md +0 -29
  214. package/docs/variables/FieldMap.md +0 -41
  215. package/docs/variables/NodePrototypes.md +0 -18
  216. package/docs/variables/default.md +0 -11
  217. package/events/comment-drag-handle.ts +0 -61
  218. package/events/comment-input.ts +0 -291
  219. package/events/connection-line.ts +0 -68
  220. package/events/connector.ts +0 -116
  221. package/events/draggable.ts +0 -119
  222. package/events/input-box.ts +0 -213
  223. package/events/node-x-btn.ts +0 -25
  224. package/index.d.ts +0 -4
  225. package/renderers/apollo/apollo.ts +0 -21
  226. package/renderers/apollo/constants.ts +0 -40
  227. package/renderers/apollo/renderer.ts +0 -331
  228. package/renderers/constants.ts +0 -87
  229. package/renderers/renderer.ts +0 -1288
  230. package/renderers/representer-node.ts +0 -52
  231. package/renderers/representer.ts +0 -25
  232. package/src/category.ts +0 -107
  233. package/src/comment.ts +0 -142
  234. package/src/connection.ts +0 -114
  235. package/src/context-menu.ts +0 -194
  236. package/src/coordinates.ts +0 -74
  237. package/src/core.ts +0 -202
  238. package/src/ctx-menu-registry.ts +0 -143
  239. package/src/dropdown-menu.ts +0 -215
  240. package/src/field.ts +0 -595
  241. package/src/flyout.ts +0 -165
  242. package/src/fonts-manager.ts +0 -38
  243. package/src/grid.ts +0 -162
  244. package/src/headless-node.ts +0 -27
  245. package/src/index.ts +0 -115
  246. package/src/inject-headless.ts +0 -18
  247. package/src/mutator.ts +0 -40
  248. package/src/nodesvg.ts +0 -756
  249. package/src/styles.css +0 -224
  250. package/src/toolbox.ts +0 -125
  251. package/src/undo-redo.ts +0 -87
  252. package/src/widget-prototypes.ts +0 -11
  253. package/src/widget.ts +0 -139
  254. package/src/workspace-svg.ts +0 -736
  255. package/src/workspace.ts +0 -155
  256. package/test-server.js +0 -61
  257. package/themes/dark.ts +0 -32
  258. package/themes/default.ts +0 -28
  259. package/themes/themes.ts +0 -9
  260. package/tsconfig.json +0 -25
  261. package/typedoc.json +0 -10
  262. package/util/emitter.ts +0 -33
  263. package/util/env.ts +0 -11
  264. package/util/eventer.ts +0 -108
  265. package/util/has-prop.ts +0 -4
  266. package/util/parse-color.ts +0 -42
  267. package/util/path.ts +0 -99
  268. package/util/styler.ts +0 -41
  269. package/util/uid.ts +0 -184
  270. package/util/user-state.ts +0 -68
  271. package/util/window-listeners.ts +0 -62
  272. package/webpack.config.js +0 -80
  273. /package/{docs/_media → dist}/index.html +0 -0
package/src/core.ts DELETED
@@ -1,202 +0,0 @@
1
- import RendererConstants from '../renderers/constants'
2
- import Renderer from '../renderers/renderer'
3
- import CategoryColors from './colors'
4
- import Connection, { Connectable } from './connection'
5
- import Coordinates from './coordinates'
6
- import Field, {
7
- FieldOptions,
8
- FieldVisualInfo,
9
- AnyFieldCls,
10
- AnyField,
11
- DummyField,
12
- FieldMap,
13
- NumberField,
14
- OptConnectField,
15
- TextField
16
- } from './field'
17
- import inject, { InjectMsg, InjectOptions } from './inject'
18
- import {
19
- clearMainWorkspace,
20
- getMainWorkspace,
21
- setMainWorkspace
22
- } from './main-workspace'
23
- import NodeSvg, { NodeJson, NodeEvents, InputFieldJson } from './nodesvg'
24
- import NodePrototypes from './prototypes'
25
- import WorkspaceSvg from './workspace-svg'
26
- import { NodePrototype } from './node-types'
27
- import {
28
- Color,
29
- ColorStyle,
30
- Hex,
31
- RGBObject,
32
- RGBString,
33
- RGBTuple
34
- } from './visual-types'
35
- import { parseColor } from '../util/parse-color'
36
- import eventer, { Eventer } from '../util/eventer'
37
- import * as Path from '../util/path'
38
- import * as SVG from '@svgdotjs/svg.js'
39
- import * as UID from '../util/uid'
40
- import hasProp from '../util/has-prop'
41
- import EventEmitter from '../util/emitter'
42
- import userState from '../util/user-state'
43
- import '../events/events'
44
- import WorkspaceController from '../controllers/base'
45
- import WASDController from '../controllers/wasd'
46
- import { RMap, RendererMap } from './renderer-map'
47
- import styler, { Styler } from '../util/styler'
48
- import WidgetPrototypes from './widget-prototypes'
49
- import Widget from './widget'
50
- import ContextOptsRegistry, { ContextMenu } from './ctx-menu-registry'
51
- import { Showable } from './context-menu'
52
- import escapeAttr from '../util/escape-html'
53
- import unescapeAttr from '../util/unescape-html'
54
- import waitFrames from '../util/wait-anim-frames'
55
- import CommentModel from './comment'
56
- import CommentRenderer from '../comment-renderer/renderer'
57
- import dropdownContainer from './dropdown-menu'
58
- import Representer from '../renderers/representer'
59
- import { RepresenterNode } from '../renderers/representer-node'
60
- import windowListeners, { addWindowListener, clearWindowListeners, removeWindowListener } from '../util/window-listeners'
61
- import * as FontManager from './fonts-manager';
62
- import env from "../util/env";
63
- import Workspace from './workspace'
64
- import injectHeadless from './inject-headless'
65
- import createHeadlessNode from './headless-node';
66
- import * as apollo from '../renderers/apollo/apollo';
67
- import * as atlas from '../renderers/atlas/atlas';
68
- import KabelWSTheme from '../themes/default'
69
- import KabelDarkTheme from '../themes/dark'
70
- /** Register default renderers. */
71
- RendererMap['default'] = atlas.Renderer;
72
- RendererMap[atlas.Renderer.NAME] = atlas.Renderer;
73
- RendererMap[apollo.Renderer.NAME] = apollo.Renderer;
74
-
75
- if (env.isBrowser) {
76
- // Use FontsManager to load default Kabel fonts.
77
- FontManager.loadGoogleFont('Fredoka');
78
- }
79
- /**
80
- * Utility method to register a field globally by name
81
- * @param name - Field identifier
82
- * @param cls - Class constructor for the field
83
- */
84
- Field.register = function (name: string, cls: Function) {
85
- FieldMap[name] = cls as AnyFieldCls
86
- }
87
-
88
- /**
89
- * Utility method to unregister a field globally by name
90
- * @param name - Field identifier
91
- */
92
- Field.unregister = function (name: string) {
93
- delete FieldMap[name]
94
- }
95
-
96
- /**
97
- * Central Kabel object exposing all main modules, utilities, and defaults
98
- */
99
- const Kabel = {
100
- env, // Environment information
101
- UIX: { // User experience enhancing utilities.
102
- /** Event manager, loads events from '../events' and lets us attach them to svg.js elements to give them behavior that's seperated from the renderer. */
103
- events: eventer as Eventer,
104
- /** Font manager, used to load fonts. */
105
- FontManager,
106
- /** * State Manager, Makes things possible: E.G (the 'typing' state when you type in a input box..) * Used in controllers so you dont move when typing characters like a w s or d etc. */
107
- userState,
108
- /** Window listeners manager */
109
- windowListeners: {
110
- addWindowListener,
111
- removeWindowListener,
112
- clearWindowListeners,
113
- windowListeners
114
- }
115
- },
116
- Themes: {
117
- Classic: KabelWSTheme,
118
- Dark: KabelDarkTheme
119
- },
120
- /** Context menu manager */
121
- ContextMenu,
122
- /**
123
- * Utility methods and constants for various purposes.
124
- * @property Path - Utility methods for handling SVG paths.
125
- * @property waitFrames - Utility method to wait for a certain number of animation frames.
126
- */
127
- Utils: {
128
- Path,
129
- waitFrames,
130
- SVG, // Re-exporting svg.js for convenience
131
- parseColor,
132
- UID,
133
- EventEmitter,
134
- hasProp,
135
- styler,
136
- Styler,
137
- escapeHTML: escapeAttr,
138
- unescapeHTML: unescapeAttr
139
- },
140
- Widget,
141
- CategoryColors,
142
- Connection,
143
- Coordinates,
144
- Field,
145
- DummyField,
146
- FieldMap,
147
- NumberField,
148
- OptConnectField,
149
- TextField,
150
- inject,
151
- injectHeadless,
152
- createHeadlessNode,
153
- InjectMsg,
154
- clearMainWorkspace,
155
- getMainWorkspace,
156
- setMainWorkspace,
157
- NodeSvg,
158
- Nodes: NodePrototypes,
159
- Widgets: WidgetPrototypes,
160
- WorkspaceSvg,
161
- Workspace,
162
- WorkspaceController,
163
- WASDController,
164
- nodeRendering: {
165
- SVG: SVG, // also re-export svg.js here for easier access in renderers
166
- rendererMap: RMap,
167
- Apollo: apollo,
168
- Atlas: atlas,
169
- Renderer: Renderer,
170
- RendererConstants: RendererConstants,
171
- Representer: Representer,
172
- RepresenterNode: RepresenterNode
173
- },
174
- atlas,
175
- apollo,
176
- commentRendering: { CommentModel, CommentRenderer },
177
- Dropdown: dropdownContainer
178
- }
179
-
180
- /**
181
- * Provides a getter/setter for the main workspace
182
- * @property _mainWorkspace - Get or set the currently active workspace
183
- */
184
- Object.defineProperty(Kabel, '_mainWorkspace', {
185
- get(): WorkspaceSvg | Workspace | null {
186
- return getMainWorkspace()
187
- },
188
- set(v: WorkspaceSvg | Workspace | undefined | null | false | 0 | string) {
189
- if (
190
- v === undefined ||
191
- v === null ||
192
- v === false ||
193
- v === 0 ||
194
- typeof v === 'string'
195
- ) {
196
- return clearMainWorkspace()
197
- }
198
- return setMainWorkspace(v)
199
- }
200
- })
201
-
202
- export default Kabel
@@ -1,143 +0,0 @@
1
- import CommentModel from "./comment";
2
- import { ContextMenuOpts, Showable } from "./context-menu";
3
- import NodeSvg from "./nodesvg";
4
- import WorkspaceSvg from "./workspace-svg";
5
-
6
- /** Registry for all context menu options */
7
- const ContextOptsRegistry: ContextMenuOpts[] = [];
8
-
9
- /**
10
- * Global context menu manager
11
- */
12
- const ContextMenu = {
13
- /**
14
- * Register a new context menu option
15
- * @param id - Unique identifier for the option
16
- * @param option - Configuration for the context menu item
17
- */
18
- registerOption(id: string, option: Omit<ContextMenuOpts, 'id'>) {
19
- const opt = {
20
- id,
21
- click: option.click,
22
- label: option.label,
23
- onHoverStart: option.onHoverStart || (() => { }),
24
- onHoverEnd: option.onHoverEnd || (() => { }),
25
- showFor: option.showFor || 'any'
26
- };
27
- ContextOptsRegistry.push(opt);
28
- },
29
-
30
- /**
31
- * Unregister an existing context menu option by ID
32
- * @param id - ID of the option to remove
33
- */
34
- unregisterOption(id: string) {
35
- const index = ContextOptsRegistry.findIndex(opt => opt.id === id);
36
- if (index >= 0) ContextOptsRegistry.splice(index, 1);
37
- }
38
- };
39
-
40
- // ----- Default options -----
41
-
42
- ContextMenu.registerOption('k_delete', {
43
- showFor: 'node',
44
- label: 'Delete',
45
- click: (t) => {
46
- const target = t as NodeSvg;
47
- if (!target.workspace) return;
48
- target.workspace.removeNode(target);
49
- }
50
- });
51
-
52
- ContextMenu.registerOption('k_deleteall', {
53
- showFor: 'ws',
54
- label: 'Delete all',
55
- click: (t) => {
56
- const target = t as WorkspaceSvg;
57
- const isSure = window.confirm(`Are you sure you want to delete ${Array.from(target._nodeDB.keys()).length} nodes?`);
58
- if (!isSure) return;
59
- for (let [id, _] of target._nodeDB) {
60
- target.removeNodeById(id);
61
- }
62
- }
63
- });
64
-
65
- ContextMenu.registerOption('k_addcomment', {
66
- showFor: ['ws', 'node'],
67
- label: 'Add Comment',
68
- click: (t) => {
69
- const target = t;
70
- if (target instanceof NodeSvg) {
71
- target.addComment();
72
- target.setCommentText('Comment!');
73
- } else if (target instanceof WorkspaceSvg) {
74
- const model = target.addComment();
75
- const pos = target.screenToWorkspace(target._ctxMenu.widget.coords.x, target._ctxMenu.widget.coords.y);
76
- model.relativeCoords.set(pos.x, pos.y);
77
- model.setText('Comment!');
78
- }
79
- }
80
- });
81
- ContextMenu.registerOption('k_undo', {
82
- showFor: ['ws', 'node', 'comment'],
83
- label: 'Undo',
84
- click: (t) => {
85
- if (t instanceof NodeSvg) {
86
- t.workspace?.history?.undo();
87
- } else if (t instanceof CommentModel) {
88
- t.getWorkspace()?.history?.undo();
89
- } else if (t instanceof WorkspaceSvg) {
90
- t.history.undo();
91
- }
92
- },
93
- onDraw(el, ws, opt) {
94
- console.log('onDrawCalled');
95
- if (!ws.history.canUndo()) {
96
- (el as HTMLElement).classList.add('disabled')
97
- }
98
- }
99
- })
100
- ContextMenu.registerOption('k_redo', {
101
- showFor: ['ws', 'node', 'comment'],
102
- label: 'Redo',
103
- click: (t) => {
104
- if (t instanceof NodeSvg) {
105
- t.workspace?.history?.redo();
106
- } else if (t instanceof CommentModel) {
107
- t.getWorkspace()?.history?.redo();
108
- } else if (t instanceof WorkspaceSvg) {
109
- t.history.redo();
110
- }
111
- },
112
- onDraw(el, ws, opt) {
113
- console.log('onDrawCalled');
114
- if (!ws.history.canRedo()) {
115
- (el as HTMLElement).classList.add('disabled')
116
- }
117
- }
118
- })
119
- ContextMenu.registerOption('k_deletecomment', {
120
- showFor: 'comment',
121
- label: 'Delete Comment',
122
- click: (t) => {
123
- const target = t as CommentModel;
124
- if (target.isNodeComment() && target._parent instanceof NodeSvg) {
125
- target._parent.removeComment();
126
- } else {
127
- target.getWorkspace().removeComment(target);
128
- }
129
- }
130
- });
131
-
132
- ContextMenu.registerOption('k_duplicate', {
133
- showFor: 'node',
134
- label: 'Duplicate',
135
- click: t => {
136
- const node = t as NodeSvg;
137
- if (!node.workspace) return;
138
- node.workspace.cloneNode(node);
139
- }
140
- });
141
-
142
- export { ContextMenu };
143
- export default ContextOptsRegistry;
@@ -1,215 +0,0 @@
1
- import { G } from "@svgdotjs/svg.js";
2
- import Field, { AnyField } from "./field";
3
- import NodeSvg from "./nodesvg";
4
-
5
- /**
6
- * Allowed owner types for the dropdown container.
7
- * Can be either a NodeSvg or a Field.
8
- */
9
- export type AllowedOwner = NodeSvg | AnyField;
10
-
11
- /**
12
- * Get absolute position of an HTMLElement relative to the document.
13
- * @param el - The HTML element to measure.
14
- * @returns The bounding box with scroll offset.
15
- */
16
- function getAbsolutePosition(el: HTMLElement) {
17
- const rect = el.getBoundingClientRect();
18
- return {
19
- x: rect.left + window.scrollX,
20
- y: rect.top + window.scrollY,
21
- width: rect.width,
22
- height: rect.height,
23
- };
24
- }
25
-
26
- /**
27
- * Options for creating a dropdown menu.
28
- */
29
- export interface DropdownOptions {
30
- /** List of items to display in the dropdown */
31
- items: { label: string; value: string }[];
32
- /** Callback when an item is selected */
33
- onSelect?: (value: string, item: { label: string; value: string }) => void;
34
- /** Optional fixed width of the dropdown */
35
- width?: number;
36
- }
37
-
38
- /**
39
- * Dropdown container for NodeSvg or Field elements.
40
- * Supports singleton behavior (only one dropdown visible at a time).
41
- */
42
- class DropdownContainer {
43
- private static current: DropdownContainer | null = null;
44
- private owner: AllowedOwner | null = null;
45
- private rootEl: HTMLDivElement;
46
- private options: DropdownOptions | null = null;
47
- private constraint: { x: number; y: number; width: number; height: number };
48
- private offset: { dx: number; dy: number };
49
- private currentRemoveListener: (() => void) | null = null;
50
- /**
51
- * Creates the dropdown container and attaches it to the DOM.
52
- */
53
- constructor() {
54
- this.rootEl = document.createElement("div");
55
- this.rootEl.className = "KabelDropdownMenu";
56
- this.rootEl.style.position = "absolute";
57
- this.rootEl.style.display = "none";
58
- document.body.appendChild(this.rootEl);
59
-
60
- this.constraint = { x: 0, y: 0, width: 0, height: 0 };
61
- this.offset = { dx: 0, dy: 0 };
62
- }
63
-
64
- /**
65
- * Move the dropdown by an offset.
66
- * @param dx - horizontal offset
67
- * @param dy - vertical offset
68
- */
69
- move(dx: number, dy: number) {
70
- this.offset.dx = dx;
71
- this.offset.dy = dy;
72
- this.updatePosition();
73
- }
74
-
75
- /**
76
- * Update the dropdown position based on constraint and offset.
77
- */
78
- private updatePosition() {
79
- const { x, y, height } = this.constraint;
80
- const { dx, dy } = this.offset;
81
- this.rootEl.style.left = `${x + dx}px`;
82
- this.rootEl.style.top = `${y + height + dy}px`; // anchored below
83
- }
84
-
85
- /**
86
- * Set inner HTML content of the dropdown.
87
- * @param html - HTML string
88
- */
89
- setContent(html: string) {
90
- this.rootEl.innerHTML = html;
91
- }
92
-
93
- /**
94
- * Append an element as a child to the dropdown.
95
- * @param element - Element to append
96
- * @returns The appended element
97
- */
98
- appendChild(element: Element) {
99
- this.rootEl.appendChild(element);
100
- return element;
101
- }
102
-
103
- /**
104
- * Show the dropdown for a given owner.
105
- * @param owner - NodeSvg or Field that owns this dropdown
106
- * @param options - Dropdown configuration options
107
- */
108
- show(owner: AllowedOwner, options: DropdownOptions) {
109
- if (!owner.svgGroup) return;
110
- this.hide(); // close existing dropdown first
111
- this.owner = owner;
112
- if (options) this.options = options;
113
- if (this.currentRemoveListener) this.currentRemoveListener();
114
- this.currentRemoveListener = null;
115
- const groupRect = owner.svgGroup.node.getBoundingClientRect();
116
- this.constraint = {
117
- x: groupRect.left + window.scrollX,
118
- y: groupRect.top + window.scrollY,
119
- width: groupRect.width,
120
- height: groupRect.height,
121
- };
122
-
123
- this.offset = { dx: 0, dy: 0 };
124
-
125
- this.rootEl.innerHTML = "";
126
- if (options.width) this.rootEl.style.width = `${options.width}px`;
127
- this.rootEl.style.display = "block";
128
-
129
- // Render items
130
- if (options.items) {
131
- options.items.forEach((item) => {
132
- const el = document.createElement("div");
133
- el.className = "KabelDropdownItem";
134
- el.textContent = item.label;
135
- el.onclick = () => {
136
- options.onSelect?.(item.value, item);
137
- this.hide();
138
- };
139
- this.rootEl.appendChild(el);
140
- });
141
- }
142
- if (owner instanceof NodeSvg) {
143
- // Add a move listener to the node's workspace.
144
- const ws = owner.workspace;
145
- let remove = ws?.addMoveListener(() => {
146
- if (this.owner !== owner) {
147
- remove!(); // disconnect when owner changes.
148
- return;
149
- }
150
- this.hideIfOwner(owner)
151
- });
152
- this.currentRemoveListener = remove as () => void;
153
- }
154
- if (owner instanceof Field) {
155
- // Add a move listener to the field's workspace.
156
- const ws = owner.node!.workspace;
157
- let remove = ws?.addMoveListener(() => {
158
- if (this.owner !== owner) {
159
- console.log("Disconnecting..");
160
- remove!(); // disconnect when owner changes.
161
- return;
162
- }
163
- console.log("Hiding..");
164
- this.hide();
165
- });
166
- this.currentRemoveListener = remove as () => void;
167
- }
168
- this.updatePosition();
169
- DropdownContainer.current = this;
170
- }
171
-
172
- /**
173
- * Hide this dropdown.
174
- */
175
- hide() {
176
- if (DropdownContainer.current !== this) return;
177
- this.rootEl.style.display = "none";
178
- this.rootEl.innerHTML = "";
179
- this.owner = null;
180
- this.options = null;
181
- DropdownContainer.current = null;
182
- if (this.currentRemoveListener) this.currentRemoveListener();
183
- this.currentRemoveListener = null;
184
- }
185
-
186
- /**
187
- * Hide this dropdown if the given owner currently owns it.
188
- * @param owner - The owner to check
189
- */
190
- hideIfOwner(owner: AllowedOwner) {
191
- if (this.owner === owner) {
192
- this.hide();
193
- }
194
- }
195
-
196
- /** @returns True if the dropdown is currently visible */
197
- isVisible(): boolean {
198
- return DropdownContainer.current === this;
199
- }
200
-
201
- /** @returns The current owner of the dropdown, or null if none */
202
- getOwner(): AllowedOwner | null {
203
- return this.owner;
204
- }
205
-
206
- /** @returns The currently visible dropdown container singleton */
207
- static getCurrent(): DropdownContainer | null {
208
- return DropdownContainer.current;
209
- }
210
- }
211
-
212
- // Singleton export
213
- const dropdownContainer = new DropdownContainer();
214
- export default dropdownContainer;
215
- export { DropdownContainer };