Skip to content

Commit 8600ba4

Browse files
committed
Versão 1.5
1 parent a57979e commit 8600ba4

5 files changed

Lines changed: 966 additions & 130 deletions

File tree

CHANGELOG.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,23 @@
22

33
Todas as mudanças notáveis no projeto InvMap serão documentadas neste arquivo.
44

5+
## [v1.5] - 20/01/2026
6+
### ✔Adicionado
7+
- **Alinhamento:** Adicionado sistema de alinhamento com a grid (Shift + Arrastar).
8+
- **Funções de Copiar, Colar e Duplicar:** Agora é possível copiar, colar e duplicar nós e visuais.
9+
- **Sistema de Seleção:** Agora é possível selecionar múltiplos nós e visuais para operações em massa.
10+
- **Layers:** Agora você pode organizar o nível de camadas dos elementos do mapa.
11+
12+
### 🖊 Alterado
13+
- **Setas de Conexão selecionáveis:** Agora é possível selecionar e apagar setas de conexão sem a necessidade de apagar um dos nós da conexão.
14+
- **Melhoria na Interface do Header:** Agora é possível editar o título do mapa diretamente no header, também é possível verificar se o mapa está salvo ou não.
15+
16+
### ⚙ Corrigido
17+
- **Preview de Conexão Otimizado:** O preview agora é mais preciso e leve.
18+
- **Seleção Padrão:** Antes os elementos de texto e imagem dos nós poderiam ser selecionados acidentalmente pelo navegador, agora isso foi corrigido.
19+
- **Criar Nó Ligado a Seleção Antiga:** Antes em alguns casos ao criar um novo nó a partir de um nó existe, poderia acontecer do nó ser criado a partir do nó selecionado anteriormente ao invés do nó selecionado atualmente. Agora isso foi corrigido.
20+
- **Botões de Contexto Não Somem:** Corrigido bug que fazia com que os botões de contexto continuassem visiveis mesmo após começar a movimentar o nó.
21+
522
## [v1.4] - 09/01/2026
623
### ✔Adicionado
724
- **Changelog:** Adicionado arquivo de changelog para documentar todas as mudanças notáveis no projeto InvMap.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<p align="center">
1414
<img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License">
15-
<img src="https://img.shields.io/badge/version-1.4-orange" alt="Version">
15+
<img src="https://img.shields.io/badge/version-1.5-orange" alt="Version">
1616
<img src="https://img.shields.io/badge/status-ativo-success" alt="Status">
1717
</p>
1818

css/style.css

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,136 @@ body {
7272
opacity: 0.7;
7373
}
7474

