mudlet-map-editor 0.1.0

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 (54) hide show
  1. package/README.md +77 -0
  2. package/dist-lib/App.d.ts +5 -0
  3. package/dist-lib/components/AreaManagerModal.d.ts +8 -0
  4. package/dist-lib/components/ContextMenu.d.ts +8 -0
  5. package/dist-lib/components/DropdownSelect.d.ts +15 -0
  6. package/dist-lib/components/EnvManagerModal.d.ts +8 -0
  7. package/dist-lib/components/EnvPicker.d.ts +13 -0
  8. package/dist-lib/components/HelpModal.d.ts +10 -0
  9. package/dist-lib/components/RoomPanel.d.ts +15 -0
  10. package/dist-lib/components/SessionsPanel.d.ts +1 -0
  11. package/dist-lib/components/SidePanel.d.ts +10 -0
  12. package/dist-lib/components/SwatchPalette.d.ts +6 -0
  13. package/dist-lib/components/Toolbar.d.ts +6 -0
  14. package/dist-lib/components/UrlLoadModal.d.ts +4 -0
  15. package/dist-lib/components/icons.d.ts +7 -0
  16. package/dist-lib/components/panelShared.d.ts +27 -0
  17. package/dist-lib/components/panels/CustomLinePanel.d.ts +20 -0
  18. package/dist-lib/components/panels/ExitPanel.d.ts +15 -0
  19. package/dist-lib/components/panels/HistoryPanel.d.ts +8 -0
  20. package/dist-lib/components/panels/LabelPanel.d.ts +13 -0
  21. package/dist-lib/components/panels/MapPanel.d.ts +8 -0
  22. package/dist-lib/editor/commands.d.ts +30 -0
  23. package/dist-lib/editor/coords.d.ts +6 -0
  24. package/dist-lib/editor/effects/ConnectHandlesEffect.d.ts +21 -0
  25. package/dist-lib/editor/effects/CustomLinePreviewEffect.d.ts +19 -0
  26. package/dist-lib/editor/effects/GridOverlayEffect.d.ts +27 -0
  27. package/dist-lib/editor/effects/HoverHaloEffect.d.ts +19 -0
  28. package/dist-lib/editor/effects/LabelHaloEffect.d.ts +25 -0
  29. package/dist-lib/editor/effects/MarqueeEffect.d.ts +11 -0
  30. package/dist-lib/editor/effects/RubberBandEffect.d.ts +17 -0
  31. package/dist-lib/editor/effects/SelectedLinkEffect.d.ts +17 -0
  32. package/dist-lib/editor/effects/SelectionHaloEffect.d.ts +20 -0
  33. package/dist-lib/editor/effects/SnapIndicatorEffect.d.ts +14 -0
  34. package/dist-lib/editor/hitTest.d.ts +100 -0
  35. package/dist-lib/editor/labelPixmap.d.ts +12 -0
  36. package/dist-lib/editor/loadFile.d.ts +2 -0
  37. package/dist-lib/editor/mapBytes.d.ts +1 -0
  38. package/dist-lib/editor/mapHelpers.d.ts +17 -0
  39. package/dist-lib/editor/plugin.d.ts +20 -0
  40. package/dist-lib/editor/pointerController.d.ts +2 -0
  41. package/dist-lib/editor/reader/EditorMapReader.d.ts +175 -0
  42. package/dist-lib/editor/scene.d.ts +22 -0
  43. package/dist-lib/editor/session.d.ts +19 -0
  44. package/dist-lib/editor/store.d.ts +98 -0
  45. package/dist-lib/editor/tools.d.ts +52 -0
  46. package/dist-lib/editor/types.d.ts +523 -0
  47. package/dist-lib/index.d.ts +5 -0
  48. package/dist-lib/index.js +11029 -0
  49. package/dist-lib/main.d.ts +1 -0
  50. package/dist-lib/mapIO.d.ts +6 -0
  51. package/dist-lib/platform.d.ts +2 -0
  52. package/dist-lib/shims/fs-stub.d.ts +7 -0
  53. package/dist-lib/styles.css +3476 -0
  54. package/package.json +45 -0
