@eyeon/map 2.0.1 → 2.0.2

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 (96) hide show
  1. package/README.md +18 -1
  2. package/dist/assets/MapViewer.css +1 -1
  3. package/dist/assets/index.css +1 -1
  4. package/dist/chunks/MapViewer.js +1745 -356
  5. package/dist/chunks/MapViewer.js.map +1 -1
  6. package/dist/chunks/stacking.js +1321 -0
  7. package/dist/chunks/stacking.js.map +1 -0
  8. package/dist/core/geometry/index.d.ts +41 -4
  9. package/dist/core/geometry/index.d.ts.map +1 -1
  10. package/dist/core/hostChrome.d.ts +20 -0
  11. package/dist/core/hostChrome.d.ts.map +1 -0
  12. package/dist/core/import/index.d.ts +48 -3
  13. package/dist/core/import/index.d.ts.map +1 -1
  14. package/dist/core/import/svgStyle.d.ts +21 -0
  15. package/dist/core/import/svgStyle.d.ts.map +1 -0
  16. package/dist/core/import/svgTransform.d.ts +49 -0
  17. package/dist/core/import/svgTransform.d.ts.map +1 -0
  18. package/dist/core/index.d.ts +3 -0
  19. package/dist/core/index.d.ts.map +1 -1
  20. package/dist/core/index.js +207 -266
  21. package/dist/core/index.js.map +1 -1
  22. package/dist/core/layerStyles.d.ts +28 -0
  23. package/dist/core/layerStyles.d.ts.map +1 -0
  24. package/dist/core/publish/index.d.ts +8 -2
  25. package/dist/core/publish/index.d.ts.map +1 -1
  26. package/dist/core/routing/graph-tools.d.ts +5 -1
  27. package/dist/core/routing/graph-tools.d.ts.map +1 -1
  28. package/dist/core/stacking.d.ts +61 -0
  29. package/dist/core/stacking.d.ts.map +1 -0
  30. package/dist/core/types.d.ts +27 -0
  31. package/dist/core/types.d.ts.map +1 -1
  32. package/dist/editor/MapEditor.d.ts +28 -16
  33. package/dist/editor/MapEditor.d.ts.map +1 -1
  34. package/dist/editor/canvas/EditorCanvas.d.ts +15 -3
  35. package/dist/editor/canvas/EditorCanvas.d.ts.map +1 -1
  36. package/dist/editor/canvas/coords.d.ts +21 -0
  37. package/dist/editor/canvas/coords.d.ts.map +1 -0
  38. package/dist/editor/draftOps.d.ts +19 -0
  39. package/dist/editor/draftOps.d.ts.map +1 -0
  40. package/dist/editor/geometryEdit.d.ts +34 -0
  41. package/dist/editor/geometryEdit.d.ts.map +1 -0
  42. package/dist/editor/index.css +1281 -145
  43. package/dist/editor/index.d.ts +8 -2
  44. package/dist/editor/index.d.ts.map +1 -1
  45. package/dist/editor/index.js +2293 -585
  46. package/dist/editor/index.js.map +1 -1
  47. package/dist/editor/labels.d.ts +5 -0
  48. package/dist/editor/labels.d.ts.map +1 -0
  49. package/dist/editor/panels/FloorsPanel.d.ts +60 -0
  50. package/dist/editor/panels/FloorsPanel.d.ts.map +1 -0
  51. package/dist/editor/panels/ImportReviewPanel.d.ts +22 -0
  52. package/dist/editor/panels/ImportReviewPanel.d.ts.map +1 -0
  53. package/dist/editor/panels/Inspector.d.ts +4 -2
  54. package/dist/editor/panels/Inspector.d.ts.map +1 -1
  55. package/dist/editor/panels/LeftRail.d.ts +19 -6
  56. package/dist/editor/panels/LeftRail.d.ts.map +1 -1
  57. package/dist/editor/panels/PreviewOverlay.d.ts +11 -2
  58. package/dist/editor/panels/PreviewOverlay.d.ts.map +1 -1
  59. package/dist/editor/portalSurface.d.ts +11 -0
  60. package/dist/editor/portalSurface.d.ts.map +1 -0
  61. package/dist/editor/previewDocument.d.ts +9 -0
  62. package/dist/editor/previewDocument.d.ts.map +1 -0
  63. package/dist/editor/tools.d.ts +20 -0
  64. package/dist/editor/tools.d.ts.map +1 -0
  65. package/dist/test-maps/shops-at-south-town/BASE - Shops At South Town.ai +26780 -26
  66. package/dist/test-maps/shops-at-south-town/LF - Shops At South Town.ai +4487 -2
  67. package/dist/test-maps/shops-at-south-town/SVG/BASE - Shops At South Town.svg +567 -0
  68. package/dist/test-maps/shops-at-south-town/SVG/LF - Shops At South Town.svg +238 -0
  69. package/dist/test-maps/shops-at-south-town/SVG/UF - Shops At South Town.svg +276 -0
  70. package/dist/test-maps/shops-at-south-town/UF - Shops At South Town.ai +4228 -1
  71. package/dist/viewer/MapViewer.d.ts +14 -3
  72. package/dist/viewer/MapViewer.d.ts.map +1 -1
  73. package/dist/viewer/camera.d.ts +34 -0
  74. package/dist/viewer/camera.d.ts.map +1 -0
  75. package/dist/viewer/components/CameraRig.d.ts +18 -0
  76. package/dist/viewer/components/CameraRig.d.ts.map +1 -0
  77. package/dist/viewer/components/LevelMeshes.d.ts +6 -1
  78. package/dist/viewer/components/LevelMeshes.d.ts.map +1 -1
  79. package/dist/viewer/components/MapScene.d.ts +6 -1
  80. package/dist/viewer/components/MapScene.d.ts.map +1 -1
  81. package/dist/viewer/components/SvgVectorLayer.d.ts +18 -0
  82. package/dist/viewer/components/SvgVectorLayer.d.ts.map +1 -0
  83. package/dist/viewer/index.css +124 -35
  84. package/dist/viewer/index.d.ts +4 -0
  85. package/dist/viewer/index.d.ts.map +1 -1
  86. package/dist/viewer/index.js +9 -4
  87. package/dist/viewer/index.js.map +1 -1
  88. package/dist/viewer/ui/MapControls.d.ts +14 -0
  89. package/dist/viewer/ui/MapControls.d.ts.map +1 -0
  90. package/dist/viewer/ui/RuntimeChrome.d.ts +3 -3
  91. package/dist/viewer/ui/RuntimeChrome.d.ts.map +1 -1
  92. package/package.json +7 -3
  93. package/dist/chunks/graph-tools.js +0 -153
  94. package/dist/chunks/graph-tools.js.map +0 -1
  95. package/dist/chunks/pathfinding.js +0 -343
  96. package/dist/chunks/pathfinding.js.map +0 -1