75+
/* =================================================== */
76+
/* || HEADER & DASHBOARD || */
77+
/* =================================================== */
78+
79+
.main-header {
80+
height: 60px;
81+
padding: 0 20px;
82+
background-color: var(--sniff-bg-widget);
83+
border-bottom: 1px solid var(--sniff-border-color);
84+
display: flex;
85+
align-items: center;
86+
justify-content: space-between;
87+
box-shadow: 0 2px 10px rgba(0,0,0,0.2);
88+
z-index: 100;
89+
}
90+
91+
.header-left, .header-right {
92+
display: flex;
93+
align-items: center;
94+
gap: 15px;
95+
}
96+
97+
.header-logo {
98+
height: 32px;
99+
width: auto;
100+
filter: drop-shadow(0 0 5px rgba(249, 87, 56, 0.3));
101+
}
102+
103+
.map-meta-container {
104+
display: flex;
105+
flex-direction: column;
106+
justify-content: center;
107+
}
108+
109+
.map-title-input {
110+
background: transparent;
111+
border: none;
112+
color: var(--sniff-text-primary);
113+
font-size: 1.1rem;
114+
font-weight: 600;
115+
font-family: inherit;
116+
width: 250px;
117+
padding: 0;
118+
margin: 0;
119+
outline: none;
120+
transition: all 0.2s ease;
121+
}
122+
123+
.map-title-input:hover, .map-title-input:focus {
124+
color: var(--sniff-accent);
125+
}
126+
127+
.map-title-input::placeholder {
128+
color: var(--sniff-text-secondary);
129+
opacity: 0.5;
130+
}
131+
132+
/* --- Indicador de Status (Salvo/Modificado) --- */
133+
.save-status {
134+
display: flex;
135+
align-items: center;
136+
gap: 6px;
137+
font-size: 0.75rem;
138+
color: var(--sniff-text-secondary);
139+
cursor: default;
140+
margin-top: -2px;
141+
}
142+
143+
.status-dot {
144+
width: 8px;
145+
height: 8px;
146+
border-radius: 50%;
147+
background-color: #8ac926;
148+
box-shadow: 0 0 5px #8ac926;
149+
transition: background-color 0.3s ease, box-shadow 0.3s ease;
150+
}
151+
152+
.save-status.modified .status-dot {
153+
background-color: #ffca3a;
154+
box-shadow: 0 0 5px #ffca3a;
155+
}
156+
157+
.save-status.modified .status-text::after {
158+
content: " (Não salvo)";
159+
}
160+
161+
/* --- Relógio --- */
162+
.system-clock {
163+
background-color: var(--sniff-bg-dark);
164+
padding: 6px 12px;
165+
border-radius: 6px;
166+
border: 1px solid var(--sniff-border-color);
167+
font-family: 'Courier New', monospace;
168+
font-size: 0.9rem;
169+
color: var(--sniff-text-primary);
170+
display: flex;
171+
align-items: center;
172+
gap: 8px;
173+
}
174+
175+
.system-clock i {
176+
color: var(--sniff-accent);
177+
}
178+
179+
/* --- Badge de Versão --- */
180+
.version-badge {
181+
font-size: 0.75rem;
182+
background-color: rgba(255, 255, 255, 0.05);
183+
padding: 4px 8px;
184+
border-radius: 4px;
185+
color: var(--sniff-text-secondary);
186+
border: 1px solid rgba(255, 255, 255, 0.1);
187+
}
188+
189+
.header-divider {
190+
width: 1px;
191+
height: 25px;
192+
background-color: var(--sniff-border-color);
193+
}
194+
195+
.hide-mobile {
196+
display: inline;
197+
}
198+
199+
@media (max-width: 768px) {
200+
.hide-mobile { display: none; }
201+
.map-title-input { width: 160px; font-size: 1rem; }
202+
.system-clock { display: none; }
203+
}
204+
75205
/* =================================================== */
76206
/* || ESTILOS PARA OS ELEMENTOS DO MAPA || */
77207
/* =================================================== */
@@ -208,6 +338,31 @@ body {
208338
/* || ESTILOS PARA OS ELEMENTOS DO MAPA || */
209339
/* =================================================== */
210340

341+
/* --- Impede seleção de texto azul nativa --- */
342+
.node-group,
343+
.node-image,
344+
.node-label,
345+
.text-sticker-label,
346+
.entity-node-container,
347+
.icon-sticker-container,
348+
.visual-path-hitbox,
349+
#svg-container {
350+
-webkit-user-select: none; /* Safari */
351+
-moz-user-select: none; /* Firefox */
352+
-ms-user-select: none; /* IE10+/Edge */
353+
user-select: none; /* Standard */
354+
}
355+
356+
.node-editor-textarea,
357+
.text-sticker-textarea,
358+
.edit-entity-form input,
359+
.edit-entity-form textarea {
360+
-webkit-user-select: text;
361+
-moz-user-select: text;
362+
-ms-user-select: text;
363+
user-select: text;
364+
}
365+
211366
.node-group {
212367
cursor: pointer;
213368
}
@@ -1322,4 +1477,48 @@ body {
13221477
.forcing-light-theme input::placeholder,
13231478
.forcing-light-theme textarea::placeholder {
13241479
color: rgba(0, 0, 0, 0.5) !important;
1480+
}
1481+
1482+
.selection-box {
1483+
fill: rgba(249, 87, 56, 0.1);
1484+
stroke: var(--sniff-accent);
1485+
stroke-width: 1px;
1486+
stroke-dasharray: 4, 4;
1487+
pointer-events: none;
1488+
}
1489+
1490+
#toggle-select-mode-btn.active {
1491+
background-color: var(--sniff-accent);
1492+
color: white;
1493+
}
1494+
1495+
.node-group.multi-selected .node-rect {
1496+
stroke: var(--sniff-accent);
1497+
stroke-dasharray: 2, 2;
1498+
}
1499+
1500+
.visual-path.multi-selected {
1501+
stroke: var(--sniff-accent);
1502+
stroke-dasharray: 2, 2;
1503+
opacity: 0.8;
1504+
}
1505+
1506+
/* --- Estilos para Seleção de Arestas (Conexões) --- */
1507+
1508+
.edge-path-hitbox {
1509+
stroke: transparent;
1510+
stroke-width: 20px;
1511+
fill: none;
1512+
cursor: pointer;
1513+
}
1514+
1515+
.edge-path.selected {
1516+
stroke: var(--sniff-accent);
1517+
stroke-width: 3px;
1518+
filter: drop-shadow(0 0 3px var(--sniff-accent));
1519+
}
1520+
1521+
.edge-group:hover .edge-path {
1522+
stroke: var(--sniff-accent);
1523+
opacity: 1;
13251524
}

