@eyeon/map 2.0.1 → 2.0.3

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