@@ -1,248 +1,1384 @@
1
- .eyeon-map-editor {
2
- display: grid;
3
- grid-template-columns: 220px 1fr 260px;
1
+ .eyeon-map-viewer {
2
+ position: relative;
3
+ width: 100%;
4
4
  height: 100%;
5
- min-height: 560px;
6
- background: #f8fafc;
5
+ min-height: 320px;
6
+ overflow: hidden;
7
+ background: var(--map-bg, #FFFFFF);
8
+ /* Inherit the host application's font; hosts may override with the variable. */
9
+ font-family: var(--eyeon-map-font-family, inherit);
10
+ font-size: 13px;
7
11
  color: #0f172a;
8
- font-family: system-ui, -apple-system, sans-serif;
9
- font-size: 12px;
10
12
  }
11
13
 
12
- .eyeon-map-rail {
14
+ .eyeon-map-viewer button,
15
+ .eyeon-map-viewer input,
16
+ .eyeon-map-viewer select,
17
+ .eyeon-map-viewer textarea {
18
+ font-family: inherit;
19
+ }
20
+
21
+ .eyeon-map-viewer__canvas {
22
+ position: absolute;
23
+ inset: 0;
24
+ cursor: grab;
25
+ }
26
+
27
+ .eyeon-map-viewer__canvas:active {
28
+ cursor: grabbing;
29
+ }
30
+
31
+ .eyeon-map-viewer__loading,
32
+ .eyeon-map-viewer__error {
33
+ display: flex;
34
+ align-items: center;
35
+ justify-content: center;
36
+ height: 100%;
37
+ padding: 1rem;
38
+ }
39
+
40
+ .eyeon-map-chrome {
41
+ position: absolute;
42
+ z-index: 2;
43
+ top: 12px;
44
+ left: 12px;
45
+ width: min(320px, calc(100% - 124px));
13
46
  display: flex;
14
47
  flex-direction: column;
15
- border-right: 1px solid #e2e8f0;
48
+ gap: 8px;
49
+ pointer-events: none;
50
+ }
51
+
52
+ .eyeon-map-chrome > * {
53
+ pointer-events: auto;
54
+ }
55
+
56
+ .eyeon-map-chrome__top {
57
+ display: flex;
58
+ flex-direction: column;
59
+ gap: 8px;
60
+ }
61
+
62
+ .eyeon-map-chrome__search-input {
63
+ width: 100%;
64
+ box-sizing: border-box;
65
+ border: 1px solid #e2e8f0;
66
+ border-radius: 8px;
16
67
  background: #fff;
17
- min-width: 0;
68
+ box-shadow: 0 1px 4px rgba(15, 23, 42, 0.12);
69
+ padding: 10px 12px;
70
+ font-size: 13px;
71
+ outline: none;
72
+ }
73
+
74
+ .eyeon-map-chrome__search-input:focus {
75
+ border-color: #0763b1;
18
76
  }
19
77
 
20
- .eyeon-map-rail__tabs {
78
+ .eyeon-map-chrome__amenities {
21
79
  display: grid;
22
- grid-template-columns: repeat(3, 1fr);
23
- gap: 2px;
24
- padding: 6px;
25
- border-bottom: 1px solid #e2e8f0;
80
+ grid-template-columns: repeat(auto-fill, minmax(40px, 1fr));
81
+ gap: 6px;
82
+ background: rgba(255, 255, 255, 0.92);
83
+ border-radius: 10px;
84
+ padding: 8px;
85
+ box-shadow: 0 1px 4px rgba(15, 23, 42, 0.1);
26
86
  }
27
87
 
28
- .eyeon-map-rail__tabs button {
88
+ .eyeon-map-chrome__amenity {
89
+ position: relative;
90
+ width: 40px;
91
+ height: 40px;
29
92
  border: 0;
30
- background: transparent;
31
- border-radius: 6px;
32
- padding: 6px 4px;
93
+ border-radius: 8px;
94
+ background: #f1f5f9;
95
+ cursor: pointer;
96
+ display: flex;
97
+ align-items: center;
98
+ justify-content: center;
33
99
  font-size: 11px;
34
100
  font-weight: 600;
35
- cursor: pointer;
36
- color: #64748b;
37
101
  }
38
102
 
39
- .eyeon-map-rail__tabs button.is-active {
40
- background: #eff6ff;
41
- color: #1d4ed8;
103
+ .eyeon-map-chrome__panel {
104
+ background: #fff;
105
+ border-radius: 12px;
106
+ box-shadow: 0 8px 24px rgba(15, 23, 42, 0.14);
107
+ padding: 10px;
108
+ max-height: min(60vh, 480px);
109
+ overflow: auto;
110
+ animation: eyeon-map-slide 160ms ease-out;
42
111
  }
43
112
 
44
- .eyeon-map-rail__body {
45
- overflow: auto;
46
- padding: 8px;
47
- flex: 1;
113
+ @keyframes eyeon-map-slide {
114
+ from {
115
+ opacity: 0;
116
+ transform: translateY(-6px);
117
+ }
118
+ to {
119
+ opacity: 1;
120
+ transform: translateY(0);
121
+ }
48
122
  }
49
123
 
50
- .eyeon-map-rail__heading {
51
- font-size: 10px;
124
+ .eyeon-map-chrome__empty {
125
+ color: #64748b;
126
+ font-size: 12px;
127
+ padding: 8px 4px;
128
+ }
129
+
130
+ .eyeon-map-chrome__group-title {
131
+ font-size: 11px;
52
132
  font-weight: 700;
53
133
  text-transform: uppercase;
54
134
  letter-spacing: 0.04em;
55
- color: #94a3b8;
135
+ color: #64748b;
56
136
  margin: 8px 0 4px;
57
137
  }
58
138
 
59
- .eyeon-map-rail__row {
60
- display: flex;
61
- justify-content: space-between;
62
- gap: 6px;
139
+ .eyeon-map-chrome__item {
140
+ display: block;
63
141
  width: 100%;
64
142
  text-align: left;
65
143
  border: 0;
66
144
  background: transparent;
145
+ padding: 6px 4px;
67
146
  border-radius: 6px;
68
- padding: 6px 8px;
69
147
  cursor: pointer;
70
- font-size: 12px;
148
+ font-size: 13px;
71
149
  }
72
150
 
73
- .eyeon-map-rail__row.is-active,
74
- .eyeon-map-rail__row:hover {
151
+ .eyeon-map-chrome__item:hover,
152
+ .eyeon-map-chrome__item.is-selected {
75
153
  background: #f1f5f9;
76
154
  }
77
155
 
78
- .eyeon-map-rail__muted {
79
- color: #94a3b8;
80
- font-size: 10px;
156
+ .eyeon-map-chrome__detail {
157
+ border-top: 1px solid #e2e8f0;
158
+ margin-top: 8px;
159
+ padding-top: 8px;
81
160
  }
82
161
 
83
- .eyeon-map-rail__hint {
162
+ .eyeon-map-chrome__detail-title {
163
+ font-weight: 700;
164
+ }
165
+
166
+ .eyeon-map-chrome__detail-meta {
84
167
  color: #64748b;
85
- line-height: 1.4;
86
- margin: 0 0 8px;
168
+ font-size: 12px;
87
169
  }
88
170
 
89
- .eyeon-map-rail__actions {
171
+ .eyeon-map-chrome__route {
90
172
  display: grid;
91
173
  gap: 6px;
92
174
  margin-top: 10px;
175
+ border-top: 1px solid #e2e8f0;
176
+ padding-top: 8px;
93
177
  }
94
178
 
95
- .eyeon-map-rail__file {
96
- display: grid;
97
- gap: 4px;
98
- font-weight: 600;
99
- font-size: 11px;
100
- }
101
-
102
- .eyeon-map-rail__file input {
103
- font-size: 11px;
104
- }
105
-
106
- .eyeon-map-rail__field {
179
+ .eyeon-map-chrome__route label {
107
180
  display: grid;
108
181
  gap: 4px;
109
- margin-bottom: 8px;
110
182
  font-size: 11px;
111
183
  font-weight: 600;
112
184
  color: #475569;
113
185
  }
114
186
 
115
- .eyeon-map-rail__field input,
116
- .eyeon-map-rail__field select {
187
+ .eyeon-map-chrome__route select {
117
188
  font-size: 12px;
118
- padding: 6px 8px;
119
- border: 1px solid #e2e8f0;
189
+ padding: 6px;
120
190
  border-radius: 6px;
191
+ border: 1px solid #e2e8f0;
121
192
  }
122
193
 
123
- .eyeon-map-editor__center {
124
- display: flex;
125
- flex-direction: column;
126
- min-width: 0;
194
+ .eyeon-map-chrome__accessible {
195
+ display: flex !important;
196
+ align-items: center;
197
+ gap: 6px;
198
+ font-weight: 500 !important;
127
199
  }
128
200
 
129
- .eyeon-map-editor__toolbar {
201
+ .eyeon-map-controls {
202
+ position: absolute;
203
+ inset: 0;
204
+ z-index: 3;
205
+ pointer-events: none;
206
+ }
207
+
208
+ .eyeon-map-controls__stack {
209
+ pointer-events: auto;
210
+ position: absolute;
211
+ top: 10px;
212
+ right: 10px;
130
213
  display: flex;
131
- justify-content: space-between;
214
+ flex-direction: column;
132
215
  gap: 8px;
133
- padding: 6px 8px;
134
- border-bottom: 1px solid #e2e8f0;
135
- background: #fff;
216
+ width: 94px;
136
217
  }
137
218
 
138
- .eyeon-map-editor__tools,
139
- .eyeon-map-editor__actions {
219
+ .eyeon-map-controls__floors {
140
220
  display: flex;
141
- gap: 4px;
142
- align-items: center;
143
- flex-wrap: wrap;
221
+ flex-direction: column;
144
222
  }
145
223
 
146
- .eyeon-map-editor__toolbar button {
147
- border: 1px solid #e2e8f0;
148
- background: #fff;
149
- border-radius: 6px;
150
- padding: 4px 8px;
224
+ .eyeon-map-controls__floor,
225
+ .eyeon-map-controls__reset,
226
+ .eyeon-map-controls__zoom-btn {
227
+ color: #fff;
228
+ background-color: #0763b1;
229
+ border: 0;
151
230
  font-size: 11px;
152
- font-weight: 600;
231
+ font-weight: 500;
232
+ letter-spacing: 0.02em;
153
233
  cursor: pointer;
234
+ transition: background-color 200ms;
154
235
  }
155
236
 
156
- .eyeon-map-editor__toolbar button.is-active,
157
- .eyeon-map-editor__publish {
158
- background: #2563eb;
159
- border-color: #2563eb;
160
- color: #fff;
237
+ .eyeon-map-controls__floor,
238
+ .eyeon-map-controls__reset {
239
+ width: 100%;
240
+ min-height: 27px;
241
+ padding: 6px 10px;
242
+ text-align: center;
161
243
  }
162
244
 
163
- .eyeon-map-editor__angle {
245
+ .eyeon-map-controls__floor:hover,
246
+ .eyeon-map-controls__reset:hover,
247
+ .eyeon-map-controls__zoom-btn:hover {
248
+ background-color: #054983;
249
+ }
250
+
251
+ .eyeon-map-controls__floor.is-active {
252
+ background-color: #054983;
253
+ cursor: default;
254
+ }
255
+
256
+ .eyeon-map-controls__floor:first-child {
257
+ border-radius: 5px 5px 0 0;
258
+ }
259
+
260
+ .eyeon-map-controls__floor:last-child {
261
+ border-radius: 0 0 5px 5px;
262
+ }
263
+
264
+ .eyeon-map-controls__floor:only-child {
265
+ border-radius: 5px;
266
+ }
267
+
268
+ .eyeon-map-controls__floor:not(:first-child):not(:last-child) {
269
+ border-radius: 0;
270
+ }
271
+
272
+ .eyeon-map-controls__reset {
273
+ border-radius: 5px;
274
+ text-transform: uppercase;
275
+ letter-spacing: 0.05em;
276
+ }
277
+
278
+ .eyeon-map-controls__zoom {
279
+ display: flex;
280
+ }
281
+
282
+ .eyeon-map-controls__zoom-btn {
283
+ flex: 1;
284
+ height: 27px;
164
285
  display: flex;
165
286
  align-items: center;
166
- gap: 4px;
167
- font-size: 11px;
168
- font-weight: 600;
287
+ justify-content: center;
288
+ font-size: 14px;
289
+ font-weight: 400;
290
+ padding: 0;
169
291
  }
170
292
 
171
- .eyeon-map-editor__angle input {
172
- width: 56px;
173
- font-size: 11px;
174
- padding: 3px 6px;
175
- border: 1px solid #e2e8f0;
176
- border-radius: 4px;
293
+ .eyeon-map-controls__zoom-btn:first-child {
294
+ border-radius: 5px 0 0 5px;
177
295
  }
178
296
 
179
- .eyeon-map-editor__canvas-wrap {
180
- flex: 1;
181
- min-height: 0;
182
- position: relative;
297
+ .eyeon-map-controls__zoom-btn:last-child {
298
+ border-radius: 0 5px 5px 0;
183
299
  }
184
300
 
185
- .eyeon-map-canvas {
186
- position: absolute;
187
- inset: 0;
301
+ .eyeon-map-editor {
302
+ display: grid;
303
+ grid-template-columns: minmax(0, 1fr);
304
+ height: 100%;
305
+ min-height: 0;
188
306
  overflow: hidden;
189
- background:
190
- linear-gradient(#e2e8f0 1px, transparent 1px) 0 0 / 24px 24px,
191
- linear-gradient(90deg, #e2e8f0 1px, transparent 1px) 0 0 / 24px 24px,
192
- #f8fafc;
307
+ background: #f8fafc;
308
+ color: #0f172a;
309
+ /* Inherit the host application's font; hosts may override with the variable. */
310
+ font-family: var(--eyeon-map-font-family, inherit);
311
+ font-size: 12px;
312
+ border: 1px solid #e2e8f0;
313
+ border-radius: 8px;
193
314
  }
194
315
 
195
- .eyeon-map-canvas__svg {
196
- width: 100%;
197
- height: 100%;
198
- touch-action: none;
316
+ .eyeon-map-editor button,
317
+ .eyeon-map-editor input,
318
+ .eyeon-map-editor select,
319
+ .eyeon-map-editor textarea {
320
+ font-family: inherit;
199
321
  }
200
322
 
201
- .eyeon-map-canvas__empty {
202
- position: absolute;
203
- inset: 0;
323
+ /* Admin / Storybook PORTAL editor — Map options (LeftRail) is in-library. */
324
+ .eyeon-map-editor--PORTAL {
325
+ grid-template-columns: 300px minmax(0, 1fr);
326
+ }
327
+
328
+ .eyeon-map-rail {
329
+ display: flex;
330
+ flex-direction: column;
331
+ min-width: 0;
332
+ min-height: 0;
333
+ overflow: hidden;
334
+ border-right: 1px solid #e2e8f0;
335
+ background: #fff;
336
+ }
337
+
338
+ .eyeon-map-rail__header {
204
339
  display: flex;
205
340
  align-items: center;
206
- justify-content: center;
207
- color: #94a3b8;
341
+ gap: 8px;
342
+ flex-shrink: 0;
343
+ min-height: 44px;
344
+ padding: 8px 10px;
345
+ border-bottom: 1px solid #e2e8f0;
208
346
  }
209
347
 
210
- .eyeon-map-inspector {
211
- border-left: 1px solid #e2e8f0;
212
- background: #fff;
213
- padding: 10px;
214
- overflow: auto;
348
+ .eyeon-map-rail__back {
349
+ display: inline-flex;
350
+ align-items: center;
351
+ justify-content: center;
352
+ width: 28px;
353
+ height: 28px;
354
+ border: 0;
355
+ border-radius: 6px;
356
+ background: transparent;
357
+ color: #0f172a;
358
+ cursor: pointer;
359
+ flex-shrink: 0;
215
360
  }
216
361
 
217
- .eyeon-map-inspector__heading {
218
- font-size: 10px;
219
- font-weight: 700;
220
- text-transform: uppercase;
221
- letter-spacing: 0.04em;
222
- color: #94a3b8;
223
- margin: 10px 0 6px;
362
+ .eyeon-map-rail__back:hover {
363
+ background: #f1f5f9;
224
364
  }
225
365
 
226
- .eyeon-map-inspector__empty {
227
- color: #94a3b8;
228
- padding: 12px 4px;
366
+ .eyeon-map-rail__header-title {
367
+ font-size: 13px;
368
+ font-weight: 700;
369
+ color: #0f172a;
229
370
  }
230
371
 
231
- .eyeon-map-inspector__save {
232
- margin-top: 10px;
372
+ .eyeon-map-rail__edit-map {
233
373
  width: 100%;
234
- border: 0;
235
- border-radius: 6px;
236
- background: #2563eb;
374
+ margin-bottom: 8px;
375
+ border: 1px solid #0763b1;
376
+ background: #0763b1;
237
377
  color: #fff;
238
- padding: 8px;
239
- font-size: 12px;
240
- font-weight: 600;
378
+ border-radius: 8px;
379
+ padding: 10px 12px;
380
+ font-size: 13px;
381
+ font-weight: 700;
241
382
  cursor: pointer;
242
383
  }
243
384
 
244
- .eyeon-map-preview,
245
- .eyeon-map-preview__loading {
246
- position: absolute;
247
- inset: 0;
385
+ .eyeon-map-rail__edit-map:hover {
386
+ background: #05508f;
387
+ border-color: #05508f;
388
+ }
389
+
390
+ .eyeon-map-rail__nav {
391
+ display: flex;
392
+ flex-direction: column;
393
+ gap: 4px;
394
+ }
395
+
396
+ .eyeon-map-rail__nav-item {
397
+ display: flex;
398
+ align-items: center;
399
+ justify-content: space-between;
400
+ gap: 10px;
401
+ width: 100%;
402
+ text-align: left;
403
+ border: 0;
404
+ background: transparent;
405
+ color: #0f172a;
406
+ border-radius: 8px;
407
+ padding: 10px 8px;
408
+ cursor: pointer;
409
+ }
410
+
411
+ .eyeon-map-rail__nav-item:hover {
412
+ background: #f1f5f9;
413
+ }
414
+
415
+ .eyeon-map-rail__nav-copy {
416
+ display: flex;
417
+ flex-direction: column;
418
+ gap: 2px;
419
+ min-width: 0;
420
+ }
421
+
422
+ .eyeon-map-rail__nav-title {
423
+ font-size: 13px;
424
+ font-weight: 700;
425
+ color: #0f172a;
426
+ }
427
+
428
+ .eyeon-map-rail__nav-desc {
429
+ font-size: 11px;
430
+ line-height: 1.35;
431
+ color: #64748b;
432
+ }
433
+
434
+ .eyeon-map-rail__nav-meta {
435
+ display: flex;
436
+ align-items: center;
437
+ gap: 6px;
438
+ color: #94a3b8;
439
+ flex-shrink: 0;
440
+ }
441
+
442
+ .eyeon-map-rail__nav-count {
443
+ font-size: 11px;
444
+ font-weight: 600;
445
+ color: #64748b;
446
+ }
447
+
448
+ .eyeon-map-rail__stat {
449
+ font-size: 12px;
450
+ font-weight: 600;
451
+ color: #334155;
452
+ padding: 8px 0 4px;
453
+ }
454
+
455
+ .eyeon-map-rail__body {
456
+ overflow: auto;
457
+ padding: 10px 12px 16px;
458
+ flex: 1;
459
+ min-height: 0;
460
+ }
461
+
462
+ .eyeon-map-rail__footer {
463
+ flex-shrink: 0;
464
+ padding: 8px 12px;
465
+ border-top: 1px solid #e2e8f0;
466
+ background: #f8fafc;
467
+ }
468
+
469
+ .eyeon-map-rail__heading {
470
+ font-size: 10px;
471
+ font-weight: 700;
472
+ text-transform: uppercase;
473
+ letter-spacing: 0.04em;
474
+ color: #94a3b8;
475
+ margin: 12px 0 4px;
476
+ }
477
+
478
+ .eyeon-map-rail__heading:first-child {
479
+ margin-top: 0;
480
+ }
481
+
482
+ .eyeon-map-rail__row {
483
+ display: flex;
484
+ justify-content: space-between;
485
+ align-items: center;
486
+ gap: 6px;
487
+ width: 100%;
488
+ text-align: left;
489
+ border: 0;
490
+ background: transparent;
491
+ color: #0f172a;
492
+ border-radius: 6px;
493
+ padding: 7px 8px;
494
+ cursor: pointer;
495
+ font-size: 12px;
496
+ }
497
+
498
+ .eyeon-map-rail__row.is-active,
499
+ .eyeon-map-rail__row:hover {
500
+ background: #f1f5f9;
501
+ }
502
+
503
+ .eyeon-map-rail__muted {
504
+ color: #94a3b8;
505
+ font-size: 10px;
506
+ flex-shrink: 0;
507
+ }
508
+
509
+ .eyeon-map-rail__hint {
510
+ color: #64748b;
511
+ line-height: 1.45;
512
+ margin: 0 0 10px;
513
+ }
514
+
515
+ .eyeon-map-rail__actions {
516
+ display: grid;
517
+ gap: 6px;
518
+ margin-top: 12px;
519
+ }
520
+
521
+ .eyeon-map-rail__actions button {
522
+ border: 1px solid #e2e8f0;
523
+ background: #fff;
524
+ color: #0f172a;
525
+ border-radius: 6px;
526
+ padding: 7px 8px;
527
+ font-size: 12px;
528
+ font-weight: 600;
529
+ cursor: pointer;
530
+ }
531
+
532
+ .eyeon-map-rail__file {
533
+ display: grid;
534
+ gap: 4px;
535
+ font-weight: 600;
536
+ font-size: 11px;
537
+ }
538
+
539
+ .eyeon-map-rail__file input {
540
+ font-size: 11px;
541
+ }
542
+
543
+ .eyeon-map-rail__field {
544
+ display: grid;
545
+ gap: 4px;
546
+ margin-bottom: 8px;
547
+ font-size: 11px;
548
+ font-weight: 600;
549
+ color: #475569;
550
+ }
551
+
552
+ .eyeon-map-rail__field--color {
553
+ grid-template-columns: 1fr 36px;
554
+ align-items: center;
555
+ }
556
+
557
+ .eyeon-map-rail__field--color input[type='color'] {
558
+ width: 36px;
559
+ height: 28px;
560
+ padding: 2px;
561
+ cursor: pointer;
562
+ }
563
+
564
+ .eyeon-map-rail__field input,
565
+ .eyeon-map-rail__field select {
566
+ font-size: 12px;
567
+ padding: 6px 8px;
568
+ border: 1px solid #e2e8f0;
569
+ border-radius: 6px;
570
+ }
571
+
572
+ .eyeon-map-editor__center {
573
+ display: flex;
574
+ flex-direction: column;
575
+ min-width: 0;
576
+ min-height: 0;
577
+ overflow: hidden;
578
+ }
579
+
580
+ .eyeon-map-editor__toolbar {
581
+ position: relative;
582
+ z-index: 4;
583
+ display: flex;
584
+ justify-content: space-between;
585
+ gap: 8px;
586
+ flex-shrink: 0;
587
+ padding: 8px 10px;
588
+ border-bottom: 1px solid #e2e8f0;
589
+ background: #fff;
590
+ }
591
+
592
+ .eyeon-map-editor__tools,
593
+ .eyeon-map-editor__actions {
594
+ display: flex;
595
+ gap: 4px;
596
+ align-items: center;
597
+ flex-wrap: wrap;
598
+ }
599
+
600
+ .eyeon-map-editor__tool-icons,
601
+ .eyeon-map-rail__tool-extras {
602
+ display: flex;
603
+ gap: 4px;
604
+ align-items: center;
605
+ flex-wrap: wrap;
606
+ }
607
+
608
+ .eyeon-map-rail__tool-extras {
609
+ margin-bottom: 10px;
610
+ }
611
+
612
+ .eyeon-map-editor__tool-icon {
613
+ display: inline-flex;
614
+ align-items: center;
615
+ justify-content: center;
616
+ width: 32px;
617
+ height: 32px;
618
+ padding: 0;
619
+ border: 1px solid #e2e8f0;
620
+ background: #fff;
621
+ color: #0f172a;
622
+ border-radius: 6px;
623
+ cursor: pointer;
624
+ }
625
+
626
+ .eyeon-map-editor__tool-icon:hover:not(:disabled) {
627
+ background: #f8fafc;
628
+ border-color: #cbd5e1;
629
+ }
630
+
631
+ .eyeon-map-editor__tool-icon.is-active {
632
+ background: #eff6ff;
633
+ border-color: #bfdbfe;
634
+ color: #1d4ed8;
635
+ }
636
+
637
+ .eyeon-map-editor__tool-icon:disabled {
638
+ opacity: 0.45;
639
+ cursor: not-allowed;
640
+ }
641
+
642
+ /* Immediate CSS tooltips — native title= is slow and often clipped in iframes. */
643
+ .eyeon-map-editor [data-tooltip] {
644
+ position: relative;
645
+ }
646
+
647
+ .eyeon-map-editor [data-tooltip]::after {
648
+ content: attr(data-tooltip);
649
+ position: absolute;
650
+ z-index: 30;
651
+ left: 50%;
652
+ top: calc(100% + 6px);
653
+ transform: translateX(-50%);
654
+ padding: 4px 8px;
655
+ border-radius: 6px;
656
+ background: #0f172a;
657
+ color: #fff;
658
+ font-size: 11px;
659
+ font-weight: 600;
660
+ line-height: 1.3;
661
+ letter-spacing: 0.01em;
662
+ white-space: nowrap;
663
+ box-shadow: 0 4px 12px rgba(15, 23, 42, 0.22);
664
+ opacity: 0;
665
+ visibility: hidden;
666
+ pointer-events: none;
667
+ }
668
+
669
+ .eyeon-map-editor [data-tooltip]:hover::after,
670
+ .eyeon-map-editor [data-tooltip]:focus-visible::after {
671
+ opacity: 1;
672
+ visibility: visible;
673
+ }
674
+
675
+ .eyeon-map-editor [data-tooltip]:hover,
676
+ .eyeon-map-editor [data-tooltip]:focus-visible {
677
+ z-index: 5;
678
+ }
679
+
680
+ .eyeon-map-editor__toolbar button {
681
+ border: 1px solid #e2e8f0;
682
+ background: #fff;
683
+ color: #0f172a;
684
+ border-radius: 6px;
685
+ padding: 5px 10px;
686
+ font-size: 12px;
687
+ font-weight: 600;
688
+ cursor: pointer;
689
+ }
690
+
691
+ .eyeon-map-editor__toolbar button.eyeon-map-editor__tool-icon {
692
+ padding: 0;
693
+ }
694
+
695
+ .eyeon-map-editor__toolbar button.is-active {
696
+ background: #eff6ff;
697
+ border-color: #bfdbfe;
698
+ color: #1d4ed8;
699
+ }
700
+
701
+ .eyeon-map-editor__unsaved {
702
+ color: #b45309;
703
+ font-size: 11px;
704
+ font-weight: 600;
705
+ }
706
+
707
+ .eyeon-map-editor__toolbar .eyeon-map-editor__save,
708
+ .eyeon-map-editor__toolbar .eyeon-map-editor__publish {
709
+ background-color: #0763b1;
710
+ border-color: #0763b1;
711
+ color: #fff;
712
+ }
713
+
714
+ .eyeon-map-editor__toolbar .eyeon-map-editor__save:hover:not(:disabled),
715
+ .eyeon-map-editor__toolbar .eyeon-map-editor__publish:hover:not(:disabled) {
716
+ background-color: #05508f;
717
+ border-color: #05508f;
718
+ color: #fff;
719
+ }
720
+
721
+ .eyeon-map-editor__toolbar button:disabled {
722
+ opacity: 0.45;
723
+ cursor: not-allowed;
724
+ }
725
+
726
+ .eyeon-map-editor__angle {
727
+ display: flex;
728
+ align-items: center;
729
+ gap: 4px;
730
+ font-size: 11px;
731
+ font-weight: 600;
732
+ }
733
+
734
+ .eyeon-map-editor__angle input {
735
+ width: 56px;
736
+ font-size: 11px;
737
+ padding: 3px 6px;
738
+ border: 1px solid #e2e8f0;
739
+ border-radius: 4px;
740
+ }
741
+
742
+ .eyeon-map-editor__hint {
743
+ flex-shrink: 0;
744
+ padding: 6px 12px;
745
+ background: #eff6ff;
746
+ color: #1e3a8a;
747
+ font-size: 11px;
748
+ line-height: 1.4;
749
+ border-bottom: 1px solid #dbeafe;
750
+ }
751
+
752
+ .eyeon-map-editor__canvas-wrap {
753
+ flex: 1;
754
+ min-height: 0;
755
+ position: relative;
756
+ overflow: hidden;
757
+ }
758
+
759
+ .eyeon-map-canvas {
760
+ position: absolute;
761
+ inset: 0;
762
+ overflow: hidden;
763
+ background-color: #f8fafc;
764
+ }
765
+
766
+ /* Graph paper is Edit Map only. PORTAL default is MapViewer (no grid). */
767
+ .eyeon-map-canvas--grid {
768
+ --eyeon-map-grid: 24px;
769
+ --eyeon-map-grid-diag: calc(var(--eyeon-map-grid) / 1.41421356237);
770
+ --eyeon-map-grid-line: #e2e8f0;
771
+ --eyeon-map-grid-diag-line: #e8edf2;
772
+ background-image:
773
+ linear-gradient(var(--eyeon-map-grid-line) 1px, transparent 1px),
774
+ linear-gradient(90deg, var(--eyeon-map-grid-line) 1px, transparent 1px),
775
+ repeating-linear-gradient(
776
+ 45deg,
777
+ var(--eyeon-map-grid-diag-line) 0,
778
+ var(--eyeon-map-grid-diag-line) 1px,
779
+ transparent 1px,
780
+ transparent var(--eyeon-map-grid-diag)
781
+ ),
782
+ repeating-linear-gradient(
783
+ -45deg,
784
+ var(--eyeon-map-grid-diag-line) 0,
785
+ var(--eyeon-map-grid-diag-line) 1px,
786
+ transparent 1px,
787
+ transparent var(--eyeon-map-grid-diag)
788
+ );
789
+ background-size:
790
+ var(--eyeon-map-grid) var(--eyeon-map-grid),
791
+ var(--eyeon-map-grid) var(--eyeon-map-grid),
792
+ auto,
793
+ auto;
794
+ }
795
+
796
+ .eyeon-map-canvas__svg {
797
+ width: 100%;
798
+ height: 100%;
799
+ touch-action: none;
800
+ }
801
+
802
+ .eyeon-map-canvas__empty {
803
+ position: absolute;
804
+ inset: 0;
805
+ display: flex;
806
+ align-items: center;
807
+ justify-content: center;
808
+ color: #94a3b8;
809
+ }
810
+
811
+ .eyeon-map-inspector {
812
+ padding: 0 0 8px;
813
+ }
814
+
815
+ .eyeon-map-inspector__heading {
816
+ font-size: 10px;
817
+ font-weight: 700;
818
+ text-transform: uppercase;
819
+ letter-spacing: 0.04em;
820
+ color: #94a3b8;
821
+ margin: 10px 0 6px;
822
+ }
823
+
824
+ .eyeon-map-inspector__heading:first-child {
825
+ margin-top: 0;
826
+ }
827
+
828
+ .eyeon-map-inspector__empty {
829
+ color: #64748b;
830
+ line-height: 1.45;
831
+ margin: 0 0 12px;
832
+ }
833
+
834
+ .eyeon-map-inspector__save {
835
+ margin: 4px 0 8px;
836
+ width: 100%;
837
+ border: 0;
838
+ border-radius: 6px;
839
+ background: #0763b1;
840
+ color: #fff;
841
+ padding: 8px;
842
+ font-size: 12px;
843
+ font-weight: 600;
844
+ cursor: pointer;
845
+ }
846
+
847
+ .eyeon-map-inspector__delete {
848
+ margin: 0 0 8px;
849
+ width: 100%;
850
+ border: 1px solid #dc2626;
851
+ border-radius: 6px;
852
+ background: #fff;
853
+ color: #dc2626;
854
+ padding: 8px;
855
+ font-size: 12px;
856
+ font-weight: 600;
857
+ cursor: pointer;
858
+ }
859
+
860
+ .eyeon-map-inspector__delete:hover {
861
+ background: rgba(220, 38, 38, 0.08);
862
+ }
863
+
864
+ .eyeon-map-import-review {
865
+ display: grid;
866
+ gap: 10px;
867
+ }
868
+
869
+ .eyeon-map-import-review__remap {
870
+ flex-direction: column;
871
+ align-items: stretch;
872
+ gap: 6px;
873
+ }
874
+
875
+ .eyeon-map-floors__block {
876
+ margin-bottom: 14px;
877
+ }
878
+
879
+ .eyeon-map-floors__list {
880
+ display: flex;
881
+ flex-direction: column;
882
+ }
883
+
884
+ .eyeon-map-floors__row {
885
+ display: flex;
886
+ align-items: center;
887
+ gap: 4px;
888
+ border-radius: 6px;
889
+ padding: 0;
890
+ height: 32px;
891
+ box-sizing: border-box;
892
+ }
893
+
894
+ .eyeon-map-floors__entry {
895
+ display: grid;
896
+ margin-bottom: 2px;
897
+ will-change: transform;
898
+ }
899
+
900
+ .eyeon-map-floors__row:hover,
901
+ .eyeon-map-floors__row.is-confirm {
902
+ background: #f1f5f9;
903
+ }
904
+
905
+ .eyeon-map-floors__row.is-active {
906
+ background: #eff6ff;
907
+ }
908
+
909
+ .eyeon-map-floors__row.is-placeholder {
910
+ background: #f8fafc;
911
+ outline: 1px dashed #0763b1;
912
+ }
913
+
914
+ .eyeon-map-floors__row.is-placeholder > * {
915
+ opacity: 0;
916
+ }
917
+
918
+ .eyeon-map-floors.is-reordering {
919
+ user-select: none;
920
+ cursor: grabbing;
921
+ }
922
+
923
+ .eyeon-map-floors__row--ghost {
924
+ position: fixed;
925
+ z-index: 40;
926
+ box-sizing: border-box;
927
+ background: #fff;
928
+ box-shadow: 0 8px 24px rgba(15, 23, 42, 0.16);
929
+ outline: 1px solid #e2e8f0;
930
+ pointer-events: none;
931
+ }
932
+
933
+ .eyeon-map-floors__row--ghost .eyeon-map-floors__icon-danger {
934
+ opacity: 1;
935
+ pointer-events: none;
936
+ }
937
+
938
+ .eyeon-map-floors__item {
939
+ display: flex;
940
+ align-items: center;
941
+ flex: 1;
942
+ min-width: 0;
943
+ width: auto;
944
+ height: 32px;
945
+ box-sizing: border-box;
946
+ border: 0;
947
+ background: transparent;
948
+ color: #0f172a;
949
+ text-align: left;
950
+ border-radius: 6px;
951
+ padding: 8px 0;
952
+ cursor: pointer;
953
+ font-size: 12px;
954
+ font-weight: 600;
955
+ }
956
+
957
+ .eyeon-map-floors__grip {
958
+ display: inline-flex;
959
+ align-items: center;
960
+ justify-content: center;
961
+ width: 32px;
962
+ height: 32px;
963
+ border: 0;
964
+ background: transparent;
965
+ color: #64748b;
966
+ cursor: grab;
967
+ flex-shrink: 0;
968
+ touch-action: none;
969
+ }
970
+
971
+ .eyeon-map-floors__grip:active {
972
+ cursor: grabbing;
973
+ }
974
+
975
+ .eyeon-map-floors__icon-danger {
976
+ display: inline-flex;
977
+ align-items: center;
978
+ justify-content: center;
979
+ width: 32px;
980
+ height: 32px;
981
+ border: 0;
982
+ background: transparent;
983
+ color: #dc2626;
984
+ cursor: pointer;
985
+ flex-shrink: 0;
986
+ opacity: 0;
987
+ pointer-events: none;
988
+ }
989
+
990
+ .eyeon-map-floors__row:hover .eyeon-map-floors__icon-danger,
991
+ .eyeon-map-floors__row:focus-within .eyeon-map-floors__icon-danger,
992
+ .eyeon-map-floors__row.is-confirm .eyeon-map-floors__icon-danger {
993
+ opacity: 1;
994
+ pointer-events: auto;
995
+ }
996
+
997
+ .eyeon-map-floors__icon-danger:hover:not(:disabled) {
998
+ color: #b91c1c;
999
+ background: rgba(220, 38, 38, 0.1);
1000
+ border-radius: 6px;
1001
+ }
1002
+
1003
+ .eyeon-map-floors__icon-danger:disabled {
1004
+ cursor: wait;
1005
+ }
1006
+
1007
+ .eyeon-map-floors__add,
1008
+ .eyeon-map-floors__primary,
1009
+ .eyeon-map-floors__danger {
1010
+ border: 1px solid #e2e8f0;
1011
+ background: #fff;
1012
+ color: #0f172a;
1013
+ border-radius: 6px;
1014
+ padding: 6px 8px;
1015
+ font-size: 12px;
1016
+ font-weight: 600;
1017
+ cursor: pointer;
1018
+ }
1019
+
1020
+ .eyeon-map-floors__add {
1021
+ width: 100%;
1022
+ margin: 0 0 8px;
1023
+ text-align: center;
1024
+ }
1025
+
1026
+ .eyeon-map-floors__primary {
1027
+ background: #0763b1;
1028
+ border-color: #0763b1;
1029
+ color: #fff;
1030
+ }
1031
+
1032
+ .eyeon-map-floors__primary:hover:not(:disabled) {
1033
+ background: #05508f;
1034
+ border-color: #05508f;
1035
+ color: #fff;
1036
+ }
1037
+
1038
+ .eyeon-map-floors__primary:disabled {
1039
+ opacity: 0.45;
1040
+ cursor: not-allowed;
1041
+ }
1042
+
1043
+ .eyeon-map-floors__edit-actions {
1044
+ display: flex;
1045
+ flex-direction: column;
1046
+ gap: 8px;
1047
+ margin-top: 12px;
1048
+ }
1049
+
1050
+ .eyeon-map-floors__edit-row {
1051
+ display: flex;
1052
+ align-items: center;
1053
+ justify-content: space-between;
1054
+ gap: 8px;
1055
+ }
1056
+
1057
+ .eyeon-map-floors__edit-row .eyeon-map-floors__danger {
1058
+ width: auto;
1059
+ flex: 0 0 auto;
1060
+ }
1061
+
1062
+ .eyeon-map-floors__edit-row .eyeon-map-floors__primary {
1063
+ margin-left: auto;
1064
+ width: auto;
1065
+ flex: 0 0 auto;
1066
+ }
1067
+
1068
+ .eyeon-map-floors__danger {
1069
+ display: inline-flex;
1070
+ align-items: center;
1071
+ justify-content: center;
1072
+ gap: 6px;
1073
+ width: 100%;
1074
+ background: #fff;
1075
+ border-color: #dc2626;
1076
+ color: #dc2626;
1077
+ }
1078
+
1079
+ .eyeon-map-floors__danger:hover:not(:disabled) {
1080
+ background: rgba(220, 38, 38, 0.08);
1081
+ border-color: #b91c1c;
1082
+ color: #b91c1c;
1083
+ }
1084
+
1085
+ .eyeon-map-floors__danger:disabled {
1086
+ opacity: 0.75;
1087
+ cursor: wait;
1088
+ }
1089
+
1090
+ .eyeon-map-floors__spinner {
1091
+ width: 12px;
1092
+ height: 12px;
1093
+ border: 2px solid rgba(220, 38, 38, 0.28);
1094
+ border-top-color: #dc2626;
1095
+ border-radius: 50%;
1096
+ animation: eyeon-map-spin 0.6s linear infinite;
1097
+ }
1098
+
1099
+ @keyframes eyeon-map-spin {
1100
+ to {
1101
+ transform: rotate(360deg);
1102
+ }
1103
+ }
1104
+
1105
+ .eyeon-map-floors__error {
1106
+ color: #b91c1c;
1107
+ font-size: 11px;
1108
+ margin: 8px 0;
1109
+ }
1110
+
1111
+ .eyeon-map-floors__notice {
1112
+ margin: 8px 0 0;
1113
+ padding: 10px 12px;
1114
+ border: 1px solid #fcd34d;
1115
+ border-radius: 8px;
1116
+ background: #fffbeb;
1117
+ color: #78350f;
1118
+ }
1119
+
1120
+ .eyeon-map-floors__notice-title {
1121
+ margin: 0 0 6px;
1122
+ font-size: 11px;
1123
+ font-weight: 700;
1124
+ }
1125
+
1126
+ .eyeon-map-floors__notice-list {
1127
+ margin: 0;
1128
+ padding-left: 16px;
1129
+ display: grid;
1130
+ gap: 4px;
1131
+ font-size: 11px;
1132
+ line-height: 1.45;
1133
+ }
1134
+
1135
+ .eyeon-map-floors__notice-list code {
1136
+ font-size: 10px;
1137
+ padding: 0 3px;
1138
+ border-radius: 3px;
1139
+ background: rgba(120, 53, 15, 0.1);
1140
+ }
1141
+
1142
+ .eyeon-map-modal {
1143
+ position: fixed;
1144
+ inset: 0;
1145
+ z-index: 60;
1146
+ display: flex;
1147
+ align-items: center;
1148
+ justify-content: center;
1149
+ padding: 16px;
1150
+ }
1151
+
1152
+ .eyeon-map-modal__backdrop {
1153
+ position: absolute;
1154
+ inset: 0;
1155
+ background: rgba(15, 23, 42, 0.45);
1156
+ }
1157
+
1158
+ .eyeon-map-modal__card {
1159
+ position: relative;
1160
+ width: min(380px, 100%);
1161
+ padding: 20px;
1162
+ border-radius: 12px;
1163
+ background: #fff;
1164
+ box-shadow: 0 20px 45px rgba(15, 23, 42, 0.25);
1165
+ text-align: center;
1166
+ }
1167
+
1168
+ .eyeon-map-modal__title {
1169
+ margin: 0 0 8px;
1170
+ font-size: 16px;
1171
+ font-weight: 700;
1172
+ color: #0f172a;
1173
+ }
1174
+
1175
+ .eyeon-map-modal__body {
1176
+ margin: 0 0 18px;
1177
+ font-size: 12px;
1178
+ line-height: 1.5;
1179
+ color: #475569;
1180
+ }
1181
+
1182
+ .eyeon-map-modal__actions {
1183
+ display: flex;
1184
+ gap: 8px;
1185
+ justify-content: center;
1186
+ }
1187
+
1188
+ .eyeon-map-modal__actions .eyeon-map-floors__danger {
1189
+ width: auto;
1190
+ min-width: 120px;
1191
+ background: #dc2626;
1192
+ border-color: #dc2626;
1193
+ color: #fff;
1194
+ padding: 8px 14px;
1195
+ }
1196
+
1197
+ .eyeon-map-modal__actions .eyeon-map-floors__danger:hover:not(:disabled) {
1198
+ background: #b91c1c;
1199
+ border-color: #b91c1c;
1200
+ color: #fff;
1201
+ }
1202
+
1203
+ .eyeon-map-modal__actions .eyeon-map-floors__danger .eyeon-map-floors__spinner {
1204
+ border-color: rgba(255, 255, 255, 0.4);
1205
+ border-top-color: #fff;
1206
+ }
1207
+
1208
+ .eyeon-map-modal__cancel {
1209
+ min-width: 100px;
1210
+ padding: 8px 14px;
1211
+ border: 1px solid #e2e8f0;
1212
+ border-radius: 6px;
1213
+ background: #fff;
1214
+ color: #0f172a;
1215
+ font-size: 12px;
1216
+ font-weight: 600;
1217
+ cursor: pointer;
1218
+ }
1219
+
1220
+ .eyeon-map-modal__cancel:hover:not(:disabled) {
1221
+ background: #f1f5f9;
1222
+ }
1223
+
1224
+ .eyeon-map-floors__drop {
1225
+ position: relative;
1226
+ display: flex;
1227
+ flex-direction: column;
1228
+ align-items: center;
1229
+ justify-content: center;
1230
+ gap: 4px;
1231
+ min-height: 84px;
1232
+ padding: 12px 10px;
1233
+ border: 1px dashed #cbd5e1;
1234
+ border-radius: 8px;
1235
+ background: #f8fafc;
1236
+ color: #334155;
1237
+ cursor: pointer;
1238
+ text-align: center;
1239
+ }
1240
+
1241
+ .eyeon-map-floors__drop input {
1242
+ position: absolute;
1243
+ width: 1px;
1244
+ height: 1px;
1245
+ opacity: 0;
1246
+ overflow: hidden;
1247
+ }
1248
+
1249
+ .eyeon-map-floors__drop.is-over,
1250
+ .eyeon-map-floors__drop:hover:not(.is-busy) {
1251
+ border-color: #0763b1;
1252
+ background: #eff6ff;
1253
+ }
1254
+
1255
+ .eyeon-map-floors__drop.has-file {
1256
+ border-style: solid;
1257
+ border-color: #93c5fd;
1258
+ background: #eff6ff;
1259
+ }
1260
+
1261
+ .eyeon-map-floors__drop.is-busy {
1262
+ cursor: wait;
1263
+ opacity: 0.7;
1264
+ }
1265
+
1266
+ .eyeon-map-floors__drop-title {
1267
+ font-size: 12px;
1268
+ font-weight: 700;
1269
+ color: #0f172a;
1270
+ word-break: break-all;
1271
+ }
1272
+
1273
+ .eyeon-map-floors__drop-meta {
1274
+ font-size: 11px;
1275
+ color: #64748b;
1276
+ }
1277
+
1278
+ .eyeon-map-floors__preview-card {
1279
+ display: flex;
1280
+ align-items: center;
1281
+ justify-content: center;
1282
+ min-height: 96px;
1283
+ max-height: 180px;
1284
+ padding: 8px;
1285
+ border: 1px solid #e2e8f0;
1286
+ border-radius: 8px;
1287
+ background: #f8fafc;
1288
+ overflow: hidden;
1289
+ }
1290
+
1291
+ .eyeon-map-floors__preview-img {
1292
+ display: block;
1293
+ max-width: 100%;
1294
+ max-height: 164px;
1295
+ width: auto;
1296
+ height: auto;
1297
+ object-fit: contain;
1298
+ }
1299
+
1300
+ .eyeon-map-floors__preview-fallback {
1301
+ padding: 12px 8px;
1302
+ font-size: 11px;
1303
+ color: #64748b;
1304
+ text-align: center;
1305
+ word-break: break-all;
1306
+ }
1307
+
1308
+ .eyeon-map-floors__svg-field {
1309
+ position: relative;
1310
+ }
1311
+
1312
+ .eyeon-map-floors__change {
1313
+ width: 100%;
1314
+ margin-top: 8px;
1315
+ border: 1px solid #cbd5e1;
1316
+ background: #fff;
1317
+ color: #0f172a;
1318
+ border-radius: 6px;
1319
+ padding: 6px 8px;
1320
+ font-size: 12px;
1321
+ font-weight: 600;
1322
+ cursor: pointer;
1323
+ }
1324
+
1325
+ .eyeon-map-floors__change:hover:not(:disabled) {
1326
+ border-color: #0763b1;
1327
+ color: #0763b1;
1328
+ background: #f8fafc;
1329
+ }
1330
+
1331
+ .eyeon-map-floors__change:disabled {
1332
+ opacity: 0.45;
1333
+ cursor: not-allowed;
1334
+ }
1335
+
1336
+ .eyeon-map-floors__progress {
1337
+ display: flex;
1338
+ align-items: center;
1339
+ gap: 8px;
1340
+ margin: 10px 0 4px;
1341
+ }
1342
+
1343
+ .eyeon-map-floors__progress-track {
1344
+ flex: 1;
1345
+ height: 8px;
1346
+ border-radius: 999px;
1347
+ background: #e2e8f0;
1348
+ overflow: hidden;
1349
+ }
1350
+
1351
+ .eyeon-map-floors__progress-bar {
1352
+ height: 100%;
1353
+ background: #0763b1;
1354
+ border-radius: 999px;
1355
+ transition: width 0.15s ease;
1356
+ }
1357
+
1358
+ .eyeon-map-floors__progress-label {
1359
+ min-width: 36px;
1360
+ font-size: 12px;
1361
+ font-weight: 700;
1362
+ color: #0763b1;
1363
+ text-align: right;
1364
+ }
1365
+
1366
+ .eyeon-map-preview {
1367
+ flex: 1;
1368
+ min-height: 0;
1369
+ width: 100%;
1370
+ position: relative;
1371
+ background: #FFFFFF;
1372
+ }
1373
+
1374
+ .eyeon-map-preview .eyeon-map-viewer {
1375
+ min-height: 0;
1376
+ height: 100%;
1377
+ }
1378
+
1379
+ .eyeon-map-preview__loading {
1380
+ display: flex;
1381
+ align-items: center;
1382
+ justify-content: center;
1383
+ height: 100%;
248
1384
  }