index.html

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,33 @@
4040
</head>
4141
<body>
4242
<header class="main-header">
43-
<div class="header-brand">
44-
<img src="imagens/InvmapLogo.png" alt="Logo do InvMap" class="header-logo">
45-
<h1>InvMap</h1>
43+
<div class="header-left">
44+
<div class="brand-container">
45+
<img src="imagens/InvmapLogo.png" alt="Logo do InvMap" class="header-logo">
46+
</div>
47+
<div class="map-meta-container">
48+
<input type="text" id="map-title-input" class="map-title-input" value="Nova Investigação" placeholder="Nome da Investigação" spellcheck="false">
49+
50+
<div class="save-status" id="save-status-indicator" title="Status do Arquivo">
51+
<span class="status-dot"></span>
52+
<span class="status-text">Salvo</span>
53+
</div>
54+
</div>
4655
</div>
47-
<div class="header-info">
56+
57+
<div class="header-right">
58+
<div class="system-clock" title="Horário Local">
59+
<i class="far fa-clock"></i>
60+
<span id="clock-display">--:--</span>
61+
</div>
62+
63+
<div class="header-divider"></div>
64+
4865
<a href="https://github.com/wolfsecur1ty/InvMap" target="_blank" class="github-link">
49-
<i class="fab fa-github"></i> GitHub
66+
<i class="fab fa-github"></i> <span class="hide-mobile">GitHub</span>
5067
</a>
51-
<span class="version-info">v1.4 (09/01/2026)</span>
68+
69+
<div class="version-badge" id="version-badge">v--</div>
5270
</div>
5371
</header>
5472

@@ -75,7 +93,12 @@ <h1>InvMap</h1>
7593
<button id="context-icon-btn" title="Mudar Ícone">
7694
<i class="fas fa-exchange-alt"></i>
7795
</button>
78-
96+
<button id="context-layer-up-btn" title="Trazer para Frente (Shift + ↑)">
97+
<i class="fas fa-arrow-up"></i>
98+
</button>
99+
<button id="context-layer-down-btn" title="Enviar para Trás (Shift + ↓)">
100+
<i class="fas fa-arrow-down"></i>
101+
</button>
79102
<button id="context-link-btn" title="Ligar a outro nó">
80103
<i class="fas fa-link"></i>
81104
</button>
@@ -108,6 +131,9 @@ <h1>InvMap</h1>
108131
</button>
109132
<input type="file" id="add-sticker-input" accept="image/*" style="display: none;">
110133
<span class="separator"></span>
134+
<button id="toggle-select-mode-btn" title="Modo de Seleção (S)">
135+
<i class="fas fa-mouse-pointer"></i>
136+
</button>
111137
<button id="link-node-btn" title="Ligar Nós Existentes">
112138
<i class="fas fa-link"></i>
113139
</button>
@@ -480,6 +506,9 @@ <h5>Opções de SVG</h5>
480506
<g id="edges-layer"></g>
481507
<g id="visuals-layer"></g>
482508
<g id="nodes-layer"></g>
509+
<g id="selection-layer">
510+
<rect id="selection-box" x="0" y="0" width="0" height="0" class="selection-box" style="display: none;"></rect>
511+
</g>
483512
<g id="handles-layer"></g>
484513
</g>
485514
</svg>

0 commit comments

Comments
 (0)