@operato/data-grist 10.29.5 โ†’ 10.29.7

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.
Files changed (40) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/coverage/lcov-report/index.html +40 -40
  3. package/coverage/lcov-report/webpack/bootstrap.html +1 -1
  4. package/coverage/lcov-report/webpack/index.html +1 -1
  5. package/coverage/lcov-report/webpack/runtime/define property getters.html +1 -1
  6. package/coverage/lcov-report/webpack/runtime/global.html +1 -1
  7. package/coverage/lcov-report/webpack/runtime/hasOwnProperty shorthand.html +1 -1
  8. package/coverage/lcov-report/webpack/runtime/index.html +1 -1
  9. package/coverage/lcov-report/webpack/runtime/make namespace object.html +1 -1
  10. package/coverage/lcov.info +30482 -30377
  11. package/dist/src/data-card/data-card-field.js +3 -0
  12. package/dist/src/data-card/data-card-field.js.map +1 -1
  13. package/dist/src/data-grid/data-grid-accum-field.js +4 -0
  14. package/dist/src/data-grid/data-grid-accum-field.js.map +1 -1
  15. package/dist/src/data-grid/data-grid-body-style.js +2 -10
  16. package/dist/src/data-grid/data-grid-body-style.js.map +1 -1
  17. package/dist/src/data-grid/data-grid-body.d.ts +1 -0
  18. package/dist/src/data-grid/data-grid-body.js +20 -9
  19. package/dist/src/data-grid/data-grid-body.js.map +1 -1
  20. package/dist/src/data-grid/data-grid-field.d.ts +1 -0
  21. package/dist/src/data-grid/data-grid-field.js +29 -1
  22. package/dist/src/data-grid/data-grid-field.js.map +1 -1
  23. package/dist/src/data-grid/data-grid-header.js +5 -10
  24. package/dist/src/data-grid/data-grid-header.js.map +1 -1
  25. package/dist/src/data-grid/data-grid.d.ts +2 -1
  26. package/dist/src/data-grid/data-grid.js +72 -20
  27. package/dist/src/data-grid/data-grid.js.map +1 -1
  28. package/dist/test/accessible-name.test.js +6 -4
  29. package/dist/test/accessible-name.test.js.map +1 -1
  30. package/dist/test/field-contains-content.test.d.ts +1 -0
  31. package/dist/test/field-contains-content.test.js +101 -0
  32. package/dist/test/field-contains-content.test.js.map +1 -0
  33. package/dist/test/grid-single-scroller.test.d.ts +1 -0
  34. package/dist/test/grid-single-scroller.test.js +107 -0
  35. package/dist/test/grid-single-scroller.test.js.map +1 -0
  36. package/dist/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +2 -2
  38. package/test/accessible-name.test.ts +6 -4
  39. package/test/field-contains-content.test.ts +125 -0
  40. package/test/grid-single-scroller.test.ts +150 -0
