Shaarli_bm_theme/shaarli-pro/css/custom_views.css

1780 lines
43 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* =========================================
Special Views for Todos and Notes
========================================= */
/* Theme tokens for custom views */
:root {
--special-view-panel-bg: var(--tile-bg, var(--bg-card));
--special-view-panel-alt: color-mix(in srgb, var(--tile-bg, var(--bg-card)) 85%, var(--bg-body));
--special-view-border: var(--tile-border, var(--border));
--special-view-divider: var(--border-light);
--special-view-shadow: var(--tile-shadow, var(--shadow-md));
--special-view-muted: var(--text-secondary);
--special-view-strong: var(--text-main);
--special-view-chip-bg: color-mix(in srgb, var(--primary) 12%, transparent);
--special-view-chip-hover: color-mix(in srgb, var(--primary) 22%, transparent);
--special-view-chip-text: var(--text-main);
}
/* --- Layout Wrapper (injected by JS) --- */
.special-view-wrapper {
display: flex;
flex-direction: row;
width: 100%;
min-height: calc(100vh - 60px);
/* Adjust for header */
}
/* --- TODO VIEW --- */
body.view-todo .content-container {
padding: 2rem;
background-color: transparent;
min-height: 100vh;
/* Adjust for header */
}
body.view-todo #linklist {
display: block;
/* Show default list when wrapper is not active */
}
.create-task-btn:hover {
background-color: var(--primary-hover);
transform: translateY(-1px);
}
.todo-list-item {
padding: 0.75rem 1rem;
margin-bottom: 0.25rem;
border-radius: 0.5rem;
cursor: pointer;
color: var(--special-view-strong);
display: flex;
align-items: center;
gap: 0.75rem;
transition: background-color 0.2s;
}
.todo-list-item:hover {
background-color: color-mix(in srgb, var(--special-view-strong) 8%, transparent);
}
.todo-list-item.active {
background-color: color-mix(in srgb, var(--primary) 10%, transparent);
color: var(--primary);
font-weight: 600;
margin: 0;
}
/* Todo Item */
.todo-item {
padding: 1rem;
border-bottom: 1px solid var(--special-view-divider);
display: flex;
align-items: center;
gap: 1rem;
transition: background-color 0.2s;
}
.todo-item:hover {
background-color: color-mix(in srgb, var(--special-view-strong) 5%, transparent);
}
.todo-checkbox {
width: 20px;
height: 20px;
border: 2px solid var(--special-view-muted);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.todo-checkbox.checked {
background-color: var(--primary);
border-color: var(--primary);
color: white;
}
.todo-content {
flex: 1;
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.todo-title {
font-size: 1rem;
color: var(--special-view-strong);
font-weight: 400;
}
.todo-item.completed .todo-title {
text-decoration: line-through;
color: var(--text-muted);
}
.todo-meta {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.75rem;
color: var(--special-view-muted);
}
.todo-badge {
padding: 0.125rem 0.5rem;
border-radius: 1rem;
background-color: var(--special-view-chip-bg);
font-size: 0.7rem;
}
.due-date {
display: flex;
align-items: center;
gap: 0.25rem;
}
/* --- NOTES VIEW --- */
/* Wrapper */
body.view-notes .content-container,
body.view-archive .content-container {
padding: 2rem;
background-color: transparent;
min-height: 100vh;
}
/* Tool Bar / Input Area */
.notes-top-bar {
display: flex;
justify-content: center;
align-items: flex-start;
margin-bottom: 2rem;
position: relative;
padding-right: 0;
}
.note-input-container {
width: 800px;
max-width: 100%;
background-color: var(--special-view-panel-bg);
border-radius: 12px;
border: 1px solid var(--special-view-border);
box-shadow: var(--special-view-shadow);
transition: box-shadow 0.2s;
overflow: hidden;
}
.note-input-container.is-editing {
max-height: 72vh;
}
.note-input-collapsed {
display: flex;
align-items: center;
padding: 12px 16px;
cursor: text;
color: var(--special-view-muted);
font-weight: 500;
font-size: 1rem;
}
.note-input-container.is-editing {
cursor: default;
}
.icon-btn:hover {
background-color: color-mix(in srgb, var(--text-muted) 10%, transparent);
}
.icon-btn.active {
color: var(--primary);
background-color: var(--special-view-chip-bg);
}
.notes-masonry {
column-count: 4;
column-gap: 16px;
width: 100%;
max-width: 1600px;
margin: 0 auto;
}
/* Responsive masonry columns based on viewport */
@media (max-width: 1400px) {
.notes-masonry { column-count: 3; }
}
@media (max-width: 1024px) {
.notes-masonry { column-count: 2; }
}
@media (max-width: 640px) {
.notes-masonry { column-count: 1; }
}
/* Collapse empty columns when only a few notes/todos exist
(prevents the large empty right-side area seen with 1 item) */
.notes-masonry:has(.note-card:first-child:last-child) { column-count: 1; }
.notes-masonry:has(.note-card:nth-child(2):last-child) { column-count: 2; }
.notes-masonry:has(.note-card:nth-child(3):last-child) { column-count: 3; }
.notes-masonry .note-card {
display: inline-block;
width: 100%;
margin: 0 0 16px;
break-inside: avoid;
-webkit-column-break-inside: avoid;
page-break-inside: avoid;
column-span: none;
border-radius: 14px;
overflow: hidden;
border: 1px solid var(--special-view-border);
background: var(--special-view-panel-bg);
box-shadow: var(--special-view-shadow);
}
.note-card {
border-radius: 14px;
overflow: hidden;
border: 1px solid var(--special-view-border);
background: var(--special-view-panel-bg);
}
.note-card .note-inner {
position: relative;
padding: 14px 16px 12px;
padding-right: 58px;
}
.note-modal-overlay {
display: none;
position: fixed;
inset: 0;
z-index: 1100;
align-items: center;
justify-content: center;
padding: 1rem;
background: rgba(0, 0, 0, 0.55);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(3px);
overflow-y: auto;
}
.note-modal-overlay.open {
display: flex;
}
.note-modal {
width: min(720px, 92vw);
max-height: 86vh;
overflow: hidden;
border-radius: 14px;
background: var(--special-view-panel-bg);
border: 1px solid var(--special-view-border);
box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22);
color: inherit;
display: flex;
flex-direction: column;
}
.note-modal-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
padding: 18px 20px 10px;
flex-shrink: 0;
}
.note-modal-tags.is-empty {
display: none;
}
.note-modal-tags .note-tag {
display: inline-flex;
align-items: center;
gap: 0.25rem;
background: var(--special-view-chip-bg);
color: var(--special-view-chip-text);
border-radius: 999px;
padding: 0.25rem 0.5rem;
font-size: 0.75rem;
font-weight: 500;
}
.note-modal-tags .note-tag-text {
line-height: 1.2;
}
.note-modal-tags .note-tag-remove-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 1.1rem;
height: 1.1rem;
border: none;
border-radius: 999px;
background: var(--special-view-chip-hover);
color: currentColor;
cursor: pointer;
padding: 0;
line-height: 1;
font-size: 0.8rem;
}
.note-modal-actions {
display: flex;
align-items: center;
justify-content: space-between;
gap: 6px;
padding: 8px 16px 16px;
background: transparent;
flex-shrink: 0;
flex-wrap: wrap;
}
.note-modal-pin-toggle:hover,
.note-modal-pin-toggle.active {
background-color: color-mix(in srgb, var(--text-main) 14%, transparent);
}
.note-body {
font-size: 0.875rem;
line-height: 1.4;
color: var(--special-view-strong);
word-wrap: break-word;
display: block;
overflow: hidden;
max-height: 360px;
}
.note-body p,
.note-modal-content p {
margin: 0 0 0.5rem;
}
.bookmark-palette>button:hover {
background: var(--primary-light);
color: var(--primary);
}
.palette-popup {
display: none;
position: absolute;
left: 0;
bottom: calc(100% + 8px);
background: var(--special-view-panel-bg);
border: 1px solid var(--special-view-border);
border-radius: 12px;
padding: 12px;
box-shadow: 0 14px 34px rgba(0, 0, 0, 0.22);
z-index: 50;
width: max-content;
max-width: min(340px, calc(100vw - 32px));
max-height: min(320px, calc(100vh - 140px));
overflow: auto;
overscroll-behavior: contain;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
.palette-popup.open {
display: block;
}
.note-card .note-hover-actions button,
.note-card .note-hover-actions a {
color: inherit;
}
.note-card[class*="note-color-"] {
color: var(--note-card-fg, var(--special-view-strong));
border: 1px solid var(--special-view-border);
}
/* Ensure archive view uses same background as notes view */
body.view-archive .content-container {
background-color: transparent !important;
}
/* Archive Title */
.archive-title-container {
text-align: center;
margin-bottom: 1rem;
}
.archive-title {
font-size: 1.75rem;
font-weight: 600;
color: var(--special-view-strong);
margin: 0;
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
}
.archive-title i {
font-size: 1.5rem;
color: var(--primary);
}
.archive-subtitle {
font-size: 0.875rem;
color: var(--special-view-muted);
margin: 0.25rem 0 0 0;
}
/* Archive top bar adjustments */
.archive-top-bar {
flex-direction: column;
align-items: center;
padding-right: 0;
gap: 1rem;
position: relative;
}
.archive-top-bar .notes-tools {
position: absolute;
right: 1rem;
top: 50%;
transform: translateY(-50%);
}
body.view-todo .note-card.todo-card .note-body {
padding-top: 0.25rem;
}
body.view-todo .note-card.todo-card .todo-checklist-preview-wrap {
display: block;
-webkit-line-clamp: initial;
line-clamp: initial;
-webkit-box-orient: initial;
overflow: hidden;
max-height: 360px;
padding-top: 0.25rem;
}
.todo-checklist-preview {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-direction: column;
gap: 0.35rem;
}
.todo-checklist-preview-item {
display: flex;
align-items: flex-start;
gap: 0.6rem;
font-size: 0.95rem;
line-height: 1.35;
}
.todo-checklist-preview-box {
width: 16px;
height: 16px;
border-radius: 4px;
border: 2px solid currentColor;
display: inline-flex;
align-items: center;
justify-content: center;
flex: 0 0 auto;
opacity: 0.7;
margin-top: 2px;
}
.todo-checklist-preview-box i {
font-size: 14px;
opacity: 0;
}
.todo-checklist-preview-text {
flex: 1;
min-width: 0;
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-word;
}
.todo-checklist-preview-item.is-checked {
opacity: 0.7;
}
.todo-checklist-preview-item.is-checked .todo-checklist-preview-box i {
opacity: 1;
}
.todo-checklist-preview-item.is-checked .todo-checklist-preview-text {
text-decoration: line-through;
}
.todo-checklist-preview-more {
opacity: 0.7;
}
.todo-modal .note-modal-content {
padding-top: 6px;
}
.todo-checklist {
display: flex;
flex-direction: column;
gap: 6px;
padding-bottom: 6px;
}
.todo-checklist-row {
display: grid;
grid-template-columns: 26px 26px minmax(0, 1fr) 34px;
align-items: center;
gap: 8px;
padding: 6px 2px;
border-radius: 8px;
}
.todo-checklist-row.is-checked {
opacity: 0.75;
}
.todo-checklist-row.is-dragging {
opacity: 0.6;
}
.todo-drag-handle {
width: 26px;
height: 26px;
border: none;
background: none;
color: inherit;
opacity: 0.7;
cursor: grab;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0;
}
.todo-drag-handle:active {
cursor: grabbing;
}
.todo-drag-handle i {
font-size: 18px;
}
.todo-checklist-box {
width: 26px;
height: 26px;
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.todo-checklist-box input {
position: absolute;
opacity: 0;
pointer-events: none;
}
.todo-checklist-box-ui {
width: 16px;
height: 16px;
border-radius: 4px;
border: 2px solid currentColor;
display: inline-block;
opacity: 0.75;
}
.todo-item-checkbox:checked+.todo-checklist-box-ui {
background: currentColor;
box-shadow: inset 0 0 0 3px rgba(0, 0, 0, 0.22);
}
[data-theme="dark"] .todo-item-checkbox:checked+.todo-checklist-box-ui {
box-shadow: inset 0 0 0 3px rgba(0, 0, 0, 0.35);
}
.todo-item-text {
width: 100%;
border: none;
background: transparent;
color: inherit;
font-size: 1rem;
line-height: 1.4;
padding: 6px 6px;
border-radius: 6px;
outline: none;
min-width: 0;
}
.todo-checklist-row.is-checked .todo-item-text {
text-decoration: line-through;
}
.todo-item-text:focus {
background: color-mix(in srgb, var(--text-main) 6%, transparent);
}
[data-theme="dark"] .todo-item-text:focus {
background: color-mix(in srgb, var(--text-main) 8%, transparent);
}
.todo-item-delete {
width: 34px;
height: 34px;
border: none;
background: none;
color: inherit;
opacity: 0.7;
cursor: pointer;
border-radius: 50%;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0;
}
.todo-item-delete:hover {
opacity: 1;
background: color-mix(in srgb, var(--text-main) 8%, transparent);
}
[data-theme="dark"] .todo-item-delete:hover {
background: color-mix(in srgb, var(--text-main) 12%, transparent);
}
.todo-item-delete i {
font-size: 20px;
}
.todo-add-item-btn {
border: none;
background: none;
color: inherit;
opacity: 0.8;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 10px;
padding: 8px 0;
font-size: 1rem;
justify-content: flex-start;
width: 100%;
}
.todo-add-item-btn i {
font-size: 18px;
}
.todo-add-item-btn:hover {
opacity: 1;
}
/* =========================================================
Notes / Todos views — UX polish (professional layout)
========================================================= */
/* Content container for notes & todos: centered, sensible max */
body.view-notes .content-container,
body.view-todo .content-container,
body.view-archive .content-container {
padding: 1.75rem clamp(1rem, 3vw, 2.5rem);
}
/* Results filter banner ("N résultat(s) tagué(s) ...") */
body.view-notes .linklist-filters,
body.view-todo .linklist-filters,
body.view-archive .linklist-filters {
display: inline-flex;
align-items: center;
gap: 0.5rem;
max-width: max-content;
margin: 0 0 1.25rem;
padding: 0.45rem 0.85rem;
border-radius: 9999px;
background: var(--special-view-chip-bg);
color: var(--special-view-strong);
font-size: 0.85rem;
font-weight: 500;
border: 1px solid var(--special-view-border);
}
/* Notes/todos top bar: center input, keep view switch on the right */
.notes-top-bar {
position: relative;
gap: 1rem;
align-items: center;
max-width: 1600px;
margin-left: auto;
margin-right: auto;
}
.notes-top-bar .notes-tools {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
}
/* Compact editor when collapsed */
.note-input-container {
width: min(760px, 100%);
transition: box-shadow 0.2s ease, border-color 0.2s ease;
}
.note-input-container:hover {
box-shadow: var(--tile-shadow-hover, var(--shadow-md));
}
.note-input-container.is-editing {
box-shadow: var(--tile-shadow-hover, var(--shadow-md));
border-color: color-mix(in srgb, var(--primary) 40%, var(--special-view-border));
}
/* Expanded editor inputs */
.note-input-container input[type="text"],
.note-input-container textarea {
width: 100%;
border: 0;
background: transparent;
color: var(--special-view-strong);
padding: 10px 14px;
font-size: 1rem;
font-family: inherit;
outline: none;
}
.note-input-container textarea {
resize: vertical;
min-height: 120px;
line-height: 1.45;
}
.note-input-container input[type="text"]::placeholder,
.note-input-container textarea::placeholder {
color: var(--special-view-muted);
}
/* Toolbar / action rows inside the note/todo create form */
.note-input-container .note-editor-toolbar,
.note-input-container .note-input-actions,
.note-input-container .todo-editor-toolbar {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 4px;
padding: 6px 10px;
border-top: 1px solid var(--special-view-divider);
background: color-mix(in srgb, var(--special-view-panel-bg) 88%, var(--bg-body));
}
.note-input-container .icon-btn,
.note-input-container button:not(.btn):not([class*="note-close"]):not([class*="submit"]) {
background: transparent;
border: 0;
color: var(--special-view-strong);
border-radius: 6px;
padding: 6px 8px;
font-size: 0.85rem;
cursor: pointer;
line-height: 1;
transition: background 0.15s ease;
}
.note-input-container .icon-btn:hover,
.note-input-container button:not(.btn):not([class*="note-close"]):not([class*="submit"]):hover {
background: color-mix(in srgb, var(--text-main) 10%, transparent);
}
/* "Fermer" footer button */
.note-input-container .note-close-btn,
.note-input-container [data-action="close"] {
background: var(--special-view-panel-alt);
color: var(--special-view-strong);
border: 1px solid var(--special-view-border);
border-radius: 8px;
padding: 6px 12px;
font-size: 0.85rem;
cursor: pointer;
}
.note-input-container .note-close-btn:hover,
.note-input-container [data-action="close"]:hover {
background: var(--tile-bg-hover, var(--bg-card-hover));
}
/* Todo checklist row inside creation form */
.note-input-container .todo-checklist-row {
padding: 4px 10px;
border-radius: 0;
border-bottom: 1px solid var(--special-view-divider);
}
.note-input-container .todo-checklist-row:last-of-type {
border-bottom: 0;
}
.note-input-container .todo-item-text {
padding: 8px 6px;
}
/* Note cards: padding & typography polish */
.note-card .note-title {
font-weight: 600;
font-size: 1rem;
line-height: 1.3;
margin: 0 0 6px;
color: inherit;
}
.note-card .note-body {
font-size: 0.9rem;
line-height: 1.5;
}
/* Tag chips inside note cards */
.note-card .note-tag,
.note-card .link-tag {
background: color-mix(in srgb, var(--primary) 14%, transparent);
color: var(--special-view-chip-text);
border-radius: 9999px;
padding: 2px 8px;
font-size: 0.72rem;
font-weight: 500;
border: 1px solid color-mix(in srgb, var(--primary) 22%, transparent);
}
/* Hover state for note cards */
.notes-masonry .note-card {
transition: box-shadow 0.2s ease, transform 0.2s ease, border-color 0.2s ease;
}
.notes-masonry .note-card:hover {
box-shadow: var(--tile-shadow-hover, var(--shadow-lg));
border-color: color-mix(in srgb, var(--primary) 35%, var(--special-view-border));
transform: translateY(-1px);
}
/* Ensure note cards respect theme colors even when no color tag present */
.note-card:not([class*="note-color-"]) {
color: var(--special-view-strong);
}
/* Todo view-specific: single-column empty-state nicety */
body.view-todo .notes-masonry:empty::after {
content: "Aucune tâche pour le moment.";
display: block;
padding: 3rem 1rem;
text-align: center;
color: var(--special-view-muted);
font-size: 0.95rem;
}
body.view-notes .notes-masonry:empty::after {
content: "Aucune note pour le moment.";
display: block;
padding: 3rem 1rem;
text-align: center;
color: var(--special-view-muted);
font-size: 0.95rem;
}
/* =========================================================
Icon buttons — base (view-switch + card action btns)
========================================================= */
.icon-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
border: none;
border-radius: 8px;
background: transparent;
color: var(--special-view-strong);
cursor: pointer;
padding: 0;
font-size: 1rem;
line-height: 1;
text-decoration: none;
transition: background 0.15s ease, color 0.15s ease;
}
.notes-tools {
display: flex;
align-items: center;
gap: 4px;
}
/* =========================================================
Note card — pin corner
========================================================= */
.note-pin-corner {
position: absolute;
top: 10px;
right: 12px;
width: 28px;
height: 28px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 50%;
background: transparent;
color: var(--special-view-muted);
opacity: 0;
transition: opacity 0.15s ease, background 0.15s ease, color 0.15s ease;
text-decoration: none;
font-size: 1rem;
}
.note-card:hover .note-pin-corner,
.note-pin-corner.active {
opacity: 1;
}
.note-pin-corner:hover {
background: color-mix(in srgb, var(--text-main) 12%, transparent);
color: var(--special-view-strong);
}
.note-pin-corner.active {
color: var(--primary);
}
/* =========================================================
Note card — tags row
========================================================= */
.note-tags {
display: flex;
flex-wrap: wrap;
gap: 4px;
padding: 4px 0 6px;
}
/* =========================================================
Note card — hover actions bar (bottom strip)
========================================================= */
.note-hover-actions {
display: flex;
align-items: center;
gap: 2px;
padding: 4px 8px 6px;
border-top: 1px solid var(--special-view-divider);
margin-top: 8px;
opacity: 0;
transition: opacity 0.15s ease;
}
.note-card:hover .note-hover-actions {
opacity: 1;
}
.note-hover-actions button,
.note-hover-actions > a {
display: inline-flex;
align-items: center;
justify-content: center;
width: 30px;
height: 30px;
border: none;
border-radius: 8px;
background: transparent;
color: inherit;
cursor: pointer;
padding: 0;
font-size: 0.95rem;
text-decoration: none;
line-height: 1;
transition: background 0.15s ease;
}
.note-hover-actions button:hover,
.note-hover-actions > a:hover {
background: color-mix(in srgb, var(--text-main) 12%, transparent);
}
.note-hover-actions .spacer {
flex: 1;
}
/* =========================================================
Collapsed input bar — layout fixes
========================================================= */
.note-input-placeholder {
flex: 1;
font-weight: 500;
font-size: 1rem;
color: var(--special-view-muted);
}
/* Override toolbar styling that bleeds into the collapsed bar's action zone */
.note-input-collapsed .note-input-actions {
padding: 0;
border-top: none;
background: transparent;
flex-shrink: 0;
}
/* =========================================================
Expanded draft editor — layout & component styles
========================================================= */
.note-input-expanded,
.todo-draft-expanded {
display: flex;
flex-direction: column;
overflow: hidden;
}
.todo-draft-list {
padding: 4px 0;
max-height: 220px;
overflow-y: auto;
flex-shrink: 0;
}
.note-input-expanded-actions {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
padding: 8px 10px;
border-top: 1px solid var(--special-view-divider);
background: color-mix(in srgb, var(--special-view-panel-bg) 88%, var(--bg-body));
flex-shrink: 0;
}
.note-input-actions-left {
display: flex;
align-items: center;
gap: 4px;
}
/* "+ Élément de liste" add-item button */
.todo-draft-add-btn {
display: flex;
align-items: center;
gap: 8px;
border: none;
background: transparent;
color: var(--special-view-muted);
cursor: pointer;
font-size: 0.9rem;
font-family: inherit;
padding: 8px 14px;
text-align: left;
width: 100%;
flex-shrink: 0;
transition: color 0.15s ease;
}
.todo-draft-add-btn:hover {
color: var(--special-view-strong);
}
.todo-draft-add-btn i {
font-size: 18px;
}
/* "Fermer" close button — pill style, override the transparent-btn rule */
.note-input-close-btn {
display: inline-flex !important;
align-items: center !important;
background: var(--special-view-panel-alt) !important;
color: var(--special-view-strong) !important;
border: 1px solid var(--special-view-border) !important;
border-radius: 8px !important;
padding: 6px 16px !important;
font-size: 0.9rem !important;
font-family: inherit;
cursor: pointer;
flex-shrink: 0;
width: auto !important;
height: auto !important;
transition: background 0.15s ease;
}
.note-input-close-btn:hover {
background: var(--tile-bg-hover, var(--bg-card-hover)) !important;
}
/* Palette button inside editor toolbar */
.note-input-palette-btn,
.note-input-format-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
border: none;
background: transparent;
color: var(--special-view-strong);
border-radius: 8px;
cursor: pointer;
padding: 0;
font-size: 1.1rem;
transition: background 0.15s ease;
}
.note-input-palette-btn:hover,
.note-input-format-btn:hover {
background: color-mix(in srgb, var(--text-main) 10%, transparent);
}
/* Draft title input — bolder heading style */
.note-input-container .todo-draft-title,
.note-input-container .note-input-title {
font-weight: 600;
font-size: 1.05rem;
padding: 12px 14px 4px;
}
/* =========================================================
Draft editor — checklist item row (3-col grid)
========================================================= */
.todo-draft-row {
display: grid;
grid-template-columns: 26px minmax(0, 1fr) 34px;
align-items: center;
gap: 6px;
padding: 2px 4px;
}
/* =========================================================
Note/todo card — tag pill inline layout + × button
========================================================= */
.note-card .note-tag {
display: inline-flex;
align-items: center;
gap: 3px;
}
.note-card .note-tag-remove-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 14px;
height: 14px;
border: none;
border-radius: 999px;
background: color-mix(in srgb, var(--primary) 30%, transparent);
color: var(--special-view-chip-text);
cursor: pointer;
padding: 0;
line-height: 1;
font-size: 0.7rem;
flex-shrink: 0;
transition: background 0.15s ease;
}
.note-card .note-tag-remove-btn:hover {
background: color-mix(in srgb, var(--primary) 55%, transparent);
}
/* =========================================================
Modal — scrollable content area
========================================================= */
.note-modal-content {
flex: 1 1 auto;
overflow-y: auto;
padding: 0 20px 12px;
}
/* =========================================================
Modal — tags row
========================================================= */
.note-modal-tags {
display: flex;
flex-wrap: wrap;
gap: 6px;
padding: 6px 20px 10px;
flex-shrink: 0;
}
/* =========================================================
Modal — pin toggle button (top-right of header)
========================================================= */
.note-modal-pin-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
width: 32px;
height: 32px;
border: none;
border-radius: 50%;
background: transparent;
color: var(--special-view-muted);
cursor: pointer;
padding: 0;
font-size: 1rem;
transition: background 0.15s ease, color 0.15s ease;
}
.note-modal-pin-toggle.active {
color: var(--primary);
}
/* =========================================================
Modal — actions row components
========================================================= */
.note-modal-actions-left {
display: flex;
align-items: center;
gap: 4px;
}
.note-modal-color-picker {
position: relative;
}
/* Icon buttons in modal actions (palette, edit, delete) */
.note-modal-actions button,
.note-modal-actions > div > button,
.note-modal-actions a {
display: inline-flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
border: none;
border-radius: 8px;
background: transparent;
color: var(--special-view-strong);
cursor: pointer;
padding: 0;
font-size: 1rem;
text-decoration: none;
transition: background 0.15s ease;
}
.note-modal-actions button:hover,
.note-modal-actions > div > button:hover,
.note-modal-actions a:hover {
background: color-mix(in srgb, var(--text-main) 10%, transparent);
}
/* "Fermer" close button in modal — pill style */
.note-modal-close-btn {
display: inline-flex !important;
align-items: center !important;
background: var(--special-view-panel-alt) !important;
color: var(--special-view-strong) !important;
border: 1px solid var(--special-view-border) !important;
border-radius: 8px !important;
padding: 6px 20px !important;
font-size: 0.9rem !important;
font-family: inherit;
cursor: pointer;
width: auto !important;
height: auto !important;
transition: background 0.15s ease;
}
.note-modal-close-btn:hover {
background: var(--tile-bg-hover, var(--bg-card-hover)) !important;
}
/* Modal title — editable appearance */
.note-modal-header .note-title {
flex: 1;
font-size: 1.15rem;
font-weight: 600;
line-height: 1.3;
margin: 0;
color: inherit;
word-break: break-word;
}
/* =========================================================
Background Studio Panel — #shaarli-bg-studio
========================================================= */
.bg-studio-panel {
position: fixed;
z-index: 1200;
width: min(360px, calc(100vw - 24px));
max-height: min(560px, calc(100vh - 24px));
overflow: hidden;
display: flex;
flex-direction: column;
background: var(--special-view-panel-bg);
border: 1px solid var(--special-view-border);
border-radius: 14px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.25), 0 2px 8px rgba(0, 0, 0, 0.12);
color: var(--special-view-strong);
font-family: inherit;
font-size: 0.9rem;
}
/* Header row: title + close button */
.bg-studio-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
padding: 12px 16px 8px;
flex-shrink: 0;
border-bottom: 1px solid var(--special-view-divider);
}
.bg-studio-title {
font-weight: 600;
font-size: 0.95rem;
flex: 1;
}
.bg-studio-close {
display: inline-flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border: none;
border-radius: 50%;
background: transparent;
color: inherit;
cursor: pointer;
padding: 0;
font-size: 1rem;
flex-shrink: 0;
transition: background 0.15s ease;
}
.bg-studio-close:hover {
background: color-mix(in srgb, var(--text-main) 10%, transparent);
}
/* Thumbnail gallery */
.bg-studio-gallery {
overflow-y: auto;
flex: 0 1 auto;
max-height: 200px;
display: flex;
flex-wrap: wrap;
gap: 6px;
padding: 10px 14px;
}
.bg-studio-tile {
display: flex;
flex-direction: column;
align-items: center;
gap: 3px;
}
.bg-studio-thumb {
width: 58px;
height: 44px;
border-radius: 8px;
border: 2px solid transparent;
cursor: pointer;
padding: 0;
background-size: cover;
background-position: center;
overflow: hidden;
background-color: var(--special-view-panel-alt);
transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.bg-studio-thumb:hover {
border-color: var(--primary);
}
.bg-studio-thumb.is-active {
border-color: var(--primary);
box-shadow: 0 0 0 2px color-mix(in srgb, var(--primary) 40%, transparent);
}
.bg-studio-thumb-solid {
display: block;
width: 100%;
height: 100%;
background: var(--special-view-panel-alt);
}
.bg-studio-thumb-label {
font-size: 0.65rem;
color: var(--special-view-muted);
text-align: center;
max-width: 58px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Color / filter rows section */
.bg-studio-rows {
padding: 8px 14px 6px;
flex-shrink: 0;
display: flex;
flex-direction: column;
gap: 8px;
border-bottom: 1px solid var(--special-view-divider);
overflow-y: auto;
}
.bg-studio-row {
display: flex;
flex-direction: column;
gap: 5px;
}
.bg-studio-row-heading {
display: flex;
align-items: center;
justify-content: space-between;
}
.bg-studio-row-label {
font-size: 0.75rem;
font-weight: 600;
color: var(--special-view-muted);
text-transform: uppercase;
letter-spacing: 0.04em;
}
.bg-studio-reset {
display: inline-flex;
align-items: center;
justify-content: center;
width: 22px;
height: 22px;
border: none;
background: transparent;
color: var(--special-view-muted);
cursor: pointer;
padding: 0;
border-radius: 50%;
font-size: 0.9rem;
transition: background 0.15s ease, color 0.15s ease;
}
.bg-studio-reset:hover {
background: color-mix(in srgb, var(--text-main) 10%, transparent);
color: var(--special-view-strong);
}
/* Swatches (color dots) */
.bg-studio-swatches {
display: flex;
flex-wrap: wrap;
gap: 5px;
}
.bg-studio-swatch {
width: 22px;
height: 22px;
border-radius: 50%;
border: 2px solid transparent;
cursor: pointer;
padding: 0;
flex-shrink: 0;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);
transition: border-color 0.15s ease, transform 0.1s ease;
}
.bg-studio-swatch:hover {
transform: scale(1.15);
}
.bg-studio-swatch.is-active {
border-color: var(--primary);
box-shadow: 0 0 0 2px color-mix(in srgb, var(--primary) 40%, transparent);
}
.bg-studio-swatch-custom {
display: inline-flex;
align-items: center;
justify-content: center;
background: var(--special-view-panel-alt);
border-color: var(--special-view-border);
font-size: 0.75rem;
color: var(--special-view-muted);
}
/* Filter buttons */
.bg-studio-filters {
display: flex;
flex-wrap: wrap;
gap: 4px;
}
.bg-studio-filter-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 30px;
height: 30px;
border: 1px solid var(--special-view-border);
border-radius: 8px;
background: transparent;
color: var(--special-view-muted);
cursor: pointer;
padding: 0;
font-size: 0.95rem;
transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.bg-studio-filter-btn:hover {
background: color-mix(in srgb, var(--text-main) 8%, transparent);
color: var(--special-view-strong);
}
.bg-studio-filter-btn.is-active {
background: color-mix(in srgb, var(--primary) 12%, transparent);
border-color: var(--primary);
color: var(--primary);
}
/* Search bar at the bottom */
.bg-studio-search {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 14px;
border-top: 1px solid var(--special-view-divider);
flex-shrink: 0;
}
.bg-studio-search > i {
color: var(--special-view-muted);
font-size: 1rem;
flex-shrink: 0;
}
.bg-studio-search-input {
flex: 1;
border: none;
background: transparent;
color: var(--special-view-strong);
font-family: inherit;
font-size: 0.85rem;
outline: none;
min-width: 0;
}
.bg-studio-search-input::placeholder {
color: var(--special-view-muted);
}
.bg-studio-clear {
display: inline-flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
border: none;
background: transparent;
color: var(--special-view-muted);
cursor: pointer;
padding: 0;
border-radius: 50%;
font-size: 0.85rem;
transition: background 0.15s ease, color 0.15s ease;
}
.bg-studio-clear:hover {
background: color-mix(in srgb, var(--text-main) 10%, transparent);
color: var(--special-view-strong);
}
/* =========================================================
Note / Todo card — background image display
========================================================= */
.note-card.note-has-bg {
background-image: var(--note-bg-image, none) !important;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
.link-outer.note-has-bg {
background-image: var(--note-bg-image, none) !important;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
.note-modal.note-has-bg {
background-image: var(--note-bg-image, none) !important;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
/* =========================================================
Note / Todo card — CSS filter overlays (::after pseudo)
========================================================= */
.note-card {
position: relative;
}
.note-card.note-filter-glass::after,
.note-card.note-filter-vignette::after,
.note-card.note-filter-lined::after,
.note-card.note-filter-grid::after,
.note-card.note-filter-noise::after,
.note-card.note-filter-dots::after,
.note-card.note-filter-stripes::after,
.link-outer.note-filter-glass::after,
.link-outer.note-filter-vignette::after,
.link-outer.note-filter-lined::after,
.link-outer.note-filter-grid::after,
.link-outer.note-filter-noise::after,
.link-outer.note-filter-dots::after,
.link-outer.note-filter-stripes::after {
content: "";
position: absolute;
inset: 0;
pointer-events: none;
z-index: 0;
border-radius: inherit;
}
/* Filter: Glass — frosted glass tint */
.note-card.note-filter-glass::after {
background: rgba(255, 255, 255, 0.06);
backdrop-filter: blur(2px);
-webkit-backdrop-filter: blur(2px);
}
.link-outer.note-filter-glass::after {
background: rgba(255, 255, 255, 0.06);
backdrop-filter: blur(2px);
-webkit-backdrop-filter: blur(2px);
}
/* Filter: Vignette — dark edges */
.note-card.note-filter-vignette::after {
background: radial-gradient(ellipse at center, transparent 45%, rgba(0, 0, 0, 0.42) 100%);
}
.link-outer.note-filter-vignette::after {
background: radial-gradient(ellipse at center, transparent 45%, rgba(0, 0, 0, 0.42) 100%);
}
/* Filter: Lined — horizontal ruled lines */
.note-card.note-filter-lined::after {
background-image: repeating-linear-gradient(
to bottom,
transparent 0px,
transparent 27px,
rgba(128, 128, 128, 0.18) 27px,
rgba(128, 128, 128, 0.18) 28px
);
}
.link-outer.note-filter-lined::after {
background-image: repeating-linear-gradient(
to bottom,
transparent 0px,
transparent 27px,
rgba(128, 128, 128, 0.18) 27px,
rgba(128, 128, 128, 0.18) 28px
);
}
/* Filter: Grid — squared grid */
.note-card.note-filter-grid::after {
background-image:
repeating-linear-gradient(to right, rgba(128, 128, 128, 0.15) 0px, rgba(128, 128, 128, 0.15) 1px, transparent 1px, transparent 28px),
repeating-linear-gradient(to bottom, rgba(128, 128, 128, 0.15) 0px, rgba(128, 128, 128, 0.15) 1px, transparent 1px, transparent 28px);
}
.link-outer.note-filter-grid::after {
background-image:
repeating-linear-gradient(to right, rgba(128, 128, 128, 0.15) 0px, rgba(128, 128, 128, 0.15) 1px, transparent 1px, transparent 28px),
repeating-linear-gradient(to bottom, rgba(128, 128, 128, 0.15) 0px, rgba(128, 128, 128, 0.15) 1px, transparent 1px, transparent 28px);
}
/* Filter: Noise — subtle stipple effect */
.note-card.note-filter-noise::after {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)' opacity='0.06'/%3E%3C/svg%3E");
background-repeat: repeat;
}
.link-outer.note-filter-noise::after {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)' opacity='0.06'/%3E%3C/svg%3E");
background-repeat: repeat;
}
/* Filter: Dots — dot pattern */
.note-card.note-filter-dots::after {
background-image: radial-gradient(circle, rgba(128, 128, 128, 0.3) 1px, transparent 1px);
background-size: 14px 14px;
}
.link-outer.note-filter-dots::after {
background-image: radial-gradient(circle, rgba(128, 128, 128, 0.3) 1px, transparent 1px);
background-size: 14px 14px;
}
/* Filter: Stripes — diagonal lines */
.note-card.note-filter-stripes::after {
background-image: repeating-linear-gradient(
-45deg,
transparent 0px,
transparent 8px,
rgba(128, 128, 128, 0.12) 8px,
rgba(128, 128, 128, 0.12) 9px
);
}
.link-outer.note-filter-stripes::after {
background-image: repeating-linear-gradient(
-45deg,
transparent 0px,
transparent 8px,
rgba(128, 128, 128, 0.12) 8px,
rgba(128, 128, 128, 0.12) 9px
);
}
/* Keep card inner content above the filter overlay */
.note-card .note-inner,
.note-card .note-hover-actions {
position: relative;
z-index: 1;
}
.link-outer .link-content,
.link-outer .link-actions,
.link-outer .link-meta {
position: relative;
z-index: 1;
}
.link-outer .link-hover-actions,
.link-outer .link-select-checkbox,
.link-outer .link-visibility-badge {
z-index: 20;
}
/* Let Background Studio font color affect bookmark tiles too */
.link-outer[class*="note-color-"],
.link-outer[class*="note-color-"] .link-title,
.link-outer[class*="note-color-"] .link-title a,
.link-outer[class*="note-color-"] .link-url,
.link-outer[class*="note-color-"] .link-url a,
.link-outer[class*="note-color-"] .link-description,
.link-outer[class*="note-color-"] .link-meta,
.link-outer[class*="note-color-"] .link-meta a,
.link-outer[class*="note-color-"] .link-actions,
.link-outer[class*="note-color-"] .link-actions a,
.link-outer[class*="note-color-"] .link-actions button,
.view-list .link-outer[class*="note-color-"],
.view-list .link-outer[class*="note-color-"] a,
.view-list .link-outer[class*="note-color-"] button {
color: var(--note-card-fg, var(--tile-text));
}
/* Let Background Studio font color affect note/todo body text */
.note-card[class*="note-color-"] .note-title,
.note-card[class*="note-color-"] .note-body,
.note-card[class*="note-color-"] .todo-checklist-preview-item,
.note-card[class*="note-color-"] .todo-checklist-preview-text {
color: var(--note-card-fg, var(--special-view-strong));
}