diff --git a/components/Dashboard/FeaturesLayoutEditor/features-layout-editor.css b/components/Dashboard/FeaturesLayoutEditor/features-layout-editor.css index 4624521..8cd318c 100644 --- a/components/Dashboard/FeaturesLayoutEditor/features-layout-editor.css +++ b/components/Dashboard/FeaturesLayoutEditor/features-layout-editor.css @@ -519,18 +519,27 @@ /* ---- Image toggle ---- */ .fle-image-toggle { - display: inline-flex; - align-items: center; - gap: 4px; - font-size: 0.64rem; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.04em; - opacity: 0.5; - cursor: pointer; + display: inline-flex !important; + flex-direction: row !important; + align-items: center !important; + align-self: center !important; + gap: 4px !important; + font-size: 0.68rem !important; + font-weight: 600 !important; + line-height: 1 !important; + text-transform: uppercase !important; + letter-spacing: 0.06em !important; + color: var(--theme-text, #fff) !important; + opacity: 0.4 !important; + cursor: pointer !important; + margin: 0 !important; + padding: 0 !important; } .fle-image-toggle input { cursor: pointer; + vertical-align: middle; + margin: 0 !important; + flex-shrink: 0; } /* ---- Photo Spotlight ---- */ diff --git a/components/Dashboard/OpinionLayoutEditor/index.tsx b/components/Dashboard/OpinionLayoutEditor/index.tsx index 2d903dc..1a31a34 100644 --- a/components/Dashboard/OpinionLayoutEditor/index.tsx +++ b/components/Dashboard/OpinionLayoutEditor/index.tsx @@ -50,8 +50,11 @@ type UserData = { type OpinionLayout = { column1: (number | null)[]; + column1Images: boolean[]; column2: (number | null)[]; + column2Images: boolean[]; column3: (number | null)[]; + column3Images: boolean[]; editorsChoice: (number | null)[]; editorsChoiceLabel: string; spotlight: SpotlightEntry[]; @@ -69,8 +72,11 @@ const pointerThenCenter: CollisionDetection = (args) => { const EMPTY_LAYOUT: OpinionLayout = { column1: [null, null, null, null, null], + column1Images: [false, false, false, false, false], column2: [null, null, null, null], + column2Images: [false, false, false, false], column3: [null, null, null, null], + column3Images: [false, false, false, false], editorsChoice: [null, null, null], editorsChoiceLabel: "Opinion\u2019s Choice", spotlight: [], @@ -179,7 +185,7 @@ function SlotPreview({ article, showImage }: { article: ArticleData; showImage?: // --------------------------------------------------------------------------- function DropSlot({ - slotId, label, article, showImage, onClear, isImageSlot, + slotId, label, article, showImage, onClear, isImageSlot, imageToggle, }: { slotId: string; label: string; @@ -187,6 +193,7 @@ function DropSlot({ showImage?: boolean; onClear: () => void; isImageSlot?: boolean; + imageToggle?: React.ReactNode; }) { const { isOver, setNodeRef } = useDroppable({ id: `drop-${slotId}`, @@ -200,9 +207,12 @@ function DropSlot({ >
{label} - {article && ( - - )} +
+ {imageToggle} + {article && ( + + )} +
{article ? ( @@ -313,13 +323,8 @@ function ArticlePool({ return (
onSearch(e.target.value)} - style={{ - display: 'block', - width: '100%', - boxSizing: 'border-box', - padding: '6px 10px', - fontSize: '13px', - lineHeight: '1.4', - border: '1px solid #ccc', - borderRadius: '6px', - outline: 'none', - background: '#f5f5f5', - }} + className="ole-pool-search" />
{filtered.length === 0 && (
No articles found
)} - {filtered.slice(0, 10).map((article) => ( + {filtered.slice(0, 20).map((article) => ( ))}
@@ -435,10 +429,22 @@ export function OpinionLayoutEditor() { if (layoutData) { const savedLayout = layoutData.layout as OpinionLayout | undefined; if (savedLayout && typeof savedLayout === 'object') { + const c1 = padArray(savedLayout.column1, 5); + const c2 = padArray(savedLayout.column2, 4); + const c3 = padArray(savedLayout.column3, 4); setLayout({ - column1: padArray(savedLayout.column1, 5), - column2: padArray(savedLayout.column2, 4), - column3: padArray(savedLayout.column3, 4), + column1: c1, + column1Images: savedLayout.column1Images + ? padBoolArray(savedLayout.column1Images, c1.length) + : padBoolArray([true], c1.length), // col1[0] previously always had image + column2: c2, + column2Images: savedLayout.column2Images + ? padBoolArray(savedLayout.column2Images, c2.length) + : padBoolArray([false, false, true], c2.length), // col2[2] previously always had image + column3: c3, + column3Images: savedLayout.column3Images + ? padBoolArray(savedLayout.column3Images, c3.length) + : padBoolArray([false, false, false, true], c3.length), // col3[3] previously always had image editorsChoice: padArray(savedLayout.editorsChoice, 3), editorsChoiceLabel: savedLayout.editorsChoiceLabel || "Opinion\u2019s Choice", spotlight: (savedLayout as OpinionLayout).spotlight || [], @@ -488,6 +494,27 @@ export function OpinionLayoutEditor() { setSlot(parsed.column, parsed.index, null); }, [setSlot]); + const toggleColumnImage = useCallback((column: 'column1' | 'column2' | 'column3', index: number) => { + const imagesKey = (column + 'Images') as 'column1Images' | 'column2Images' | 'column3Images'; + setLayout((prev) => { + const imgs = [...prev[imagesKey]]; + while (imgs.length <= index) imgs.push(false); + imgs[index] = !imgs[index]; + return { ...prev, [imagesKey]: imgs }; + }); + markDirty(); + }, [markDirty]); + + const addSlot = useCallback((column: 'column1' | 'column2' | 'column3') => { + const imagesKey = (column + 'Images') as 'column1Images' | 'column2Images' | 'column3Images'; + setLayout((prev) => ({ + ...prev, + [column]: [...prev[column], null], + [imagesKey]: [...prev[imagesKey], false], + })); + markDirty(); + }, [markDirty]); + // ---- Spotlight ---- const addSpotlight = useCallback((userId: number) => { setLayout((prev) => { @@ -594,10 +621,16 @@ export function OpinionLayoutEditor() { setError(null); try { // Trim trailing nulls from columns + const tc1 = trimTrailingNulls(layout.column1); + const tc2 = trimTrailingNulls(layout.column2); + const tc3 = trimTrailingNulls(layout.column3); const trimmed = { - column1: trimTrailingNulls(layout.column1), - column2: trimTrailingNulls(layout.column2), - column3: trimTrailingNulls(layout.column3), + column1: tc1, + column1Images: layout.column1Images.slice(0, tc1.length), + column2: tc2, + column2Images: layout.column2Images.slice(0, tc2.length), + column3: tc3, + column3Images: layout.column3Images.slice(0, tc3.length), editorsChoice: trimTrailingNulls(layout.editorsChoice), editorsChoiceLabel: layout.editorsChoiceLabel, spotlight: layout.spotlight || [], @@ -666,7 +699,7 @@ export function OpinionLayoutEditor() { -
+
{/* Left: canvas */}
{/* 3-column layout canvas */} @@ -676,9 +709,23 @@ export function OpinionLayoutEditor() {
Column 1
- clearSlot('col1-0')} isImageSlot /> - clearSlot('col1-1')} /> - clearSlot('col1-2')} /> + {layout.column1.slice(0, 3).map((_, i) => ( + clearSlot(`col1-${i}`)} + imageToggle={ + + } + /> + ))} {/* Fixed CTA */}
@@ -687,8 +734,27 @@ export function OpinionLayoutEditor() {

- clearSlot('col1-3')} /> - clearSlot('col1-4')} /> + {layout.column1.slice(3).map((_, ii) => { + const i = ii + 3; + return ( + clearSlot(`col1-${i}`)} + imageToggle={ + + } + /> + ); + })} +
{/* Column 2 */} @@ -696,7 +762,20 @@ export function OpinionLayoutEditor() {
Column 2
- clearSlot('col2-0')} /> + clearSlot('col2-0')} + imageToggle={ + + } + /> {/* Author Spotlight Carousel — inline editor */}
@@ -763,9 +842,27 @@ export function OpinionLayoutEditor() {
- clearSlot('col2-1')} /> - clearSlot('col2-2')} isImageSlot /> - clearSlot('col2-3')} /> + {layout.column2.slice(1).map((_, ii) => { + const i = ii + 1; + return ( + clearSlot(`col2-${i}`)} + imageToggle={ + + } + /> + ); + })} +
{/* Column 3 */} @@ -788,10 +885,24 @@ export function OpinionLayoutEditor() { ))} - clearSlot('col3-0')} /> - clearSlot('col3-1')} /> - clearSlot('col3-2')} /> - clearSlot('col3-3')} isImageSlot /> + {layout.column3.map((_, i) => ( + clearSlot(`col3-${i}`)} + imageToggle={ + + } + /> + ))} + @@ -828,3 +939,9 @@ function trimTrailingNulls(arr: (number | null)[]): (number | null)[] { while (result.length > 0 && result[result.length - 1] === null) result.pop(); return result; } + +function padBoolArray(arr: boolean[] | undefined, len: number): boolean[] { + const result = [...(arr || [])]; + while (result.length < len) result.push(false); + return result.slice(0, len); +} diff --git a/components/Dashboard/OpinionLayoutEditor/opinion-layout-editor.css b/components/Dashboard/OpinionLayoutEditor/opinion-layout-editor.css index fd1cc3a..17b9cc7 100644 --- a/components/Dashboard/OpinionLayoutEditor/opinion-layout-editor.css +++ b/components/Dashboard/OpinionLayoutEditor/opinion-layout-editor.css @@ -31,7 +31,7 @@ min-height: 100vh; background: var(--theme-bg, #0a0a0a); color: var(--theme-text, #fff); - font-family: inherit; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; } .ole-root button, .ole-root input { @@ -100,7 +100,7 @@ cursor: default; } -/* ---- Body (split: canvas left, pool right) ---- */ +/* ---- Body ---- */ .ole-body { display: grid; grid-template-columns: 1fr 320px; @@ -119,37 +119,10 @@ min-width: 0; } -/* ---- Editor's Choice Label ---- */ -.ole-ec-label-row { - display: flex; - align-items: center; - gap: 12px; - margin-bottom: 20px; -} -.ole-ec-label-label { - font-size: 0.8rem; - font-weight: 500; - opacity: 0.6; - white-space: nowrap; -} -.ole-ec-label-input { - background: var(--theme-elevation-100, #1a1a1a); - border: 1px solid var(--theme-elevation-200, #333); - color: var(--theme-text, #fff); - padding: 6px 12px; - border-radius: 6px; - font-size: 0.82rem; - width: 260px; -} -.ole-ec-label-input:focus { - outline: none; - border-color: #2563eb; -} - /* ---- 3-Column Canvas ---- */ .ole-canvas { display: grid; - grid-template-columns: 1fr 1fr 1fr; + grid-template-columns: 200px 1fr 240px; gap: 16px; } @@ -290,65 +263,19 @@ padding: 14px; position: relative; } -.ole-cta-block::before { - content: 'FIXED'; - position: absolute; - top: 4px; - right: 8px; - font-size: 0.58rem; - font-weight: 700; - letter-spacing: 0.1em; - opacity: 0.25; - text-transform: uppercase; -} .ole-cta-text { - font-size: 0.78rem; - opacity: 0.6; + font-size: 0.72rem; + opacity: 0.35; margin: 0; - line-height: 1.5; + text-align: center; + line-height: 1.4; } .ole-cta-link { - color: #2563eb; -} - -/* ---- Carousel Block (fixed, non-draggable) ---- */ -.ole-carousel-block { - background: var(--theme-elevation-100, #1a1a1a); - border: 1px solid var(--theme-elevation-200, #2a2a2a); - border-radius: 8px; - padding: 16px 14px; - display: flex; - flex-direction: column; - align-items: center; - gap: 6px; - position: relative; -} -.ole-carousel-block::before { - content: 'FIXED'; - position: absolute; - top: 4px; - right: 8px; - font-size: 0.58rem; - font-weight: 700; - letter-spacing: 0.1em; - opacity: 0.25; - text-transform: uppercase; -} -.ole-carousel-icon { - opacity: 0.3; -} -.ole-carousel-label { - font-size: 0.74rem; - font-weight: 600; - opacity: 0.5; -} -.ole-carousel-hint { - font-size: 0.64rem; - opacity: 0.25; - font-style: italic; + text-decoration: underline; + cursor: default; } -/* ---- Editor's Choice Section ---- */ +/* ---- Editor's Choice section ---- */ .ole-ec-section { background: var(--theme-elevation-100, #1a1a1a); border: 2px solid #C41E3A; @@ -374,89 +301,164 @@ box-shadow: 0 0 0 1px #C41E3A, inset 0 0 12px rgba(196, 30, 58, 0.08); } -/* ---- Pool (right sidebar — direct grid child, matches le-pool) ---- */ -.ole-pool { - border-left: 1px solid var(--theme-elevation-100, #181818); - background: var(--theme-bg, #0a0a0a); +/* ---- Author Spotlight section ---- */ +.ole-spotlight-section { + background: var(--theme-elevation-100, #1a1a1a); + border: 2px solid #2563eb; + border-radius: 8px; + padding: 10px; display: flex; flex-direction: column; - height: calc(100vh - 53px); - position: sticky; - top: 53px; -} -@media (max-width: 1100px) { - .ole-pool { - border-left: none; - border-top: 1px solid var(--theme-elevation-100, #181818); - height: auto; - max-height: 500px; - position: static; - } -} -.ole-pool-drop-active { - outline: 2px dashed #3b82f6; - outline-offset: -2px; - background: rgba(59, 130, 246, 0.04); + gap: 8px; } -.ole-pool-header { +.ole-spotlight-header { display: flex; - align-items: baseline; + align-items: center; justify-content: space-between; - padding: 14px 14px 0; } -.ole-pool-title { +.ole-spotlight-title { font-size: 0.78rem; font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.06em; + color: #2563eb; margin: 0; - letter-spacing: -0.01em; } -.ole-root .ole-pool-search { - display: block !important; - width: calc(100% - 28px) !important; - box-sizing: border-box !important; - margin: 8px 14px 0 !important; - padding: 7px 10px !important; - height: auto !important; - min-height: unset !important; - background: var(--theme-elevation-50, #111) !important; - border: 1px solid var(--theme-elevation-150, #222) !important; - border-radius: 6px !important; - color: var(--theme-text, #fff) !important; - font-size: 0.75rem !important; - line-height: 1.4 !important; - outline: none !important; - transition: border-color 0.2s !important; +.ole-spotlight-count { + font-size: 0.62rem; + opacity: 0.35; } -.ole-root .ole-pool-search:focus { - border-color: var(--theme-elevation-300, #444) !important; +.ole-spotlight-list { + display: flex; + flex-direction: column; + gap: 6px; } -.ole-root .ole-pool-search::placeholder { - color: var(--theme-text, #fff); - opacity: 0.2; +.ole-spotlight-entry { + display: flex; + flex-direction: column; + gap: 6px; + background: var(--theme-elevation-50, #111); + border: 1px solid var(--theme-elevation-150, #222); + border-radius: 6px; + padding: 8px 10px; +} +.ole-spotlight-entry-name { + font-size: 0.74rem; + font-weight: 600; } -.ole-pool-list { +.ole-spotlight-input { flex: 1; - overflow-y: auto; - padding: 6px 10px 16px; + min-width: 0; + background: var(--theme-elevation-100, #1a1a1a); + border: 1px solid var(--theme-elevation-200, #333); + border-radius: 4px; + padding: 4px 8px; + font-size: 0.72rem; + color: var(--theme-text, #fff); + outline: none; + box-sizing: border-box; +} +.ole-spotlight-input:focus { + border-color: var(--theme-elevation-400, #555); +} +.ole-spotlight-input::placeholder { + opacity: 0.35; +} +.ole-spotlight-entry-actions { display: flex; - flex-direction: column; - gap: 1px; + gap: 4px; + flex-shrink: 0; } -.ole-pool-list::-webkit-scrollbar { - width: 4px; +.ole-spotlight-btn { + background: var(--theme-elevation-100, #1a1a1a); + border: 1px solid var(--theme-elevation-200, #333); + border-radius: 4px; + color: var(--theme-text, #fff); + cursor: pointer; + font-size: 0.75rem; + padding: 3px 7px; + line-height: 1; + opacity: 0.7; + transition: opacity 0.15s; } -.ole-pool-list::-webkit-scrollbar-track { - background: transparent; +.ole-spotlight-btn:hover:not(:disabled) { + opacity: 1; } -.ole-pool-list::-webkit-scrollbar-thumb { - background: var(--theme-elevation-200, #333); +.ole-spotlight-btn:disabled { + opacity: 0.2; + cursor: default; +} +.ole-spotlight-remove { + color: #e55; +} +.ole-spotlight-add { + position: relative; +} +.ole-spotlight-search { + display: block; + width: 100%; + box-sizing: border-box; + background: var(--theme-elevation-50, #111); + border: 1px solid var(--theme-elevation-200, #333); border-radius: 4px; + padding: 6px 8px; + font-size: 0.72rem; + color: var(--theme-text, #fff); + outline: none; } -.ole-pool-empty { - text-align: center; - padding: 32px 16px; - opacity: 0.15; +.ole-spotlight-search:focus { + border-color: var(--theme-elevation-400, #555); +} +.ole-spotlight-search::placeholder { + opacity: 0.35; +} +.ole-spotlight-dropdown { + position: absolute; + top: 100%; + left: 0; + right: 0; + max-height: 160px; + overflow-y: auto; + background: var(--theme-elevation-100, #1a1a1a); + border: 1px solid var(--theme-elevation-200, #333); + border-radius: 4px; + z-index: 100; + overflow: hidden; +} +.ole-column button.ole-spotlight-user-option { + display: block; + width: 100%; + text-align: left; + padding: 8px 12px; font-size: 0.75rem; + color: var(--theme-text, #fff); + background: transparent; + border: none; + cursor: pointer; + transition: background 0.1s; +} +.ole-column button.ole-spotlight-user-option:hover { + background: var(--theme-elevation-200, #333); +} + +/* ---- Pool ---- */ +.ole-pool { + border-left: 1px solid var(--theme-elevation-100, #181818); + background: var(--theme-bg, #0a0a0a); + display: flex; + flex-direction: column; + height: calc(100vh - 53px); + position: sticky; + top: 53px; +} +@media (max-width: 1100px) { + .ole-pool { + border-left: none; + border-top: 1px solid var(--theme-elevation-100, #181818); + height: auto; + max-height: 500px; + position: static; + } } /* Pool card */ @@ -523,7 +525,6 @@ font-size: 0.64rem; opacity: 0.35; } - .ole-used { opacity: 0.35; } @@ -539,6 +540,32 @@ color: #22c55e; } +/* Pool search */ +.ole-root .ole-pool-search { + display: block !important; + width: calc(100% - 28px) !important; + box-sizing: border-box !important; + margin: 8px 14px 0 !important; + padding: 7px 10px !important; + height: auto !important; + min-height: unset !important; + background: var(--theme-elevation-50, #111) !important; + border: 1px solid var(--theme-elevation-150, #222) !important; + border-radius: 6px !important; + color: var(--theme-text, #fff) !important; + font-size: 0.75rem !important; + line-height: 1.4 !important; + outline: none !important; + transition: border-color 0.2s !important; +} +.ole-root .ole-pool-search:focus { + border-color: var(--theme-elevation-300, #444) !important; +} +.ole-root .ole-pool-search::placeholder { + color: var(--theme-text, #fff); + opacity: 0.2; +} + /* Dragging states */ .ole-dragging { opacity: 0.3; @@ -583,150 +610,49 @@ text-overflow: ellipsis; } -/* ---- Spotlight section ---- */ -.ole-column .ole-spotlight-section { - background: var(--theme-elevation-100, #1a1a1a); - border: 1px solid var(--theme-elevation-200, #2a2a2a); - border-radius: 8px; - overflow: visible; -} -.ole-column .ole-spotlight-header { - display: flex; - align-items: baseline; - justify-content: space-between; - flex-wrap: wrap; - gap: 8px 12px; - padding: 8px 10px; - background: var(--theme-elevation-50, #151515); - border-bottom: 1px solid var(--theme-elevation-150, #222); -} -.ole-column h3.ole-spotlight-title { - margin: 0; - font-size: 0.68rem; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.06em; - opacity: 0.4; -} -.ole-column .ole-spotlight-count { - font-size: 0.68rem; - color: var(--theme-text, #fff); - opacity: 0.4; -} -.ole-column .ole-spotlight-list { - display: flex; - flex-direction: column; - gap: 8px; - margin: 0; - padding: 10px 10px 8px; -} -.ole-column .ole-spotlight-entry { - display: flex; - align-items: flex-start; - gap: 10px; - background: var(--theme-elevation-50, #111); - border: 1px solid var(--theme-elevation-150, #222); - border-radius: 6px; - padding: 8px 10px; - flex-wrap: wrap; -} -.ole-column .ole-spotlight-entry-name { - font-size: 0.78rem; - font-weight: 600; - white-space: nowrap; - min-width: 120px; - flex-shrink: 0; -} -.ole-column input.ole-spotlight-input { - flex: 1; - min-width: 140px; - background: var(--theme-elevation-100, #1a1a1a); - border: 1px solid var(--theme-elevation-200, #333); - border-radius: 4px; - padding: 4px 8px; - font-size: 0.75rem; - color: var(--theme-text, #fff); - outline: none; -} -.ole-column input.ole-spotlight-input:focus { - border-color: var(--theme-elevation-400, #555); -} -.ole-column input.ole-spotlight-input::placeholder { - opacity: 0.35; -} -.ole-column .ole-spotlight-entry-actions { - display: flex; - gap: 4px; - flex-shrink: 0; +/* ---- Image toggle ---- */ +.ole-image-toggle { + display: inline-flex !important; + flex-direction: row !important; + align-items: center !important; + align-self: center !important; + gap: 4px !important; + font-size: 0.68rem !important; + font-weight: 600 !important; + line-height: 1 !important; + text-transform: uppercase !important; + letter-spacing: 0.06em !important; + color: var(--theme-text, #fff) !important; + opacity: 0.4 !important; + cursor: pointer !important; + margin: 0 !important; + padding: 0 !important; } -.ole-column button.ole-spotlight-btn { - background: var(--theme-elevation-100, #1a1a1a); - border: 1px solid var(--theme-elevation-200, #333); - border-radius: 4px; - color: var(--theme-text, #fff); +.ole-image-toggle input { cursor: pointer; - font-size: 0.75rem; - padding: 3px 7px; - line-height: 1; - opacity: 0.7; - transition: opacity 0.15s; -} -.ole-column button.ole-spotlight-btn:hover:not(:disabled) { - opacity: 1; -} -.ole-column button.ole-spotlight-btn:disabled { - opacity: 0.2; - cursor: default; -} -.ole-column .ole-spotlight-remove { - color: #e55; + margin: 0 !important; + flex-shrink: 0; + position: relative; + top: 1px; } -.ole-column .ole-spotlight-add { +.ole-image-toggle span { position: relative; - padding: 0 10px 10px; - max-width: none; + top: -1px; } -.ole-column input.ole-spotlight-search { - display: block; - width: 100%; + +/* ---- Add slot button ---- */ +.ole-add-slot-btn { background: var(--theme-elevation-50, #111); - border: 1px solid var(--theme-elevation-200, #333); - border-radius: 4px; - padding: 7px 10px; - font-size: 0.75rem; - color: var(--theme-text, #fff); - outline: none; - box-sizing: border-box; -} -.ole-column input.ole-spotlight-search:focus { - border-color: var(--theme-elevation-400, #555); -} -.ole-column input.ole-spotlight-search::placeholder { - opacity: 0.35; -} -.ole-column .ole-spotlight-dropdown { - position: absolute; - top: calc(100% + 4px); - left: 0; - right: 0; - background: var(--theme-elevation-100, #1a1a1a); - border: 1px solid var(--theme-elevation-200, #333); - border-radius: 4px; - z-index: 100; - overflow: hidden; -} -.ole-column button.ole-spotlight-user-option { - display: block; - width: 100%; - text-align: left; - padding: 8px 12px; - font-size: 0.75rem; + border: 1px dashed var(--theme-elevation-300, #444); + border-radius: 6px; color: var(--theme-text, #fff); - background: transparent; - border: none; cursor: pointer; - transition: background 0.1s; + font-size: 0.72rem; + padding: 10px; + opacity: 0.4; + transition: opacity 0.15s; + text-align: center; } -.ole-column button.ole-spotlight-user-option:hover { - background: var(--theme-elevation-200, #333); +.ole-add-slot-btn:hover { + opacity: 0.7; }