tfrere's picture
tfrere HF Staff
first commit
eebc40f
raw
history blame
9 kB
/* Layout Styles */
.fontmap-container {
position: relative;
width: 100vw;
height: 100vh;
overflow: hidden;
cursor: default;
margin: 0;
padding: 0;
user-select: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
background: var(--color-bg-primary);
transition: background-color var(--transition-quick);
display: flex;
flex-direction: row;
/* GPU simple */
will-change: transform;
}
.fontmap-container.dark-mode {
background: var(--color-bg-primary-dark);
}
.fontmap-container:active {
cursor: grabbing;
}
.fontmap-container.zooming {
cursor: zoom-in;
}
/* Sidebar */
.sidebar {
width: 400px;
min-width: 400px;
height: 100vh;
max-height: 100vh;
background: var(--color-bg-secondary);
border-right: 1px solid var(--color-border-primary);
display: flex;
flex-direction: column;
overflow: hidden;
position: relative;
}
.dark-mode .sidebar {
background: var(--color-bg-secondary-dark);
border-right-color: var(--color-border-primary-dark);
}
.sidebar-header {
padding: var(--spacing-lg);
display: flex;
flex-direction: column;
gap: var(--spacing-md);
flex-shrink: 0;
min-height: fit-content;
border-bottom: 1px solid var(--color-border-primary);
}
.dark-mode .sidebar-header {
border-bottom-color: var(--color-border-primary-dark);
}
/* Container de la carte */
.map-container {
position: relative;
width: 100%;
height: 100%;
}
/* Overlay de chargement pour la carte */
.map-loading-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(255, 255, 255, var(--overlay-opacity-light));
display: flex;
align-items: center;
justify-content: center;
z-index: 50;
backdrop-filter: blur(2px);
}
.dark-mode .map-loading-overlay {
background: rgba(0, 0, 0, var(--overlay-opacity-dark));
}
.map-loading-spinner {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--spacing-md);
}
.spinner-large {
width: 32px;
height: 32px;
border: 3px solid transparent;
border-top: 3px solid var(--color-text-primary);
border-radius: 50%;
animation: spin 1s linear infinite;
}
.dark-mode .spinner-large {
border-top-color: var(--color-text-primary-dark);
}
.loading-text {
font-size: 14px;
color: var(--color-text-secondary);
font-weight: 500;
}
.dark-mode .loading-text {
color: var(--color-text-secondary-dark);
}
/* Titre sur la carte */
.map-title {
position: absolute;
top: 20px;
left: 20px;
z-index: 100;
margin: 0;
font-size: 32px;
font-weight: 700;
color: var(--color-text-primary);
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
letter-spacing: -0.02em;
font-family: var(--font-logo);
pointer-events: none;
/* Bordure large avec la couleur du fond */
-webkit-text-stroke: 16px var(--color-bg-primary);
text-stroke: 16px var(--color-bg-primary);
paint-order: stroke fill;
position: relative;
}
.map-title::before {
content: attr(data-text);
position: absolute;
top: 0;
left: 0;
z-index: -1;
color: transparent;
-webkit-text-stroke: 17px var(--color-border-primary);
text-stroke: 17px var(--color-border-primary);
}
.dark-mode .map-title {
color: var(--color-text-primary-dark);
text-shadow: 0 2px 4px rgba(255, 255, 255, 0.1);
/* Bordure large avec la couleur du fond en mode sombre */
-webkit-text-stroke: 16px var(--color-bg-primary-dark);
text-stroke: 16px var(--color-bg-primary-dark);
}
.dark-mode .map-title::before {
-webkit-text-stroke: 17px var(--color-border-primary-dark);
text-stroke: 17px var(--color-border-primary-dark);
}
.sidebar-content {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
padding: var(--spacing-lg);
display: flex;
flex-direction: column;
gap: var(--spacing-lg);
min-height: 0;
max-height: calc(100vh - 200px);
}
/* Sidebar Footer */
.sidebar-footer {
padding: var(--spacing-lg);
border-top: 1px solid var(--color-border-primary);
background: var(--color-bg-secondary);
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
min-height: fit-content;
}
.dark-mode .sidebar-footer {
background: var(--color-bg-secondary-dark);
border-top-color: var(--color-border-primary-dark);
}
.about-link, .source-link {
display: flex;
align-items: center;
gap: var(--spacing-sm);
background: none;
border: none;
color: var(--color-text-secondary);
font-size: 14px;
font-weight: 500;
cursor: pointer;
padding: var(--spacing-sm) var(--spacing-md);
border-radius: var(--border-radius-md);
transition: all var(--transition-normal);
text-decoration: none;
}
.about-link:hover, .source-link:hover {
background: var(--color-bg-primary);
color: var(--color-text-primary);
transform: translateY(-1px);
}
.dark-mode .about-link, .dark-mode .source-link {
color: var(--color-text-secondary-dark);
}
.dark-mode .about-link:hover, .dark-mode .source-link:hover {
background: var(--color-bg-primary-dark);
color: var(--color-text-primary-dark);
}
/* Main area */
.main-area {
flex: 1;
position: relative;
overflow: hidden;
display: flex;
flex-direction: column;
background: var(--color-bg-secondary);
}
.dark-mode .main-area {
background: var(--color-bg-secondary-dark);
}
.fontmap-svg {
width: 100%;
height: 100%;
display: block;
cursor: grab;
/* Rendu vectoriel optimisé - anti-pixellisation */
shape-rendering: geometricPrecision;
text-rendering: geometricPrecision;
image-rendering: crisp-edges;
/* Force le rendu vectoriel */
vector-effect: non-scaling-stroke;
/* GPU simple et direct */
will-change: transform;
/* Responsive */
max-width: 100%;
max-height: 100%;
/* Zoom and pan */
touch-action: none;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
/* Force le rendu haute qualité */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.fontmap-svg:active {
cursor: grabbing;
}
/* Font glyphs with expanded hit area */
.font-glyph-group {
cursor: pointer;
/* GPU simple */
will-change: transform;
}
.font-hit-area {
cursor: pointer;
}
.font-glyph {
pointer-events: none;
/* Rendu vectoriel optimisé */
shape-rendering: geometricPrecision;
text-rendering: geometricPrecision;
image-rendering: crisp-edges;
vector-effect: non-scaling-stroke;
/* GPU simple */
will-change: transform;
}
/* Specific styles for SVG use elements */
.font-glyph use {
shape-rendering: geometricPrecision !important;
text-rendering: geometricPrecision !important;
image-rendering: crisp-edges !important;
vector-effect: non-scaling-stroke !important;
}
/* Ensure crisp rendering at all zoom levels */
.fontmap-svg use {
shape-rendering: geometricPrecision !important;
text-rendering: geometricPrecision !important;
image-rendering: crisp-edges !important;
}
/* Zoom fluide et réactif - anti-pixellisation */
.viewport-group {
will-change: transform;
/* Force le rendu vectoriel sur le groupe de viewport */
shape-rendering: geometricPrecision;
text-rendering: geometricPrecision;
image-rendering: crisp-edges;
/* Optimisation pour les transformations matrix */
transform-origin: 0 0;
}
/* Optimisation pour le zoom/pan */
.fontmap-svg.zooming {
cursor: grab;
}
.fontmap-svg.zooming:active {
cursor: grabbing;
}
/* Force le rendu haute qualité pendant le zoom */
.fontmap-svg.zooming .viewport-group {
/* Force le rendu vectoriel pendant le zoom */
shape-rendering: geometricPrecision !important;
text-rendering: geometricPrecision !important;
image-rendering: crisp-edges !important;
}
/* Optimisation pour les glyphes pendant le zoom */
.fontmap-svg.zooming .font-glyph {
shape-rendering: geometricPrecision !important;
text-rendering: geometricPrecision !important;
image-rendering: crisp-edges !important;
vector-effect: non-scaling-stroke !important;
}
/* Force glyph colors in dark mode */
.dark-mode .font-glyph {
fill: #ffffff !important;
color: #ffffff !important;
}
.dark-mode .font-glyph use {
fill: #ffffff !important;
color: #ffffff !important;
}
/* UI Layer - static */
.ui-group {
pointer-events: none;
z-index: 100;
}
/* Loading */
.loading {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 16px;
color: var(--color-text-secondary);
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
sans-serif;
font-weight: 300;
text-transform: uppercase;
letter-spacing: 1px;
}
.dark-mode .loading {
color: var(--color-text-secondary-dark);
}
/* Sidebar Separator */
.sidebar-separator {
height: 1px;
background: var(--color-border-primary);
margin: var(--spacing-lg) 0;
}
.dark-mode .sidebar-separator {
background: var(--color-border-primary-dark);
}