Files
Aislo/A00_Common/spreadsheet/spreadsheet_grid.css
T
eomsangdonandClaude Sonnet 5 4f7470bbbd feat(spreadsheet): C 격자 — 앱 밝은 · 어두운 테마 따라가게
.aislo-grid 안 색 변수(--aislo-grid-bg · -fg · -line · -head-bg · -head-fg ·
-head-border · -selected) 를 전부 앱 전역 토큰(ui_template_theme.css 의
--color-surface-raised · -text-body · -border · -surface · -text-secondary ·
-accent)에 연결 — 새 값 안 적음, 앱이 data-theme 를 바꾸면 그대로 따라감(다른
스프레드시트 파일(spreadsheet_toolbar.css)과 같은 방식). 칸 · 머리 배경 · 눈금선 ·
선택 테두리 · 채우기 손잡이 테두리의 하드코딩 흰색 · 회색 · 파랑을 이 변수로 바꿈.
테두리 기본 색(사용자가 색 안 지정)은 #000000 대신 currentColor 로 — 칸 글자색과
같이 테마를 따라감. 사용자가 지정한 채움색 · 글자색(조건부 서식 포함)은 그대로 둠
(엑셀과 같음 — 이미 빈 문자열 인라인 스타일로 CSS 기본값에 떨어지는 구조라 따로 안 고침).
시험 틀(html)에 ui_template_theme.css 를 넣어 data-theme 전환을 실제로 시험.

