/* tanin-calendar — TANINUX calendar * * libadwaita-free. The look is the TANINUX design language shared with the * Music app and the Settings hub: a glassy sidebar on the left, content on the * right, rounded cards, accent pills. * * Colours come from the GLOBAL TANINUX named colours (defined in * ~/.config/gtk-4.0/libadwaita.css by `taninux` → see gui/style.py), so the * calendar tracks the LIVE Fuji accent and light/dark automatically: * @accent_color the chosen Fuji hue * @window_bg_color shell surface (dark #0f0f0f / light #f3f1ec) * @window_fg_color text (dark #f0f0f0 / light #0f0f0f) * @card_bg_color raised cards (dark #191919 / light #ffffff) * * Per-event/calendar background colours are injected at runtime (see * _color_dot / _event_block in tanin-calendar). */ /* ===================================================================== FONT */ /* Body / content text: Inter, like the Settings & Music apps. */ .tn-cal, .tn-cal label, .tn-cal-dialog, .tn-cal-dialog label { font-family: -apple-system, "SF Pro Text", "Inter", "Cantarell", sans-serif; } /* Top-area "chrome" / display text: Iosevka Aile, like the TANINUX bar (eww). * Brand, masthead month/year, the Day·Week·Month switcher, Today, the * mini-month and the grid's weekday/day labels all read as bar-style display * type so the calendar ties into the panel typography. * * Each selector is qualified with `.tn-cal ` so it has higher specificity than * the `.tn-cal label` body-font rule above (otherwise Inter would win). */ .tn-cal .tn-brand, .tn-cal .tn-cal-month, .tn-cal .tn-cal-year, .tn-cal .tn-cal-daysub, .tn-cal .tn-segment-btn, .tn-cal .tn-cal-today, .tn-cal .tn-mini-title, .tn-cal .tn-mini-dow, .tn-cal .tn-mini-day, .tn-cal .weekday-header, .tn-cal .day-number, .tn-cal .timegrid-col-name, .tn-cal .timegrid-col-date, .tn-cal .hour-label { font-family: "Iosevka Aile", "Iosevka", "Symbols Nerd Font", sans-serif; } /* ============================================================ WINDOW SURFACE */ .tn-cal, .tn-cal-dialog { background-color: @window_bg_color; color: @window_fg_color; } /* =================================================================== SIDEBAR */ /* Glassy floating panel — same family as the Music/Settings .tn-sidebar. */ .tn-cal-sidebar { background-color: @window_bg_color; border-right: 1px solid alpha(@window_fg_color, 0.07); padding: 0 8px 12px 8px; background-image: linear-gradient( to bottom, alpha(@window_fg_color, 0.035), alpha(@window_fg_color, 0.0) 180px ); box-shadow: inset -1px 0 0 alpha(@window_fg_color, 0.04); } .tn-cal .tn-brand { font-size: 1.55em; font-weight: 800; color: @window_fg_color; margin: 18px 4px 12px 6px; } /* "Neuer Termin" — glassy accent-wash, matching a selected sidebar row in the * Music/Settings apps (alpha accent fill + accent border + accent text). */ .tn-cal-new { margin: 0 2px 16px 2px; padding: 9px 14px; font-weight: 600; border-radius: 12px; color: @accent_color; background-color: alpha(@accent_color, 0.18); border: 1px solid alpha(@accent_color, 0.32); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.30), inset 0 1px 0 alpha(@window_fg_color, 0.10); } .tn-cal-new:hover { background-color: alpha(@accent_color, 0.26); border-color: alpha(@accent_color, 0.45); } .tn-cal-new label, .tn-cal-new image { color: @accent_color; } .tn-cal .tn-nav-header { font-size: 0.78em; font-weight: 700; color: alpha(@window_fg_color, 0.5); text-transform: uppercase; letter-spacing: 0.04em; margin: 14px 6px 6px 6px; } /* --- mini-month navigator ------------------------------------------------- */ .tn-mini { margin: 0 0 8px 0; } .tn-mini-header { margin: 2px 2px 4px 2px; } .tn-mini-title { font-size: 0.95em; font-weight: 700; color: @window_fg_color; margin-left: 4px; } .tn-mini-header button { min-width: 26px; min-height: 26px; padding: 0; color: alpha(@window_fg_color, 0.7); } .tn-mini-grid { margin: 0 1px; } .tn-mini-dow { font-size: 0.68em; font-weight: 700; color: alpha(@window_fg_color, 0.4); padding-bottom: 2px; } /* Each mini day is a tiny round button; today/selected/event states layer on. * Fixed equal width/height (centred in its cell) → a true circle, not an * ellipse stretched to the column. */ .tn-mini-day { font-size: 0.78em; min-width: 28px; min-height: 28px; padding: 0; margin: 0; border-radius: 50%; color: @window_fg_color; } .tn-mini-day:hover { background-color: alpha(@window_fg_color, 0.08); } .tn-mini-day.other-month { color: alpha(@window_fg_color, 0.28); } .tn-mini-day.today { color: @accent_color; font-weight: 800; } .tn-mini-day.selected { background-color: @accent_color; color: @accent_fg_color; font-weight: 700; } .tn-mini-day.selected.today { color: @accent_fg_color; } /* A small accent dot under days that hold events (no dot when selected). */ .tn-mini-day.has-events:not(.selected) { background-image: radial-gradient( circle at 50% 86%, @accent_color 0, @accent_color 1.3px, transparent 1.6px); } /* --- calendar show/hide list ---------------------------------------------- */ .tn-cal-list { padding: 2px; } .tn-cal-item { padding: 6px 8px; border-radius: 10px; margin: 1px 0; } .tn-cal-item:hover { background-color: alpha(@window_fg_color, 0.06); } .tn-cal-item-label { color: @window_fg_color; font-size: 0.92em; } /* Hidden calendar: dim the row + hollow out its colour dot. */ .tn-cal-item.hidden .tn-cal-item-label { color: alpha(@window_fg_color, 0.4); } .tn-cal-item.hidden .event-dot { opacity: 0.3; } .tn-cal-list-empty { color: alpha(@window_fg_color, 0.45); font-size: 0.88em; padding: 6px 8px; } /* =================================================================== CONTENT */ .tn-cal-content { background-color: @window_bg_color; } /* --- masthead ------------------------------------------------------------- */ .tn-cal-masthead { padding: 16px 20px 14px 24px; border-bottom: 1px solid alpha(@window_fg_color, 0.07); } /* Same size as the sidebar "Calendar" brand (.tn-brand = 1.55em). */ .tn-cal-month { font-size: 1.55em; font-weight: 800; color: @window_fg_color; } .tn-cal-year { font-size: 1.55em; font-weight: 300; color: alpha(@window_fg_color, 0.45); } .tn-cal-daysub { font-size: 1.05em; font-weight: 500; color: alpha(@window_fg_color, 0.55); margin-left: 2px; } .tn-cal-masthead button.circular { min-width: 32px; min-height: 32px; padding: 0; color: @window_fg_color; } .tn-cal-masthead button.circular:hover { background-color: alpha(@window_fg_color, 0.08); } .tn-cal-today { padding: 5px 16px; font-weight: 600; color: @window_fg_color; background-color: alpha(@window_fg_color, 0.08); } .tn-cal-today:hover { background-color: alpha(@window_fg_color, 0.14); } /* Day | Week | Month segmented switcher. */ .tn-segment { margin-left: 6px; border-radius: 999px; padding: 2px; background-color: alpha(@window_fg_color, 0.08); } .tn-segment-btn { padding: 4px 14px; border-radius: 999px; min-height: 0; background: transparent; box-shadow: none; border: none; color: alpha(@window_fg_color, 0.7); font-weight: 600; font-size: 0.9em; } .tn-segment-btn:hover { background-color: alpha(@window_fg_color, 0.06); } .tn-segment-btn:checked { background-color: @accent_color; color: @accent_fg_color; box-shadow: 0 1px 3px alpha(@accent_color, 0.4); } /* --- warning banner ------------------------------------------------------- */ .tn-cal-banner { padding: 8px 18px; background-color: alpha(#e0a000, 0.14); color: @window_fg_color; border-bottom: 1px solid alpha(#e0a000, 0.25); } /* ===================================================================== DOTS */ .event-dot { min-width: 10px; min-height: 10px; border-radius: 9999px; background-color: alpha(@window_fg_color, 0.35); } .chip-dot { min-width: 8px; min-height: 8px; } /* =============================================================== MONTH GRID */ .month-grid { background-color: @window_bg_color; padding: 0; } .weekday-header { color: alpha(@window_fg_color, 0.55); font-weight: bold; font-size: 0.82em; text-transform: uppercase; letter-spacing: 0.04em; padding: 8px 6px; background-color: alpha(@window_fg_color, 0.04); } /* One day cell. The 1px outline forms the grid's hairlines without doubling. */ .day-cell { background-color: @window_bg_color; border: 1px solid alpha(@window_fg_color, 0.07); padding: 4px 5px; min-height: 92px; } .day-cell.other-month { background-color: alpha(@window_fg_color, 0.02); } .day-cell.other-month .day-number { color: alpha(@window_fg_color, 0.3); } /* Today's cell: accent ring + subtle tinted background. */ .day-cell.today { background-color: alpha(@accent_color, 0.10); border: 1px solid @accent_color; } .day-cell.today .day-number { color: @accent_color; font-weight: bold; } /* The SELECTED cell (distinct from today). */ .day-cell.selected { background-color: alpha(@window_fg_color, 0.07); border: 1px solid alpha(@window_fg_color, 0.3); } .day-cell.selected.today { background-color: alpha(@accent_color, 0.18); border: 1px solid @accent_color; } .day-cell.selected .day-number { color: @window_fg_color; font-weight: bold; } .day-number { color: @window_fg_color; font-size: 0.9em; padding: 1px 2px; margin-bottom: 2px; } /* --- event chips ---------------------------------------------------------- */ .event-chip { background-color: alpha(@window_fg_color, 0.06); border-radius: 6px; padding: 1px 5px; min-height: 0; margin: 0; } .event-chip:hover { background-color: alpha(@window_fg_color, 0.11); } .chip-label { color: @window_fg_color; font-size: 0.82em; } .more-label { color: alpha(@window_fg_color, 0.5); font-size: 0.78em; padding: 0 4px; } /* ================================================ SELECTED-DAY AGENDA (Month) */ /* Sits directly under the grid (same scroller), aligned to the grid width. */ .tn-cal-page { padding: 18px 0 24px 0; } .tn-cal-agenda-inner { margin-top: 14px; padding: 14px 6px 0 6px; border-top: 1px solid alpha(@window_fg_color, 0.10); } .tn-cal-agenda-heading { color: @window_fg_color; font-size: 1.05em; font-weight: 700; margin-bottom: 4px; } .tn-cal-agenda-empty { color: alpha(@window_fg_color, 0.5); font-size: 0.92em; padding: 2px; } .agenda-row { background-color: @card_bg_color; border: 1px solid alpha(@window_fg_color, 0.06); border-radius: 10px; padding: 8px 12px; min-height: 0; margin: 0; } .agenda-row:hover { background-color: alpha(@window_fg_color, 0.08); } .agenda-time { color: alpha(@window_fg_color, 0.55); font-size: 0.88em; font-variant-numeric: tabular-nums; } .agenda-title { color: @window_fg_color; font-size: 0.98em; font-weight: 500; } .agenda-location { color: alpha(@window_fg_color, 0.5); font-size: 0.82em; } /* ================================================================ TIME GRID */ .timegrid-header { background-color: @window_bg_color; border-bottom: 1px solid alpha(@window_fg_color, 0.10); } .timegrid-corner { background-color: @window_bg_color; } .timegrid-col-header { padding: 8px 4px 9px 4px; border-left: 1px solid alpha(@window_fg_color, 0.06); } .timegrid-col-header:hover { background-color: alpha(@window_fg_color, 0.04); } .timegrid-col-name { color: alpha(@window_fg_color, 0.55); font-size: 0.78em; font-weight: bold; text-transform: uppercase; letter-spacing: 0.04em; } .timegrid-col-date { color: @window_fg_color; font-size: 1.25em; font-weight: 600; } .timegrid-col-header.today .timegrid-col-name, .timegrid-col-header.today .timegrid-col-date { color: @accent_color; font-weight: bold; } .timegrid-col-header.selected { background-color: alpha(@window_fg_color, 0.06); } /* --- all-day strip -------------------------------------------------------- */ .allday-row { background-color: alpha(@window_fg_color, 0.02); border-bottom: 1px solid alpha(@window_fg_color, 0.10); min-height: 30px; } .allday-axis { color: alpha(@window_fg_color, 0.5); font-size: 0.7em; text-transform: uppercase; letter-spacing: 0.03em; padding-right: 8px; } .allday-cell { border-left: 1px solid alpha(@window_fg_color, 0.06); padding: 2px 4px; } .allday-cell.today { background-color: alpha(@accent_color, 0.08); } .allday-chip { background-color: alpha(@window_fg_color, 0.06); border-left: 3px solid alpha(@window_fg_color, 0.5); border-radius: 5px; padding: 0 6px; min-height: 0; margin: 1px 0; } .allday-chip:hover { background-color: alpha(@window_fg_color, 0.11); } .allday-chip-label { color: @window_fg_color; font-size: 0.8em; } /* --- scrolling hour grid -------------------------------------------------- */ .timegrid-body { background-color: @window_bg_color; } .time-axis { background-color: @window_bg_color; border-right: 1px solid alpha(@window_fg_color, 0.08); } .hour-label { color: alpha(@window_fg_color, 0.5); font-size: 0.72em; font-variant-numeric: tabular-nums; padding: 1px 6px 0 0; } .day-column { background-color: @window_bg_color; border-left: 1px solid alpha(@window_fg_color, 0.06); } .day-column.today { background-color: alpha(@accent_color, 0.05); } .day-column .hour-line { background-color: alpha(@window_fg_color, 0.09); } .day-column .half-line { background-color: alpha(@window_fg_color, 0.04); } /* A positioned timed-event block (rounded, calendar-colour tinted). */ .event-block { background-color: alpha(@accent_color, 0.18); border-left: 3px solid @accent_color; border-radius: 6px; padding: 2px 6px; min-height: 0; margin: 0; } .event-block:hover { background-color: alpha(@accent_color, 0.30); } .event-block-time { color: @window_fg_color; font-size: 0.72em; font-variant-numeric: tabular-nums; opacity: 0.85; } .event-block-title { color: @window_fg_color; font-size: 0.82em; font-weight: 600; } .now-line { background-color: @accent_color; } .drag-selection { background-color: alpha(@accent_color, 0.25); border: 1px solid @accent_color; border-radius: 6px; } /* =============================================================== CARDS/ROWS */ /* Shared with the dialogs: rounded raised card holding hairline-split rows. */ .tn-cal .tn-card, .tn-cal-dialog .tn-card { background-color: @card_bg_color; border-radius: 14px; border: 1px solid alpha(@window_fg_color, 0.07); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.40), 0 8px 28px rgba(0, 0, 0, 0.28), inset 0 1px 0 alpha(@window_fg_color, 0.07); } .tn-cal-dialog .tn-row { padding: 10px 16px; min-height: 26px; } .tn-cal-dialog .tn-card > .tn-row:not(:last-child) { border-bottom: 1px solid alpha(@window_fg_color, 0.10); } .tn-cal-dialog .tn-title { color: @window_fg_color; font-weight: 500; } .tn-cal-dialog .tn-subtitle { color: alpha(@window_fg_color, 0.55); font-size: 0.9em; } /* ================================================================== DIALOGS */ .tn-cal-dialog-box { padding: 22px 22px 20px 22px; } .tn-cal-dialog-title { font-size: 1.4em; font-weight: 800; color: @window_fg_color; } .tn-cal-dialog entry { background-color: alpha(@window_fg_color, 0.06); border: 1px solid alpha(@window_fg_color, 0.10); border-radius: 10px; color: @window_fg_color; padding: 6px 10px; } .tn-cal-dialog entry:focus-within { border-color: @accent_color; } .tn-cal-dialog entry.error { border-color: #ff453a; } /* HH : MM time picker — compact dropdowns with a tabular Iosevka readout. */ .tn-cal-time-dd { min-width: 58px; } .tn-cal-time-dd, .tn-cal-time-sep { font-family: "Iosevka Aile", "Iosevka", monospace; font-variant-numeric: tabular-nums; } .tn-cal-time-sep { font-weight: 700; color: alpha(@window_fg_color, 0.6); } /* Accent the switch when on (GTK default would be blue without libadwaita). */ .tn-cal-dialog switch:checked { background-color: @accent_color; } /* Primary action (Save) = solid Fuji accent, not GTK's default blue. */ .tn-cal-dialog button.suggested-action, .tn-cal button.suggested-action { background-color: @accent_color; color: @accent_fg_color; box-shadow: none; } .tn-cal-dialog button.suggested-action:hover, .tn-cal button.suggested-action:hover { background-color: shade(@accent_color, 0.92); } /* =============================================================== STATUS PAGE */ .tn-status-page { padding: 36px 24px; } .tn-status-icon { color: alpha(@window_fg_color, 0.3); -gtk-icon-size: 96px; } .tn-status-desc { color: alpha(@window_fg_color, 0.6); font-size: 0.95em; } .title-1 { font-size: 1.9em; font-weight: 800; color: @window_fg_color; } /* ===================================================================== TOAST */ .tn-toast { background-color: rgba(40, 40, 42, 0.92); color: #ffffff; border-radius: 999px; padding: 10px 20px; box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3); } /* ============================================================ CONTEXT MENUS */ .context-menu { padding: 4px; min-width: 150px; } .context-menu-item { padding: 6px 12px; border-radius: 8px; color: @window_fg_color; font-weight: 500; } .context-menu-item:hover { background-color: alpha(@window_fg_color, 0.10); } .context-menu-item.destructive { color: #ff453a; } .context-menu-item.destructive:hover { background-color: alpha(#ff453a, 0.16); color: #ff453a; } /* ============================================================== FOCUS RING */ *:focus-visible { outline-color: @accent_color; }