@@ -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 { i18next } from '@operato/i18n'\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'\nimport { columnText } from '../utils/column-text.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 /*\n * โ”€โ”€ ๊ณ ์ • ์—ด์˜ ๋ถˆํˆฌ๋ช…์€ **๋’ค์— ์ธต์„ ๊น”์•„์„œ ์ง€ํ‚ฌ ์ˆ˜ ์—†๋‹ค** โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n *\n * ์ด ์นธ์€ ์Šคํฌ๋กค๋˜๋Š” ์—ด ์œ„์— ๋–  ์žˆ์–ด์„œ(position: sticky) ํˆฌ๋ช…ํ•ด์ง€๋ฉด ๊ทธ ์•„๋ž˜๊ฐ€ ๋น„์นœ๋‹ค.\n * ๊ทธ๋ž˜์„œ ํ•œ๋•Œ ์—ฌ๊ธฐ์— ์ด๋Ÿฐ ๊ฒƒ์„ ๋‘์—ˆ๋‹ค.\n *\n * [fixed]::before { position:absolute; inset:0; background-color: โ€ฆ; z-index:-1 }\n *\n * **์•ˆ ๋œ๋‹ค.** ์Œ์ˆ˜ z-index ์ž์‹์€ ์ž๊ธฐ ์š”์†Œ์˜ **๋ฐฐ๊ฒฝ ์œ„์—** ๊ทธ๋ ค์ง„๋‹ค(์นธ์˜ ๊ธ€์ž ์•„๋ž˜์ผ\n * ๋ฟ์ด๋‹ค). ๊ทธ๋ž˜์„œ ๊ทธ ์ธต์ด ์ค„ ์ƒํƒœ์˜ ์ƒ‰์„ ๋ฎ์—ˆ๊ณ , ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฐ ์ค„์˜ ๋ ๊ฐ€ ๊ณ ์ • ์—ด์—์„œ๋งŒ\n * ์‚ฌ๋ผ์กŒ๋‹ค. ๊ทธ๋•Œ ๋‚˜๋Š” ๊ณ„์‚ฐ๋œ background-color ๋ฅผ ์žฌ๊ณ  ใ€Œ๊ฐ™์€ ์ƒ‰์ด๋‹คใ€๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ, ์žฌ์•ผ\n * ํ–ˆ๋˜ ๊ฒƒ์€ **์น ํ•ด์ง„ ๊ฒƒ**์ด์—ˆ๋‹ค.\n *\n * ๋ถˆํˆฌ๋ช…์€ ๋‹ค๋ฅธ ๋ฐ์„œ ์ง€ํ‚จ๋‹ค โ€” **์ค„ ์ƒํƒœ ์ƒ‰์„ transparent ๋กœ ๋‘์ง€ ์•Š๋Š” ๊ฒƒ**์ด๋‹ค. ๊ทธ ๊ฐ’์€\n * ใ€Œ์น ํ•˜์ง€ ์•Š๋Š”๋‹คใ€๊ฐ€ ์•„๋‹ˆ๋ผ ใ€Œ์นธ์˜ ๋ฐ”ํƒ•์„ ์ง€์šด๋‹คใ€์ด๊ณ , ์ง€์›Œ์ง„ ์ž๋ฆฌ์—๋Š” ๋’ค๊ฐ€ ๋น„์นœ๋‹ค.\n * ๊ณ ์น˜๋Š” ํ‘œ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋‘์—ˆ๋˜ ๊ฒƒ์„ ๊ฑท์—ˆ๋‹ค(data-grid.ts).\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 /**\n * Where this body's first row sits in the whole table, counting from 1.\n *\n * It combines header row count and page offset, so ox-grid computes it and passes it down โ€”\n * working it out here would mean the body has to know whether the header is one row or two.\n */\n @property({ type: Number }) ariaRowIndexBase: number = 2\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 * Only emit aria-selected where rows can actually be selected.\n *\n * The attribute means \"selectable, currently not selected\", so putting false on every row of a\n * grid without selection announces a control that is not there. Whether selection exists is\n * something the grid already knows: it has a row-selector gutter or it does not.\n */\n const selectable = columns.some(column => column.gutterName === 'row-selector')\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 /*\n * aria-rowindex is the position in the whole table, not within the page on screen. The first\n * row of page 2 is row 22, not row 1 again โ€” otherwise every page turn resets the count and\n * there is no way to tell how far through the data you are.\n *\n * Header rows count too, from 1. With a grouped header that is two rows, so the body starts\n * at 3.\n */\n const rowIndexBase = this.ariaRowIndexBase\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 <div\n grid-row\n role=\"row\"\n aria-rowindex=${rowIndexBase + idxRow}\n aria-selected=${ifDefined(selectable ? !!attrSelected : undefined)}\n >\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-field\n id=${'cell-' + idxRow + '-' + idxColumn}\n role=\"gridcell\"\n aria-colindex=${idxColumn + 1}\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 <!--\n Width filler โ€” nothing to read. It stays inside the row so hover and selection colour it\n with the rest, but it is not counted as a cell.\n -->\n <ox-grid-field\n role=\"presentation\"\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 </div>\n `\n })}\n ${accumulator\n ? html`\n <div grid-row role=\"row\" aria-rowindex=${rowIndexBase + records.length}>\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-accum-field\n role=\"gridcell\"\n aria-colindex=${idxColumn + 1}\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 role=\"presentation\"\n .data=${data}\n .columnIndex=${-1}\n .rowIndex=${records.length}\n .record=${accumRecord!}\n ></ox-grid-accum-field>\n </div>\n `\n : nothing}\n ${start && end && start !== end ? html` <div select-block></div> ` : html``}\n <!--\n This input takes the grid's keystrokes. Focus rests here until a cell opens for editing, and\n IME composition builds up in it โ€” this is where focus actually lives.\n\n It had no name. opacity: 0 makes that look harmless, but invisible is not the same as absent:\n it receives focus and receives text, so a screen reader reads it. Unnamed, it reads as one\n \"edit text\" and never changes, no matter how far the arrow keys travel โ€” there is no way to\n tell which cell you are on.\n\n aria-hidden is not the fix. Hiding the thing that holds focus makes focus vanish into\n nothing. Instead of hiding it, name it after the cell it currently stands in for.\n -->\n <input\n id=\"ime-buffer\"\n type=\"text\"\n aria-label=${this._imeBufferLabel(columns[focusedColumn as number])}\n aria-activedescendant=${ifDefined(\n focusedRow! >= 0 && focusedColumn! >= 0 ? `cell-${focusedRow}-${focusedColumn}` : undefined\n )}\n />\n <slot></slot>\n `\n }\n\n firstUpdated() {\n // TODO issue #13\n // this.addEventListener('scroll', this.handleOnScroll.bind(this))\n\n /* ์นธ์˜ ํŒ์—… ํ‘œ์‹์„ ๋ˆ„๋ฅด๋ฉด ๊ทธ ์นธ์˜ ํŽธ์ง‘์„ ์—ฐ๋‹ค(onStartEdit). */\n this.addEventListener('start-edit', this.onStartEdit.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 /**\n * One row โ€” the element holding that row's cells.\n *\n * This used to index `renderRoot.children` at `rowIndex * (columns + 1)`, where the +1 was the\n * width filler; the comment above it existed to explain why that arithmetic was necessary. The\n * code only worked while the count stayed correct.\n *\n * Rows are real elements now (role=row), so there is nothing to count.\n */\n private rowElementAt(rowIndex: number): HTMLElement | null {\n if (rowIndex < 0) {\n return null\n }\n\n return this.renderRoot?.querySelectorAll('div[grid-row]').item(rowIndex) as HTMLElement | null\n }\n\n private markRow(rowIndex: number, on: boolean) {\n const row = this.rowElementAt(rowIndex)\n\n if (!row) {\n return\n }\n\n /*\n * Mark every cell in the row, width filler included. It used to be left out, so on a grid\n * narrower than the viewport the right end of the row stayed uncoloured.\n */\n Array.from(row.children).forEach(cell => cell.toggleAttribute('hovered-row', on))\n }\n\n getFieldByIndex(rowIndex: number, columnIndex: number, residue: boolean = true) {\n const row = this.rowElementAt(rowIndex)\n\n if (!row) {\n return\n }\n\n var columns = this.columns.filter(column => !column.hidden).length\n if (!residue && columnIndex >= columns) {\n return\n }\n\n /* Column index wraps: moving right from the last column returns to the first (residue). */\n return row.children.item((columnIndex + columns) % columns) as DataGridField\n }\n\n /**\n * ์นธ์˜ **ํŒ์—… ํ‘œ์‹**์„ ๋ˆŒ๋ €๋‹ค โ€” ๊ทธ ์นธ์˜ ํŽธ์ง‘์„ ์—ฐ๋‹ค.\n *\n * ๋”๋ธ”ํด๋ฆญ๊ณผ ๊ฐ™์€ ์ž๋ฆฌ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ํ‘œ์‹์€ ํ•œ ๋ฒˆ ๋ˆ„๋ฅด๋Š” 22px ํ‘œ์ ์ด๊ณ , 33px ์ค„์—์„œ ๋”๋ธ”ํด๋ฆญ์„\n * ๊ฒจ๋ˆ„๋Š” ๊ฒƒ๋ณด๋‹ค ์‰ฝ๋‹ค. ๋”๋ธ”ํด๋ฆญ๋„ ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค โ€” ์ด๋ฏธ ์•„๋Š” ์‚ฌ๋žŒ์˜ ๊ธธ์„ ๋ง‰์ง€ ์•Š๋Š”๋‹ค.\n */\n private onStartEdit(e: Event) {\n const { row, column } = (e as CustomEvent).detail || {}\n\n if (isNaN(row) || isNaN(column)) {\n return\n }\n\n this.startEditTarget(row, column)\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 /* ์—‘์…€์‹ ํƒ€์ผ๋ง: ํƒ€๊ฒŸ ์„ ํƒ ์˜์—ญ์ด ์†Œ์Šค ํฌ๊ธฐ์˜ ์ •์ˆ˜๋ฐฐ์ด๋ฉด ๊ทธ ์ฐจ์›์œผ๋กœ ๋ฐ˜๋ณตํ•˜๊ณ , ์•„๋‹ˆ๋ฉด ํ•œ ๋ฒˆ๋งŒ ๋ถ™์—ฌ ๋„ฃ๋Š”๋‹ค (์ฐจ์›๋งˆ๋‹ค ๋”ฐ๋กœ ํŒ๋‹จ) */\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 /* ์—‘์…€์‹ ํƒ€์ผ๋ง: ํƒ€๊ฒŸ ์„ ํƒ ์˜์—ญ์ด ์†Œ์Šค ํฌ๊ธฐ์˜ ์ •์ˆ˜๋ฐฐ์ด๋ฉด ๊ทธ ์ฐจ์›์œผ๋กœ ๋ฐ˜๋ณตํ•˜๊ณ , ์•„๋‹ˆ๋ฉด ํ•œ ๋ฒˆ๋งŒ ๋ถ™์—ฌ ๋„ฃ๋Š”๋‹ค (์ฐจ์›๋งˆ๋‹ค ๋”ฐ๋กœ ํŒ๋‹จ) */\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 /**\n * Which cell the IME buffer currently stands in for โ€” the name a screen reader reads.\n *\n * The name comes from the column definition alone (columnText). When focus is on no cell, or the\n * column yields no name, it falls back to \"cell input\" โ€” no invented name, and no empty one.\n */\n private _imeBufferLabel(column?: ColumnConfig): string {\n const name = columnText(column)\n\n return name\n ? i18next.t('text.grid-cell-input', { name, defaultValue: name })\n : i18next.t('text.grid-cell-input-plain', { defaultValue: 'cell input' })\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":";AAAA,OAAO,sBAAsB,CAAA;AAC7B,OAAO,4BAA4B,CAAA;AAEnC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAkB,MAAM,KAAK,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AACxD,OAAO,QAAQ,MAAM,uBAAuB,CAAA;AAC5C,OAAO,OAAO,MAAM,sBAAsB,CAAA;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE3E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,sDAAsD;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kDAAkD,CAAA;AAC3F,OAAO,EAAE,2BAA2B,EAAE,MAAM,qDAAqD,CAAA;AACjG,OAAO,EAAE,8BAA8B,EAAE,MAAM,yDAAyD,CAAA;AACxG,OAAO,EAAE,8BAA8B,EAAE,MAAM,wDAAwD,CAAA;AACvG,OAAO,EAAE,0BAA0B,EAAE,MAAM,oDAAoD,CAAA;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAE1D,MAAM,SAAS,GAAG,GAAG,CAAA;AACrB,MAAM,YAAY,GAAG,CAAC,CAAA;AACtB,MAAM,UAAU,GAAG,EAAE,CAAA;AACrB,MAAM,QAAQ,GAAG,CAAC,CAAA;AAElB;;;GAGG;AACH,SAAS,aAAa,CAAC,MAAmB,EAAE,KAAc,EAAE,SAAS,GAAG,CAAC;IACvE,oFAAoF;IACpF,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAA;IAChF,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAA;IACjF,EAAE,IAAI,SAAS,CAAA;IACf,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IACtC,IAAI,cAAc,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAA;IAC5D,IAAI,eAAe,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAA;IAE/D,OAAO;QACL,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,SAAS;QACtG,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,SAAS;KACrG,CAAA;AACH,CAAC;AAED,8DAA8D;AAC9D,SAAS,uBAAuB,CAAC,IAAY,EAAE,MAAoB,EAAE,MAAmB;;IACtF,MAAM,cAAc,GAAG,MAAM,CAAC,CAAA,MAAA,MAAM,CAAC,MAAM,0CAAE,cAAc,KAAI,EAAE,CAAC,CAAA;IAClE,IAAI,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAA;IAE5E,wEAAwE;IACxE,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,GAAI,OAAoB,EAAE,CAAA;QACnC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;IACnC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAA;IAE9B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,OAAO;gBAAE,OAAO,GAAG,CAAA;QACxC,CAAC;aAAM,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,MAAM,CAAE,GAAW,CAAC,OAAO,IAAK,GAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;YAC9E,MAAM,GAAG,GAAG,MAAM,CAAC,MAAC,GAAW,CAAC,KAAK,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;YACnD,IAAI,OAAO,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO;gBAAE,OAAQ,GAAW,CAAC,KAAK,CAAA;QACvE,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,GAAG;IACjB,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,CAAC;CACV,CAAA;AAGM,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU;IAArC;;QACL,aAAQ,GAAG,QAAQ,CAAC,CAAC,SAAiB,EAAE,YAAoB,EAAE,EAAE;;YAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAA;YACxE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,GAAG,cAAc,GAAG,YAAY,CAAC,CAAA;YACzG,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA,MAAA,IAAI,CAAC,IAAI,CAAC,OAAO,0CAAE,MAAM,KAAI,CAAC,EAAE,IAAI,GAAG,cAAc,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAEnG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;YAChB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;QACd,CAAC,EAAE,SAAS,CAAC,CAAA;QAqHe,WAAM,GAAgB,WAAW,CAAA;QAClC,YAAO,GAAmB,EAAE,CAAA;QAC3B,SAAI,GAAc,SAAS,CAAA;QAC3B,YAAO,GAAoC,UAAU,CAAA;QACjF;;;;;WAKG;QACyB,qBAAgB,GAAW,CAAC,CAAA;QAC5B,eAAU,GAAqE,IAAI,CAAA;QACnF,SAAI,GAAG,CAAC,CAAC,CAAA;QACT,OAAE,GAAG,CAAC,CAAC,CAAA;QACR,eAAU,GAAa,EAAE,CAAA;QAkBpD,kBAAa,GAAY,KAAK,CAAA;QAC9B,gBAAW,GAAY,KAAK,CAAA;QAC5B,sBAAiB,GAAY,KAAK,CAAA;QAiblC,eAAe;QACf,yBAAoB,GAAkB,GAAG,EAAE;YACzC,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAA;QAC7B,CAAC,CAAA;QAEO,gBAAW,GAAG,CAAC,CAAC,CAAA;IAkvB1B,CAAC;IAtqCC,iEAAiE;IACjE,IAAY,kBAAkB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAC,OAAA,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,CAAA,MAAA,MAAM,CAAC,MAAM,0CAAE,QAAQ,CAAA,CAAA,EAAA,CAAC,CAAA;IACvG,CAAC;IAED,SAAS;QACP,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;IACxB,CAAC;IAED,cAAc,CAAC,CAAa;QAC1B,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,MAAqB,CAAA;QAC3D,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IACxC,CAAC;IAED,YAAY;IACZ,0BAA0B;IAC1B,WAAW;IACX,IAAI;IAEJ,MAAM;QACJ,iDAAiD;QACjD,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QAC3F,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;QAExF,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC3D,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACpB,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;QACtB,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;QAC9D,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAA;QAE9C;;;;;;WAMG;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,cAAc,CAAC,CAAA;QAE/E;;;;WAIG;QACH,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,GAAG,CAAC,GAAG,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;QAC5C,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,WAAW,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAA;QACjD,CAAC;QAED;;;;;;;WAOG;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAA;QAE1C,OAAO,IAAI,CAAA;QACP,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YAC/B,IAAI,cAAc,GAAG,MAAM,KAAK,UAAU,CAAA;YAC1C,IAAI,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAA;YACzC,IAAI,OAAO,GAAG,MAAM,GAAG,CAAC,CAAA;YACxB,IAAI,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAA;YACjD,IAAI,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;YAEhE,OAAO,IAAI,CAAA;;;;4BAIS,YAAY,GAAG,MAAM;4BACrB,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;;YAElE,OAAO,CAAC,GAAG,CACX,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,CAAA;;qBAElB,OAAO,GAAG,MAAM,GAAG,GAAG,GAAG,SAAS;;gCAEvB,SAAS,GAAG,CAAC;wBACrB,IAAI;wBACJ,MAAM,CAAC,IAAI;4BACP,MAAM;+BACH,SAAS;0BACd,MAAM;0BACN,MAAM;2BACL,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB;8BACvD,UAAU;6BACX,CAAC,CAAC,MAAM,CAAC,SAAS;0BACrB,MAAM,CAAC,IAAI,IAAI,QAAQ;uBAC1B,OAAO;+BACC,cAAc;gCACb,YAAY;2BACjB,MAAM,KAAK,UAAU,IAAI,SAAS,KAAK,aAAa;2BACpD,MAAM,KAAK,UAAU,IAAI,SAAS,KAAK,aAAa;6BAClD,SAAS;yBACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;yBACnB,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;wBAC3B,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;;aAEhD,CACF;;;;;;;oBAOS,IAAI;wBACA,MAAM;2BACH,CAAC,CAAC;sBACP,MAAM;0BACF,UAAU;mBACjB,OAAO;2BACC,cAAc;4BACb,YAAY;;;SAG/B,CAAA;QACH,CAAC,CAAC;QACA,WAAW;YACX,CAAC,CAAC,IAAI,CAAA;qDACuC,YAAY,GAAG,OAAO,CAAC,MAAM;gBAClE,OAAO,CAAC,GAAG,CACX,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,CAAA;;;oCAGP,SAAS,GAAG,CAAC;4BACrB,IAAI;mCACG,SAAS;gCACZ,OAAO,CAAC,MAAM;8BAChB,MAAM;8BACN,WAAY;6BACb,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;4BACzB,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;;iBAEhD,CACF;;;wBAGS,IAAI;+BACG,CAAC,CAAC;4BACL,OAAO,CAAC,MAAM;0BAChB,WAAY;;;WAG3B;YACH,CAAC,CAAC,OAAO;QACT,KAAK,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAA,EAAE;;;;;;;;;;;;;;;;qBAgB5D,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,aAAuB,CAAC,CAAC;gCAC3C,SAAS,CAC/B,UAAW,IAAI,CAAC,IAAI,aAAc,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,UAAU,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CAC5F;;;KAGJ,CAAA;IACH,CAAC;IAED,YAAY;QACV,iBAAiB;QACjB,kEAAkE;QAElE,6CAA6C;QAC7C,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAEhE,2BAA2B;QAC3B,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QAEnC,4CAA4C;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAqB,CAAA;QAClF,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAE3B,SAAS,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE;YAClD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;YACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;YACvB,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACjC,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,GAAG,EAAE;YAChD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAA;QAC5B,CAAC,CAAC,CAAA;QAEF,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACvC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBAChE,+BAA+B;gBAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;gBACvB,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBACjC,IAAI,CAAC,kBAAkB,EAAE,CAAA;YAC3B,CAAC;QACH,CAAC,CAAC,CAAA;QAEF;;;;WAIG;QACH,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE;;YACpC,kDAAkD;YAClD,MAAM,OAAO,GAAI,CAAgB,CAAC,aAAqB,CAAA;YACvD,IAAI,OAAO,KAAI,MAAA,IAAI,CAAC,UAAU,0CAAE,QAAQ,CAAC,OAAO,CAAC,CAAA,EAAE,CAAC;gBAClD,OAAM;YACR,CAAC;YAED,oCAAoC;YACpC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA;gBAClD,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YACpC,CAAC;YAED,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;gBAC1D,OAAO,IAAI,CAAC,gBAAgB,CAAA;YAC9B,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE;YACnC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC3B,IAAI,CAAC,gBAAgB,GAAG,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC7D,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;YACzD,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;YAClD,CAAC,CAAC,eAAe,EAAE,CAAA;YAEnB,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,EAAE,GAAK,CAAiB,CAAC,MAAc,IAAI,EAAE,CAAA;YAEjH,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAkB,CAAA;YAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,CAAkB,CAAA;YAEpE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,KAAY,EAAE,EAAE;YAC/D,MAAM,CAAC,GAAG,KAAmB,CAAA;YAC7B,IAAI,CAAC,cAAc,EAAE,CAAA;YAErB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;YAEvB,IAAI,MAAM,GAAI,CAAC,CAAC,MAAkB,CAAC,OAAO,CAAC,eAAe,CAAkB,CAAA;YAC5E,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;YAE5C,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC9B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE;oBACN,GAAG,EAAE,QAAQ;oBACb,MAAM,EAAE,WAAW;iBACpB;aACF,CAAC,CACH,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,CAAQ,EAAE,EAAE;YAC3D,MAAM,EAAE,GAAG,CAAiB,CAAA;YAC5B,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,KAAK,OAAO,CAAA;YAE1C,wDAAwD;YACxD,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAA;YAEhC,mCAAmC;YACnC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA;gBAClD,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YACpC,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,CAAA;YAErB,IAAI,OAAO,EAAE,CAAC;gBACZ,iDAAiD;gBACjD,OAAM;YACR,CAAC;YAED,IAAI,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;gBACvC,OAAM;YACR,CAAC;YAED,CAAC,CAAC,cAAc,EAAE,CAAA;YAClB,CAAC,CAAC,eAAe,EAAE,CAAA;YAEnB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;YAEtB,IAAI,MAAM,GAAI,CAAC,CAAC,MAAkB,CAAC,OAAO,CAAC,eAAe,CAAkB,CAAA;YAC5E,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;YAE5C,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC9B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE;oBACN,GAAG,EAAE,QAAQ;oBACb,MAAM,EAAE,WAAW;iBACpB;aACF,CAAC,CACH,CAAA;YAED,IAAI,WAAW,IAAI,CAAC,IAAI,MAAM,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC1F,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;YAC7C,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,KAAY,EAAE,EAAE;YAC/D,MAAM,CAAC,GAAG,KAAqB,CAAA;YAC/B,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC5D,OAAM;YACR,CAAC;YAED,CAAC,CAAC,cAAc,EAAE,CAAA;YAClB,CAAC,CAAC,eAAe,EAAE,CAAA;YAEnB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAuB,CAAA;YACvC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,IAAI,KAAK,EAAE,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,CAAA;gBAE3E,OAAM;YACR,CAAC;YAED,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAA;YAE5C,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;gBAC3B,GAAG,GAAG,KAAK,CAAA;gBAEX,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACjC,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,KAAY,EAAE,EAAE;YAC7D,IAAK,KAAsB,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;gBACpD,KAAK,CAAC,cAAc,EAAE,CAAA;gBACtB,KAAK,CAAC,eAAe,EAAE,CAAA;YACzB,CAAC;YAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;QACzB,CAAC,CAAC,CAAA;QAEF;;;;;;;;;WASG;QACH,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,KAAY,EAAE,EAAE;;YAC/D,IAAK,KAAsB,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;gBACpD,OAAM;YACR,CAAC;YAED,MAAM,KAAK,GAAG,MAAA,MAAC,KAAK,CAAC,MAAkB,0CAAE,OAAO,mDAAG,eAAe,CAAkB,CAAA;YACpF,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACjD,CAAC,CAAC,CAAA;QAEF;;;;;WAKG;QACH,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAEnE,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9E,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,UAAU,EAAE,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACpF,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAE1F,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAEhF,qBAAqB,CAAC,GAAG,EAAE;YACzB,0CAA0C;YAC1C,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,IAAI,EAAE,CAAA;YAC7F,2BAA2B;YAC3B,MAAM,SAAS,GAAG,8EAA8E,YAAY,qEAAqE,CAAA;YAEjL,+DAA+D;YAC/D,MAAM,UAAU,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAA;YAChD,IAAI,CAAC,KAAK,CAAC,WAAW,CACpB,4BAA4B;YAC5B,2CAA2C;YAC3C,2BAA2B,UAAU,IAAI,CAC1C,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC,CAAQ,EAAE,EAAE,CACrD,IAAI,CAAC,eAAe,CAAE,CAAiB,CAAC,MAA8C,CAAC,CACxF,CAAA;IAEH,CAAC;IAED;;;OAGG;IACH,IAAI,QAAQ;QACV,OAAQ,IAAI,CAAC,OAAO,CAAC,WAAW,CAAwB,IAAI,IAAI,CAAA;IAClE,CAAC;IAED,iBAAiB;;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QACzB,kDAAkD;QAClD,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QACpD,MAAA,IAAI,CAAC,YAAY,0CAAE,gBAAgB,CAAC,qBAAqB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAA;IACvF,CAAC;IAED,oBAAoB;QAClB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAA;QACzF,CAAC;QACD,KAAK,CAAC,oBAAoB,EAAE,CAAA;IAC9B,CAAC;IASD,sCAAsC;IAC9B,aAAa,CAAC,QAAgB;QACpC,IAAI,QAAQ,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,OAAM;QACR,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QACrC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAE5B,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAA;IAC7B,CAAC;IAED;;;;;;;;OAQG;IACK,YAAY,CAAC,QAAgB;;QACnC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,MAAA,IAAI,CAAC,UAAU,0CAAE,gBAAgB,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAuB,CAAA;IAChG,CAAC;IAEO,OAAO,CAAC,QAAgB,EAAE,EAAW;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;QAEvC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAM;QACR,CAAC;QAED;;;WAGG;QACH,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAA;IACnF,CAAC;IAED,eAAe,CAAC,QAAgB,EAAE,WAAmB,EAAE,UAAmB,IAAI;QAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;QAEvC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAM;QACR,CAAC;QAED,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAA;QAClE,IAAI,CAAC,OAAO,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;YACvC,OAAM;QACR,CAAC;QAED,2FAA2F;QAC3F,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,OAAO,CAAkB,CAAA;IAC9E,CAAC;IAED;;;;;OAKG;IACK,WAAW,CAAC,CAAQ;QAC1B,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAI,CAAiB,CAAC,MAAM,IAAI,EAAE,CAAA;QAEvD,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAM;QACR,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC;IAED,eAAe,CAAC,GAAW,EAAE,MAAc,EAAE,YAA2B,IAAI;QAC1E,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAA;QAC/E,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YACvC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;QAChF,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;YACtF,OAAM;QACR,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,eAAe,EAAE,CAAA;QAEtB,IAAI,CAAC,UAAU,GAAG;YAChB,GAAG;YACH,MAAM;YACN,SAAS;SACV,CAAA;IACH,CAAC;IAED,YAAY,CAAC,OAAY;QACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/B;;eAEG;YACH,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACxB,CAAC;QAED,OAAO,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC;IAED,OAAO,CAAC,OAA6B;;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,IAAI,OAAO,GAAG,MAAA,IAAI,CAAC,UAAU,0CAAE,aAAa,CAAC,WAAW,CAAC,CAAA;YACzD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAM;YACR,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;YAC9B,MAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAwB,CAAA;YAC1G,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,YAAY,KAAI,CAAC,CAAC,CAAA;YAC/E,0DAA0D;YAC1D,gBAAgB;YAChB,SAAS;YACT,UAAU;YACV,uBAAuB;YACvB,KAAK;YACL,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAA;YAC1B,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAA;YAC5B,CAAC;YAED,wBAAwB;YACxB,IAAI,CAAC,kBAAkB,EAAE,CAAA;YACzB,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC9F,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;YACzB,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAA0B,CAAA;YAC7D,MAAM,QAAQ,GAAG,QAAQ,IAAK,QAAgB,CAAC,IAAI,CAAA;YACnD,MAAM,QAAQ,GAAI,IAAI,CAAC,IAAY,CAAC,IAAI,CAAA;YACxC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACpD,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAe,CAAC,CAAA;QACnE,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,iDAAiD;YACjD,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1E,4DAA4D;YAC5D,IAAI,CAAC,kBAAkB,EAAE,CAAA;YACzB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,EAAE,CAAA;QACf,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAChC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;YAC3B,IAAI,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAA;YAE7D,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;QACxD,CAAC;IACH,CAAC;IAED,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,EAAwC;QACnE,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAA;QACrD,IAAI,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;QAE9B,wCAAwC;QACxC,IAAI,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC,CAAA;YAC1E,KAAK,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;QAClF,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,GAAG,CAAA;QACzB,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAClC,IAAI,CAAC,MAAM,CAAC,OAAO,EACnB,MAAM,EACN,GAAG,EACH,IAAI,EACJ;YACE,KAAK;SACN,EACD,GAAG,EAAE;YACH,OAAO,IAAI,CAAC,WAAW,CAAA;YACvB,OAAO,IAAI,CAAC,cAAc,CAAA;QAC5B,CAAC,CACF,CAAA;IACH,CAAC;IAED,4DAA4D;IAC5D,sBAAsB;QACpB,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAA;QAE5C,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,GAAG,IAAI,CAAC,YAAY,CAAA;YAEzB,GAAG,GAAG,KAAK,CAAA;QACb,CAAC;QAED,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;YACjB,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAA;YACnF,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAA;YACjF,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAA;YAClG,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAA;YAEhG,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,cAAc,GAAG,gBAAgB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAE7D;;;;;;;eAOG;YACH,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,WAAW,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC/F,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAA;gBAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;gBAE1C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;;oBAC7C,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,CAAA;oBACjC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;oBACnC,MAAM,KAAK,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,MAAM,CAAC,IAAI,CAAC,CAAA;oBACnC,MAAM,IAAI,GAAG,OAAO,KAAK,CAAA;oBAEzB,kEAAkE;oBAClE,IAAI,aAAa,GAAQ,KAAK,CAAA;oBAC9B,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;wBACtE,MAAM,GAAG,GAAG,MAAA,MAAM,CAAC,CAAA,MAAA,MAAM,CAAC,MAAM,0CAAE,cAAc,KAAI,EAAE,CAAC,mCAAI,MAAM,CAAC,MAAM,CAAA;wBACxE,MAAM,OAAO,GAAU,KAAK,CAAC,OAAO,CAAC,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;wBACrE,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,WAAC,OAAA,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,KAAK,mCAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA,EAAA,CAAC,CAAA;wBAC1H,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;oBAClG,CAAC;oBAED,sFAAsF;oBACtF,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAA;oBAEzJ,uGAAuG;oBACvG,IAAI,SAAS,GAAQ,EAAE,CAAA;oBACvB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;wBAC1C,mDAAmD;wBACnD,IAAI,MAAA,MAAM,CAAC,MAAM,0CAAE,QAAQ,EAAE,CAAC;4BAC5B,IAAI,CAAC;gCACH,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAW,CAAC,CAAA;gCAC9E,IAAI,OAAO,CAAC,KAAK,QAAQ;oCAAE,SAAS,GAAG,CAAC,CAAA;4BAC1C,CAAC;4BAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;wBAChB,CAAC;oBACH,CAAC;yBAAM,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;wBAC5B,+CAA+C;wBAC/C,MAAM,OAAO,GAAI,KAAa,aAAb,KAAK,uBAAL,KAAK,CAAU,IAAI,CAAA;wBACpC,SAAS,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;wBACtD,IAAI,CAAC,SAAS,KAAI,MAAA,MAAM,CAAC,MAAM,0CAAE,QAAQ,CAAA,EAAE,CAAC;4BAC1C,IAAI,CAAC;gCACH,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAW,CAAC,CAAA;gCAC9E,IAAI,OAAO,CAAC,KAAK,QAAQ;oCAAE,SAAS,GAAG,CAAC,CAAA;4BAC1C,CAAC;4BAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;wBAChB,CAAC;oBACH,CAAC;yBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACpC,SAAS,GAAG,aAAa,CAAA;oBAC3B,CAAC;yBAAM,CAAC;wBACN,SAAS,GAAG,KAAK,CAAA;oBACnB,CAAC;oBAED,8DAA8D;oBAC9D,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;wBACnF,SAAS,GAAG,EAAE,CAAA;oBAChB,CAAC;oBAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAA;gBACtC,CAAC,CAAC,CAAA;gBAEF,OAAO,KAAK,CAAA;YACd,CAAC,CAAC,CAAA;YAEF,MAAM,UAAU,GAAG,CAAC,MAAW,EAAE,EAAE;gBACjC,IAAI,MAAM,IAAI,IAAI;oBAAE,OAAO,EAAE,CAAA;gBAC7B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC;oBACnD,QAAQ,CAAC,EAAE,CAAC;wBACV,KAAK,GAAG;4BACN,OAAO,OAAO,CAAA;wBAChB,KAAK,GAAG;4BACN,OAAO,MAAM,CAAA;wBACf,KAAK,GAAG;4BACN,OAAO,MAAM,CAAA;wBACf,KAAK,GAAG;4BACN,OAAO,QAAQ,CAAA;wBACjB,KAAK,GAAG;4BACN,OAAO,QAAQ,CAAA;wBACjB;4BACE,OAAO,CAAC,CAAA;oBACZ,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAA;YAED,MAAM,IAAI,GACR,SAAS;gBACT,IAAI;qBACD,GAAG,CACF,KAAK,CAAC,EAAE,CACN,MAAM;oBACN,KAAK;yBACF,GAAG,CAAC,CAAC,CAAC,EAAE,CACP,CAAC,CAAC,IAAI,IAAI,QAAQ,IAAI,CAAC,CAAC,QAAQ;wBAC9B,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,gBAAgB,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO;wBAC7F,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CACxD;yBACA,IAAI,CAAC,EAAE,CAAC;oBACX,OAAO,CACV;qBACA,IAAI,CAAC,EAAE,CAAC;gBACX,UAAU,CAAA;YAEZ,kCAAkC;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAEzF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QACvB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAA;QAC5C,IAAI,CAAC,MAAM;YAAE,OAAM;QAEnB,MAAM,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;YAC9B,IAAI,aAAa,CAAC;gBAChB,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;gBAC3D,YAAY,EAAE,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;aAC9D,CAAC;SACH,CAAC,CAAA;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,CAAA;QACzD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,CAAC,eAAe,CAAA;YACzD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAA;YAEzC,WAAW,CAAC,YAAY,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAA;YAChE,MAAM,IAAI,GAAG,WAAW,CAAC,qBAAqB,EAAE,CAAA;YAChD,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;YAC/D,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAA;YAEjE,WAAW,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAA;YACzC,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAA;YACjC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;YAChB,WAAW,CAAC,eAAe,CAAC,cAAc,CAAC,CAAA;YAC3C,WAAW,CAAC,KAAK,CAAC,eAAe,GAAG,eAAe,CAAA;YACnD,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;QACrC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;;QACT,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAA;YAEvC,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;YACvD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAM;YACR,CAAC;YAED,IAAI,IAAwB,CAAA;YAC5B,IAAI,OAA2B,CAAA;YAE/B,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;gBAC3C,IAAI,CAAC;oBACH,IAAI,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;oBACnD,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;oBACrC,IAAI,GAAG,WAAW,CAAA;gBACpB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,IAAI,CAAC;wBACH,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;wBAChD,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;wBACrC,IAAI,GAAG,YAAY,CAAA;oBACrB,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;gBAChB,CAAC;gBAED,MAAK;YACP,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAM;YACR,CAAC;YAED,qEAAqE;YACrE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;YAClC,IAAI,OAAO,GAAG,CAAC,CAAA;YACf,IAAI,OAAO,GAAG,CAAC,CAAA;YACf,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAA;YAC9C,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;gBACjB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;gBAC5C,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAA;gBACrD,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;gBACrD,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;YAC7D,CAAC;YAED,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAE7D,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;gBACzC,GAAG,CAAC,SAAS,GAAG,OAAQ,CAAC,IAAI,EAAE,CAAA;gBAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAqB,CAAA;gBAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAM;gBACR,CAAC;gBAED,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC,SAAS,EAAE,CAAA;oBAChB,SAAS,CAAC,eAAe,EAAE,CAAA;oBAE3B,oDAAoD;oBACpD,mDAAmD;oBACnD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;wBACtB,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAA;wBAClC,MAAM,IAAI,CAAC,cAAc,CAAA;wBACzB,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,KAAK,CAAA;oBACrC,CAAC;gBACH,CAAC;gBACD,+EAA+E;gBAC/E,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CACzD,CAAC,CAAC,EAA4B,EAAE,CAAC,CAAC,YAAY,mBAAmB,CAClE,CAAA;gBACD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;oBAChB,OAAM;gBACR,CAAC;gBACD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAA;gBAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;gBAC5E,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC9E,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBAE9E,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC;oBAChE,IAAI,YAAY,GAAG,OAAO,CAAC,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAA;oBAChE,IAAI,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;wBACrC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;oBAC5B,CAAC;oBAED,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;oBAC5D,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;wBACzE,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,CAAA;wBACzC,IAAI,CAAC,IAAI;4BAAE,SAAQ,CAAC,mBAAmB;wBACvC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,CAAA;wBAClD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,UAAU;4BAAE,SAAQ,CAAC,+BAA+B;wBACtF,yDAAyD;wBACzD,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,CAAQ,CAAA;wBAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAA;wBACxD,IAAI,IAAI,GAAG,YAAY,CAAC,IAAI,IAAI,UAAU,CAAA;wBAC1C,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA,CAAC,eAAe;wBAChE,IAAI,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,MAAM,CAAA;wBACtC,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;4BACnC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;wBAC9E,CAAC;wBAED,IAAI,KAAK,EAAE,CAAC;4BACV,QAAQ,IAAI,EAAE,CAAC;gCACb,KAAK,QAAQ;oCACX,uBAAuB;oCACvB,IAAI,CAAC;wCACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA;wCACjC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;4CAC7F,CAAC,CAAC,IAAI;4CACN,CAAC,CAAC,KAAK,CAAA;oCACX,CAAC;oCAAC,OAAO,GAAG,EAAE,CAAC;wCACb,KAAK,GAAG,IAAI,CAAA;oCACd,CAAC;oCACD,MAAK;gCACP,KAAK,YAAY;oCACf,IAAI,CAAC;wCACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,CAAA;oCACrC,CAAC;oCAAC,OAAO,GAAG,EAAE,CAAC;wCACb,KAAK,GAAG,IAAI,CAAA;oCACd,CAAC;oCACD,MAAK;gCACP,KAAK,SAAS,CAAC;gCACf,KAAK,UAAU;oCACb,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;oCACjD,MAAK;gCACP,KAAK,QAAQ,CAAC;gCACd,KAAK,OAAO,CAAC;gCACb,KAAK,SAAS,CAAC;gCACf,KAAK,UAAU;oCACb,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAA;oCAClC,MAAK;gCACP,KAAK,QAAQ;oCACX,IAAI,CAAC;wCACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;wCAChC,sDAAsD;wCACtD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;4CAClD,KAAK,GAAG,CAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,IAAI,EAAE,KAAK,MAAc,CAAC,IAAI,IAAI,EAAE,CAAA;wCAChE,CAAC;6CAAM,CAAC;4CACN,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;wCAC/B,CAAC;oCACH,CAAC;oCAAC,OAAO,GAAG,EAAE,CAAC,CAAA,CAAC;oCAChB,MAAK;gCACP,KAAK,QAAQ;oCACX,4DAA4D;oCAC5D,KAAK,GAAG,uBAAuB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,YAAY,CAAC,CAAA;oCAC1E,MAAK;gCACP;oCACE;4DACwB;oCACxB,IAAI,UAAU,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;wCACnD,KAAK,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,EAAE,CAAA;oCACvB,CAAC;yCAAM,CAAC;wCACN,IAAI,CAAC;4CACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;wCAC3B,CAAC;wCAAC,OAAO,GAAG,EAAE,CAAC;4CACb,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gDAAE,KAAK,GAAG,IAAI,CAAA;wCAC9D,CAAC;oCACH,CAAC;4BACL,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,8EAA8E;4BAC9E,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;wBAC5C,CAAC;wBAED,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,QAAQ,EAAE,CAAC;4BACzD,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gCAC9B,OAAO,EAAE,IAAI;gCACb,QAAQ,EAAE,IAAI;gCACd,MAAM,EAAE;oCACN,MAAM,EAAE,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC;oCACvC,KAAK,EAAE,KAAK;oCACZ,MAAM,EAAE,YAAY;oCACpB,MAAM,EAAE,YAAY;oCACpB,GAAG,EAAE,GAAG,GAAG,QAAQ;iCACpB;6BACF,CAAC,CACH,CAAA;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,OAAM;YACR,CAAC;iBAAM,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBACjC,0DAA0D;gBAC1D,oEAAoE;gBACpE,MAAM,OAAO,GAAG,OAAO;qBACpB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;qBACtB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;qBAClB,KAAK,CAAC,IAAI,CAAC;qBACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;gBAChC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBACpB,OAAM;gBACR,CAAC;gBAED,+EAA+E;gBAC/E,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAA;gBAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;gBACvD,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC9E,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBAE9E,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC;oBACnE,MAAM,cAAc,GAAG,GAAG,GAAG,SAAS,CAAA;oBACtC,IAAI,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAA;oBAChE,IAAI,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;wBACrC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;oBAC5B,CAAC;oBAED,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,CAAA;oBAC7C,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC;wBACnE,MAAM,SAAS,GAAG,MAAA,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,mCAAI,EAAE,CAAA,CAAC,mBAAmB;wBACzE,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;wBAChD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,UAAU;4BAAE,SAAQ;wBAEtD,IAAI,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,MAAM,CAAA;wBACtC,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;4BACnC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,CAAC,CAAA;wBAC7F,CAAC;wBAED,IAAI,QAAQ,EAAE,CAAC;4BACb,4DAA4D;4BAC5D,kFAAkF;4BAClF,IAAI,aAAa,GAAQ,SAAS,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;4BAC1E,IAAI,YAAY,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,EAAE,CAAC;gCAChD,aAAa,GAAG,uBAAuB,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,CAAA;4BAChF,CAAC;4BAED,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gCAC9B,OAAO,EAAE,IAAI;gCACb,QAAQ,EAAE,IAAI;gCACd,MAAM,EAAE;oCACN,MAAM,EAAE,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC;oCACvC,KAAK,EAAE,aAAa;oCACpB,MAAM,EAAE,YAAY;oCACpB,MAAM,EAAE,YAAY;oCACpB,GAAG,EAAE,cAAc;iCACpB;6BACF,CAAC,CACH,CAAA;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QACxB,CAAC;gBAAS,CAAC;YACT,6BAA6B;YAC7B,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,cAAc,CAAC,KAAqB,EAAE,GAAmB;;QACvD,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,WAAW,KAAI,CAAC,CAAC,EAAE,CAAC;YAC7B,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACxG,CAAC;QAED,IAAI,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,WAAW,KAAI,CAAC,CAAC,EAAE,CAAC;YAC3B,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACpG,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;QAE3C,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;YACjB,MAAA,MAAM,CAAC,YAAY,EAAE,0CAAE,eAAe,EAAE,CAAA;YAExC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;gBAClB,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAA;gBAC9D,MAAM,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA;gBAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAA;gBACvD,MAAM,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA;gBAE1C,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;gBAC3B,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAA;gBACzB,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC,WAAW,CAAA;gBAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC,YAAY,CAAA;gBAEjE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,mBAAmB,EAAE,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;gBAClE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;gBAChE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,KAAK,GAAG,IAAI,CAAC,CAAA;gBAC1D,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;YAC9D,CAAC;YAED,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,sBAAsB;QACpB,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAE3D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YACvC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACvB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;YACzE,CAAC;YACD,OAAO,MAAM,CAAA;QACf,CAAC,EAAE,EAAiB,CAAC,CAAA;IACvB,CAAC;IAED;;;;;OAKG;IACK,eAAe,CAAC,MAAqB;QAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;QAE/B,OAAO,IAAI;YACT,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;YACjE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAA;IAC7E,CAAC;IAED,kCAAkC;IAC1B,kBAAkB;;QACxB,MAAM,SAAS,GAAG,MAAA,IAAI,CAAC,UAAU,0CAAE,aAAa,CAAC,WAAW,CAAgB,CAAA;QAC5E,IAAI,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,UAAU,GAAG,IAAI,CAAA;YACxD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,SAAS,GAAG,IAAI,CAAA;YACtD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,WAAW,GAAG,IAAI,CAAA;YAC1D,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,YAAY,GAAG,IAAI,CAAA;QAC9D,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,gBAAgB,CAAC,GAAW,EAAE,MAAc;;QAC1C,MAAM,IAAI,GAAG,MAAA,IAAI,CAAC,UAAU,0CAAE,KAAK,CAAA;QACnC,IAAI,CAAC,eAAe,EAAE,CAAA;QAEtB,IAAI,CAAC,IAAI;YAAE,OAAM;QAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QACnD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;QAC3B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU;YAAE,OAAM;QAElC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAA;QAE3D,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,CAAA;QAC7B,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;YACnC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;QAC1E,CAAC;QACD,IAAI,CAAC,QAAQ;YAAE,OAAM;QAErB,iBAAiB;QACjB,IAAI,KAAK,GAAQ,IAAI,CAAA;QACrB,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,QAAQ,CAAC;YACd,KAAK,OAAO,CAAC;YACb,KAAK,SAAS,CAAC;YACf,KAAK,UAAU;gBACb,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAA;gBACjC,IAAI,KAAK,KAAK,IAAI;oBAAE,OAAM;gBAC1B,MAAK;YACP,KAAK,SAAS,CAAC;YACf,KAAK,UAAU;gBACb,OAAM,CAAC,iCAAiC;QAC5C,CAAC;QAED,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;YAC9B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;gBACxB,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,GAAG;gBACX,MAAM;gBACN,GAAG;aACJ;SACF,CAAC,CACH,CAAA;IACH,CAAC;IAED,4BAA4B;IAC5B,iBAAiB;QACf,IAAI,CAAC,eAAe,EAAE,CAAA;IACxB,CAAC;IAED,qBAAqB;IACb,eAAe;QACrB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAA;YAC1B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC5C,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;QACxB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAA;IAC5B,CAAC;;AA5zCM,mBAAM,GAAG;IACd,iBAAiB;IACjB,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8GF;CACF,AAjHY,CAiHZ;AAE2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;4CAAkC;AAClC;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;6CAA6B;AAC3B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CAA4B;AAC3B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAsD;AAOrD;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sDAA6B;AAC5B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDAAoF;AACnF;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CAAU;AACT;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wCAAQ;AACR;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;gDAA0B;AAE3C;IAAR,KAAK,EAAE;kDAGP;AAEwB;IAAxB,KAAK,CAAC,gBAAgB,CAAC;iDAA6B;AACpB;IAAhC,KAAK,CAAC,wBAAwB,CAAC;kDAA6B;AAnJlD,YAAY;IADxB,aAAa,CAAC,cAAc,CAAC;GACjB,YAAY,CAu0CxB","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 { i18next } from '@operato/i18n'\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'\nimport { columnText } from '../utils/column-text.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\n/*\n * parent ๋Š” ์Šคํฌ๋กค๋Ÿฌ๋‹ค. stickyTop ์€ ๊ทธ ์œ„์ชฝ์— ๋ถ™์–ด ์นธ์„ ๊ฐ€๋ฆฌ๋Š” ๋จธ๋ฆฌ์˜ ๋†’์ด๋‹ค โ€” ๋จธ๋ฆฌ ๋ฐ‘์œผ๋กœ ๋“ค์–ด๊ฐ„\n * ์นธ์€ ํ™”๋ฉด ์•ˆ์— ์žˆ์–ด๋„ ๋ณด์ด์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ทธ๋งŒํผ ๋‚ด๋ ค์„œ ํŒ๋‹จํ•œ๋‹ค.\n */\nfunction calcScrollPos(parent: HTMLElement, child: Element, stickyTop = 0) {\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 pt += stickyTop\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 /*\n * โ”€โ”€ ๊ณ ์ • ์—ด์˜ ๋ถˆํˆฌ๋ช…์€ **๋’ค์— ์ธต์„ ๊น”์•„์„œ ์ง€ํ‚ฌ ์ˆ˜ ์—†๋‹ค** โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n *\n * ์ด ์นธ์€ ์Šคํฌ๋กค๋˜๋Š” ์—ด ์œ„์— ๋–  ์žˆ์–ด์„œ(position: sticky) ํˆฌ๋ช…ํ•ด์ง€๋ฉด ๊ทธ ์•„๋ž˜๊ฐ€ ๋น„์นœ๋‹ค.\n * ๊ทธ๋ž˜์„œ ํ•œ๋•Œ ์—ฌ๊ธฐ์— ์ด๋Ÿฐ ๊ฒƒ์„ ๋‘์—ˆ๋‹ค.\n *\n * [fixed]::before { position:absolute; inset:0; background-color: โ€ฆ; z-index:-1 }\n *\n * **์•ˆ ๋œ๋‹ค.** ์Œ์ˆ˜ z-index ์ž์‹์€ ์ž๊ธฐ ์š”์†Œ์˜ **๋ฐฐ๊ฒฝ ์œ„์—** ๊ทธ๋ ค์ง„๋‹ค(์นธ์˜ ๊ธ€์ž ์•„๋ž˜์ผ\n * ๋ฟ์ด๋‹ค). ๊ทธ๋ž˜์„œ ๊ทธ ์ธต์ด ์ค„ ์ƒํƒœ์˜ ์ƒ‰์„ ๋ฎ์—ˆ๊ณ , ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฐ ์ค„์˜ ๋ ๊ฐ€ ๊ณ ์ • ์—ด์—์„œ๋งŒ\n * ์‚ฌ๋ผ์กŒ๋‹ค. ๊ทธ๋•Œ ๋‚˜๋Š” ๊ณ„์‚ฐ๋œ background-color ๋ฅผ ์žฌ๊ณ  ใ€Œ๊ฐ™์€ ์ƒ‰์ด๋‹คใ€๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ, ์žฌ์•ผ\n * ํ–ˆ๋˜ ๊ฒƒ์€ **์น ํ•ด์ง„ ๊ฒƒ**์ด์—ˆ๋‹ค.\n *\n * ๋ถˆํˆฌ๋ช…์€ ๋‹ค๋ฅธ ๋ฐ์„œ ์ง€ํ‚จ๋‹ค โ€” **์ค„ ์ƒํƒœ ์ƒ‰์„ transparent ๋กœ ๋‘์ง€ ์•Š๋Š” ๊ฒƒ**์ด๋‹ค. ๊ทธ ๊ฐ’์€\n * ใ€Œ์น ํ•˜์ง€ ์•Š๋Š”๋‹คใ€๊ฐ€ ์•„๋‹ˆ๋ผ ใ€Œ์นธ์˜ ๋ฐ”ํƒ•์„ ์ง€์šด๋‹คใ€์ด๊ณ , ์ง€์›Œ์ง„ ์ž๋ฆฌ์—๋Š” ๋’ค๊ฐ€ ๋น„์นœ๋‹ค.\n * ๊ณ ์น˜๋Š” ํ‘œ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋‘์—ˆ๋˜ ๊ฒƒ์„ ๊ฑท์—ˆ๋‹ค(data-grid.ts).\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 /**\n * Where this body's first row sits in the whole table, counting from 1.\n *\n * It combines header row count and page offset, so ox-grid computes it and passes it down โ€”\n * working it out here would mean the body has to know whether the header is one row or two.\n */\n @property({ type: Number }) ariaRowIndexBase: number = 2\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 * Only emit aria-selected where rows can actually be selected.\n *\n * The attribute means \"selectable, currently not selected\", so putting false on every row of a\n * grid without selection announces a control that is not there. Whether selection exists is\n * something the grid already knows: it has a row-selector gutter or it does not.\n */\n const selectable = columns.some(column => column.gutterName === 'row-selector')\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 /*\n * aria-rowindex is the position in the whole table, not within the page on screen. The first\n * row of page 2 is row 22, not row 1 again โ€” otherwise every page turn resets the count and\n * there is no way to tell how far through the data you are.\n *\n * Header rows count too, from 1. With a grouped header that is two rows, so the body starts\n * at 3.\n */\n const rowIndexBase = this.ariaRowIndexBase\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 <div\n grid-row\n role=\"row\"\n aria-rowindex=${rowIndexBase + idxRow}\n aria-selected=${ifDefined(selectable ? !!attrSelected : undefined)}\n >\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-field\n id=${'cell-' + idxRow + '-' + idxColumn}\n role=\"gridcell\"\n aria-colindex=${idxColumn + 1}\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 <!--\n Width filler โ€” nothing to read. It stays inside the row so hover and selection colour it\n with the rest, but it is not counted as a cell.\n -->\n <ox-grid-field\n role=\"presentation\"\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 </div>\n `\n })}\n ${accumulator\n ? html`\n <div grid-row role=\"row\" aria-rowindex=${rowIndexBase + records.length}>\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-accum-field\n role=\"gridcell\"\n aria-colindex=${idxColumn + 1}\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 role=\"presentation\"\n .data=${data}\n .columnIndex=${-1}\n .rowIndex=${records.length}\n .record=${accumRecord!}\n ></ox-grid-accum-field>\n </div>\n `\n : nothing}\n ${start && end && start !== end ? html` <div select-block></div> ` : html``}\n <!--\n This input takes the grid's keystrokes. Focus rests here until a cell opens for editing, and\n IME composition builds up in it โ€” this is where focus actually lives.\n\n It had no name. opacity: 0 makes that look harmless, but invisible is not the same as absent:\n it receives focus and receives text, so a screen reader reads it. Unnamed, it reads as one\n \"edit text\" and never changes, no matter how far the arrow keys travel โ€” there is no way to\n tell which cell you are on.\n\n aria-hidden is not the fix. Hiding the thing that holds focus makes focus vanish into\n nothing. Instead of hiding it, name it after the cell it currently stands in for.\n -->\n <input\n id=\"ime-buffer\"\n type=\"text\"\n aria-label=${this._imeBufferLabel(columns[focusedColumn as number])}\n aria-activedescendant=${ifDefined(\n focusedRow! >= 0 && focusedColumn! >= 0 ? `cell-${focusedRow}-${focusedColumn}` : undefined\n )}\n />\n <slot></slot>\n `\n }\n\n firstUpdated() {\n // TODO issue #13\n // this.addEventListener('scroll', this.handleOnScroll.bind(this))\n\n /* ์นธ์˜ ํŒ์—… ํ‘œ์‹์„ ๋ˆ„๋ฅด๋ฉด ๊ทธ ์นธ์˜ ํŽธ์ง‘์„ ์—ฐ๋‹ค(onStartEdit). */\n this.addEventListener('start-edit', this.onStartEdit.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 }\n\n /*\n * ๋ชธ์„ ์˜ฎ๊ธฐ๋Š” ์Šคํฌ๋กค๋Ÿฌ. ํ‘œ ์•ˆ์—์„œ๋Š” ๋จธ๋ฆฌ์™€ ๋ชธ์„ ํ•จ๊ป˜ ๋‹ด์€ div[grid] ์ด๊ณ (data-grid.ts), ๋ชธ๋งŒ ํ™€๋กœ\n * ์„ธ์› ์„ ๋•Œ๋Š” ๋ชธ ์ž์‹ ์ด๋‹ค.\n */\n get scroller(): HTMLElement {\n return (this.closest('div[grid]') as HTMLElement | null) || this\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.scroller.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 /**\n * One row โ€” the element holding that row's cells.\n *\n * This used to index `renderRoot.children` at `rowIndex * (columns + 1)`, where the +1 was the\n * width filler; the comment above it existed to explain why that arithmetic was necessary. The\n * code only worked while the count stayed correct.\n *\n * Rows are real elements now (role=row), so there is nothing to count.\n */\n private rowElementAt(rowIndex: number): HTMLElement | null {\n if (rowIndex < 0) {\n return null\n }\n\n return this.renderRoot?.querySelectorAll('div[grid-row]').item(rowIndex) as HTMLElement | null\n }\n\n private markRow(rowIndex: number, on: boolean) {\n const row = this.rowElementAt(rowIndex)\n\n if (!row) {\n return\n }\n\n /*\n * Mark every cell in the row, width filler included. It used to be left out, so on a grid\n * narrower than the viewport the right end of the row stayed uncoloured.\n */\n Array.from(row.children).forEach(cell => cell.toggleAttribute('hovered-row', on))\n }\n\n getFieldByIndex(rowIndex: number, columnIndex: number, residue: boolean = true) {\n const row = this.rowElementAt(rowIndex)\n\n if (!row) {\n return\n }\n\n var columns = this.columns.filter(column => !column.hidden).length\n if (!residue && columnIndex >= columns) {\n return\n }\n\n /* Column index wraps: moving right from the last column returns to the first (residue). */\n return row.children.item((columnIndex + columns) % columns) as DataGridField\n }\n\n /**\n * ์นธ์˜ **ํŒ์—… ํ‘œ์‹**์„ ๋ˆŒ๋ €๋‹ค โ€” ๊ทธ ์นธ์˜ ํŽธ์ง‘์„ ์—ฐ๋‹ค.\n *\n * ๋”๋ธ”ํด๋ฆญ๊ณผ ๊ฐ™์€ ์ž๋ฆฌ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ํ‘œ์‹์€ ํ•œ ๋ฒˆ ๋ˆ„๋ฅด๋Š” 22px ํ‘œ์ ์ด๊ณ , 33px ์ค„์—์„œ ๋”๋ธ”ํด๋ฆญ์„\n * ๊ฒจ๋ˆ„๋Š” ๊ฒƒ๋ณด๋‹ค ์‰ฝ๋‹ค. ๋”๋ธ”ํด๋ฆญ๋„ ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค โ€” ์ด๋ฏธ ์•„๋Š” ์‚ฌ๋žŒ์˜ ๊ธธ์„ ๋ง‰์ง€ ์•Š๋Š”๋‹ค.\n */\n private onStartEdit(e: Event) {\n const { row, column } = (e as CustomEvent).detail || {}\n\n if (isNaN(row) || isNaN(column)) {\n return\n }\n\n this.startEditTarget(row, column)\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 const scroller = this.scroller\n const header = scroller === this ? null : (scroller.querySelector('ox-grid-header') as HTMLElement | null)\n let { top, left } = calcScrollPos(scroller, element, header?.offsetHeight || 0)\n // TODO this.scroll()์„ ์‚ฌ์šฉํ•˜๋ฉด, ํšจ๊ณผ๊ฐ€ ์ข‹์œผ๋‚˜ left ๊ณ„์‚ฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Œ.\n // this.scroll({\n // top,\n // left,\n // behavior: 'smooth'\n // })\n if (top !== undefined) {\n scroller.scrollTop = top\n }\n if (left !== undefined) {\n scroller.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.scroller.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 /* ์—‘์…€์‹ ํƒ€์ผ๋ง: ํƒ€๊ฒŸ ์„ ํƒ ์˜์—ญ์ด ์†Œ์Šค ํฌ๊ธฐ์˜ ์ •์ˆ˜๋ฐฐ์ด๋ฉด ๊ทธ ์ฐจ์›์œผ๋กœ ๋ฐ˜๋ณตํ•˜๊ณ , ์•„๋‹ˆ๋ฉด ํ•œ ๋ฒˆ๋งŒ ๋ถ™์—ฌ ๋„ฃ๋Š”๋‹ค (์ฐจ์›๋งˆ๋‹ค ๋”ฐ๋กœ ํŒ๋‹จ) */\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 /* ์—‘์…€์‹ ํƒ€์ผ๋ง: ํƒ€๊ฒŸ ์„ ํƒ ์˜์—ญ์ด ์†Œ์Šค ํฌ๊ธฐ์˜ ์ •์ˆ˜๋ฐฐ์ด๋ฉด ๊ทธ ์ฐจ์›์œผ๋กœ ๋ฐ˜๋ณตํ•˜๊ณ , ์•„๋‹ˆ๋ฉด ํ•œ ๋ฒˆ๋งŒ ๋ถ™์—ฌ ๋„ฃ๋Š”๋‹ค (์ฐจ์›๋งˆ๋‹ค ๋”ฐ๋กœ ํŒ๋‹จ) */\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 /**\n * Which cell the IME buffer currently stands in for โ€” the name a screen reader reads.\n *\n * The name comes from the column definition alone (columnText). When focus is on no cell, or the\n * column yields no name, it falls back to \"cell input\" โ€” no invented name, and no empty one.\n */\n private _imeBufferLabel(column?: ColumnConfig): string {\n const name = columnText(column)\n\n return name\n ? i18next.t('text.grid-cell-input', { name, defaultValue: name })\n : i18next.t('text.grid-cell-input-plain', { defaultValue: 'cell input' })\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"]}
@@ -22,6 +22,7 @@ export declare class DataGridField extends LitElement {
22
22
  private _onKeydownInEditingMode;
23
23
  private tooltipController?;
24
24
  render(): TemplateResult;
25
+ private renderValue;
25
26
  updated(changes: PropertyValues<this>): void;
26
27
  /**
27
28
  * ์ด ์นธ์— **ํŒ์—… ํ‘œ์‹**์„ ๋ถ™์ด๋‚˜ โ€” ํŒ์—…์œผ๋กœ ๊ณ ์ณ์ง€๊ณ , ์ง€๊ธˆ ๊ณ ์น  ์ˆ˜ ์žˆ์„ ๋•Œ๋งŒ.
@@ -36,7 +36,7 @@ let DataGridField = class DataGridField extends LitElement {
36
36
  return html `
37
37
  ${this.editing
38
38
  ? editor === null || editor === void 0 ? void 0 : editor.call(this, value, column, record, rowIndex, this)
39
- : renderer === null || renderer === void 0 ? void 0 : renderer.call(this, value, column, record, rowIndex, this)}
39
+ : this.renderValue(renderer === null || renderer === void 0 ? void 0 : renderer.call(this, value, column, record, rowIndex, this))}
40
40
  <!--
41
41
  **ํŽธ์ง‘ ์ค‘์—๋„ ํ‘œ์‹์„ ๋‚จ๊ธด๋‹ค.**
42
42
 
@@ -134,6 +134,15 @@ let DataGridField = class DataGridField extends LitElement {
134
134
  : ''}
135
135
  `;
136
136
  }
137
+ /*
138
+ * ๊ธ€์ž๋กœ ๋Œ์•„์˜จ ๊ฐ’์€ span ์— ๋‹ด๋Š”๋‹ค.
139
+ *
140
+ * ๋งจ ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” ์ด ์ƒ์ž(flex)์˜ ์ต๋ช… ํ•ญ๋ชฉ์ด ๋˜์–ด text-overflow ๋ฅผ ๋ฐ›์„ ์ž๋ฆฌ๊ฐ€ ์—†๋‹ค โ€” ์ž˜๋ฆฌ๊ธฐ๋Š”
141
+ * ํ•ด๋„ ใ€Œโ€ฆใ€ ์—†์ด ๋š ๋Š๊ธด๋‹ค. ๊ธฐ๋ณธ ๋ Œ๋”๋Ÿฌ๋“ค์ฒ˜๋Ÿผ span ์— ๋‹ด์œผ๋ฉด ์œ„์˜ span ๊ทœ์น™์ด ๋ง์ค„์ž„์„ ์ค€๋‹ค.
142
+ */
143
+ renderValue(rendered) {
144
+ return typeof rendered === 'string' || typeof rendered === 'number' ? html `<span>${rendered}</span>` : rendered;
145
+ }
137
146
  updated(changes) {
138
147
  var _a, _b;
139
148
  if (changes.has('editing')) {
@@ -320,6 +329,24 @@ DataGridField.styles = [
320
329
  justify-content: var(--data-grid-field-justify-content, flex-start);
321
330
  position: relative;
322
331
 
332
+ /*
333
+ * โ”€โ”€ ์นธ์˜ ๋‚ด์šฉ์€ **์นธ ์•ˆ์— ๋จธ๋ฌธ๋‹ค** โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
334
+ * ๋ Œ๋”๋Ÿฌ๋Š” ๋ฌด์—‡์ด๋“  ๋Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค โ€” ๋ฌธ์ž์—ด, ํ…์ŠคํŠธ ๋…ธ๋“œ, <a> ๊ฐ™์€ ์•„๋ฌด ์š”์†Œ(types.ts ์˜
335
+ * FieldRenderer). ์•„๋ž˜์˜ span ยท pre ๊ทœ์น™๋งŒ ์ž๋ฅด๊ณ  ์žˆ์–ด์„œ, ๊ทธ ๋ฐ–์˜ ๊ฒƒ์€ ์—ด ๋„ˆ๋น„๋ฅผ ๋„˜์–ด
336
+ * ์˜† ์นธ ์œ„๋กœ, ๋งˆ์ง€๋ง‰ ์—ด ๋„ˆ๋จธ ๋นˆ์ž๋ฆฌ๋กœ ํ˜๋ €๋‹ค. ํ๋ฅธ ๋งŒํผ ๋ชธํ†ต์˜ scrollWidth ๊ฐ€ ์ปค์ ธ
337
+ * ๋จธ๋ฆฌ๋ง(์—ด ๋„ˆ๋น„์˜ ํ•ฉ)๊ณผ ์–ด๊ธ‹๋‚ฌ๊ณ , ์˜ค๋ฅธ์ชฝ ๋์—์„œ ๋จธ๋ฆฌ๋ง์€ ๋ฉˆ์ถ”๋Š”๋ฐ ๋ชธํ†ต๋งŒ ๋” ๋ฐ€๋ ธ๋‹ค.
338
+ *
339
+ * [ํ™•์ธํ•จ] operato-office ๊ณ„์•ฝ ๋Œ€์žฅ โ€” ๋ชธํ†ต 5503 / ๋จธ๋ฆฌ๋ง 3830. ์นธ๋งˆ๋‹ค overflow: hidden
340
+ * ์„ ๊ฑธ์ž ๋ชธํ†ต์ด 3830 ์œผ๋กœ ๋จธ๋ฆฌ๋ง๊ณผ ๊ฐ™์•„์กŒ๋‹ค(2026-10-04).
341
+ *
342
+ * 2022 ๋…„์— ์ด ๊ฐ’์„ ๋บ€ ์ด์œ ๋Š” ์นธ ์•ˆ์— ๊ทธ๋ฆฌ๋˜ CSS ํˆดํŒ์ด์—ˆ๋‹ค. ์ง€๊ธˆ ํˆดํŒ์€ document.body ์—
343
+ * ๋ถ™์œผ๋ฏ€๋กœ(TooltipReactiveController) ์ž˜๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ์ดˆ์  ํ…Œ(outline)๋Š” ์ด ์ƒ์ž ์ž์‹ ์˜
344
+ * ๊ฒƒ์ด๋ผ ์ž๊ธฐ overflow ์— ์ž˜๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
345
+ *
346
+ * ํŽธ์ง‘ ์ค‘์—๋Š” ํ’€์–ด ๋‘”๋‹ค(:host([editing]) ์•„๋ž˜) โ€” ํŽธ์ง‘๊ธฐ๊ฐ€ ์นธ ๋ฐ–์œผ๋กœ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์„ ๋ง‰์ง€ ์•Š๋Š”๋‹ค.
347
+ */
348
+ overflow: hidden;
349
+ min-width: 0;
323
350
  white-space: nowrap;
324
351
  background-color: var(--grid-record-background-color);
325
352
  padding: var(--grid-record-padding);
@@ -759,6 +786,7 @@ DataGridField.styles = [
759
786
  }
760
787
 
761
788
  :host([editing]) {
789
+ overflow: visible;
762
790
  border-top: var(--grid-record-editing-border);
763
791
  border-bottom: var(--grid-record-editing-border);
764
792
  }