ORCA 수치(시험 틀 · data-theme 전환) — 밝은: 격자 배경 rgb(255,255,255) · 글자
rgb(51,51,51) · 선택 #3e0079 · 눈금선 #e6e2e3. 어두운: 격자 배경 rgb(37,31,56) ·
글자 rgb(228,224,240) · 선택 #b99aff · 눈금선 #322a45 — 모두 전환됨. 사용자 지정
채움(A3 #F2F2F2)·조건부 서식 글자색(H4 #c00000)은 두 테마에서 값 그대로(안 바뀜)
확인. A3 무색 테두리는 currentColor 로 밝은 rgb(51,51,51)/어두운 rgb(228,224,240)
로 글자색과 같이 바뀜 확인.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VVM3xZ1aUPcUTuW2WZSnwg
2026-09-28 09:48:20 +09:00

251 lines
5.4 KiB
CSS

/* =============================================================================
* spreadsheet_grid.css (주인 C)
* 격자 4 판 · 머리 · 칸 기본 모양. 색 · 간격은 여기 변수만(다른 파일은 이 클래스만 씀).
* ========================================================================== */
.aislo-grid {
/* 앱 전역 테마 토큰(ui_template_theme.css · :root[data-theme])을 그대로 물려받음 —
* 여기서 값을 다시 안 적음(다크 전환 시 앱 토큰이 바뀌면 같이 바뀜). */
--aislo-grid-bg: var(--color-surface-raised);
--aislo-grid-fg: var(--color-text-body);
--aislo-grid-line: var(--color-border);
--aislo-grid-head-bg: var(--color-surface);
--aislo-grid-head-fg: var(--color-text-secondary);
--aislo-grid-head-border: var(--color-border);
--aislo-grid-freeze-shadow: rgba(0, 0, 0, 0.12);
--aislo-grid-selected: var(--color-accent);
position: relative;
overflow: hidden;
width: 100%;
height: 100%;
font:
10pt "굴림",
sans-serif;
background: var(--aislo-grid-bg);
color: var(--aislo-grid-fg);
user-select: none;
-webkit-user-select: none;
}
.aislo-grid__corner,
.aislo-grid__colhead-frozen,
.aislo-grid__colhead-scroll,
.aislo-grid__rowhead-frozen,
.aislo-grid__rowhead-scroll,
.aislo-grid__pane {
position: absolute;
overflow: hidden;
}
.aislo-grid__pane--br {
overflow: auto;
}
.aislo-grid__corner {
z-index: 5;
background: var(--aislo-grid-head-bg);
border-right: 1px solid var(--aislo-grid-head-border);
border-bottom: 1px solid var(--aislo-grid-head-border);
}
.aislo-grid__colhead-frozen,
.aislo-grid__colhead-scroll {
z-index: 4;
background: var(--aislo-grid-head-bg);
border-bottom: 1px solid var(--aislo-grid-head-border);
}
.aislo-grid__rowhead-frozen,
.aislo-grid__rowhead-scroll {
z-index: 4;
background: var(--aislo-grid-head-bg);
border-right: 1px solid var(--aislo-grid-head-border);
}
.aislo-grid__colhead-frozen,
.aislo-grid__rowhead-frozen {
z-index: 6;
box-shadow: 2px 2px 4px var(--aislo-grid-freeze-shadow);
}
.aislo-grid__colhead-inner,
.aislo-grid__rowhead-inner {
position: absolute;
top: 0;
left: 0;
will-change: transform;
}
.aislo-grid__colhead,
.aislo-grid__rowhead {
position: absolute;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.82em;
font-weight: 600;
color: var(--aislo-grid-head-fg);
border-right: 1px solid var(--aislo-grid-head-border);
border-bottom: 1px solid var(--aislo-grid-head-border);
top: 0;
}
.aislo-grid__rowhead {
left: 0;
top: auto;
}
.aislo-grid__colhead--hidden-before,
.aislo-grid__rowhead--hidden-before {
border-left: 3px double var(--aislo-grid-head-fg);
}
.aislo-grid__head-label {
pointer-events: none;
overflow: hidden;
text-overflow: ellipsis;
}
.aislo-grid__resize {
position: absolute;
z-index: 2;
}
.aislo-grid__resize--col {
top: 0;
right: -3px;
width: 6px;
height: 100%;
cursor: col-resize;
}
.aislo-grid__outline-btn {
position: absolute;
z-index: 2;
box-sizing: border-box;
padding: 0;
border: 1px solid var(--aislo-grid-head-border);
background: var(--aislo-grid-head-bg);
color: var(--aislo-grid-head-fg);
font-size: 0.7em;
line-height: 1;
cursor: pointer;
}
.aislo-grid__resize--row {
left: 0;
bottom: -3px;
width: 100%;
height: 6px;
cursor: row-resize;
}
.aislo-grid__pane-inner {
position: absolute;
top: 0;
left: 0;
will-change: transform;
}
.aislo-grid__pane--br .aislo-grid__spacer {
position: absolute;
top: 0;
left: 0;
width: 1px;
height: 1px;
pointer-events: none;
}
.aislo-cell {
position: absolute;
box-sizing: border-box;
display: flex;
flex-direction: column;
overflow: hidden;
padding: 0 2px;
background: var(--aislo-grid-bg);
cursor: cell;
}
.aislo-grid--gridlines .aislo-cell {
border-right-style: solid;
border-bottom-style: solid;
border-right-width: var(--aislo-grid-gridline-w, 1px);
border-bottom-width: var(--aislo-grid-gridline-w, 1px);
border-right-color: var(--aislo-grid-line);
border-bottom-color: var(--aislo-grid-line);
}
.aislo-cell__text {
overflow: hidden;
text-overflow: ellipsis;
white-space: inherit;
}
.aislo-cell.is-error {
color: #c00;
}
/* 오류 칸 — 엑셀 오류 검사 초록 세모(왼 위 · sub3 오류 까닭은 title 풍선). */
.aislo-cell.is-error::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 0;
height: 0;
border-style: solid;
border-width: 6px 6px 0 0;
border-color: #2e7d32 transparent transparent transparent;
}
.aislo-cell.is-selected {
outline: 2px solid var(--aislo-grid-selected);
outline-offset: -1px;
z-index: 1;
}
/* 메모 칸 — 엑셀처럼 오른 위 모서리 빨간 세모. */
.aislo-cell.has-comment::after {
content: "";
position: absolute;
top: 0;
right: 0;
width: 0;
height: 0;
border-style: solid;
border-width: 0 6px 6px 0;
border-color: transparent #c00 transparent transparent;
}
.aislo-grid__ref-highlight {
position: absolute;
box-sizing: border-box;
pointer-events: none;
border: 1.5px solid;
z-index: 3;
}
.aislo-grid__fill-handle {
position: absolute;
width: 6px;
height: 6px;
background: var(--aislo-grid-selected);
border: 1px solid var(--aislo-grid-bg);
cursor: crosshair;
z-index: 3;
}
.aislo-grid__overlay {
position: absolute;
inset: 0;
pointer-events: none;
z-index: 7;
}
.aislo-grid__overlay > * {
pointer-events: auto;
}