@operato/data-grist 10.5.0 → 10.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"data-grid-body.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid-body.ts"],"names":[],"mappings":"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","sourcesContent":["import './data-grid-field.js'\nimport './data-grid-accum-field.js'\n\nimport { css, html, LitElement, nothing, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport debounce from 'lodash-es/debounce.js'\nimport isEmpty from 'lodash-es/isEmpty.js'\n\nimport { sleep, parseToNumberOrNull, closestElement } from '@operato/utils'\n\nimport { ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config.js'\nimport { RecordViewHandler } from '../record-view/record-view-handler.js'\nimport { ColumnConfig, GristConfig, GristData, GristRecord } from '../types.js'\n// import { supportsPassive } from '../utils/index.js'\nimport { dataGridBodyStyle } from './data-grid-body-style.js'\nimport { DataGridField } from './data-grid-field.js'\nimport { dataGridBodyClickHandler } from './event-handlers/data-grid-body-click-handler.js'\nimport { dataGridBodyDblclickHandler } from './event-handlers/data-grid-body-dblclick-handler.js'\nimport { dataGridBodyFocusChangeHandler } from './event-handlers/data-grid-body-focus-change-handler.js'\nimport { dataGridBodyContextMenuHandler } from './event-handlers/data-grid-body-contextmenu-handler.js'\nimport { dataGridBodyKeydownHandler } from './event-handlers/data-grid-body-keydown-handler.js'\nimport { accumulate } from '../accumulator/accumulator.js'\n\nconst THRESHOLD = 300\nconst DATA_PADDING = 3\nconst ROW_HEIGHT = 40\nconst GAP_SIZE = 1\n\nfunction calcScrollPos(parent: DataGridBody, child: Element) {\n /* getBoundingClientRect는 safari에서 스크롤 상태에서 다른 브라우저와는 다른 값을 리턴함 - 사파리는 약간 이상 작동함. */\n var { top: ct, left: cl, right: cr, bottom: cb } = child.getBoundingClientRect()\n var { top: pt, left: pl, right: pr, bottom: pb } = parent.getBoundingClientRect()\n var { scrollLeft, scrollTop } = parent\n var scrollbarWidth = parent.clientWidth - parent.offsetWidth\n var scrollbarHeight = parent.clientHeight - parent.offsetHeight\n\n return {\n left: cl < pl ? scrollLeft - (pl - cl) : cr > pr ? scrollLeft - (pr - cr) - scrollbarWidth : undefined,\n top: ct < pt ? scrollTop - (pt - ct) : cb > pb ? scrollTop - (pb - cb) - scrollbarHeight : undefined\n }\n}\n\n/* select 타입 붙여넣기: display 또는 value 텍스트와 매칭되는 옵션의 value를 반환 */\nfunction resolveSelectPasteValue(text: string, column: ColumnConfig, record: GristRecord): any {\n const rowOptionField = record[column.record?.rowOptionField || '']\n let { options = [] } = rowOptionField ? rowOptionField : column.record || {}\n\n /* options가 함수인 경우 호출하여 배열을 가져옴 (arrow function이므로 this는 정의 시점에 바인딩됨) */\n if (typeof options === 'function') {\n try {\n options = (options as Function)()\n } catch (e) {\n return undefined\n }\n }\n\n if (!Array.isArray(options)) {\n return undefined\n }\n\n const trimmed = String(text).trim()\n if (!trimmed) return undefined\n\n for (const opt of options) {\n if (typeof opt === 'string') {\n if (opt.trim() === trimmed) return opt\n } else if (opt && typeof opt === 'object') {\n const display = String((opt as any).display || (opt as any).name || '').trim()\n const val = String((opt as any).value ?? '').trim()\n if (display === trimmed || val === trimmed) return (opt as any).value\n }\n }\n\n return undefined\n}\n\nconst ZERO_FOCUS = {\n row: 0,\n column: 0\n}\n\n@customElement('ox-grid-body')\nexport class DataGridBody extends LitElement {\n debounce = debounce((scrollTop: number, clientHeight: number) => {\n const maxVisibleRows = Math.ceil(clientHeight / (ROW_HEIGHT + GAP_SIZE))\n const from = Math.max(0, Math.floor(scrollTop / (ROW_HEIGHT + GAP_SIZE)) - maxVisibleRows * DATA_PADDING)\n const to = Math.min(this.data.records?.length || 0, from + maxVisibleRows * (DATA_PADDING * 2 + 1))\n\n this.from = from\n this.to = to\n }, THRESHOLD)\n\n static styles = [\n dataGridBodyStyle,\n css`\n :host {\n font-variation-settings: 'FILL' 1;\n\n overscroll-behavior: none;\n user-select: none;\n }\n\n /*\n * 복사 범위 상자 — 드래그로 잡은 구간을 두르는 상자.\n *\n * 전에는 셀 초점 표식과 **같은 토큰**을 썼다. 그래서 조회 전용 표에서 셀 점선을 없애려고 그\n * 토큰을 none 으로 두었을 때, **범위를 잡아도 상자가 안 보였다** — 표식이 아니라 기능이 지워진\n * 것이다. 범위를 잡았다는 것을 알릴 유일한 표시였다.\n *\n * 그래서 자기 토큰을 준다. 이것은 조회 표에서도 있어야 한다 — 값을 복사하는 일은 고치는 일이\n * 아니다.\n */\n [select-block] {\n position: absolute;\n left: var(--select-box-left);\n top: var(--select-box-top);\n width: var(--select-box-width);\n height: var(--select-box-height);\n border: var(--grid-select-block-border, 1px solid var(--ui-accent, #00727e));\n background-image: var(--focused-background-image);\n pointer-events: none;\n\n z-index: 5;\n }\n\n [fixed] {\n position: sticky;\n background-color: var(--grid-record-background-color);\n z-index: 2; /* 고정된 열을 다른 열 위에 표시. */\n }\n\n :host([raised]) [fixed] {\n /* 고정 컬럼이 살짝 올라와 있는 느낌을 표현 */\n box-shadow: 3px 0 3px rgba(0, 0, 0, 0.1);\n }\n\n ox-grid-accum-field {\n position: sticky;\n bottom: 0;\n z-index: 1;\n }\n\n ox-grid-accum-field[fixed] {\n background-color: var(--md-sys-color-primary-container);\n }\n\n @media (max-width: 768px) {\n /* 모바일에서는 그리드에서 고정된 열 해제 */\n [fixed] {\n position: static;\n z-index: 0;\n box-shadow: none !important;\n }\n }\n\n @media (pointer: coarse) {\n /* 터치 디바이스에서는 길게 눌러 텍스트 선택 허용 */\n :host {\n user-select: auto;\n }\n }\n\n /* 한글 IME composition을 위한 숨겨진 input 버퍼 — 기존 에디터 셀 스타일과 일치 */\n #ime-buffer {\n position: absolute;\n opacity: 0;\n z-index: 10;\n background-color: var(--grid-record-editing-background-color, var(--grid-record-background-color, #fff));\n color: var(--md-sys-color-on-background, inherit);\n font: inherit;\n font-size: var(--grid-record-wide-fontsize);\n border: 1px solid transparent;\n border-width: 1px 0;\n border-top: var(--grid-record-editing-border, none);\n border-bottom: var(--grid-record-editing-border, none);\n padding: var(--grid-record-padding);\n box-sizing: border-box;\n outline: none;\n overflow: hidden;\n pointer-events: none;\n }\n\n #ime-buffer.active {\n opacity: 1;\n pointer-events: auto;\n }\n `\n ]\n\n @property({ type: Object }) config: GristConfig = ZERO_CONFIG\n @property({ type: Array }) columns: ColumnConfig[] = []\n @property({ type: Object }) data: GristData = ZERO_DATA\n @property({ type: Object }) focused: { row: number; column: number } = ZERO_FOCUS\n @property({ type: Object }) editTarget: { row: number; column: number; valueWith: string | null } | null = null\n @property({ type: Number }) from = -1\n @property({ type: Number }) to = -1\n @property({ type: Array }) fixedLefts: number[] = []\n\n @state() _selectBlock?: {\n start: DataGridField\n end?: DataGridField\n }\n\n @query('[select-block]') selectBlock?: HTMLDivElement\n @query('ox-grid-field[focused]') focusedField?: DataGridField\n\n private _focusedListener?: (e: KeyboardEvent) => void\n private _recordView?: any\n private _recordViewRow?: number\n private _draggable?: boolean\n private _gridElement?: Element | null\n\n /* IME composition 지원을 위한 숨겨진 input 버퍼 */\n private _imeBuffer?: HTMLInputElement\n _imeComposing: boolean = false\n _imeEditing: boolean = false\n _lastPointerTouch: boolean = false\n\n /* 편집 가능한 셀이 하나라도 있는지 — 없으면(읽기 전용 그리드) IME 입력 버퍼로 포커스를 넘기지 않는다 */\n private get _hasEditableColumn(): boolean {\n return this.columns.some(column => !column.hidden && !column.gutterName && !!column.record?.editable)\n }\n\n resetEdit() {\n this.editTarget = null\n }\n\n handleOnScroll(e: WheelEvent) {\n const { scrollTop, clientHeight } = e.target as HTMLElement\n this.debounce(scrollTop, clientHeight)\n }\n\n // issue #13\n // renderOptimisticRow() {\n // return\n // }\n\n render() {\n // block이 선택되어 있으면, focused row/column은 표현하지 않는다.\n var { row: focusedRow, column: focusedColumn } = (!this._selectBlock && this.focused) || {}\n var { row: editingRow, column: editingColumn, valueWith = null } = this.editTarget || {}\n\n var columns = this.columns.filter(column => !column.hidden)\n var data = this.data\n var { records } = data\n var { appendable, classifier, accumulator } = this.config.rows\n const { start, end } = this._selectBlock || {}\n\n /*\n * 레코드를 추가할 수 있는 경우에는 항상 추가 레코드를 보여준다.\n * 만약, 이전 방식처럼, 커서를 옮겨야만 새로운 레코드가 보이게 하고 싶다면, 조건부를 다음의 코드로 대체한다.\n * -- if (focusedRow == records.length)\n */\n if (appendable) {\n records = [...records, { __dirty__: '+' }]\n }\n\n if (accumulator) {\n var accumRecord = this.buildAccumulatorRecord()\n }\n\n return html`\n ${records.map((record, idxRow) => {\n var attrFocusedRow = idxRow === focusedRow\n var attrSelected = record['__selected__']\n var attrOdd = idxRow % 2\n var dirtyFields = record['__dirtyfields__'] || {}\n var { emphasized } = classifier.call(null, record, idxRow) || {}\n\n return html`\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-field\n .data=${data}\n .type=${column.type}\n .rowIndex=${idxRow}\n .columnIndex=${idxColumn}\n .column=${column}\n .record=${record}\n .checked=${record.__selected__ ? 'checked' : record.__check_in_tree__}\n .emphasized=${emphasized}\n ?multiline=${!!column.multiline}\n ?gutter=${column.type == 'gutter'}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ?focused=${idxRow === focusedRow && idxColumn === focusedColumn}\n ?editing=${idxRow === editingRow && idxColumn === editingColumn}\n .valueWith=${valueWith}\n .value=${record[column.name]}\n ?dirty=${!!dirtyFields[column.name]}\n fixed=${ifDefined(this.fixedLefts[idxColumn])}\n ></ox-grid-field>\n `\n )}\n <ox-grid-field\n .data=${data}\n .rowIndex=${idxRow}\n .columnIndex=${-1}\n .record=${record}\n .emphasized=${emphasized}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ></ox-grid-field>\n `\n })}\n ${accumulator\n ? html`\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-accum-field\n .data=${data}\n .columnIndex=${idxColumn}\n .rowIndex=${records.length}\n .column=${column}\n .record=${accumRecord!}\n .value=${accumRecord[column.name]}\n fixed=${ifDefined(this.fixedLefts[idxColumn])}\n ></ox-grid-accum-field>\n `\n )}\n <ox-grid-accum-field\n .data=${data}\n .columnIndex=${-1}\n .rowIndex=${records.length}\n .record=${accumRecord!}\n ></ox-grid-accum-field>\n `\n : nothing}\n ${start && end && start !== end ? html` <div select-block></div> ` : html``}\n <input id=\"ime-buffer\" type=\"text\" />\n <slot></slot>\n `\n }\n\n firstUpdated() {\n // TODO issue #13\n // this.addEventListener('scroll', this.handleOnScroll.bind(this))\n\n /* focus() 를 받을 수 있도록 함. */\n this.setAttribute('tabindex', '-1')\n\n /* 한글 IME composition을 위한 숨겨진 input 버퍼 설정 */\n const imeBuffer = this.renderRoot.querySelector('#ime-buffer') as HTMLInputElement\n this._imeBuffer = imeBuffer\n\n imeBuffer.addEventListener('compositionstart', () => {\n this._imeComposing = true\n this._imeEditing = true\n imeBuffer.classList.add('active')\n this._positionIMEBuffer()\n })\n\n imeBuffer.addEventListener('compositionend', () => {\n this._imeComposing = false\n })\n\n imeBuffer.addEventListener('input', () => {\n if (!this._imeComposing && !this._imeEditing && imeBuffer.value) {\n /* 영어/숫자: 실제 값이 입력된 경우에만 활성화 */\n this._imeEditing = true\n imeBuffer.classList.add('active')\n this._positionIMEBuffer()\n }\n })\n\n /*\n * focusout 으로 property를 변경시키는 경우, focusout에 의해 update가 발생하는 경우에는,\n * 그리드 내부의 컴포넌트가 갱신되는 현상을 초래하게 된다.\n * 따라서, focusout 핸들러에서 update를 유발하는 코드는 강력하게 금지시킨다.\n */\n this.addEventListener('focusout', e => {\n /* IME buffer로 포커스가 이동하는 경우 keydown listener 유지 */\n const related = (e as FocusEvent).relatedTarget as Node\n if (related && this.shadowRoot?.contains(related)) {\n return\n }\n\n /* 그리드 외부로 포커스 이동 시 IME buffer 커밋 */\n if (this._imeEditing) {\n const { row = 0, column = 0 } = this.focused || {}\n this._commitIMEBuffer(row, column)\n }\n\n if (this._focusedListener) {\n this.removeEventListener('keydown', this._focusedListener)\n delete this._focusedListener\n }\n })\n\n this.addEventListener('focusin', e => {\n if (!this._focusedListener) {\n this._focusedListener = dataGridBodyKeydownHandler.bind(this)\n this.addEventListener('keydown', this._focusedListener)\n }\n })\n\n this.addEventListener('set-select-block', async e => {\n e.stopPropagation()\n\n const { startRow = -1, startColumn = -1, endRow = -1, endColumn = -1 } = ((e as CustomEvent).detail as any) || {}\n\n const start = this.getFieldByIndex(startRow, startColumn) as DataGridField\n const end = this.getFieldByIndex(endRow, endColumn) as DataGridField\n\n this.setSelectBlock(start, end)\n })\n\n this.renderRoot.addEventListener('contextmenu', (event: Event) => {\n const e = event as MouseEvent\n this.setSelectBlock()\n\n this._draggable = false\n\n var target = (e.target as Element).closest('ox-grid-field') as DataGridField\n var { rowIndex, columnIndex } = target || {}\n\n this.dispatchEvent(\n new CustomEvent('focus-change', {\n bubbles: true,\n composed: true,\n detail: {\n row: rowIndex,\n column: columnIndex\n }\n })\n )\n })\n\n this.renderRoot.addEventListener('pointerdown', (e: Event) => {\n const pe = e as PointerEvent\n const isTouch = pe.pointerType === 'touch'\n\n /* 터치 이벤트 여부 기록 — 태블릿에서 input focus로 가상 키보드가 뜨는 것을 방지 */\n this._lastPointerTouch = isTouch\n\n /* 클릭 시 IME buffer가 활성 상태면 먼저 커밋 */\n if (this._imeEditing) {\n const { row = 0, column = 0 } = this.focused || {}\n this._commitIMEBuffer(row, column)\n }\n\n this.setSelectBlock()\n\n if (isTouch) {\n /* 터치: click 이벤트에서 처리 (스크롤 시에는 click이 발생하지 않음) */\n return\n }\n\n if ('buttons' in e && pe.buttons !== 1) {\n return\n }\n\n e.preventDefault()\n e.stopPropagation()\n\n this._draggable = true\n\n var target = (e.target as Element).closest('ox-grid-field') as DataGridField\n var { rowIndex, columnIndex } = target || {}\n\n this.dispatchEvent(\n new CustomEvent('focus-change', {\n bubbles: true,\n composed: true,\n detail: {\n row: rowIndex,\n column: columnIndex\n }\n })\n )\n\n if (columnIndex >= 0 && target.editableOnClick && !isNaN(rowIndex) && !isNaN(columnIndex)) {\n this.startEditTarget(rowIndex, columnIndex)\n }\n })\n\n this.renderRoot.addEventListener('pointermove', (event: Event) => {\n const e = event as PointerEvent\n if (('buttons' in e && e.buttons !== 1) || !this._draggable) {\n return\n }\n\n e.preventDefault()\n e.stopPropagation()\n\n const field = e.target as DataGridField\n if (!this._selectBlock) {\n this.setSelectBlock(this.focusedField || field, this.focusedField || field)\n\n return\n }\n\n var { start, end } = this._selectBlock || {}\n\n if (start && end !== field) {\n end = field\n\n this.setSelectBlock(start, end)\n }\n })\n\n this.renderRoot.addEventListener('pointerup', (event: Event) => {\n if ((event as PointerEvent).pointerType !== 'touch') {\n event.preventDefault()\n event.stopPropagation()\n }\n\n this._draggable = false\n })\n\n this.renderRoot.addEventListener('click', dataGridBodyClickHandler.bind(this))\n this.renderRoot.addEventListener('dblclick', dataGridBodyDblclickHandler.bind(this))\n this.renderRoot.addEventListener('contextmenu', dataGridBodyContextMenuHandler.bind(this))\n\n this.addEventListener('focus-change', dataGridBodyFocusChangeHandler.bind(this))\n\n requestAnimationFrame(() => {\n // 1. 공백 찌꺼기가 들어갈 수 있으므로 .trim()으로 깔끔하게 처리\n const primaryColor = getComputedStyle(this).getPropertyValue('--md-sys-color-primary').trim()\n // 2. 가독성을 위해 svg 문자열 조립 분리\n const svgString = `<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><rect fill='${primaryColor}' fill-opacity='0.2' x='0' y='0' width='100%' height='100%'/></svg>`\n\n // 3. Hex 코드의 '#' 기호 및 '< >' 괄호들이 파서를 깨뜨리는 것을 완벽 방지하기 위해 전체 인코딩\n const encodedSvg = encodeURIComponent(svgString)\n this.style.setProperty(\n '--focused-background-image',\n // 4. 비표준인 ;utf8 태그를 떼어내고, 인코딩된 SVG 데이터를 주입\n `url(\"data:image/svg+xml,${encodedSvg}\")`\n )\n })\n\n this.addEventListener('show-record-view', (e: Event) =>\n this.popupRecordView((e as CustomEvent).detail as { row: number; record: GristRecord })\n )\n\n this.addEventListener('scroll', function () {\n this.scrollLeft == 0 ? this.removeAttribute('raised') : this.setAttribute('raised', '')\n })\n }\n\n connectedCallback() {\n super.connectedCallback()\n // 헤더가 ox-grist에 디스패치하는 fetch-params-change 이벤트 수신\n this._gridElement = closestElement('ox-grist', this)\n this._gridElement?.addEventListener('fetch-params-change', this._onFetchParamsChange)\n }\n\n disconnectedCallback() {\n if (this._gridElement) {\n this._gridElement.removeEventListener('fetch-params-change', this._onFetchParamsChange)\n }\n super.disconnectedCallback()\n }\n\n // 검색시 스크롤 맨 위로\n _onFetchParamsChange: EventListener = () => {\n this.scrollTop = 0\n }\n\n getFieldByIndex(rowIndex: number, columnIndex: number, residue: boolean = true) {\n if (rowIndex < 0) {\n return\n }\n\n var columns = this.columns.filter(column => !column.hidden).length\n if (!residue && columnIndex >= columns) {\n return\n }\n\n return this.renderRoot.children.item(\n rowIndex * (columns + 1) /* 1 means last dummy column */ + ((columnIndex + columns) % columns)\n ) as DataGridField\n }\n\n startEditTarget(row: number, column: number, valueWith: string | null = null) {\n var { editable } = this.columns.filter(column => !column.hidden)[column].record\n if (typeof editable === 'function') {\n const curRow = this.data.records[row] || {}\n const curCol = this.columns[column + 1]\n editable = editable.call(this, curRow[curCol.name], curCol, curRow, row, this)\n }\n\n if (!editable) {\n return\n }\n\n if (this.editTarget && this.editTarget.row == row && this.editTarget.column == column) {\n return\n }\n\n /* 에디터 편집 전환 시 IME buffer 정리 */\n this._resetIMEBuffer()\n\n this.editTarget = {\n row,\n column,\n valueWith\n }\n }\n\n shouldUpdate(changes: any) {\n if (!changes.has('editTarget')) {\n /*\n * 큰 변화에 대해서는 실제 update가 발생되기 전에 editTarget을 초기화한다.\n */\n this.editTarget = null\n }\n\n return super.shouldUpdate(changes)\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('focused')) {\n let element = this.renderRoot?.querySelector('[focused]')\n if (!element) {\n return\n }\n\n let { top, left } = calcScrollPos(this, element)\n // TODO this.scroll()을 사용하면, 효과가 좋으나 left 계산에 문제가 있는 것 같음.\n // this.scroll({\n // top,\n // left,\n // behavior: 'smooth'\n // })\n if (top !== undefined) {\n this.scrollTop = top\n }\n if (left !== undefined) {\n this.scrollLeft = left\n }\n\n /* IME buffer 위치 업데이트 */\n this._positionIMEBuffer()\n if (!this.editTarget && this._imeBuffer && !this._lastPointerTouch && this._hasEditableColumn) {\n this._imeBuffer.focus()\n }\n }\n\n // 페이징 바뀌면 스크롤 맨 위로\n if (changes.has('data')) {\n const prevData = changes.get('data') as GristData | undefined\n const prevPage = prevData && (prevData as any).page\n const currPage = (this.data as any).page\n if (prevPage !== undefined && prevPage !== currPage) {\n this.scrollTop = 0\n }\n }\n\n if (this._recordView) {\n this._recordView.record = this.data.records[this._recordViewRow!]\n }\n }\n\n focus() {\n if (this.editTarget) {\n /* 에디터 편집 모드에서는 에디터가 자체적으로 포커스를 관리하므로 간섭하지 않는다 */\n return\n }\n\n if (this._imeBuffer && !this._lastPointerTouch && this._hasEditableColumn) {\n /* 비편집 모드에서는 IME buffer로 포커스 리다이렉트 (터치 시/읽기 전용 그리드에서는 제외) */\n this._positionIMEBuffer()\n this._imeBuffer.focus()\n } else {\n super.focus()\n }\n\n if (this.focused === ZERO_FOCUS) {\n let { records } = this.data\n let row = records.findIndex(record => record['__selected__'])\n\n this.focused = { row: row == -1 ? 0 : row, column: 0 }\n }\n }\n\n popupRecordView({ record, row }: { row: number; record: GristRecord }) {\n var titleField = this.config.list.fields[0] || 'name'\n var title = record[titleField]\n\n /* field가 오브젝트형인 경우에는 렌더러를 타이틀로 사용한다. */\n if (typeof title == 'object') {\n var column = this.config.columns.find(column => column.name == titleField)\n title = column?.record.renderer(title, column, record, row, this /* cautious */)\n }\n\n this._recordViewRow = row\n this._recordView = RecordViewHandler(\n this.config.columns,\n record,\n row,\n this,\n {\n title\n },\n () => {\n delete this._recordView\n delete this._recordViewRow\n }\n )\n }\n\n /* 선택된 셀 블록의 값을 HTML(table)과 plain text(TSV) 두 가지 포맷으로 반환 */\n getSelectedBlockValues(): { html: string; text: string } | undefined {\n var { start, end } = this._selectBlock || {}\n\n if (!(start && end)) {\n start = this.focusedField\n\n end = start\n }\n\n if (start && end) {\n const startRowIndex = start.rowIndex < end.rowIndex ? start.rowIndex : end.rowIndex\n const endRowIndex = start.rowIndex < end.rowIndex ? end.rowIndex : start.rowIndex\n const startColumnIndex = start.columnIndex < end.columnIndex ? start.columnIndex : end.columnIndex\n const endColumnIndex = start.columnIndex < end.columnIndex ? end.columnIndex : start.columnIndex\n\n const columnArray = new Array(endColumnIndex - startColumnIndex + 1).fill(startColumnIndex)\n const columns = this.columns.filter(column => !column.hidden)\n\n /*\n * 클립보드에 두 가지 포맷(text/html, text/plain)을 동시에 저장한다.\n * 붙여넣기하는 앱이 자신이 지원하는 포맷을 골라 읽는다.\n * 생성되는 HTML:\n * <td type=object data-value=\"{&quot;id&quot;:...}\">탈수 절임배추</td>\n * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^\n * 그리드만 읽는 숨겨진 JSON Excel/메모장이 보는 텍스트\n */\n const rows = new Array(endRowIndex - startRowIndex + 1).fill(startRowIndex).map((start, index) => {\n const rowIndex = start + index\n const record = this.data.records[rowIndex]\n\n const cells = columnArray.map((start, index) => {\n const columnIndex = start + index\n const column = columns[columnIndex]\n const value = record?.[column.name]\n const type = typeof value\n\n /* select 타입: value → display 텍스트 미리 계산 (htmlText/plainText 공용) */\n let selectDisplay: any = value\n if (column.type === 'select' && value !== undefined && value !== null) {\n const src = record[column.record?.rowOptionField || ''] ?? column.record\n const options: any[] = Array.isArray(src?.options) ? src.options : []\n const opt = options.find((o: any) => (typeof o === 'string' ? o : String(o?.value ?? '')).trim() === String(value).trim())\n selectDisplay = opt ? (typeof opt === 'string' ? opt : opt.display || opt.name || value) : value\n }\n\n /* htmlText: object는 JSON 문자열로 보존(data-value) → 그리드 붙여넣기 시 복원됨. select는 display 텍스트 */\n const htmlText = value === undefined || value === null ? '' : type == 'object' ? JSON.stringify(value) : column.type === 'select' ? selectDisplay : value\n\n /* plainText: ① null/undefined → renderer ② object → name → renderer ③ select → display ④ 기타 → 값 그대로 */\n let plainText: any = ''\n if (value === undefined || value === null) {\n /* 값이 없지만 renderer가 record의 다른 경로로 텍스트를 표시할 수 있음 */\n if (column.record?.renderer) {\n try {\n const r = column.record.renderer(value, column, record, rowIndex, null as any)\n if (typeof r === 'string') plainText = r\n } catch (e) {}\n }\n } else if (type == 'object') {\n /* object: name 필드가 문자열인 경우 우선, 없으면 renderer */\n const rawName = (value as any)?.name\n plainText = typeof rawName === 'string' ? rawName : ''\n if (!plainText && column.record?.renderer) {\n try {\n const r = column.record.renderer(value, column, record, rowIndex, null as any)\n if (typeof r === 'string') plainText = r\n } catch (e) {}\n }\n } else if (column.type === 'select') {\n plainText = selectDisplay\n } else {\n plainText = value\n }\n\n /* 안전장치: plainText가 object이면 빈 문자열로 대체하여 [object Object] 방지 */\n if (plainText !== null && plainText !== undefined && typeof plainText === 'object') {\n plainText = ''\n }\n\n return { type, htmlText, plainText }\n })\n\n return cells\n })\n\n const escapeHtml = (unsafe: any) => {\n if (unsafe == null) return ''\n return String(unsafe).replace(/[&<>\"']/g, function (m) {\n switch (m) {\n case '&':\n return '&amp;'\n case '<':\n return '&lt;'\n case '>':\n return '&gt;'\n case '\"':\n return '&quot;'\n case \"'\":\n return '&#039;'\n default:\n return m\n }\n })\n }\n\n const html =\n '<table>' +\n rows\n .map(\n cells =>\n '<tr>' +\n cells\n .map(c =>\n c.type == 'object' && c.htmlText\n ? `<td type=${c.type} data-value=\"${escapeHtml(c.htmlText)}\">${escapeHtml(c.plainText)}</td>`\n : `<td type=${c.type}>${escapeHtml(c.htmlText)}</td>`\n )\n .join('') +\n '</tr>'\n )\n .join('') +\n '</table>'\n\n /* 태그 없는 TSV 포맷 (object는 name만) */\n const text = rows.map(cells => cells.map(c => String(c.plainText)).join('\\t')).join('\\n')\n\n return { html, text }\n }\n }\n\n async copy() {\n const copied = this.getSelectedBlockValues()\n if (!copied) return\n\n await navigator.clipboard.write([\n new ClipboardItem({\n 'text/html': new Blob([copied.html], { type: 'text/html' }),\n 'text/plain': new Blob([copied.text], { type: 'text/plain' })\n })\n ])\n\n const selectBlock = this.selectBlock || this.focusedField\n if (selectBlock) {\n const backgroundColor = selectBlock.style.backgroundColor\n const opacity = selectBlock.style.opacity\n\n selectBlock.setAttribute('data-tooltip', 'copied to clipboard!')\n const rect = selectBlock.getBoundingClientRect()\n selectBlock.style.setProperty('--tooltip-top', `${rect.top}px`)\n selectBlock.style.setProperty('--tooltip-left', `${rect.left}px`)\n\n selectBlock.style.backgroundColor = 'red'\n selectBlock.style.opacity = '0.5'\n await sleep(500)\n selectBlock.removeAttribute('data-tooltip')\n selectBlock.style.backgroundColor = backgroundColor\n selectBlock.style.opacity = opacity\n }\n }\n\n async paste() {\n try {\n const selection = window.getSelection()\n\n const clipboardItems = await navigator.clipboard.read()\n if (!clipboardItems) {\n return\n }\n\n var type: string | undefined\n var content: string | undefined\n\n for (const clipboardItem of clipboardItems) {\n try {\n var blob = await clipboardItem.getType('text/html')\n content = blob && (await blob.text())\n type = 'text/html'\n } catch (e) {\n try {\n blob = await clipboardItem.getType('text/plain')\n content = blob && (await blob.text())\n type = 'text/plain'\n } catch (e) {}\n }\n\n break\n }\n\n if (!content) {\n return\n }\n\n /* 붙여넣기 앵커/타겟 영역: 선택 블록이 있으면 좌상단 + 크기, 없으면 포커스 셀 1×1 (엑셀식 반복 채우기용) */\n let { row, column } = this.focused\n let tgtRows = 1\n let tgtCols = 1\n const { start, end } = this._selectBlock || {}\n if (start && end) {\n row = Math.min(start.rowIndex, end.rowIndex)\n column = Math.min(start.columnIndex, end.columnIndex)\n tgtRows = Math.abs(end.rowIndex - start.rowIndex) + 1\n tgtCols = Math.abs(end.columnIndex - start.columnIndex) + 1\n }\n\n const { records } = this.data\n const columns = this.columns.filter(column => !column.hidden)\n\n if (type === 'text/html') {\n const div = document.createElement('div')\n div.innerHTML = content!.trim()\n const table = div.querySelector('table') as HTMLTableElement\n if (!table) {\n return\n }\n\n if (selection) {\n this.resetEdit()\n selection.removeAllRanges()\n\n // 포커스가 빠지기 전에 isWorking으로 focusout 이벤트에 대한 값 변경을 막음\n // (선택 블록이 있는 동안에는 focused 필드가 렌더링되지 않으므로 존재 여부 확인)\n if (this.focusedField) {\n this.focusedField.isWorking = true\n await this.updateComplete\n this.focusedField.isWorking = false\n }\n }\n /* 엑셀식 타일링: 타겟 선택 영역이 소스 크기의 정수배이면 그 차원으로 반복, 아니면 1회 (차원별 독립 판정) */\n const trs = Array.from(table.querySelectorAll('tr')).filter(\n (r): r is HTMLTableRowElement => r instanceof HTMLTableRowElement\n )\n if (!trs.length) {\n return\n }\n const srcRows = trs.length\n const srcCols = Math.max(...trs.map(tr => tr.querySelectorAll('td').length))\n const repeatR = srcRows > 0 && tgtRows % srcRows === 0 ? tgtRows / srcRows : 1\n const repeatC = srcCols > 0 && tgtCols % srcCols === 0 ? tgtCols / srcCols : 1\n\n for (let rowIndex = 0; rowIndex < srcRows * repeatR; rowIndex++) {\n var targetRecord = records[row + rowIndex] || { __dirty__: '+' }\n if (row + rowIndex >= records.length) {\n records.push(targetRecord)\n }\n\n const cells = trs[rowIndex % srcRows].querySelectorAll('td')\n for (let columnIndex = 0; columnIndex < srcCols * repeatC; columnIndex++) {\n const item = cells[columnIndex % srcCols]\n if (!item) continue /* ragged row 방어 */\n const targetColumn = columns[column + columnIndex]\n if (!targetColumn || targetColumn.gutterName) continue /* 그리드 범위 밖 열 방어 / gutter 방어 */\n /* data-value 속성이 있으면 우선 사용 (그리드에서 복사한 object 데이터 복원용) */\n let value = (item.dataset.value || item.textContent) as any\n const sourceType = item.getAttribute('type') || 'string'\n let type = targetColumn.type || sourceType\n type = type.includes('object') ? 'object' : type // 오브젝트 타입 예외처리\n let { editable } = targetColumn.record\n if (typeof editable === 'function') {\n editable = editable.call(this, value, targetColumn, targetRecord, row, this)\n }\n\n if (value) {\n switch (type) {\n case 'object':\n // 오브젝트가 전부 빈값이면 ''로 치환\n try {\n value = JSON.parse(value || '{}')\n value = Object.values(value).every(v => (typeof v === 'string' ? v.trim() === '' : isEmpty(v)))\n ? null\n : value\n } catch (err) {\n value = null\n }\n break\n case 'parameters':\n try {\n value = JSON.parse(value || 'null')\n } catch (err) {\n value = null\n }\n break\n case 'boolean':\n case 'checkbox':\n value = !!value && !!String(value).match(/true/i)\n break\n case 'number':\n case 'float':\n case 'integer':\n case 'progress':\n value = parseToNumberOrNull(value)\n break\n case 'string':\n try {\n const parsed = JSON.parse(value)\n /* 오브젝트를 문자열 셀에 붙여넣을 때 셀의 표시 텍스트(textContent) 우선 사용 */\n if (typeof parsed === 'object' && parsed !== null) {\n value = item.textContent?.trim() || (parsed as any).name || ''\n } else {\n value = String(parsed).trim()\n }\n } catch (err) {}\n break\n case 'select':\n /* select 타입: 붙여넣은 텍스트를 옵션의 display/value와 매칭하여 value로 변환 */\n value = resolveSelectPasteValue(String(value), targetColumn, targetRecord)\n break\n default:\n /* 원본이 string 으로 복사된 값(color-map 등 JSON 문자열 저장 타입)은\n 파싱하지 않고 문자열 그대로 유지 */\n if (sourceType === 'string' && !item.dataset.value) {\n value = value?.trim()\n } else {\n try {\n value = JSON.parse(value)\n } catch (err) {\n if (type === 'json' || type.includes('object')) value = null\n }\n }\n }\n } else {\n /* 기존 레코드(id 있음)는 명시적으로 비우기 위해 null, 신규 레코드는 default value 적용을 위해 undefined */\n value = targetRecord.id ? null : undefined\n }\n\n if (targetColumn && !targetColumn.gutterName && editable) {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: targetRecord[targetColumn.name],\n after: value,\n column: targetColumn,\n record: targetRecord,\n row: row + rowIndex\n }\n })\n )\n }\n }\n }\n\n return\n } else if (type === 'text/plain') {\n /* TSV 포맷 파싱: 줄바꿈으로 행 분리, 탭으로 열 분리 (엑셀 등 외부 소스 붙여넣기 지원) */\n /* CRLF 정규화 + 마지막 빈 줄 제거 (엑셀 TSV는 개행으로 끝남 — 빈 행이 소스 크기 판정을 깨뜨림) */\n const tsvRows = content\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\n$/, '')\n .split('\\n')\n .map(line => line.split('\\t'))\n if (!tsvRows.length) {\n return\n }\n\n /* 엑셀식 타일링: 타겟 선택 영역이 소스 크기의 정수배이면 그 차원으로 반복, 아니면 1회 (차원별 독립 판정) */\n const srcRows = tsvRows.length\n const srcCols = Math.max(...tsvRows.map(r => r.length))\n const repeatR = srcRows > 0 && tgtRows % srcRows === 0 ? tgtRows / srcRows : 1\n const repeatC = srcCols > 0 && tgtCols % srcCols === 0 ? tgtCols / srcCols : 1\n\n for (let rowOffset = 0; rowOffset < srcRows * repeatR; rowOffset++) {\n const targetRowIndex = row + rowOffset\n var targetRecord = records[targetRowIndex] || { __dirty__: '+' }\n if (targetRowIndex >= records.length) {\n records.push(targetRecord)\n }\n\n const tsvCells = tsvRows[rowOffset % srcRows]\n for (let colOffset = 0; colOffset < srcCols * repeatC; colOffset++) {\n const cellValue = tsvCells[colOffset % srcCols] ?? '' /* ragged row 방어 */\n const targetColumn = columns[column + colOffset]\n if (!targetColumn || targetColumn.gutterName) continue\n\n let { editable } = targetColumn.record\n if (typeof editable === 'function') {\n editable = editable.call(this, cellValue, targetColumn, targetRecord, targetRowIndex, this)\n }\n\n if (editable) {\n /* select 타입: 붙여넣은 텍스트를 옵션의 display/value와 매칭하여 value로 변환 */\n /* 빈값: 기존 레코드(id 있음)는 명시적으로 비우기 위해 null, 신규 레코드는 default value 적용을 위해 undefined */\n let resolvedValue: any = cellValue || (targetRecord.id ? null : undefined)\n if (targetColumn.type === 'select' && cellValue) {\n resolvedValue = resolveSelectPasteValue(cellValue, targetColumn, targetRecord)\n }\n\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: targetRecord[targetColumn.name],\n after: resolvedValue,\n column: targetColumn,\n record: targetRecord,\n row: targetRowIndex\n }\n })\n )\n }\n }\n }\n }\n } catch (e) {\n console.log('e : ', e)\n } finally {\n /* paste 완료 후 포커스를 그리드로 복원 */\n this.focus()\n }\n }\n\n setSelectBlock(start?: DataGridField, end?: DataGridField) {\n if (start?.columnIndex == -1) {\n start = this.getFieldByIndex(start.rowIndex, this.columns.filter(column => !column.hidden).length - 1)\n }\n\n if (end?.columnIndex == -1) {\n end = this.getFieldByIndex(end.rowIndex, this.columns.filter(column => !column.hidden).length - 1)\n }\n\n this._selectBlock = start && { start, end }\n\n if (start && end) {\n window.getSelection()?.removeAllRanges()\n\n if (start !== end) {\n const left = start.columnIndex < end.columnIndex ? start : end\n const right = left === start ? end : start\n const top = start.rowIndex < end.rowIndex ? start : end\n const bottom = top === start ? end : start\n\n const { offsetLeft } = left\n const { offsetTop } = top\n const width = right.offsetLeft - offsetLeft + right.offsetWidth\n const height = bottom.offsetTop - offsetTop + bottom.offsetHeight\n\n this.style.setProperty('--select-box-left', offsetLeft - 1 + 'px')\n this.style.setProperty('--select-box-top', offsetTop - 1 + 'px')\n this.style.setProperty('--select-box-width', width + 'px')\n this.style.setProperty('--select-box-height', height + 'px')\n }\n\n this.focus()\n }\n }\n\n buildAccumulatorRecord(): GristRecord {\n var columns = this.columns.filter(column => !column.hidden)\n\n return columns.reduce((record, column) => {\n if (column.accumulator) {\n record[column.name] = accumulate(this.data, column, column.accumulator)\n }\n return record\n }, {} as GristRecord)\n }\n\n /** IME buffer를 포커스된 셀 위에 위치시킨다 */\n private _positionIMEBuffer() {\n const focusedEl = this.renderRoot?.querySelector('[focused]') as HTMLElement\n if (focusedEl && this._imeBuffer) {\n this._imeBuffer.style.left = focusedEl.offsetLeft + 'px'\n this._imeBuffer.style.top = focusedEl.offsetTop + 'px'\n this._imeBuffer.style.width = focusedEl.offsetWidth + 'px'\n this._imeBuffer.style.height = focusedEl.offsetHeight + 'px'\n }\n }\n\n /** IME buffer 값을 field-change 이벤트로 커밋한다 */\n _commitIMEBuffer(row: number, column: number) {\n const text = this._imeBuffer?.value\n this._resetIMEBuffer()\n\n if (!text) return\n\n const columns = this.columns.filter(c => !c.hidden)\n const col = columns[column]\n if (!col || col.gutterName) return\n\n const record = this.data.records[row] || { __dirty__: '+' }\n\n let { editable } = col.record\n if (typeof editable === 'function') {\n editable = editable.call(this, record[col.name], col, record, row, this)\n }\n if (!editable) return\n\n /* 타입에 따른 값 변환 */\n let value: any = text\n switch (col.type) {\n case 'number':\n case 'float':\n case 'integer':\n case 'progress':\n value = parseToNumberOrNull(text)\n if (value === null) return\n break\n case 'boolean':\n case 'checkbox':\n return /* boolean은 키보드 텍스트 입력으로 편집 불가 */\n }\n\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: record[col.name],\n after: value,\n column: col,\n record,\n row\n }\n })\n )\n }\n\n /** IME buffer 취소 (값 버리기) */\n _discardIMEBuffer() {\n this._resetIMEBuffer()\n }\n\n /** IME buffer 초기화 */\n private _resetIMEBuffer() {\n if (this._imeBuffer) {\n this._imeBuffer.value = ''\n this._imeBuffer.classList.remove('active')\n }\n this._imeEditing = false\n this._imeComposing = false\n }\n}\n"]}
1
+ {"version":3,"file":"data-grid-body.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid-body.ts"],"names":[],"mappings":"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","sourcesContent":["import './data-grid-field.js'\nimport './data-grid-accum-field.js'\n\nimport { css, html, LitElement, nothing, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport debounce from 'lodash-es/debounce.js'\nimport isEmpty from 'lodash-es/isEmpty.js'\n\nimport { sleep, parseToNumberOrNull, closestElement } from '@operato/utils'\n\nimport { ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config.js'\nimport { RecordViewHandler } from '../record-view/record-view-handler.js'\nimport { ColumnConfig, GristConfig, GristData, GristRecord } from '../types.js'\n// import { supportsPassive } from '../utils/index.js'\nimport { dataGridBodyStyle } from './data-grid-body-style.js'\nimport { DataGridField } from './data-grid-field.js'\nimport { dataGridBodyClickHandler } from './event-handlers/data-grid-body-click-handler.js'\nimport { dataGridBodyDblclickHandler } from './event-handlers/data-grid-body-dblclick-handler.js'\nimport { dataGridBodyFocusChangeHandler } from './event-handlers/data-grid-body-focus-change-handler.js'\nimport { dataGridBodyContextMenuHandler } from './event-handlers/data-grid-body-contextmenu-handler.js'\nimport { dataGridBodyKeydownHandler } from './event-handlers/data-grid-body-keydown-handler.js'\nimport { accumulate } from '../accumulator/accumulator.js'\n\nconst THRESHOLD = 300\nconst DATA_PADDING = 3\nconst ROW_HEIGHT = 40\nconst GAP_SIZE = 1\n\nfunction calcScrollPos(parent: DataGridBody, child: Element) {\n /* getBoundingClientRect는 safari에서 스크롤 상태에서 다른 브라우저와는 다른 값을 리턴함 - 사파리는 약간 이상 작동함. */\n var { top: ct, left: cl, right: cr, bottom: cb } = child.getBoundingClientRect()\n var { top: pt, left: pl, right: pr, bottom: pb } = parent.getBoundingClientRect()\n var { scrollLeft, scrollTop } = parent\n var scrollbarWidth = parent.clientWidth - parent.offsetWidth\n var scrollbarHeight = parent.clientHeight - parent.offsetHeight\n\n return {\n left: cl < pl ? scrollLeft - (pl - cl) : cr > pr ? scrollLeft - (pr - cr) - scrollbarWidth : undefined,\n top: ct < pt ? scrollTop - (pt - ct) : cb > pb ? scrollTop - (pb - cb) - scrollbarHeight : undefined\n }\n}\n\n/* select 타입 붙여넣기: display 또는 value 텍스트와 매칭되는 옵션의 value를 반환 */\nfunction resolveSelectPasteValue(text: string, column: ColumnConfig, record: GristRecord): any {\n const rowOptionField = record[column.record?.rowOptionField || '']\n let { options = [] } = rowOptionField ? rowOptionField : column.record || {}\n\n /* options가 함수인 경우 호출하여 배열을 가져옴 (arrow function이므로 this는 정의 시점에 바인딩됨) */\n if (typeof options === 'function') {\n try {\n options = (options as Function)()\n } catch (e) {\n return undefined\n }\n }\n\n if (!Array.isArray(options)) {\n return undefined\n }\n\n const trimmed = String(text).trim()\n if (!trimmed) return undefined\n\n for (const opt of options) {\n if (typeof opt === 'string') {\n if (opt.trim() === trimmed) return opt\n } else if (opt && typeof opt === 'object') {\n const display = String((opt as any).display || (opt as any).name || '').trim()\n const val = String((opt as any).value ?? '').trim()\n if (display === trimmed || val === trimmed) return (opt as any).value\n }\n }\n\n return undefined\n}\n\nconst ZERO_FOCUS = {\n row: 0,\n column: 0\n}\n\n@customElement('ox-grid-body')\nexport class DataGridBody extends LitElement {\n debounce = debounce((scrollTop: number, clientHeight: number) => {\n const maxVisibleRows = Math.ceil(clientHeight / (ROW_HEIGHT + GAP_SIZE))\n const from = Math.max(0, Math.floor(scrollTop / (ROW_HEIGHT + GAP_SIZE)) - maxVisibleRows * DATA_PADDING)\n const to = Math.min(this.data.records?.length || 0, from + maxVisibleRows * (DATA_PADDING * 2 + 1))\n\n this.from = from\n this.to = to\n }, THRESHOLD)\n\n static styles = [\n dataGridBodyStyle,\n css`\n :host {\n font-variation-settings: 'FILL' 1;\n\n overscroll-behavior: none;\n user-select: none;\n }\n\n /*\n * 복사 범위 상자 — 드래그로 잡은 구간을 두르는 상자.\n *\n * 전에는 셀 초점 표식과 **같은 토큰**을 썼다. 그래서 조회 전용 표에서 셀 점선을 없애려고 그\n * 토큰을 none 으로 두었을 때, **범위를 잡아도 상자가 안 보였다** — 표식이 아니라 기능이 지워진\n * 것이다. 범위를 잡았다는 것을 알릴 유일한 표시였다.\n *\n * 그래서 자기 토큰을 준다. 이것은 조회 표에서도 있어야 한다 — 값을 복사하는 일은 고치는 일이\n * 아니다.\n */\n [select-block] {\n position: absolute;\n left: var(--select-box-left);\n top: var(--select-box-top);\n width: var(--select-box-width);\n height: var(--select-box-height);\n border: var(--grid-select-block-border, 1px solid var(--ui-accent, #00727e));\n background-image: var(--focused-background-image);\n pointer-events: none;\n\n z-index: 5;\n }\n\n [fixed] {\n position: sticky;\n background-color: var(--grid-record-background-color);\n z-index: 2; /* 고정된 열을 다른 열 위에 표시. */\n }\n\n :host([raised]) [fixed] {\n /* 고정 컬럼이 살짝 올라와 있는 느낌을 표현 */\n box-shadow: 3px 0 3px rgba(0, 0, 0, 0.1);\n }\n\n ox-grid-accum-field {\n position: sticky;\n bottom: 0;\n z-index: 1;\n }\n\n ox-grid-accum-field[fixed] {\n background-color: var(--md-sys-color-primary-container);\n }\n\n @media (max-width: 768px) {\n /* 모바일에서는 그리드에서 고정된 열 해제 */\n [fixed] {\n position: static;\n z-index: 0;\n box-shadow: none !important;\n }\n }\n\n @media (pointer: coarse) {\n /* 터치 디바이스에서는 길게 눌러 텍스트 선택 허용 */\n :host {\n user-select: auto;\n }\n }\n\n /* 한글 IME composition을 위한 숨겨진 input 버퍼 — 기존 에디터 셀 스타일과 일치 */\n #ime-buffer {\n position: absolute;\n opacity: 0;\n z-index: 10;\n background-color: var(--grid-record-editing-background-color, var(--grid-record-background-color, #fff));\n color: var(--md-sys-color-on-background, inherit);\n font: inherit;\n font-size: var(--grid-record-wide-fontsize);\n border: 1px solid transparent;\n border-width: 1px 0;\n border-top: var(--grid-record-editing-border, none);\n border-bottom: var(--grid-record-editing-border, none);\n padding: var(--grid-record-padding);\n box-sizing: border-box;\n outline: none;\n overflow: hidden;\n pointer-events: none;\n }\n\n #ime-buffer.active {\n opacity: 1;\n pointer-events: auto;\n }\n `\n ]\n\n @property({ type: Object }) config: GristConfig = ZERO_CONFIG\n @property({ type: Array }) columns: ColumnConfig[] = []\n @property({ type: Object }) data: GristData = ZERO_DATA\n @property({ type: Object }) focused: { row: number; column: number } = ZERO_FOCUS\n @property({ type: Object }) editTarget: { row: number; column: number; valueWith: string | null } | null = null\n @property({ type: Number }) from = -1\n @property({ type: Number }) to = -1\n @property({ type: Array }) fixedLefts: number[] = []\n\n @state() _selectBlock?: {\n start: DataGridField\n end?: DataGridField\n }\n\n @query('[select-block]') selectBlock?: HTMLDivElement\n @query('ox-grid-field[focused]') focusedField?: DataGridField\n\n private _focusedListener?: (e: KeyboardEvent) => void\n private _recordView?: any\n private _recordViewRow?: number\n private _draggable?: boolean\n private _gridElement?: Element | null\n\n /* IME composition 지원을 위한 숨겨진 input 버퍼 */\n private _imeBuffer?: HTMLInputElement\n _imeComposing: boolean = false\n _imeEditing: boolean = false\n _lastPointerTouch: boolean = false\n\n /* 편집 가능한 셀이 하나라도 있는지 — 없으면(읽기 전용 그리드) IME 입력 버퍼로 포커스를 넘기지 않는다 */\n private get _hasEditableColumn(): boolean {\n return this.columns.some(column => !column.hidden && !column.gutterName && !!column.record?.editable)\n }\n\n resetEdit() {\n this.editTarget = null\n }\n\n handleOnScroll(e: WheelEvent) {\n const { scrollTop, clientHeight } = e.target as HTMLElement\n this.debounce(scrollTop, clientHeight)\n }\n\n // issue #13\n // renderOptimisticRow() {\n // return\n // }\n\n render() {\n // block이 선택되어 있으면, focused row/column은 표현하지 않는다.\n var { row: focusedRow, column: focusedColumn } = (!this._selectBlock && this.focused) || {}\n var { row: editingRow, column: editingColumn, valueWith = null } = this.editTarget || {}\n\n var columns = this.columns.filter(column => !column.hidden)\n var data = this.data\n var { records } = data\n var { appendable, classifier, accumulator } = this.config.rows\n const { start, end } = this._selectBlock || {}\n\n /*\n * 레코드를 추가할 수 있는 경우에는 항상 추가 레코드를 보여준다.\n * 만약, 이전 방식처럼, 커서를 옮겨야만 새로운 레코드가 보이게 하고 싶다면, 조건부를 다음의 코드로 대체한다.\n * -- if (focusedRow == records.length)\n */\n if (appendable) {\n records = [...records, { __dirty__: '+' }]\n }\n\n if (accumulator) {\n var accumRecord = this.buildAccumulatorRecord()\n }\n\n return html`\n ${records.map((record, idxRow) => {\n var attrFocusedRow = idxRow === focusedRow\n var attrSelected = record['__selected__']\n var attrOdd = idxRow % 2\n var dirtyFields = record['__dirtyfields__'] || {}\n var { emphasized } = classifier.call(null, record, idxRow) || {}\n\n return html`\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-field\n .data=${data}\n .type=${column.type}\n .rowIndex=${idxRow}\n .columnIndex=${idxColumn}\n .column=${column}\n .record=${record}\n .checked=${record.__selected__ ? 'checked' : record.__check_in_tree__}\n .emphasized=${emphasized}\n ?multiline=${!!column.multiline}\n ?gutter=${column.type == 'gutter'}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ?focused=${idxRow === focusedRow && idxColumn === focusedColumn}\n ?editing=${idxRow === editingRow && idxColumn === editingColumn}\n .valueWith=${valueWith}\n .value=${record[column.name]}\n ?dirty=${!!dirtyFields[column.name]}\n fixed=${ifDefined(this.fixedLefts[idxColumn])}\n ></ox-grid-field>\n `\n )}\n <ox-grid-field\n .data=${data}\n .rowIndex=${idxRow}\n .columnIndex=${-1}\n .record=${record}\n .emphasized=${emphasized}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ></ox-grid-field>\n `\n })}\n ${accumulator\n ? html`\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-accum-field\n .data=${data}\n .columnIndex=${idxColumn}\n .rowIndex=${records.length}\n .column=${column}\n .record=${accumRecord!}\n .value=${accumRecord[column.name]}\n fixed=${ifDefined(this.fixedLefts[idxColumn])}\n ></ox-grid-accum-field>\n `\n )}\n <ox-grid-accum-field\n .data=${data}\n .columnIndex=${-1}\n .rowIndex=${records.length}\n .record=${accumRecord!}\n ></ox-grid-accum-field>\n `\n : nothing}\n ${start && end && start !== end ? html` <div select-block></div> ` : html``}\n <input id=\"ime-buffer\" type=\"text\" />\n <slot></slot>\n `\n }\n\n firstUpdated() {\n // TODO issue #13\n // this.addEventListener('scroll', this.handleOnScroll.bind(this))\n\n /* focus() 를 받을 수 있도록 함. */\n this.setAttribute('tabindex', '-1')\n\n /* 한글 IME composition을 위한 숨겨진 input 버퍼 설정 */\n const imeBuffer = this.renderRoot.querySelector('#ime-buffer') as HTMLInputElement\n this._imeBuffer = imeBuffer\n\n imeBuffer.addEventListener('compositionstart', () => {\n this._imeComposing = true\n this._imeEditing = true\n imeBuffer.classList.add('active')\n this._positionIMEBuffer()\n })\n\n imeBuffer.addEventListener('compositionend', () => {\n this._imeComposing = false\n })\n\n imeBuffer.addEventListener('input', () => {\n if (!this._imeComposing && !this._imeEditing && imeBuffer.value) {\n /* 영어/숫자: 실제 값이 입력된 경우에만 활성화 */\n this._imeEditing = true\n imeBuffer.classList.add('active')\n this._positionIMEBuffer()\n }\n })\n\n /*\n * focusout 으로 property를 변경시키는 경우, focusout에 의해 update가 발생하는 경우에는,\n * 그리드 내부의 컴포넌트가 갱신되는 현상을 초래하게 된다.\n * 따라서, focusout 핸들러에서 update를 유발하는 코드는 강력하게 금지시킨다.\n */\n this.addEventListener('focusout', e => {\n /* IME buffer로 포커스가 이동하는 경우 keydown listener 유지 */\n const related = (e as FocusEvent).relatedTarget as Node\n if (related && this.shadowRoot?.contains(related)) {\n return\n }\n\n /* 그리드 외부로 포커스 이동 시 IME buffer 커밋 */\n if (this._imeEditing) {\n const { row = 0, column = 0 } = this.focused || {}\n this._commitIMEBuffer(row, column)\n }\n\n if (this._focusedListener) {\n this.removeEventListener('keydown', this._focusedListener)\n delete this._focusedListener\n }\n })\n\n this.addEventListener('focusin', e => {\n if (!this._focusedListener) {\n this._focusedListener = dataGridBodyKeydownHandler.bind(this)\n this.addEventListener('keydown', this._focusedListener)\n }\n })\n\n this.addEventListener('set-select-block', async e => {\n e.stopPropagation()\n\n const { startRow = -1, startColumn = -1, endRow = -1, endColumn = -1 } = ((e as CustomEvent).detail as any) || {}\n\n const start = this.getFieldByIndex(startRow, startColumn) as DataGridField\n const end = this.getFieldByIndex(endRow, endColumn) as DataGridField\n\n this.setSelectBlock(start, end)\n })\n\n this.renderRoot.addEventListener('contextmenu', (event: Event) => {\n const e = event as MouseEvent\n this.setSelectBlock()\n\n this._draggable = false\n\n var target = (e.target as Element).closest('ox-grid-field') as DataGridField\n var { rowIndex, columnIndex } = target || {}\n\n this.dispatchEvent(\n new CustomEvent('focus-change', {\n bubbles: true,\n composed: true,\n detail: {\n row: rowIndex,\n column: columnIndex\n }\n })\n )\n })\n\n this.renderRoot.addEventListener('pointerdown', (e: Event) => {\n const pe = e as PointerEvent\n const isTouch = pe.pointerType === 'touch'\n\n /* 터치 이벤트 여부 기록 — 태블릿에서 input focus로 가상 키보드가 뜨는 것을 방지 */\n this._lastPointerTouch = isTouch\n\n /* 클릭 시 IME buffer가 활성 상태면 먼저 커밋 */\n if (this._imeEditing) {\n const { row = 0, column = 0 } = this.focused || {}\n this._commitIMEBuffer(row, column)\n }\n\n this.setSelectBlock()\n\n if (isTouch) {\n /* 터치: click 이벤트에서 처리 (스크롤 시에는 click이 발생하지 않음) */\n return\n }\n\n if ('buttons' in e && pe.buttons !== 1) {\n return\n }\n\n e.preventDefault()\n e.stopPropagation()\n\n this._draggable = true\n\n var target = (e.target as Element).closest('ox-grid-field') as DataGridField\n var { rowIndex, columnIndex } = target || {}\n\n this.dispatchEvent(\n new CustomEvent('focus-change', {\n bubbles: true,\n composed: true,\n detail: {\n row: rowIndex,\n column: columnIndex\n }\n })\n )\n\n if (columnIndex >= 0 && target.editableOnClick && !isNaN(rowIndex) && !isNaN(columnIndex)) {\n this.startEditTarget(rowIndex, columnIndex)\n }\n })\n\n this.renderRoot.addEventListener('pointermove', (event: Event) => {\n const e = event as PointerEvent\n if (('buttons' in e && e.buttons !== 1) || !this._draggable) {\n return\n }\n\n e.preventDefault()\n e.stopPropagation()\n\n const field = e.target as DataGridField\n if (!this._selectBlock) {\n this.setSelectBlock(this.focusedField || field, this.focusedField || field)\n\n return\n }\n\n var { start, end } = this._selectBlock || {}\n\n if (start && end !== field) {\n end = field\n\n this.setSelectBlock(start, end)\n }\n })\n\n this.renderRoot.addEventListener('pointerup', (event: Event) => {\n if ((event as PointerEvent).pointerType !== 'touch') {\n event.preventDefault()\n event.stopPropagation()\n }\n\n this._draggable = false\n })\n\n /*\n * ── 마우스가 지나는 줄을 표시한다 ─────────────────────────────────────\n * 읽기 전용 표에는 지금 어느 줄에 있는지 알려 주는 것이 아무것도 없다. 고치는 표에는 점선 셀\n * 테두리가 그 일을 하지만 읽기 전용에는 그것도 없어서, 칸이 여덟이면 눈이 가로로 가다 줄을 놓친다.\n *\n * 줄에는 감싸는 요소가 없다 — 셀이 각각 격자 항목이다. 그래서 CSS 만으로는 「같은 줄」을 가릴 수\n * 없고, 이미 있는 방식(selected-row)처럼 그 줄의 셀마다 표식을 붙인다.\n *\n * 다시 그리지 않고 속성만 바꾼다. 줄이 바뀔 때마다 몸 전체를 다시 그리면 큰 표에서 눌린다.\n */\n this.renderRoot.addEventListener('pointerover', (event: Event) => {\n if ((event as PointerEvent).pointerType === 'touch') {\n return\n }\n\n const field = (event.target as Element)?.closest?.('ox-grid-field') as DataGridField\n this.setHoveredRow(field ? field.rowIndex : -1)\n })\n\n /*\n * 표를 벗어나면 지운다 — 남겨 두면 마지막 줄이 골라진 것처럼 보인다.\n *\n * **요소에 붙인다.** renderRoot 는 ShadowRoot 이고 pointerleave 는 요소에 가는 사건이라 거기서는\n * 안 먹었다. [재봤음] 표를 벗어난 뒤에도 표식 8개가 남아 있었다. 2026-09-02\n */\n this.addEventListener('pointerleave', () => this.setHoveredRow(-1))\n\n this.renderRoot.addEventListener('click', dataGridBodyClickHandler.bind(this))\n this.renderRoot.addEventListener('dblclick', dataGridBodyDblclickHandler.bind(this))\n this.renderRoot.addEventListener('contextmenu', dataGridBodyContextMenuHandler.bind(this))\n\n this.addEventListener('focus-change', dataGridBodyFocusChangeHandler.bind(this))\n\n requestAnimationFrame(() => {\n // 1. 공백 찌꺼기가 들어갈 수 있으므로 .trim()으로 깔끔하게 처리\n const primaryColor = getComputedStyle(this).getPropertyValue('--md-sys-color-primary').trim()\n // 2. 가독성을 위해 svg 문자열 조립 분리\n const svgString = `<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><rect fill='${primaryColor}' fill-opacity='0.2' x='0' y='0' width='100%' height='100%'/></svg>`\n\n // 3. Hex 코드의 '#' 기호 및 '< >' 괄호들이 파서를 깨뜨리는 것을 완벽 방지하기 위해 전체 인코딩\n const encodedSvg = encodeURIComponent(svgString)\n this.style.setProperty(\n '--focused-background-image',\n // 4. 비표준인 ;utf8 태그를 떼어내고, 인코딩된 SVG 데이터를 주입\n `url(\"data:image/svg+xml,${encodedSvg}\")`\n )\n })\n\n this.addEventListener('show-record-view', (e: Event) =>\n this.popupRecordView((e as CustomEvent).detail as { row: number; record: GristRecord })\n )\n\n this.addEventListener('scroll', function () {\n this.scrollLeft == 0 ? this.removeAttribute('raised') : this.setAttribute('raised', '')\n })\n }\n\n connectedCallback() {\n super.connectedCallback()\n // 헤더가 ox-grist에 디스패치하는 fetch-params-change 이벤트 수신\n this._gridElement = closestElement('ox-grist', this)\n this._gridElement?.addEventListener('fetch-params-change', this._onFetchParamsChange)\n }\n\n disconnectedCallback() {\n if (this._gridElement) {\n this._gridElement.removeEventListener('fetch-params-change', this._onFetchParamsChange)\n }\n super.disconnectedCallback()\n }\n\n // 검색시 스크롤 맨 위로\n _onFetchParamsChange: EventListener = () => {\n this.scrollTop = 0\n }\n\n private _hoveredRow = -1\n\n /** 지나는 줄을 옮긴다. 같은 줄이면 아무것도 하지 않는다. */\n private setHoveredRow(rowIndex: number) {\n if (rowIndex === this._hoveredRow) {\n return\n }\n\n this.markRow(this._hoveredRow, false)\n this.markRow(rowIndex, true)\n\n this._hoveredRow = rowIndex\n }\n\n private markRow(rowIndex: number, on: boolean) {\n if (rowIndex < 0) {\n return\n }\n\n const columns = this.columns.filter(column => !column.hidden).length\n\n /*\n * 한 줄은 칸 수보다 **하나 많은** 자식을 갖는다. 마지막 하나는 남는 폭을 메우는 빈 칸이다\n * (`columnIndex` 가 -1 인 `ox-grid-field` — 위 render 참조).\n *\n * 전에는 칸 수만큼만 돌아서 **그 빈 칸만 색이 안 바뀌었다.** 표가 화면보다 좁으면 줄 오른쪽이\n * 잘려 보인다.\n *\n * `getFieldByIndex` 로는 그 칸에 닿을 수 없다 — 열 번호를 `% columns` 로 감기 때문에 칸 수를\n * 넘기면 0번으로 돌아온다. 그래서 자식을 직접 센다.\n */\n const cells = columns + 1\n const first = rowIndex * cells\n\n for (let index = 0; index < cells; index++) {\n this.renderRoot.children.item(first + index)?.toggleAttribute('hovered-row', on)\n }\n }\n\n getFieldByIndex(rowIndex: number, columnIndex: number, residue: boolean = true) {\n if (rowIndex < 0) {\n return\n }\n\n var columns = this.columns.filter(column => !column.hidden).length\n if (!residue && columnIndex >= columns) {\n return\n }\n\n return this.renderRoot.children.item(\n rowIndex * (columns + 1) /* 1 means last dummy column */ + ((columnIndex + columns) % columns)\n ) as DataGridField\n }\n\n startEditTarget(row: number, column: number, valueWith: string | null = null) {\n var { editable } = this.columns.filter(column => !column.hidden)[column].record\n if (typeof editable === 'function') {\n const curRow = this.data.records[row] || {}\n const curCol = this.columns[column + 1]\n editable = editable.call(this, curRow[curCol.name], curCol, curRow, row, this)\n }\n\n if (!editable) {\n return\n }\n\n if (this.editTarget && this.editTarget.row == row && this.editTarget.column == column) {\n return\n }\n\n /* 에디터 편집 전환 시 IME buffer 정리 */\n this._resetIMEBuffer()\n\n this.editTarget = {\n row,\n column,\n valueWith\n }\n }\n\n shouldUpdate(changes: any) {\n if (!changes.has('editTarget')) {\n /*\n * 큰 변화에 대해서는 실제 update가 발생되기 전에 editTarget을 초기화한다.\n */\n this.editTarget = null\n }\n\n return super.shouldUpdate(changes)\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('focused')) {\n let element = this.renderRoot?.querySelector('[focused]')\n if (!element) {\n return\n }\n\n let { top, left } = calcScrollPos(this, element)\n // TODO this.scroll()을 사용하면, 효과가 좋으나 left 계산에 문제가 있는 것 같음.\n // this.scroll({\n // top,\n // left,\n // behavior: 'smooth'\n // })\n if (top !== undefined) {\n this.scrollTop = top\n }\n if (left !== undefined) {\n this.scrollLeft = left\n }\n\n /* IME buffer 위치 업데이트 */\n this._positionIMEBuffer()\n if (!this.editTarget && this._imeBuffer && !this._lastPointerTouch && this._hasEditableColumn) {\n this._imeBuffer.focus()\n }\n }\n\n // 페이징 바뀌면 스크롤 맨 위로\n if (changes.has('data')) {\n const prevData = changes.get('data') as GristData | undefined\n const prevPage = prevData && (prevData as any).page\n const currPage = (this.data as any).page\n if (prevPage !== undefined && prevPage !== currPage) {\n this.scrollTop = 0\n }\n }\n\n if (this._recordView) {\n this._recordView.record = this.data.records[this._recordViewRow!]\n }\n }\n\n focus() {\n if (this.editTarget) {\n /* 에디터 편집 모드에서는 에디터가 자체적으로 포커스를 관리하므로 간섭하지 않는다 */\n return\n }\n\n if (this._imeBuffer && !this._lastPointerTouch && this._hasEditableColumn) {\n /* 비편집 모드에서는 IME buffer로 포커스 리다이렉트 (터치 시/읽기 전용 그리드에서는 제외) */\n this._positionIMEBuffer()\n this._imeBuffer.focus()\n } else {\n super.focus()\n }\n\n if (this.focused === ZERO_FOCUS) {\n let { records } = this.data\n let row = records.findIndex(record => record['__selected__'])\n\n this.focused = { row: row == -1 ? 0 : row, column: 0 }\n }\n }\n\n popupRecordView({ record, row }: { row: number; record: GristRecord }) {\n var titleField = this.config.list.fields[0] || 'name'\n var title = record[titleField]\n\n /* field가 오브젝트형인 경우에는 렌더러를 타이틀로 사용한다. */\n if (typeof title == 'object') {\n var column = this.config.columns.find(column => column.name == titleField)\n title = column?.record.renderer(title, column, record, row, this /* cautious */)\n }\n\n this._recordViewRow = row\n this._recordView = RecordViewHandler(\n this.config.columns,\n record,\n row,\n this,\n {\n title\n },\n () => {\n delete this._recordView\n delete this._recordViewRow\n }\n )\n }\n\n /* 선택된 셀 블록의 값을 HTML(table)과 plain text(TSV) 두 가지 포맷으로 반환 */\n getSelectedBlockValues(): { html: string; text: string } | undefined {\n var { start, end } = this._selectBlock || {}\n\n if (!(start && end)) {\n start = this.focusedField\n\n end = start\n }\n\n if (start && end) {\n const startRowIndex = start.rowIndex < end.rowIndex ? start.rowIndex : end.rowIndex\n const endRowIndex = start.rowIndex < end.rowIndex ? end.rowIndex : start.rowIndex\n const startColumnIndex = start.columnIndex < end.columnIndex ? start.columnIndex : end.columnIndex\n const endColumnIndex = start.columnIndex < end.columnIndex ? end.columnIndex : start.columnIndex\n\n const columnArray = new Array(endColumnIndex - startColumnIndex + 1).fill(startColumnIndex)\n const columns = this.columns.filter(column => !column.hidden)\n\n /*\n * 클립보드에 두 가지 포맷(text/html, text/plain)을 동시에 저장한다.\n * 붙여넣기하는 앱이 자신이 지원하는 포맷을 골라 읽는다.\n * 생성되는 HTML:\n * <td type=object data-value=\"{&quot;id&quot;:...}\">탈수 절임배추</td>\n * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^\n * 그리드만 읽는 숨겨진 JSON Excel/메모장이 보는 텍스트\n */\n const rows = new Array(endRowIndex - startRowIndex + 1).fill(startRowIndex).map((start, index) => {\n const rowIndex = start + index\n const record = this.data.records[rowIndex]\n\n const cells = columnArray.map((start, index) => {\n const columnIndex = start + index\n const column = columns[columnIndex]\n const value = record?.[column.name]\n const type = typeof value\n\n /* select 타입: value → display 텍스트 미리 계산 (htmlText/plainText 공용) */\n let selectDisplay: any = value\n if (column.type === 'select' && value !== undefined && value !== null) {\n const src = record[column.record?.rowOptionField || ''] ?? column.record\n const options: any[] = Array.isArray(src?.options) ? src.options : []\n const opt = options.find((o: any) => (typeof o === 'string' ? o : String(o?.value ?? '')).trim() === String(value).trim())\n selectDisplay = opt ? (typeof opt === 'string' ? opt : opt.display || opt.name || value) : value\n }\n\n /* htmlText: object는 JSON 문자열로 보존(data-value) → 그리드 붙여넣기 시 복원됨. select는 display 텍스트 */\n const htmlText = value === undefined || value === null ? '' : type == 'object' ? JSON.stringify(value) : column.type === 'select' ? selectDisplay : value\n\n /* plainText: ① null/undefined → renderer ② object → name → renderer ③ select → display ④ 기타 → 값 그대로 */\n let plainText: any = ''\n if (value === undefined || value === null) {\n /* 값이 없지만 renderer가 record의 다른 경로로 텍스트를 표시할 수 있음 */\n if (column.record?.renderer) {\n try {\n const r = column.record.renderer(value, column, record, rowIndex, null as any)\n if (typeof r === 'string') plainText = r\n } catch (e) {}\n }\n } else if (type == 'object') {\n /* object: name 필드가 문자열인 경우 우선, 없으면 renderer */\n const rawName = (value as any)?.name\n plainText = typeof rawName === 'string' ? rawName : ''\n if (!plainText && column.record?.renderer) {\n try {\n const r = column.record.renderer(value, column, record, rowIndex, null as any)\n if (typeof r === 'string') plainText = r\n } catch (e) {}\n }\n } else if (column.type === 'select') {\n plainText = selectDisplay\n } else {\n plainText = value\n }\n\n /* 안전장치: plainText가 object이면 빈 문자열로 대체하여 [object Object] 방지 */\n if (plainText !== null && plainText !== undefined && typeof plainText === 'object') {\n plainText = ''\n }\n\n return { type, htmlText, plainText }\n })\n\n return cells\n })\n\n const escapeHtml = (unsafe: any) => {\n if (unsafe == null) return ''\n return String(unsafe).replace(/[&<>\"']/g, function (m) {\n switch (m) {\n case '&':\n return '&amp;'\n case '<':\n return '&lt;'\n case '>':\n return '&gt;'\n case '\"':\n return '&quot;'\n case \"'\":\n return '&#039;'\n default:\n return m\n }\n })\n }\n\n const html =\n '<table>' +\n rows\n .map(\n cells =>\n '<tr>' +\n cells\n .map(c =>\n c.type == 'object' && c.htmlText\n ? `<td type=${c.type} data-value=\"${escapeHtml(c.htmlText)}\">${escapeHtml(c.plainText)}</td>`\n : `<td type=${c.type}>${escapeHtml(c.htmlText)}</td>`\n )\n .join('') +\n '</tr>'\n )\n .join('') +\n '</table>'\n\n /* 태그 없는 TSV 포맷 (object는 name만) */\n const text = rows.map(cells => cells.map(c => String(c.plainText)).join('\\t')).join('\\n')\n\n return { html, text }\n }\n }\n\n async copy() {\n const copied = this.getSelectedBlockValues()\n if (!copied) return\n\n await navigator.clipboard.write([\n new ClipboardItem({\n 'text/html': new Blob([copied.html], { type: 'text/html' }),\n 'text/plain': new Blob([copied.text], { type: 'text/plain' })\n })\n ])\n\n const selectBlock = this.selectBlock || this.focusedField\n if (selectBlock) {\n const backgroundColor = selectBlock.style.backgroundColor\n const opacity = selectBlock.style.opacity\n\n selectBlock.setAttribute('data-tooltip', 'copied to clipboard!')\n const rect = selectBlock.getBoundingClientRect()\n selectBlock.style.setProperty('--tooltip-top', `${rect.top}px`)\n selectBlock.style.setProperty('--tooltip-left', `${rect.left}px`)\n\n selectBlock.style.backgroundColor = 'red'\n selectBlock.style.opacity = '0.5'\n await sleep(500)\n selectBlock.removeAttribute('data-tooltip')\n selectBlock.style.backgroundColor = backgroundColor\n selectBlock.style.opacity = opacity\n }\n }\n\n async paste() {\n try {\n const selection = window.getSelection()\n\n const clipboardItems = await navigator.clipboard.read()\n if (!clipboardItems) {\n return\n }\n\n var type: string | undefined\n var content: string | undefined\n\n for (const clipboardItem of clipboardItems) {\n try {\n var blob = await clipboardItem.getType('text/html')\n content = blob && (await blob.text())\n type = 'text/html'\n } catch (e) {\n try {\n blob = await clipboardItem.getType('text/plain')\n content = blob && (await blob.text())\n type = 'text/plain'\n } catch (e) {}\n }\n\n break\n }\n\n if (!content) {\n return\n }\n\n /* 붙여넣기 앵커/타겟 영역: 선택 블록이 있으면 좌상단 + 크기, 없으면 포커스 셀 1×1 (엑셀식 반복 채우기용) */\n let { row, column } = this.focused\n let tgtRows = 1\n let tgtCols = 1\n const { start, end } = this._selectBlock || {}\n if (start && end) {\n row = Math.min(start.rowIndex, end.rowIndex)\n column = Math.min(start.columnIndex, end.columnIndex)\n tgtRows = Math.abs(end.rowIndex - start.rowIndex) + 1\n tgtCols = Math.abs(end.columnIndex - start.columnIndex) + 1\n }\n\n const { records } = this.data\n const columns = this.columns.filter(column => !column.hidden)\n\n if (type === 'text/html') {\n const div = document.createElement('div')\n div.innerHTML = content!.trim()\n const table = div.querySelector('table') as HTMLTableElement\n if (!table) {\n return\n }\n\n if (selection) {\n this.resetEdit()\n selection.removeAllRanges()\n\n // 포커스가 빠지기 전에 isWorking으로 focusout 이벤트에 대한 값 변경을 막음\n // (선택 블록이 있는 동안에는 focused 필드가 렌더링되지 않으므로 존재 여부 확인)\n if (this.focusedField) {\n this.focusedField.isWorking = true\n await this.updateComplete\n this.focusedField.isWorking = false\n }\n }\n /* 엑셀식 타일링: 타겟 선택 영역이 소스 크기의 정수배이면 그 차원으로 반복, 아니면 1회 (차원별 독립 판정) */\n const trs = Array.from(table.querySelectorAll('tr')).filter(\n (r): r is HTMLTableRowElement => r instanceof HTMLTableRowElement\n )\n if (!trs.length) {\n return\n }\n const srcRows = trs.length\n const srcCols = Math.max(...trs.map(tr => tr.querySelectorAll('td').length))\n const repeatR = srcRows > 0 && tgtRows % srcRows === 0 ? tgtRows / srcRows : 1\n const repeatC = srcCols > 0 && tgtCols % srcCols === 0 ? tgtCols / srcCols : 1\n\n for (let rowIndex = 0; rowIndex < srcRows * repeatR; rowIndex++) {\n var targetRecord = records[row + rowIndex] || { __dirty__: '+' }\n if (row + rowIndex >= records.length) {\n records.push(targetRecord)\n }\n\n const cells = trs[rowIndex % srcRows].querySelectorAll('td')\n for (let columnIndex = 0; columnIndex < srcCols * repeatC; columnIndex++) {\n const item = cells[columnIndex % srcCols]\n if (!item) continue /* ragged row 방어 */\n const targetColumn = columns[column + columnIndex]\n if (!targetColumn || targetColumn.gutterName) continue /* 그리드 범위 밖 열 방어 / gutter 방어 */\n /* data-value 속성이 있으면 우선 사용 (그리드에서 복사한 object 데이터 복원용) */\n let value = (item.dataset.value || item.textContent) as any\n const sourceType = item.getAttribute('type') || 'string'\n let type = targetColumn.type || sourceType\n type = type.includes('object') ? 'object' : type // 오브젝트 타입 예외처리\n let { editable } = targetColumn.record\n if (typeof editable === 'function') {\n editable = editable.call(this, value, targetColumn, targetRecord, row, this)\n }\n\n if (value) {\n switch (type) {\n case 'object':\n // 오브젝트가 전부 빈값이면 ''로 치환\n try {\n value = JSON.parse(value || '{}')\n value = Object.values(value).every(v => (typeof v === 'string' ? v.trim() === '' : isEmpty(v)))\n ? null\n : value\n } catch (err) {\n value = null\n }\n break\n case 'parameters':\n try {\n value = JSON.parse(value || 'null')\n } catch (err) {\n value = null\n }\n break\n case 'boolean':\n case 'checkbox':\n value = !!value && !!String(value).match(/true/i)\n break\n case 'number':\n case 'float':\n case 'integer':\n case 'progress':\n value = parseToNumberOrNull(value)\n break\n case 'string':\n try {\n const parsed = JSON.parse(value)\n /* 오브젝트를 문자열 셀에 붙여넣을 때 셀의 표시 텍스트(textContent) 우선 사용 */\n if (typeof parsed === 'object' && parsed !== null) {\n value = item.textContent?.trim() || (parsed as any).name || ''\n } else {\n value = String(parsed).trim()\n }\n } catch (err) {}\n break\n case 'select':\n /* select 타입: 붙여넣은 텍스트를 옵션의 display/value와 매칭하여 value로 변환 */\n value = resolveSelectPasteValue(String(value), targetColumn, targetRecord)\n break\n default:\n /* 원본이 string 으로 복사된 값(color-map 등 JSON 문자열 저장 타입)은\n 파싱하지 않고 문자열 그대로 유지 */\n if (sourceType === 'string' && !item.dataset.value) {\n value = value?.trim()\n } else {\n try {\n value = JSON.parse(value)\n } catch (err) {\n if (type === 'json' || type.includes('object')) value = null\n }\n }\n }\n } else {\n /* 기존 레코드(id 있음)는 명시적으로 비우기 위해 null, 신규 레코드는 default value 적용을 위해 undefined */\n value = targetRecord.id ? null : undefined\n }\n\n if (targetColumn && !targetColumn.gutterName && editable) {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: targetRecord[targetColumn.name],\n after: value,\n column: targetColumn,\n record: targetRecord,\n row: row + rowIndex\n }\n })\n )\n }\n }\n }\n\n return\n } else if (type === 'text/plain') {\n /* TSV 포맷 파싱: 줄바꿈으로 행 분리, 탭으로 열 분리 (엑셀 등 외부 소스 붙여넣기 지원) */\n /* CRLF 정규화 + 마지막 빈 줄 제거 (엑셀 TSV는 개행으로 끝남 — 빈 행이 소스 크기 판정을 깨뜨림) */\n const tsvRows = content\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\n$/, '')\n .split('\\n')\n .map(line => line.split('\\t'))\n if (!tsvRows.length) {\n return\n }\n\n /* 엑셀식 타일링: 타겟 선택 영역이 소스 크기의 정수배이면 그 차원으로 반복, 아니면 1회 (차원별 독립 판정) */\n const srcRows = tsvRows.length\n const srcCols = Math.max(...tsvRows.map(r => r.length))\n const repeatR = srcRows > 0 && tgtRows % srcRows === 0 ? tgtRows / srcRows : 1\n const repeatC = srcCols > 0 && tgtCols % srcCols === 0 ? tgtCols / srcCols : 1\n\n for (let rowOffset = 0; rowOffset < srcRows * repeatR; rowOffset++) {\n const targetRowIndex = row + rowOffset\n var targetRecord = records[targetRowIndex] || { __dirty__: '+' }\n if (targetRowIndex >= records.length) {\n records.push(targetRecord)\n }\n\n const tsvCells = tsvRows[rowOffset % srcRows]\n for (let colOffset = 0; colOffset < srcCols * repeatC; colOffset++) {\n const cellValue = tsvCells[colOffset % srcCols] ?? '' /* ragged row 방어 */\n const targetColumn = columns[column + colOffset]\n if (!targetColumn || targetColumn.gutterName) continue\n\n let { editable } = targetColumn.record\n if (typeof editable === 'function') {\n editable = editable.call(this, cellValue, targetColumn, targetRecord, targetRowIndex, this)\n }\n\n if (editable) {\n /* select 타입: 붙여넣은 텍스트를 옵션의 display/value와 매칭하여 value로 변환 */\n /* 빈값: 기존 레코드(id 있음)는 명시적으로 비우기 위해 null, 신규 레코드는 default value 적용을 위해 undefined */\n let resolvedValue: any = cellValue || (targetRecord.id ? null : undefined)\n if (targetColumn.type === 'select' && cellValue) {\n resolvedValue = resolveSelectPasteValue(cellValue, targetColumn, targetRecord)\n }\n\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: targetRecord[targetColumn.name],\n after: resolvedValue,\n column: targetColumn,\n record: targetRecord,\n row: targetRowIndex\n }\n })\n )\n }\n }\n }\n }\n } catch (e) {\n console.log('e : ', e)\n } finally {\n /* paste 완료 후 포커스를 그리드로 복원 */\n this.focus()\n }\n }\n\n setSelectBlock(start?: DataGridField, end?: DataGridField) {\n if (start?.columnIndex == -1) {\n start = this.getFieldByIndex(start.rowIndex, this.columns.filter(column => !column.hidden).length - 1)\n }\n\n if (end?.columnIndex == -1) {\n end = this.getFieldByIndex(end.rowIndex, this.columns.filter(column => !column.hidden).length - 1)\n }\n\n this._selectBlock = start && { start, end }\n\n if (start && end) {\n window.getSelection()?.removeAllRanges()\n\n if (start !== end) {\n const left = start.columnIndex < end.columnIndex ? start : end\n const right = left === start ? end : start\n const top = start.rowIndex < end.rowIndex ? start : end\n const bottom = top === start ? end : start\n\n const { offsetLeft } = left\n const { offsetTop } = top\n const width = right.offsetLeft - offsetLeft + right.offsetWidth\n const height = bottom.offsetTop - offsetTop + bottom.offsetHeight\n\n this.style.setProperty('--select-box-left', offsetLeft - 1 + 'px')\n this.style.setProperty('--select-box-top', offsetTop - 1 + 'px')\n this.style.setProperty('--select-box-width', width + 'px')\n this.style.setProperty('--select-box-height', height + 'px')\n }\n\n this.focus()\n }\n }\n\n buildAccumulatorRecord(): GristRecord {\n var columns = this.columns.filter(column => !column.hidden)\n\n return columns.reduce((record, column) => {\n if (column.accumulator) {\n record[column.name] = accumulate(this.data, column, column.accumulator)\n }\n return record\n }, {} as GristRecord)\n }\n\n /** IME buffer를 포커스된 셀 위에 위치시킨다 */\n private _positionIMEBuffer() {\n const focusedEl = this.renderRoot?.querySelector('[focused]') as HTMLElement\n if (focusedEl && this._imeBuffer) {\n this._imeBuffer.style.left = focusedEl.offsetLeft + 'px'\n this._imeBuffer.style.top = focusedEl.offsetTop + 'px'\n this._imeBuffer.style.width = focusedEl.offsetWidth + 'px'\n this._imeBuffer.style.height = focusedEl.offsetHeight + 'px'\n }\n }\n\n /** IME buffer 값을 field-change 이벤트로 커밋한다 */\n _commitIMEBuffer(row: number, column: number) {\n const text = this._imeBuffer?.value\n this._resetIMEBuffer()\n\n if (!text) return\n\n const columns = this.columns.filter(c => !c.hidden)\n const col = columns[column]\n if (!col || col.gutterName) return\n\n const record = this.data.records[row] || { __dirty__: '+' }\n\n let { editable } = col.record\n if (typeof editable === 'function') {\n editable = editable.call(this, record[col.name], col, record, row, this)\n }\n if (!editable) return\n\n /* 타입에 따른 값 변환 */\n let value: any = text\n switch (col.type) {\n case 'number':\n case 'float':\n case 'integer':\n case 'progress':\n value = parseToNumberOrNull(text)\n if (value === null) return\n break\n case 'boolean':\n case 'checkbox':\n return /* boolean은 키보드 텍스트 입력으로 편집 불가 */\n }\n\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: record[col.name],\n after: value,\n column: col,\n record,\n row\n }\n })\n )\n }\n\n /** IME buffer 취소 (값 버리기) */\n _discardIMEBuffer() {\n this._resetIMEBuffer()\n }\n\n /** IME buffer 초기화 */\n private _resetIMEBuffer() {\n if (this._imeBuffer) {\n this._imeBuffer.value = ''\n this._imeBuffer.classList.remove('active')\n }\n this._imeEditing = false\n this._imeComposing = false\n }\n}\n"]}
@@ -58,8 +58,21 @@ let DataGridField = class DataGridField extends LitElement {
58
58
  }
