@edv4h/usketch-plugin-map 0.2.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 (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +44 -0
  3. package/dist/autotile.d.ts +42 -0
  4. package/dist/autotile.d.ts.map +1 -0
  5. package/dist/autotile.js +96 -0
  6. package/dist/autotile.js.map +1 -0
  7. package/dist/gen-state.d.ts +20 -0
  8. package/dist/gen-state.d.ts.map +1 -0
  9. package/dist/gen-state.js +16 -0
  10. package/dist/gen-state.js.map +1 -0
  11. package/dist/generate.d.ts +28 -0
  12. package/dist/generate.d.ts.map +1 -0
  13. package/dist/generate.js +93 -0
  14. package/dist/generate.js.map +1 -0
  15. package/dist/generators/index.d.ts +34 -0
  16. package/dist/generators/index.d.ts.map +1 -0
  17. package/dist/generators/index.js +138 -0
  18. package/dist/generators/index.js.map +1 -0
  19. package/dist/generators/noise.d.ts +6 -0
  20. package/dist/generators/noise.d.ts.map +1 -0
  21. package/dist/generators/noise.js +39 -0
  22. package/dist/generators/noise.js.map +1 -0
  23. package/dist/generators/rng.d.ts +7 -0
  24. package/dist/generators/rng.d.ts.map +1 -0
  25. package/dist/generators/rng.js +31 -0
  26. package/dist/generators/rng.js.map +1 -0
  27. package/dist/icons.d.ts +17 -0
  28. package/dist/icons.d.ts.map +1 -0
  29. package/dist/icons.js +949 -0
  30. package/dist/icons.js.map +1 -0
  31. package/dist/index.d.ts +11 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +10 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/lod.d.ts +27 -0
  36. package/dist/lod.d.ts.map +1 -0
  37. package/dist/lod.js +73 -0
  38. package/dist/lod.js.map +1 -0
  39. package/dist/map-icon-shape.d.ts +14 -0
  40. package/dist/map-icon-shape.d.ts.map +1 -0
  41. package/dist/map-icon-shape.js +106 -0
  42. package/dist/map-icon-shape.js.map +1 -0
  43. package/dist/map-layer.d.ts +24 -0
  44. package/dist/map-layer.d.ts.map +1 -0
  45. package/dist/map-layer.js +167 -0
  46. package/dist/map-layer.js.map +1 -0
  47. package/dist/map-tool-id.d.ts +3 -0
  48. package/dist/map-tool-id.d.ts.map +1 -0
  49. package/dist/map-tool-id.js +3 -0
  50. package/dist/map-tool-id.js.map +1 -0
  51. package/dist/map-tool.d.ts +3 -0
  52. package/dist/map-tool.d.ts.map +1 -0
  53. package/dist/map-tool.js +308 -0
  54. package/dist/map-tool.js.map +1 -0
  55. package/dist/palette.d.ts +8 -0
  56. package/dist/palette.d.ts.map +1 -0
  57. package/dist/palette.js +92 -0
  58. package/dist/palette.js.map +1 -0
  59. package/dist/plugin.d.ts +18 -0
  60. package/dist/plugin.d.ts.map +1 -0
  61. package/dist/plugin.js +137 -0
  62. package/dist/plugin.js.map +1 -0
  63. package/dist/range-erase-state.d.ts +9 -0
  64. package/dist/range-erase-state.d.ts.map +1 -0
  65. package/dist/range-erase-state.js +12 -0
  66. package/dist/range-erase-state.js.map +1 -0
  67. package/dist/range-erase-tool.d.ts +4 -0
  68. package/dist/range-erase-tool.d.ts.map +1 -0
  69. package/dist/range-erase-tool.js +58 -0
  70. package/dist/range-erase-tool.js.map +1 -0
  71. package/dist/range-erase.d.ts +14 -0
  72. package/dist/range-erase.d.ts.map +1 -0
  73. package/dist/range-erase.js +74 -0
  74. package/dist/range-erase.js.map +1 -0
  75. package/dist/reactive-store.d.ts +7 -0
  76. package/dist/reactive-store.d.ts.map +1 -0
  77. package/dist/reactive-store.js +33 -0
  78. package/dist/reactive-store.js.map +1 -0
  79. package/dist/render-config.d.ts +19 -0
  80. package/dist/render-config.d.ts.map +1 -0
  81. package/dist/render-config.js +16 -0
  82. package/dist/render-config.js.map +1 -0
  83. package/dist/svg-nodes.d.ts +12 -0
  84. package/dist/svg-nodes.d.ts.map +1 -0
  85. package/dist/svg-nodes.js +34 -0
  86. package/dist/svg-nodes.js.map +1 -0
  87. package/dist/team/enter-banner.d.ts +6 -0
  88. package/dist/team/enter-banner.d.ts.map +1 -0
  89. package/dist/team/enter-banner.js +111 -0
  90. package/dist/team/enter-banner.js.map +1 -0
  91. package/dist/team/team-layer.d.ts +6 -0
  92. package/dist/team/team-layer.d.ts.map +1 -0
  93. package/dist/team/team-layer.js +121 -0
  94. package/dist/team/team-layer.js.map +1 -0
  95. package/dist/team/team-map-shape.d.ts +20 -0
  96. package/dist/team/team-map-shape.d.ts.map +1 -0
  97. package/dist/team/team-map-shape.js +74 -0
  98. package/dist/team/team-map-shape.js.map +1 -0
  99. package/dist/team/team-ops.d.ts +50 -0
  100. package/dist/team/team-ops.d.ts.map +1 -0
  101. package/dist/team/team-ops.js +176 -0
  102. package/dist/team/team-ops.js.map +1 -0
  103. package/dist/team/team-state.d.ts +9 -0
  104. package/dist/team/team-state.d.ts.map +1 -0
  105. package/dist/team/team-state.js +13 -0
  106. package/dist/team/team-state.js.map +1 -0
  107. package/dist/terrain.d.ts +15 -0
  108. package/dist/terrain.d.ts.map +1 -0
  109. package/dist/terrain.js +309 -0
  110. package/dist/terrain.js.map +1 -0
  111. package/dist/tilemap-shape.d.ts +16 -0
  112. package/dist/tilemap-shape.d.ts.map +1 -0
  113. package/dist/tilemap-shape.js +77 -0
  114. package/dist/tilemap-shape.js.map +1 -0
  115. package/dist/tool-state.d.ts +12 -0
  116. package/dist/tool-state.d.ts.map +1 -0
  117. package/dist/tool-state.js +14 -0
  118. package/dist/tool-state.js.map +1 -0
  119. package/dist/ui/palette.d.ts +7 -0
  120. package/dist/ui/palette.d.ts.map +1 -0
  121. package/dist/ui/palette.js +178 -0
  122. package/dist/ui/palette.js.map +1 -0
  123. package/dist/ui/range-erase-palette.d.ts +5 -0
  124. package/dist/ui/range-erase-palette.d.ts.map +1 -0
  125. package/dist/ui/range-erase-palette.js +42 -0
  126. package/dist/ui/range-erase-palette.js.map +1 -0
  127. package/package.json +49 -0
@@ -0,0 +1,308 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { createAddShapeCommand, createDeleteWithChildrenCommand, isEffectivelyHidden, isEffectivelyLocked, } from "@edv4h/usketch-store";
3
+ import { cellKey, cellsBounds, floodFill, worldToCell, } from "./autotile.js";
4
+ import { genStateStore } from "./gen-state.js";
5
+ import { generateIntoBox, resolveTilemap } from "./generate.js";
6
+ import { ICONS_BY_KEY } from "./icons.js";
7
+ import { MAP_ICON_TYPE, makeMapIcon } from "./map-icon-shape.js";
8
+ import { applyOwner, assignIsland, commitOwner, currentOwner, resolveTeamMap, } from "./team/team-ops.js";
9
+ import { teamStateStore } from "./team/team-state.js";
10
+ import { DEFAULT_TILE } from "./tilemap-shape.js";
11
+ import { toolStateStore } from "./tool-state.js";
12
+ function MapToolIcon() {
13
+ return (_jsxs("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", children: [_jsx("path", { d: "M3 5 L8 3 L12 5 L17 3 V15 L12 17 L8 15 L3 17 Z", fill: "#a9d888", stroke: "#141414", strokeWidth: "1.4", strokeLinejoin: "round" }), _jsx("path", { d: "M8 3 V15 M12 5 V17", stroke: "#141414", strokeWidth: "1.1" })] }));
14
+ }
15
+ function cellsEqual(a, b) {
16
+ const ak = Object.keys(a);
17
+ if (ak.length !== Object.keys(b).length)
18
+ return false;
19
+ for (const k of ak)
20
+ if (a[k] !== b[k])
21
+ return false;
22
+ return true;
23
+ }
24
+ export function createMapToolDefinition(tile = DEFAULT_TILE) {
25
+ let stroke = null;
26
+ let lastKey = "";
27
+ // Range-select drag for the "generate" submode (world start point).
28
+ let genDrag = null;
29
+ // Team-ownership paint stroke (team submode = assign/erase).
30
+ let teamStroke = null;
31
+ let lastTeamKey = "";
32
+ function paintOwnerAt(ctx, event) {
33
+ if (!teamStroke)
34
+ return;
35
+ const { activeTeamId, mode } = teamStateStore.get();
36
+ if (mode === "assign" && !activeTeamId)
37
+ return;
38
+ const [c, r] = worldToCell(event.worldPoint.x, event.worldPoint.y, tile);
39
+ const key = cellKey(c, r);
40
+ if (key === lastTeamKey)
41
+ return;
42
+ lastTeamKey = key;
43
+ const owner = currentOwner(ctx.store, teamStroke.teamMapId);
44
+ if (mode === "erase") {
45
+ if (!(key in owner))
46
+ return;
47
+ delete owner[key];
48
+ }
49
+ else {
50
+ if (owner[key] === activeTeamId)
51
+ return;
52
+ owner[key] = activeTeamId;
53
+ }
54
+ applyOwner(ctx.store, teamStroke.teamMapId, owner, tile);
55
+ }
56
+ function currentCells(ctx, id) {
57
+ const s = ctx.store.getShape(id);
58
+ return s ? { ...s.cells } : {};
59
+ }
60
+ function applyCells(ctx, id, cells) {
61
+ // `cells` is an intrinsic field of TileMapShapeData, outside the base
62
+ // ShapeData type — cast at the store boundary (as freedraw does for points).
63
+ ctx.store.updateShape(id, { cells, ...cellsBounds(cells, tile) });
64
+ }
65
+ function paintAt(ctx, event) {
66
+ if (!stroke)
67
+ return;
68
+ const [c, r] = worldToCell(event.worldPoint.x, event.worldPoint.y, tile);
69
+ const key = cellKey(c, r);
70
+ if (key === lastKey)
71
+ return;
72
+ lastKey = key;
73
+ const { mode, terrain } = toolStateStore.get();
74
+ const cells = currentCells(ctx, stroke.tilemapId);
75
+ if (mode === "eraser") {
76
+ if (!(key in cells))
77
+ return;
78
+ delete cells[key];
79
+ }
80
+ else {
81
+ if (cells[key] === terrain)
82
+ return;
83
+ cells[key] = terrain;
84
+ }
85
+ applyCells(ctx, stroke.tilemapId, cells);
86
+ }
87
+ function doFill(ctx, event) {
88
+ if (!stroke)
89
+ return;
90
+ const [c, r] = worldToCell(event.worldPoint.x, event.worldPoint.y, tile);
91
+ const { terrain } = toolStateStore.get();
92
+ const cells = currentCells(ctx, stroke.tilemapId);
93
+ // Empty-cell fills are bounded to the current painted region so the flood
94
+ // is finite; painted-cell fills are naturally bounded by the region.
95
+ const b = cellsBounds(cells, tile);
96
+ const box = Object.keys(cells).length === 0
97
+ ? undefined
98
+ : {
99
+ minC: Math.floor(b.x / tile),
100
+ minR: Math.floor(b.y / tile),
101
+ maxC: Math.floor(b.x / tile) + b.width / tile - 1,
102
+ maxR: Math.floor(b.y / tile) + b.height / tile - 1,
103
+ };
104
+ const keys = floodFill(cells, c, r, box);
105
+ if (keys.length === 0)
106
+ return;
107
+ for (const k of keys)
108
+ cells[k] = terrain;
109
+ applyCells(ctx, stroke.tilemapId, cells);
110
+ }
111
+ function commit(ctx) {
112
+ if (!stroke)
113
+ return;
114
+ const { tilemapId, created, prevCells } = stroke;
115
+ stroke = null;
116
+ lastKey = "";
117
+ const shape = ctx.store.getShape(tilemapId);
118
+ const nextCells = shape ? shape.cells : {};
119
+ if (created) {
120
+ // Newly created this stroke: commit as an add (undo deletes it).
121
+ if (!shape || Object.keys(nextCells).length === 0) {
122
+ if (shape)
123
+ ctx.store.deleteShape(tilemapId);
124
+ return;
125
+ }
126
+ const finalShape = { ...shape };
127
+ ctx.store.deleteShape(tilemapId);
128
+ ctx.commands.execute(createAddShapeCommand(ctx.store, finalShape));
129
+ return;
130
+ }
131
+ // Edited an existing tilemap: commit the cells diff (undo restores prev).
132
+ if (cellsEqual(prevCells, nextCells))
133
+ return;
134
+ const prev = prevCells;
135
+ const next = { ...nextCells };
136
+ const prevBounds = cellsBounds(prev, tile);
137
+ const nextBounds = cellsBounds(next, tile);
138
+ const command = {
139
+ execute: () => ctx.store.updateShape(tilemapId, { cells: next, ...nextBounds }),
140
+ undo: () => ctx.store.updateShape(tilemapId, { cells: prev, ...prevBounds }),
141
+ };
142
+ ctx.commands.execute(command);
143
+ }
144
+ /**
145
+ * Topmost interactable map-icon under the point (frontmost wins), or null.
146
+ * Uses the shape's registered (rotation-aware) hitTest and skips shapes that
147
+ * are effectively locked/hidden, matching normal canvas interaction rules.
148
+ */
149
+ function findMapIconAt(ctx, x, y) {
150
+ const def = ctx.shapes.get(MAP_ICON_TYPE);
151
+ if (!def)
152
+ return null;
153
+ const point = { x, y };
154
+ let found = null;
155
+ for (const s of ctx.store.getShapesSorted()) {
156
+ if (s.type !== MAP_ICON_TYPE)
157
+ continue;
158
+ if (isEffectivelyLocked(ctx.store, s) || isEffectivelyHidden(ctx.store, s))
159
+ continue;
160
+ if (def.hitTest(s, point))
161
+ found = s.id;
162
+ }
163
+ return found;
164
+ }
165
+ function placeIcon(ctx, event) {
166
+ const { iconKey } = toolStateStore.get();
167
+ const def = ICONS_BY_KEY.get(iconKey);
168
+ if (!def)
169
+ return;
170
+ const shape = makeMapIcon(iconKey, def.category, event.worldPoint.x, event.worldPoint.y);
171
+ ctx.commands.execute(createAddShapeCommand(ctx.store, shape));
172
+ ctx.store.setSelection([shape.id]);
173
+ }
174
+ return {
175
+ icon: MapToolIcon,
176
+ cursor: "crosshair",
177
+ shortcut: "m",
178
+ order: 45,
179
+ onPointerDown(ctx, event) {
180
+ const { mode } = toolStateStore.get();
181
+ if (mode === "stamp") {
182
+ placeIcon(ctx, event);
183
+ return;
184
+ }
185
+ if (mode === "generate") {
186
+ genDrag = { x0: event.worldPoint.x, y0: event.worldPoint.y };
187
+ genStateStore.set({
188
+ pendingRect: { x: event.worldPoint.x, y: event.worldPoint.y, w: 0, h: 0 },
189
+ });
190
+ return;
191
+ }
192
+ if (mode === "team") {
193
+ const ts = teamStateStore.get();
194
+ const deps = { store: ctx.store, commands: ctx.commands, tile };
195
+ if (ts.mode === "island") {
196
+ if (ts.activeTeamId)
197
+ assignIsland(deps, event.worldPoint.x, event.worldPoint.y, ts.activeTeamId);
198
+ return;
199
+ }
200
+ if (ts.mode === "assign" && !ts.activeTeamId)
201
+ return; // pick a team first
202
+ const { id } = resolveTeamMap(ctx.store, tile);
203
+ teamStroke = { teamMapId: id, prevOwner: currentOwner(ctx.store, id) };
204
+ lastTeamKey = "";
205
+ paintOwnerAt(ctx, event);
206
+ return;
207
+ }
208
+ // Eraser: clicking a placed icon removes it (icons aren't terrain cells).
209
+ if (mode === "eraser") {
210
+ const iconId = findMapIconAt(ctx, event.worldPoint.x, event.worldPoint.y);
211
+ if (iconId) {
212
+ ctx.commands.execute(createDeleteWithChildrenCommand(ctx.store, iconId));
213
+ return;
214
+ }
215
+ }
216
+ const target = resolveTilemap(ctx.store, tile);
217
+ stroke = {
218
+ tilemapId: target.id,
219
+ created: target.created,
220
+ prevCells: currentCells(ctx, target.id),
221
+ };
222
+ lastKey = "";
223
+ if (mode === "fill")
224
+ doFill(ctx, event);
225
+ else
226
+ paintAt(ctx, event);
227
+ },
228
+ onPointerMove(ctx, event) {
229
+ if (teamStroke) {
230
+ paintOwnerAt(ctx, event);
231
+ return;
232
+ }
233
+ if (genDrag) {
234
+ const x = Math.min(genDrag.x0, event.worldPoint.x);
235
+ const y = Math.min(genDrag.y0, event.worldPoint.y);
236
+ const w = Math.abs(event.worldPoint.x - genDrag.x0);
237
+ const h = Math.abs(event.worldPoint.y - genDrag.y0);
238
+ genStateStore.set({ pendingRect: { x, y, w, h } });
239
+ return;
240
+ }
241
+ if (!stroke)
242
+ return;
243
+ const { mode } = toolStateStore.get();
244
+ if (mode === "brush" || mode === "eraser")
245
+ paintAt(ctx, event);
246
+ },
247
+ onPointerUp(ctx) {
248
+ if (teamStroke) {
249
+ const { teamMapId, prevOwner } = teamStroke;
250
+ teamStroke = null;
251
+ lastTeamKey = "";
252
+ commitOwner({ store: ctx.store, commands: ctx.commands, tile }, teamMapId, prevOwner);
253
+ return;
254
+ }
255
+ if (genDrag) {
256
+ const rect = genStateStore.get().pendingRect;
257
+ genDrag = null;
258
+ genStateStore.set({ pendingRect: null });
259
+ if (rect && rect.w >= tile / 2 && rect.h >= tile / 2) {
260
+ // Cells the preview rectangle actually covers (right/bottom edges
261
+ // exclusive so a boundary-aligned drag doesn't grab an extra cell).
262
+ const box = {
263
+ minC: Math.floor(rect.x / tile),
264
+ minR: Math.floor(rect.y / tile),
265
+ maxC: Math.ceil((rect.x + rect.w) / tile) - 1,
266
+ maxR: Math.ceil((rect.y + rect.h) / tile) - 1,
267
+ };
268
+ const gs = genStateStore.get();
269
+ generateIntoBox({ store: ctx.store, commands: ctx.commands, tile }, { generatorId: gs.algorithmId, seed: gs.seed, params: gs.params, box });
270
+ }
271
+ return;
272
+ }
273
+ commit(ctx);
274
+ // Keep the map tool active for continuous painting/stamping.
275
+ },
276
+ onDeactivate(ctx) {
277
+ if (genDrag) {
278
+ genDrag = null;
279
+ genStateStore.set({ pendingRect: null });
280
+ }
281
+ if (teamStroke) {
282
+ // Roll the live ownership edits back to the stroke start, then clear.
283
+ applyOwner(ctx.store, teamStroke.teamMapId, teamStroke.prevOwner, tile);
284
+ teamStroke = null;
285
+ lastTeamKey = "";
286
+ }
287
+ // Tool switched / left mid-stroke with no pointerUp: don't leave a
288
+ // half-painted, non-undoable state. Roll the live edits back to where
289
+ // the stroke started (delete a tilemap created this stroke; restore the
290
+ // previous cells of an edited one), then clear.
291
+ if (stroke) {
292
+ const { tilemapId, created, prevCells } = stroke;
293
+ if (created) {
294
+ ctx.store.deleteShape(tilemapId);
295
+ }
296
+ else {
297
+ ctx.store.updateShape(tilemapId, {
298
+ cells: prevCells,
299
+ ...cellsBounds(prevCells, tile),
300
+ });
301
+ }
302
+ stroke = null;
303
+ lastKey = "";
304
+ }
305
+ },
306
+ };
307
+ }
308
+ //# sourceMappingURL=map-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-tool.js","sourceRoot":"","sources":["../src/map-tool.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type ColorMode = "color" | "mono";
2
+ /**
3
+ * CSS custom properties to place on a container so the raw SVG markup (which
4
+ * references `var(--t-grass)`, `var(--red)`, `var(--stroke)`, ...) resolves.
5
+ * `strokeScale` scales the hand-drawn stroke width (design `--sw`, base 2.6px).
6
+ */
7
+ export declare function terrainCssVars(mode: ColorMode, strokeScale?: number): Record<string, string>;
8
+ //# sourceMappingURL=palette.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../src/palette.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAgFzC;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,SAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASvF"}
@@ -0,0 +1,92 @@
1
+ const COLOR_VARS = {
2
+ "--red": "#EF5350",
3
+ "--blue": "#4A7FB8",
4
+ "--purple": "#6C5CD6",
5
+ "--teal": "#2AA1A8",
6
+ "--yellow": "#F6C124",
7
+ "--green": "#25A05B",
8
+ "--pink": "#F48CB4",
9
+ "--orange": "#F0913E",
10
+ "--brown": "#9A6A3C",
11
+ "--t-grass": "#A9D888",
12
+ "--t-forest": "#71B96C",
13
+ "--t-water": "#8CC3E6",
14
+ "--t-sand": "#F0DBA3",
15
+ "--t-mtn": "#C7B6A0",
16
+ "--t-path": "#E7CF9E",
17
+ "--t-grass-d": "#82C15E",
18
+ "--t-forest-d": "#4E9E58",
19
+ "--t-water-d": "#5EA8D6",
20
+ "--t-sand-d": "#E3C071",
21
+ "--t-mtn-d": "#A8927A",
22
+ "--t-path-d": "#CBB07A",
23
+ "--t-snow": "#E9F2F8",
24
+ "--t-swamp": "#9BAE74",
25
+ "--t-lava": "#EE9264",
26
+ "--t-stone": "#CDCAC3",
27
+ "--t-farm": "#DDBB7E",
28
+ "--t-flower": "#C4E3A5",
29
+ "--t-snow-d": "#BCD3E3",
30
+ "--t-swamp-d": "#6F8850",
31
+ "--t-lava-d": "#CE5638",
32
+ "--t-stone-d": "#ABA79E",
33
+ "--t-farm-d": "#B99350",
34
+ "--t-flower-d": "#95CA79",
35
+ };
36
+ const MONO_VARS = {
37
+ "--red": "#E7E8EB",
38
+ "--blue": "#E7E8EB",
39
+ "--purple": "#E7E8EB",
40
+ "--teal": "#E7E8EB",
41
+ "--yellow": "#EEEFF2",
42
+ "--green": "#E7E8EB",
43
+ "--pink": "#EEEFF2",
44
+ "--orange": "#EEEFF2",
45
+ "--brown": "#DCDCDF",
46
+ "--t-grass": "#EDEEF0",
47
+ "--t-forest": "#DDDFE3",
48
+ "--t-water": "#EAEFF3",
49
+ "--t-sand": "#F1F1F0",
50
+ "--t-mtn": "#DDDDE0",
51
+ "--t-path": "#EDE9E2",
52
+ "--t-grass-d": "#CFD1D6",
53
+ "--t-forest-d": "#CFD1D6",
54
+ "--t-water-d": "#D6DBE0",
55
+ "--t-sand-d": "#DEDDDA",
56
+ "--t-mtn-d": "#BFBFC5",
57
+ "--t-path-d": "#D9D4CC",
58
+ "--t-snow": "#F4F5F7",
59
+ "--t-swamp": "#DFE0DC",
60
+ "--t-lava": "#E9E9EB",
61
+ "--t-stone": "#E2E2E4",
62
+ "--t-farm": "#EDEAE3",
63
+ "--t-flower": "#EAEEE9",
64
+ "--t-snow-d": "#D8DADF",
65
+ "--t-swamp-d": "#C8CAC5",
66
+ "--t-lava-d": "#CFCFD3",
67
+ "--t-stone-d": "#C8C8CB",
68
+ "--t-farm-d": "#D7D2C9",
69
+ "--t-flower-d": "#CFD5CE",
70
+ };
71
+ /** Fixed (mode-independent) design tokens shared by terrain + icons. */
72
+ const BASE_VARS = {
73
+ "--uskmap-stroke": "#141414",
74
+ "--uskmap-card": "#FFFFFF",
75
+ };
76
+ /**
77
+ * CSS custom properties to place on a container so the raw SVG markup (which
78
+ * references `var(--t-grass)`, `var(--red)`, `var(--stroke)`, ...) resolves.
79
+ * `strokeScale` scales the hand-drawn stroke width (design `--sw`, base 2.6px).
80
+ */
81
+ export function terrainCssVars(mode, strokeScale = 1) {
82
+ const src = mode === "mono" ? MONO_VARS : COLOR_VARS;
83
+ const out = { ...BASE_VARS };
84
+ for (const [k, v] of Object.entries(src))
85
+ out[k] = v;
86
+ // design markup uses bare --stroke/--card; alias them.
87
+ out["--stroke"] = BASE_VARS["--uskmap-stroke"];
88
+ out["--card"] = BASE_VARS["--uskmap-card"];
89
+ out["--sw"] = `${2.6 * strokeScale}px`;
90
+ return out;
91
+ }
92
+ //# sourceMappingURL=palette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palette.js","sourceRoot":"","sources":["../src/palette.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { UsketchPlugin } from "@edv4h/usketch-shared";
2
+ import type { ColorMode } from "./palette.js";
3
+ import { type LineStyle } from "./render-config.js";
4
+ import { type TerrainKey } from "./terrain.js";
5
+ export interface MapPluginOptions {
6
+ /** Tile size in world units. Default 40 (matches the design grid). */
7
+ tile?: number;
8
+ defaultColorMode?: ColorMode;
9
+ defaultLineStyle?: LineStyle;
10
+ /**
11
+ * Terrain used for unset cells (e.g. `"water"` → unpainted/off-map space is
12
+ * sea). Default undefined = truly empty. Adjustable at runtime via the Control
13
+ * HUD "空きマス" setting.
14
+ */
15
+ emptyTerrain?: TerrainKey;
16
+ }
17
+ export declare function createMapPlugin(options?: MapPluginOptions): UsketchPlugin;
18
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAK1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,oBAAoB,CAAC;AAIvE,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAKzD,MAAM,WAAW,gBAAgB;IAChC,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B;;;;OAIG;IACH,YAAY,CAAC,EAAE,UAAU,CAAC;CAC1B;AAQD,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,aAAa,CA0H7E"}
package/dist/plugin.js ADDED
@@ -0,0 +1,137 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { MAP_ICON_TYPE, mapIconShapeDefinition } from "./map-icon-shape.js";
3
+ import { MapTerrainLayer } from "./map-layer.js";
4
+ import { createMapToolDefinition } from "./map-tool.js";
5
+ import { MAP_TOOL_ID } from "./map-tool-id.js";
6
+ import { createRangeEraseToolDefinition, RANGE_ERASE_TOOL_ID } from "./range-erase-tool.js";
7
+ import { renderConfigStore } from "./render-config.js";
8
+ import { EnterBanner } from "./team/enter-banner.js";
9
+ import { TeamAreaLayer } from "./team/team-layer.js";
10
+ import { createTeamMapShapeDefinition, TEAM_MAP_TYPE } from "./team/team-map-shape.js";
11
+ import { TERRAINS } from "./terrain.js";
12
+ import { createTileMapShapeDefinition, DEFAULT_TILE, TILEMAP_TYPE } from "./tilemap-shape.js";
13
+ import { MapPalette } from "./ui/palette.js";
14
+ import { RangeErasePalette } from "./ui/range-erase-palette.js";
15
+ const TERRAIN_LAYER_ID = "usketch-map:terrain";
16
+ const TEAM_LAYER_ID = "usketch-map:team";
17
+ const ENTER_BANNER_ID = "usketch-map:enter-banner";
18
+ const PALETTE_LAYER_ID = "usketch-map:palette";
19
+ const ERASE_PALETTE_LAYER_ID = "usketch-map:erase-palette";
20
+ export function createMapPlugin(options = {}) {
21
+ const tile = options.tile ?? DEFAULT_TILE;
22
+ if (options.defaultColorMode || options.defaultLineStyle || options.emptyTerrain) {
23
+ renderConfigStore.set({
24
+ colorMode: options.defaultColorMode,
25
+ lineStyle: options.defaultLineStyle,
26
+ emptyTerrain: options.emptyTerrain,
27
+ });
28
+ }
29
+ return {
30
+ id: "usketch-plugin-map",
31
+ name: "RPG マップ",
32
+ setup(ctx) {
33
+ // ── Shapes (tilemap + team-map = data-only substrates, map-icon = foreground) ──
34
+ ctx.shapes.register(TILEMAP_TYPE, createTileMapShapeDefinition(tile));
35
+ ctx.shapes.register(TEAM_MAP_TYPE, createTeamMapShapeDefinition(tile));
36
+ ctx.shapes.register(MAP_ICON_TYPE, mapIconShapeDefinition);
37
+ // ── Terrain MapLayer (behind all shapes) ──
38
+ ctx.layers.register({
39
+ id: TERRAIN_LAYER_ID,
40
+ order: 40,
41
+ fixed: true,
42
+ render: (lctx) => (_jsx(MapTerrainLayer, { store: ctx.store, renderMode: lctx.renderMode, tile: tile })),
43
+ });
44
+ // ── Team areas (above terrain, below shapes) + enter banner overlay ──
45
+ ctx.layers.register({
46
+ id: TEAM_LAYER_ID,
47
+ order: 42,
48
+ fixed: true,
49
+ render: (lctx) => _jsx(TeamAreaLayer, { store: ctx.store, renderMode: lctx.renderMode }),
50
+ });
51
+ ctx.layers.register({
52
+ id: ENTER_BANNER_ID,
53
+ order: 197,
54
+ fixed: true,
55
+ render: () => _jsx(EnterBanner, { store: ctx.store, tile: tile }),
56
+ });
57
+ // ── Tools ──
58
+ ctx.tools.register(MAP_TOOL_ID, createMapToolDefinition(tile));
59
+ ctx.tools.register(RANGE_ERASE_TOOL_ID, createRangeEraseToolDefinition(tile));
60
+ // ── Palette (shown while the map tool is active) ──
61
+ ctx.layers.register({
62
+ id: PALETTE_LAYER_ID,
63
+ order: 196,
64
+ fixed: true,
65
+ render: () => _jsx(MapPalette, { store: ctx.store, commands: ctx.commands, tile: tile }),
66
+ });
67
+ ctx.layers.register({
68
+ id: ERASE_PALETTE_LAYER_ID,
69
+ order: 196,
70
+ fixed: true,
71
+ render: () => _jsx(RangeErasePalette, { store: ctx.store }),
72
+ });
73
+ // ── Tweaks as declarative HUD settings (mirror the palette) ──
74
+ const unregisterHud = ctx.hud.registerSettings({
75
+ id: "usketch-map:tweaks",
76
+ label: "RPG マップ",
77
+ fields: [
78
+ {
79
+ name: "colorMode",
80
+ label: "配色",
81
+ type: "enum",
82
+ options: [
83
+ { value: "color", label: "カラフル" },
84
+ { value: "mono", label: "モノクロ" },
85
+ ],
86
+ },
87
+ {
88
+ name: "lineStyle",
89
+ label: "線",
90
+ type: "enum",
91
+ options: [
92
+ { value: "wobble", label: "揺らぎ" },
93
+ { value: "clean", label: "クリーン" },
94
+ ],
95
+ },
96
+ { name: "strokeScale", label: "線の太さ", type: "number", min: 0.5, max: 2, step: 0.1 },
97
+ {
98
+ name: "emptyTerrain",
99
+ label: "空きマス",
100
+ type: "enum",
101
+ options: [
102
+ { value: "none", label: "なし" },
103
+ ...TERRAINS.map((t) => ({ value: t.key, label: t.name })),
104
+ ],
105
+ },
106
+ ],
107
+ get: (name) => {
108
+ if (name === "emptyTerrain")
109
+ return renderConfigStore.get().emptyTerrain ?? "none";
110
+ return renderConfigStore.get()[name];
111
+ },
112
+ set: (name, value) => {
113
+ if (name === "strokeScale")
114
+ renderConfigStore.set({ strokeScale: Number(value) });
115
+ else if (name === "colorMode")
116
+ renderConfigStore.set({ colorMode: value });
117
+ else if (name === "lineStyle")
118
+ renderConfigStore.set({ lineStyle: value });
119
+ else if (name === "emptyTerrain")
120
+ renderConfigStore.set({
121
+ emptyTerrain: value === "none" ? null : value,
122
+ });
123
+ },
124
+ subscribe: renderConfigStore.subscribe,
125
+ });
126
+ return () => {
127
+ ctx.layers.unregister(TERRAIN_LAYER_ID);
128
+ ctx.layers.unregister(TEAM_LAYER_ID);
129
+ ctx.layers.unregister(ENTER_BANNER_ID);
130
+ ctx.layers.unregister(PALETTE_LAYER_ID);
131
+ ctx.layers.unregister(ERASE_PALETTE_LAYER_ID);
132
+ unregisterHud();
133
+ };
134
+ },
135
+ };
136
+ }
137
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface RangeEraseTargets {
2
+ /** Clear terrain tiles (tilemap.cells) in the box. */
3
+ terrain: boolean;
4
+ /** Clear team ownership (team-map.owner) in the box. */
5
+ team: boolean;
6
+ }
7
+ export declare const rangeEraseStore: import("./reactive-store.js").ReactiveStore<RangeEraseTargets>;
8
+ export declare function useRangeEraseTargets(): RangeEraseTargets;
9
+ //# sourceMappingURL=range-erase-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range-erase-state.d.ts","sourceRoot":"","sources":["../src/range-erase-state.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IACjC,sDAAsD;IACtD,OAAO,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,IAAI,EAAE,OAAO,CAAC;CACd;AAED,eAAO,MAAM,eAAe,gEAG1B,CAAC;AAEH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAExD"}
@@ -0,0 +1,12 @@
1
+ // What the range-erase tool clears — user-selectable targets (multi-select).
2
+ // Module-scoped, app-local (not synced).
3
+ import { useSyncExternalStore } from "react";
4
+ import { createReactiveStore } from "./reactive-store.js";
5
+ export const rangeEraseStore = createReactiveStore({
6
+ terrain: true,
7
+ team: true,
8
+ });
9
+ export function useRangeEraseTargets() {
10
+ return useSyncExternalStore(rangeEraseStore.subscribe, rangeEraseStore.get, rangeEraseStore.get);
11
+ }
12
+ //# sourceMappingURL=range-erase-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range-erase-state.js","sourceRoot":"","sources":["../src/range-erase-state.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,yCAAyC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAS1D,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAoB;IACrE,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,IAAI;CACV,CAAC,CAAC;AAEH,MAAM,UAAU,oBAAoB;IACnC,OAAO,oBAAoB,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;AAClG,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ToolDefinition } from "@edv4h/usketch-shared";
2
+ export declare const RANGE_ERASE_TOOL_ID = "range-erase";
3
+ export declare function createRangeEraseToolDefinition(tile?: number): ToolDefinition;
4
+ //# sourceMappingURL=range-erase-tool.d.ts.map