/* Duckmage plugin styles */ /* ── Hex map view ─────────────────────────────────────────────────────────── */ .duckmage-hex-map-container { position: relative; width: 100%; height: 100%; } /* Clips the panning/zooming viewport without affecting control buttons */ .duckmage-hex-map-clip { position: absolute; inset: 0; overflow: hidden; } /* Transparent overlay for expand & toolbar buttons — no overflow clipping */ .duckmage-hex-map-controls { position: absolute; inset: 0; pointer-events: none; z-index: 20; } .duckmage-hex-map-controls > * { pointer-events: auto; } .duckmage-hex-map-viewport { position: absolute; top: 0; left: 0; transform-origin: 0 0; will-change: transform; cursor: grab; padding: 1em; } .duckmage-hex-map-viewport.is-dragging { cursor: grabbing; } /* ── Pointy-top row layout ────────────────────────────────────────────────── */ .duckmage-hex-row { display: flex; flex-wrap: nowrap; justify-content: flex-start; margin-bottom: calc(var(--hex-size, 2.2em) * -0.5); } .duckmage-hex-row-offset { margin-left: calc(var(--hex-size, 2.2em) * 1.732 / 2); } /* ── Flat-top column layout ───────────────────────────────────────────────── */ .duckmage-grid-flat { display: flex; flex-direction: row; align-items: flex-start; } .duckmage-hex-col { display: flex; flex-direction: column; margin-right: calc(var(--hex-size, 2.2em) * -0.5); } .duckmage-hex-col-offset { margin-top: calc(var(--hex-size, 2.2em) * 0.866); } /* Flat-top hex shape and dimensions */ .duckmage-grid-flat .duckmage-hex { width: calc(var(--hex-size) * 2); height: calc(var(--hex-size) * 1.732); clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%); } /* ── Hex cell (shared) ────────────────────────────────────────────────────── */ .duckmage-hex { --hex-size: 2.2em; width: calc(var(--hex-size) * 1.732); height: calc(var(--hex-size) * 2); clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%); background: var(--background-secondary); border: 2px solid var(--background-modifier-border); margin: var(--duckmage-hex-gap, 0.15em); display: flex; align-items: center; justify-content: center; flex-shrink: 0; cursor: pointer; position: relative; transition: background-color 0.15s ease, border-color 0.15s ease; } .duckmage-hex:focus { outline: none; } .duckmage-hex:hover { background: var(--background-modifier-hover); border-color: var(--interactive-accent); } .duckmage-hex-exists { border-color: var(--background-modifier-border-hover); } .duckmage-hex-exists:hover { border-color: var(--interactive-accent); background: var(--background-modifier-hover); } /* Terrain icon fills the hex, sits behind the label */ .duckmage-hex-icon { position: absolute; width: 78%; height: 78%; object-fit: contain; pointer-events: none; opacity: 0.75; } .duckmage-hex-label { position: relative; /* above icon */ font-size: 0.6em; font-weight: 600; color: var(--text-muted); pointer-events: none; user-select: none; z-index: 1; } /* Outline keeps coordinates readable over any terrain color */ .duckmage-hex[style*="background-color"] .duckmage-hex-label { color: #fff; text-shadow: -1px -1px 0 rgba(0,0,0,0.85), 1px -1px 0 rgba(0,0,0,0.85), -1px 1px 0 rgba(0,0,0,0.85), 1px 1px 0 rgba(0,0,0,0.85); } .duckmage-hex-dot { position: absolute; bottom: 0.35em; width: 4px; height: 4px; border-radius: 50%; background: var(--interactive-accent); pointer-events: none; z-index: 1; } /* ── Hex editor modal ─────────────────────────────────────────────────────── */ .duckmage-hex-editor h2 { margin-bottom: 0.75em; } .duckmage-hex-editor h3 { margin: 0.25em 0 0.5em; } .duckmage-hex-editor h4 { margin: 0; font-size: 0.9em; font-weight: 600; } .duckmage-editor-title-row { display: flex; align-items: baseline; gap: 12px; } .duckmage-editor-title-row h2 { margin: 0; } .duckmage-editor-open-link { font-size: 0.8em; color: var(--text-accent); cursor: pointer; white-space: nowrap; } .duckmage-editor-open-link:hover { text-decoration: underline; } .duckmage-editor-divider { margin: 1em 0; border: none; border-top: 1px solid var(--background-modifier-border); } .duckmage-editor-section { margin-bottom: 1em; } /* Terrain picker grid — capped at 2 rows, scrollable */ .duckmage-terrain-picker { display: flex; flex-wrap: wrap; gap: 0.4em; margin-bottom: 0.75em; max-height: 132px; overflow-y: auto; padding-right: 2px; /* avoid clipping scrollbar */ } .duckmage-terrain-picker.duckmage-terrain-picker-full { max-height: none; overflow-y: visible; } .duckmage-terrain-option { display: flex; flex-direction: column; align-items: center; gap: 0.25em; padding: 0.35em; border-radius: 6px; cursor: pointer; border: 2px solid transparent; background: var(--background-secondary); transition: border-color 0.1s ease, background 0.1s ease; min-width: 52px; } .duckmage-terrain-option:hover { background: var(--background-modifier-hover); border-color: var(--interactive-accent); } .duckmage-terrain-option.is-selected { border-color: var(--interactive-accent); background: var(--background-modifier-hover); } .duckmage-terrain-preview { width: 36px; height: 36px; border-radius: 4px; position: relative; overflow: hidden; flex-shrink: 0; } .duckmage-terrain-preview-clear { background: repeating-linear-gradient( 45deg, var(--background-modifier-border) 0px, var(--background-modifier-border) 2px, var(--background-secondary) 2px, var(--background-secondary) 8px ); } .duckmage-terrain-preview-icon { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; } .duckmage-terrain-option-name { font-size: 0.7em; text-align: center; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 54px; } .duckmage-clear-btn { margin-top: 0.5em; } /* Link sections */ .duckmage-editor-link-section { margin-bottom: 0.85em; } .duckmage-link-section-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.3em; } .duckmage-add-btn { font-size: 0.8em; padding: 0.15em 0.5em; } .duckmage-link-select { font-size: 0.85em; background: var(--background-secondary); border: 1px solid var(--background-modifier-border); border-radius: 4px; color: var(--text-normal); padding: 0.15em 0.3em; max-width: 160px; cursor: pointer; } .duckmage-link-select:focus { outline: none; border-color: var(--interactive-accent); } .duckmage-link-list { display: flex; flex-direction: column; gap: 0.2em; padding-left: 0.5em; } .duckmage-link-item { display: flex; align-items: center; gap: 4px; font-size: 0.85em; } .duckmage-link-item-label { color: var(--text-accent); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .duckmage-link-item-clickable { cursor: pointer; } .duckmage-link-item-clickable:hover { text-decoration: underline; } .duckmage-link-remove-btn { flex-shrink: 0; background: none; border: none; color: var(--text-faint); cursor: pointer; font-size: 1em; line-height: 1; padding: 0 2px; border-radius: 3px; } .duckmage-link-remove-btn:hover { color: var(--text-error); background: var(--background-modifier-error-hover); } .duckmage-link-empty { font-size: 0.85em; color: var(--text-faint); } .duckmage-suggestion-path { color: var(--text-muted); } /* ── Roads & Rivers toolbar ───────────────────────────────────────────────── */ .duckmage-draw-toolbar { position: absolute; top: 8px; right: 44px; z-index: 10; display: flex; gap: 4px; } .duckmage-draw-btn { height: 26px; padding: 0 10px; border-radius: 4px; background: var(--background-secondary); border: 1px solid var(--background-modifier-border); color: var(--text-muted); font-size: 0.75em; font-weight: 600; cursor: pointer; opacity: 0.6; transition: opacity 0.15s ease, border-color 0.15s ease, color 0.15s ease; user-select: none; } .duckmage-draw-btn:hover { opacity: 1; color: var(--text-normal); } .duckmage-draw-btn.is-active { opacity: 1; border-color: var(--interactive-accent); color: var(--interactive-accent); background: var(--background-modifier-hover); } .duckmage-draw-btn-terrain { display: flex; align-items: center; gap: 5px; } .duckmage-terrain-btn-preview { display: none; width: 10px; height: 10px; border-radius: 2px; flex-shrink: 0; border: 1px solid rgba(255, 255, 255, 0.25); } .duckmage-hex-map-viewport.duckmage-draw-mode, .duckmage-hex-map-viewport.duckmage-draw-mode .duckmage-hex { cursor: crosshair; } /* ── Expand buttons ───────────────────────────────────────────────────────── */ .duckmage-expand-btn { position: absolute; z-index: 10; width: 26px; height: 26px; padding: 0; border-radius: 50%; background: var(--background-secondary); border: 1px solid var(--background-modifier-border); color: var(--text-muted); font-size: 1.1em; line-height: 1; cursor: pointer; display: flex; align-items: center; justify-content: center; opacity: 0.5; transition: opacity 0.15s ease, color 0.15s ease; } .duckmage-expand-btn:hover { opacity: 1; color: var(--text-normal); } .duckmage-expand-top { top: 4px; left: 50%; transform: translateX(-50%); } .duckmage-expand-bottom { bottom: 4px; left: 50%; transform: translateX(-50%); } .duckmage-expand-left { left: 4px; top: 50%; transform: translateY(-50%); } .duckmage-expand-right { right: 4px; top: 50%; transform: translateY(-50%); } .duckmage-table-btn { position: absolute; top: 8px; left: 8px; z-index: 10; height: 26px; padding: 0 8px; border-radius: 4px; background: var(--background-secondary); border: 1px solid var(--background-modifier-border); color: var(--text-muted); font-size: 1em; line-height: 1; cursor: pointer; opacity: 0.6; transition: opacity 0.15s ease, color 0.15s ease; user-select: none; } .duckmage-table-btn:hover { opacity: 1; color: var(--text-normal); } /* Text note sections */ .duckmage-editor-text-section { display: flex; flex-direction: column; gap: 0.25em; margin-bottom: 0.85em; } .duckmage-text-section-label { font-size: 0.85em; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.04em; } .duckmage-text-section-textarea { width: 100%; resize: vertical; font-size: 0.9em; font-family: var(--font-text); background: var(--background-secondary); border: 1px solid var(--background-modifier-border); border-radius: 4px; padding: 0.4em 0.5em; color: var(--text-normal); line-height: 1.5; box-sizing: border-box; } .duckmage-text-section-textarea:focus { outline: none; border-color: var(--interactive-accent); } /* ── Icon picker modal ────────────────────────────────────────────────────── */ .duckmage-icon-picker { display: flex; flex-wrap: wrap; gap: 0.4em; margin-bottom: 0.75em; max-height: 420px; overflow-y: auto; padding-right: 2px; } .duckmage-icon-option { display: flex; flex-direction: column; align-items: center; gap: 0.25em; padding: 0.35em; border-radius: 6px; cursor: pointer; border: 2px solid transparent; background: var(--background-secondary); transition: border-color 0.1s ease, background 0.1s ease; min-width: 52px; } .duckmage-icon-option:hover { background: var(--background-modifier-hover); border-color: var(--interactive-accent); } .duckmage-icon-preview { width: 36px; height: 36px; border-radius: 4px; display: flex; align-items: center; justify-content: center; overflow: hidden; flex-shrink: 0; background: var(--background-primary-alt); } .duckmage-icon-preview-clear { background: repeating-linear-gradient( 45deg, var(--background-modifier-border) 0px, var(--background-modifier-border) 2px, var(--background-secondary) 2px, var(--background-secondary) 8px ); } .duckmage-icon-preview-img { width: 100%; height: 100%; object-fit: contain; opacity: 0.85; } .duckmage-icon-option-name { font-size: 0.7em; text-align: center; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 54px; } .duckmage-icon-btn-preview { display: none; width: 14px; height: 14px; object-fit: contain; flex-shrink: 0; opacity: 0.9; } /* ── Modal: icon override ─────────────────────────────────────────────────── */ .duckmage-icon-override-row { display: flex; align-items: center; gap: 0.5em; margin-top: 0.75em; } .duckmage-icon-override-label { color: var(--text-muted); font-size: var(--font-ui-small); white-space: nowrap; } /* ── Settings: terrain palette ────────────────────────────────────────────── */ .duckmage-palette-list .duckmage-palette-item { margin-bottom: 0.5em; display: flex; align-items: center; gap: 0.25em; } .duckmage-palette-drag-handle { cursor: grab; color: var(--text-muted); font-size: 1.2em; line-height: 1; user-select: none; flex-shrink: 0; } .duckmage-palette-drag-handle:active { cursor: grabbing; } .duckmage-palette-item.duckmage-palette-dragging { opacity: 0.4; } .duckmage-palette-item.duckmage-palette-drop-target { outline: 2px dashed var(--interactive-accent); border-radius: 4px; } /* ── Hex table view ───────────────────────────────────────────────────────── */ .duckmage-hex-table-container { display: flex; flex-direction: column; height: 100%; overflow: hidden; } .duckmage-hex-table-toolbar { flex-shrink: 0; display: flex; align-items: center; flex-wrap: wrap; gap: 4px 6px; padding: 6px 8px; border-bottom: 1px solid var(--background-modifier-border); } .duckmage-filter-separator { width: 1px; height: 18px; background: var(--background-modifier-border); flex-shrink: 0; } .duckmage-filter-label { font-size: 0.8em; color: var(--text-muted); white-space: nowrap; } .duckmage-filter-range-input { height: 24px; width: 54px; padding: 0 4px; border-radius: 4px; background: var(--background-secondary); border: 1px solid var(--background-modifier-border); color: var(--text-normal); font-size: 0.8em; text-align: center; } .duckmage-filter-range-input:focus { outline: none; border-color: var(--interactive-accent); } /* Hide browser spin buttons on the range inputs */ .duckmage-filter-range-input::-webkit-inner-spin-button, .duckmage-filter-range-input::-webkit-outer-spin-button { -webkit-appearance: none; } .duckmage-filter-btn { height: 24px; padding: 0 8px; border-radius: 4px; background: var(--background-secondary); border: 1px solid var(--background-modifier-border); color: var(--text-muted); font-size: 0.8em; cursor: pointer; white-space: nowrap; } .duckmage-filter-btn:hover { color: var(--text-normal); border-color: var(--background-modifier-border-hover); } .duckmage-filter-btn.duckmage-filter-active { border-color: var(--interactive-accent); color: var(--interactive-accent); background: var(--background-modifier-hover); } .duckmage-filter-check-label { display: flex; align-items: center; gap: 4px; font-size: 0.8em; color: var(--text-muted); cursor: pointer; white-space: nowrap; } .duckmage-filter-check-label:hover { color: var(--text-normal); } .duckmage-hex-table-scroll { flex: 1; overflow: auto; } .duckmage-hex-table { border-collapse: collapse; table-layout: fixed; font-size: 0.85em; } .duckmage-hex-table th { position: sticky; top: 0; background: var(--background-secondary); border: 1px solid var(--background-modifier-border); padding: 4px 8px; text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; z-index: 2; } .duckmage-hex-table td { border: 1px solid var(--background-modifier-border); padding: 3px 8px; vertical-align: top; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color: var(--text-normal); } .duckmage-col-resizer { position: absolute; right: 0; top: 0; bottom: 0; width: 5px; cursor: col-resize; z-index: 3; } .duckmage-col-resizer:hover, .duckmage-col-resizer:active { background: var(--interactive-accent); opacity: 0.5; } .duckmage-hex-table tr:hover td { background: var(--background-modifier-hover); } .duckmage-hex-table-coords { color: var(--text-accent); cursor: pointer; font-weight: 600; white-space: nowrap; } .duckmage-hex-table-coords:hover { text-decoration: underline; } .duckmage-hex-table-swatch { display: inline-block; width: 10px; height: 10px; border-radius: 2px; margin-right: 4px; vertical-align: middle; flex-shrink: 0; } .duckmage-hex-table-empty { color: var(--text-faint); } .duckmage-hex-table-cell-clickable { cursor: pointer; } .duckmage-hex-table-cell-clickable:hover { color: var(--text-accent); } /* ── Hex cell detail modal ────────────────────────────────────────────────── */ .duckmage-cell-modal { max-height: 60vh; overflow-y: auto; } .duckmage-cell-modal-pre { white-space: pre-wrap; word-break: break-word; font-family: var(--font-text); font-size: var(--font-ui-medium); line-height: 1.6; margin: 0; } .duckmage-cell-modal-list { margin: 0; padding-left: 1.5em; line-height: 1.8; } .duckmage-cell-modal-textarea { width: 100%; min-height: 200px; resize: vertical; font-family: var(--font-text); font-size: var(--font-ui-medium); line-height: 1.6; background: var(--background-secondary); border: 1px solid var(--background-modifier-border); border-radius: 4px; padding: 0.5em; color: var(--text-normal); box-sizing: border-box; display: block; margin-bottom: 0.75em; } .duckmage-cell-modal-textarea:focus { outline: none; border-color: var(--interactive-accent); } .duckmage-cell-modal-save { display: block; margin-left: auto; } /* ── Terrain filter modal ─────────────────────────────────────────────────── */ .duckmage-terrain-filter-list { display: flex; flex-direction: column; gap: 6px; margin-bottom: 1em; } .duckmage-terrain-filter-row { display: flex; align-items: center; gap: 6px; cursor: pointer; } .duckmage-terrain-filter-row input[type="checkbox"] { flex-shrink: 0; cursor: pointer; } .duckmage-row-hidden { display: none !important; } .duckmage-terrain-filter-btns { display: flex; justify-content: flex-end; gap: 8px; padding-top: 4px; border-top: 1px solid var(--background-modifier-border); } /* ── Link picker modal (Towns / Dungeons) ───────────────────────────────────── */ .duckmage-link-picker-modal { min-width: 320px; } .duckmage-link-picker-heading { font-size: 0.8em; font-weight: 600; color: var(--text-muted); margin: 0.75em 0 0.25em; text-transform: uppercase; letter-spacing: 0.04em; } .duckmage-link-picker-list { list-style: none; margin: 0 0 0.5em; padding: 0; max-height: 220px; overflow-y: auto; border: 1px solid var(--background-modifier-border); border-radius: 4px; } .duckmage-link-picker-item { padding: 5px 10px; cursor: pointer; border-radius: 3px; } .duckmage-link-picker-item:hover { background: var(--background-modifier-hover); } .duckmage-link-picker-create-row { display: flex; gap: 6px; margin-top: 0.25em; } .duckmage-link-picker-input { flex: 1; padding: 4px 8px; border: 1px solid var(--background-modifier-border); border-radius: 4px; background: var(--background-secondary); color: var(--text-normal); font-size: var(--font-ui-small); } /* ── Context menu create-new row ────────────────────────────────────────────── */ .duckmage-editor-create-row { display: flex; gap: 6px; margin-top: 6px; } .duckmage-editor-create-input { flex: 1; padding: 3px 6px; border: 1px solid var(--background-modifier-border); border-radius: 4px; background: var(--background-secondary); color: var(--text-normal); font-size: var(--font-ui-small); min-width: 0; } .duckmage-editor-create-btn { padding: 3px 8px; border-radius: 4px; background: var(--interactive-accent); color: var(--text-on-accent); border: none; cursor: pointer; font-size: var(--font-ui-small); white-space: nowrap; } .duckmage-editor-create-btn:hover { background: var(--interactive-accent-hover); } /* ── Go-to-hex button & modal ───────────────────────────────────────────────── */ .duckmage-goto-btn { position: absolute; top: 8px; left: 44px; z-index: 10; height: 26px; padding: 0 8px; border-radius: 4px; background: var(--background-secondary); border: 1px solid var(--background-modifier-border); color: var(--text-muted); font-size: 1em; line-height: 1; cursor: pointer; opacity: 0.6; transition: opacity 0.15s ease, color 0.15s ease; user-select: none; } .duckmage-goto-btn:hover { opacity: 1; color: var(--text-normal); } .duckmage-goto-modal .duckmage-goto-row { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; } .duckmage-goto-input { width: 70px; padding: 4px 6px; border: 1px solid var(--background-modifier-border); border-radius: 4px; background: var(--background-secondary); color: var(--text-normal); font-size: var(--font-ui-small); text-align: center; } .duckmage-goto-btn-confirm { width: 100%; }