@@ -0,0 +1,523 @@
1
+ import type { MudletColor, MudletRoom } from '../mapIO';
2
+ export type LabelFont = {
3
+ family: string;
4
+ size: number;
5
+ bold: boolean;
6
+ italic: boolean;
7
+ underline: boolean;
8
+ strikeout: boolean;
9
+ };
10
+ export declare const DEFAULT_LABEL_FONT: LabelFont;
11
+ export type LabelSnapshot = {
12
+ id: number;
13
+ pos: [number, number, number];
14
+ size: [number, number];
15
+ text: string;
16
+ fgColor: MudletColor;
17
+ bgColor: MudletColor;
18
+ noScaling: boolean;
19
+ showOnTop: boolean;
20
+ font: LabelFont;
21
+ /** Text outline color loaded from area userData (system.labelOutlineColor_N). */
22
+ outlineColor?: MudletColor;
23
+ /** Base64 PNG data URL, or empty string if no pixmap. */
24
+ pixMap: string;
25
+ /** Original image data URL set by the user (editor-only, not persisted to .dat). */
26
+ imageSrc?: string;
27
+ };
28
+ export type ToolId = 'select' | 'connect' | 'unlink' | 'addRoom' | 'delete' | 'pan' | 'customLine' | 'addLabel' | 'paint';
29
+ export type Swatch = {
30
+ id: string;
31
+ name: string;
32
+ symbol: string;
33
+ environment: number;
34
+ };
35
+ export type SwatchSet = {
36
+ id: string;
37
+ name: string;
38
+ swatches: Swatch[];
39
+ readonly?: boolean;
40
+ };
41
+ export type Direction = 'north' | 'northeast' | 'east' | 'southeast' | 'south' | 'southwest' | 'west' | 'northwest' | 'up' | 'down' | 'in' | 'out';
42
+ export declare const CARDINAL_DIRECTIONS: Direction[];
43
+ export declare const OPPOSITE: Record<Direction, Direction>;
44
+ export declare const DIR_SHORT: Record<Direction, string>;
45
+ /** 1-based direction index used by Mudlet's stubs/exitLocks arrays. */
46
+ export declare const DIR_INDEX: Record<Direction, number>;
47
+ /** Inverse of DIR_SHORT — short-form cardinal key → full Direction name. */
48
+ export declare const SHORT_TO_DIR: Record<string, Direction>;
49
+ /**
50
+ * Convert a user-typed exit name into the storage key Mudlet / the renderer
51
+ * expect. Cardinal directions must be their short form ('north' → 'n'), while
52
+ * special-exit names are preserved. Case-insensitive for the cardinal mapping.
53
+ */
54
+ export declare function normalizeCustomLineKey(name: string): string;
55
+ export type HitItem = {
56
+ kind: 'room';
57
+ id: number;
58
+ } | {
59
+ kind: 'exit';
60
+ fromId: number;
61
+ toId: number;
62
+ dir: Direction;
63
+ } | {
64
+ kind: 'customLine';
65
+ roomId: number;
66
+ exitName: string;
67
+ } | {
68
+ kind: 'label';
69
+ id: number;
70
+ areaId: number;
71
+ };
72
+ export type Selection = {
73
+ kind: 'room';
74
+ ids: number[];
75
+ } | {
76
+ kind: 'exit';
77
+ fromId: number;
78
+ toId: number;
79
+ dir: Direction;
80
+ } | {
81
+ kind: 'customLine';
82
+ roomId: number;
83
+ exitName: string;
84
+ pointIndex?: number;
85
+ } | {
86
+ kind: 'label';
87
+ id: number;
88
+ areaId: number;
89
+ } | null;
90
+ export type HoverTarget = {
91
+ kind: 'room';
92
+ id: number;
93
+ handleDir: Direction | null;
94
+ } | {
95
+ kind: 'exit';
96
+ fromId: number;
97
+ toId: number;
98
+ dir: Direction;
99
+ } | {
100
+ kind: 'customLine';
101
+ roomId: number;
102
+ exitName: string;
103
+ } | {
104
+ kind: 'label';
105
+ id: number;
106
+ areaId: number;
107
+ } | null;
108
+ export type PendingDrag = {
109
+ kind: 'drag';
110
+ roomId: number;
111
+ originX: number;
112
+ originY: number;
113
+ /** Origins of other selected rooms for multi-drag; raw Mudlet-space coords. */
114
+ multiOrigins?: {
115
+ id: number;
116
+ x: number;
117
+ y: number;
118
+ }[];
119
+ /** Render-space offset from room centre to click point, to avoid jump on drag start. */
120
+ offsetX: number;
121
+ offsetY: number;
122
+ /** Custom line waypoints at drag start for all dragged rooms, for live translation, cancel restore, and undo. */
123
+ customLineSnapshots?: ({
124
+ roomId: number;
125
+ exitName: string;
126
+ } & CustomLineSnapshot)[];
127
+ };
128
+ export type PendingConnect = {
129
+ kind: 'connect';
130
+ sourceId: number;
131
+ /** Direction chosen from a source handle, or null if the drag started on room body. */
132
+ sourceDir: Direction | null;
133
+ cursorMap: {
134
+ x: number;
135
+ y: number;
136
+ } | null;
137
+ hoverTargetId: number | null;
138
+ /** Direction on the target picked from a target handle. Null ⇒ use opposite of sourceDir. */
139
+ targetDir: Direction | null;
140
+ };
141
+ export type PendingCustomLine = {
142
+ kind: 'customLine';
143
+ roomId: number;
144
+ /** Normalized storage key (short form for cardinals). */
145
+ exitName: string;
146
+ color: MudletColor;
147
+ style: number;
148
+ arrow: boolean;
149
+ /** Accumulated waypoints in render-space [x, y]. points[0] is the room centre. */
150
+ points: [number, number][];
151
+ /** Current cursor position for preview. */
152
+ cursor: {
153
+ x: number;
154
+ y: number;
155
+ } | null;
156
+ /** Raw-map snapshot of the customLine under `exitName` before drawing started; null if none. */
157
+ previousSnapshot: CustomLineSnapshot | null;
158
+ /**
159
+ * Opposite-side stub written on the partner room so the renderer's two-way
160
+ * skip check fires. Null when drawing "one side only" or when no reciprocal
161
+ * cardinal exit exists.
162
+ */
163
+ companion: CustomLineCompanion | null;
164
+ };
165
+ /** Metadata + pre-draw snapshot of the partner-room stub used for two-way coverage. */
166
+ export type CustomLineCompanion = {
167
+ roomId: number;
168
+ /** Short-form cardinal key (e.g. 's' when main side is 'n'). */
169
+ exitName: string;
170
+ previousSnapshot: CustomLineSnapshot | null;
171
+ };
172
+ export type PendingCustomLinePoint = {
173
+ kind: 'customLinePoint';
174
+ roomId: number;
175
+ exitName: string;
176
+ pointIndex: number;
177
+ /** Raw Mudlet-space snapshot of all points before drag, for undo. */
178
+ originPoints: [number, number][];
179
+ };
180
+ export type PendingPickExit = {
181
+ kind: 'pickExit';
182
+ fromId: number;
183
+ dir: Direction;
184
+ };
185
+ export type PendingPickSpecialExit = {
186
+ kind: 'pickSpecialExit';
187
+ fromId: number;
188
+ };
189
+ export type LabelResizeHandle = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';
190
+ export type PendingLabelDrag = {
191
+ kind: 'labelDrag';
192
+ labelId: number;
193
+ areaId: number;
194
+ /** Raw Mudlet-space origin (before drag). */
195
+ originPos: [number, number, number];
196
+ /** Render-space offset from label top-left to click point, to avoid jump on drag start. */
197
+ offsetX: number;
198
+ offsetY: number;
199
+ };
200
+ export type PendingLabelRect = {
201
+ kind: 'labelRect';
202
+ areaId: number;
203
+ z: number;
204
+ startX: number;
205
+ startY: number;
206
+ currentX: number;
207
+ currentY: number;
208
+ };
209
+ export type PendingLabelResize = {
210
+ kind: 'labelResize';
211
+ labelId: number;
212
+ areaId: number;
213
+ handle: LabelResizeHandle;
214
+ /** LabelSnapshot.pos of origin (renderX, mudletY, z). */
215
+ originPos: [number, number, number];
216
+ originSize: [number, number];
217
+ };
218
+ export type PendingMarquee = {
219
+ kind: 'marquee';
220
+ /** Render-space start corner. */
221
+ startX: number;
222
+ startY: number;
223
+ /** Render-space current corner (updated on every pointer-move). */
224
+ currentX: number;
225
+ currentY: number;
226
+ ctrlHeld: boolean;
227
+ /** Room IDs that were selected before the drag began; used for Ctrl toggle. */
228
+ preExistingIds: number[];
229
+ };
230
+ export type PendingPaint = {
231
+ kind: 'paint';
232
+ painted: {
233
+ id: number;
234
+ prevSymbol: string;
235
+ prevEnv: number;
236
+ }[];
237
+ };
238
+ export type PendingPickSwatch = {
239
+ kind: 'pickSwatch';
240
+ };
241
+ export type Pending = PendingDrag | PendingConnect | PendingCustomLine | PendingCustomLinePoint | PendingPickExit | PendingPickSpecialExit | PendingMarquee | PendingLabelDrag | PendingLabelRect | PendingLabelResize | PendingPaint | PendingPickSwatch | null;
242
+ export type RoomSnapshot = MudletRoom;
243
+ export type CustomLineSnapshot = {
244
+ points: [number, number][];
245
+ color: MudletColor;
246
+ style: number;
247
+ arrow: boolean;
248
+ };
249
+ /** Opposite-side stub applied alongside a setCustomLine for two-way coverage. */
250
+ export type SetCustomLineCompanion = {
251
+ roomId: number;
252
+ exitName: string;
253
+ data: CustomLineSnapshot;
254
+ previous: CustomLineSnapshot | null;
255
+ };
256
+ export type Command = {
257
+ kind: 'moveRoom';
258
+ id: number;
259
+ from: {
260
+ x: number;
261
+ y: number;
262
+ z: number;
263
+ };
264
+ to: {
265
+ x: number;
266
+ y: number;
267
+ z: number;
268
+ };
269
+ } | {
270
+ kind: 'addRoom';
271
+ id: number;
272
+ room: RoomSnapshot;
273
+ areaId: number;
274
+ } | {
275
+ kind: 'deleteRoom';
276
+ id: number;
277
+ room: RoomSnapshot;
278
+ areaId: number;
279
+ neighborEdits: NeighborEdit[];
280
+ } | {
281
+ kind: 'addExit';
282
+ fromId: number;
283
+ dir: Direction;
284
+ toId: number;
285
+ previous: number;
286
+ reverse: {
287
+ fromId: number;
288
+ dir: Direction;
289
+ previous: number;
290
+ } | null;
291
+ } | {
292
+ kind: 'removeExit';
293
+ fromId: number;
294
+ dir: Direction;
295
+ was: number;
296
+ reverse: {
297
+ fromId: number;
298
+ dir: Direction;
299
+ was: number;
300
+ } | null;
301
+ } | {
302
+ kind: 'removeAllExits';
303
+ roomId: number;
304
+ exits: Array<{
305
+ dir: Direction;
306
+ was: number;
307
+ reverse: {
308
+ fromId: number;
309
+ dir: Direction;
310
+ was: number;
311
+ } | null;
312
+ }>;
313
+ specialExits: Array<{
314
+ name: string;
315
+ toId: number;
316
+ }>;
317
+ } | {
318
+ kind: 'setRoomField';
319
+ id: number;
320
+ field: 'name' | 'environment' | 'weight' | 'symbol';
321
+ from: string | number;
322
+ to: string | number;
323
+ } | {
324
+ kind: 'addArea';
325
+ id: number;
326
+ name: string;
327
+ } | {
328
+ kind: 'deleteArea';
329
+ id: number;
330
+ name: string;
331
+ } | {
332
+ kind: 'deleteAreaWithRooms';
333
+ areaId: number;
334
+ areaName: string;
335
+ areaSnapshot: any;
336
+ rooms: Array<{
337
+ id: number;
338
+ room: RoomSnapshot;
339
+ }>;
340
+ crossAreaNeighborEdits: NeighborEdit[];
341
+ affectedOtherAreaIds: number[];
342
+ } | {
343
+ kind: 'renameArea';
344
+ id: number;
345
+ from: string;
346
+ to: string;
347
+ } | {
348
+ kind: 'setCustomEnvColor';
349
+ envId: number;
350
+ from: MudletColor | null;
351
+ to: MudletColor | null;
352
+ } | {
353
+ kind: 'addSpecialExit';
354
+ roomId: number;
355
+ name: string;
356
+ toId: number;
357
+ } | {
358
+ kind: 'removeSpecialExit';
359
+ roomId: number;
360
+ name: string;
361
+ toId: number;
362
+ } | {
363
+ kind: 'setCustomLine';
364
+ roomId: number;
365
+ exitName: string;
366
+ data: CustomLineSnapshot;
367
+ previous: CustomLineSnapshot | null;
368
+ companion?: SetCustomLineCompanion;
369
+ } | {
370
+ kind: 'removeCustomLine';
371
+ roomId: number;
372
+ exitName: string;
373
+ snapshot: CustomLineSnapshot;
374
+ } | {
375
+ kind: 'moveRoomsToArea';
376
+ roomIds: number[];
377
+ fromAreaId: number;
378
+ toAreaId: number;
379
+ } | {
380
+ kind: 'setRoomLock';
381
+ id: number;
382
+ lock: boolean;
383
+ } | {
384
+ kind: 'setDoor';
385
+ roomId: number;
386
+ dir: Direction;
387
+ from: number;
388
+ to: number;
389
+ } | {
390
+ kind: 'setExitWeight';
391
+ roomId: number;
392
+ dir: Direction;
393
+ from: number;
394
+ to: number;
395
+ } | {
396
+ kind: 'setExitLock';
397
+ roomId: number;
398
+ dir: Direction;
399
+ lock: boolean;
400
+ } | {
401
+ kind: 'setStub';
402
+ roomId: number;
403
+ dir: Direction;
404
+ stub: boolean;
405
+ } | {
406
+ kind: 'setUserDataEntry';
407
+ roomId: number;
408
+ key: string;
409
+ from: string | null;
410
+ to: string | null;
411
+ } | {
412
+ kind: 'setAreaUserDataEntry';
413
+ areaId: number;
414
+ key: string;
415
+ from: string | null;
416
+ to: string | null;
417
+ } | {
418
+ kind: 'setMapUserDataEntry';
419
+ key: string;
420
+ from: string | null;
421
+ to: string | null;
422
+ } | {
423
+ kind: 'setSpecialExitDoor';
424
+ roomId: number;
425
+ name: string;
426
+ from: number;
427
+ to: number;
428
+ } | {
429
+ kind: 'setSpecialExitWeight';
430
+ roomId: number;
431
+ name: string;
432
+ from: number;
433
+ to: number;
434
+ } | {
435
+ kind: 'addLabel';
436
+ areaId: number;
437
+ label: LabelSnapshot;
438
+ } | {
439
+ kind: 'deleteLabel';
440
+ areaId: number;
441
+ label: LabelSnapshot;
442
+ } | {
443
+ kind: 'moveLabel';
444
+ areaId: number;
445
+ id: number;
446
+ from: [number, number, number];
447
+ to: [number, number, number];
448
+ } | {
449
+ kind: 'setLabelText';
450
+ areaId: number;
451
+ id: number;
452
+ from: string;
453
+ to: string;
454
+ } | {
455
+ kind: 'setLabelSize';
456
+ areaId: number;
457
+ id: number;
458
+ from: [number, number];
459
+ to: [number, number];
460
+ } | {
461
+ kind: 'setLabelColors';
462
+ areaId: number;
463
+ id: number;
464
+ fromFg: MudletColor;
465
+ toFg: MudletColor;
466
+ fromBg: MudletColor;
467
+ toBg: MudletColor;
468
+ } | {
469
+ kind: 'setLabelNoScaling';
470
+ areaId: number;
471
+ id: number;
472
+ from: boolean;
473
+ to: boolean;
474
+ } | {
475
+ kind: 'setLabelShowOnTop';
476
+ areaId: number;
477
+ id: number;
478
+ from: boolean;
479
+ to: boolean;
480
+ } | {
481
+ kind: 'setLabelFont';
482
+ areaId: number;
483
+ id: number;
484
+ from: LabelFont;
485
+ to: LabelFont;
486
+ } | {
487
+ kind: 'setLabelOutlineColor';
488
+ areaId: number;
489
+ id: number;
490
+ from: MudletColor | undefined;
491
+ to: MudletColor | undefined;
492
+ } | {
493
+ kind: 'setLabelPixmap';
494
+ areaId: number;
495
+ id: number;
496
+ from: string;
497
+ to: string;
498
+ } | {
499
+ kind: 'setLabelImageSrc';
500
+ areaId: number;
501
+ id: number;
502
+ from: string | undefined;
503
+ to: string | undefined;
504
+ } | {
505
+ kind: 'resizeLabel';
506
+ areaId: number;
507
+ id: number;
508
+ fromPos: [number, number, number];
509
+ toPos: [number, number, number];
510
+ fromSize: [number, number];
511
+ toSize: [number, number];
512
+ } | {
513
+ kind: 'batch';
514
+ cmds: Command[];
515
+ };
516
+ export type NeighborEdit = {
517
+ roomId: number;
518
+ dir: Direction;
519
+ was: number;
520
+ };
521
+ export type LoadedMap = {
522
+ fileName: string;
523
+ };
@@ -0,0 +1,5 @@
1
+ export { default as App } from './App';
2
+ export type { EditorPlugin, SidebarTab } from './editor/plugin';
3
+ export type { SwatchSet, Swatch } from './editor/types';
4
+ export { loadUrlIntoStore } from './editor/loadFile';
5
+ export { getMapBytes } from './editor/mapBytes';