Files
HMDesign/packages/sw/src/theme/sw-home-menu.css
T
shkim4 2fc1b3e108 fix(sw): 2026-10-21 SW design review and responsive header without More from 760px
User-approved design review (2026-10-21):
- SW Header: from 760px up nothing moves into More; the five menus stay with their
  titles (titles and values ellipsize), file name shrinks to 96px. Open next to the
  logo no longer blocks field shrinking above 760px (760/768 overflow fixed, also for
  configured `controls` headers). Dropdown yellow ring inside the button, black seam.
- Property Bar values as read-only red text; property popup "=" labels, read-only
  black values, per-entry hover with pointer.
- Home Menu recent files (3 rows, path + name caption, empty preview), Footer + slot
  guide off by default, Viewer file list without icons, Storybook widths 1920-760.
- Tests: old More expectations (integrated-improvement, keyboard-dismiss,
  footer-popup-viewer-refinement, storybook-cleanup-stage1) moved to the new rule;
  functional checks kept.
2026-10-21 17:29:25 +09:00

491 lines
23 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.
/* @hm-design/sw — Home menu (Figma rj6wpsfk24lOWvWiVRAANP 26:10591 "헤더/꾸러미 ver2/home on", tiles 26:11355 …).
Scoped to .hm-sw-home-menu; reads the shared SW tokens of .hm-sw-header / .hm-sw-theme (font, text outline,
focus). New values are Figma values (Plugin API, 2026-10-19), never global selectors. */
.hm-sw-home-menu {
/* Section surface (Frame 2409–2412; Frame 2408 has slightly different stops): bottom → top + edge shade. */
--hm-sw-home-menu-section-background:
linear-gradient(0deg, #16120a 0%, rgba(22, 18, 10, 0) 54.458%, #16120a 100%),
linear-gradient(0deg, #18150e 28.102%, #262015 41.084%, #332b1c 58.06%, #38301f 81.027%, #18150e 100%);
--hm-sw-home-menu-section-border-color: #081813;
--hm-sw-home-menu-section-inner-border-color: #20190e;
/* Tile group g_* : fill bottom → top, 1px stroke top → bottom, drop shadow 0 2 r4 60%. */
--hm-sw-home-menu-group-background: linear-gradient(0deg, #19160e 2%, #38301f 43.678%, #463c29 67.668%, #2f281a 100%);
--hm-sw-home-menu-group-border: linear-gradient(180deg, #886d35 0%, #423625 8.846%, #f3dba8 26.169%, #0e0b06 83.792%, #574b30 100%);
--hm-sw-home-menu-group-shadow: 0 2px 4px rgba(0, 0, 0, 0.6);
/* Tile divider 1 x 44 (same gradient as the group stroke) with -1 0 r2 black shadow. */
--hm-sw-home-menu-divider: var(--hm-sw-home-menu-group-border);
--hm-sw-home-menu-divider-shadow: -1px 0 2px #000;
/* Tile states: Variant2 / Variant3 stroke (INSIDE 1px, top → bottom), icon and label color. */
--hm-sw-home-menu-item-hover-border: linear-gradient(180deg, #da6813 8.5%, #ffbb89 37.9%, #e5690d 71.9%, #ae3607 92.8%);
--hm-sw-home-menu-item-color: var(--hm-sw-header-text-color);
--hm-sw-home-menu-item-accent-color: #ff5c00;
--hm-sw-home-menu-icon-color: #b6b4af;
/* Title badge (tit_* Union, 9-slice of the Figma SVG) */
--hm-sw-home-menu-title-color: #000;
/* Bottom accent: 26:10591 per-section strip (top → bottom) / 662:67267 2px outline (bottom → top). */
--hm-sw-home-menu-accent-strip: linear-gradient(180deg, #5f4b0f -6.4%, #ff5100 96.8%);
--hm-sw-home-menu-accent-outline: linear-gradient(0deg, #ff5100 0%, #5f4b0f 76.7%);
--hm-sw-home-menu-accent-outline-width: 2px;
--hm-sw-home-menu-accent-outline-height: 30px;
/* More dropdown (not in Figma): a text menu in the SW brown dropdown family (header/menu/레이어 26:10940, rows
header/dropdown/brown/row 26:10687): surface, border, radius, shadow, 30px rows, row hover; group title in the
최근파일 path color, groups split by the layer footer divider. */
--hm-sw-home-menu-more-background: var(--hm-sw-header-layer-menu-background);
--hm-sw-home-menu-more-border-color: var(--hm-sw-header-layer-menu-border-color);
--hm-sw-home-menu-more-radius: var(--hm-sw-header-layer-menu-radius);
--hm-sw-home-menu-more-shadow: var(--hm-sw-header-layer-menu-shadow);
--hm-sw-home-menu-more-offset: 2px;
--hm-sw-home-menu-more-min-width: 180px;
--hm-sw-home-menu-more-divider-color: var(--hm-sw-header-layer-footer-border-color);
--hm-sw-home-menu-more-title-color: var(--hm-sw-recent-files-path-color);
--hm-sw-home-menu-more-row-height: 30px;
--hm-sw-home-menu-more-row-hover-background: var(--hm-sw-header-layer-row-hover-background);
--hm-sw-home-menu-more-row-hover-color: var(--hm-sw-header-layer-row-hover-color);
/* Optional sub panel (Figma 최근파일 662:67331 / 파일출력 2뎁스 662:67471). */
--hm-sw-recent-files-width: 354px;
--hm-sw-recent-files-max-height: 750px;
--hm-sw-recent-files-background: #27241d;
--hm-sw-recent-files-border-color: #da6813;
--hm-sw-recent-files-path-color: #d4cbbd;
--hm-sw-recent-files-row-hover-background: var(--hm-sw-header-layer-row-hover-background);
--hm-sw-recent-files-row-hover-color: var(--hm-sw-header-layer-row-hover-color);
--hm-sw-recent-files-preview-width: 310px;
--hm-sw-recent-files-preview-background: #62533d;
/* No preview (2026-10-21 design): the panel brown behind a red prohibition sign. */
--hm-sw-recent-files-preview-body-background: var(--hm-sw-recent-files-preview-background);
--hm-sw-recent-files-preview-none-color: #ff0000;
position: relative;
isolation: isolate;
width: max-content;
max-width: 100%;
}
.hm-sw-home-menu__sections {
display: flex;
align-items: flex-start;
max-width: 100%;
/* 2px of the accent strip shows left, right and under the sections (menu 1305 x 77 in Figma). */
padding: 0 2px 2px;
/* Not in Figma (1920px only): narrower hosts get the measured More section instead of a scroller (SWHomeMenu).
The clip only keeps the badge shadow and the strip inside the menu, as before; nothing is cut off. */
overflow: hidden;
}
/* Measurement pass (one synchronous read, removed before paint) and overflow: the menu takes all the room of its host
(clamped by max-width), so with More it still covers the whole area SWHeader gives it, as the full menu does. */
.hm-sw-home-menu:is([data-measuring], [data-overflow]) { width: 100000px; }
/* More fills the rest of the row with the section surface (the menu background stays as it is); only its badge and
⋯ tile sit right after the last shown section (2026-10-19 user correction: start, not end). */
.hm-sw-home-menu__section.hm-sw-home-menu__more { flex: 1 0 auto; align-items: flex-start; }
/* Natural tile widths (SWHomeMenu measure copy): laid out, invisible, zero-size clip (no scroll area, no hit area). */
.hm-sw-home-menu__measure {
position: absolute;
top: 0;
left: 0;
width: 0;
height: 0;
overflow: hidden;
visibility: hidden;
pointer-events: none;
}
.hm-sw-home-menu__measure-row { display: flex; align-items: flex-start; width: max-content; }
/* More (not in Figma): the section + tile parts above with a ⋯ icon. Its dropdown sits under the ⋯ tile, left edges aligned
(left set from the DOM): a text menu of the moved sections (title + rows). Above the sub panel; laid out while
closed so it is positioned before it shows. */
.hm-sw-home-menu__more-panel {
position: absolute;
z-index: 2;
top: calc(100% + var(--hm-sw-home-menu-more-offset));
display: flex;
flex-direction: column;
min-width: var(--hm-sw-home-menu-more-min-width);
max-width: calc(100vw - 16px);
padding: 4px 0;
border: 1px solid var(--hm-sw-home-menu-more-border-color);
border-radius: var(--hm-sw-home-menu-more-radius);
background: var(--hm-sw-home-menu-more-background);
box-shadow: var(--hm-sw-home-menu-more-shadow);
color: var(--hm-sw-home-menu-item-color);
}
.hm-sw-home-menu__more-panel:not([data-open]) { visibility: hidden; pointer-events: none; }
.hm-sw-home-menu__text-group { display: flex; flex-direction: column; padding: 4px 0; }
.hm-sw-home-menu__text-group + .hm-sw-home-menu__text-group { border-top: 1px solid var(--hm-sw-home-menu-more-divider-color); }
.hm-sw-home-menu__text-title {
padding: 4px 12px;
overflow: clip;
overflow-clip-margin: var(--hm-sw-header-text-outline-room);
color: var(--hm-sw-home-menu-more-title-color);
font-size: var(--hm-sw-header-label-size);
font-weight: 700;
line-height: 16px;
letter-spacing: 0.04em;
white-space: nowrap;
text-overflow: ellipsis;
text-shadow: var(--hm-sw-header-label-outline);
}
.hm-sw-home-menu__text-list { display: flex; flex-direction: column; }
/* Row = header/dropdown/brown/row: 30px, 12px in, 14px 700 with the menu text outline. */
.hm-sw-home-menu__text-item {
display: flex;
align-items: center;
gap: 12px;
height: var(--hm-sw-home-menu-more-row-height);
padding: 0 12px;
color: var(--hm-sw-home-menu-item-color);
font-size: var(--hm-sw-header-font-size);
font-weight: 700;
line-height: 16px;
letter-spacing: 0.04em;
white-space: nowrap;
text-align: left;
}
.hm-sw-home-menu__text-label {
flex: 1 1 auto;
min-width: 0;
overflow: clip;
overflow-clip-margin: var(--hm-sw-header-text-outline-room);
text-overflow: ellipsis;
text-shadow: var(--hm-sw-header-text-outline);
}
/* Indicator column: › for a row that opens a sub panel (최근파일); ✓ only for an opt-in toggle row (toggle: true). */
.hm-sw-home-menu__text-item::after { content: ""; flex: 0 0 14px; width: 14px; text-align: center; }
.hm-sw-home-menu__text-item[aria-pressed="true"]::after { content: "✓"; }
.hm-sw-home-menu__text-item[aria-expanded]::after { content: "›"; }
/* Hover = pressed = Active (the tiles' Variant2 = Variant3, the brown rows' hover = selected): brown row, orange
text. Action rows keep nothing after the click; only the 최근파일 row stays Active while its list is open. */
.hm-sw-home-menu__text-item:is(:hover, :active, [data-active="true"]):not(:disabled) {
background: var(--hm-sw-home-menu-more-row-hover-background);
color: var(--hm-sw-home-menu-more-row-hover-color);
}
/* Accent joint (narrow widths, 2026-10-19): where the sub panel reaches past the menu, the outline's bottom band runs
on over the panel's top edge — same 2px, same gradient slice (the outline gradient sized to its box, bottom), so
the menu's bottom line and the list's side borders meet without a gap. Left / width from the measured positions. */
.hm-sw-home-menu__joint {
position: absolute;
z-index: 1;
top: calc(100% - var(--hm-sw-home-menu-accent-outline-width));
height: var(--hm-sw-home-menu-accent-outline-width);
background: var(--hm-sw-home-menu-accent-outline) left bottom / 100% var(--hm-sw-home-menu-accent-outline-height) no-repeat;
pointer-events: none;
}
/* Sub panel under the menu, at its tile (position set from the DOM). */
.hm-sw-home-menu__panel { position: absolute; z-index: 1; top: 100%; }
.hm-sw-home-menu__section {
position: relative;
display: flex;
flex: 0 0 auto;
flex-direction: column;
align-items: center;
height: 75px;
/* Figma: content 5px from the top and 10px from the sides, the 1px stroke included. */
padding: 4px 9px 0;
border: 1px solid var(--hm-sw-home-menu-section-border-color);
border-radius: 0 0 3px 3px;
background: var(--hm-sw-home-menu-section-background);
}
/* Frame 2412 (last): 261px, 11px left. Frame 2408 keeps 340px with its group centered. */
.hm-sw-home-menu__section:last-child { padding-left: 10px; }
/* Inner 1px #20190E (Rectangle 6977 / border, inset 1px). */
.hm-sw-home-menu__section::before {
content: "";
position: absolute;
inset: 0;
border: 1px solid var(--hm-sw-home-menu-section-inner-border-color);
border-radius: 0 0 2px 2px;
pointer-events: none;
}
/* 26:10591 Rectangle 6991–6995: 30px strip from y 47 behind the section, 2px visible under it. */
.hm-sw-home-menu[data-accent="sections"] .hm-sw-home-menu__section::after {
content: "";
position: absolute;
z-index: -1;
top: 46px;
right: -2px;
bottom: -3px;
left: -2px;
border-radius: 0 0 3px 3px;
background: var(--hm-sw-home-menu-accent-strip);
pointer-events: none;
}
.hm-sw-home-menu[data-accent="sections"] .hm-sw-home-menu__section:first-child::after { left: -3px; }
.hm-sw-home-menu[data-accent="sections"] .hm-sw-home-menu__section:last-child::after { right: -3px; }
/* 662:67267 Rectangle 6991: 1305 x 30 from y 47, 2px INSIDE gradient stroke. */
.hm-sw-home-menu[data-accent="outline"]::after {
content: "";
position: absolute;
z-index: -1;
top: 47px;
right: 0;
left: 0;
height: var(--hm-sw-home-menu-accent-outline-height);
padding: var(--hm-sw-home-menu-accent-outline-width);
border-radius: 0 0 3px 3px;
background: var(--hm-sw-home-menu-accent-outline);
-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
-webkit-mask-composite: xor;
mask: linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0);
pointer-events: none;
}
/* tit_* : text + 23px each side; the Figma Union SVG (132 x 27 incl. its -2 r4 shadow) is 9-sliced. */
.hm-sw-home-menu__title {
position: relative;
z-index: 1;
display: flex;
flex: 0 0 auto;
align-items: center;
justify-content: center;
height: 19px;
margin-bottom: -1px;
padding: 1px 23px 0;
color: var(--hm-sw-home-menu-title-color);
font-size: var(--hm-sw-header-label-size);
font-weight: 700; /* 2026-10-21 user request: group title Bold (was Figma 400). */
line-height: 14px;
letter-spacing: 0.02em;
white-space: nowrap;
}
.hm-sw-home-menu__title::before {
content: "";
position: absolute;
z-index: -1;
inset: -6px -4px -2px;
border-style: solid;
border-width: 0 30px;
border-image: var(--hm-sw-home-menu-title-art) 0 30 fill / 0 30px / 0 stretch;
pointer-events: none;
}
.hm-sw-home-menu__group {
position: relative;
display: flex;
flex: 0 0 auto;
height: 46px;
border-radius: 3px;
background: var(--hm-sw-home-menu-group-background);
box-shadow: var(--hm-sw-home-menu-group-shadow);
}
/* INSIDE stroke drawn over the edge: tiles keep their full 80 x 46 like Figma. */
.hm-sw-home-menu__group::before {
content: "";
position: absolute;
inset: 0;
padding: 1px;
border-radius: inherit;
background: var(--hm-sw-home-menu-group-border);
-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
-webkit-mask-composite: xor;
mask: linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0);
pointer-events: none;
}
.hm-sw-home-menu__item {
position: relative;
flex: 0 0 80px;
width: 80px;
height: 46px;
color: var(--hm-sw-home-menu-item-color);
}
.hm-sw-home-menu__item:first-child { border-radius: 3px 0 0 3px; }
.hm-sw-home-menu__item:last-child { border-radius: 0 3px 3px 0; }
.hm-sw-home-menu__item:only-child { border-radius: 3px; }
/* Divider at the right edge of every tile but the last. */
.hm-sw-home-menu__item:not(:last-child)::before {
content: "";
position: absolute;
z-index: 2;
top: 1px;
right: -1px;
width: 1px;
height: 44px;
background: var(--hm-sw-home-menu-divider);
box-shadow: var(--hm-sw-home-menu-divider-shadow);
pointer-events: none;
}
/* Variant2 / Variant3 stroke. */
.hm-sw-home-menu__item::after {
content: "";
position: absolute;
z-index: 3;
inset: 0;
padding: 1px;
border-radius: inherit;
background: var(--hm-sw-home-menu-item-hover-border);
-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
-webkit-mask-composite: xor;
mask: linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0);
opacity: 0;
pointer-events: none;
}
/* 18 x 18 icon slot at (31, 4); larger art is centered on it and may overflow (Figma assets carry shadows).
2026-10-21 user decision: top 4px (was Figma 6px) so the icon no longer touches the bold label below it. */
.hm-sw-home-menu__icon {
position: absolute;
top: 4px;
left: 31px;
display: grid;
place-items: center;
width: 18px;
height: 18px;
color: var(--hm-sw-home-menu-icon-color);
}
.hm-sw-home-menu__icon > * { flex: none; max-width: none; }
.hm-sw-home-menu__icon > :is(svg, img) { display: block; }
.hm-sw-home-menu__icon--hover { visibility: hidden; }
.hm-sw-home-menu__label {
position: absolute;
top: 25px;
left: 50%;
max-width: 76px;
height: 16px;
padding: 0 var(--hm-sw-header-text-outline-room);
overflow: hidden;
transform: translateX(-50%);
font-size: var(--hm-sw-header-font-size);
font-weight: 700;
line-height: 16px;
letter-spacing: 0.04em;
white-space: nowrap;
text-overflow: ellipsis;
text-shadow: var(--hm-sw-header-text-outline);
}
/* Variant2 (hover) = Variant3 (pressed while held; stays only as Active of a panel tile / More): orange stroke,
#FF5C00 icon and label. Action tiles keep nothing after the click (2026-10-19). Only color, hover art and the ring
change: icon and label keep their Default place (2026-10-20 user decision, replaces the Figma 1px up-left art
offset that made every tile's icon and label jump on hover). Hover art has the Default art's frame and shapes. */
.hm-sw-home-menu__item:is(:hover:not(:disabled), :active:not(:disabled), [data-active="true"])::after { opacity: 1; }
.hm-sw-home-menu__item:is(:hover:not(:disabled), :active:not(:disabled), [data-active="true"]) {
--hm-sw-home-menu-icon-color: var(--hm-sw-home-menu-item-accent-color);
color: var(--hm-sw-home-menu-item-accent-color);
}
.hm-sw-home-menu__item[data-has-hover-icon]:is(:hover:not(:disabled), :active:not(:disabled), [data-active="true"]) .hm-sw-home-menu__icon:not(.hm-sw-home-menu__icon--hover) { visibility: hidden; }
.hm-sw-home-menu__item[data-has-hover-icon]:is(:hover:not(:disabled), :active:not(:disabled), [data-active="true"]) .hm-sw-home-menu__icon--hover { visibility: visible; }
/* SWRecentFiles — Figma 최근파일 662:67331 (354 x 750: rows 50px) + 2-depth preview 662:67471 (310 x 270). */
.hm-sw-recent-files { position: relative; width: var(--hm-sw-recent-files-width); }
/* Frame stroke: 1px #DA6813 left / right / bottom over the list edge (joins the menu's outline accent). */
.hm-sw-recent-files::after {
content: "";
position: absolute;
z-index: 2;
inset: 0;
border: 1px solid var(--hm-sw-recent-files-border-color);
border-top: 0;
border-radius: 0 0 3px 3px;
pointer-events: none;
}
.hm-sw-recent-files__list {
box-sizing: content-box; /* max-height = rows (15 x 50 = Figma 750) */
max-height: var(--hm-sw-recent-files-max-height);
overflow-x: hidden;
overflow-y: auto;
overscroll-behavior: contain;
scrollbar-width: thin;
border: 1px solid var(--hm-sw-recent-files-background);
border-radius: 0 0 4px 4px;
background: var(--hm-sw-recent-files-background);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25), inset 0 4px 8px rgba(0, 0, 0, 0.4);
}
.hm-sw-recent-files__row {
display: flex;
align-items: center;
gap: 8px;
width: 100%;
height: 50px;
padding: 1px 8px;
text-align: left;
}
/* Rows without a badge keep the text column at 45px (Figma px 45). */
.hm-sw-recent-files__row:not(:has(> .hm-sw-recent-files__badge)) { padding-left: 45px; }
.hm-sw-recent-files__badge { display: grid; flex: 0 0 29px; place-items: center; width: 29px; height: 28px; }
.hm-sw-recent-files__badge > :is(svg, img) { display: block; max-width: none; }
.hm-sw-recent-files__text { display: flex; flex-direction: column; gap: 2px; min-width: 0; max-width: 301px; }
.hm-sw-recent-files__name,
.hm-sw-recent-files__path {
display: block;
/* clip (not hidden): overflow-clip-margin only applies to clip, so the outline of the first glyph is not cut at the
left edge (2026-10-21 hover clipping report); the ellipsis and the text box are unchanged. */
overflow: clip;
overflow-clip-margin: var(--hm-sw-header-text-outline-room);
white-space: nowrap;
text-overflow: ellipsis;
letter-spacing: 0.04em;
}
.hm-sw-recent-files__name { color: var(--hm-sw-header-text-color); font-size: var(--hm-sw-header-font-size); font-weight: 700; line-height: 20px; text-shadow: var(--hm-sw-header-text-outline); }
/* Path Bold with its 12px black outline (2026-10-20 user request), like the file name above (700 + 14px outline). */
.hm-sw-recent-files__path { color: var(--hm-sw-recent-files-path-color); font-size: var(--hm-sw-header-label-size); font-weight: 700; line-height: 16px; opacity: 0.6; text-shadow: var(--hm-sw-header-label-outline); }
.hm-sw-recent-files__row:is(:hover, [data-hovered="true"]):not(:disabled) { background: var(--hm-sw-recent-files-row-hover-background); }
.hm-sw-recent-files__row:is(:hover, [data-hovered="true"]):not(:disabled) .hm-sw-recent-files__name { color: var(--hm-sw-recent-files-row-hover-color); }
.hm-sw-recent-files__empty { padding: 16px 45px; color: var(--hm-sw-recent-files-path-color); font-size: var(--hm-sw-header-label-size); opacity: 0.6; }
/* 2-depth preview beside the row (1px gap), top aligned 1px under the row top. */
.hm-sw-recent-files__preview {
position: absolute;
z-index: 3;
left: calc(100% + 1px);
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
width: var(--hm-sw-recent-files-preview-width);
padding: 3px 0 0; /* + 1px border = Figma py 4; 270px total with the 243px body */
border: 1px solid var(--hm-sw-recent-files-preview-background);
border-left: 0;
border-radius: 0 3px 4px 0;
background: var(--hm-sw-recent-files-preview-background);
box-shadow: inset 2px 0 2.5px rgba(0, 0, 0, 0.5);
filter: drop-shadow(0 2px 1px rgba(0, 0, 0, 0.5));
pointer-events: none;
}
/* No room on the right (narrow widths): the same preview mirrored on the left of the list. */
.hm-sw-recent-files__preview[data-side="left"] {
right: calc(100% + 1px);
left: auto;
border-right: 0;
border-left: 1px solid var(--hm-sw-recent-files-preview-background);
border-radius: 3px 0 0 4px;
box-shadow: inset -2px 0 2.5px rgba(0, 0, 0, 0.5);
}
.hm-sw-recent-files__preview[data-side="left"] .hm-sw-recent-files__preview-body { border-radius: 0 0 0 4px; }
/* No room on either side (e.g. 390px): the same preview over the list, right under the row (above it when the
viewport has no room below). Not in Figma (2026-10-19 사용자 확정). */
.hm-sw-recent-files__preview:is([data-side="below"], [data-side="above"]) {
left: 1px;
border-left: 1px solid var(--hm-sw-recent-files-preview-background);
border-radius: 4px;
box-shadow: none;
}
.hm-sw-recent-files__preview[data-side="above"] { transform: translateY(-100%); }
.hm-sw-recent-files__preview:is([data-side="below"], [data-side="above"]) .hm-sw-recent-files__preview-body { border-radius: 0 0 4px 4px; }
/* Preview file name: Bold with the 14px black text outline of the list (2026-10-20 user request). Clip (not hidden)
lets the outline paint past the ellipsis box like the list rows; width, position and ellipsis are unchanged. */
.hm-sw-recent-files__preview-title {
width: 294px;
overflow: clip;
overflow-clip-margin: var(--hm-sw-header-text-outline-room);
font-weight: 700;
text-shadow: var(--hm-sw-header-text-outline);
white-space: nowrap;
text-overflow: ellipsis;
color: var(--hm-sw-recent-files-row-hover-color);
font-size: var(--hm-sw-header-font-size);
line-height: 18px;
letter-spacing: 0.02em;
/* 2026-10-21: path + file name on one line; a long path is cut at its start (…) so the file name stays visible.
Right-to-left only for the ellipsis side; the text is an isolated left-to-right span (dir="ltr"), centered. */
direction: rtl;
text-align: center;
}
.hm-sw-recent-files__preview-body { position: relative; width: 100%; height: 243px; overflow: hidden; border-radius: 0 0 4px 0; background: var(--hm-sw-recent-files-preview-body-background); }
/* 2026-10-21 design: no image in the preview; the body shows the "no preview" prohibition sign, centered and sized to
the 243px body (no image file: inline SVG drawn with CSS strokes). */
.hm-sw-recent-files__preview-body { display: grid; place-items: center; }
.hm-sw-recent-files__preview-body > .hm-sw-recent-files__preview-none { display: block; width: 200px; height: 200px; fill: none; stroke: var(--hm-sw-recent-files-preview-none-color); stroke-width: 11; }
.hm-sw-recent-files__preview-body > :is(img, svg, canvas) { display: block; width: 100%; height: 100%; object-fit: cover; }