diff --git a/style.css b/style.css new file mode 100644 index 0000000..60fc90e --- /dev/null +++ b/style.css @@ -0,0 +1,552 @@ +/* ============================================================ + NexusYazı — modern, ferah, Word/Google Docs havasi + Acik / Koyu tema: CSS degiskenleri + [data-theme] + ============================================================ */ + +:root { + --app-font: "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", Arial, sans-serif; + + /* acik tema degiskenleri */ + --bg: #eef0f4; + --surface: #ffffff; + --surface-2: #f7f9fc; + --border: #e2e6ee; + --text: #1f2430; + --text-dim: #6b7280; + --accent: #4f46e5; + --accent-soft: #eef0fe; + --hover: rgba(79, 70, 229, 0.09); + --active: rgba(79, 70, 229, 0.16); + --success: #15803d; + --success-soft: #e8f7ec; + --shadow: 0 8px 30px rgba(20, 30, 60, 0.10); + --page-shadow: 0 2px 10px rgba(20, 30, 60, 0.06), 0 18px 50px rgba(20, 30, 60, 0.14); +} + +[data-theme="dark"] { + --bg: #12141b; + --surface: #1c202b; + --surface-2: #232836; + --border: #2d3342; + --text: #eceef4; + --text-dim: #9aa3b5; + --accent: #818cf8; + --accent-soft: #2a2f44; + --hover: rgba(129, 140, 248, 0.14); + --active: rgba(129, 140, 248, 0.26); + --success: #4ade80; + --success-soft: #1c3727; + --shadow: 0 8px 30px rgba(0, 0, 0, 0.5); + --page-shadow: 0 2px 10px rgba(0, 0, 0, 0.4), 0 16px 40px rgba(0, 0, 0, 0.5); +} + +* { box-sizing: border-box; margin: 0; padding: 0; } + +html, body { + height: 100%; + overflow: hidden; +} + +/* [hidden] her zaman gizlesin (display:flex/… author kurallarını ezer) */ +[hidden] { display: none !important; } + +body { + font-family: var(--app-font); + background: var(--bg); + color: var(--text); + transition: background .25s ease, color .25s ease; +} + +#app { display: flex; flex-direction: column; height: 100vh; } + +/* ---------- ÜST ŞERİT ---------- */ +.topbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 10px 16px; + background: var(--surface); + border-bottom: 1px solid var(--border); + flex-wrap: nowrap; +} + +.brand { display: flex; align-items: center; gap: 10px; min-width: 0; } +.brand svg { color: var(--accent); flex-shrink: 0; } +.brand-meta { display: flex; flex-direction: column; line-height: 1.15; min-width: 0; } +.brand-meta h1 { font-size: 17px; font-weight: 600; letter-spacing: -0.2px; white-space: nowrap; } +.file-name { font-size: 12px; color: var(--text-dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 180px; } + +.top-actions { display: flex; align-items: center; gap: 6px; } + +/* ---------- İÇİNDEKİLER (başlık gezinme drawer) ---------- */ +.toc-toggle.on { color: var(--accent); background: var(--accent-soft); border-color: transparent; } + +.toc { + position: fixed; + z-index: 40; + top: calc(var(--topbar-h, 57px) + 10px); + left: 10px; + bottom: calc(var(--statusbar-h, 30px) + 10px); + width: min(264px, 82vw); + display: flex; + flex-direction: column; + background: var(--surface); + border: 1px solid var(--border); + border-radius: 12px; + box-shadow: var(--shadow); + transform: translateX(calc(-100% - 14px)); + transition: transform .22s ease; +} +.toc.open { transform: translateX(0); } +.toc[hidden] { display: none; } + +.toc-head { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 12px 10px 15px; + border-bottom: 1px solid var(--border); + font-size: 13px; + font-weight: 600; + letter-spacing: .2px; +} +.toc-close { + border: none; + background: transparent; + color: var(--text-dim); + font-size: 15px; + line-height: 1; + cursor: pointer; + padding: 4px 7px; + border-radius: 7px; + transition: background .15s ease, color .15s ease; +} +.toc-close:hover { background: var(--hover); color: var(--text); } + +.toc-body { + flex: 1; + overflow-y: auto; + list-style: none; + margin: 0; + padding: 8px; + display: flex; + flex-direction: column; + gap: 1px; +} +.toc-body::-webkit-scrollbar { width: 8px; } +.toc-body::-webkit-scrollbar-thumb { background: var(--border); border-radius: 8px; } + +.toc-item { + display: block; + text-align: left; + width: 100%; + border: none; + background: transparent; + color: var(--text); + font-family: inherit; + cursor: pointer; + padding: 7px 10px; + border-radius: 8px; + font-size: 13.5px; + line-height: 1.35; + position: relative; + transition: background .14s ease, color .14s ease; +} +.toc-item:hover { background: var(--hover); color: var(--accent); } +.toc-item:active { background: var(--active); } +.toc-item .toc-hl { color: var(--text-dim); font-weight: 500; margin-right: 7px; } + +/* seviye girintisi: H1 → hiç, H2 +14px, H3 +28px */ +.toc-item.lv-2 { padding-left: 24px; } +.toc-item.lv-3 { padding-left: 38px; } +.toc-item .toc-txt { + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.toc-empty { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + text-align: center; + color: var(--text-dim); + font-size: 13px; + padding: 30px 18px; + line-height: 1.6; +} +.toc-empty small { opacity: .85; } + +/* dar ekranlarda tam yükseklik çekmece */ +@media (max-width: 640px) { + .toc { + top: calc(var(--topbar-h, 57px) + 6px); + width: min(300px, 88vw); + } +} + +/* ---------- İKON & BUTONLAR ---------- */ +svg { width: 19px; height: 19px; display: inline-block; } + +.icon-btn, .tool { + display: inline-flex; align-items: center; justify-content: center; + min-width: 44px; width: 44px; height: 44px; border: none; border-radius: 9px; + background: transparent; color: inherit; cursor: pointer; + transition: background .15s ease, color .15s ease, transform .05s ease; +} +.icon-btn:hover, .tool:hover { background: var(--hover); } +.icon-btn:active, .tool:active { transform: scale(0.94); } +.icon-btn.on, .tool.on { background: var(--active); color: var(--accent); } +.tool:disabled, .icon-btn:disabled { opacity: .38; pointer-events: none; } + +.divider { width: 1px; height: 24px; background: var(--border); margin: 0 4px; } + +/* tema ikon degisimi */ +.icon-moon { display: none; } +[data-theme="dark"] .icon-sun { display: none; } +[data-theme="dark"] .icon-moon { display: inline; } + +.btn { + display: inline-flex; align-items: center; gap: 6px; + padding: 0 18px; height: 44px; border-radius: 9px; border: 1px solid var(--border); + background: var(--surface-2); font-size: 13.5px; font-weight: 500; color: var(--text); + cursor: pointer; font-family: inherit; + transition: background .15s ease, border-color .15s ease; +} +.btn svg { width: 16px; height: 16px; } +.btn:hover { background: var(--hover); border-color: var(--accent); } +.btn.save { background: var(--accent); border-color: var(--accent); color: #fff; } +.btn.save:hover { filter: brightness(1.08); } +.btn.new svg { color: var(--accent); } + +/* ---------- ARAÇ ÇUBUĞU ---------- */ +.toolbar { + display: flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; + padding: 6px 14px; + background: var(--surface); + border-bottom: 1px solid var(--border); + position: relative; z-index: 5; + box-shadow: 0 1px 0 var(--border); +} +.tool-group { display: flex; align-items: center; gap: 2px; } +.tool-group + .tool-group::before { + content: ""; width: 1px; height: 22px; background: var(--border); margin-right: 6px; +} + +.tselect { + appearance: none; -webkit-appearance: none; + height: 44px; min-height: 44px; padding: 0 26px 0 12px; + border: 1px solid transparent; border-radius: 9px; + background: var(--surface-2) url("data:image/svg+xml;utf8,") no-repeat right 8px center; + font-family: inherit; font-size: 13px; color: var(--text); cursor: pointer; + transition: border-color .15s ease; +} +.tselect:hover { border-color: var(--border); } +.tselect:focus { outline: none; border-color: var(--accent); } +.tselect.small { width: 64px; min-width: 64px; } +#selFont { max-width: 150px; } +#selBlock { font-weight: 600; } + +/* ikincil satır (renkler + temizle) tek grupta */ +.tool-row-2 { display: flex; align-items: center; gap: 6px; } + +/* renk butonları */ +.colorbtn { + position: relative; display: inline-flex; align-items: center; justify-content: center; + width: 44px; height: 44px; border-radius: 9px; cursor: pointer; + transition: background .15s ease; +} +.colorbtn:hover { background: var(--hover); } +.colorbtn svg { width: 17px; height: 17px; pointer-events: none; } +.colorbtn input[type="color"] { + position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; +} +#colorBg { pointer-events: auto; } + +.toolbar .actions { margin-left: auto; gap: 6px; } + +/* ---------- SAYFA ALANI ---------- */ +.stage { + flex: 1; + overflow-y: auto; + padding: 34px 18px 60px; + display: flex; + justify-content: center; +} +.stage::-webkit-scrollbar { width: 10px; } +.stage::-webkit-scrollbar-thumb { background: var(--border); border-radius: 10px; } +.stage::-webkit-scrollbar-track { background: transparent; } + +.page { + width: min(820px, 100%); + max-width: 92vw; + min-height: 1080px; + background: var(--surface); + border-radius: 4px; + box-shadow: var(--page-shadow); + padding: clamp(34px, 5vw, 72px) clamp(34px, 6vw, 84px); + font-size: 15px; + line-height: 1.75; + color: var(--text); + outline: none; + caret-color: var(--accent); + word-wrap: break-word; +} +/* Koyu temada içerik "kâğıdı" hafif koyu ton + açık metin (göz yormaz, tema bütün) */ +[data-theme="dark"] .page { + background: #262b38; + color: #e6e9f0; +} +[data-theme="dark"] .page p, +[data-theme="dark"] .page li, +[data-theme="dark"] .page span { color: inherit; } +[data-theme="dark"] .page mark { background: #57500e; color: #f8f4d9; } +.page h1 { font-size: 2em; line-height: 1.25; margin: 0.5em 0; } +.page h2 { font-size: 1.55em; line-height: 1.3; margin: 0.5em 0; } +.page h3 { font-size: 1.25em; line-height: 1.35; margin: 0.4em 0; } +.page p { margin: 0.2em 0.5em 0.2em 0; } +.page ul, .page ol { margin: 0.3em 0 0.3em 1.6em; padding-left: 1em; } +.page ul { list-style: disc; } +.page ol { list-style: decimal; } +.page a { color: var(--accent); } +.page mark { border-radius: 3px; padding: 0 2px; } + +.page:focus { box-shadow: var(--page-shadow), 0 0 0 3px var(--accent-soft); } + +/* ---------- DURUM ÇUBUĞU ---------- */ +.statusbar { + display: flex; align-items: center; gap: 20px; + padding: 7px 16px; + background: var(--surface); + border-top: 1px solid var(--border); + font-size: 12px; color: var(--text-dim); +} +.statusbar .stat b { font-weight: 600; color: var(--text); margin-right: 3px; } +.statusbar .spacer { flex: 1; } + +/* ---------- ALTBANT (NumexAI künyesi) ---------- */ +.numex-badge { + display: flex; align-items: center; justify-content: center; + padding: 5px 16px 7px; + background: var(--surface); + border-top: 1px solid var(--border); + font-size: 11px; letter-spacing: .02em; + color: var(--text-dim); + text-decoration: none; + cursor: pointer; + transition: color .18s ease, background .18s ease; + user-select: none; +} +.numex-badge:hover { + color: var(--accent, #7871ff); + background: var(--surface-2, var(--surface)); +} +.numex-badge:hover span::before { color: var(--accent, #7871ff); } +.numex-badge span::before { + content: "◆ "; + color: var(--accent, #7871ff); + font-size: 8px; + vertical-align: 1px; +} + +.save-ind { + display: inline-flex; align-items: center; gap: 6px; + font-weight: 500; +} +.save-ind .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--text-dim); transition: all .2s ease; } +.save-ind.saving { color: var(--text-dim); } +.save-ind.saving .dot { background: #f59e0b; animation: pulse 1s infinite; } +.save-ind.saved { color: var(--success); } +.save-ind.saved .dot { background: var(--success); } +.save-ind.dirty { color: var(--text-dim); } +.save-ind.dirty .dot { background: var(--accent); animation: pulse 1.4s infinite; } +.hidden { display: none !important; } + +@keyframes pulse { 0%,100% { opacity: 1; } 50% { opacity: .3; } } + +/* ---------- RESPONSIVE ---------- */ +@media (max-width: 900px) { + .toolbar { flex-wrap: wrap; } + .toolbar .actions { width: 100%; margin-left: 0; justify-content: flex-end; } + #selFont { max-width: 110px; } +} +@media (max-width: 640px) { + .toolbar { gap: 3px; padding: 5px 8px; } + .tool, .icon-btn { width: 31px; height: 31px; } + .page { padding: 26px 20px; min-height: auto; } + .topbar { padding: 8px 10px; } + .brand-meta h1 { font-size: 15px; } + .btn span { display: none; } /* mobilde buton yalnız ikon */ + .btn { padding: 0 9px; } + .tselect { padding-right: 18px; } + .statusbar { gap: 12px; } +} + +/* ===== BUL & DEĞİŞTİR ÇUBUĞU ===== */ +.findbar { + display: flex; + align-items: center; + gap: 6px; + padding: 6px 12px; + background: var(--surface-2); + border-bottom: 1px solid var(--border); + flex-wrap: wrap; +} +.findbar[hidden] { display: none; } +.findbar-ico { width: 15px; height: 15px; color: var(--text-dim); flex: none; } +.findbar input { + border: 1px solid var(--border); + border-radius: 6px; + padding: 6px 9px; + font-size: 13px; + background: var(--surface); + color: var(--text); + min-width: 120px; + flex: none; +} +.findbar input:focus { outline: 2px solid var(--accent-soft); outline-offset: 0; border-color: var(--accent); } +.find-count { font-size: 12px; color: var(--text-dim); min-width: 42px; } +.findbar-btn { + background: var(--surface); + border: 1px solid var(--border); + border-radius: 6px; + padding: 5px 10px; + font-size: 12px; + color: var(--text); + cursor: pointer; + min-height: 30px; +} +.findbar-btn:hover { border-color: var(--accent); color: var(--accent); } +.find-sep { width: 1px; height: 20px; background: var(--border); margin: 0 2px; } +.findbar-x { + background: none; + border: none; + color: var(--text-dim); + font-size: 14px; + cursor: pointer; + margin-left: auto; + min-height: 30px; min-width: 30px; + border-radius: 6px; +} +.findbar-x:hover { color: var(--text); background: var(--hover); } + +/* ===== SATIR ARALIĞI SEÇİCİ ===== */ +#selLineHeight { max-width: 92px; font-variant-numeric: tabular-nums; } +#selLineHeight option { font-size: 12px; } +.lh-active { font-weight: 600; } + +/* ===== TABLOLAR (Word benzeri) ===== */ +.page table { + border-collapse: collapse; + width: 100%; + margin: 10px 0; + font-size: 14px; + line-height: 1.5; + --tbl-border: rgba(120, 130, 160, 0.35); +} +.page table th { + background: var(--surface-2); + font-weight: 600; + text-align: left; +} +.page table th, .page table td { + border: 1px solid var(--tbl-border); + padding: 6px 10px; + vertical-align: top; + min-width: 28px; +} +.page table td.selected { + background: var(--accent-soft); + outline: 2px solid var(--accent); + outline-offset: -2px; +} +.page table caption { + caption-side: bottom; + font-size: 11.5px; + color: var(--text-dim); + padding-top: 2px; +} +[data-theme="dark"] .page table th { background: var(--surface-2); } + +/* ===== RESİMLER ===== */ +.page img { + max-width: 100%; + height: auto; + border-radius: 6px; + display: inline-block; +} +.page img.old-sel { + outline: 2px solid var(--accent); + outline-offset: 2px; + border-radius: 6px; +} +.page .img-wrap { + position: relative; + display: inline-block; + margin: 4px 0; +} +.page .img-wrap img { margin: 0; } +.img-handle { + position: absolute; + right: -7px; bottom: -7px; + width: 13px; height: 13px; + background: #fff; + border: 2px solid var(--accent); + border-radius: 3px; + cursor: nwse-resize; + z-index: 3; + display: block; +} +.img-wrap:focus, .img-wrap:focus-visible { outline: none; } + +/* Tablo ekleme mini-paneli */ +.tbl-panel { + position: fixed; + z-index: 50; + background: var(--surface); + border: 1px solid var(--border); + border-radius: 10px; + box-shadow: var(--shadow); + padding: 10px; + min-width: 190px; +} +.tbl-panel .tbl-label { font-size: 11px; color: var(--text-dim); margin-bottom: 7px; text-align: center; } +.tbl-panel .grid { display: grid; grid-template-columns: repeat(8, 16px); gap: 2px; } +.tbl-panel .cell { + width: 16px; height: 16px; + background: var(--surface-2); + border: 1px solid var(--border); + border-radius: 2px; + cursor: pointer; +} +.tbl-panel .cell.hov { background: var(--accent); border-color: var(--accent); } + +/* ===== YAZDIRMA (PDF) ===== */ +@media print { + .topbar, .toolbar, .findbar, .statusbar, .btn { display: none !important; } + body { background: #fff !important; } + #app, .stage { display: block !important; padding: 0 !important; overflow: visible !important; height: auto !important; } + .stage { justify-content: flex-start; } + .page { + width: 100% !important; + max-width: none !important; + min-height: 0 !important; + box-shadow: none !important; + border: none !important; + border-radius: 0 !important; + margin: 0 !important; + padding: 0 !important; + background: #fff !important; + color: #000 !important; + } + .page img { border-radius: 0; } + .img-handle, .page img.old-sel { outline: none; } + .page table th { background: #eee !important; } + .page table th, .page table td { border-color: #000 !important; } +} +@page { margin: 15mm 12mm; }