Files
HMDesign/.storybook/manager.css
T

322 lines
12 KiB
CSS

/* Initial Storybook manager mapping from ui_viz. Manager-only; not runtime theme tokens. */
:root {
--font-family-base: 'Noto Sans KR', 'Malgun Gothic', sans-serif;
--hm-green-default: #123328;
--hm-green-light-1: #205241;
--hm-green-light-2: #266651;
--hm-green-light-3: #249473;
--hm-fg-on-green-secondary: #BDDFD4;
--color-fg-on-green-primary: #FFFFFF;
--color-action-primary: #123328;
--color-action-accent-on-green: #FFC600;
--color-bg-content: #F5F0E5;
--color-bg-surface: #FFFFFF;
--effect-text-border-color: rgba(0, 0, 0, .3);
--overlay-black-20: rgba(0, 0, 0, .2);
--overlay-black-30: rgba(0, 0, 0, .3);
}
/* Storybook 10.6 manager only. Source: docs/patterns/dashboard-composition.md §6.
The 18px join / inset geometry follows the current LNB specimen, not a new token. */
@font-face {
font-family: 'Hanmac Manager Noto Sans KR';
src: url('/fonts/NotoSansKR-variable.ttf') format('truetype');
font-weight: 100 900;
font-display: swap;
}
/* Manager-only alias of the bundled Noto Sans KR asset, followed by the
Foundation fallback chain (typography.css) instead of a bare sans-serif. */
:root {
--hm-manager-font: 'Hanmac Manager Noto Sans KR', var(--font-family-base);
}
/* The Storybook layout panel, outside the sidebar landmark, has a separate
border. Removing only the landmark's border leaves a one-device-pixel seam. */
#root div:has(> div > #storybook-sidebar-region) {
border-right: 0;
}
#storybook-sidebar-region {
--hm-manager-join: 18px;
color: var(--color-fg-on-green-primary);
background: linear-gradient(90deg,
var(--hm-green-default) 0%, var(--hm-green-light-1) 30%,
var(--hm-green-light-2) 50%, var(--hm-green-light-3) 90%,
var(--hm-green-light-2) 100%);
border-right: 0;
font-family: var(--hm-manager-font);
}
#storybook-sidebar-region [data-radix-scroll-area-content] > div {
padding: 28px 0 28px 20px;
}
/* Keep the native draggable scrollbar in the unused left gutter. The selected
item must reach the content edge without a scroll thumb crossing its curves.
Radix supplies left/right inline, so only those two positions need priority. */
#storybook-sidebar-region > [scrollbarsize] > [data-orientation='vertical'] {
left: 4px !important;
right: auto !important;
width: 6px;
padding: 0;
}
#storybook-sidebar-region > [scrollbarsize] > [data-orientation='vertical'] > div {
background: var(--hm-fg-on-green-secondary);
}
#storybook-sidebar-region .sidebar-header {
margin: 0 20px 24px 0;
padding: 0;
color: var(--color-fg-on-green-primary);
}
#storybook-sidebar-region .sidebar-header > div a {
color: var(--color-fg-on-green-primary);
font: 700 20px/30px var(--hm-manager-font);
white-space: normal;
/* §6 Text Border: brand title keeps the original 1px (no shadow). */
-webkit-text-stroke: 1px var(--effect-text-border-color);
paint-order: stroke fill;
}
#storybook-sidebar-region .sidebar-header button {
color: inherit;
}
#storybook-sidebar-region [role='search'] {
margin-right: 20px;
margin-bottom: 24px;
}
#storybook-sidebar-region .search-field {
min-height: 44px;
border: 1px solid var(--hm-fg-on-green-secondary);
border-radius: 4px;
background: var(--color-bg-surface);
color: var(--color-action-primary);
}
#storybook-explorer-searchfield {
color: var(--color-action-primary);
font-family: inherit;
font-size: 14px;
}
#storybook-sidebar-region [role='search'] > button {
color: var(--color-fg-on-green-primary);
background: transparent;
border-color: var(--hm-fg-on-green-secondary);
min-width: 32px;
height: 44px;
}
#storybook-sidebar-region [role='search'] > button:hover {
background: rgba(0, 0, 0, .10);
}
/* Storybook's named creation action only; search/filter remain available. */
#storybook-sidebar-region button[aria-label='Create a new story'] { display: none; }
#storybook-explorer-tree .sidebar-subheading {
position: relative;
margin: 0;
padding: 0 20px 0 0;
min-height: 56px;
color: var(--hm-fg-on-green-secondary);
}
#storybook-explorer-tree .sidebar-subheading[data-hm-section]:not([data-hm-section='0']) {
margin-top: 40px;
}
#storybook-explorer-tree .sidebar-subheading[data-hm-section]:not([data-hm-section='0'])::before {
content: '';
position: absolute;
top: -20px;
left: 0;
right: 20px;
height: 2px;
background: linear-gradient(var(--overlay-black-30) 0 50%, rgba(255,255,255,.4) 50% 100%);
mask-image: linear-gradient(90deg, transparent, #000 20%, #000 80%, transparent);
}
#storybook-explorer-tree .sidebar-subheading > button {
min-height: 56px;
color: inherit;
font: 700 16px/28px var(--hm-manager-font);
letter-spacing: 0;
text-transform: none;
}
#storybook-explorer-tree .sidebar-item {
position: relative;
margin: 0;
padding: 0;
min-height: 56px;
overflow: visible;
border: 0;
border-radius: 0;
background: transparent;
color: var(--color-fg-on-green-primary);
}
/* Manager-only expanded 2-depth branch face: Black 8%, independent of HM LNB CSS.
The separate Black 20% mapping remains reserved for the selected item's inset depth. */
#storybook-explorer-tree .sidebar-item[data-hm-group='true'] {
background: rgba(0, 0, 0, .08);
box-shadow: inset 1px 0 var(--hm-green-light-2);
}
#storybook-explorer-tree .sidebar-item[data-hm-group-start='true'] {
border-radius: 8px 0 0 0;
box-shadow: inset 1px 1px var(--hm-green-light-2);
}
#storybook-explorer-tree .sidebar-item[data-hm-group-end='true'] {
border-radius: 0 0 0 8px;
padding-bottom: 8px;
box-shadow: inset 1px -1px var(--hm-green-light-2);
}
#storybook-explorer-tree .sidebar-item > :is(a[id], button[id]:not([data-testid])) {
position: relative;
display: flex;
align-items: center;
gap: 12px;
min-height: 56px;
height: auto;
width: 100%;
margin: 0;
padding: 14px 32px 14px 18px;
border: 0;
border-radius: 4px 0 0 4px;
background: transparent;
color: inherit;
font: 700 18px/28px var(--hm-manager-font);
text-align: left;
text-decoration: none;
white-space: normal;
overflow: visible;
text-overflow: clip;
}
#storybook-explorer-tree .sidebar-item[data-hm-depth='2'] > :is(a[id], button[id]:not([data-testid])) {
margin-left: 32px;
width: calc(100% - 32px);
}
#storybook-explorer-tree .sidebar-item[data-hm-depth='3'] > :is(a[id], button[id]:not([data-testid])),
#storybook-explorer-tree .sidebar-item[data-hm-depth='4'] > :is(a[id], button[id]:not([data-testid])) {
margin-left: 44px;
width: calc(100% - 44px);
}
#storybook-explorer-tree .hm-manager-label {
min-width: 0;
white-space: normal;
word-break: keep-all;
overflow-wrap: anywhere;
overflow: visible;
text-overflow: clip;
}
/* D-093 D-014 (§6 Text Border): non-selected labels, including hover and the
yellow current parent, use the specimen's 1.5px border plus lower shadow.
Thickness and offset are REVIEW VALUEs. Selected labels carry no effect. */
#storybook-explorer-tree .sidebar-item[data-selected='false'] .hm-manager-label {
-webkit-text-stroke: 1.5px var(--effect-text-border-color);
paint-order: stroke fill;
text-shadow: 1px 2px 1px var(--effect-text-border-color);
}
/* The group chevron carries the same lower shadow (specimen .ref-sidebar-chevron). */
#storybook-explorer-tree .sidebar-item[data-selected='false'] > button[id]:not([data-testid]) > div:first-child > div > svg {
filter: drop-shadow(1px 2px 1px var(--effect-text-border-color));
}
#storybook-explorer-tree .sidebar-item > :is(a[id], button[id]:not([data-testid])) > div:first-child {
position: static;
flex: 0 0 auto;
margin: 0;
gap: 8px;
}
/* Storybook 10.6.1: the leading wrapper has a direct svg[type] for every
menu type (group/component/story/docs), plus a nested untyped chevron
only on expandable rows. Remove type glyphs at every depth. */
#storybook-explorer-tree .sidebar-item > :is(a[id], button[id]:not([data-testid])) > div:first-child > svg[type] {
display: none;
}
/* Leaves have no chevron. Remove the now-empty wrapper as a flex item so
neither its width nor the row's flex gap reserves an icon slot.
The existing depth margins and row padding still supply hierarchy indent. */
#storybook-explorer-tree .sidebar-item > :is(a[id], button[id]:not([data-testid])) > div:first-child:has(> svg[type]):not(:has(> div > svg)) {
display: none;
}
/* First-depth leaves still sit inside their root label after losing the icon
slot. Deeper rows retain their existing 32px / 44px depth margins. */
#storybook-explorer-tree .sidebar-item[data-hm-depth='1'] > :is(a[id], button[id]:not([data-testid])):has(> div:first-child > svg[type]):not(:has(> div:first-child > div > svg)) {
padding-left: 32px;
}
#storybook-explorer-tree .sidebar-item[data-hm-current-parent='true'],
#storybook-explorer-tree .sidebar-subheading[data-hm-current-parent='true'] {
color: var(--color-action-accent-on-green);
}
#storybook-explorer-tree .sidebar-item[data-selected='false'] > :is(a[id], button[id]:not([data-testid])):hover {
background: rgba(0, 0, 0, .10);
}
#storybook-explorer-tree .sidebar-item[data-selected='true'] > a[id] {
z-index: 1;
background: var(--color-bg-content);
color: var(--color-action-primary);
border-radius: 8px 0 0 8px;
}
/* Keep the keyboard skip link without reserving a 1px flex column.
That column exposed the green branch background at the selected item's end. */
#storybook-explorer-tree .sidebar-item > a[href='#storybook-preview-wrapper'] {
position: absolute;
right: 0;
z-index: 4;
}
#storybook-explorer-tree .sidebar-item[data-selected='true'] > a[id]::before {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
pointer-events: none;
box-shadow: inset 6px 0 8px -5px var(--overlay-black-30),
inset 0 3px 5px -3px var(--overlay-black-20),
inset 0 -2px 4px -3px var(--overlay-black-20);
mask-image: linear-gradient(90deg, #000 75%, transparent 100%);
}
#storybook-explorer-tree .sidebar-item[data-selected='true']::before,
#storybook-explorer-tree .sidebar-item[data-selected='true']::after {
content: '';
position: absolute;
right: 0;
width: var(--hm-manager-join);
height: var(--hm-manager-join);
z-index: 2;
pointer-events: none;
}
#storybook-explorer-tree .sidebar-item[data-selected='true']::before {
bottom: 100%;
background: radial-gradient(circle at top left, transparent calc(var(--hm-manager-join) - .5px), var(--color-bg-content) var(--hm-manager-join));
}
#storybook-explorer-tree .sidebar-item[data-selected='true']::after {
top: 100%;
background: radial-gradient(circle at bottom left, transparent calc(var(--hm-manager-join) - .5px), var(--color-bg-content) var(--hm-manager-join));
}
#storybook-explorer-tree .sidebar-item[data-selected='true'][data-hm-group-end='true']::after {
top: calc(100% - 8px);
}
/* Auxiliary status/create actions are separate from selected row geometry.
Hide only these controls; the Story link and native group toggles stay intact. */
#storybook-explorer-tree .sidebar-item[data-selected='true'] > :is([data-testid='tree-change-status-button'], [data-testid='context-menu']) {
display: none;
}
#storybook-explorer-tree [data-testid='context-menu'] {
color: inherit;
right: 4px;
}
/* Storybook gives utility buttons an opaque background and a 5px halo.
Keep their native behavior, with the same transparent / black-10% LNB states. */
#storybook-explorer-tree :is([data-testid='context-menu'], .sidebar-subheading-action) {
background: transparent;
box-shadow: none;
}
#storybook-explorer-tree :is([data-testid='context-menu'], .sidebar-subheading-action):is(:hover, [aria-expanded='true']) {
background: rgba(0, 0, 0, .10);
box-shadow: none;
}
#storybook-explorer-tree .sidebar-item[data-selected='true'] > [data-testid='context-menu'] {
z-index: 3;
color: var(--color-action-primary);
}
#storybook-explorer-tree .sidebar-item[data-selected='true'] > [data-testid='context-menu'] svg {
color: var(--color-action-primary);
}
/* Keep the manager preview frame flush without consuming iframe width. */
main:has(#storybook-preview-wrapper) {
border-left: 0;
}
@media (prefers-reduced-motion: reduce) {
#storybook-sidebar-region * { scroll-behavior: auto; }
}