59
59
  }
60
60
  if (changes.has('column')) {
61
+ /*
62
+ * 정렬은 **넣을 때만이 아니라 되돌릴 때도** 손대야 한다.
63
+ *
64
+ * 이 요소는 재사용된다. 전에는 기본값이 아닐 때만 인라인 값을 넣고 지우지 않았다. 그래서 한 번
65
+ * 오른쪽 정렬 칸을 그린 셀이 다음에 왼쪽 정렬 칸을 그려도 오른쪽에 남았다.
66
+ *
67
+ * [재봤음] 품질 화면 「판단」 칸에서 머리글은 x=380(왼쪽)인데 값은 x=452(flex-end)였다. 숫자 칸을
68
+ * 오른쪽으로 바꾼 뒤 드러났다 — 오른쪽 정렬 칸이 드물던 동안은 눈에 안 띄었다. 2026-09-02
69
+ */
61
70
  var align = this.column.record.align || DEFAULT_TEXT_ALIGN;
62
- if (align != DEFAULT_TEXT_ALIGN) {
71
+ if (align == DEFAULT_TEXT_ALIGN) {
72
+ this.style.removeProperty('--data-grid-field-justify-content');
73
+ this.style.removeProperty('--data-grid-field-text-align');
74
+ }
75
+ else {
63
76
  let justify = 'center';
64
77
  switch (align) {
65
78
  case 'right':
@@ -204,6 +217,152 @@ DataGridField.styles = [
204
217
  font-weight: 640;
205
218
  }
206
219
 
220
+ /*
221
+ * 값과 표식을 한 줄에 담는 자리 — **간격과 높이를 여기서 잡는다.**
222
+ *
223
+ * 처음에는 :not(.pill) + .pill { margin-left } 로 띄우려 했는데 안 걸렸다. 렌더러가 값을
224
+ * 텍스트 노드로 내므로 알약의 앞 형제가 **요소가 아니고**, CSS 형제 선택자는 텍스트 노드를 보지
225
+ * 못한다. 알약이 첫 요소이기도 해서 :first-child 로도 가려지지 않는다(실측 확인).
226
+ *
227
+ * 높이도 같은 자리에서 잡는다. baseline 으로 두면 14px 글자와 11.5px 알약의 기준선을 맞추느라
228
+ * 알약이 내려앉는다.
229
+ */
230
+ /* 값이 있지만 눈에 걸릴 것은 아닌 것 — 「보통」 같은 기본값. .none(값 없음)과 구별한다. */
231
+ .quiet {
232
+ color: var(--ui-muted, #57676f);
233
+ }
234
+
235
+ /*
236
+ * 별 같은 작은 기호를 글자 크기로 맞춘다. md-icon 의 기본은 24px 이라 줄 높이를 밀어낸다.
237
+ * 색은 물려받는다 — 개수가 크기를 말하고 색은 담는 쪽이 정한다.
238
+ */
239
+ .star {
240
+ --md-icon-size: 15px;
241
+ font-size: 15px;
242
+ width: 15px;
243
+ height: 15px;
244
+ color: inherit;
245
+ }
246
+
247
+ /* 별처럼 여럿이 붙는 기호는 사이를 좁게 — 낱말 사이의 6px 은 여기서 너무 넓다. */
248
+ .line:has(.star) {
249
+ gap: 1px;
250
+ }
251
+
252
+ /*
253
+ * 셀 안의 아이콘 단추 — 그 줄에 하는 동작(들어가기 · 열기)을 담는다.
254
+ *
255
+ * 셀의 클릭 경로를 타지 않고 스스로 받으려는 렌더러가 쓴다. 그 경로에는 동작이 견딜 수 없는 관문이
256
+ * 둘 있다.
257
+ *
258
+ * data-grid-body-click-handler.ts if (this.editTarget) return
259
+ * data-grid-body-click-handler.ts (e.target).closest("ox-grid-field")
260
+ *
261
+ * 앞은 다른 칸이 편집 중이면 첫 누름을 먹고, 뒤는 셀 경계를 스치면 칸을 못 찾는다. 진짜 button 을
262
+ * 그리면 둘을 다 피하고 키보드로도 닿는다.
263
+ *
264
+ * 이 규칙이 여기 있는 이유: 렌더러의 결과는 이 셀의 그림자 안에 그려지므로 **페이지의 스타일이
265
+ * 닿지 않는다.** 셀 안의 어휘는 셀이 갖는다.
266
+ *
267
+ * host 자식으로 적은 이유: 이 파일 아래의 host 자식 button 규칙이 채운 단추를 그리고, 특이도가
268
+ * 같으면 **뒤에 오는 쪽이 이긴다.** 그것 없이 두면 이 단추가 채운 단추의 모양으로 나왔다
269
+ * (어두운 바탕 · 흰 글자, 실측 rgb(38, 46, 56)).
270
+ *
271
+ * 둘의 뜻이 다르다 — 채운 단추는 **저지르는 동작**, 이 단추는 **옮겨 가기**다. 그래서 평소에는
272
+ * 흐리고 배경이 없다.
273
+ *
274
+ * 배경은 **칸을 채우지 않고 동그라미로** 든다. 칸을 다 채우면 「이 셀이 골라졌다」로 읽힌다 —
275
+ * 표에서 채워진 사각형은 선택의 뜻이다. 동그라미는 단추의 뜻이다.
276
+ */
277
+ :host > button.icon {
278
+ display: inline-flex;
279
+ align-items: center;
280
+ justify-content: center;
281
+ width: 26px;
282
+ height: 26px;
283
+ flex: none;
284
+ /*
285
+ * 누를 자리는 26px 로 두되 **줄 높이는 밀지 않는다.**
286
+ *
287
+ * 이 단추가 든 칸 하나 때문에 표의 모든 줄이 46px 이 됐다(글자만 있는 줄은 38px). 스무 줄이면
288
+ * 240px 을 잃는다. [재봤음] grid-template-rows: 46px 34px
289
+ *
290
+ * 그렇다고 26px 아래로 줄이면 손가락으로 못 누른다(가로세로 24px 이 최소다). 그래서 상자는 26px
291
+ * 로 두고 위아래 3px 씩을 여백에서 되돌려, 자리는 20px 만 차지하게 한다 — 글자 한 줄과 같다.
292
+ */
293
+ margin-top: -3px;
294
+ margin-bottom: -3px;
295
+ border: none;
296
+ border-radius: 50%;
297
+ background: transparent;
298
+ padding: 0;
299
+ color: var(--ui-faint, #8a959c);
300
+ cursor: pointer;
301
+ transition:
302
+ background-color 0.12s ease,
303
+ color 0.12s ease;
304
+ }
305
+
306
+ :host > button.icon:hover {
307
+ background-color: var(--ui-hover, rgba(0, 0, 0, 0.06));
308
+ color: var(--ui-ink, #17272f);
309
+ }
310
+
311
+ :host > button.icon:active {
312
+ background-color: var(--ui-active, rgba(0, 0, 0, 0.12));
313
+ }
314
+
315
+ /* 키보드로 온 초점만 테를 보인다 — 눌러서 온 초점에는 보이지 않는다. */
316
+ :host > button.icon:focus-visible {
317
+ outline: 2px solid var(--ui-accent, #00727e);
318
+ outline-offset: -2px;
319
+ }
320
+
321
+ /*
322
+ * 값을 함께 담는 단추 — 「4 ›」처럼 숫자와 화살이 나란히 선다.
323
+ *
324
+ * 아이콘만으로는 그 줄에 무엇이 있는지 말하지 못한다. 값이 뜻을 나르고 화살이 「누를 수 있다」를
325
+ * 말한다. 그래서 동그라미가 아니라 알약 모양이다.
326
+ */
327
+ :host > button.icon.wide {
328
+ width: auto;
329
+ min-width: 44px;
330
+ gap: 0;
331
+ padding: 0 2px 0 7px;
332
+ border-radius: 999px;
333
+ font: inherit;
334
+ font-size: var(--grid-record-wide-fontsize);
335
+ font-variant-numeric: tabular-nums;
336
+ }
337
+
338
+ :host > button.icon.wide md-icon {
339
+ --md-icon-size: 16px;
340
+ font-size: 16px;
341
+ width: 16px;
342
+ height: 16px;
343
+ }
344
+
345
+ :host > button.icon md-icon {
346
+ --md-icon-size: 18px;
347
+ font-size: 18px;
348
+ width: 18px;
349
+ height: 18px;
350
+ }
351
+
352
+ .line {
353
+ display: flex;
354
+ align-items: center;
355
+ gap: 6px;
356
+ min-width: 0;
357
+ }
358
+
359
+ /* 값이 길면 값이 줄고 표식은 그대로 남는다 — 표식이 먼저 잘리면 읽을 수 없다. */
360
+ .line > :first-child {
361
+ overflow: hidden;
362
+ text-overflow: ellipsis;
363
+ white-space: nowrap;
364
+ }
365
+
207
366
  /* 표식 — 상태 같은 짧은 값에 두른다. 점이 색을 나르고 글자가 뜻을 나른다. */
208
367
  .pill {
209
368
  display: inline-flex;