@medyat/vue-data-table 1.0.0 → 1.0.1

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_useModel","_openBlock","_createBlock","_unref","_withCtx","_createVNode","_renderSlot","_createElementVNode","_createTextVNode","_toDisplayString","_createElementBlock","_Fragment","_renderList","_resolveDynamicComponent","_createCommentVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_openBlock","_createElementBlock","_normalizeClass","_unref","_createBlock","_resolveDynamicComponent","_createElementVNode","_toDisplayString","_withCtx","_createVNode","_Fragment","_renderList","_createCommentVNode","_createTextVNode","OptionsEditor","TextEditor","NumberEditor","StarEditor","_sfc_main","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_Fragment","_renderList","_createBlock","FilterChip","_renderSlot","_createCommentVNode","_toDisplayString","_unref","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_openBlock","_createElementBlock","_normalizeClass","_normalizeStyle","_withModifiers","_createElementVNode","_unref","_toDisplayString","_createCommentVNode","_createVNode","_createBlock","_withCtx","_createTextVNode","_Fragment","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_createCommentVNode","_Fragment","_renderList","_createBlock","HeaderCell","_normalizeStyle","SkeletonRow","_createVNode","Row","_renderSlot","_toDisplayString","_sfc_main","$props","_hoisted_1","_hoisted_2","_openBlock","_createBlock","_unref","_withCtx","_createVNode","_createElementVNode","_createTextVNode","_toDisplayString","_createCommentVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_normalizeClass","_Fragment","_createVNode","SearchBox","_createElementVNode","_toDisplayString","_unref","_renderSlot","_createBlock","_createCommentVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_useModel","_openBlock","_createBlock","_unref","_withCtx","_createVNode","_createElementVNode","_withModifiers","_createTextVNode","_toDisplayString","_createCommentVNode","_withDirectives","_vModelText","_createElementBlock","_vModelCheckbox","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_useModel","_openBlock","_createBlock","Layer","_unref","_withCtx","_createElementVNode","_toDisplayString","_createElementBlock","_Fragment","_createCommentVNode","_createVNode","_createTextVNode","_renderList","_normalizeClass","_withKeys","_withModifiers","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_openBlock","_createElementBlock","_normalizeClass","_unref","_createVNode","_createCommentVNode","_createElementVNode","_toDisplayString","_renderSlot","_Fragment","_renderList","_createBlock","_resolveDynamicComponent","Layer","_withCtx","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_openBlock","_createElementBlock","_unref","_createElementVNode","_toDisplayString","_Fragment","_createCommentVNode","_createTextVNode","_createVNode","_normalizeClass","_renderList","_sfc_main","$slots","_openBlock","_createElementBlock","_normalizeClass","_unref","_createBlock","BulkBar","_withCtx","_renderSlot","_createCommentVNode","Toolbar","_createSlots","_createVNode","_toDisplayString","ColumnPicker","_createElementVNode","DisplayPopover","_mergeProps","_toHandlers","MoreMenu","ViewMenu","FilterBar","_createTextVNode","GridRoot","StateMessage","Footer","_withDirectives","_normalizeStyle","_vShow","ViewDialog","ConfirmDialog","_sfc_main","getFormat","isComplete","changeOperator","isTextInput","shapeOf","TYPE_SPECS","summarize","typeLabelKey","alignOf","toCondition","matches","opLabel","defaultOperator","operatorsOf","optionLabel","isPlainRowClick","useColumnLayout","readPath","RemoteLabels","DisplayPopover_default","SAVE_KBD","StateMessage_default","SkeletonRow_default","Row_default","SearchBox_default","editorOf","usePreferences","inlineActionsOf","comparator","isNumericType","ConfirmDialog_default","ME","useDelegatedTooltip","avatar","createI18n","useDataTableContext","createContext","createDataTable","DATA_TABLE_KEY","TYPE_ICONS","NumberEditor_default","StarEditor_default","OptionsEditor_default","TextEditor_default","Layer_default","_hoisted_1$10","_hoisted_2$10","_hoisted_3$8","_hoisted_4$8","_hoisted_5$8","_hoisted_6$8","_hoisted_7$8","_hoisted_8$8","_hoisted_9$8","ColumnPicker_default","defineComponent","\"open\"","\"openModifiers\"","__emit","props","__props","emit","open","useModel","q","ref","o","filterable","computed","c","match","filtered","ch","chipped","suggested","rest","taken","empty","pick","id","openBlock","createBlock","unref","PopoverRoot","_cache","$event","withCtx","createVNode","PopoverTrigger","renderSlot","_ctx","PopoverPortal","PopoverContent","ListboxRoot","createElementVNode","PhMagnifyingGlass","ListboxFilter","i18n","ListboxContent","ListboxGroup","ListboxGroupLabel","createTextVNode","toDisplayString","createElementBlock","Fragment","renderList","ListboxItem","resolveDynamicComponent","createCommentVNode","_hoisted_1$9","_hoisted_2$9","_hoisted_3$7","_hoisted_4$7","_hoisted_5$7","_hoisted_6$7","_hoisted_7$7","_hoisted_8$7","_hoisted_9$7","_hoisted_10$7","_hoisted_11$5","_hoisted_12$5","_hoisted_13$5","_hoisted_14$5","_hoisted_15$2","_hoisted_16$2","_hoisted_17$2","_hoisted_18$2","_hoisted_19$2","_hoisted_20$2","FilterChip_default","DateEditor","defineAsyncComponent","type","shape","complete","isBoolean","valueCount","opText","ops","people","tip","aria","editor","status","update","patch","setValue","setOp","op","isMe","unassigned","clear","close","onFocusOutside","toggleBool","normalizeClass","p","DropdownMenuRoot","DropdownMenuTrigger","PhCaretDown","DropdownMenuPortal","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","PhCheck","PhX","FilterBar_default","defOf","column","chipEl","row","el","scrolledEnd","onScroll","ro","onMounted","onBeforeUnmount","watch","nextTick","target","remove","i","next","chip","WIDGET_SELECTOR","useRovingRows","focusedIndex","keyboard","widgetsOf","focusRow","n","opts","index","tryFocus","attempt","onKeydown","e","widgets","at","first","onMousedown","onFocusin","pointerDown","_hoisted_1$8","_hoisted_2$8","_hoisted_3$6","_hoisted_4$6","_hoisted_5$6","_hoisted_6$6","_hoisted_7$6","_hoisted_8$6","_hoisted_9$6","_hoisted_10$6","_hoisted_11$4","_hoisted_12$4","_hoisted_13$4","_hoisted_14$4","HeaderCell_default","def","numeric","align","unit","canSort","canFilter","descId","useId","menuOpen","resizeHandler","cell","k","left","act","action","normalizeStyle","withModifiers","PhArrowUp","PhPushPin","PhFunnel","PhDotsThree","DropdownMenuLabel","MOVE_KBD","_hoisted_1$7","_hoisted_2$7","_hoisted_3$5","_hoisted_4$5","_hoisted_5$5","_hoisted_6$5","_hoisted_7$5","_hoisted_8$5","_hoisted_9$5","_hoisted_10$5","SELECT_W","SELECT_W_PHONE","MENU_PAD","MORE_W","ERROR_SLOT","INLINE_SLOT","GridRoot_default","__expose","ctx","root","scrollEl","layout","coarse","density","selW","anyError","errorOf","r","maxInline","actions","a","m","menuW","cols","startVars","endVars","name","value","extra","rowHeight","headH","barH","readBarH","readRowHeight","v","env","labels","headerLabels","cellsOf","focusHeader","els","rowIdAt","isSelected","isExpanded","canExpandRow","labelOf","uid","subrowId","rowUid","rowEl","roving","virtualizer","anchor","idsBetween","from","to","b","menuIndex","mod","onSelect","shift","selectedCount","allSelected","someSelected","skeleton","count","useVirtualizer","start","range","end","out","f","virtualRows","totalSize","measureItem","key","before","now","scrolledStart","shallowRef","pill","pillTimer","lastTop","pillText","downPoint","onClick","link","toRaw","sortOf","columnSortable","fitToContent","items","col","max","pad","onHeaderAction","focused","onHeaderNav","lastKeys","keys","hadFocus","prevKey","same","args","\"left\"","additive","d","w","\"right\"","item","_hoisted_1$6","_hoisted_2$6","MoreMenu_default","hasActions","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuSubContent","DropdownMenuCheckboxItem","_hoisted_1$5","_hoisted_2$5","Toolbar_default","searchOpen","searchBox","phone","phoneSearch","openSearch","cancelSearch","defaultView","preferredId","views","normFilter","filtersKey","fs","sorted","ids","sameState","ca","cb","x","y","nameError","lower","locale","selfId","byName","collator","useViews","saved","all","sections","activeId","active","baseline","drafts","reactive","edited","touched","activate","view","prev","keepDraft","draft","initial","listed","vs","replace","writable","input","_hoisted_1$4","_hoisted_2$4","_hoisted_3$4","_hoisted_4$4","_hoisted_5$4","_hoisted_6$4","_hoisted_7$4","_hoisted_8$4","_hoisted_9$4","_hoisted_10$4","ViewDialog_default","makeDefault","error","focusName","submit","DialogRoot","DialogPortal","DialogOverlay","DialogContent","DialogTitle","DialogDescription","withDirectives","vModelText","vModelCheckbox","DialogClose","_hoisted_1$3","_hoisted_2$3","_hoisted_3$3","_hoisted_4$3","_hoisted_5$3","_hoisted_6$3","_hoisted_7$3","_hoisted_8$3","_hoisted_9$3","_hoisted_10$3","_hoisted_11$3","_hoisted_12$3","_hoisted_13$3","_hoisted_14$3","_hoisted_15$1","_hoisted_16$1","_hoisted_17$1","_hoisted_18$1","_hoisted_19$1","_hoisted_20$1","ViewMenu_default","label","groups","title","hint","g","isEdited","canEdit","after","fn","withKeys","PhPlus","_hoisted_1$2","_hoisted_2$2","_hoisted_3$2","_hoisted_4$2","_hoisted_5$2","_hoisted_6$2","_hoisted_7$2","_hoisted_8$2","_hoisted_9$2","_hoisted_10$2","_hoisted_11$2","_hoisted_12$2","_hoisted_13$2","_hoisted_14$2","BulkBar_default","shown","inBar","bar","others","firstDestructive","disabledOf","tipOf","moreOpen","run","btn","_hoisted_1$1","_hoisted_2$1","_hoisted_3$1","_hoisted_4$1","_hoisted_5$1","_hoisted_6$1","_hoisted_7$1","_hoisted_8$1","_hoisted_9$1","_hoisted_10$1","_hoisted_11$1","_hoisted_12$1","_hoisted_13$1","_hoisted_14$1","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","Footer_default","fmt","lastPage","single","time","canPrev","canNext","updatedText","PhCircleNotch","PhArrowClockwise","s","PhCaretLeft","PhCaretRight","features","tableFeatures","createSortedRowModel","createFilteredRowModel","createPaginatedRowModel","isEmpty","isSearchable","useListTable","defs","toValue","isServer","tanstackColumns","cmp","cond","columnId","normalizedSearch","state","searchableIds","table","useTable","filterValue","functionalUpdate","u","rows","total","toggleSort","current","existing","multi","setSort","dir","rowId","sel","STILL_LOADING_MS","COLUMNS_DEBOUNCE_MS","useRequest","pending","reason","snapshot","updatedAt","stillLoading","controller","stillTimer","columnsTimer","lastFields","settle","send","query","why","queryKey","pageKey","fieldsKey","prevQ","err","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","DataTable_default","FiltersSheet","PhoneMoreSheet","vnodeProps","getCurrentInstance","listens","entity","ariaLabel","rootEl","width","size","measure","pref","search","sort","page","goTo","setSearch","chips","editing","pickerOpen","typeOf","filters","filteredColumns","hasFilter","summaryOf","currenciesOf","updateChip","removeChip","setEditing","clearFilters","filtersSheet","applySheet","visibleColumns","fields","queryWithoutPage","polite","assertive","vw","viewMenuOpen","viewSummary","more","pinned","headerOf","resolveState","viewDialog","viewDialogOpen","confirmDelete","openSaveAs","openRename","validateViewName","onViewDialogSave","removeView","rowSelection","expanded","expandOn","canExpandFn","list","req","onSort","onSortSet","sortMap","rowsShown","hasRows","identityChange","dim","slow","slowTimer","on","refreshing","refreshBar","barTimer","busy","bodyState","errorInfo","noResultsTitle","params","clock","snap","footerRows","footerPage","footerHasMore","countCtl","counting","countedAt","t","grid","setPageSize","sm","autoRefreshOn","autoTimer","freshness","hasSearch","hasDisplay","hasMore","searchPlaceholder","toolbarRef","displayProps","displayOn","visible","delta","onExport","primaryDef","primaryHref","primaryLabel","rowMenu","selectedRows","clearSelection","selectRows","keep","toggleExpand","sub","onRowClick","onRowOpen","toast","toastTimer","copyId","onPrint","copyErrorId","onKey","inLayer","tooltip","createSlots","iconOnly","mergeProps","toHandlers","PhWarning","l","vShow","storage","ls","probe","mem","readJson","raw","kv","fallback","requireScope","scope","newId","createLocalStorageViews","options","tableId","read","write","createLocalStoragePreferences","prefs"],"sources":["../src/core/filters/ColumnPicker.vue","../src/core/filters/ColumnPicker.vue","../src/core/filters/FilterChip.vue","../src/core/filters/FilterChip.vue","../src/core/filters/FilterBar.vue","../src/core/filters/FilterBar.vue","../src/core/interaction/useRovingRows.ts","../src/core/grid/HeaderCell.vue","../src/core/grid/HeaderCell.vue","../src/core/grid/GridRoot.vue","../src/core/grid/GridRoot.vue","../src/core/toolbar/MoreMenu.vue","../src/core/toolbar/MoreMenu.vue","../src/core/toolbar/Toolbar.vue","../src/core/toolbar/Toolbar.vue","../src/core/views/model.ts","../src/core/views/useViews.ts","../src/core/views/ViewDialog.vue","../src/core/views/ViewDialog.vue","../src/core/views/ViewMenu.vue","../src/core/views/ViewMenu.vue","../src/list/BulkBar.vue","../src/list/BulkBar.vue","../src/list/footer/Footer.vue","../src/list/footer/Footer.vue","../src/list/useListTable.ts","../src/list/useRequest.ts","../src/list/DataTable.vue","../src/list/DataTable.vue","../src/core/adapters/localStorage.ts"],"sourcesContent":["<script setup lang=\"ts\">\n// Column picker (04 §2, handoff 03 §3.2, T2-01): arama (odaklı) + Filtered (“opens its chip”, D2) · Suggested (≤ 4) · All columns.\nimport { PhMagnifyingGlass } from '@phosphor-icons/vue'\nimport {\n ListboxContent,\n ListboxFilter,\n ListboxGroup,\n ListboxGroupLabel,\n ListboxItem,\n ListboxRoot,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n} from 'reka-ui'\nimport { computed, ref, watch } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport { TYPE_SPECS, typeLabelKey } from '../cells/specs'\nimport { useDataTableContext } from '../plugin'\nimport type { Chip } from './model'\nimport { TYPE_ICONS } from './typeIcons'\n\nconst props = defineProps<{ columns: ColumnDef[]; chips: Chip[] }>()\nconst emit = defineEmits<{ pick: [columnId: string] }>()\nconst open = defineModel<boolean>('open', { default: false })\nconst { i18n } = useDataTableContext()\nconst q = ref('')\nwatch(open, (o) => {\n if (!o) q.value = ''\n})\n\nconst filterable = computed(() => props.columns.filter((c) => c.filterable ?? TYPE_SPECS[c.type].filterable))\nconst match = (c: ColumnDef) => !q.value || c.header.toLocaleLowerCase().includes(q.value.toLocaleLowerCase())\nconst filtered = computed(() =>\n props.chips\n .map((ch) => filterable.value.find((c) => c.id === ch.column))\n .filter((c): c is ColumnDef => !!c && match(c)),\n)\nconst chipped = computed(() => new Set(props.chips.map((c) => c.column)))\nconst suggested = computed(() =>\n filterable.value.filter((c) => c.suggested && !chipped.value.has(c.id as string) && match(c)).slice(0, 4),\n)\nconst rest = computed(() => {\n const taken = new Set([...chipped.value, ...suggested.value.map((c) => c.id as string)])\n return filterable.value.filter((c) => !taken.has(c.id as string) && match(c))\n})\nconst empty = computed(() => !filtered.value.length && !suggested.value.length && !rest.value.length)\nconst pick = (id: unknown) => {\n if (typeof id !== 'string') return\n open.value = false\n emit('pick', id)\n}\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\">\n <PopoverTrigger as-child><slot name=\"trigger\" /></PopoverTrigger>\n <PopoverPortal>\n <PopoverContent class=\"dt-pop dt-picker\" align=\"start\" :side-offset=\"4\">\n <ListboxRoot\n :model-value=\"undefined\"\n selection-behavior=\"replace\"\n highlight-on-hover\n @update:model-value=\"pick\"\n >\n <label class=\"dt-input has-icon dt-picker-search\">\n <span class=\"dt-input-icon\"><PhMagnifyingGlass :size=\"14\" aria-hidden=\"true\" /></span>\n <ListboxFilter\n v-model=\"q\"\n auto-focus\n :placeholder=\"i18n.t('picker.search')\"\n :aria-label=\"i18n.t('picker.search')\"\n />\n </label>\n <ListboxContent class=\"dt-picker-list\" :aria-label=\"i18n.t('display.columns')\">\n <ListboxGroup v-if=\"filtered.length\">\n <ListboxGroupLabel class=\"dt-pop-label\">{{ i18n.t('picker.filtered') }}</ListboxGroupLabel>\n <ListboxItem v-for=\"c in filtered\" :key=\"c.id\" :value=\"c.id\" class=\"dt-picker-item\">\n <component :is=\"TYPE_ICONS[c.type]\" :size=\"14\" aria-hidden=\"true\" />\n <span class=\"dt-picker-name\">{{ c.header }}</span>\n <span class=\"dt-picker-hint\">{{ i18n.t('picker.filteredHint') }}</span>\n </ListboxItem>\n </ListboxGroup>\n <ListboxGroup v-if=\"suggested.length\">\n <ListboxGroupLabel class=\"dt-pop-label\">{{ i18n.t('picker.suggested') }}</ListboxGroupLabel>\n <ListboxItem v-for=\"c in suggested\" :key=\"c.id\" :value=\"c.id\" class=\"dt-picker-item\">\n <component :is=\"TYPE_ICONS[c.type]\" :size=\"14\" aria-hidden=\"true\" />\n <span class=\"dt-picker-name\">{{ c.header }}</span>\n <span class=\"dt-picker-hint\">{{ i18n.t(typeLabelKey(c.type)) }}</span>\n </ListboxItem>\n </ListboxGroup>\n <ListboxGroup v-if=\"rest.length\">\n <ListboxGroupLabel class=\"dt-pop-label\">{{ i18n.t('picker.allColumns') }}</ListboxGroupLabel>\n <ListboxItem v-for=\"c in rest\" :key=\"c.id\" :value=\"c.id\" class=\"dt-picker-item\">\n <component :is=\"TYPE_ICONS[c.type]\" :size=\"14\" aria-hidden=\"true\" />\n <span class=\"dt-picker-name\">{{ c.header }}</span>\n <span class=\"dt-picker-hint\">{{ i18n.t(typeLabelKey(c.type)) }}</span>\n </ListboxItem>\n </ListboxGroup>\n <div v-if=\"empty\" class=\"dt-options-empty\">{{ i18n.t('picker.noMatch') }}</div>\n </ListboxContent>\n </ListboxRoot>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","<script setup lang=\"ts\">\n// Column picker (04 §2, handoff 03 §3.2, T2-01): arama (odaklı) + Filtered (“opens its chip”, D2) · Suggested (≤ 4) · All columns.\nimport { PhMagnifyingGlass } from '@phosphor-icons/vue'\nimport {\n ListboxContent,\n ListboxFilter,\n ListboxGroup,\n ListboxGroupLabel,\n ListboxItem,\n ListboxRoot,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n} from 'reka-ui'\nimport { computed, ref, watch } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport { TYPE_SPECS, typeLabelKey } from '../cells/specs'\nimport { useDataTableContext } from '../plugin'\nimport type { Chip } from './model'\nimport { TYPE_ICONS } from './typeIcons'\n\nconst props = defineProps<{ columns: ColumnDef[]; chips: Chip[] }>()\nconst emit = defineEmits<{ pick: [columnId: string] }>()\nconst open = defineModel<boolean>('open', { default: false })\nconst { i18n } = useDataTableContext()\nconst q = ref('')\nwatch(open, (o) => {\n if (!o) q.value = ''\n})\n\nconst filterable = computed(() => props.columns.filter((c) => c.filterable ?? TYPE_SPECS[c.type].filterable))\nconst match = (c: ColumnDef) => !q.value || c.header.toLocaleLowerCase().includes(q.value.toLocaleLowerCase())\nconst filtered = computed(() =>\n props.chips\n .map((ch) => filterable.value.find((c) => c.id === ch.column))\n .filter((c): c is ColumnDef => !!c && match(c)),\n)\nconst chipped = computed(() => new Set(props.chips.map((c) => c.column)))\nconst suggested = computed(() =>\n filterable.value.filter((c) => c.suggested && !chipped.value.has(c.id as string) && match(c)).slice(0, 4),\n)\nconst rest = computed(() => {\n const taken = new Set([...chipped.value, ...suggested.value.map((c) => c.id as string)])\n return filterable.value.filter((c) => !taken.has(c.id as string) && match(c))\n})\nconst empty = computed(() => !filtered.value.length && !suggested.value.length && !rest.value.length)\nconst pick = (id: unknown) => {\n if (typeof id !== 'string') return\n open.value = false\n emit('pick', id)\n}\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\">\n <PopoverTrigger as-child><slot name=\"trigger\" /></PopoverTrigger>\n <PopoverPortal>\n <PopoverContent class=\"dt-pop dt-picker\" align=\"start\" :side-offset=\"4\">\n <ListboxRoot\n :model-value=\"undefined\"\n selection-behavior=\"replace\"\n highlight-on-hover\n @update:model-value=\"pick\"\n >\n <label class=\"dt-input has-icon dt-picker-search\">\n <span class=\"dt-input-icon\"><PhMagnifyingGlass :size=\"14\" aria-hidden=\"true\" /></span>\n <ListboxFilter\n v-model=\"q\"\n auto-focus\n :placeholder=\"i18n.t('picker.search')\"\n :aria-label=\"i18n.t('picker.search')\"\n />\n </label>\n <ListboxContent class=\"dt-picker-list\" :aria-label=\"i18n.t('display.columns')\">\n <ListboxGroup v-if=\"filtered.length\">\n <ListboxGroupLabel class=\"dt-pop-label\">{{ i18n.t('picker.filtered') }}</ListboxGroupLabel>\n <ListboxItem v-for=\"c in filtered\" :key=\"c.id\" :value=\"c.id\" class=\"dt-picker-item\">\n <component :is=\"TYPE_ICONS[c.type]\" :size=\"14\" aria-hidden=\"true\" />\n <span class=\"dt-picker-name\">{{ c.header }}</span>\n <span class=\"dt-picker-hint\">{{ i18n.t('picker.filteredHint') }}</span>\n </ListboxItem>\n </ListboxGroup>\n <ListboxGroup v-if=\"suggested.length\">\n <ListboxGroupLabel class=\"dt-pop-label\">{{ i18n.t('picker.suggested') }}</ListboxGroupLabel>\n <ListboxItem v-for=\"c in suggested\" :key=\"c.id\" :value=\"c.id\" class=\"dt-picker-item\">\n <component :is=\"TYPE_ICONS[c.type]\" :size=\"14\" aria-hidden=\"true\" />\n <span class=\"dt-picker-name\">{{ c.header }}</span>\n <span class=\"dt-picker-hint\">{{ i18n.t(typeLabelKey(c.type)) }}</span>\n </ListboxItem>\n </ListboxGroup>\n <ListboxGroup v-if=\"rest.length\">\n <ListboxGroupLabel class=\"dt-pop-label\">{{ i18n.t('picker.allColumns') }}</ListboxGroupLabel>\n <ListboxItem v-for=\"c in rest\" :key=\"c.id\" :value=\"c.id\" class=\"dt-picker-item\">\n <component :is=\"TYPE_ICONS[c.type]\" :size=\"14\" aria-hidden=\"true\" />\n <span class=\"dt-picker-name\">{{ c.header }}</span>\n <span class=\"dt-picker-hint\">{{ i18n.t(typeLabelKey(c.type)) }}</span>\n </ListboxItem>\n </ListboxGroup>\n <div v-if=\"empty\" class=\"dt-options-empty\">{{ i18n.t('picker.noMatch') }}</div>\n </ListboxContent>\n </ListboxRoot>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","<script setup lang=\"ts\">\n// Filtre çipi (04 §3, handoff 02 §5): `[ikon] Alan · operatör · değer │ ×` — iki tıklama hedefi. Gövde değer popover'ını\n// açar (üstte operatör menüsü, tipe göre editör, altta durum + Clear); `boolean`'da popover yok, tıklama Yes ↔ No.\nimport { PhCaretDown, PhCheck, PhX } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n} from 'reka-ui'\nimport { computed, defineAsyncComponent } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport type { FilterOp } from '../../types/query'\nimport type { RemoteLabels } from '../cells/remoteLabels'\nimport { avatar } from '../cells/renderCell'\n// Takvim (@internationalized/date) yalnızca tarih çipi açılınca yüklenir: çekirdek paket boyutu (10 · ≤ 60 kB).\nconst DateEditor = defineAsyncComponent(() => import('../editors/DateEditor.vue'))\nimport NumberEditor from '../editors/NumberEditor.vue'\nimport OptionsEditor from '../editors/OptionsEditor.vue'\nimport StarEditor from '../editors/StarEditor.vue'\nimport TextEditor from '../editors/TextEditor.vue'\nimport { useDataTableContext } from '../plugin'\nimport { changeOperator, editorOf, isComplete, opLabel, operatorsOf, shapeOf, type Chip, type Summary } from './model'\nimport { TYPE_ICONS } from './typeIcons'\n\nconst props = defineProps<{\n chip: Chip\n column: ColumnDef\n editing: boolean\n summary: Summary\n rows: object[]\n labels: RemoteLabels\n currencies: string[]\n /** Telefon çipi (handoff 04 §3): operatör ve × yok; tamamı tek düğme, `open` yayar (Filters alt sayfası). */\n phone?: boolean\n}>()\nconst emit = defineEmits<{ 'update:chip': [chip: Chip]; remove: []; 'update:editing': [open: boolean]; open: [] }>()\nconst { i18n } = useDataTableContext()\n\nconst type = computed(() => props.column.type)\nconst shape = computed(() => shapeOf(props.chip.op, type.value))\nconst complete = computed(() => isComplete(props.chip, type.value))\nconst isBoolean = computed(() => type.value === 'boolean')\nconst valueCount = computed(() => (Array.isArray(props.chip.value) ? props.chip.value.length : 1))\nconst opText = computed(() => opLabel(i18n, props.chip.op, type.value, valueCount.value))\nconst ops = computed(() => operatorsOf(props.column))\nconst people = computed(() => props.summary.people?.slice(0, 3) ?? [])\nconst tip = computed(() =>\n props.summary.full && props.summary.full !== props.summary.text ? props.summary.full : undefined,\n)\nconst aria = computed(() =>\n complete.value\n ? i18n.t('filter.valueAria', { column: props.column.header, op: opText.value, value: props.summary.text })\n : i18n.t('filter.chooseValueAria', { column: props.column.header }),\n)\nconst editor = computed(() => editorOf(props.chip.op, type.value))\nconst status = computed(() => {\n if (editor.value === 'options' && valueCount.value && Array.isArray(props.chip.value) && props.chip.value.length)\n return i18n.t('option.selected', { count: props.chip.value.length })\n if (shape.value === 'range') return i18n.t('number.boundsIncluded')\n if (shape.value === 'dateRange') return i18n.t('date.presetsRelative')\n return ''\n})\n\nconst update = (patch: Partial<Chip>) => emit('update:chip', { ...props.chip, ...patch })\nconst setValue = (value: unknown) =>\n update({\n value,\n currency: type.value === 'currency' ? (props.chip.currency ?? props.currencies[0]) : props.chip.currency,\n })\nconst setOp = (op: FilterOp) => emit('update:chip', changeOperator(props.chip, op, type.value))\nconst isMe = () => emit('update:chip', { ...props.chip, op: 'in', value: ['@me'] })\n/** Kişi listesinde Unassigned: `is_empty` ile değişimli (boş değer `in` listesinde taşınamaz). */\nconst unassigned = () => (props.chip.op === 'is_empty' ? setOp('in') : setOp('is_empty'))\nconst clear = () => update({ value: undefined })\nconst close = () => emit('update:editing', false)\n/** Picker / header menüsü kapanırken odak kendi tetikleyicisine döner; bu \"dışarı odak\" yeni açılan editörü kapatmasın. */\nconst onFocusOutside = (e: CustomEvent<{ originalEvent: FocusEvent }>) => {\n const t = e.detail.originalEvent.target\n if (t instanceof Element && t.closest('.dt-filter-trigger, .dt-head-menu, .dt-head-filtered')) e.preventDefault()\n}\nconst toggleBool = () => update({ value: !(props.chip.value === true) })\n</script>\n\n<template>\n <span\n class=\"dt-chip\"\n :class=\"{ 'is-editing': editing, 'is-incomplete': !complete, 'is-phone': phone }\"\n :data-col=\"chip.column\"\n >\n <button\n v-if=\"phone\"\n type=\"button\"\n class=\"dt-chip-body\"\n :aria-label=\"i18n.t('mobile.chipAria', { summary: `${column.header} ${opText} ${summary.text}`.trim() })\"\n @click=\"emit('open')\"\n >\n <component :is=\"TYPE_ICONS[type]\" :size=\"14\" class=\"dt-chip-icon\" aria-hidden=\"true\" />\n <span class=\"dt-chip-field\">{{ column.header }}</span>\n <span class=\"dt-chip-value\">{{ summary.text }}</span>\n </button>\n <PopoverRoot v-else-if=\"!isBoolean\" :open=\"editing\" @update:open=\"(o) => emit('update:editing', o)\">\n <PopoverTrigger as-child>\n <button type=\"button\" class=\"dt-chip-body\" :aria-label=\"aria\">\n <component :is=\"TYPE_ICONS[type]\" :size=\"14\" class=\"dt-chip-icon\" aria-hidden=\"true\" />\n <span class=\"dt-chip-field\">{{ column.header }}</span>\n <span class=\"dt-chip-op\">{{ opText }}</span>\n <span\n v-if=\"shape !== 'none'\"\n class=\"dt-chip-value\"\n :class=\"{ 'is-placeholder': !complete }\"\n :data-dt-tip=\"tip\"\n >\n <template v-if=\"complete && people.length\">\n <span class=\"dt-chip-avatars\">\n <component\n :is=\"() => avatar({ value: p.value, label: p.label })\"\n v-for=\"p in people\"\n :key=\"String(p.value)\"\n />\n </span>\n </template>\n {{ complete ? summary.text : i18n.t('filter.selectValue') }}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverPortal>\n <PopoverContent\n class=\"dt-pop dt-chip-pop\"\n :class=\"`is-${editor ?? 'none'}`\"\n align=\"start\"\n :side-offset=\"4\"\n @focus-outside=\"onFocusOutside\"\n >\n <div class=\"dt-chip-pop-head\">\n <span class=\"dt-chip-pop-field\">{{ column.header }}</span>\n <DropdownMenuRoot>\n <DropdownMenuTrigger as-child>\n <button type=\"button\" class=\"dt-op-btn\">\n {{ opText }}\n <PhCaretDown :size=\"12\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent class=\"dt-menu dt-op-menu\" align=\"start\" :side-offset=\"6\">\n <DropdownMenuItem v-if=\"type === 'user'\" class=\"dt-menu-item\" @select=\"isMe\">\n {{ i18n.t('op.isMe') }}\n </DropdownMenuItem>\n <template v-for=\"op in ops\" :key=\"op\">\n <DropdownMenuSeparator v-if=\"op === 'is_empty'\" class=\"dt-menu-sep\" />\n <DropdownMenuItem\n class=\"dt-menu-item\"\n :class=\"{ 'is-selected': op === chip.op }\"\n @select=\"setOp(op)\"\n >\n {{ opLabel(i18n, op, type, valueCount) }}\n <PhCheck v-if=\"op === chip.op\" :size=\"14\" class=\"dt-pop-end\" aria-hidden=\"true\" />\n </DropdownMenuItem>\n </template>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </div>\n <div v-if=\"editor\" class=\"dt-chip-pop-body\">\n <OptionsEditor\n v-if=\"editor === 'options'\"\n :column=\"column\"\n :op=\"chip.op\"\n :model-value=\"Array.isArray(chip.value) ? (chip.value as Array<string | number>) : []\"\n :rows=\"rows\"\n :labels=\"labels\"\n @update:model-value=\"setValue\"\n @unassigned=\"unassigned\"\n />\n <TextEditor\n v-else-if=\"editor === 'text'\"\n :column=\"column\"\n :op=\"chip.op\"\n :model-value=\"chip.value\"\n @update:model-value=\"setValue\"\n @done=\"close\"\n />\n <NumberEditor\n v-else-if=\"editor === 'number'\"\n :column=\"column\"\n :op=\"chip.op\"\n :model-value=\"chip.value\"\n :currency=\"chip.currency\"\n :currencies=\"currencies\"\n @update:model-value=\"setValue\"\n @update:currency=\"(c) => update({ currency: c })\"\n @done=\"close\"\n />\n <StarEditor\n v-else-if=\"editor === 'star'\"\n :column=\"column\"\n :model-value=\"chip.value\"\n @update:model-value=\"setValue\"\n @done=\"close\"\n />\n <DateEditor v-else :op=\"chip.op\" :model-value=\"chip.value\" @update:model-value=\"setValue\" @done=\"close\" />\n </div>\n <div class=\"dt-pop-foot\">\n <span>{{ status }}</span>\n <button type=\"button\" class=\"dt-pop-action\" :disabled=\"chip.value === undefined\" @click=\"clear\">\n {{ i18n.t('common.clear') }}\n </button>\n </div>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n <button v-else type=\"button\" class=\"dt-chip-body\" :aria-label=\"aria\" @click=\"toggleBool\">\n <component :is=\"TYPE_ICONS[type]\" :size=\"14\" class=\"dt-chip-icon\" aria-hidden=\"true\" />\n <span class=\"dt-chip-field\">{{ column.header }}</span>\n <span class=\"dt-chip-op\">{{ opText }}</span>\n <span class=\"dt-chip-value\">{{ summary.text }}</span>\n </button>\n <button\n v-if=\"!phone\"\n type=\"button\"\n class=\"dt-chip-remove\"\n :aria-label=\"i18n.t('filter.removeAria', { column: column.header })\"\n @click=\"emit('remove')\"\n >\n <PhX :size=\"12\" aria-hidden=\"true\" />\n </button>\n </span>\n</template>\n","<script setup lang=\"ts\">\n// Filtre çipi (04 §3, handoff 02 §5): `[ikon] Alan · operatör · değer │ ×` — iki tıklama hedefi. Gövde değer popover'ını\n// açar (üstte operatör menüsü, tipe göre editör, altta durum + Clear); `boolean`'da popover yok, tıklama Yes ↔ No.\nimport { PhCaretDown, PhCheck, PhX } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n} from 'reka-ui'\nimport { computed, defineAsyncComponent } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport type { FilterOp } from '../../types/query'\nimport type { RemoteLabels } from '../cells/remoteLabels'\nimport { avatar } from '../cells/renderCell'\n// Takvim (@internationalized/date) yalnızca tarih çipi açılınca yüklenir: çekirdek paket boyutu (10 · ≤ 60 kB).\nconst DateEditor = defineAsyncComponent(() => import('../editors/DateEditor.vue'))\nimport NumberEditor from '../editors/NumberEditor.vue'\nimport OptionsEditor from '../editors/OptionsEditor.vue'\nimport StarEditor from '../editors/StarEditor.vue'\nimport TextEditor from '../editors/TextEditor.vue'\nimport { useDataTableContext } from '../plugin'\nimport { changeOperator, editorOf, isComplete, opLabel, operatorsOf, shapeOf, type Chip, type Summary } from './model'\nimport { TYPE_ICONS } from './typeIcons'\n\nconst props = defineProps<{\n chip: Chip\n column: ColumnDef\n editing: boolean\n summary: Summary\n rows: object[]\n labels: RemoteLabels\n currencies: string[]\n /** Telefon çipi (handoff 04 §3): operatör ve × yok; tamamı tek düğme, `open` yayar (Filters alt sayfası). */\n phone?: boolean\n}>()\nconst emit = defineEmits<{ 'update:chip': [chip: Chip]; remove: []; 'update:editing': [open: boolean]; open: [] }>()\nconst { i18n } = useDataTableContext()\n\nconst type = computed(() => props.column.type)\nconst shape = computed(() => shapeOf(props.chip.op, type.value))\nconst complete = computed(() => isComplete(props.chip, type.value))\nconst isBoolean = computed(() => type.value === 'boolean')\nconst valueCount = computed(() => (Array.isArray(props.chip.value) ? props.chip.value.length : 1))\nconst opText = computed(() => opLabel(i18n, props.chip.op, type.value, valueCount.value))\nconst ops = computed(() => operatorsOf(props.column))\nconst people = computed(() => props.summary.people?.slice(0, 3) ?? [])\nconst tip = computed(() =>\n props.summary.full && props.summary.full !== props.summary.text ? props.summary.full : undefined,\n)\nconst aria = computed(() =>\n complete.value\n ? i18n.t('filter.valueAria', { column: props.column.header, op: opText.value, value: props.summary.text })\n : i18n.t('filter.chooseValueAria', { column: props.column.header }),\n)\nconst editor = computed(() => editorOf(props.chip.op, type.value))\nconst status = computed(() => {\n if (editor.value === 'options' && valueCount.value && Array.isArray(props.chip.value) && props.chip.value.length)\n return i18n.t('option.selected', { count: props.chip.value.length })\n if (shape.value === 'range') return i18n.t('number.boundsIncluded')\n if (shape.value === 'dateRange') return i18n.t('date.presetsRelative')\n return ''\n})\n\nconst update = (patch: Partial<Chip>) => emit('update:chip', { ...props.chip, ...patch })\nconst setValue = (value: unknown) =>\n update({\n value,\n currency: type.value === 'currency' ? (props.chip.currency ?? props.currencies[0]) : props.chip.currency,\n })\nconst setOp = (op: FilterOp) => emit('update:chip', changeOperator(props.chip, op, type.value))\nconst isMe = () => emit('update:chip', { ...props.chip, op: 'in', value: ['@me'] })\n/** Kişi listesinde Unassigned: `is_empty` ile değişimli (boş değer `in` listesinde taşınamaz). */\nconst unassigned = () => (props.chip.op === 'is_empty' ? setOp('in') : setOp('is_empty'))\nconst clear = () => update({ value: undefined })\nconst close = () => emit('update:editing', false)\n/** Picker / header menüsü kapanırken odak kendi tetikleyicisine döner; bu \"dışarı odak\" yeni açılan editörü kapatmasın. */\nconst onFocusOutside = (e: CustomEvent<{ originalEvent: FocusEvent }>) => {\n const t = e.detail.originalEvent.target\n if (t instanceof Element && t.closest('.dt-filter-trigger, .dt-head-menu, .dt-head-filtered')) e.preventDefault()\n}\nconst toggleBool = () => update({ value: !(props.chip.value === true) })\n</script>\n\n<template>\n <span\n class=\"dt-chip\"\n :class=\"{ 'is-editing': editing, 'is-incomplete': !complete, 'is-phone': phone }\"\n :data-col=\"chip.column\"\n >\n <button\n v-if=\"phone\"\n type=\"button\"\n class=\"dt-chip-body\"\n :aria-label=\"i18n.t('mobile.chipAria', { summary: `${column.header} ${opText} ${summary.text}`.trim() })\"\n @click=\"emit('open')\"\n >\n <component :is=\"TYPE_ICONS[type]\" :size=\"14\" class=\"dt-chip-icon\" aria-hidden=\"true\" />\n <span class=\"dt-chip-field\">{{ column.header }}</span>\n <span class=\"dt-chip-value\">{{ summary.text }}</span>\n </button>\n <PopoverRoot v-else-if=\"!isBoolean\" :open=\"editing\" @update:open=\"(o) => emit('update:editing', o)\">\n <PopoverTrigger as-child>\n <button type=\"button\" class=\"dt-chip-body\" :aria-label=\"aria\">\n <component :is=\"TYPE_ICONS[type]\" :size=\"14\" class=\"dt-chip-icon\" aria-hidden=\"true\" />\n <span class=\"dt-chip-field\">{{ column.header }}</span>\n <span class=\"dt-chip-op\">{{ opText }}</span>\n <span\n v-if=\"shape !== 'none'\"\n class=\"dt-chip-value\"\n :class=\"{ 'is-placeholder': !complete }\"\n :data-dt-tip=\"tip\"\n >\n <template v-if=\"complete && people.length\">\n <span class=\"dt-chip-avatars\">\n <component\n :is=\"() => avatar({ value: p.value, label: p.label })\"\n v-for=\"p in people\"\n :key=\"String(p.value)\"\n />\n </span>\n </template>\n {{ complete ? summary.text : i18n.t('filter.selectValue') }}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverPortal>\n <PopoverContent\n class=\"dt-pop dt-chip-pop\"\n :class=\"`is-${editor ?? 'none'}`\"\n align=\"start\"\n :side-offset=\"4\"\n @focus-outside=\"onFocusOutside\"\n >\n <div class=\"dt-chip-pop-head\">\n <span class=\"dt-chip-pop-field\">{{ column.header }}</span>\n <DropdownMenuRoot>\n <DropdownMenuTrigger as-child>\n <button type=\"button\" class=\"dt-op-btn\">\n {{ opText }}\n <PhCaretDown :size=\"12\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent class=\"dt-menu dt-op-menu\" align=\"start\" :side-offset=\"6\">\n <DropdownMenuItem v-if=\"type === 'user'\" class=\"dt-menu-item\" @select=\"isMe\">\n {{ i18n.t('op.isMe') }}\n </DropdownMenuItem>\n <template v-for=\"op in ops\" :key=\"op\">\n <DropdownMenuSeparator v-if=\"op === 'is_empty'\" class=\"dt-menu-sep\" />\n <DropdownMenuItem\n class=\"dt-menu-item\"\n :class=\"{ 'is-selected': op === chip.op }\"\n @select=\"setOp(op)\"\n >\n {{ opLabel(i18n, op, type, valueCount) }}\n <PhCheck v-if=\"op === chip.op\" :size=\"14\" class=\"dt-pop-end\" aria-hidden=\"true\" />\n </DropdownMenuItem>\n </template>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </div>\n <div v-if=\"editor\" class=\"dt-chip-pop-body\">\n <OptionsEditor\n v-if=\"editor === 'options'\"\n :column=\"column\"\n :op=\"chip.op\"\n :model-value=\"Array.isArray(chip.value) ? (chip.value as Array<string | number>) : []\"\n :rows=\"rows\"\n :labels=\"labels\"\n @update:model-value=\"setValue\"\n @unassigned=\"unassigned\"\n />\n <TextEditor\n v-else-if=\"editor === 'text'\"\n :column=\"column\"\n :op=\"chip.op\"\n :model-value=\"chip.value\"\n @update:model-value=\"setValue\"\n @done=\"close\"\n />\n <NumberEditor\n v-else-if=\"editor === 'number'\"\n :column=\"column\"\n :op=\"chip.op\"\n :model-value=\"chip.value\"\n :currency=\"chip.currency\"\n :currencies=\"currencies\"\n @update:model-value=\"setValue\"\n @update:currency=\"(c) => update({ currency: c })\"\n @done=\"close\"\n />\n <StarEditor\n v-else-if=\"editor === 'star'\"\n :column=\"column\"\n :model-value=\"chip.value\"\n @update:model-value=\"setValue\"\n @done=\"close\"\n />\n <DateEditor v-else :op=\"chip.op\" :model-value=\"chip.value\" @update:model-value=\"setValue\" @done=\"close\" />\n </div>\n <div class=\"dt-pop-foot\">\n <span>{{ status }}</span>\n <button type=\"button\" class=\"dt-pop-action\" :disabled=\"chip.value === undefined\" @click=\"clear\">\n {{ i18n.t('common.clear') }}\n </button>\n </div>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n <button v-else type=\"button\" class=\"dt-chip-body\" :aria-label=\"aria\" @click=\"toggleBool\">\n <component :is=\"TYPE_ICONS[type]\" :size=\"14\" class=\"dt-chip-icon\" aria-hidden=\"true\" />\n <span class=\"dt-chip-field\">{{ column.header }}</span>\n <span class=\"dt-chip-op\">{{ opText }}</span>\n <span class=\"dt-chip-value\">{{ summary.text }}</span>\n </button>\n <button\n v-if=\"!phone\"\n type=\"button\"\n class=\"dt-chip-remove\"\n :aria-label=\"i18n.t('filter.removeAria', { column: column.header })\"\n @click=\"emit('remove')\"\n >\n <PhX :size=\"12\" aria-hidden=\"true\" />\n </button>\n </span>\n</template>\n","<script setup lang=\"ts\">\n// Filtre satırı (04 §4, D29): tek satır — çipler → Add filter; sağda Clear all sabit. Sığmayan çipler yatay kayar,\n// sağ kenarda solma; düzenlenen / yeni eklenen çip görünür alana kaydırılır. Add filter kayan alanın dışında: çipler sığarken\n// son çipin yanında, taşınca sağda. Sarma ve `+N more` yok (D2 çip sayısını sınırlar).\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport type { RemoteLabels } from '../cells/remoteLabels'\nimport { useDataTableContext } from '../plugin'\nimport FilterChip from './FilterChip.vue'\nimport type { Chip, Summary } from './model'\n\nconst props = defineProps<{\n chips: Chip[]\n defs: ReadonlyMap<string, ColumnDef>\n editing: string | null\n rows: object[]\n labels: RemoteLabels\n summaryOf: (chip: Chip) => Summary\n currenciesOf: (def: ColumnDef) => string[]\n /** Telefon (handoff 04 §3): çipler tek düğme (`open`), Add filter ve Clear all yok (Filters alt sayfasında). */\n phone?: boolean\n}>()\nconst emit = defineEmits<{\n 'update:chip': [chip: Chip]\n remove: [column: string]\n 'update:editing': [column: string | null]\n 'clear-all': []\n open: [column: string]\n}>()\nconst { i18n } = useDataTableContext()\nconst defOf = (column: string) => props.defs.get(column)!\n/** Sütun id'sinde nokta olabilir: seçici yerine dataset karşılaştırması (jsdom'da CSS.escape yok). */\nconst chipEl = (column: string | undefined) =>\n column\n ? [...(row.value?.querySelectorAll<HTMLElement>('.dt-chip') ?? [])].find((el) => el.dataset.col === column)\n : undefined\n\nconst row = ref<HTMLElement | null>(null)\nconst scrolledEnd = ref(false)\nconst onScroll = () => {\n const el = row.value\n if (el) scrolledEnd.value = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n}\nlet ro: ResizeObserver | undefined\nonMounted(() => {\n onScroll()\n if (typeof ResizeObserver !== 'undefined' && row.value) {\n ro = new ResizeObserver(onScroll)\n ro.observe(row.value)\n }\n})\nonBeforeUnmount(() => ro?.disconnect())\nwatch(\n () => [props.chips.length, props.editing],\n () =>\n void nextTick(() => {\n onScroll()\n const target = props.editing ?? props.chips.at(-1)?.column\n chipEl(target)?.scrollIntoView?.({ inline: 'nearest', block: 'nearest' })\n }),\n)\n\n/** × sonrası odak sonraki çipe, yoksa Add filter'a (04 §3). */\nconst remove = (column: string) => {\n const i = props.chips.findIndex((c) => c.column === column)\n const next = props.chips[i + 1]?.column\n emit('remove', column)\n void nextTick(() => {\n const el =\n chipEl(next)?.querySelector<HTMLElement>('.dt-chip-body') ??\n row.value?.parentElement?.querySelector<HTMLElement>('.dt-filter-add')\n el?.focus()\n })\n}\n</script>\n\n<template>\n <div class=\"dt-filter-row\" :class=\"{ 'is-scrolled-end': scrolledEnd }\">\n <div ref=\"row\" class=\"dt-chips\" @scroll.passive=\"onScroll\">\n <FilterChip\n v-for=\"c in chips\"\n :key=\"c.column\"\n :chip=\"c\"\n :column=\"defOf(c.column)\"\n :editing=\"editing === c.column\"\n :summary=\"summaryOf(c)\"\n :rows=\"rows\"\n :labels=\"labels\"\n :currencies=\"currenciesOf(defOf(c.column))\"\n :phone=\"phone\"\n @open=\"emit('open', c.column)\"\n @update:chip=\"(chip) => emit('update:chip', chip)\"\n @update:editing=\"(open) => emit('update:editing', open ? c.column : null)\"\n @remove=\"remove(c.column)\"\n />\n </div>\n <slot v-if=\"!phone\" name=\"add\" />\n <button v-if=\"!phone\" type=\"button\" class=\"dt-btn dt-btn-ghost dt-filter-clear\" @click=\"emit('clear-all')\">\n {{ i18n.t('filter.clearAll') }}\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Filtre satırı (04 §4, D29): tek satır — çipler → Add filter; sağda Clear all sabit. Sığmayan çipler yatay kayar,\n// sağ kenarda solma; düzenlenen / yeni eklenen çip görünür alana kaydırılır. Add filter kayan alanın dışında: çipler sığarken\n// son çipin yanında, taşınca sağda. Sarma ve `+N more` yok (D2 çip sayısını sınırlar).\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport type { RemoteLabels } from '../cells/remoteLabels'\nimport { useDataTableContext } from '../plugin'\nimport FilterChip from './FilterChip.vue'\nimport type { Chip, Summary } from './model'\n\nconst props = defineProps<{\n chips: Chip[]\n defs: ReadonlyMap<string, ColumnDef>\n editing: string | null\n rows: object[]\n labels: RemoteLabels\n summaryOf: (chip: Chip) => Summary\n currenciesOf: (def: ColumnDef) => string[]\n /** Telefon (handoff 04 §3): çipler tek düğme (`open`), Add filter ve Clear all yok (Filters alt sayfasında). */\n phone?: boolean\n}>()\nconst emit = defineEmits<{\n 'update:chip': [chip: Chip]\n remove: [column: string]\n 'update:editing': [column: string | null]\n 'clear-all': []\n open: [column: string]\n}>()\nconst { i18n } = useDataTableContext()\nconst defOf = (column: string) => props.defs.get(column)!\n/** Sütun id'sinde nokta olabilir: seçici yerine dataset karşılaştırması (jsdom'da CSS.escape yok). */\nconst chipEl = (column: string | undefined) =>\n column\n ? [...(row.value?.querySelectorAll<HTMLElement>('.dt-chip') ?? [])].find((el) => el.dataset.col === column)\n : undefined\n\nconst row = ref<HTMLElement | null>(null)\nconst scrolledEnd = ref(false)\nconst onScroll = () => {\n const el = row.value\n if (el) scrolledEnd.value = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n}\nlet ro: ResizeObserver | undefined\nonMounted(() => {\n onScroll()\n if (typeof ResizeObserver !== 'undefined' && row.value) {\n ro = new ResizeObserver(onScroll)\n ro.observe(row.value)\n }\n})\nonBeforeUnmount(() => ro?.disconnect())\nwatch(\n () => [props.chips.length, props.editing],\n () =>\n void nextTick(() => {\n onScroll()\n const target = props.editing ?? props.chips.at(-1)?.column\n chipEl(target)?.scrollIntoView?.({ inline: 'nearest', block: 'nearest' })\n }),\n)\n\n/** × sonrası odak sonraki çipe, yoksa Add filter'a (04 §3). */\nconst remove = (column: string) => {\n const i = props.chips.findIndex((c) => c.column === column)\n const next = props.chips[i + 1]?.column\n emit('remove', column)\n void nextTick(() => {\n const el =\n chipEl(next)?.querySelector<HTMLElement>('.dt-chip-body') ??\n row.value?.parentElement?.querySelector<HTMLElement>('.dt-filter-add')\n el?.focus()\n })\n}\n</script>\n\n<template>\n <div class=\"dt-filter-row\" :class=\"{ 'is-scrolled-end': scrolledEnd }\">\n <div ref=\"row\" class=\"dt-chips\" @scroll.passive=\"onScroll\">\n <FilterChip\n v-for=\"c in chips\"\n :key=\"c.column\"\n :chip=\"c\"\n :column=\"defOf(c.column)\"\n :editing=\"editing === c.column\"\n :summary=\"summaryOf(c)\"\n :rows=\"rows\"\n :labels=\"labels\"\n :currencies=\"currenciesOf(defOf(c.column))\"\n :phone=\"phone\"\n @open=\"emit('open', c.column)\"\n @update:chip=\"(chip) => emit('update:chip', chip)\"\n @update:editing=\"(open) => emit('update:editing', open ? c.column : null)\"\n @remove=\"remove(c.column)\"\n />\n </div>\n <slot v-if=\"!phone\" name=\"add\" />\n <button v-if=\"!phone\" type=\"button\" class=\"dt-btn dt-btn-ghost dt-filter-clear\" @click=\"emit('clear-all')\">\n {{ i18n.t('filter.clearAll') }}\n </button>\n </div>\n</template>\n","// Satır odaklı roving tabindex (08 §2, D24): ızgara tek Tab durağı; oklar satırlar arası; `→` satırın ilk widget'ına,\n// widget'lar arası `←`/`→`, `Esc` satıra. Widget odaklıyken ızgara tuşları kapalı; input kendi oklarını alır.\nimport { ref, type Ref } from 'vue'\nimport { isTextInput } from './isInteractive'\n\n// Seçim kutusu (`X`) ve expand chevron'u (`→`/`←`) kendi tuşlarıyla kullanılır; ilk widget birincil link kalır (08 §2).\nconst WIDGET_SELECTOR =\n 'a[href], button:not([disabled]):not(.dt-expand), input:not([disabled]):not(.dt-select-box), select:not([disabled]), textarea:not([disabled]), [tabindex=\"-1\"][role]'\n\nexport interface RovingOptions {\n count: () => number\n rowEl: (index: number) => HTMLElement | null\n /** Satırı DOM'a getirip odaklamak için (sanal liste). */\n scrollToIndex: (index: number) => void\n /** Bir ekranlık satır sayısı (PageUp/PageDown). */\n pageSize: () => number\n onEnter?: (index: number) => void\n onRight?: (index: number) => boolean\n onLeft?: (index: number) => boolean\n /** İlk satırda `↑`: odak başlığa (08 §3 · header klavyesi). */\n onTop?: () => void\n}\n\nexport function useRovingRows(opts: RovingOptions) {\n /** Roving tabindex'i taşıyan satır; -1: hiçbiri (ilk satır varsayılan). */\n const focusedIndex: Ref<number> = ref(0)\n /** Son etkileşim klavyeden mi: odak çerçevesi yalnızca o zaman çizilir. */\n const keyboard = ref(false)\n\n const widgetsOf = (row: HTMLElement): HTMLElement[] =>\n [...row.querySelectorAll<HTMLElement>(WIDGET_SELECTOR)].filter(\n (el) => el.offsetParent !== null || el.getClientRects().length > 0,\n )\n\n /** Sanal listede satır henüz DOM'da olmayabilir: önce kaydır, sonraki karede odakla. */\n const focusRow = (index: number) => {\n const n = opts.count()\n if (n === 0) return\n const i = Math.max(0, Math.min(n - 1, index))\n focusedIndex.value = i\n keyboard.value = true\n opts.scrollToIndex(i)\n const tryFocus = (attempt: number) => {\n const el = opts.rowEl(i)\n if (el) el.focus({ preventScroll: true })\n else if (attempt < 3) requestAnimationFrame(() => tryFocus(attempt + 1))\n }\n tryFocus(0)\n }\n\n const onKeydown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement\n const row = target.closest<HTMLElement>('[role=\"row\"][data-index]')\n if (!row) return\n const index = Number(row.dataset.index)\n const inWidget = target !== row\n\n if (inWidget) {\n // Widget içi: yalnızca ← → Esc; input/combobox kendi oklarını alır.\n if (e.key === 'Escape') {\n e.preventDefault()\n keyboard.value = true\n row.focus({ preventScroll: true })\n return\n }\n if ((e.key === 'ArrowRight' || e.key === 'ArrowLeft') && !isTextInput(target)) {\n const widgets = widgetsOf(row)\n const at = widgets.indexOf(target.closest<HTMLElement>(WIDGET_SELECTOR) ?? target)\n const next = e.key === 'ArrowRight' ? widgets[at + 1] : at > 0 ? widgets[at - 1] : row\n if (next) {\n e.preventDefault()\n keyboard.value = true\n next.focus({ preventScroll: true })\n }\n }\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n focusRow(index + 1)\n break\n case 'ArrowUp':\n e.preventDefault()\n if (index === 0 && opts.onTop) opts.onTop()\n else focusRow(index - 1)\n break\n case 'Home':\n e.preventDefault()\n focusRow(0)\n break\n case 'End':\n e.preventDefault()\n focusRow(opts.count() - 1)\n break\n case 'PageDown':\n e.preventDefault()\n focusRow(index + opts.pageSize())\n break\n case 'PageUp':\n e.preventDefault()\n focusRow(index - opts.pageSize())\n break\n case 'ArrowRight': {\n if (opts.onRight?.(index)) {\n e.preventDefault()\n break\n }\n const first = widgetsOf(row)[0]\n if (first) {\n e.preventDefault()\n keyboard.value = true\n first.focus({ preventScroll: true })\n }\n break\n }\n case 'ArrowLeft':\n if (opts.onLeft?.(index)) e.preventDefault()\n break\n case 'Enter':\n if (opts.onEnter) {\n e.preventDefault()\n opts.onEnter(index)\n }\n break\n }\n }\n\n /** Fare ile satıra gelen odak: roving index taşınır, çerçeve çizilmez. */\n const onMousedown = (e: MouseEvent) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('[role=\"row\"][data-index]')\n if (!row) return\n keyboard.value = false\n focusedIndex.value = Number(row.dataset.index)\n }\n\n /** Odak (Tab ile) satıra gelince: klavye modu. */\n const onFocusin = (e: FocusEvent) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('[role=\"row\"][data-index]')\n if (row && e.target === row && !keyboard.value && !pointerDown) keyboard.value = true\n }\n let pointerDown = false\n const onPointerdown = () => {\n pointerDown = true\n setTimeout(() => (pointerDown = false), 0)\n }\n\n /** Sayfa/sorgu değişiminde: index sınırlanır (aynı anahtar → aynı indeks → ilk satır kuralı çağıran tarafta). */\n const clamp = () => {\n focusedIndex.value = Math.max(0, Math.min(opts.count() - 1, focusedIndex.value))\n }\n\n return { focusedIndex, keyboard, focusRow, onKeydown, onMousedown, onFocusin, onPointerdown, clamp }\n}\n","<script setup lang=\"ts\" generic=\"Row extends object\">\n// Header hücresi (05 §4 · Header, T4): etiket düğmesi, birim, sıralama oku, filtre işareti, raptiye, ⋯ sütun menüsü,\n// resize tutamacı. Klavye (08 §3): ↵/Space sırala, ⇧F10 menü, ←/→ komşu başlık, ⇧←/→ ±16 px, ⌥⇧←/→ taşı, ↓ satıra.\nimport { PhArrowUp, PhDotsThree, PhFunnel, PhPushPin } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from 'reka-ui'\nimport { computed, ref, useId } from 'vue'\nimport { TYPE_SPECS, alignOf, isNumericType, typeLabelKey } from '../cells/specs'\nimport type { LayoutColumn } from '../columns/useColumnLayout'\nimport { useDataTableContext } from '../plugin'\nimport { MOVE_KBD, type HeaderAction } from './headerActions'\n\nconst props = defineProps<{\n /** Telefon: `headerShort` varsa o. */\n phone?: boolean\n column: LayoutColumn<Row>\n sort?: 'asc' | 'desc' | null\n /** Çoklu sıralamada öncelik (1 tabanlı). */\n sortIndex?: number | null\n filtered?: boolean\n /** Sürüklenirken canlı genişlik (px); değilse null. */\n resizing?: number | null\n sortable?: boolean\n}>()\nconst emit = defineEmits<{\n sort: [column: LayoutColumn<Row>, additive: boolean]\n filter: [column: LayoutColumn<Row>]\n action: [column: LayoutColumn<Row>, action: HeaderAction]\n /** Klavye: komşu başlığa veya odaklı satıra geç. */\n nav: [column: LayoutColumn<Row>, to: 'left' | 'right' | 'down']\n 'resize-by': [column: LayoutColumn<Row>, delta: number]\n /** Sürükleme başlarken çizilen genişlik: model (minmax) ile ekran aynı olsun, sütun zıplamasın. */\n 'resize-start': [column: LayoutColumn<Row>, renderedWidth: number]\n}>()\n\nconst { i18n } = useDataTableContext()\nconst def = computed(() => props.column.def)\nconst numeric = computed(() => isNumericType(def.value.type))\nconst align = computed(() => alignOf(def.value))\nconst unit = computed(() => (typeof def.value.unit === 'string' ? def.value.unit : undefined))\nconst canSort = computed(() => props.sortable ?? false)\nconst canFilter = computed(() => def.value.filterable ?? TYPE_SPECS[def.value.type].filterable)\n// D33: açıklama tooltip'te ikinci satır, ekran okuyucuya aria-describedby; düğme metnine girmez (erişilebilir ad değişmez).\nconst descId = useId()\nconst tip = computed(() => (def.value.description ? `${def.value.header}\\n${def.value.description}` : def.value.header))\nconst menuOpen = ref(false)\n\nconst resizeHandler = (e: MouseEvent | TouchEvent) => {\n const cell = (e.currentTarget as HTMLElement).parentElement!\n emit('resize-start', props.column, cell.getBoundingClientRect().width)\n props.column.header.getResizeHandler()(e)\n}\n\nconst onKeydown = (e: KeyboardEvent) => {\n const k = e.key\n if (k === 'Enter' || k === ' ') {\n if (canSort.value) {\n e.preventDefault()\n emit('sort', props.column, e.shiftKey)\n }\n return\n }\n if ((k === 'F10' && e.shiftKey) || k === 'ContextMenu') {\n e.preventDefault()\n menuOpen.value = true\n return\n }\n if (k === 'ArrowLeft' || k === 'ArrowRight') {\n e.preventDefault()\n const left = k === 'ArrowLeft'\n if (e.altKey && e.shiftKey) emit('action', props.column, left ? 'move-left' : 'move-right')\n else if (e.shiftKey) emit('resize-by', props.column, left ? -16 : 16)\n else emit('nav', props.column, left ? 'left' : 'right')\n return\n }\n if (k === 'ArrowDown') {\n e.preventDefault()\n emit('nav', props.column, 'down')\n }\n}\nconst act = (action: HeaderAction) => emit('action', props.column, action)\n</script>\n\n<template>\n <div\n class=\"dt-head-cell\"\n :class=\"[\n `is-${align}`,\n {\n 'is-numeric': numeric,\n 'is-sorted': !!sort,\n 'is-pinned-start': column.pinned === 'start',\n 'is-pinned-end': column.pinned === 'end',\n 'is-pin-edge': column.pinEdge,\n 'is-resizing': resizing !== null && resizing !== undefined,\n 'is-menu-open': menuOpen,\n },\n ]\"\n :style=\"\n column.pinned === 'start'\n ? { left: `var(${column.offsetVar})` }\n : column.pinned === 'end'\n ? { right: `var(${column.offsetVar})` }\n : undefined\n \"\n role=\"columnheader\"\n :aria-sort=\"sort === 'asc' ? 'ascending' : sort === 'desc' ? 'descending' : undefined\"\n :data-col=\"column.id\"\n @contextmenu.prevent=\"menuOpen = true\"\n >\n <button\n type=\"button\"\n class=\"dt-head-label\"\n :class=\"{ 'is-static': !canSort }\"\n tabindex=\"-1\"\n :aria-disabled=\"canSort ? undefined : 'true'\"\n :data-dt-tip=\"tip\"\n :aria-describedby=\"def.description ? descId : undefined\"\n @click=\"canSort && emit('sort', column, $event.shiftKey)\"\n @keydown=\"onKeydown\"\n >\n <span v-if=\"sort && numeric\" class=\"dt-head-sort\" aria-hidden=\"true\">\n <span v-if=\"sortIndex\" class=\"dt-head-sort-index\">{{ sortIndex }}</span>\n <PhArrowUp :size=\"12\" :class=\"{ 'is-desc': sort === 'desc' }\" />\n </span>\n <span class=\"dt-head-text\">{{ (phone && def.headerShort) || def.header }}</span>\n <span v-if=\"unit\" class=\"dt-head-unit\">{{ unit }}</span>\n <span v-if=\"sort && !numeric\" class=\"dt-head-sort\" aria-hidden=\"true\">\n <PhArrowUp :size=\"12\" :class=\"{ 'is-desc': sort === 'desc' }\" />\n <span v-if=\"sortIndex\" class=\"dt-head-sort-index\">{{ sortIndex }}</span>\n </span>\n <PhPushPin v-if=\"column.pinned\" :size=\"12\" class=\"dt-head-pin\" aria-hidden=\"true\" />\n </button>\n <span v-if=\"def.description\" :id=\"descId\" class=\"dt-sr-only\">{{ def.description }}</span>\n <button\n v-if=\"filtered\"\n type=\"button\"\n class=\"dt-head-icon dt-head-filtered\"\n tabindex=\"-1\"\n :aria-label=\"i18n.t('header.filterBy')\"\n @click=\"emit('filter', column)\"\n >\n <PhFunnel :size=\"14\" weight=\"fill\" aria-hidden=\"true\" />\n </button>\n <DropdownMenuRoot v-model:open=\"menuOpen\">\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n class=\"dt-head-icon dt-head-menu\"\n tabindex=\"-1\"\n :aria-label=\"i18n.t('header.optionsAria', { column: def.header })\"\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent class=\"dt-menu dt-col-menu\" align=\"end\" :side-offset=\"4\">\n <DropdownMenuLabel class=\"dt-menu-label\">{{ i18n.t(typeLabelKey(def.type)) }}</DropdownMenuLabel>\n <template v-if=\"canSort\">\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('sort-asc')\">\n {{ i18n.t('header.sortAsc') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('sort-desc')\">\n {{ i18n.t('header.sortDesc') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" :disabled=\"!sort\" @select=\"act('sort-clear')\">\n {{ i18n.t('header.clearSort') }}\n </DropdownMenuItem>\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n </template>\n <template v-if=\"canFilter\">\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('filter')\">\n {{ i18n.t('header.filterBy') }}\n </DropdownMenuItem>\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n </template>\n <DropdownMenuItem v-if=\"column.pinned\" class=\"dt-menu-item\" @select=\"act('unpin')\">\n {{ i18n.t('header.unpin') }}\n </DropdownMenuItem>\n <template v-else>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('pin-left')\">\n {{ i18n.t('header.pinLeft') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('pin-right')\">\n {{ i18n.t('header.pinRight') }}\n </DropdownMenuItem>\n </template>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('fit')\">{{ i18n.t('header.fit') }}</DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('move-left')\">\n {{ i18n.t('header.moveLeft') }}\n <kbd class=\"dt-kbd\">{{ MOVE_KBD.left }}</kbd>\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('move-right')\">\n {{ i18n.t('header.moveRight') }}\n <kbd class=\"dt-kbd\">{{ MOVE_KBD.right }}</kbd>\n </DropdownMenuItem>\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n <DropdownMenuItem\n class=\"dt-menu-item\"\n :disabled=\"!!column.pinned || !column.header.column.getCanHide()\"\n @select=\"act('hide')\"\n >\n {{ i18n.t('header.hide') }}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n <span class=\"dt-head-sep\" aria-hidden=\"true\" />\n <span\n class=\"dt-resize\"\n aria-hidden=\"true\"\n @mousedown=\"resizeHandler\"\n @touchstart.passive=\"resizeHandler\"\n @dblclick=\"act('fit')\"\n >\n <span v-if=\"resizing !== null && resizing !== undefined\" class=\"dt-resize-badge\">\n {{ Math.round(resizing) }} px\n </span>\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"Row extends object\">\n// Header hücresi (05 §4 · Header, T4): etiket düğmesi, birim, sıralama oku, filtre işareti, raptiye, ⋯ sütun menüsü,\n// resize tutamacı. Klavye (08 §3): ↵/Space sırala, ⇧F10 menü, ←/→ komşu başlık, ⇧←/→ ±16 px, ⌥⇧←/→ taşı, ↓ satıra.\nimport { PhArrowUp, PhDotsThree, PhFunnel, PhPushPin } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from 'reka-ui'\nimport { computed, ref, useId } from 'vue'\nimport { TYPE_SPECS, alignOf, isNumericType, typeLabelKey } from '../cells/specs'\nimport type { LayoutColumn } from '../columns/useColumnLayout'\nimport { useDataTableContext } from '../plugin'\nimport { MOVE_KBD, type HeaderAction } from './headerActions'\n\nconst props = defineProps<{\n /** Telefon: `headerShort` varsa o. */\n phone?: boolean\n column: LayoutColumn<Row>\n sort?: 'asc' | 'desc' | null\n /** Çoklu sıralamada öncelik (1 tabanlı). */\n sortIndex?: number | null\n filtered?: boolean\n /** Sürüklenirken canlı genişlik (px); değilse null. */\n resizing?: number | null\n sortable?: boolean\n}>()\nconst emit = defineEmits<{\n sort: [column: LayoutColumn<Row>, additive: boolean]\n filter: [column: LayoutColumn<Row>]\n action: [column: LayoutColumn<Row>, action: HeaderAction]\n /** Klavye: komşu başlığa veya odaklı satıra geç. */\n nav: [column: LayoutColumn<Row>, to: 'left' | 'right' | 'down']\n 'resize-by': [column: LayoutColumn<Row>, delta: number]\n /** Sürükleme başlarken çizilen genişlik: model (minmax) ile ekran aynı olsun, sütun zıplamasın. */\n 'resize-start': [column: LayoutColumn<Row>, renderedWidth: number]\n}>()\n\nconst { i18n } = useDataTableContext()\nconst def = computed(() => props.column.def)\nconst numeric = computed(() => isNumericType(def.value.type))\nconst align = computed(() => alignOf(def.value))\nconst unit = computed(() => (typeof def.value.unit === 'string' ? def.value.unit : undefined))\nconst canSort = computed(() => props.sortable ?? false)\nconst canFilter = computed(() => def.value.filterable ?? TYPE_SPECS[def.value.type].filterable)\n// D33: açıklama tooltip'te ikinci satır, ekran okuyucuya aria-describedby; düğme metnine girmez (erişilebilir ad değişmez).\nconst descId = useId()\nconst tip = computed(() => (def.value.description ? `${def.value.header}\\n${def.value.description}` : def.value.header))\nconst menuOpen = ref(false)\n\nconst resizeHandler = (e: MouseEvent | TouchEvent) => {\n const cell = (e.currentTarget as HTMLElement).parentElement!\n emit('resize-start', props.column, cell.getBoundingClientRect().width)\n props.column.header.getResizeHandler()(e)\n}\n\nconst onKeydown = (e: KeyboardEvent) => {\n const k = e.key\n if (k === 'Enter' || k === ' ') {\n if (canSort.value) {\n e.preventDefault()\n emit('sort', props.column, e.shiftKey)\n }\n return\n }\n if ((k === 'F10' && e.shiftKey) || k === 'ContextMenu') {\n e.preventDefault()\n menuOpen.value = true\n return\n }\n if (k === 'ArrowLeft' || k === 'ArrowRight') {\n e.preventDefault()\n const left = k === 'ArrowLeft'\n if (e.altKey && e.shiftKey) emit('action', props.column, left ? 'move-left' : 'move-right')\n else if (e.shiftKey) emit('resize-by', props.column, left ? -16 : 16)\n else emit('nav', props.column, left ? 'left' : 'right')\n return\n }\n if (k === 'ArrowDown') {\n e.preventDefault()\n emit('nav', props.column, 'down')\n }\n}\nconst act = (action: HeaderAction) => emit('action', props.column, action)\n</script>\n\n<template>\n <div\n class=\"dt-head-cell\"\n :class=\"[\n `is-${align}`,\n {\n 'is-numeric': numeric,\n 'is-sorted': !!sort,\n 'is-pinned-start': column.pinned === 'start',\n 'is-pinned-end': column.pinned === 'end',\n 'is-pin-edge': column.pinEdge,\n 'is-resizing': resizing !== null && resizing !== undefined,\n 'is-menu-open': menuOpen,\n },\n ]\"\n :style=\"\n column.pinned === 'start'\n ? { left: `var(${column.offsetVar})` }\n : column.pinned === 'end'\n ? { right: `var(${column.offsetVar})` }\n : undefined\n \"\n role=\"columnheader\"\n :aria-sort=\"sort === 'asc' ? 'ascending' : sort === 'desc' ? 'descending' : undefined\"\n :data-col=\"column.id\"\n @contextmenu.prevent=\"menuOpen = true\"\n >\n <button\n type=\"button\"\n class=\"dt-head-label\"\n :class=\"{ 'is-static': !canSort }\"\n tabindex=\"-1\"\n :aria-disabled=\"canSort ? undefined : 'true'\"\n :data-dt-tip=\"tip\"\n :aria-describedby=\"def.description ? descId : undefined\"\n @click=\"canSort && emit('sort', column, $event.shiftKey)\"\n @keydown=\"onKeydown\"\n >\n <span v-if=\"sort && numeric\" class=\"dt-head-sort\" aria-hidden=\"true\">\n <span v-if=\"sortIndex\" class=\"dt-head-sort-index\">{{ sortIndex }}</span>\n <PhArrowUp :size=\"12\" :class=\"{ 'is-desc': sort === 'desc' }\" />\n </span>\n <span class=\"dt-head-text\">{{ (phone && def.headerShort) || def.header }}</span>\n <span v-if=\"unit\" class=\"dt-head-unit\">{{ unit }}</span>\n <span v-if=\"sort && !numeric\" class=\"dt-head-sort\" aria-hidden=\"true\">\n <PhArrowUp :size=\"12\" :class=\"{ 'is-desc': sort === 'desc' }\" />\n <span v-if=\"sortIndex\" class=\"dt-head-sort-index\">{{ sortIndex }}</span>\n </span>\n <PhPushPin v-if=\"column.pinned\" :size=\"12\" class=\"dt-head-pin\" aria-hidden=\"true\" />\n </button>\n <span v-if=\"def.description\" :id=\"descId\" class=\"dt-sr-only\">{{ def.description }}</span>\n <button\n v-if=\"filtered\"\n type=\"button\"\n class=\"dt-head-icon dt-head-filtered\"\n tabindex=\"-1\"\n :aria-label=\"i18n.t('header.filterBy')\"\n @click=\"emit('filter', column)\"\n >\n <PhFunnel :size=\"14\" weight=\"fill\" aria-hidden=\"true\" />\n </button>\n <DropdownMenuRoot v-model:open=\"menuOpen\">\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n class=\"dt-head-icon dt-head-menu\"\n tabindex=\"-1\"\n :aria-label=\"i18n.t('header.optionsAria', { column: def.header })\"\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent class=\"dt-menu dt-col-menu\" align=\"end\" :side-offset=\"4\">\n <DropdownMenuLabel class=\"dt-menu-label\">{{ i18n.t(typeLabelKey(def.type)) }}</DropdownMenuLabel>\n <template v-if=\"canSort\">\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('sort-asc')\">\n {{ i18n.t('header.sortAsc') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('sort-desc')\">\n {{ i18n.t('header.sortDesc') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" :disabled=\"!sort\" @select=\"act('sort-clear')\">\n {{ i18n.t('header.clearSort') }}\n </DropdownMenuItem>\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n </template>\n <template v-if=\"canFilter\">\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('filter')\">\n {{ i18n.t('header.filterBy') }}\n </DropdownMenuItem>\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n </template>\n <DropdownMenuItem v-if=\"column.pinned\" class=\"dt-menu-item\" @select=\"act('unpin')\">\n {{ i18n.t('header.unpin') }}\n </DropdownMenuItem>\n <template v-else>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('pin-left')\">\n {{ i18n.t('header.pinLeft') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('pin-right')\">\n {{ i18n.t('header.pinRight') }}\n </DropdownMenuItem>\n </template>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('fit')\">{{ i18n.t('header.fit') }}</DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('move-left')\">\n {{ i18n.t('header.moveLeft') }}\n <kbd class=\"dt-kbd\">{{ MOVE_KBD.left }}</kbd>\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('move-right')\">\n {{ i18n.t('header.moveRight') }}\n <kbd class=\"dt-kbd\">{{ MOVE_KBD.right }}</kbd>\n </DropdownMenuItem>\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n <DropdownMenuItem\n class=\"dt-menu-item\"\n :disabled=\"!!column.pinned || !column.header.column.getCanHide()\"\n @select=\"act('hide')\"\n >\n {{ i18n.t('header.hide') }}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n <span class=\"dt-head-sep\" aria-hidden=\"true\" />\n <span\n class=\"dt-resize\"\n aria-hidden=\"true\"\n @mousedown=\"resizeHandler\"\n @touchstart.passive=\"resizeHandler\"\n @dblclick=\"act('fit')\"\n >\n <span v-if=\"resizing !== null && resizing !== undefined\" class=\"dt-resize-badge\">\n {{ Math.round(resizing) }} px\n </span>\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Izgara kökü (05 §2–4, §6–8, §10; 08 §1–3; brief §5.5): tek kayan alan, sticky header, sabit sütunlar + koşullu kenar gölgesi,\n// sanal satırlar (@tanstack/vue-virtual; öğe = satır + açık detay, ölçülen yükseklik), satır odaklı klavye, header klavyesi ve\n// sütun menüsü, seçim sütunu (40 px) ve ⋯ sütunu (44 px; hatalı satır varken 66), satır menüsü, kaydırma hapı. Veri çekmez, sütun düzenini dışarıdan\n// (useColumnLayout) alır; seçim/expand durumunu üstten alır ve niyet olarak yayar.\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, toRaw, useId, watch, watchEffect } from 'vue'\n\n// İç bileşen: satır tipi dış bileşende (DataTable) tiplidir; accessor/cell parametreleri karşıt değişken olduğundan burada any.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyRow = any\nimport type { Density } from '../../types/core'\nimport type { RowAction } from '../../types/list'\nimport { RemoteLabels } from '../cells/remoteLabels'\nimport type { RenderEnv } from '../cells/renderCell'\nimport { TYPE_SPECS } from '../cells/specs'\nimport type { ColumnLayoutApi, LayoutColumn } from '../columns/useColumnLayout'\nimport { getFormat } from '../format'\nimport { isPlainRowClick } from '../interaction/isInteractive'\nimport { useRovingRows } from '../interaction/useRovingRows'\nimport { useDataTableContext } from '../plugin'\nimport HeaderCell from './HeaderCell.vue'\nimport type { HeaderAction } from './headerActions'\nimport { inlineActionsOf } from './inlineActions'\nimport Row from './Row'\nimport SkeletonRow from './SkeletonRow'\n\nconst props = withDefaults(\n defineProps<{\n layout: ColumnLayoutApi<AnyRow>\n rows: AnyRow[]\n density?: Density\n /** role=grid aria-label. */\n label: string\n /** aria-busy. */\n loading?: boolean\n /** 12 iskelet satır (First load, 400 ms'yi aşan sorgu değişimi). */\n skeleton?: boolean\n /** Sorgu değişimi: eski satırlar soluk + inert (05 §10 · Query change). */\n dim?: boolean\n /** Header altında 2 px belirsiz çubuk (Refreshing). */\n refreshing?: boolean\n verticalLines?: boolean\n /** aria-rowcount; bilinmiyorsa -1. */\n rowCount?: number\n /** Sayfa ofseti: aria-rowindex ve kaydırma hapı (05 §8). */\n rowIndexOffset?: number\n sort?: ReadonlyMap<string, { dir: 'asc' | 'desc'; index: number | null }>\n filteredColumns?: ReadonlySet<string>\n sortable?: boolean\n /** `ajax`/`user` etiket önbelleği; DataTable filtre çipleriyle paylaşır. */\n labels?: RemoteLabels\n /** Seçim sütunu (05 §6); durum `selection` (anahtar → seçili). */\n selectable?: boolean\n selection?: Record<string, boolean>\n /** Birincil hücrede chevron + alt satır (05 §7); durum `expanded` (anahtar → açık). */\n expandable?: boolean\n expanded?: Record<string, boolean>\n canExpand?: (row: AnyRow) => boolean\n /** ⋯ sütunu ve satır menüsü: Open / Copy yerleşik, `rowActions` uygulamanın. */\n rowMenu?: boolean\n rowActions?: RowAction[]\n /** Satır hatası (05 §4, D35): metin/metin listesi; boş → yok. */\n rowError?: (row: AnyRow) => string | string[] | null | undefined\n primaryHref?: (row: AnyRow) => string | undefined\n primaryLabel?: (row: AnyRow) => string\n primaryHeader?: string\n /** Telefon (05 §11): seçim sütunu 48, satır 48 px, kısa header; sabitleme useColumnLayout'ta. */\n phone?: boolean\n }>(),\n { density: 'standard', loading: false, rowCount: -1, rowIndexOffset: 0, sortable: false },\n)\nconst emit = defineEmits<{\n 'row-click': [row: AnyRow, event: MouseEvent]\n /** Birincil linke düz sol tık, satırda ↵, menüde Open (05 §7). Native navigasyon dinleyicide durdurulabilir. */\n 'row-open': [row: AnyRow, event: MouseEvent]\n 'select-rows': [ids: string[], value: boolean]\n 'select-page': [value: boolean]\n 'toggle-expand': [id: string, value: boolean]\n 'copy-id': [row: AnyRow]\n sort: [columnId: string, additive: boolean]\n 'sort-set': [columnId: string, dir: 'asc' | 'desc' | null]\n 'header-filter': [columnId: string]\n}>()\ndefineSlots<{\n notice?: () => unknown\n state?: () => unknown\n expanded?: (props: { row: AnyRow; close: () => void }) => unknown\n}>()\n\nconst ctx = useDataTableContext()\nconst root = ref<HTMLElement | null>(null)\nconst scrollEl = ref<HTMLElement | null>(null)\nconst layout = props.layout\n\n// Dokunmatikte Compact → Standard (02 · Yoğunluk); satır yüksekliği buna göre.\nconst coarse = typeof matchMedia === 'function' && matchMedia('(pointer: coarse)').matches\nconst density = computed<Density>(() => (coarse && props.density === 'compact' ? 'standard' : props.density))\n\n// Seçim (40; telefonda 48) ve ⋯ sütunları düzenin dışında: track'ler başa/sona eklenir, sabit sütun ofsetleri o kadar kayar.\n// ⋯ sütunu içeriğe göre (05 §4): 8 + ⋯ 28 + 8 = 44; sayfada hatalı satır varsa (D35) + 14 + 8; inline aksiyon başına (D36,\n// sayfadaki en kalabalık satır) + 28 + 8. CSS: .dt-cell-menu (dolgu 8, gap 8).\nconst SELECT_W = 40\nconst SELECT_W_PHONE = 48\nconst MENU_PAD = 8\nconst MORE_W = 28\nconst ERROR_SLOT = 14 + 8\nconst INLINE_SLOT = 28 + 8\nconst selW = computed(() => (props.selectable ? (props.phone ? SELECT_W_PHONE : SELECT_W) : 0))\nconst anyError = computed(() => !!props.rowError && props.rows.some((r) => errorOf(r).length > 0))\nconst maxInline = computed(() => {\n const actions = props.rowActions ?? []\n if (!actions.some((a) => a.inline)) return 0\n return props.rows.reduce((m, r) => Math.max(m, inlineActionsOf(actions, r).length), 0)\n})\nconst menuW = computed(() =>\n props.rowMenu ? MENU_PAD + (anyError.value ? ERROR_SLOT : 0) + maxInline.value * INLINE_SLOT + MORE_W + MENU_PAD : 0,\n)\n// Genişlikler ve sabit ofsetleri Vue render'ı dışında, senkron (05 · Resize: kare başına < 1 ms).\nwatchEffect(\n () => {\n const el = root.value\n if (!el) return\n const cols = [selW.value ? `${selW.value}px` : '', layout.colsVar.value, menuW.value ? `${menuW.value}px` : '']\n el.style.setProperty('--cols', cols.filter(Boolean).join(' '))\n el.style.setProperty('--dt-min-w', `${layout.minWidth.value + selW.value + menuW.value}px`)\n el.style.setProperty('--dt-sel-w', `${selW.value}px`)\n el.style.setProperty('--dt-menu-w', `${menuW.value}px`)\n const startVars = new Set(layout.start.value.map((c) => c.offsetVar))\n const endVars = new Set(layout.end.value.map((c) => c.offsetVar))\n for (const [name, value] of Object.entries(layout.offsetVars.value)) {\n const extra = startVars.has(name) ? selW.value : endVars.has(name) ? menuW.value : 0\n el.style.setProperty(name, extra ? `${parseFloat(value) + extra}px` : value)\n }\n },\n { flush: 'sync' },\n)\n\n// Satır yüksekliği token'dan (02): yoğunluk değişince yeniden okunur; jsdom'da boş gelir → 40.\nconst rowHeight = ref(40)\n// Sticky header akış içinde: sanal öğeler header kadar aşağıda başlar (TanStack `scrollMargin`), header görünür alanın üstünü\n// (`scrollPaddingStart`), yatay kaydırma çubuğu altını (`scrollPaddingEnd`) örter. Yoksa ↓ ile inen satır tam bir header\n// yüksekliği kadar kabın altında kalır (08 §2).\nconst headH = ref(36)\nconst barH = ref(0)\nconst readBarH = () => {\n const el = scrollEl.value\n barH.value = el ? Math.max(0, el.offsetHeight - el.clientHeight) : 0\n}\nconst readRowHeight = () => {\n const v = root.value ? parseFloat(getComputedStyle(root.value).getPropertyValue('--dt-row-h')) : NaN\n rowHeight.value = Number.isFinite(v) ? v : 40\n headH.value = root.value?.querySelector<HTMLElement>('.dt-head')?.offsetHeight ?? headH.value\n readBarH()\n}\nonMounted(readRowHeight)\nwatch([density, () => props.phone], () => requestAnimationFrame(readRowHeight))\n\nconst env = computed<RenderEnv>(() => ({\n fmt: getFormat(ctx.locale),\n i18n: ctx.i18n,\n today: new Date(),\n labels,\n density: density.value,\n coarse,\n}))\nconst labels = props.labels ?? new RemoteLabels()\n\nconst headerLabels = () => [...(root.value?.querySelectorAll<HTMLElement>('.dt-head-label') ?? [])]\n/** Sütunun header ve gövde hücreleri (id'de nokta olabilir: CSS.escape yerine dataset karşılaştırması). */\nconst cellsOf = (id: string) =>\n [...(root.value?.querySelectorAll<HTMLElement>('[data-col]') ?? [])].filter((c) => c.dataset.col === id)\nconst focusHeader = (i: number) => {\n const els = headerLabels()\n els[Math.max(0, Math.min(els.length - 1, i))]?.focus()\n}\n\nconst rowIdAt = (i: number) => layout.rowId(props.rows[i]!)\nconst isSelected = (i: number) => !!props.selection?.[rowIdAt(i)]\nconst isExpanded = (row: AnyRow) => !!props.expanded?.[layout.rowId(row)]\nconst canExpandRow = (row: AnyRow) => !!props.expandable && (props.canExpand?.(row) ?? true)\nconst labelOf = (row: AnyRow) => props.primaryLabel?.(row) ?? layout.rowId(row)\nconst uid = useId()\nconst subrowId = (row: AnyRow) => `${uid}-sub-${layout.rowId(row)}`\nconst rowUid = (row: AnyRow) => `${uid}-r-${layout.rowId(row)}`\n/** `rowError` sonucunu mesaj listesine indirger; boş metinler düşer, boş liste = hata yok. */\nconst errorOf = (row: AnyRow): string[] => {\n const e = props.rowError?.(row)\n return (Array.isArray(e) ? e : [e]).filter((m): m is string => !!m)\n}\nconst rowEl = (i: number) => root.value?.querySelector<HTMLElement>(`.dt-row[data-index=\"${i}\"]`) ?? null\n\nconst roving = useRovingRows({\n count: () => props.rows.length,\n rowEl,\n scrollToIndex: (i) => virtualizer.value.scrollToIndex(i, { align: 'auto' }),\n pageSize: () => Math.max(1, Math.floor((scrollEl.value?.clientHeight ?? 0) / (rowHeight.value + 1)) - 1),\n // ↵: birincil linke gerçek tık (tarayıcı gider, `row-open` dinleyicisi durdurabilir); link yoksa açılacak şey yok.\n onEnter: (i) => rowEl(i)?.querySelector<HTMLElement>('.dt-cell.is-primary a.dt-link')?.click(),\n // → kapalı detayı açar, açıksa/yoksa widget'lara girer; ← açık detayı kapatır (08 §2).\n onRight: (i) => {\n const row = props.rows[i]\n if (!row || !canExpandRow(row) || isExpanded(row)) return false\n emit('toggle-expand', layout.rowId(row), true)\n return true\n },\n onLeft: (i) => {\n const row = props.rows[i]\n if (!row || !isExpanded(row)) return false\n emit('toggle-expand', layout.rowId(row), false)\n return true\n },\n onTop: () => focusHeader(0),\n})\n\n// Seçim klavyesi (05 §6, 08 §3): X seçer/bırakır, ⇧↑/↓ aralığı genişletir, ⌘A sayfadakiler; ⇧F10 / Menü tuşu satır menüsü.\nlet anchor = -1\nconst idsBetween = (a: number, b: number) => {\n const [from, to] = a < b ? [a, b] : [b, a]\n return props.rows.slice(from, to + 1).map((r) => layout.rowId(r))\n}\nconst menuIndex = ref(-1)\nconst onKeydown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement\n const row = target.closest<HTMLElement>('[role=\"row\"][data-index]')\n if (row && target === row) {\n const i = Number(row.dataset.index)\n const mod = e.metaKey || e.ctrlKey\n if (props.selectable) {\n if ((e.key === 'x' || e.key === 'X') && !mod && !e.altKey) {\n e.preventDefault()\n anchor = i\n emit('select-rows', [rowIdAt(i)], !isSelected(i))\n return\n }\n if ((e.key === 'a' || e.key === 'A') && mod && !e.shiftKey) {\n e.preventDefault()\n emit('select-page', true)\n return\n }\n if (e.shiftKey && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n e.preventDefault()\n if (anchor < 0) anchor = i\n const to = Math.max(0, Math.min(props.rows.length - 1, e.key === 'ArrowDown' ? i + 1 : i - 1))\n emit('select-rows', idsBetween(anchor, to), true)\n roving.focusRow(to)\n return\n }\n if (e.key.startsWith('Arrow') || e.key === 'Home' || e.key === 'End') anchor = -1\n }\n if (props.rowMenu && ((e.key === 'F10' && e.shiftKey) || e.key === 'ContextMenu')) {\n e.preventDefault()\n menuIndex.value = i\n return\n }\n }\n roving.onKeydown(e)\n}\n/** Checkbox: ⇧ ile son tıklanan satırla arasındaki aralık aynı değere (05 §6). */\nconst onSelect = (i: number, value: boolean, shift: boolean) => {\n emit('select-rows', shift && anchor >= 0 ? idsBetween(anchor, i) : [rowIdAt(i)], value)\n anchor = i\n}\nconst selectedCount = computed(() =>\n props.selectable ? props.rows.reduce((n, r) => n + (props.selection?.[layout.rowId(r)] ? 1 : 0), 0) : 0,\n)\nconst allSelected = computed(() => props.rows.length > 0 && selectedCount.value === props.rows.length)\nconst someSelected = computed(() => selectedCount.value > 0 && !allSelected.value)\n\nconst skeleton = computed(() => !!props.skeleton)\nconst count = computed(() => (skeleton.value ? 12 : props.rows.length))\n\nconst virtualizer = useVirtualizer(\n computed(() => ({\n count: count.value,\n getScrollElement: () => scrollEl.value,\n estimateSize: () => rowHeight.value + 1, // + 1 px alt kenarlık (02)\n scrollMargin: headH.value,\n scrollPaddingStart: headH.value,\n scrollPaddingEnd: barH.value,\n overscan: 10,\n getItemKey: (i: number) => (skeleton.value ? `sk-${i}` : layout.rowId(props.rows[i]!)),\n // Odaklı satır her zaman DOM'da (08 §2): kaydırma odağı kaybettirmez.\n rangeExtractor: (range: { startIndex: number; endIndex: number; overscan: number; count: number }) => {\n const start = Math.max(0, range.startIndex - range.overscan)\n const end = Math.min(range.count - 1, range.endIndex + range.overscan)\n const out: number[] = []\n const f = roving.focusedIndex.value\n if (!skeleton.value && f >= 0 && f < start && f < range.count) out.push(f)\n for (let i = start; i <= end; i++) out.push(i)\n if (!skeleton.value && f > end && f < range.count) out.push(f)\n return out\n },\n })),\n)\nconst virtualRows = computed(() => virtualizer.value.getVirtualItems())\nconst totalSize = computed(() => virtualizer.value.getTotalSize())\n// Açık detay: öğe (satır + alt satır) ölçülür, anahtarla önbellekte kalır; kapanınca satır yüksekliğine döner (05 §7).\nconst measureItem = (el: Element | null, index: number) => {\n if (el && !skeleton.value && isExpanded(props.rows[index])) virtualizer.value.measureElement(el)\n}\nwatch(\n () => new Set(Object.keys(props.expanded ?? {}).filter((k) => props.expanded![k])),\n (now, before) => {\n for (const key of before ?? []) {\n if (now.has(key)) continue\n const i = props.rows.findIndex((r) => layout.rowId(r) === key)\n if (i >= 0) virtualizer.value.resizeItem(i, rowHeight.value + 1)\n }\n },\n)\n\n// Sabit sütun kenar gölgesi yalnızca o yöne kaydırılmışken (05 §4 · Pinned). Dikey kaydırmada konum hapı (05 §8).\nconst scrolledStart = shallowRef(false)\nconst scrolledEnd = shallowRef(false)\nconst pill = shallowRef<{ from: number; to: number } | null>(null)\nlet pillTimer: ReturnType<typeof setTimeout> | undefined\nlet lastTop = 0\nconst onScroll = () => {\n const el = scrollEl.value\n if (!el) return\n readBarH()\n scrolledStart.value = el.scrollLeft > 0\n scrolledEnd.value = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n if (el.scrollTop === lastTop) return\n lastTop = el.scrollTop\n const range = virtualizer.value.range\n if (!range || skeleton.value) return\n pill.value = { from: props.rowIndexOffset + range.startIndex + 1, to: props.rowIndexOffset + range.endIndex + 1 }\n clearTimeout(pillTimer)\n pillTimer = setTimeout(() => (pill.value = null), 900)\n}\nconst pillText = computed(() =>\n pill.value ? ctx.i18n.t('page.scrollPos', { from: pill.value.from, to: pill.value.to }) : '',\n)\nonMounted(() => {\n onScroll()\n if (scrollEl.value && typeof ResizeObserver !== 'undefined') new ResizeObserver(onScroll).observe(scrollEl.value)\n})\nonBeforeUnmount(() => clearTimeout(pillTimer))\n\n// Satır tıklaması: tek guard (05 §7). Sürükleme tespiti için mousedown noktası.\nlet downPoint: { x: number; y: number } | null = null\nconst onMousedown = (e: MouseEvent) => {\n downPoint = { x: e.clientX, y: e.clientY }\n roving.onMousedown(e)\n}\nconst onClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n const rowEl = target.closest<HTMLElement>('.dt-row[data-index]')\n if (!rowEl) return\n const row = props.rows[Number(rowEl.dataset.index)]\n if (!row) return\n // Birincil linke düz sol tık → row-open; değiştirici tuş / orta tık tarayıcıya (D6).\n const link = target.closest('a.dt-link')\n if (link && link.closest('.dt-cell.is-primary') && rowEl.contains(link)) {\n if (e.button === 0 && !e.metaKey && !e.ctrlKey && !e.shiftKey && !e.altKey) emit('row-open', toRaw(row), e)\n return\n }\n if (isPlainRowClick(e, rowEl, downPoint)) emit('row-click', toRaw(row), e)\n}\n\nconst sortOf = (id: string) => props.sort?.get(id)\nconst columnSortable = (c: LayoutColumn<AnyRow>) =>\n props.sortable && (c.def.sortable ?? TYPE_SPECS[c.def.type].sortable)\n\n/** Çift tık / menü: içeriğe sığdır (görünür satırlar + header). */\nconst fitToContent = (col: LayoutColumn<AnyRow>) => {\n const el = root.value\n if (!el) return\n const items = cellsOf(col.id).flatMap((c) => [...c.querySelectorAll<HTMLElement>('.dt-cell-content, .dt-head-text')])\n // Blok eleman hücre genişken onu doldurur; içeriğin gerçek genişliği için geçici max-content (tek reflow: önce yaz, sonra oku).\n // max-width: 100% kesilmiş içeriği hücreye, flex-shrink header metnini düğmeye sıkıştırır; ölçüm için ikisi de kalkar.\n for (const c of items) {\n c.style.width = 'max-content'\n c.style.maxWidth = 'none'\n c.style.flex = 'none'\n }\n const max = items.reduce((m, c) => Math.max(m, c.getBoundingClientRect().width), 0)\n for (const c of items) {\n c.style.width = ''\n c.style.maxWidth = ''\n c.style.flex = ''\n }\n const pad = parseFloat(getComputedStyle(el).getPropertyValue('--dt-cell-x')) || 12\n // 24 px: hover'da beliren hücre aksiyonları ve header'daki ok/⋯ için pay.\n layout.setWidth(col.id, Math.ceil(max) + pad * 2 + 24)\n}\n\n/** Sütun menüsü ve ⌥⇧←/→ (05 §4): sıralama dışındakiler düzenin kendi işi. Taşınan başlığın odağı korunur. */\nconst onHeaderAction = (col: LayoutColumn<AnyRow>, action: HeaderAction) => {\n switch (action) {\n case 'filter':\n emit('header-filter', col.id)\n return\n case 'sort-asc':\n case 'sort-desc':\n case 'sort-clear':\n emit('sort-set', col.id, action === 'sort-clear' ? null : action === 'sort-asc' ? 'asc' : 'desc')\n return\n case 'pin-left':\n layout.pin(col.id, 'start')\n return\n case 'pin-right':\n layout.pin(col.id, 'end')\n return\n case 'unpin':\n layout.pin(col.id, null)\n return\n case 'fit':\n fitToContent(col)\n return\n case 'hide':\n layout.setVisible(col.id, false)\n return\n case 'move-left':\n case 'move-right': {\n const focused = document.activeElement?.closest<HTMLElement>('.dt-head-cell')?.dataset.col === col.id\n layout.move(col.id, action === 'move-left' ? -1 : 1)\n if (focused) void nextTick(() => cellsOf(col.id)[0]?.querySelector<HTMLElement>('.dt-head-label')?.focus())\n }\n }\n}\nconst onHeaderNav = (col: LayoutColumn<AnyRow>, to: 'left' | 'right' | 'down') => {\n if (to === 'down') {\n roving.focusRow(roving.focusedIndex.value)\n return\n }\n const i = layout.columns.value.findIndex((c) => c.id === col.id)\n focusHeader(to === 'left' ? i - 1 : i + 1)\n}\n\n// Sayfa/sorgu değişiminde odak: aynı anahtar → aynı indeks → ilk satır (08 §2); ızgaradaysa odak geri verilir.\n// Dizi kimliği değil anahtar dizisi izlenir: seçim değişince satır modeli yeniden hesaplanır ama satırlar aynıdır.\nlet lastKeys = props.rows.map((r) => layout.rowId(r))\nwatch(\n () => props.rows.map((r) => layout.rowId(r)).join('\\u0000'),\n () => {\n const keys = props.rows.map((r) => layout.rowId(r))\n const hadFocus = !!root.value && root.value.contains(document.activeElement)\n const prevKey = lastKeys[roving.focusedIndex.value]\n const same = prevKey === undefined ? -1 : keys.indexOf(prevKey)\n if (same >= 0) roving.focusedIndex.value = same\n else roving.clamp()\n lastKeys = keys\n anchor = -1\n if (hadFocus && keys.length) void nextTick(() => roving.focusRow(roving.focusedIndex.value))\n },\n)\n// estimateSize değişimi ölçüm önbelleğini yenilemez (virtual-core memo'su count/getItemKey'e bağlı): yoğunluk değişince sıfırla.\nwatch(rowHeight, () => virtualizer.value.measure())\n\ndefineExpose({\n focusRow: roving.focusRow,\n scrollToIndex: (i: number) => virtualizer.value.scrollToIndex(i),\n scrollToTop: () => {\n if (scrollEl.value) scrollEl.value.scrollTop = 0\n },\n /** Ölçüm önbelleğini sıfırlar (sorgu/sayfa sonrası açıklar kapanınca, 05 §7). */\n measure: () => virtualizer.value.measure(),\n rowEl,\n})\n</script>\n\n<template>\n <div\n ref=\"root\"\n class=\"dt-grid\"\n :class=\"{\n 'is-scrolled-start': scrolledStart,\n 'is-scrolled-end': scrolledEnd,\n 'is-keyboard': roving.keyboard.value,\n 'is-skeleton': skeleton,\n 'is-dim': dim,\n 'has-vlines': verticalLines,\n 'is-phone': phone,\n }\"\n role=\"grid\"\n :aria-label=\"label\"\n :aria-rowcount=\"rowCount\"\n :aria-colcount=\"layout.columns.value.length + (selectable ? 1 : 0) + (rowMenu ? 1 : 0)\"\n :aria-busy=\"loading || dim ? 'true' : undefined\"\n :data-density=\"density\"\n @keydown=\"onKeydown\"\n @mousedown=\"onMousedown\"\n @pointerdown=\"roving.onPointerdown\"\n @focusin=\"roving.onFocusin\"\n @click=\"onClick\"\n >\n <div ref=\"scrollEl\" class=\"dt-scroll\" @scroll.passive=\"onScroll\">\n <div class=\"dt-head\" role=\"row\" aria-rowindex=\"1\">\n <div\n v-if=\"selectable\"\n class=\"dt-head-cell dt-head-select is-pinned-start\"\n :class=\"{ 'is-pin-edge': !layout.start.value.length }\"\n style=\"left: 0px\"\n role=\"columnheader\"\n >\n <input\n type=\"checkbox\"\n class=\"dt-checkbox\"\n :checked=\"allSelected\"\n :indeterminate=\"someSelected\"\n :aria-label=\"ctx.i18n.t('row.selectPageAria')\"\n @click=\"emit('select-page', !allSelected)\"\n />\n </div>\n <HeaderCell\n v-for=\"col in [...layout.start.value, ...layout.center.value]\"\n :key=\"col.id\"\n :column=\"col\"\n :sort=\"sortOf(col.id)?.dir ?? null\"\n :sort-index=\"sortOf(col.id)?.index ?? null\"\n :filtered=\"filteredColumns?.has(col.id) ?? false\"\n :resizing=\"layout.resizing.value?.id === col.id ? layout.resizing.value.size : null\"\n :sortable=\"columnSortable(col)\"\n :phone=\"phone\"\n @sort=\"(c, additive) => emit('sort', c.id, additive)\"\n @filter=\"(c) => emit('header-filter', c.id)\"\n @action=\"onHeaderAction\"\n @nav=\"onHeaderNav\"\n @resize-by=\"(c, d) => layout.setWidth(c.id, layout.widthOf(c.id) + d)\"\n @resize-start=\"(c, w) => layout.setWidth(c.id, w)\"\n />\n <div class=\"dt-head-cell dt-cell-fill\" role=\"presentation\" aria-hidden=\"true\" />\n <HeaderCell\n v-for=\"col in layout.end.value\"\n :key=\"col.id\"\n :column=\"col\"\n :sort=\"sortOf(col.id)?.dir ?? null\"\n :sort-index=\"sortOf(col.id)?.index ?? null\"\n :filtered=\"filteredColumns?.has(col.id) ?? false\"\n :resizing=\"layout.resizing.value?.id === col.id ? layout.resizing.value.size : null\"\n :sortable=\"columnSortable(col)\"\n :phone=\"phone\"\n @sort=\"(c, additive) => emit('sort', c.id, additive)\"\n @filter=\"(c) => emit('header-filter', c.id)\"\n @action=\"onHeaderAction\"\n @nav=\"onHeaderNav\"\n @resize-by=\"(c, d) => layout.setWidth(c.id, layout.widthOf(c.id) + d)\"\n @resize-start=\"(c, w) => layout.setWidth(c.id, w)\"\n />\n <div\n v-if=\"rowMenu\"\n class=\"dt-head-cell dt-head-menu-col is-pinned-end\"\n :class=\"{ 'is-pin-edge': !layout.end.value.length }\"\n style=\"right: 0px\"\n role=\"columnheader\"\n />\n </div>\n <div class=\"dt-body\" role=\"presentation\" :inert=\"dim || undefined\" :style=\"{ height: `${totalSize}px` }\">\n <div\n v-for=\"item in virtualRows\"\n :key=\"String(item.key)\"\n :ref=\"(el) => measureItem(el as Element | null, item.index)\"\n class=\"dt-item\"\n :data-index=\"item.index\"\n :style=\"{ transform: `translateY(${item.start - headH}px)` }\"\n >\n <SkeletonRow v-if=\"skeleton\" :index=\"item.index\" :columns=\"layout.columns.value\" />\n <template v-else>\n <Row\n :row=\"rows[item.index]!\"\n :index=\"item.index\"\n :row-index=\"2 + rowIndexOffset + item.index\"\n :columns=\"layout.columns.value\"\n :env=\"env\"\n :focused=\"roving.focusedIndex.value === item.index\"\n :keyboard-focus=\"roving.keyboard.value\"\n :secondary-visible=\"density === 'comfortable'\"\n :label=\"labelOf(rows[item.index])\"\n :selectable=\"selectable\"\n :selected=\"isSelected(item.index)\"\n :select-edge=\"!layout.start.value.length\"\n :expandable=\"expandable\"\n :can-expand=\"canExpandRow(rows[item.index])\"\n :expanded=\"isExpanded(rows[item.index])\"\n :subrow-id=\"subrowId(rows[item.index])\"\n :menu=\"rowMenu\"\n :menu-open=\"menuIndex === item.index\"\n :menu-edge=\"!layout.end.value.length\"\n :row-actions=\"rowActions\"\n :error=\"errorOf(rows[item.index])\"\n :uid=\"rowUid(rows[item.index])\"\n :href=\"primaryHref?.(rows[item.index])\"\n :primary-header=\"primaryHeader\"\n @select=\"(v, shift) => onSelect(item.index, v, shift)\"\n @expand=\"emit('toggle-expand', rowIdAt(item.index), !isExpanded(rows[item.index]))\"\n @menu-open=\"(o) => (menuIndex = o ? item.index : -1)\"\n @open=\"(e) => emit('row-open', toRaw(rows[item.index]), e)\"\n @copy=\"emit('copy-id', toRaw(rows[item.index]))\"\n />\n <div\n v-if=\"isExpanded(rows[item.index])\"\n :id=\"subrowId(rows[item.index])\"\n class=\"dt-subrow\"\n role=\"row\"\n :aria-rowindex=\"2 + rowIndexOffset + item.index\"\n >\n <div role=\"gridcell\" :aria-colspan=\"layout.columns.value.length\">\n <slot\n name=\"expanded\"\n :row=\"toRaw(rows[item.index])\"\n :close=\"() => emit('toggle-expand', rowIdAt(item.index), false)\"\n />\n </div>\n </div>\n </template>\n </div>\n </div>\n </div>\n <div v-if=\"refreshing\" class=\"dt-refresh-bar\" aria-hidden=\"true\" />\n <div v-if=\"$slots.notice\" class=\"dt-notice\" role=\"status\"><slot name=\"notice\" /></div>\n <div v-if=\"$slots.state && !skeleton && rows.length === 0\" class=\"dt-body-state\"><slot name=\"state\" /></div>\n <div class=\"dt-scroll-pill\" :class=\"{ 'is-visible': pill }\" aria-hidden=\"true\">{{ pillText }}</div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Izgara kökü (05 §2–4, §6–8, §10; 08 §1–3; brief §5.5): tek kayan alan, sticky header, sabit sütunlar + koşullu kenar gölgesi,\n// sanal satırlar (@tanstack/vue-virtual; öğe = satır + açık detay, ölçülen yükseklik), satır odaklı klavye, header klavyesi ve\n// sütun menüsü, seçim sütunu (40 px) ve ⋯ sütunu (44 px; hatalı satır varken 66), satır menüsü, kaydırma hapı. Veri çekmez, sütun düzenini dışarıdan\n// (useColumnLayout) alır; seçim/expand durumunu üstten alır ve niyet olarak yayar.\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, toRaw, useId, watch, watchEffect } from 'vue'\n\n// İç bileşen: satır tipi dış bileşende (DataTable) tiplidir; accessor/cell parametreleri karşıt değişken olduğundan burada any.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyRow = any\nimport type { Density } from '../../types/core'\nimport type { RowAction } from '../../types/list'\nimport { RemoteLabels } from '../cells/remoteLabels'\nimport type { RenderEnv } from '../cells/renderCell'\nimport { TYPE_SPECS } from '../cells/specs'\nimport type { ColumnLayoutApi, LayoutColumn } from '../columns/useColumnLayout'\nimport { getFormat } from '../format'\nimport { isPlainRowClick } from '../interaction/isInteractive'\nimport { useRovingRows } from '../interaction/useRovingRows'\nimport { useDataTableContext } from '../plugin'\nimport HeaderCell from './HeaderCell.vue'\nimport type { HeaderAction } from './headerActions'\nimport { inlineActionsOf } from './inlineActions'\nimport Row from './Row'\nimport SkeletonRow from './SkeletonRow'\n\nconst props = withDefaults(\n defineProps<{\n layout: ColumnLayoutApi<AnyRow>\n rows: AnyRow[]\n density?: Density\n /** role=grid aria-label. */\n label: string\n /** aria-busy. */\n loading?: boolean\n /** 12 iskelet satır (First load, 400 ms'yi aşan sorgu değişimi). */\n skeleton?: boolean\n /** Sorgu değişimi: eski satırlar soluk + inert (05 §10 · Query change). */\n dim?: boolean\n /** Header altında 2 px belirsiz çubuk (Refreshing). */\n refreshing?: boolean\n verticalLines?: boolean\n /** aria-rowcount; bilinmiyorsa -1. */\n rowCount?: number\n /** Sayfa ofseti: aria-rowindex ve kaydırma hapı (05 §8). */\n rowIndexOffset?: number\n sort?: ReadonlyMap<string, { dir: 'asc' | 'desc'; index: number | null }>\n filteredColumns?: ReadonlySet<string>\n sortable?: boolean\n /** `ajax`/`user` etiket önbelleği; DataTable filtre çipleriyle paylaşır. */\n labels?: RemoteLabels\n /** Seçim sütunu (05 §6); durum `selection` (anahtar → seçili). */\n selectable?: boolean\n selection?: Record<string, boolean>\n /** Birincil hücrede chevron + alt satır (05 §7); durum `expanded` (anahtar → açık). */\n expandable?: boolean\n expanded?: Record<string, boolean>\n canExpand?: (row: AnyRow) => boolean\n /** ⋯ sütunu ve satır menüsü: Open / Copy yerleşik, `rowActions` uygulamanın. */\n rowMenu?: boolean\n rowActions?: RowAction[]\n /** Satır hatası (05 §4, D35): metin/metin listesi; boş → yok. */\n rowError?: (row: AnyRow) => string | string[] | null | undefined\n primaryHref?: (row: AnyRow) => string | undefined\n primaryLabel?: (row: AnyRow) => string\n primaryHeader?: string\n /** Telefon (05 §11): seçim sütunu 48, satır 48 px, kısa header; sabitleme useColumnLayout'ta. */\n phone?: boolean\n }>(),\n { density: 'standard', loading: false, rowCount: -1, rowIndexOffset: 0, sortable: false },\n)\nconst emit = defineEmits<{\n 'row-click': [row: AnyRow, event: MouseEvent]\n /** Birincil linke düz sol tık, satırda ↵, menüde Open (05 §7). Native navigasyon dinleyicide durdurulabilir. */\n 'row-open': [row: AnyRow, event: MouseEvent]\n 'select-rows': [ids: string[], value: boolean]\n 'select-page': [value: boolean]\n 'toggle-expand': [id: string, value: boolean]\n 'copy-id': [row: AnyRow]\n sort: [columnId: string, additive: boolean]\n 'sort-set': [columnId: string, dir: 'asc' | 'desc' | null]\n 'header-filter': [columnId: string]\n}>()\ndefineSlots<{\n notice?: () => unknown\n state?: () => unknown\n expanded?: (props: { row: AnyRow; close: () => void }) => unknown\n}>()\n\nconst ctx = useDataTableContext()\nconst root = ref<HTMLElement | null>(null)\nconst scrollEl = ref<HTMLElement | null>(null)\nconst layout = props.layout\n\n// Dokunmatikte Compact → Standard (02 · Yoğunluk); satır yüksekliği buna göre.\nconst coarse = typeof matchMedia === 'function' && matchMedia('(pointer: coarse)').matches\nconst density = computed<Density>(() => (coarse && props.density === 'compact' ? 'standard' : props.density))\n\n// Seçim (40; telefonda 48) ve ⋯ sütunları düzenin dışında: track'ler başa/sona eklenir, sabit sütun ofsetleri o kadar kayar.\n// ⋯ sütunu içeriğe göre (05 §4): 8 + ⋯ 28 + 8 = 44; sayfada hatalı satır varsa (D35) + 14 + 8; inline aksiyon başına (D36,\n// sayfadaki en kalabalık satır) + 28 + 8. CSS: .dt-cell-menu (dolgu 8, gap 8).\nconst SELECT_W = 40\nconst SELECT_W_PHONE = 48\nconst MENU_PAD = 8\nconst MORE_W = 28\nconst ERROR_SLOT = 14 + 8\nconst INLINE_SLOT = 28 + 8\nconst selW = computed(() => (props.selectable ? (props.phone ? SELECT_W_PHONE : SELECT_W) : 0))\nconst anyError = computed(() => !!props.rowError && props.rows.some((r) => errorOf(r).length > 0))\nconst maxInline = computed(() => {\n const actions = props.rowActions ?? []\n if (!actions.some((a) => a.inline)) return 0\n return props.rows.reduce((m, r) => Math.max(m, inlineActionsOf(actions, r).length), 0)\n})\nconst menuW = computed(() =>\n props.rowMenu ? MENU_PAD + (anyError.value ? ERROR_SLOT : 0) + maxInline.value * INLINE_SLOT + MORE_W + MENU_PAD : 0,\n)\n// Genişlikler ve sabit ofsetleri Vue render'ı dışında, senkron (05 · Resize: kare başına < 1 ms).\nwatchEffect(\n () => {\n const el = root.value\n if (!el) return\n const cols = [selW.value ? `${selW.value}px` : '', layout.colsVar.value, menuW.value ? `${menuW.value}px` : '']\n el.style.setProperty('--cols', cols.filter(Boolean).join(' '))\n el.style.setProperty('--dt-min-w', `${layout.minWidth.value + selW.value + menuW.value}px`)\n el.style.setProperty('--dt-sel-w', `${selW.value}px`)\n el.style.setProperty('--dt-menu-w', `${menuW.value}px`)\n const startVars = new Set(layout.start.value.map((c) => c.offsetVar))\n const endVars = new Set(layout.end.value.map((c) => c.offsetVar))\n for (const [name, value] of Object.entries(layout.offsetVars.value)) {\n const extra = startVars.has(name) ? selW.value : endVars.has(name) ? menuW.value : 0\n el.style.setProperty(name, extra ? `${parseFloat(value) + extra}px` : value)\n }\n },\n { flush: 'sync' },\n)\n\n// Satır yüksekliği token'dan (02): yoğunluk değişince yeniden okunur; jsdom'da boş gelir → 40.\nconst rowHeight = ref(40)\n// Sticky header akış içinde: sanal öğeler header kadar aşağıda başlar (TanStack `scrollMargin`), header görünür alanın üstünü\n// (`scrollPaddingStart`), yatay kaydırma çubuğu altını (`scrollPaddingEnd`) örter. Yoksa ↓ ile inen satır tam bir header\n// yüksekliği kadar kabın altında kalır (08 §2).\nconst headH = ref(36)\nconst barH = ref(0)\nconst readBarH = () => {\n const el = scrollEl.value\n barH.value = el ? Math.max(0, el.offsetHeight - el.clientHeight) : 0\n}\nconst readRowHeight = () => {\n const v = root.value ? parseFloat(getComputedStyle(root.value).getPropertyValue('--dt-row-h')) : NaN\n rowHeight.value = Number.isFinite(v) ? v : 40\n headH.value = root.value?.querySelector<HTMLElement>('.dt-head')?.offsetHeight ?? headH.value\n readBarH()\n}\nonMounted(readRowHeight)\nwatch([density, () => props.phone], () => requestAnimationFrame(readRowHeight))\n\nconst env = computed<RenderEnv>(() => ({\n fmt: getFormat(ctx.locale),\n i18n: ctx.i18n,\n today: new Date(),\n labels,\n density: density.value,\n coarse,\n}))\nconst labels = props.labels ?? new RemoteLabels()\n\nconst headerLabels = () => [...(root.value?.querySelectorAll<HTMLElement>('.dt-head-label') ?? [])]\n/** Sütunun header ve gövde hücreleri (id'de nokta olabilir: CSS.escape yerine dataset karşılaştırması). */\nconst cellsOf = (id: string) =>\n [...(root.value?.querySelectorAll<HTMLElement>('[data-col]') ?? [])].filter((c) => c.dataset.col === id)\nconst focusHeader = (i: number) => {\n const els = headerLabels()\n els[Math.max(0, Math.min(els.length - 1, i))]?.focus()\n}\n\nconst rowIdAt = (i: number) => layout.rowId(props.rows[i]!)\nconst isSelected = (i: number) => !!props.selection?.[rowIdAt(i)]\nconst isExpanded = (row: AnyRow) => !!props.expanded?.[layout.rowId(row)]\nconst canExpandRow = (row: AnyRow) => !!props.expandable && (props.canExpand?.(row) ?? true)\nconst labelOf = (row: AnyRow) => props.primaryLabel?.(row) ?? layout.rowId(row)\nconst uid = useId()\nconst subrowId = (row: AnyRow) => `${uid}-sub-${layout.rowId(row)}`\nconst rowUid = (row: AnyRow) => `${uid}-r-${layout.rowId(row)}`\n/** `rowError` sonucunu mesaj listesine indirger; boş metinler düşer, boş liste = hata yok. */\nconst errorOf = (row: AnyRow): string[] => {\n const e = props.rowError?.(row)\n return (Array.isArray(e) ? e : [e]).filter((m): m is string => !!m)\n}\nconst rowEl = (i: number) => root.value?.querySelector<HTMLElement>(`.dt-row[data-index=\"${i}\"]`) ?? null\n\nconst roving = useRovingRows({\n count: () => props.rows.length,\n rowEl,\n scrollToIndex: (i) => virtualizer.value.scrollToIndex(i, { align: 'auto' }),\n pageSize: () => Math.max(1, Math.floor((scrollEl.value?.clientHeight ?? 0) / (rowHeight.value + 1)) - 1),\n // ↵: birincil linke gerçek tık (tarayıcı gider, `row-open` dinleyicisi durdurabilir); link yoksa açılacak şey yok.\n onEnter: (i) => rowEl(i)?.querySelector<HTMLElement>('.dt-cell.is-primary a.dt-link')?.click(),\n // → kapalı detayı açar, açıksa/yoksa widget'lara girer; ← açık detayı kapatır (08 §2).\n onRight: (i) => {\n const row = props.rows[i]\n if (!row || !canExpandRow(row) || isExpanded(row)) return false\n emit('toggle-expand', layout.rowId(row), true)\n return true\n },\n onLeft: (i) => {\n const row = props.rows[i]\n if (!row || !isExpanded(row)) return false\n emit('toggle-expand', layout.rowId(row), false)\n return true\n },\n onTop: () => focusHeader(0),\n})\n\n// Seçim klavyesi (05 §6, 08 §3): X seçer/bırakır, ⇧↑/↓ aralığı genişletir, ⌘A sayfadakiler; ⇧F10 / Menü tuşu satır menüsü.\nlet anchor = -1\nconst idsBetween = (a: number, b: number) => {\n const [from, to] = a < b ? [a, b] : [b, a]\n return props.rows.slice(from, to + 1).map((r) => layout.rowId(r))\n}\nconst menuIndex = ref(-1)\nconst onKeydown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement\n const row = target.closest<HTMLElement>('[role=\"row\"][data-index]')\n if (row && target === row) {\n const i = Number(row.dataset.index)\n const mod = e.metaKey || e.ctrlKey\n if (props.selectable) {\n if ((e.key === 'x' || e.key === 'X') && !mod && !e.altKey) {\n e.preventDefault()\n anchor = i\n emit('select-rows', [rowIdAt(i)], !isSelected(i))\n return\n }\n if ((e.key === 'a' || e.key === 'A') && mod && !e.shiftKey) {\n e.preventDefault()\n emit('select-page', true)\n return\n }\n if (e.shiftKey && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n e.preventDefault()\n if (anchor < 0) anchor = i\n const to = Math.max(0, Math.min(props.rows.length - 1, e.key === 'ArrowDown' ? i + 1 : i - 1))\n emit('select-rows', idsBetween(anchor, to), true)\n roving.focusRow(to)\n return\n }\n if (e.key.startsWith('Arrow') || e.key === 'Home' || e.key === 'End') anchor = -1\n }\n if (props.rowMenu && ((e.key === 'F10' && e.shiftKey) || e.key === 'ContextMenu')) {\n e.preventDefault()\n menuIndex.value = i\n return\n }\n }\n roving.onKeydown(e)\n}\n/** Checkbox: ⇧ ile son tıklanan satırla arasındaki aralık aynı değere (05 §6). */\nconst onSelect = (i: number, value: boolean, shift: boolean) => {\n emit('select-rows', shift && anchor >= 0 ? idsBetween(anchor, i) : [rowIdAt(i)], value)\n anchor = i\n}\nconst selectedCount = computed(() =>\n props.selectable ? props.rows.reduce((n, r) => n + (props.selection?.[layout.rowId(r)] ? 1 : 0), 0) : 0,\n)\nconst allSelected = computed(() => props.rows.length > 0 && selectedCount.value === props.rows.length)\nconst someSelected = computed(() => selectedCount.value > 0 && !allSelected.value)\n\nconst skeleton = computed(() => !!props.skeleton)\nconst count = computed(() => (skeleton.value ? 12 : props.rows.length))\n\nconst virtualizer = useVirtualizer(\n computed(() => ({\n count: count.value,\n getScrollElement: () => scrollEl.value,\n estimateSize: () => rowHeight.value + 1, // + 1 px alt kenarlık (02)\n scrollMargin: headH.value,\n scrollPaddingStart: headH.value,\n scrollPaddingEnd: barH.value,\n overscan: 10,\n getItemKey: (i: number) => (skeleton.value ? `sk-${i}` : layout.rowId(props.rows[i]!)),\n // Odaklı satır her zaman DOM'da (08 §2): kaydırma odağı kaybettirmez.\n rangeExtractor: (range: { startIndex: number; endIndex: number; overscan: number; count: number }) => {\n const start = Math.max(0, range.startIndex - range.overscan)\n const end = Math.min(range.count - 1, range.endIndex + range.overscan)\n const out: number[] = []\n const f = roving.focusedIndex.value\n if (!skeleton.value && f >= 0 && f < start && f < range.count) out.push(f)\n for (let i = start; i <= end; i++) out.push(i)\n if (!skeleton.value && f > end && f < range.count) out.push(f)\n return out\n },\n })),\n)\nconst virtualRows = computed(() => virtualizer.value.getVirtualItems())\nconst totalSize = computed(() => virtualizer.value.getTotalSize())\n// Açık detay: öğe (satır + alt satır) ölçülür, anahtarla önbellekte kalır; kapanınca satır yüksekliğine döner (05 §7).\nconst measureItem = (el: Element | null, index: number) => {\n if (el && !skeleton.value && isExpanded(props.rows[index])) virtualizer.value.measureElement(el)\n}\nwatch(\n () => new Set(Object.keys(props.expanded ?? {}).filter((k) => props.expanded![k])),\n (now, before) => {\n for (const key of before ?? []) {\n if (now.has(key)) continue\n const i = props.rows.findIndex((r) => layout.rowId(r) === key)\n if (i >= 0) virtualizer.value.resizeItem(i, rowHeight.value + 1)\n }\n },\n)\n\n// Sabit sütun kenar gölgesi yalnızca o yöne kaydırılmışken (05 §4 · Pinned). Dikey kaydırmada konum hapı (05 §8).\nconst scrolledStart = shallowRef(false)\nconst scrolledEnd = shallowRef(false)\nconst pill = shallowRef<{ from: number; to: number } | null>(null)\nlet pillTimer: ReturnType<typeof setTimeout> | undefined\nlet lastTop = 0\nconst onScroll = () => {\n const el = scrollEl.value\n if (!el) return\n readBarH()\n scrolledStart.value = el.scrollLeft > 0\n scrolledEnd.value = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n if (el.scrollTop === lastTop) return\n lastTop = el.scrollTop\n const range = virtualizer.value.range\n if (!range || skeleton.value) return\n pill.value = { from: props.rowIndexOffset + range.startIndex + 1, to: props.rowIndexOffset + range.endIndex + 1 }\n clearTimeout(pillTimer)\n pillTimer = setTimeout(() => (pill.value = null), 900)\n}\nconst pillText = computed(() =>\n pill.value ? ctx.i18n.t('page.scrollPos', { from: pill.value.from, to: pill.value.to }) : '',\n)\nonMounted(() => {\n onScroll()\n if (scrollEl.value && typeof ResizeObserver !== 'undefined') new ResizeObserver(onScroll).observe(scrollEl.value)\n})\nonBeforeUnmount(() => clearTimeout(pillTimer))\n\n// Satır tıklaması: tek guard (05 §7). Sürükleme tespiti için mousedown noktası.\nlet downPoint: { x: number; y: number } | null = null\nconst onMousedown = (e: MouseEvent) => {\n downPoint = { x: e.clientX, y: e.clientY }\n roving.onMousedown(e)\n}\nconst onClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n const rowEl = target.closest<HTMLElement>('.dt-row[data-index]')\n if (!rowEl) return\n const row = props.rows[Number(rowEl.dataset.index)]\n if (!row) return\n // Birincil linke düz sol tık → row-open; değiştirici tuş / orta tık tarayıcıya (D6).\n const link = target.closest('a.dt-link')\n if (link && link.closest('.dt-cell.is-primary') && rowEl.contains(link)) {\n if (e.button === 0 && !e.metaKey && !e.ctrlKey && !e.shiftKey && !e.altKey) emit('row-open', toRaw(row), e)\n return\n }\n if (isPlainRowClick(e, rowEl, downPoint)) emit('row-click', toRaw(row), e)\n}\n\nconst sortOf = (id: string) => props.sort?.get(id)\nconst columnSortable = (c: LayoutColumn<AnyRow>) =>\n props.sortable && (c.def.sortable ?? TYPE_SPECS[c.def.type].sortable)\n\n/** Çift tık / menü: içeriğe sığdır (görünür satırlar + header). */\nconst fitToContent = (col: LayoutColumn<AnyRow>) => {\n const el = root.value\n if (!el) return\n const items = cellsOf(col.id).flatMap((c) => [...c.querySelectorAll<HTMLElement>('.dt-cell-content, .dt-head-text')])\n // Blok eleman hücre genişken onu doldurur; içeriğin gerçek genişliği için geçici max-content (tek reflow: önce yaz, sonra oku).\n // max-width: 100% kesilmiş içeriği hücreye, flex-shrink header metnini düğmeye sıkıştırır; ölçüm için ikisi de kalkar.\n for (const c of items) {\n c.style.width = 'max-content'\n c.style.maxWidth = 'none'\n c.style.flex = 'none'\n }\n const max = items.reduce((m, c) => Math.max(m, c.getBoundingClientRect().width), 0)\n for (const c of items) {\n c.style.width = ''\n c.style.maxWidth = ''\n c.style.flex = ''\n }\n const pad = parseFloat(getComputedStyle(el).getPropertyValue('--dt-cell-x')) || 12\n // 24 px: hover'da beliren hücre aksiyonları ve header'daki ok/⋯ için pay.\n layout.setWidth(col.id, Math.ceil(max) + pad * 2 + 24)\n}\n\n/** Sütun menüsü ve ⌥⇧←/→ (05 §4): sıralama dışındakiler düzenin kendi işi. Taşınan başlığın odağı korunur. */\nconst onHeaderAction = (col: LayoutColumn<AnyRow>, action: HeaderAction) => {\n switch (action) {\n case 'filter':\n emit('header-filter', col.id)\n return\n case 'sort-asc':\n case 'sort-desc':\n case 'sort-clear':\n emit('sort-set', col.id, action === 'sort-clear' ? null : action === 'sort-asc' ? 'asc' : 'desc')\n return\n case 'pin-left':\n layout.pin(col.id, 'start')\n return\n case 'pin-right':\n layout.pin(col.id, 'end')\n return\n case 'unpin':\n layout.pin(col.id, null)\n return\n case 'fit':\n fitToContent(col)\n return\n case 'hide':\n layout.setVisible(col.id, false)\n return\n case 'move-left':\n case 'move-right': {\n const focused = document.activeElement?.closest<HTMLElement>('.dt-head-cell')?.dataset.col === col.id\n layout.move(col.id, action === 'move-left' ? -1 : 1)\n if (focused) void nextTick(() => cellsOf(col.id)[0]?.querySelector<HTMLElement>('.dt-head-label')?.focus())\n }\n }\n}\nconst onHeaderNav = (col: LayoutColumn<AnyRow>, to: 'left' | 'right' | 'down') => {\n if (to === 'down') {\n roving.focusRow(roving.focusedIndex.value)\n return\n }\n const i = layout.columns.value.findIndex((c) => c.id === col.id)\n focusHeader(to === 'left' ? i - 1 : i + 1)\n}\n\n// Sayfa/sorgu değişiminde odak: aynı anahtar → aynı indeks → ilk satır (08 §2); ızgaradaysa odak geri verilir.\n// Dizi kimliği değil anahtar dizisi izlenir: seçim değişince satır modeli yeniden hesaplanır ama satırlar aynıdır.\nlet lastKeys = props.rows.map((r) => layout.rowId(r))\nwatch(\n () => props.rows.map((r) => layout.rowId(r)).join('\\u0000'),\n () => {\n const keys = props.rows.map((r) => layout.rowId(r))\n const hadFocus = !!root.value && root.value.contains(document.activeElement)\n const prevKey = lastKeys[roving.focusedIndex.value]\n const same = prevKey === undefined ? -1 : keys.indexOf(prevKey)\n if (same >= 0) roving.focusedIndex.value = same\n else roving.clamp()\n lastKeys = keys\n anchor = -1\n if (hadFocus && keys.length) void nextTick(() => roving.focusRow(roving.focusedIndex.value))\n },\n)\n// estimateSize değişimi ölçüm önbelleğini yenilemez (virtual-core memo'su count/getItemKey'e bağlı): yoğunluk değişince sıfırla.\nwatch(rowHeight, () => virtualizer.value.measure())\n\ndefineExpose({\n focusRow: roving.focusRow,\n scrollToIndex: (i: number) => virtualizer.value.scrollToIndex(i),\n scrollToTop: () => {\n if (scrollEl.value) scrollEl.value.scrollTop = 0\n },\n /** Ölçüm önbelleğini sıfırlar (sorgu/sayfa sonrası açıklar kapanınca, 05 §7). */\n measure: () => virtualizer.value.measure(),\n rowEl,\n})\n</script>\n\n<template>\n <div\n ref=\"root\"\n class=\"dt-grid\"\n :class=\"{\n 'is-scrolled-start': scrolledStart,\n 'is-scrolled-end': scrolledEnd,\n 'is-keyboard': roving.keyboard.value,\n 'is-skeleton': skeleton,\n 'is-dim': dim,\n 'has-vlines': verticalLines,\n 'is-phone': phone,\n }\"\n role=\"grid\"\n :aria-label=\"label\"\n :aria-rowcount=\"rowCount\"\n :aria-colcount=\"layout.columns.value.length + (selectable ? 1 : 0) + (rowMenu ? 1 : 0)\"\n :aria-busy=\"loading || dim ? 'true' : undefined\"\n :data-density=\"density\"\n @keydown=\"onKeydown\"\n @mousedown=\"onMousedown\"\n @pointerdown=\"roving.onPointerdown\"\n @focusin=\"roving.onFocusin\"\n @click=\"onClick\"\n >\n <div ref=\"scrollEl\" class=\"dt-scroll\" @scroll.passive=\"onScroll\">\n <div class=\"dt-head\" role=\"row\" aria-rowindex=\"1\">\n <div\n v-if=\"selectable\"\n class=\"dt-head-cell dt-head-select is-pinned-start\"\n :class=\"{ 'is-pin-edge': !layout.start.value.length }\"\n style=\"left: 0px\"\n role=\"columnheader\"\n >\n <input\n type=\"checkbox\"\n class=\"dt-checkbox\"\n :checked=\"allSelected\"\n :indeterminate=\"someSelected\"\n :aria-label=\"ctx.i18n.t('row.selectPageAria')\"\n @click=\"emit('select-page', !allSelected)\"\n />\n </div>\n <HeaderCell\n v-for=\"col in [...layout.start.value, ...layout.center.value]\"\n :key=\"col.id\"\n :column=\"col\"\n :sort=\"sortOf(col.id)?.dir ?? null\"\n :sort-index=\"sortOf(col.id)?.index ?? null\"\n :filtered=\"filteredColumns?.has(col.id) ?? false\"\n :resizing=\"layout.resizing.value?.id === col.id ? layout.resizing.value.size : null\"\n :sortable=\"columnSortable(col)\"\n :phone=\"phone\"\n @sort=\"(c, additive) => emit('sort', c.id, additive)\"\n @filter=\"(c) => emit('header-filter', c.id)\"\n @action=\"onHeaderAction\"\n @nav=\"onHeaderNav\"\n @resize-by=\"(c, d) => layout.setWidth(c.id, layout.widthOf(c.id) + d)\"\n @resize-start=\"(c, w) => layout.setWidth(c.id, w)\"\n />\n <div class=\"dt-head-cell dt-cell-fill\" role=\"presentation\" aria-hidden=\"true\" />\n <HeaderCell\n v-for=\"col in layout.end.value\"\n :key=\"col.id\"\n :column=\"col\"\n :sort=\"sortOf(col.id)?.dir ?? null\"\n :sort-index=\"sortOf(col.id)?.index ?? null\"\n :filtered=\"filteredColumns?.has(col.id) ?? false\"\n :resizing=\"layout.resizing.value?.id === col.id ? layout.resizing.value.size : null\"\n :sortable=\"columnSortable(col)\"\n :phone=\"phone\"\n @sort=\"(c, additive) => emit('sort', c.id, additive)\"\n @filter=\"(c) => emit('header-filter', c.id)\"\n @action=\"onHeaderAction\"\n @nav=\"onHeaderNav\"\n @resize-by=\"(c, d) => layout.setWidth(c.id, layout.widthOf(c.id) + d)\"\n @resize-start=\"(c, w) => layout.setWidth(c.id, w)\"\n />\n <div\n v-if=\"rowMenu\"\n class=\"dt-head-cell dt-head-menu-col is-pinned-end\"\n :class=\"{ 'is-pin-edge': !layout.end.value.length }\"\n style=\"right: 0px\"\n role=\"columnheader\"\n />\n </div>\n <div class=\"dt-body\" role=\"presentation\" :inert=\"dim || undefined\" :style=\"{ height: `${totalSize}px` }\">\n <div\n v-for=\"item in virtualRows\"\n :key=\"String(item.key)\"\n :ref=\"(el) => measureItem(el as Element | null, item.index)\"\n class=\"dt-item\"\n :data-index=\"item.index\"\n :style=\"{ transform: `translateY(${item.start - headH}px)` }\"\n >\n <SkeletonRow v-if=\"skeleton\" :index=\"item.index\" :columns=\"layout.columns.value\" />\n <template v-else>\n <Row\n :row=\"rows[item.index]!\"\n :index=\"item.index\"\n :row-index=\"2 + rowIndexOffset + item.index\"\n :columns=\"layout.columns.value\"\n :env=\"env\"\n :focused=\"roving.focusedIndex.value === item.index\"\n :keyboard-focus=\"roving.keyboard.value\"\n :secondary-visible=\"density === 'comfortable'\"\n :label=\"labelOf(rows[item.index])\"\n :selectable=\"selectable\"\n :selected=\"isSelected(item.index)\"\n :select-edge=\"!layout.start.value.length\"\n :expandable=\"expandable\"\n :can-expand=\"canExpandRow(rows[item.index])\"\n :expanded=\"isExpanded(rows[item.index])\"\n :subrow-id=\"subrowId(rows[item.index])\"\n :menu=\"rowMenu\"\n :menu-open=\"menuIndex === item.index\"\n :menu-edge=\"!layout.end.value.length\"\n :row-actions=\"rowActions\"\n :error=\"errorOf(rows[item.index])\"\n :uid=\"rowUid(rows[item.index])\"\n :href=\"primaryHref?.(rows[item.index])\"\n :primary-header=\"primaryHeader\"\n @select=\"(v, shift) => onSelect(item.index, v, shift)\"\n @expand=\"emit('toggle-expand', rowIdAt(item.index), !isExpanded(rows[item.index]))\"\n @menu-open=\"(o) => (menuIndex = o ? item.index : -1)\"\n @open=\"(e) => emit('row-open', toRaw(rows[item.index]), e)\"\n @copy=\"emit('copy-id', toRaw(rows[item.index]))\"\n />\n <div\n v-if=\"isExpanded(rows[item.index])\"\n :id=\"subrowId(rows[item.index])\"\n class=\"dt-subrow\"\n role=\"row\"\n :aria-rowindex=\"2 + rowIndexOffset + item.index\"\n >\n <div role=\"gridcell\" :aria-colspan=\"layout.columns.value.length\">\n <slot\n name=\"expanded\"\n :row=\"toRaw(rows[item.index])\"\n :close=\"() => emit('toggle-expand', rowIdAt(item.index), false)\"\n />\n </div>\n </div>\n </template>\n </div>\n </div>\n </div>\n <div v-if=\"refreshing\" class=\"dt-refresh-bar\" aria-hidden=\"true\" />\n <div v-if=\"$slots.notice\" class=\"dt-notice\" role=\"status\"><slot name=\"notice\" /></div>\n <div v-if=\"$slots.state && !skeleton && rows.length === 0\" class=\"dt-body-state\"><slot name=\"state\" /></div>\n <div class=\"dt-scroll-pill\" :class=\"{ 'is-visible': pill }\" aria-hidden=\"true\">{{ pillText }}</div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// More ⋯ menüsü (05 §3): yalnızca uygulamanın dinlediği olaylar ve verilen ayarlar; Refresh `R`, Auto-refresh switch.\n// Telefonda yerini ⋯ alt sayfası (PhoneMoreSheet) alır.\nimport { PhDotsThree } from '@phosphor-icons/vue'\nimport {\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from 'reka-ui'\nimport { useDataTableContext } from '../plugin'\n\nconst props = defineProps<{\n refresh: boolean\n export: boolean\n import: boolean\n print: boolean\n /** `autoRefresh` prop'u verilmişse switch görünür. */\n autoRefresh: boolean\n autoRefreshOn: boolean\n}>()\nconst emit = defineEmits<{\n refresh: []\n export: [format: 'csv' | 'xlsx']\n import: []\n print: []\n 'update:autoRefreshOn': [on: boolean]\n}>()\nconst { i18n } = useDataTableContext()\nconst hasActions = () => props.export || props.import || props.print\n</script>\n\n<template>\n <DropdownMenuRoot>\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n class=\"dt-btn dt-btn-icon\"\n :aria-label=\"i18n.t('toolbar.more')\"\n :data-dt-tip=\"i18n.t('toolbar.more')\"\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent class=\"dt-menu dt-more\" align=\"end\" :side-offset=\"4\">\n <DropdownMenuSub v-if=\"$props.export\">\n <DropdownMenuSubTrigger class=\"dt-menu-item\">{{ i18n.t('toolbar.export') }}</DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent class=\"dt-menu\" :side-offset=\"4\">\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"emit('export', 'csv')\">\n {{ i18n.t('toolbar.csv') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"emit('export', 'xlsx')\">\n {{ i18n.t('toolbar.xlsx') }}\n </DropdownMenuItem>\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n <DropdownMenuItem v-if=\"$props.import\" class=\"dt-menu-item\" @select=\"emit('import')\">\n {{ i18n.t('toolbar.import') }}\n </DropdownMenuItem>\n <DropdownMenuItem v-if=\"print\" class=\"dt-menu-item\" @select=\"emit('print')\">\n {{ i18n.t('toolbar.print') }}\n </DropdownMenuItem>\n <DropdownMenuSeparator v-if=\"hasActions() && (refresh || autoRefresh)\" class=\"dt-menu-sep\" />\n <DropdownMenuItem v-if=\"refresh\" class=\"dt-menu-item\" @select=\"emit('refresh')\">\n {{ i18n.t('toolbar.refresh') }}\n <kbd class=\"dt-kbd\">R</kbd>\n </DropdownMenuItem>\n <DropdownMenuCheckboxItem\n v-if=\"autoRefresh\"\n class=\"dt-menu-item\"\n :model-value=\"autoRefreshOn\"\n @update:model-value=\"(v) => emit('update:autoRefreshOn', v === true)\"\n >\n {{ i18n.t('toolbar.autoRefresh') }}\n <span class=\"dt-switch dt-pop-end\" :data-state=\"autoRefreshOn ? 'checked' : 'unchecked'\" aria-hidden=\"true\">\n <span class=\"dt-switch-thumb\" />\n </span>\n </DropdownMenuCheckboxItem>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n</template>\n","<script setup lang=\"ts\">\n// More ⋯ menüsü (05 §3): yalnızca uygulamanın dinlediği olaylar ve verilen ayarlar; Refresh `R`, Auto-refresh switch.\n// Telefonda yerini ⋯ alt sayfası (PhoneMoreSheet) alır.\nimport { PhDotsThree } from '@phosphor-icons/vue'\nimport {\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from 'reka-ui'\nimport { useDataTableContext } from '../plugin'\n\nconst props = defineProps<{\n refresh: boolean\n export: boolean\n import: boolean\n print: boolean\n /** `autoRefresh` prop'u verilmişse switch görünür. */\n autoRefresh: boolean\n autoRefreshOn: boolean\n}>()\nconst emit = defineEmits<{\n refresh: []\n export: [format: 'csv' | 'xlsx']\n import: []\n print: []\n 'update:autoRefreshOn': [on: boolean]\n}>()\nconst { i18n } = useDataTableContext()\nconst hasActions = () => props.export || props.import || props.print\n</script>\n\n<template>\n <DropdownMenuRoot>\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n class=\"dt-btn dt-btn-icon\"\n :aria-label=\"i18n.t('toolbar.more')\"\n :data-dt-tip=\"i18n.t('toolbar.more')\"\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent class=\"dt-menu dt-more\" align=\"end\" :side-offset=\"4\">\n <DropdownMenuSub v-if=\"$props.export\">\n <DropdownMenuSubTrigger class=\"dt-menu-item\">{{ i18n.t('toolbar.export') }}</DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent class=\"dt-menu\" :side-offset=\"4\">\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"emit('export', 'csv')\">\n {{ i18n.t('toolbar.csv') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"emit('export', 'xlsx')\">\n {{ i18n.t('toolbar.xlsx') }}\n </DropdownMenuItem>\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n <DropdownMenuItem v-if=\"$props.import\" class=\"dt-menu-item\" @select=\"emit('import')\">\n {{ i18n.t('toolbar.import') }}\n </DropdownMenuItem>\n <DropdownMenuItem v-if=\"print\" class=\"dt-menu-item\" @select=\"emit('print')\">\n {{ i18n.t('toolbar.print') }}\n </DropdownMenuItem>\n <DropdownMenuSeparator v-if=\"hasActions() && (refresh || autoRefresh)\" class=\"dt-menu-sep\" />\n <DropdownMenuItem v-if=\"refresh\" class=\"dt-menu-item\" @select=\"emit('refresh')\">\n {{ i18n.t('toolbar.refresh') }}\n <kbd class=\"dt-kbd\">R</kbd>\n </DropdownMenuItem>\n <DropdownMenuCheckboxItem\n v-if=\"autoRefresh\"\n class=\"dt-menu-item\"\n :model-value=\"autoRefreshOn\"\n @update:model-value=\"(v) => emit('update:autoRefreshOn', v === true)\"\n >\n {{ i18n.t('toolbar.autoRefresh') }}\n <span class=\"dt-switch dt-pop-end\" :data-state=\"autoRefreshOn ? 'checked' : 'unchecked'\" aria-hidden=\"true\">\n <span class=\"dt-switch-thumb\" />\n </span>\n </DropdownMenuCheckboxItem>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n</template>\n","<script setup lang=\"ts\">\n// Toolbar (05 §3, §11; T1, T13): yalnızca yapılandırılmış yuvalar; daralma kartın genişliğiyle (`size`, DataTable ölçer).\n// ≥1024 etiketli · 640–1023 arama ve Display ikon · <640 telefon: görünüm · boşluk · arama · Filter · ⋯ · ayırıcı · birincil;\n// arama açılınca toolbar'ın yerini alır (T13-03), Cancel temizleyip kapatır.\nimport { PhMagnifyingGlass } from '@phosphor-icons/vue'\nimport { computed, ref } from 'vue'\nimport { useDataTableContext } from '../plugin'\nimport SearchBox from './SearchBox.vue'\n\nconst props = defineProps<{\n size: 'full' | 'narrow' | 'phone'\n /** null: arama yuvası yok. */\n search: string | null\n searchPlaceholder: string\n hasFilter: boolean\n hasDisplay: boolean\n /** ⋯ menüsünde en az bir öğe var mı. */\n hasMore: boolean\n}>()\nconst emit = defineEmits<{ 'update:search': [value: string] }>()\nconst { i18n } = useDataTableContext()\n\nconst searchOpen = ref(false)\nconst searchBox = ref<InstanceType<typeof SearchBox> | null>(null)\nconst phone = computed(() => props.size === 'phone')\nconst phoneSearch = computed(() => phone.value && (searchOpen.value || !!props.search))\nconst openSearch = () => {\n searchOpen.value = true\n requestAnimationFrame(() => searchBox.value?.focus())\n}\nconst cancelSearch = () => {\n searchOpen.value = false\n emit('update:search', '')\n}\ndefineExpose({\n focusSearch: () => {\n if (props.size !== 'full' && !searchOpen.value && !props.search) openSearch()\n else searchBox.value?.focus()\n },\n})\n</script>\n\n<template>\n <div class=\"dt-toolbar\" :class=\"`is-${size}`\" role=\"toolbar\">\n <template v-if=\"phoneSearch\">\n <SearchBox\n ref=\"searchBox\"\n :model-value=\"search ?? ''\"\n :placeholder=\"searchPlaceholder\"\n phone\n @update:model-value=\"(v) => emit('update:search', v)\"\n />\n <button type=\"button\" class=\"dt-btn dt-btn-ghost dt-search-cancel\" @click=\"cancelSearch\">\n {{ i18n.t('common.cancel') }}\n </button>\n </template>\n <template v-else>\n <slot name=\"view\" />\n <span class=\"dt-toolbar-spacer\" />\n <template v-if=\"search !== null\">\n <button\n v-if=\"size !== 'full' && !searchOpen && !search\"\n type=\"button\"\n class=\"dt-btn dt-btn-icon dt-search-open\"\n :aria-label=\"searchPlaceholder\"\n :data-dt-tip=\"searchPlaceholder\"\n @click=\"openSearch\"\n >\n <PhMagnifyingGlass :size=\"phone ? 20 : 16\" aria-hidden=\"true\" />\n </button>\n <SearchBox\n v-else\n ref=\"searchBox\"\n :model-value=\"search\"\n :placeholder=\"searchPlaceholder\"\n @update:model-value=\"(v) => emit('update:search', v)\"\n @focusout=\"searchOpen = false\"\n />\n </template>\n <slot v-if=\"hasFilter\" name=\"filter\" :icon-only=\"phone\" :phone=\"phone\" />\n <slot v-if=\"hasDisplay && !phone\" name=\"display\" :icon-only=\"size !== 'full'\" />\n <slot v-if=\"hasMore || (hasDisplay && phone)\" name=\"more\" :phone=\"phone\" />\n <template v-if=\"$slots.end\">\n <span class=\"dt-toolbar-sep\" aria-hidden=\"true\" />\n <span class=\"dt-toolbar-end\"><slot name=\"end\" :compact=\"phone\" /></span>\n </template>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Toolbar (05 §3, §11; T1, T13): yalnızca yapılandırılmış yuvalar; daralma kartın genişliğiyle (`size`, DataTable ölçer).\n// ≥1024 etiketli · 640–1023 arama ve Display ikon · <640 telefon: görünüm · boşluk · arama · Filter · ⋯ · ayırıcı · birincil;\n// arama açılınca toolbar'ın yerini alır (T13-03), Cancel temizleyip kapatır.\nimport { PhMagnifyingGlass } from '@phosphor-icons/vue'\nimport { computed, ref } from 'vue'\nimport { useDataTableContext } from '../plugin'\nimport SearchBox from './SearchBox.vue'\n\nconst props = defineProps<{\n size: 'full' | 'narrow' | 'phone'\n /** null: arama yuvası yok. */\n search: string | null\n searchPlaceholder: string\n hasFilter: boolean\n hasDisplay: boolean\n /** ⋯ menüsünde en az bir öğe var mı. */\n hasMore: boolean\n}>()\nconst emit = defineEmits<{ 'update:search': [value: string] }>()\nconst { i18n } = useDataTableContext()\n\nconst searchOpen = ref(false)\nconst searchBox = ref<InstanceType<typeof SearchBox> | null>(null)\nconst phone = computed(() => props.size === 'phone')\nconst phoneSearch = computed(() => phone.value && (searchOpen.value || !!props.search))\nconst openSearch = () => {\n searchOpen.value = true\n requestAnimationFrame(() => searchBox.value?.focus())\n}\nconst cancelSearch = () => {\n searchOpen.value = false\n emit('update:search', '')\n}\ndefineExpose({\n focusSearch: () => {\n if (props.size !== 'full' && !searchOpen.value && !props.search) openSearch()\n else searchBox.value?.focus()\n },\n})\n</script>\n\n<template>\n <div class=\"dt-toolbar\" :class=\"`is-${size}`\" role=\"toolbar\">\n <template v-if=\"phoneSearch\">\n <SearchBox\n ref=\"searchBox\"\n :model-value=\"search ?? ''\"\n :placeholder=\"searchPlaceholder\"\n phone\n @update:model-value=\"(v) => emit('update:search', v)\"\n />\n <button type=\"button\" class=\"dt-btn dt-btn-ghost dt-search-cancel\" @click=\"cancelSearch\">\n {{ i18n.t('common.cancel') }}\n </button>\n </template>\n <template v-else>\n <slot name=\"view\" />\n <span class=\"dt-toolbar-spacer\" />\n <template v-if=\"search !== null\">\n <button\n v-if=\"size !== 'full' && !searchOpen && !search\"\n type=\"button\"\n class=\"dt-btn dt-btn-icon dt-search-open\"\n :aria-label=\"searchPlaceholder\"\n :data-dt-tip=\"searchPlaceholder\"\n @click=\"openSearch\"\n >\n <PhMagnifyingGlass :size=\"phone ? 20 : 16\" aria-hidden=\"true\" />\n </button>\n <SearchBox\n v-else\n ref=\"searchBox\"\n :model-value=\"search\"\n :placeholder=\"searchPlaceholder\"\n @update:model-value=\"(v) => emit('update:search', v)\"\n @focusout=\"searchOpen = false\"\n />\n </template>\n <slot v-if=\"hasFilter\" name=\"filter\" :icon-only=\"phone\" :phone=\"phone\" />\n <slot v-if=\"hasDisplay && !phone\" name=\"display\" :icon-only=\"size !== 'full'\" />\n <slot v-if=\"hasMore || (hasDisplay && phone)\" name=\"more\" :phone=\"phone\" />\n <template v-if=\"$slots.end\">\n <span class=\"dt-toolbar-sep\" aria-hidden=\"true\" />\n <span class=\"dt-toolbar-end\"><slot name=\"end\" :compact=\"phone\" /></span>\n </template>\n </template>\n </div>\n</template>\n","// Görünüm modeli (04 §7, D4, D5): varsayılan görünüm sırası, düzenlenmiş durum karşılaştırması, ad doğrulama, sıralama.\nimport type { FilterCondition } from '../../types/query'\nimport type { View, ViewState } from '../../types/views'\n\n/** Ekran açılırken: kullanıcı varsayılanı (tercih) → system `default` → ilk system view → yok (tablonun varsayılanı). */\nexport function defaultView(views: View[], preferredId: string | null | undefined): View | null {\n return (\n (preferredId ? views.find((v) => v.id === preferredId) : undefined) ??\n views.find((v) => v.kind === 'system' && v.default) ??\n views.find((v) => v.kind === 'system') ??\n null\n )\n}\n\nconst normFilter = (f: FilterCondition) => {\n const v = 'value' in f ? f.value : undefined\n return { ...f, value: Array.isArray(v) ? [...(v as unknown[])].sort() : v }\n}\nconst filtersKey = (fs: FilterCondition[]) =>\n JSON.stringify(fs.map(normFilter).sort((a, b) => a.column.localeCompare(b.column)))\nconst sorted = (ids: string[]) => [...ids].sort().join('\\u0000')\n\n/** Normalize karşılaştırma: `in` değerleri sırasız, görünürler küme, genişlikte ±2 px tolerans. */\nexport function sameState(a: ViewState, b: ViewState): boolean {\n if (filtersKey(a.filters) !== filtersKey(b.filters)) return false\n if (JSON.stringify(a.sort) !== JSON.stringify(b.sort)) return false\n const ca = a.columns\n const cb = b.columns\n if (ca.order.join('\\u0000') !== cb.order.join('\\u0000') || sorted(ca.visible) !== sorted(cb.visible)) return false\n if (ca.pinned.left.join('\\u0000') !== cb.pinned.left.join('\\u0000')) return false\n if (ca.pinned.right.join('\\u0000') !== cb.pinned.right.join('\\u0000')) return false\n for (const id of new Set([...Object.keys(ca.widths), ...Object.keys(cb.widths)])) {\n const x = ca.widths[id]\n const y = cb.widths[id]\n if (x === undefined || y === undefined ? x !== y : Math.abs(x - y) > 2) return false\n }\n return true\n}\n\nexport type NameError = 'required' | 'tooLong' | 'taken'\n/** Save as new view / Rename (04 §7): zorunlu, en fazla 60, kişisel görünümler arasında benzersiz (büyük/küçük harf duyarsız). */\nexport function nameError(name: string, views: View[], locale: string, selfId?: string): NameError | null {\n const n = name.trim()\n if (!n) return 'required'\n if (n.length > 60) return 'tooLong'\n const lower = n.toLocaleLowerCase(locale)\n const taken = views.some(\n (v) => v.kind === 'personal' && v.id !== selfId && v.name.toLocaleLowerCase(locale) === lower,\n )\n return taken ? 'taken' : null\n}\n\n/** Kişisel görünümler ada göre (yerel ayar karşılaştırması); system kod sırasında kalır. */\nexport const byName = (views: View[], collator: Intl.Collator): View[] =>\n [...views].sort((a, b) => collator.compare(a.name, b.name))\n","// Görünümler (04 §7, D4, D5, D30): `views` prop'u (system) + adapter (personal) birleşimi, açılış seçimi, düzenlenmiş\n// durum (bellekte, oturum boyu, görünüm başına), kaydet / kopyala / yeniden adlandır / sil. Paket veri çekmez (D18);\n// adapter'ı uygulama verir, yoksa kaydetme yoktur.\nimport { computed, reactive, ref, shallowRef } from 'vue'\nimport type { TableId } from '../../types/core'\nimport type { View, ViewPatch, ViewState, ViewsAdapter } from '../../types/views'\nimport { getFormat } from '../format'\nimport { byName, defaultView, sameState } from './model'\n\nexport interface ViewsOptions {\n tableId: () => TableId\n system: () => View[]\n adapter: ViewsAdapter | null\n locale: () => string\n defaultViewId: () => string | null\n setDefaultViewId: (id: string | null) => void\n /** Tercihler yüklendi; kullanıcı varsayılanı ancak o zaman bilinir. */\n prefsReady: Promise<void>\n /** Tablonun etkin durumu (filtre + sıralama + sütun düzeni). */\n current: () => ViewState\n /** Tek adımda uygular; eksik alanlar tablonun varsayılanı (tek talep). */\n apply: (patch: ViewPatch) => void\n onChange: (view: View) => void\n}\n\nexport function useViews(o: ViewsOptions) {\n const saved = ref<View[]>([])\n const all = computed(() => [...o.system(), ...saved.value])\n const sections = computed(() => {\n const collator = getFormat(o.locale()).collator()\n return {\n system: o.system(),\n personal: byName(\n saved.value.filter((v) => v.kind === 'personal'),\n collator,\n ),\n }\n })\n const activeId = ref<string | null>(null)\n const active = computed(() => all.value.find((v) => v.id === activeId.value) ?? null)\n /** Uygulandıktan sonraki etkin durum: \"edited\" bununla karşılaştırılır. */\n const baseline = shallowRef<ViewState | null>(null)\n /** Kaydedilmemiş çalışma kopyaları (görünüm başına); sayfa yenilenince gider. */\n const drafts = reactive(new Map<string, ViewState>())\n const edited = computed(() => !!active.value && !!baseline.value && !sameState(o.current(), baseline.value))\n let touched = false\n\n const activate = (id: string, keepDraft = true) => {\n const view = all.value.find((v) => v.id === id)\n if (!view) return\n const prev = active.value\n if (prev) {\n if (keepDraft && edited.value) drafts.set(prev.id, o.current())\n else drafts.delete(prev.id)\n }\n activeId.value = id\n o.apply(view.state)\n baseline.value = o.current()\n const draft = drafts.get(id)\n if (draft) o.apply(draft)\n o.onChange(view)\n }\n\n const initial = defaultView(all.value, o.defaultViewId())\n if (initial) activate(initial.id)\n const listed = o.adapter\n ? o.adapter\n .list(o.tableId())\n .then((vs) => {\n saved.value = vs\n })\n .catch(() => {})\n : Promise.resolve()\n // Kullanıcı varsayılanı kişisel bir görünüm olabilir: liste ve tercih gelince, dokunulmadıysa ona geçilir.\n void Promise.all([listed, o.prefsReady]).then(() => {\n if (touched || edited.value) return\n const v = defaultView(all.value, o.defaultViewId())\n if (v && v.id !== activeId.value) activate(v.id)\n })\n\n const replace = (next: View) => (saved.value = saved.value.map((v) => (v.id === next.id ? next : v)))\n const writable = (v: View | null) => !!v && !!o.adapter && v.kind !== 'system'\n\n return {\n all,\n sections,\n active,\n edited,\n hasViews: computed(() => all.value.length > 0),\n hasDraft: (id: string) => drafts.has(id),\n writable,\n select: (id: string) => {\n touched = true\n activate(id)\n },\n saveChanges: async () => {\n const v = active.value\n if (!writable(v) || !o.adapter) return\n replace(await o.adapter.update(o.tableId(), v!.id, { state: o.current() }))\n baseline.value = o.current()\n drafts.delete(v!.id)\n },\n discard: () => {\n const v = active.value\n if (!v) return\n o.apply(v.state)\n baseline.value = o.current()\n drafts.delete(v.id)\n },\n /** Save as new view / New view / Duplicate; kayıt sonrası yeni görünüm aktif. `fromCurrent`: mevcut düzenleme yeni görünüme taşındı. */\n create: async (input: { name: string; state: ViewState; makeDefault: boolean; fromCurrent: boolean }) => {\n if (!o.adapter) return\n const v = await o.adapter.create(o.tableId(), { name: input.name, state: input.state })\n saved.value = [...saved.value, v]\n if (input.makeDefault) o.setDefaultViewId(v.id)\n touched = true\n activate(v.id, !input.fromCurrent)\n },\n rename: async (id: string, name: string) => {\n if (o.adapter) replace(await o.adapter.update(o.tableId(), id, { name }))\n },\n /** Onay sonrası hemen `remove`; aktif silinirse varsayılana, varsayılan silinirse system default'a (04 §7). */\n remove: async (id: string) => {\n if (!o.adapter) return\n await o.adapter.remove(o.tableId(), id)\n saved.value = saved.value.filter((v) => v.id !== id)\n drafts.delete(id)\n if (o.defaultViewId() === id) o.setDefaultViewId(null)\n if (activeId.value === id) {\n activeId.value = null\n baseline.value = null\n const d = defaultView(all.value, o.defaultViewId())\n if (d) activate(d.id)\n else o.apply({})\n }\n },\n }\n}\n","<script setup lang=\"ts\">\n// Save as new view (04 §7, handoff 03 §4.2, T3-04) ve Rename: Name (odaklı; Duplicate'ten \"{ad} copy\" seçili), özet,\n// Make this my default view. Enter kaydeder; hata alanın altında.\nimport {\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogOverlay,\n DialogPortal,\n DialogRoot,\n DialogTitle,\n} from 'reka-ui'\nimport { ref, watch } from 'vue'\nimport { useDataTableContext } from '../plugin'\nimport type { NameError } from './model'\n\nconst props = defineProps<{\n mode: 'create' | 'rename'\n name: string\n /** Yalnızca create: Filters / Sort / Columns satırları. */\n summary: { filters: string; sort: string; columns: string } | null\n validate: (name: string) => NameError | null\n}>()\nconst emit = defineEmits<{ save: [input: { name: string; makeDefault: boolean }] }>()\nconst open = defineModel<boolean>('open', { default: false })\nconst { i18n } = useDataTableContext()\n\nconst name = ref(props.name)\nconst makeDefault = ref(false)\nconst error = ref<NameError | null>(null)\nconst input = ref<HTMLInputElement | null>(null)\nwatch(open, (o) => {\n if (!o) return\n name.value = props.name\n makeDefault.value = false\n error.value = null\n})\nconst focusName = (e: Event) => {\n e.preventDefault()\n input.value?.focus()\n input.value?.select()\n}\nconst submit = () => {\n error.value = props.validate(name.value)\n if (error.value) return\n emit('save', { name: name.value.trim(), makeDefault: makeDefault.value })\n open.value = false\n}\n</script>\n\n<template>\n <DialogRoot v-model:open=\"open\">\n <DialogPortal>\n <DialogOverlay class=\"dt-scrim\" />\n <DialogContent class=\"dt-dialog dt-view-dialog\" @open-auto-focus=\"focusName\">\n <form @submit.prevent=\"submit\">\n <DialogTitle class=\"dt-dialog-title\">\n {{ i18n.t(mode === 'rename' ? 'views.rename' : 'views.dialogTitle') }}\n </DialogTitle>\n <DialogDescription v-if=\"mode === 'create'\" class=\"dt-dialog-body\">\n {{ i18n.t('views.dialogBody') }}\n </DialogDescription>\n <label class=\"dt-field\">\n <span class=\"dt-field-label\">{{ i18n.t('views.name') }}</span>\n <span class=\"dt-input\">\n <input ref=\"input\" v-model=\"name\" type=\"text\" :aria-invalid=\"error ? 'true' : undefined\" />\n </span>\n <span v-if=\"error\" class=\"dt-field-error\" role=\"alert\">{{ i18n.t(`views.err.${error}`) }}</span>\n </label>\n <div v-if=\"summary\" class=\"dt-view-summary\">\n <span>{{ i18n.t('views.filters') }}</span>\n <span>{{ summary.filters }}</span>\n <span>{{ i18n.t('views.sort') }}</span>\n <span>{{ summary.sort }}</span>\n <span>{{ i18n.t('views.columns') }}</span>\n <span>{{ summary.columns }}</span>\n </div>\n <template v-if=\"mode === 'create'\">\n <label class=\"dt-check-row\">\n <input v-model=\"makeDefault\" type=\"checkbox\" class=\"dt-checkbox\" />\n {{ i18n.t('views.makeDefault') }}\n </label>\n </template>\n <div class=\"dt-dialog-actions\">\n <DialogClose as-child>\n <button type=\"button\" class=\"dt-btn\">{{ i18n.t('common.cancel') }}</button>\n </DialogClose>\n <button type=\"submit\" class=\"dt-btn dt-btn-primary\">\n {{ i18n.t(mode === 'rename' ? 'common.save' : 'views.save') }}\n </button>\n </div>\n </form>\n </DialogContent>\n </DialogPortal>\n </DialogRoot>\n</template>\n","<script setup lang=\"ts\">\n// Save as new view (04 §7, handoff 03 §4.2, T3-04) ve Rename: Name (odaklı; Duplicate'ten \"{ad} copy\" seçili), özet,\n// Make this my default view. Enter kaydeder; hata alanın altında.\nimport {\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogOverlay,\n DialogPortal,\n DialogRoot,\n DialogTitle,\n} from 'reka-ui'\nimport { ref, watch } from 'vue'\nimport { useDataTableContext } from '../plugin'\nimport type { NameError } from './model'\n\nconst props = defineProps<{\n mode: 'create' | 'rename'\n name: string\n /** Yalnızca create: Filters / Sort / Columns satırları. */\n summary: { filters: string; sort: string; columns: string } | null\n validate: (name: string) => NameError | null\n}>()\nconst emit = defineEmits<{ save: [input: { name: string; makeDefault: boolean }] }>()\nconst open = defineModel<boolean>('open', { default: false })\nconst { i18n } = useDataTableContext()\n\nconst name = ref(props.name)\nconst makeDefault = ref(false)\nconst error = ref<NameError | null>(null)\nconst input = ref<HTMLInputElement | null>(null)\nwatch(open, (o) => {\n if (!o) return\n name.value = props.name\n makeDefault.value = false\n error.value = null\n})\nconst focusName = (e: Event) => {\n e.preventDefault()\n input.value?.focus()\n input.value?.select()\n}\nconst submit = () => {\n error.value = props.validate(name.value)\n if (error.value) return\n emit('save', { name: name.value.trim(), makeDefault: makeDefault.value })\n open.value = false\n}\n</script>\n\n<template>\n <DialogRoot v-model:open=\"open\">\n <DialogPortal>\n <DialogOverlay class=\"dt-scrim\" />\n <DialogContent class=\"dt-dialog dt-view-dialog\" @open-auto-focus=\"focusName\">\n <form @submit.prevent=\"submit\">\n <DialogTitle class=\"dt-dialog-title\">\n {{ i18n.t(mode === 'rename' ? 'views.rename' : 'views.dialogTitle') }}\n </DialogTitle>\n <DialogDescription v-if=\"mode === 'create'\" class=\"dt-dialog-body\">\n {{ i18n.t('views.dialogBody') }}\n </DialogDescription>\n <label class=\"dt-field\">\n <span class=\"dt-field-label\">{{ i18n.t('views.name') }}</span>\n <span class=\"dt-input\">\n <input ref=\"input\" v-model=\"name\" type=\"text\" :aria-invalid=\"error ? 'true' : undefined\" />\n </span>\n <span v-if=\"error\" class=\"dt-field-error\" role=\"alert\">{{ i18n.t(`views.err.${error}`) }}</span>\n </label>\n <div v-if=\"summary\" class=\"dt-view-summary\">\n <span>{{ i18n.t('views.filters') }}</span>\n <span>{{ summary.filters }}</span>\n <span>{{ i18n.t('views.sort') }}</span>\n <span>{{ summary.sort }}</span>\n <span>{{ i18n.t('views.columns') }}</span>\n <span>{{ summary.columns }}</span>\n </div>\n <template v-if=\"mode === 'create'\">\n <label class=\"dt-check-row\">\n <input v-model=\"makeDefault\" type=\"checkbox\" class=\"dt-checkbox\" />\n {{ i18n.t('views.makeDefault') }}\n </label>\n </template>\n <div class=\"dt-dialog-actions\">\n <DialogClose as-child>\n <button type=\"button\" class=\"dt-btn\">{{ i18n.t('common.cancel') }}</button>\n </DialogClose>\n <button type=\"submit\" class=\"dt-btn dt-btn-primary\">\n {{ i18n.t(mode === 'rename' ? 'common.save' : 'views.save') }}\n </button>\n </div>\n </form>\n </DialogContent>\n </DialogPortal>\n </DialogRoot>\n</template>\n","<script setup lang=\"ts\">\n// Görünüm seçici + menüsü (04 §7, handoff 03 §4.1, T3-01/02/03): üstte kaydetme bölümü (yalnızca düzenlenmişse, D27),\n// Find a view…, System / My views bölümleri (D30: paylaşım yok), satır ⋯ menüsü, altta New view. Kısayol `V` DataTable'da.\nimport { PhCaretDown, PhCheck, PhDotsThree, PhMagnifyingGlass, PhPlus } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n ListboxContent,\n ListboxFilter,\n ListboxGroup,\n ListboxGroupLabel,\n ListboxItem,\n ListboxRoot,\n} from 'reka-ui'\nimport { computed, ref, watch } from 'vue'\nimport type { View } from '../../types/views'\nimport { SAVE_KBD } from '../interaction/kbd'\nimport { useDataTableContext } from '../plugin'\nimport Layer from '../ui/Layer.vue'\n\nconst props = defineProps<{\n sections: { system: View[]; personal: View[] }\n active: View | null\n edited: boolean\n hasDraft: (id: string) => boolean\n defaultId: string | null\n /** Adapter var: kaydetme, New view, Duplicate. */\n canSave: boolean\n /** Aktif görünüm üzerine yazılabilir (personal). */\n canWrite: boolean\n /** Telefon: popover yerine alt sayfa (T13-06). */\n sheet?: boolean\n}>()\nconst emit = defineEmits<{\n select: [id: string]\n 'save-changes': []\n 'save-as': []\n discard: []\n new: []\n rename: [view: View]\n duplicate: [view: View]\n 'set-default': [id: string]\n delete: [view: View]\n}>()\nconst open = defineModel<boolean>('open', { default: false })\nconst { i18n } = useDataTableContext()\nconst q = ref('')\nwatch(open, (o) => {\n if (!o) q.value = ''\n})\n\nconst label = computed(() => {\n const name = props.active?.name ?? i18n.t('views.title')\n return i18n.t(props.edited ? 'sr.viewEdited' : 'sr.view', { name })\n})\nconst match = (v: View) => !q.value || v.name.toLocaleLowerCase().includes(q.value.toLocaleLowerCase())\nconst groups = computed(() =>\n (\n [\n ['system', 'views.system', 'views.builtIn'],\n ['personal', 'views.mine', 'views.onlyYou'],\n ] as const\n )\n .map(([key, title, hint]) => ({ key, title, hint, views: props.sections[key].filter(match) }))\n .filter((g) => g.views.length),\n)\nconst isEdited = (v: View) => (v.id === props.active?.id ? props.edited : props.hasDraft(v.id))\nconst canEdit = (v: View) => props.canSave && v.kind !== 'system'\n\n/** Dialog açan eylemler popover kapandıktan sonra: kapanış odağı tetikleyiciye dönerken dialog'u kapatmasın. */\nconst after = (fn: () => void) => {\n open.value = false\n setTimeout(fn, 0)\n}\nconst pick = (id: unknown) => {\n if (typeof id !== 'string') return\n open.value = false\n emit('select', id)\n}\n</script>\n\n<template>\n <Layer\n v-model:open=\"open\"\n :sheet=\"sheet\"\n :title=\"i18n.t('views.title')\"\n hide-title\n content-class=\"dt-views\"\n align=\"start\"\n >\n <template #trigger>\n <button type=\"button\" class=\"dt-btn dt-btn-ghost has-icon dt-view-trigger\" :aria-label=\"label\">\n <span class=\"dt-view-name\">{{ active?.name ?? i18n.t('views.title') }}</span>\n <template v-if=\"edited\">\n <span class=\"dt-view-dot\" aria-hidden=\"true\" />\n <span class=\"dt-view-edited\">{{ i18n.t('views.edited') }}</span>\n </template>\n <PhCaretDown :size=\"14\" aria-hidden=\"true\" />\n </button>\n </template>\n <template v-if=\"edited && active\">\n <div class=\"dt-pop-label\">{{ i18n.t('views.editedName', { name: active.name }) }}</div>\n <template v-if=\"canWrite\">\n <button type=\"button\" class=\"dt-pop-item dt-view-action\" @click=\"after(() => emit('save-changes'))\">\n <span class=\"dt-view-action-main\">\n {{ i18n.t('views.saveChanges') }}\n <kbd class=\"dt-kbd\">{{ SAVE_KBD }}</kbd>\n </span>\n <span class=\"dt-view-action-sub\">{{ i18n.t('views.updates', { name: active.name }) }}</span>\n </button>\n <button type=\"button\" class=\"dt-pop-item dt-view-action\" @click=\"after(() => emit('save-as'))\">\n <span class=\"dt-view-action-main\">{{ i18n.t('views.saveAsNew') }}</span>\n <span class=\"dt-view-action-sub\">{{ i18n.t('views.keepsUnchanged', { name: active.name }) }}</span>\n </button>\n </template>\n <button\n v-else-if=\"canSave\"\n type=\"button\"\n class=\"dt-pop-item dt-view-action is-single\"\n @click=\"after(() => emit('save-as'))\"\n >\n <span class=\"dt-view-action-main\">\n {{ i18n.t('views.saveAsMine') }}\n <kbd class=\"dt-kbd\">{{ SAVE_KBD }}</kbd>\n </span>\n </button>\n <button type=\"button\" class=\"dt-pop-item dt-view-action is-single\" @click=\"after(() => emit('discard'))\">\n <span class=\"dt-view-action-main\">{{ i18n.t('views.discard') }}</span>\n </button>\n <div class=\"dt-pop-sep\" />\n </template>\n <ListboxRoot :model-value=\"active?.id\" selection-behavior=\"replace\" highlight-on-hover @update:model-value=\"pick\">\n <label class=\"dt-input has-icon dt-picker-search\">\n <span class=\"dt-input-icon\"><PhMagnifyingGlass :size=\"14\" aria-hidden=\"true\" /></span>\n <ListboxFilter v-model=\"q\" auto-focus :placeholder=\"i18n.t('views.find')\" :aria-label=\"i18n.t('views.find')\" />\n </label>\n <ListboxContent class=\"dt-views-list\">\n <ListboxGroup v-for=\"g in groups\" :key=\"g.key\">\n <ListboxGroupLabel class=\"dt-pop-label\">\n {{ i18n.t(g.title) }}\n <span>{{ i18n.t(g.hint) }}</span>\n </ListboxGroupLabel>\n <div v-for=\"v in g.views\" :key=\"v.id\" class=\"dt-view-row\" :class=\"{ 'is-active': v.id === active?.id }\">\n <ListboxItem :value=\"v.id\" class=\"dt-view-item\">\n <PhCheck v-if=\"sheet && v.id === active?.id\" :size=\"18\" class=\"dt-view-check\" aria-hidden=\"true\" />\n <span class=\"dt-view-row-name\">{{ v.name }}</span>\n <template v-if=\"isEdited(v)\">\n <span class=\"dt-view-dot\" aria-hidden=\"true\" />\n <span class=\"dt-view-edited\">{{ i18n.t('views.edited') }}</span>\n </template>\n <span v-if=\"v.id === defaultId\" class=\"dt-view-default\">{{ i18n.t('views.default') }}</span>\n </ListboxItem>\n <DropdownMenuRoot>\n <DropdownMenuTrigger as-child>\n <!-- Enter/Space ⋯'yi açar; Listbox'a ulaşıp satırı seçmesin (klavye). -->\n <button\n type=\"button\"\n class=\"dt-icon-btn-sm dt-view-more\"\n :aria-label=\"i18n.t('common.more')\"\n @keydown.enter.space.stop\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent class=\"dt-menu dt-view-row-menu\" side=\"right\" align=\"start\" :side-offset=\"8\">\n <DropdownMenuItem v-if=\"canEdit(v)\" class=\"dt-menu-item\" @select=\"after(() => emit('rename', v))\">\n {{ i18n.t('views.rename') }}\n </DropdownMenuItem>\n <DropdownMenuItem v-if=\"canSave\" class=\"dt-menu-item\" @select=\"after(() => emit('duplicate', v))\">\n {{ i18n.t('views.duplicate') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"emit('set-default', v.id)\">\n {{ i18n.t('views.setDefault') }}\n </DropdownMenuItem>\n <template v-if=\"canEdit(v)\">\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n <DropdownMenuItem class=\"dt-menu-item is-destructive\" @select=\"after(() => emit('delete', v))\">\n {{ i18n.t('views.delete') }}\n </DropdownMenuItem>\n </template>\n <div v-if=\"v.kind === 'system'\" class=\"dt-view-note\">{{ i18n.t('views.systemNote') }}</div>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </div>\n </ListboxGroup>\n <div v-if=\"!groups.length\" class=\"dt-options-empty\">{{ i18n.t('views.noMatch') }}</div>\n </ListboxContent>\n </ListboxRoot>\n <template v-if=\"canSave\">\n <div class=\"dt-pop-sep\" />\n <button type=\"button\" class=\"dt-pop-item dt-view-new\" @click=\"after(() => emit('new'))\">\n <PhPlus :size=\"14\" aria-hidden=\"true\" />\n {{ i18n.t('views.new') }}\n </button>\n </template>\n </Layer>\n</template>\n","<script setup lang=\"ts\">\n// Görünüm seçici + menüsü (04 §7, handoff 03 §4.1, T3-01/02/03): üstte kaydetme bölümü (yalnızca düzenlenmişse, D27),\n// Find a view…, System / My views bölümleri (D30: paylaşım yok), satır ⋯ menüsü, altta New view. Kısayol `V` DataTable'da.\nimport { PhCaretDown, PhCheck, PhDotsThree, PhMagnifyingGlass, PhPlus } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n ListboxContent,\n ListboxFilter,\n ListboxGroup,\n ListboxGroupLabel,\n ListboxItem,\n ListboxRoot,\n} from 'reka-ui'\nimport { computed, ref, watch } from 'vue'\nimport type { View } from '../../types/views'\nimport { SAVE_KBD } from '../interaction/kbd'\nimport { useDataTableContext } from '../plugin'\nimport Layer from '../ui/Layer.vue'\n\nconst props = defineProps<{\n sections: { system: View[]; personal: View[] }\n active: View | null\n edited: boolean\n hasDraft: (id: string) => boolean\n defaultId: string | null\n /** Adapter var: kaydetme, New view, Duplicate. */\n canSave: boolean\n /** Aktif görünüm üzerine yazılabilir (personal). */\n canWrite: boolean\n /** Telefon: popover yerine alt sayfa (T13-06). */\n sheet?: boolean\n}>()\nconst emit = defineEmits<{\n select: [id: string]\n 'save-changes': []\n 'save-as': []\n discard: []\n new: []\n rename: [view: View]\n duplicate: [view: View]\n 'set-default': [id: string]\n delete: [view: View]\n}>()\nconst open = defineModel<boolean>('open', { default: false })\nconst { i18n } = useDataTableContext()\nconst q = ref('')\nwatch(open, (o) => {\n if (!o) q.value = ''\n})\n\nconst label = computed(() => {\n const name = props.active?.name ?? i18n.t('views.title')\n return i18n.t(props.edited ? 'sr.viewEdited' : 'sr.view', { name })\n})\nconst match = (v: View) => !q.value || v.name.toLocaleLowerCase().includes(q.value.toLocaleLowerCase())\nconst groups = computed(() =>\n (\n [\n ['system', 'views.system', 'views.builtIn'],\n ['personal', 'views.mine', 'views.onlyYou'],\n ] as const\n )\n .map(([key, title, hint]) => ({ key, title, hint, views: props.sections[key].filter(match) }))\n .filter((g) => g.views.length),\n)\nconst isEdited = (v: View) => (v.id === props.active?.id ? props.edited : props.hasDraft(v.id))\nconst canEdit = (v: View) => props.canSave && v.kind !== 'system'\n\n/** Dialog açan eylemler popover kapandıktan sonra: kapanış odağı tetikleyiciye dönerken dialog'u kapatmasın. */\nconst after = (fn: () => void) => {\n open.value = false\n setTimeout(fn, 0)\n}\nconst pick = (id: unknown) => {\n if (typeof id !== 'string') return\n open.value = false\n emit('select', id)\n}\n</script>\n\n<template>\n <Layer\n v-model:open=\"open\"\n :sheet=\"sheet\"\n :title=\"i18n.t('views.title')\"\n hide-title\n content-class=\"dt-views\"\n align=\"start\"\n >\n <template #trigger>\n <button type=\"button\" class=\"dt-btn dt-btn-ghost has-icon dt-view-trigger\" :aria-label=\"label\">\n <span class=\"dt-view-name\">{{ active?.name ?? i18n.t('views.title') }}</span>\n <template v-if=\"edited\">\n <span class=\"dt-view-dot\" aria-hidden=\"true\" />\n <span class=\"dt-view-edited\">{{ i18n.t('views.edited') }}</span>\n </template>\n <PhCaretDown :size=\"14\" aria-hidden=\"true\" />\n </button>\n </template>\n <template v-if=\"edited && active\">\n <div class=\"dt-pop-label\">{{ i18n.t('views.editedName', { name: active.name }) }}</div>\n <template v-if=\"canWrite\">\n <button type=\"button\" class=\"dt-pop-item dt-view-action\" @click=\"after(() => emit('save-changes'))\">\n <span class=\"dt-view-action-main\">\n {{ i18n.t('views.saveChanges') }}\n <kbd class=\"dt-kbd\">{{ SAVE_KBD }}</kbd>\n </span>\n <span class=\"dt-view-action-sub\">{{ i18n.t('views.updates', { name: active.name }) }}</span>\n </button>\n <button type=\"button\" class=\"dt-pop-item dt-view-action\" @click=\"after(() => emit('save-as'))\">\n <span class=\"dt-view-action-main\">{{ i18n.t('views.saveAsNew') }}</span>\n <span class=\"dt-view-action-sub\">{{ i18n.t('views.keepsUnchanged', { name: active.name }) }}</span>\n </button>\n </template>\n <button\n v-else-if=\"canSave\"\n type=\"button\"\n class=\"dt-pop-item dt-view-action is-single\"\n @click=\"after(() => emit('save-as'))\"\n >\n <span class=\"dt-view-action-main\">\n {{ i18n.t('views.saveAsMine') }}\n <kbd class=\"dt-kbd\">{{ SAVE_KBD }}</kbd>\n </span>\n </button>\n <button type=\"button\" class=\"dt-pop-item dt-view-action is-single\" @click=\"after(() => emit('discard'))\">\n <span class=\"dt-view-action-main\">{{ i18n.t('views.discard') }}</span>\n </button>\n <div class=\"dt-pop-sep\" />\n </template>\n <ListboxRoot :model-value=\"active?.id\" selection-behavior=\"replace\" highlight-on-hover @update:model-value=\"pick\">\n <label class=\"dt-input has-icon dt-picker-search\">\n <span class=\"dt-input-icon\"><PhMagnifyingGlass :size=\"14\" aria-hidden=\"true\" /></span>\n <ListboxFilter v-model=\"q\" auto-focus :placeholder=\"i18n.t('views.find')\" :aria-label=\"i18n.t('views.find')\" />\n </label>\n <ListboxContent class=\"dt-views-list\">\n <ListboxGroup v-for=\"g in groups\" :key=\"g.key\">\n <ListboxGroupLabel class=\"dt-pop-label\">\n {{ i18n.t(g.title) }}\n <span>{{ i18n.t(g.hint) }}</span>\n </ListboxGroupLabel>\n <div v-for=\"v in g.views\" :key=\"v.id\" class=\"dt-view-row\" :class=\"{ 'is-active': v.id === active?.id }\">\n <ListboxItem :value=\"v.id\" class=\"dt-view-item\">\n <PhCheck v-if=\"sheet && v.id === active?.id\" :size=\"18\" class=\"dt-view-check\" aria-hidden=\"true\" />\n <span class=\"dt-view-row-name\">{{ v.name }}</span>\n <template v-if=\"isEdited(v)\">\n <span class=\"dt-view-dot\" aria-hidden=\"true\" />\n <span class=\"dt-view-edited\">{{ i18n.t('views.edited') }}</span>\n </template>\n <span v-if=\"v.id === defaultId\" class=\"dt-view-default\">{{ i18n.t('views.default') }}</span>\n </ListboxItem>\n <DropdownMenuRoot>\n <DropdownMenuTrigger as-child>\n <!-- Enter/Space ⋯'yi açar; Listbox'a ulaşıp satırı seçmesin (klavye). -->\n <button\n type=\"button\"\n class=\"dt-icon-btn-sm dt-view-more\"\n :aria-label=\"i18n.t('common.more')\"\n @keydown.enter.space.stop\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent class=\"dt-menu dt-view-row-menu\" side=\"right\" align=\"start\" :side-offset=\"8\">\n <DropdownMenuItem v-if=\"canEdit(v)\" class=\"dt-menu-item\" @select=\"after(() => emit('rename', v))\">\n {{ i18n.t('views.rename') }}\n </DropdownMenuItem>\n <DropdownMenuItem v-if=\"canSave\" class=\"dt-menu-item\" @select=\"after(() => emit('duplicate', v))\">\n {{ i18n.t('views.duplicate') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"emit('set-default', v.id)\">\n {{ i18n.t('views.setDefault') }}\n </DropdownMenuItem>\n <template v-if=\"canEdit(v)\">\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n <DropdownMenuItem class=\"dt-menu-item is-destructive\" @select=\"after(() => emit('delete', v))\">\n {{ i18n.t('views.delete') }}\n </DropdownMenuItem>\n </template>\n <div v-if=\"v.kind === 'system'\" class=\"dt-view-note\">{{ i18n.t('views.systemNote') }}</div>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </div>\n </ListboxGroup>\n <div v-if=\"!groups.length\" class=\"dt-options-empty\">{{ i18n.t('views.noMatch') }}</div>\n </ListboxContent>\n </ListboxRoot>\n <template v-if=\"canSave\">\n <div class=\"dt-pop-sep\" />\n <button type=\"button\" class=\"dt-pop-item dt-view-new\" @click=\"after(() => emit('new'))\">\n <PhPlus :size=\"14\" aria-hidden=\"true\" />\n {{ i18n.t('views.new') }}\n </button>\n </template>\n </Layer>\n</template>\n","<script setup lang=\"ts\" generic=\"Row extends object\">\n// Bulk bar (05 §6, handoff 03 §7, T5-01/03/04): [sayaç] │ aksiyonlar (en fazla 3 `inBar`) │ ⋯ (kalanlar, yıkıcı en altta) │ ×.\n// Yüzer (varsayılan: kartın altında ortada, 64 px, düzeni kaydırmaz) ya da toolbar'ın yerine. `run(rows)` beklenmez (D20).\nimport { PhDotsThree, PhX } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from 'reka-ui'\nimport { computed, ref } from 'vue'\nimport type { BulkAction } from '../types/list'\nimport { useDataTableContext } from '../core/plugin'\nimport Layer from '../core/ui/Layer.vue'\n\nconst props = defineProps<{\n rows: Row[]\n actions: Array<BulkAction<Row>>\n variant: 'floating' | 'toolbar'\n /** Telefon (handoff 04 §7): en çok 2 aksiyon + More alt sayfası; ikon üstte, etiket altta. */\n phone?: boolean\n}>()\nconst emit = defineEmits<{ clear: [] }>()\ndefineSlots<{ default?: () => unknown }>()\nconst { i18n } = useDataTableContext()\n\n/** `when(rows)` false olan ne bar'da ne menüde (D36). */\nconst shown = computed(() => props.actions.filter((a) => !a.when || a.when(props.rows)))\nconst inBar = computed(() => shown.value.filter((a) => a.inBar).slice(0, props.phone ? 2 : 3))\n/** ⋯ menüsü: bar'da olmayanlar; yıkıcılar en altta, ayırıcıdan sonra. */\nconst rest = computed(() => {\n const bar = new Set(inBar.value)\n const others = shown.value.filter((a) => !bar.has(a))\n return [...others.filter((a) => !a.destructive), ...others.filter((a) => a.destructive)]\n})\nconst firstDestructive = computed(() => rest.value.findIndex((a) => a.destructive))\nconst disabledOf = (a: BulkAction<Row>): boolean | string => a.disabled?.(props.rows) ?? false\n/** Tooltip / ikinci satır: `disabled` gerekçesi varsa o, yoksa `description` (D36). */\nconst tipOf = (a: BulkAction<Row>): string | undefined => {\n const d = disabledOf(a)\n return typeof d === 'string' ? d : a.description\n}\nconst moreOpen = ref(false)\nconst run = (a: BulkAction<Row>) => {\n if (disabledOf(a)) return\n moreOpen.value = false\n void a.run(props.rows)\n}\nconst btn = computed(() => (props.variant === 'toolbar' ? 'dt-btn has-icon' : 'dt-bulk-btn'))\n</script>\n\n<template>\n <div\n class=\"dt-bulk\"\n :class=\"[`is-${variant}`, { 'is-phone': phone }]\"\n role=\"toolbar\"\n :aria-label=\"i18n.t('bulk.aria')\"\n >\n <button\n v-if=\"variant === 'toolbar'\"\n type=\"button\"\n class=\"dt-btn dt-btn-icon\"\n :aria-label=\"i18n.t('selection.clear')\"\n :data-dt-tip=\"i18n.t('selection.clear')\"\n @click=\"emit('clear')\"\n >\n <PhX :size=\"16\" aria-hidden=\"true\" />\n </button>\n <span class=\"dt-bulk-count\" role=\"status\">{{ i18n.t('selection.selected', { count: rows.length }) }}</span>\n <span class=\"dt-bulk-sep\" aria-hidden=\"true\" />\n <slot>\n <button\n v-for=\"a in inBar\"\n :key=\"a.id\"\n type=\"button\"\n :class=\"[btn, { 'is-destructive': a.destructive }]\"\n :disabled=\"!!disabledOf(a)\"\n :data-dt-tip=\"tipOf(a)\"\n @click=\"run(a)\"\n >\n <component :is=\"a.icon\" v-if=\"a.icon\" :size=\"phone ? 18 : 16\" aria-hidden=\"true\" />\n <span>{{ a.label }}</span>\n </button>\n <Layer v-if=\"rest.length && phone\" v-model:open=\"moreOpen\" sheet hide-title :title=\"i18n.t('bulk.moreAria')\">\n <template #trigger>\n <button type=\"button\" class=\"dt-bulk-btn dt-bulk-more\" :aria-label=\"i18n.t('bulk.moreAria')\">\n <PhDotsThree :size=\"18\" weight=\"bold\" aria-hidden=\"true\" />\n <span>{{ i18n.t('common.more') }}</span>\n </button>\n </template>\n <div class=\"dt-bsheet-label\">{{ i18n.t('selection.selected', { count: rows.length }) }}</div>\n <template v-for=\"(a, i) in rest\" :key=\"a.id\">\n <div v-if=\"i === firstDestructive\" class=\"dt-bsheet-sep\" />\n <button\n type=\"button\"\n class=\"dt-bsheet-row\"\n :class=\"{ 'is-destructive': a.destructive }\"\n :disabled=\"!!disabledOf(a)\"\n @click=\"run(a)\"\n >\n <span class=\"dt-menu-text\">\n <span>{{ a.label }}</span>\n <span v-if=\"tipOf(a)\" class=\"dt-menu-sub\">{{ tipOf(a) }}</span>\n </span>\n </button>\n </template>\n </Layer>\n <DropdownMenuRoot v-else-if=\"rest.length\">\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n :class=\"[btn, 'dt-bulk-more', { 'dt-btn-icon': variant === 'toolbar' }]\"\n :aria-label=\"i18n.t('bulk.moreAria')\"\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n class=\"dt-menu dt-bulk-menu\"\n :side=\"variant === 'floating' ? 'top' : 'bottom'\"\n align=\"start\"\n :side-offset=\"variant === 'floating' ? 12 : 4\"\n >\n <template v-for=\"(a, i) in rest\" :key=\"a.id\">\n <DropdownMenuSeparator v-if=\"i === firstDestructive\" class=\"dt-menu-sep\" />\n <DropdownMenuItem\n class=\"dt-menu-item\"\n :class=\"{ 'is-destructive': a.destructive, 'is-two-line': tipOf(a) }\"\n :disabled=\"!!disabledOf(a)\"\n @select=\"run(a)\"\n >\n <span class=\"dt-menu-text\">\n <span>{{ a.label }}</span>\n <span v-if=\"tipOf(a)\" class=\"dt-menu-sub\">{{ tipOf(a) }}</span>\n </span>\n </DropdownMenuItem>\n </template>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </slot>\n <template v-if=\"variant === 'floating'\">\n <span class=\"dt-bulk-sep\" aria-hidden=\"true\" />\n <button\n type=\"button\"\n class=\"dt-bulk-btn dt-bulk-icon\"\n :aria-label=\"i18n.t('selection.clear')\"\n :data-dt-tip=\"i18n.t('selection.clear')\"\n @click=\"emit('clear')\"\n >\n <PhX :size=\"16\" aria-hidden=\"true\" />\n </button>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"Row extends object\">\n// Bulk bar (05 §6, handoff 03 §7, T5-01/03/04): [sayaç] │ aksiyonlar (en fazla 3 `inBar`) │ ⋯ (kalanlar, yıkıcı en altta) │ ×.\n// Yüzer (varsayılan: kartın altında ortada, 64 px, düzeni kaydırmaz) ya da toolbar'ın yerine. `run(rows)` beklenmez (D20).\nimport { PhDotsThree, PhX } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from 'reka-ui'\nimport { computed, ref } from 'vue'\nimport type { BulkAction } from '../types/list'\nimport { useDataTableContext } from '../core/plugin'\nimport Layer from '../core/ui/Layer.vue'\n\nconst props = defineProps<{\n rows: Row[]\n actions: Array<BulkAction<Row>>\n variant: 'floating' | 'toolbar'\n /** Telefon (handoff 04 §7): en çok 2 aksiyon + More alt sayfası; ikon üstte, etiket altta. */\n phone?: boolean\n}>()\nconst emit = defineEmits<{ clear: [] }>()\ndefineSlots<{ default?: () => unknown }>()\nconst { i18n } = useDataTableContext()\n\n/** `when(rows)` false olan ne bar'da ne menüde (D36). */\nconst shown = computed(() => props.actions.filter((a) => !a.when || a.when(props.rows)))\nconst inBar = computed(() => shown.value.filter((a) => a.inBar).slice(0, props.phone ? 2 : 3))\n/** ⋯ menüsü: bar'da olmayanlar; yıkıcılar en altta, ayırıcıdan sonra. */\nconst rest = computed(() => {\n const bar = new Set(inBar.value)\n const others = shown.value.filter((a) => !bar.has(a))\n return [...others.filter((a) => !a.destructive), ...others.filter((a) => a.destructive)]\n})\nconst firstDestructive = computed(() => rest.value.findIndex((a) => a.destructive))\nconst disabledOf = (a: BulkAction<Row>): boolean | string => a.disabled?.(props.rows) ?? false\n/** Tooltip / ikinci satır: `disabled` gerekçesi varsa o, yoksa `description` (D36). */\nconst tipOf = (a: BulkAction<Row>): string | undefined => {\n const d = disabledOf(a)\n return typeof d === 'string' ? d : a.description\n}\nconst moreOpen = ref(false)\nconst run = (a: BulkAction<Row>) => {\n if (disabledOf(a)) return\n moreOpen.value = false\n void a.run(props.rows)\n}\nconst btn = computed(() => (props.variant === 'toolbar' ? 'dt-btn has-icon' : 'dt-bulk-btn'))\n</script>\n\n<template>\n <div\n class=\"dt-bulk\"\n :class=\"[`is-${variant}`, { 'is-phone': phone }]\"\n role=\"toolbar\"\n :aria-label=\"i18n.t('bulk.aria')\"\n >\n <button\n v-if=\"variant === 'toolbar'\"\n type=\"button\"\n class=\"dt-btn dt-btn-icon\"\n :aria-label=\"i18n.t('selection.clear')\"\n :data-dt-tip=\"i18n.t('selection.clear')\"\n @click=\"emit('clear')\"\n >\n <PhX :size=\"16\" aria-hidden=\"true\" />\n </button>\n <span class=\"dt-bulk-count\" role=\"status\">{{ i18n.t('selection.selected', { count: rows.length }) }}</span>\n <span class=\"dt-bulk-sep\" aria-hidden=\"true\" />\n <slot>\n <button\n v-for=\"a in inBar\"\n :key=\"a.id\"\n type=\"button\"\n :class=\"[btn, { 'is-destructive': a.destructive }]\"\n :disabled=\"!!disabledOf(a)\"\n :data-dt-tip=\"tipOf(a)\"\n @click=\"run(a)\"\n >\n <component :is=\"a.icon\" v-if=\"a.icon\" :size=\"phone ? 18 : 16\" aria-hidden=\"true\" />\n <span>{{ a.label }}</span>\n </button>\n <Layer v-if=\"rest.length && phone\" v-model:open=\"moreOpen\" sheet hide-title :title=\"i18n.t('bulk.moreAria')\">\n <template #trigger>\n <button type=\"button\" class=\"dt-bulk-btn dt-bulk-more\" :aria-label=\"i18n.t('bulk.moreAria')\">\n <PhDotsThree :size=\"18\" weight=\"bold\" aria-hidden=\"true\" />\n <span>{{ i18n.t('common.more') }}</span>\n </button>\n </template>\n <div class=\"dt-bsheet-label\">{{ i18n.t('selection.selected', { count: rows.length }) }}</div>\n <template v-for=\"(a, i) in rest\" :key=\"a.id\">\n <div v-if=\"i === firstDestructive\" class=\"dt-bsheet-sep\" />\n <button\n type=\"button\"\n class=\"dt-bsheet-row\"\n :class=\"{ 'is-destructive': a.destructive }\"\n :disabled=\"!!disabledOf(a)\"\n @click=\"run(a)\"\n >\n <span class=\"dt-menu-text\">\n <span>{{ a.label }}</span>\n <span v-if=\"tipOf(a)\" class=\"dt-menu-sub\">{{ tipOf(a) }}</span>\n </span>\n </button>\n </template>\n </Layer>\n <DropdownMenuRoot v-else-if=\"rest.length\">\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n :class=\"[btn, 'dt-bulk-more', { 'dt-btn-icon': variant === 'toolbar' }]\"\n :aria-label=\"i18n.t('bulk.moreAria')\"\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n class=\"dt-menu dt-bulk-menu\"\n :side=\"variant === 'floating' ? 'top' : 'bottom'\"\n align=\"start\"\n :side-offset=\"variant === 'floating' ? 12 : 4\"\n >\n <template v-for=\"(a, i) in rest\" :key=\"a.id\">\n <DropdownMenuSeparator v-if=\"i === firstDestructive\" class=\"dt-menu-sep\" />\n <DropdownMenuItem\n class=\"dt-menu-item\"\n :class=\"{ 'is-destructive': a.destructive, 'is-two-line': tipOf(a) }\"\n :disabled=\"!!disabledOf(a)\"\n @select=\"run(a)\"\n >\n <span class=\"dt-menu-text\">\n <span>{{ a.label }}</span>\n <span v-if=\"tipOf(a)\" class=\"dt-menu-sub\">{{ tipOf(a) }}</span>\n </span>\n </DropdownMenuItem>\n </template>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </slot>\n <template v-if=\"variant === 'floating'\">\n <span class=\"dt-bulk-sep\" aria-hidden=\"true\" />\n <button\n type=\"button\"\n class=\"dt-bulk-btn dt-bulk-icon\"\n :aria-label=\"i18n.t('selection.clear')\"\n :data-dt-tip=\"i18n.t('selection.clear')\"\n @click=\"emit('clear')\"\n >\n <PhX :size=\"16\" aria-hidden=\"true\" />\n </button>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Footer (05 §8, brief §6.13, T9-12): yalnızca snapshot'tan okur; simple sayfalama (D7); tazelik bilgisi burada.\nimport { PhArrowClockwise, PhCaretDown, PhCaretLeft, PhCaretRight, PhCircleNotch } from '@phosphor-icons/vue'\nimport { computed } from 'vue'\nimport { getFormat } from '../../core/format'\nimport { useDataTableContext } from '../../core/plugin'\n\nconst props = defineProps<{\n /** Snapshot'taki satır sayısı ve sayfa (1 tabanlı). */\n rowCount: number\n page: { number: number; size: number }\n hasMore: boolean\n /** Biliniyorsa toplam (istemci modunda hep; sunucuda Count total sonrası). */\n total?: number\n /** Sunucu modu: footer'da Count total düğmesi; sonuç \"counted 09:42\" eki alır. */\n countable: boolean\n counting: boolean\n countedAt: Date | null\n /** `page` / `query` talebi sürüyor: sayfalama kilitli. */\n busy: boolean\n /** İlk yükleme: \"Loading…\". */\n firstLoad: boolean\n /** Gövde Empty (filtre/arama yok) mu: \"No rows\" / \"0 rows\". */\n empty: boolean\n pageSizes: number[]\n updatedAt: Date | null\n freshness: 'normal' | 'refreshing' | 'stale' | 'live'\n canRefresh: boolean\n /** Telefon (handoff 04 §5): sayfa boyutu ve tazelik yok; 44 px Önceki / Sonraki. */\n phone?: boolean\n}>()\nconst emit = defineEmits<{ count: []; page: [number: number]; 'page-size': [size: number]; refresh: [] }>()\nconst { i18n, locale } = useDataTableContext()\nconst fmt = getFormat(locale)\n\nconst from = computed(() => (props.page.number - 1) * props.page.size + 1)\nconst to = computed(() => from.value + props.rowCount - 1)\nconst lastPage = computed(() => !props.hasMore)\nconst single = computed(() => props.page.number === 1 && lastPage.value)\nconst time = (d: Date) => d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' })\n\nconst canPrev = computed(() => props.page.number > 1 && !props.busy)\nconst canNext = computed(() => props.hasMore && !props.busy)\nconst updatedText = computed(() => {\n if (!props.updatedAt) return ''\n const ago = Date.now() - props.updatedAt.getTime()\n return ago < 60_000\n ? i18n.t('toolbar.updatedJustNow')\n : i18n.t('toolbar.updatedAgo', { time: fmt.relative(props.updatedAt, new Date(), 'short') })\n})\n</script>\n\n<template>\n <div class=\"dt-footer\" role=\"navigation\" :aria-label=\"i18n.t('page.nav')\">\n <div class=\"dt-footer-left\">\n <span v-if=\"firstLoad\" class=\"dt-footer-muted\">{{ i18n.t('common.loading') }}</span>\n <span v-else-if=\"rowCount === 0\" class=\"dt-footer-rows\">{{ i18n.t(empty ? 'page.none' : 'page.zero') }}</span>\n <template v-else>\n <span class=\"dt-footer-rows\">{{ i18n.t('page.rows', { from: fmt.int(from), to: fmt.int(to) }) }}</span>\n <template v-if=\"total !== undefined && !single\">\n <span class=\"dt-footer-of\">{{ i18n.t('page.of', { total: fmt.int(total) }) }}</span>\n <span v-if=\"countedAt\" class=\"dt-footer-muted\">\n · {{ i18n.t('page.counted', { time: time(countedAt) }) }}\n </span>\n </template>\n <span v-else-if=\"counting\" class=\"dt-footer-muted\">\n {{ i18n.t('page.of', { total: '' }) }}\n <PhCircleNotch :size=\"12\" class=\"dt-spin\" aria-hidden=\"true\" />\n {{ i18n.t('page.counting') }}\n </span>\n <span v-else-if=\"lastPage && !single\" class=\"dt-footer-muted\">· {{ i18n.t('page.end') }}</span>\n <button\n v-else-if=\"countable && !single\"\n type=\"button\"\n class=\"dt-btn dt-btn-ghost dt-btn-xs dt-footer-count\"\n @click=\"emit('count')\"\n >\n · {{ i18n.t('page.countTotal') }}\n </button>\n </template>\n <template v-if=\"!phone && (updatedAt || freshness !== 'normal')\">\n <span class=\"dt-footer-vsep\" aria-hidden=\"true\" />\n <span v-if=\"freshness === 'live'\" class=\"dt-footer-live\">\n <span class=\"dt-live-dot\" aria-hidden=\"true\" />\n {{ i18n.t('toolbar.live') }}\n </span>\n <span v-else-if=\"freshness === 'refreshing'\" class=\"dt-footer-muted\" role=\"status\">\n {{ i18n.t('state.updating') }}\n </span>\n <span v-else-if=\"updatedAt\" class=\"dt-footer-updated\" :class=\"{ 'is-stale': freshness === 'stale' }\">\n {{ updatedText }}\n </span>\n <button\n v-if=\"canRefresh\"\n type=\"button\"\n class=\"dt-icon-btn-sm\"\n :aria-label=\"i18n.t('toolbar.refresh')\"\n :data-dt-tip=\"`${i18n.t('toolbar.refresh')} · R`\"\n @click=\"emit('refresh')\"\n >\n <PhArrowClockwise :size=\"14\" :class=\"{ 'dt-spin': freshness === 'refreshing' }\" aria-hidden=\"true\" />\n </button>\n </template>\n </div>\n <div class=\"dt-footer-right\">\n <label v-if=\"!phone\" class=\"dt-footer-size\">\n <span class=\"dt-footer-size-label\">{{ i18n.t('page.perPage') }}</span>\n <span class=\"dt-select\">\n <select\n :value=\"page.size\"\n :disabled=\"busy\"\n @change=\"emit('page-size', Number(($event.target as HTMLSelectElement).value))\"\n >\n <option v-for=\"s in pageSizes\" :key=\"s\" :value=\"s\">{{ s }}</option>\n </select>\n <PhCaretDown :size=\"12\" aria-hidden=\"true\" />\n </span>\n </label>\n <span v-if=\"!phone\" class=\"dt-footer-vsep\" aria-hidden=\"true\" />\n <button\n type=\"button\"\n class=\"dt-btn dt-btn-sm has-icon dt-footer-prev\"\n :aria-label=\"phone ? i18n.t('page.previous') : undefined\"\n :disabled=\"!canPrev\"\n @click=\"emit('page', page.number - 1)\"\n >\n <PhCaretLeft :size=\"phone ? 18 : 14\" aria-hidden=\"true\" />\n <span>{{ i18n.t('page.previous') }}</span>\n </button>\n <button\n type=\"button\"\n class=\"dt-btn dt-btn-sm dt-footer-next\"\n :aria-label=\"phone ? i18n.t('page.next') : undefined\"\n :disabled=\"!canNext\"\n @click=\"emit('page', page.number + 1)\"\n >\n <span>{{ i18n.t('page.next') }}</span>\n <PhCaretRight :size=\"phone ? 18 : 14\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Footer (05 §8, brief §6.13, T9-12): yalnızca snapshot'tan okur; simple sayfalama (D7); tazelik bilgisi burada.\nimport { PhArrowClockwise, PhCaretDown, PhCaretLeft, PhCaretRight, PhCircleNotch } from '@phosphor-icons/vue'\nimport { computed } from 'vue'\nimport { getFormat } from '../../core/format'\nimport { useDataTableContext } from '../../core/plugin'\n\nconst props = defineProps<{\n /** Snapshot'taki satır sayısı ve sayfa (1 tabanlı). */\n rowCount: number\n page: { number: number; size: number }\n hasMore: boolean\n /** Biliniyorsa toplam (istemci modunda hep; sunucuda Count total sonrası). */\n total?: number\n /** Sunucu modu: footer'da Count total düğmesi; sonuç \"counted 09:42\" eki alır. */\n countable: boolean\n counting: boolean\n countedAt: Date | null\n /** `page` / `query` talebi sürüyor: sayfalama kilitli. */\n busy: boolean\n /** İlk yükleme: \"Loading…\". */\n firstLoad: boolean\n /** Gövde Empty (filtre/arama yok) mu: \"No rows\" / \"0 rows\". */\n empty: boolean\n pageSizes: number[]\n updatedAt: Date | null\n freshness: 'normal' | 'refreshing' | 'stale' | 'live'\n canRefresh: boolean\n /** Telefon (handoff 04 §5): sayfa boyutu ve tazelik yok; 44 px Önceki / Sonraki. */\n phone?: boolean\n}>()\nconst emit = defineEmits<{ count: []; page: [number: number]; 'page-size': [size: number]; refresh: [] }>()\nconst { i18n, locale } = useDataTableContext()\nconst fmt = getFormat(locale)\n\nconst from = computed(() => (props.page.number - 1) * props.page.size + 1)\nconst to = computed(() => from.value + props.rowCount - 1)\nconst lastPage = computed(() => !props.hasMore)\nconst single = computed(() => props.page.number === 1 && lastPage.value)\nconst time = (d: Date) => d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' })\n\nconst canPrev = computed(() => props.page.number > 1 && !props.busy)\nconst canNext = computed(() => props.hasMore && !props.busy)\nconst updatedText = computed(() => {\n if (!props.updatedAt) return ''\n const ago = Date.now() - props.updatedAt.getTime()\n return ago < 60_000\n ? i18n.t('toolbar.updatedJustNow')\n : i18n.t('toolbar.updatedAgo', { time: fmt.relative(props.updatedAt, new Date(), 'short') })\n})\n</script>\n\n<template>\n <div class=\"dt-footer\" role=\"navigation\" :aria-label=\"i18n.t('page.nav')\">\n <div class=\"dt-footer-left\">\n <span v-if=\"firstLoad\" class=\"dt-footer-muted\">{{ i18n.t('common.loading') }}</span>\n <span v-else-if=\"rowCount === 0\" class=\"dt-footer-rows\">{{ i18n.t(empty ? 'page.none' : 'page.zero') }}</span>\n <template v-else>\n <span class=\"dt-footer-rows\">{{ i18n.t('page.rows', { from: fmt.int(from), to: fmt.int(to) }) }}</span>\n <template v-if=\"total !== undefined && !single\">\n <span class=\"dt-footer-of\">{{ i18n.t('page.of', { total: fmt.int(total) }) }}</span>\n <span v-if=\"countedAt\" class=\"dt-footer-muted\">\n · {{ i18n.t('page.counted', { time: time(countedAt) }) }}\n </span>\n </template>\n <span v-else-if=\"counting\" class=\"dt-footer-muted\">\n {{ i18n.t('page.of', { total: '' }) }}\n <PhCircleNotch :size=\"12\" class=\"dt-spin\" aria-hidden=\"true\" />\n {{ i18n.t('page.counting') }}\n </span>\n <span v-else-if=\"lastPage && !single\" class=\"dt-footer-muted\">· {{ i18n.t('page.end') }}</span>\n <button\n v-else-if=\"countable && !single\"\n type=\"button\"\n class=\"dt-btn dt-btn-ghost dt-btn-xs dt-footer-count\"\n @click=\"emit('count')\"\n >\n · {{ i18n.t('page.countTotal') }}\n </button>\n </template>\n <template v-if=\"!phone && (updatedAt || freshness !== 'normal')\">\n <span class=\"dt-footer-vsep\" aria-hidden=\"true\" />\n <span v-if=\"freshness === 'live'\" class=\"dt-footer-live\">\n <span class=\"dt-live-dot\" aria-hidden=\"true\" />\n {{ i18n.t('toolbar.live') }}\n </span>\n <span v-else-if=\"freshness === 'refreshing'\" class=\"dt-footer-muted\" role=\"status\">\n {{ i18n.t('state.updating') }}\n </span>\n <span v-else-if=\"updatedAt\" class=\"dt-footer-updated\" :class=\"{ 'is-stale': freshness === 'stale' }\">\n {{ updatedText }}\n </span>\n <button\n v-if=\"canRefresh\"\n type=\"button\"\n class=\"dt-icon-btn-sm\"\n :aria-label=\"i18n.t('toolbar.refresh')\"\n :data-dt-tip=\"`${i18n.t('toolbar.refresh')} · R`\"\n @click=\"emit('refresh')\"\n >\n <PhArrowClockwise :size=\"14\" :class=\"{ 'dt-spin': freshness === 'refreshing' }\" aria-hidden=\"true\" />\n </button>\n </template>\n </div>\n <div class=\"dt-footer-right\">\n <label v-if=\"!phone\" class=\"dt-footer-size\">\n <span class=\"dt-footer-size-label\">{{ i18n.t('page.perPage') }}</span>\n <span class=\"dt-select\">\n <select\n :value=\"page.size\"\n :disabled=\"busy\"\n @change=\"emit('page-size', Number(($event.target as HTMLSelectElement).value))\"\n >\n <option v-for=\"s in pageSizes\" :key=\"s\" :value=\"s\">{{ s }}</option>\n </select>\n <PhCaretDown :size=\"12\" aria-hidden=\"true\" />\n </span>\n </label>\n <span v-if=\"!phone\" class=\"dt-footer-vsep\" aria-hidden=\"true\" />\n <button\n type=\"button\"\n class=\"dt-btn dt-btn-sm has-icon dt-footer-prev\"\n :aria-label=\"phone ? i18n.t('page.previous') : undefined\"\n :disabled=\"!canPrev\"\n @click=\"emit('page', page.number - 1)\"\n >\n <PhCaretLeft :size=\"phone ? 18 : 14\" aria-hidden=\"true\" />\n <span>{{ i18n.t('page.previous') }}</span>\n </button>\n <button\n type=\"button\"\n class=\"dt-btn dt-btn-sm dt-footer-next\"\n :aria-label=\"phone ? i18n.t('page.next') : undefined\"\n :disabled=\"!canNext\"\n @click=\"emit('page', page.number + 1)\"\n >\n <span>{{ i18n.t('page.next') }}</span>\n <PhCaretRight :size=\"phone ? 18 : 14\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n</template>\n","// Liste satır modeli (01 · TanStack sınırı, D23): istemci modunda arama + sıralama + sayfalama TanStack row model'leriyle;\n// sunucu modunda `manual*` ile satırlar olduğu gibi (işlemi sunucu yapar). Sıralama kuralları 04 §6. Seçim ve expand\n// durumu TanStack'te (D23); seçim sayfa kapsamlı (D19).\nimport {\n columnFilteringFeature,\n createFilteredRowModel,\n createPaginatedRowModel,\n createSortedRowModel,\n functionalUpdate,\n globalFilteringFeature,\n rowExpandingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n tableFeatures,\n useTable,\n type ColumnDef as TanstackColumnDef,\n} from '@tanstack/vue-table'\nimport { computed, toValue, type MaybeRefOrGetter, type Ref } from 'vue'\nimport { comparator } from '../core/cells/compare'\nimport { TYPE_SPECS } from '../core/cells/specs'\nimport { readPath } from '../core/columns/readPath'\nimport { matches } from '../core/filters/model'\nimport type { ColumnDef } from '../types/columns'\nimport type { FilterCondition, SortRule } from '../types/query'\n\nexport const MAX_SORT = 3\n\nconst features = tableFeatures({\n rowSortingFeature,\n sortedRowModel: createSortedRowModel(),\n // globalFiltering, columnFiltering'i ön koşul ister (TanStack); sütun filtreleri Faz 3'te kullanılır.\n columnFilteringFeature,\n globalFilteringFeature,\n filteredRowModel: createFilteredRowModel(),\n rowPaginationFeature,\n paginatedRowModel: createPaginatedRowModel(),\n rowSelectionFeature,\n rowExpandingFeature,\n})\ntype Features = typeof features\n\nexport interface ListTableOptions<Row extends object> {\n columns: MaybeRefOrGetter<Array<ColumnDef<Row>>>\n rows: MaybeRefOrGetter<Row[]>\n rowKey: MaybeRefOrGetter<string>\n mode: MaybeRefOrGetter<'client' | 'server'>\n locale: MaybeRefOrGetter<string>\n sort: Ref<SortRule[]>\n /** Tam (eksik olmayan) koşullar; istemci modunda sütun başına `filterFn` (04 §1). */\n filters?: Ref<FilterCondition[]>\n /** 1 tabanlı (Laravel simplePaginate). */\n page: Ref<{ number: number; size: number }>\n search: Ref<string>\n /** Sunucu modu: sonraki sayfa var mı. */\n hasMore: MaybeRefOrGetter<boolean | undefined>\n selectable?: MaybeRefOrGetter<boolean>\n /** Satır anahtarı → seçili (05 §6; TanStack `RowSelectionState`). */\n rowSelection?: Ref<Record<string, true>>\n /** Satır anahtarı → açık (05 §7). */\n expanded?: Ref<Record<string, boolean>>\n canExpand?: MaybeRefOrGetter<((row: Row) => boolean) | undefined>\n}\n\nconst isEmpty = (v: unknown) => v === null || v === undefined || v === ''\n\nexport const isSearchable = (def: ColumnDef): boolean => def.searchable ?? TYPE_SPECS[def.type].searchable\n\nexport function useListTable<Row extends object>(o: ListTableOptions<Row>) {\n const defs = computed(() => toValue(o.columns))\n const locale = computed(() => toValue(o.locale))\n const isServer = computed(() => toValue(o.mode) === 'server')\n\n const tanstackColumns = computed<Array<TanstackColumnDef<Features, Row, unknown>>>(() =>\n defs.value.map((d) => {\n const id = d.id as string\n const cmp = comparator(d, locale.value)\n return {\n id,\n accessorFn: d.accessor ?? ((row: Row) => readPath(row, id)),\n enableSorting: d.sortable ?? TYPE_SPECS[d.type].sortable,\n enableGlobalFilter: isSearchable(d),\n enableColumnFilter: d.filterable ?? TYPE_SPECS[d.type].filterable,\n filterFn: (row, columnId, cond: FilterCondition) =>\n matches(cond, row.getValue(columnId), { locale: locale.value }),\n sortFn: (a, b, columnId) => cmp(a.getValue(columnId), b.getValue(columnId)),\n sortUndefined: 1,\n }\n }),\n )\n\n // Arama metni küçük harfe locale'e göre çevrilir (09: I/ı, İ/i doğru eşleşmeli); TanStack'e normalize değer gider.\n const normalizedSearch = computed(() => o.search.value.trim().toLocaleLowerCase(locale.value))\n const state = computed(() => ({\n sorting: o.sort.value.map((s) => ({ id: s.column, desc: s.dir === 'desc' })),\n pagination: { pageIndex: o.page.value.number - 1, pageSize: o.page.value.size },\n globalFilter: normalizedSearch.value,\n columnFilters: (o.filters?.value ?? []).map((f) => ({ id: f.column, value: f })),\n rowSelection: o.rowSelection?.value ?? {},\n expanded: o.expanded?.value ?? {},\n }))\n const searchableIds = computed(() => new Set(defs.value.filter(isSearchable).map((d) => d.id as string)))\n\n const table = useTable<Features, Row>({\n features,\n columns: tanstackColumns,\n data: computed(() => toValue(o.rows)),\n getRowId: (row: Row) => String(readPath(row, toValue(o.rowKey))),\n state,\n manualSorting: isServer,\n manualFiltering: isServer,\n manualPagination: isServer,\n // Sunucu: sayfa sayısı bilinmez; hasMore varken -1 (sınırsız), yoksa bu sayfa son.\n autoResetPageIndex: false,\n enableSortingRemoval: true,\n maxMultiSortColCount: MAX_SORT,\n enableRowSelection: computed(() => toValue(o.selectable) ?? false),\n enableExpanding: computed(() => !!o.expanded),\n getRowCanExpand: (row) => toValue(o.canExpand)?.(row.original) ?? true,\n getColumnCanGlobalFilter: (column) => searchableIds.value.has(column.id),\n globalFilterFn: (row, columnId, filterValue: string) => {\n const v = row.getValue(columnId)\n if (isEmpty(v)) return false\n return String(v).toLocaleLowerCase(locale.value).includes(filterValue)\n },\n // Reka/Vue güncellemeleri bizde: state kontrollü, TanStack'in kendi updater'ları kullanılmaz.\n onSortingChange: () => {},\n onPaginationChange: () => {},\n onGlobalFilterChange: () => {},\n onColumnFiltersChange: () => {},\n onRowSelectionChange: (u) => {\n if (o.rowSelection) o.rowSelection.value = functionalUpdate(u, o.rowSelection.value)\n },\n onExpandedChange: (u) => {\n if (!o.expanded) return\n const next = functionalUpdate(u, o.expanded.value)\n if (next !== true) o.expanded.value = next\n },\n })\n\n /** Sayfadaki satırlar (istemci: süzülmüş + sıralı + dilimlenmiş; sunucu: verilen). */\n const rows = computed<Row[]>(() =>\n isServer.value ? toValue(o.rows) : table.getRowModel().rows.map((r) => r.original),\n )\n /** İstemci modunda eşleşen toplam; sunucuda bilinmez. */\n const total = computed<number | undefined>(() =>\n isServer.value ? undefined : table.getPrePaginatedRowModel().rows.length,\n )\n const canNext = computed(() =>\n isServer.value ? (toValue(o.hasMore) ?? false) : o.page.value.number * o.page.value.size < (total.value ?? 0),\n )\n const canPrev = computed(() => o.page.value.number > 1)\n\n /** Header tıklaması: asc → desc → kapalı; diğerleri kalkar. ⇧: ekle / yön değiştir / kaldır, en fazla 3 (dördüncüde en eski düşer). */\n const toggleSort = (column: string, multi: boolean) => {\n const current = o.sort.value\n const at = current.findIndex((s) => s.column === column)\n const existing = at >= 0 ? current[at]! : null\n const next: SortRule | null = !existing\n ? { column, dir: 'asc' }\n : existing.dir === 'asc'\n ? { column, dir: 'desc' }\n : null\n if (!multi) {\n o.sort.value = next ? [next] : []\n return\n }\n const rest = current.filter((s) => s.column !== column)\n if (!next) o.sort.value = rest\n else if (at >= 0) o.sort.value = current.map((s) => (s.column === column ? next : s))\n else o.sort.value = [...rest, next].slice(-MAX_SORT)\n }\n const setSort = (column: string, dir: 'asc' | 'desc' | null) => {\n o.sort.value = dir ? [{ column, dir }] : o.sort.value.filter((s) => s.column !== column)\n }\n\n const rowId = (row: Row) => String(readPath(row, toValue(o.rowKey)))\n /** Sayfadaki seçili satırlar (D19): yalnızca yüklü satırlar arasından. */\n const selectedRows = computed<Row[]>(() => {\n const sel = o.rowSelection?.value ?? {}\n return rows.value.filter((r) => sel[rowId(r)])\n })\n\n return {\n rows,\n total,\n canNext,\n canPrev,\n toggleSort,\n setSort,\n rowId,\n selectedRows,\n /** Header checkbox (05 §6): bu sayfadaki yüklü satırlar. */\n toggleAllPage: (value: boolean) => table.toggleAllPageRowsSelected(value),\n }\n}\n","// Talep akışı (05 §10, brief §6.2, D18): paket veri çekmez; sorguyu `@request` ile yayar, uygulama `rows` / `hasMore` /\n// `loading` / `error` verir. Her yeni talep öncekinin `signal`'ini abort eder; `pending`, talep yayıldığı andan\n// `rows`/`error` değişene veya `loading` düşene kadar sürer (uygulama `loading`'i geç yazsa da Empty yanıp sönmez).\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue'\nimport type { RequestReason, TableError, TableQuery, TableRequest } from '../types/query'\n\nexport interface Snapshot<Row> {\n rows: Row[]\n hasMore: boolean\n page: { number: number; size: number }\n}\n\nexport interface RequestOptions<Row> {\n mode: () => 'client' | 'server'\n /** `@request` dinleyicisi var mı (istemci modunda Refresh/Retry yalnızca o zaman görünür). */\n hasListener: boolean\n query: () => TableQuery\n rows: () => Row[]\n hasMore: () => boolean | undefined\n loading: () => boolean | undefined\n error: () => TableError | undefined\n requestOnColumnChange: () => boolean\n emit: (request: TableRequest) => void\n}\n\nconst STILL_LOADING_MS = 10_000\nconst COLUMNS_DEBOUNCE_MS = 400\n\nexport function useRequest<Row>(o: RequestOptions<Row>) {\n const pending = ref(false)\n const reason = ref<RequestReason | null>(null)\n const snapshot = shallowRef<Snapshot<Row> | null>(null)\n const updatedAt = ref<Date | null>(null)\n const stillLoading = ref(false)\n let controller: AbortController | null = null\n let stillTimer: ReturnType<typeof setTimeout> | undefined\n let columnsTimer: ReturnType<typeof setTimeout> | undefined\n /** Son yayılan talebin istediği alanlar: yeni görünen sütun bunların dışındaysa `columns` talebi. */\n let lastFields = new Set<string>()\n\n const settle = () => {\n pending.value = false\n stillLoading.value = false\n clearTimeout(stillTimer)\n }\n\n const send = (why: RequestReason) => {\n controller?.abort()\n controller = new AbortController()\n const query = o.query()\n lastFields = new Set(query.fields)\n reason.value = why\n pending.value = true\n stillLoading.value = false\n clearTimeout(stillTimer)\n stillTimer = setTimeout(() => (stillLoading.value = pending.value), STILL_LOADING_MS)\n o.emit({ query, reason: why, signal: controller.signal })\n }\n\n const isServer = () => o.mode() === 'server'\n\n // Sorgu (arama, filtre, sıralama, sütunlar) → 'query'; yalnızca sayfa → 'page'. Aynı tick'te sayfa sıfırlanırsa tek talep.\n const queryKey = computed(() => {\n const q = o.query()\n return JSON.stringify([q.search, q.filters, q.sort])\n })\n const pageKey = computed(() => JSON.stringify(o.query().page))\n const fieldsKey = computed(() => o.query().fields.join('\\u0000'))\n\n watch([queryKey, pageKey], ([q], [prevQ]) => {\n if (!isServer()) return\n send(q !== prevQ ? 'query' : 'page')\n })\n watch(fieldsKey, () => {\n if (!isServer() || !o.requestOnColumnChange()) return\n if (o.query().fields.every((f) => lastFields.has(f))) return\n clearTimeout(columnsTimer)\n columnsTimer = setTimeout(() => send('columns'), COLUMNS_DEBOUNCE_MS)\n })\n\n // Bitiş: satırlar değişti (başarılı), hata geldi, ya da uygulama loading'i düşürdü.\n watch(o.rows, (rows) => {\n snapshot.value = { rows, hasMore: o.hasMore() ?? false, page: o.query().page }\n updatedAt.value = new Date()\n settle()\n })\n watch(o.error, (err) => {\n if (err) settle()\n })\n watch(o.loading, (now, before) => {\n if (before && !now) settle()\n })\n\n onMounted(() => {\n if (isServer()) send('initial')\n else {\n snapshot.value = { rows: o.rows(), hasMore: false, page: o.query().page }\n updatedAt.value = new Date()\n }\n })\n onBeforeUnmount(() => {\n controller?.abort()\n clearTimeout(stillTimer)\n clearTimeout(columnsTimer)\n })\n\n /** Hata türü: sorgu/sayfa/ilk talep hatası satırları geçersiz kılar (Error); yenileme hatası eskiyi korur (Stale). */\n const errorKind = computed<'error' | 'stale' | null>(() => {\n if (!o.error()) return null\n const r = reason.value\n const keepsRows = (r === 'refresh' || r === 'columns' || r === null) && (snapshot.value?.rows.length ?? 0) > 0\n return keepsRows ? 'stale' : 'error'\n })\n\n return {\n pending,\n reason,\n snapshot,\n updatedAt,\n stillLoading,\n errorKind,\n /** Son talebi aynı sorguyla, 'refresh' sebebiyle yeniden yayar (satırlar yerinde kalır). */\n refresh: () => {\n if (o.hasListener) send('refresh')\n },\n /** Retry / Try again: son sebeple aynı sorgu. */\n retry: () => {\n if (o.hasListener) send(reason.value ?? 'refresh')\n },\n }\n}\n","<script setup lang=\"ts\" generic=\"Row extends object\">\n// DataTable (05) — Faz 2–3b: toolbar, ızgara, footer, durumlar, veri akışı (`@request`), sıralama, sayfalama, sütun yönetimi,\n// tercihler, filtreler, görünümler. Paket veri çekmez (D18): sorguyu yayar, `rows`/`hasMore`/`loading`/`error` alır.\n// Seçim ve satır menüsü Faz 4.\nimport { PhCheck, PhCircleNotch, PhFunnel, PhPlus, PhWarning } from '@phosphor-icons/vue'\nimport {\n computed,\n defineAsyncComponent,\n getCurrentInstance,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n watch,\n} from 'vue'\nimport { optionLabel } from '../core/cells/format'\nimport { RemoteLabels } from '../core/cells/remoteLabels'\nimport { TYPE_SPECS } from '../core/cells/specs'\nimport { readPath } from '../core/columns/readPath'\nimport { useColumnLayout } from '../core/columns/useColumnLayout'\nimport ColumnPicker from '../core/filters/ColumnPicker.vue'\nimport FilterBar from '../core/filters/FilterBar.vue'\nimport { defaultOperator, isComplete, summarize, toCondition, type Chip, type Summary } from '../core/filters/model'\nimport { getFormat } from '../core/format'\nimport GridRoot from '../core/grid/GridRoot.vue'\nimport { useDelegatedTooltip } from '../core/grid/useDelegatedTooltip'\nimport { isTextInput } from '../core/interaction/isInteractive'\nimport { useDataTableContext } from '../core/plugin'\nimport { usePreferences } from '../core/preferences/usePreferences'\nimport StateMessage from '../core/states/StateMessage.vue'\nimport DisplayPopover from '../core/toolbar/DisplayPopover.vue'\nimport MoreMenu from '../core/toolbar/MoreMenu.vue'\nimport Toolbar from '../core/toolbar/Toolbar.vue'\nimport ConfirmDialog from '../core/ui/ConfirmDialog.vue'\nimport { nameError, type NameError } from '../core/views/model'\nimport { useViews } from '../core/views/useViews'\nimport ViewDialog from '../core/views/ViewDialog.vue'\nimport ViewMenu from '../core/views/ViewMenu.vue'\nimport type {\n BulkAction,\n ColumnDef,\n Density,\n ExpandOptions,\n Plural,\n RowAction,\n RowClickMode,\n TableId,\n View,\n ViewPatch,\n ViewState,\n} from '../types'\nimport type {\n CountRequest,\n FilterCondition,\n QueryWithoutPage,\n SortRule,\n TableError,\n TableQuery,\n TableRequest,\n} from '../types/query'\nimport BulkBar from './BulkBar.vue'\nimport Footer from './footer/Footer.vue'\nimport { isSearchable, useListTable } from './useListTable'\nimport { useRequest } from './useRequest'\n\n// Telefon alt sayfaları yalnızca telefonda yüklenir: çekirdek paket boyutu (10 · ≤ 60 kB).\nconst FiltersSheet = defineAsyncComponent(() => import('../core/filters/FiltersSheet.vue'))\nconst PhoneMoreSheet = defineAsyncComponent(() => import('../core/toolbar/PhoneMoreSheet.vue'))\n\nconst props = withDefaults(\n defineProps<{\n tableId: TableId\n columns: Array<ColumnDef<Row>>\n rows: Row[]\n rowKey?: string\n /** Verilmezse tercihten (Display › Density), o da yoksa standard. */\n density?: Density\n entityName?: Plural\n /** Tek harfli kısayollar (/, F, R). Oklar, Enter, Space, Esc ve Alt←/→ her zaman. */\n shortcuts?: boolean\n /** client: tüm satırlar verilir, arama/sıralama/sayfalama yerelde. server: `@request` ile uygulama çeker. */\n mode?: 'client' | 'server'\n loading?: boolean\n error?: TableError\n /** Sunucu modu: sonraki sayfa var mı (Laravel `next_page_url !== null`). */\n hasMore?: boolean\n /** Biliniyorsa toplam; istemci modunda otomatik. */\n total?: number\n /** Sunucu modu: footer'da \"Count total\" → `@count`. */\n countable?: boolean\n /** Her talepte `query.fields`'e eklenecek ek alanlar. */\n fields?: string[]\n /** Yeni görünen sütunun yolu son talepte yoksa `reason: 'columns'` talebi (400 ms birleştirme). */\n requestOnColumnChange?: boolean\n /** auto: yapılandırılana göre yuvalar; minimal: yalnızca arama + `#toolbar-end`; false: toolbar yok. */\n toolbar?: 'auto' | 'minimal' | false\n searchPlaceholder?: string\n /** Varsayılan 100; tercih varsa o. */\n pageSize?: number\n pageSizes?: number[]\n /** Saniye. Verilmezse More menüsünde Auto-refresh görünmez. */\n autoRefresh?: number\n /** Kodla tanımlı görünümler (kind: 'system'); adapter'daki kişisel görünümlerle birleştirilir (04 §7). */\n views?: View[]\n /** Seçim sütunu; seçim sayfa kapsamlıdır (D19). */\n selectable?: boolean\n /** Seçim çubuğu: yüzer (varsayılan) ya da toolbar'ın yerine. */\n selectionBar?: 'floating' | 'toolbar'\n bulkActions?: Array<BulkAction<Row>>\n /** Satır menüsü (⋯, sağ tık, ⇧F10): Open / Copy yerleşik + bunlar. */\n rowActions?: Array<RowAction<Row>>\n /** Satır gövdesine tıklama (D6). Varsayılan 'none'. */\n rowClick?: RowClickMode\n expand?: boolean | ExpandOptions<Row>\n /** Satır hatası (D35): metin/metin listesi → `--dt-r-bg` + ⋯ hücresinde uyarı ikonu + satırda tooltip. Harita uygulamanın. */\n rowError?: (row: Row) => string | string[] | null | undefined\n }>(),\n {\n rowKey: 'id',\n shortcuts: true,\n mode: 'client',\n countable: false,\n requestOnColumnChange: true,\n toolbar: 'auto',\n pageSize: 100,\n pageSizes: () => [50, 100, 250, 500],\n views: () => [],\n selectable: false,\n selectionBar: 'floating',\n rowClick: 'none',\n expand: false,\n },\n)\nconst emit = defineEmits<{\n /** Sunucu modunda her talep; istemci modunda yalnızca `refresh()`. */\n request: [request: TableRequest]\n count: [request: CountRequest]\n /** Etkileşimli hedef, metin seçimi ve değiştirici tuş dışındaki satır tıklamaları (`rowClick`'ten bağımsız). */\n 'row-click': [payload: { row: Row; event: MouseEvent }]\n /** Birincil linke düz sol tık, satırda ↵, menüde Open, `row-click=\"open\"`. Paket preventDefault yapmaz (05 §7). */\n 'row-open': [payload: { row: Row; href: string; event: MouseEvent }]\n /** Seçim her değiştiğinde; sayfa kapsamlı yüklü satırlar (D19). */\n 'selection-change': [rows: Row[]]\n export: [payload: { format: 'csv' | 'xlsx'; query: QueryWithoutPage; selection: Row[]; visibleColumns: string[] }]\n import: []\n print: [payload: { query: QueryWithoutPage; visibleColumns: string[] }]\n 'view-change': [payload: { id: string; kind: View['kind'] }]\n}>()\ndefineSlots<{\n empty?: () => unknown\n 'toolbar-end'?: (props: { compact: boolean }) => unknown\n /** Satır detayı; veriyi slot bileşeni çeker (05 §7). */\n expanded?: (props: { row: Row; close: () => void }) => unknown\n /** bulkActions yerine özel seçim çubuğu içeriği. */\n 'selection-actions'?: (props: { rows: Row[]; clear: () => void }) => unknown\n}>()\n\nconst ctx = useDataTableContext()\nconst { i18n } = ctx\n// Toolbar yuvaları ve Retry yalnızca uygulama ilgili olayı dinliyorsa (05 §3, §10).\nconst vnodeProps = getCurrentInstance()?.vnode.props ?? {}\nconst listens = (name: string) => name in vnodeProps\nconst isServer = computed(() => props.mode === 'server')\nif (import.meta.env?.DEV && props.mode === 'server' && !listens('onRequest'))\n console.warn(`[data-table] \"${props.tableId}\": mode=\"server\" ama @request dinleyicisi yok; satırlar hiç gelmeyecek.`)\n\nconst entity = computed<Plural>(() => props.entityName ?? { one: props.tableId, other: props.tableId })\nconst ariaLabel = computed(() => entity.value.other)\n\n// Telefon düzeni (05 §11, handoff 04): kartın kendi genişliği < 640 → is-phone; Toolbar daralma eşikleri de buradan (ResizeObserver).\nconst rootEl = ref<HTMLElement | null>(null)\nconst width = ref(1440)\nconst size = computed(() => (width.value >= 1024 ? 'full' : width.value >= 640 ? 'narrow' : 'phone'))\nconst phone = computed(() => size.value === 'phone')\nlet ro: ResizeObserver | undefined\nonMounted(() => {\n const measure = () => (width.value = rootEl.value?.clientWidth || 1440)\n measure()\n if (typeof ResizeObserver !== 'undefined' && rootEl.value) {\n ro = new ResizeObserver(measure)\n ro.observe(rootEl.value)\n }\n})\n\n// Tercihler (05 §9): yoğunluk, dikey çizgiler, sayfa boyutu; adapter yoksa oturumluk.\nconst pref = usePreferences(() => props.tableId, ctx.preferences, {\n density: 'standard',\n verticalLines: false,\n pageSize: props.pageSize,\n defaultViewId: null,\n})\nconst density = computed<Density>(() => props.density ?? pref.prefs.density)\n\nconst layout = useColumnLayout<Row>({\n columns: () => props.columns,\n rows: () => props.rows,\n rowKey: () => props.rowKey,\n phone: () => phone.value,\n})\n\n// Sorgu durumu. Arama/sıralama değişince sayfa 1 (aynı tick → tek talep).\nconst search = ref('')\nconst sort = ref<SortRule[]>([])\nconst page = ref({ number: 1, size: pref.prefs.pageSize })\nconst goTo = (number: number) => (page.value = { ...page.value, number })\nconst setSearch = (value: string) => {\n if (value === search.value) return\n search.value = value\n goTo(1)\n}\nwatch(\n () => pref.prefs.pageSize,\n (size) => (page.value = { number: 1, size }),\n)\n\n// Filtreler (04): çipler ekranda; yalnızca tam olanlar sorguya girer (D2: sütun başına tek çip).\nconst chips = ref<Chip[]>([])\nconst editing = ref<string | null>(null)\nconst pickerOpen = ref(false)\nconst labels = new RemoteLabels()\nconst fmt = getFormat(ctx.locale)\nconst defs = computed(() => new Map(props.columns.map((c) => [c.id as string, c as ColumnDef])))\nconst typeOf = (column: string) => defs.value.get(column)?.type ?? 'string'\nconst filters = computed<FilterCondition[]>(() =>\n chips.value.filter((c) => isComplete(c, typeOf(c.column))).map(toCondition),\n)\nconst filteredColumns = computed(() => new Set(filters.value.map((f) => f.column)))\nconst hasFilter = computed(\n () => props.toolbar === 'auto' && props.columns.some((c) => c.filterable ?? TYPE_SPECS[c.type].filterable),\n)\nconst labelOf = (def: ColumnDef) => (v: string | number) => {\n if (def.type === 'select' || def.type === 'multiselect' || (def.type === 'user' && def.options))\n return optionLabel(def.options, v)\n if ((def.type === 'user' || def.type === 'ajax') && def.remote) return labels.label(def.id as string, def.remote, v)\n return String(v)\n}\nconst summaryOf = (chip: Chip): Summary => {\n const def = defs.value.get(chip.column)!\n return summarize(chip, def, { i18n, fmt, labelOf: labelOf(def) })\n}\nconst currenciesOf = (def: ColumnDef): string[] => {\n if (def.type !== 'currency') return []\n if (typeof def.currency === 'string') return [def.currency]\n return [...new Set(props.rows.map((r) => (def.currency as (row: Row) => string)(r)))]\n}\n/** Picker / header: var olan çipi açar, yoksa tipin varsayılan operatörüyle oluşturup editörünü açar; boolean doğrudan uygulanır. */\nconst pick = (column: string) => {\n const def = defs.value.get(column)\n if (!def) return\n if (phone.value) {\n filtersSheet.value?.show(column)\n return\n }\n if (!chips.value.some((c) => c.column === column)) {\n const op = defaultOperator(def)\n chips.value = [...chips.value, def.type === 'boolean' ? { column, op, value: true } : { column, op }]\n if (def.type === 'boolean') return\n }\n editing.value = column\n}\nconst updateChip = (chip: Chip) => (chips.value = chips.value.map((c) => (c.column === chip.column ? chip : c)))\nconst removeChip = (column: string) => {\n chips.value = chips.value.filter((c) => c.column !== column)\n if (editing.value === column) editing.value = null\n}\n/** Editör değer seçilmeden kapanırsa çip kaldırılır (04 §1). */\nconst setEditing = (column: string | null) => {\n const prev = editing.value\n editing.value = column\n if (prev && prev !== column) {\n const c = chips.value.find((x) => x.column === prev)\n if (c && !isComplete(c, typeOf(prev))) removeChip(prev)\n }\n}\nconst clearFilters = () => {\n chips.value = []\n editing.value = null\n}\n/** Telefon Filters sayfası (04 §9): çipler ve sıralama Show results'la tek adımda uygulanır. */\nconst filtersSheet = ref<{ show: (column?: string) => void } | null>(null)\nconst applySheet = (next: Chip[], s: SortRule[]) => {\n chips.value = next\n editing.value = null\n sort.value = s\n goTo(1)\n}\n\nconst visibleColumns = computed(() => layout.columns.value.map((c) => c.id))\nconst fields = computed(() => {\n const out = new Set<string>([props.rowKey])\n for (const c of layout.columns.value) {\n if (!c.def.accessor) out.add(c.id)\n for (const f of c.def.fields ?? []) out.add(f)\n }\n for (const f of props.fields ?? []) out.add(f)\n return [...out]\n})\nconst query = computed<TableQuery>(() => ({\n search: search.value,\n filters: filters.value,\n sort: sort.value,\n page: page.value,\n columns: visibleColumns.value,\n fields: fields.value,\n}))\nconst queryWithoutPage = (): QueryWithoutPage => {\n const { search, filters, sort, columns, fields } = query.value\n return { search, filters, sort, columns, fields }\n}\n\n// Ekran okuyucu bölgeleri (08 §5); görünüm/filtre/sıralama duyuruları buraya yazar.\nconst polite = ref('')\nconst assertive = ref('')\n\n// Görünümler (04 §7, D4, D5): görünüm = filtre + sıralama + sütun düzeni; uygulama tek adımda (aynı tick) → tek talep.\nconst current = (): ViewState => ({ filters: filters.value, sort: sort.value, columns: layout.state.value })\nconst applyView = (p: ViewPatch) => {\n chips.value = (p.filters ?? []).map((f) => ({ ...f }))\n editing.value = null\n sort.value = p.sort ?? []\n layout.apply(p.columns)\n goTo(1)\n}\nconst vw = useViews({\n tableId: () => props.tableId,\n system: () => props.views,\n adapter: ctx.viewsAdapter,\n locale: () => ctx.locale,\n defaultViewId: () => pref.prefs.defaultViewId,\n setDefaultViewId: (id) => pref.set({ defaultViewId: id }),\n prefsReady: pref.ready,\n current,\n apply: applyView,\n onChange: (v) => {\n emit('view-change', { id: v.id, kind: v.kind })\n polite.value = i18n.t('sr.view', { name: v.name })\n },\n})\nconst viewMenuOpen = ref(false)\nconst viewSummary = (s: ViewState) => {\n const first = s.sort[0]\n const more = s.sort.length > 1 ? ` +${s.sort.length - 1}` : ''\n const pinned = [...s.columns.pinned.left, ...s.columns.pinned.right].map(headerOf).join(', ')\n return {\n filters: s.filters.map((f) => headerOf(f.column)).join(' · ') || i18n.t('common.empty'),\n sort: first ? `${headerOf(first.column)} ${first.dir === 'asc' ? '↑' : '↓'}${more}` : i18n.t('common.empty'),\n columns: [\n i18n.t('views.columnsSummary', { shown: s.columns.visible.length, total: props.columns.length }),\n ...(pinned ? [i18n.t('views.pinnedSummary', { name: pinned })] : []),\n ].join(' · '),\n }\n}\nconst resolveState = (v: View): ViewState => ({\n filters: v.state.filters ?? [],\n sort: v.state.sort ?? [],\n columns: layout.resolve(v.state.columns),\n})\ninterface ViewDialogState {\n mode: 'create' | 'rename'\n name: string\n state: ViewState\n summary: ReturnType<typeof viewSummary> | null\n view?: View\n /** Mevcut düzenleme yeni görünüme taşınır (Save as new / New view); Duplicate'te aktif görünümün taslağı kalır. */\n fromCurrent: boolean\n}\nconst viewDialog = ref<ViewDialogState | null>(null)\nconst viewDialogOpen = computed({\n get: () => !!viewDialog.value,\n set: (o: boolean) => {\n if (!o) viewDialog.value = null\n },\n})\nconst confirmDelete = ref<View | null>(null)\n/** Save as new view / Save as my view / New view: mevcut durum, ad boş. Duplicate: kaynağın kayıtlı durumu, \"{ad} copy\". */\nconst openSaveAs = (view?: View) => {\n const state = view ? resolveState(view) : current()\n viewDialog.value = {\n mode: 'create',\n name: view ? i18n.t('views.copyName', { name: view.name }) : '',\n state,\n summary: viewSummary(state),\n view,\n fromCurrent: !view,\n }\n}\nconst openRename = (view: View) =>\n (viewDialog.value = { mode: 'rename', name: view.name, state: current(), summary: null, view, fromCurrent: false })\nconst validateViewName = (name: string): NameError | null => {\n const d = viewDialog.value\n return nameError(name, vw.all.value, ctx.locale, d?.mode === 'rename' ? d.view?.id : undefined)\n}\nconst onViewDialogSave = (input: { name: string; makeDefault: boolean }) => {\n const d = viewDialog.value\n if (!d) return\n if (d.mode === 'rename' && d.view) void vw.rename(d.view.id, input.name)\n else\n void vw.create({\n name: input.name,\n state: d.state,\n makeDefault: input.makeDefault,\n fromCurrent: d.fromCurrent,\n })\n}\nconst removeView = () => {\n const v = confirmDelete.value\n if (v) void vw.remove(v.id)\n}\n\n// Seçim ve expand (05 §6–7): durum TanStack'te (D23); seçim sayfa kapsamlı (D19), expand anahtarla (refresh'te açık kalır).\nconst rowSelection = ref<Record<string, true>>({})\nconst expanded = ref<Record<string, boolean>>({})\nconst expandOn = computed(() => !!props.expand)\nconst canExpandFn = computed(() => (typeof props.expand === 'object' ? props.expand.canExpand : undefined))\nconst list = useListTable<Row>({\n columns: () => props.columns,\n rows: () => props.rows,\n rowKey: () => props.rowKey,\n mode: () => props.mode,\n locale: ctx.locale,\n sort,\n filters,\n page,\n search,\n hasMore: () => props.hasMore,\n selectable: () => props.selectable,\n rowSelection,\n expanded,\n canExpand: () => canExpandFn.value,\n})\nconst req = useRequest<Row>({\n mode: () => props.mode,\n hasListener: listens('onRequest'),\n query: () => query.value,\n rows: () => props.rows,\n hasMore: () => props.hasMore,\n loading: () => props.loading,\n error: () => props.error,\n requestOnColumnChange: () => props.requestOnColumnChange,\n emit: (r) => emit('request', r),\n})\n\n// Sıralama (04 §6): tık asc → desc → kapalı; ⇧ ikincil (en fazla 3); menüden yön.\nconst onSort = (id: string, additive: boolean) => {\n list.toggleSort(id, additive)\n goTo(1)\n}\nconst onSortSet = (id: string, dir: 'asc' | 'desc' | null) => {\n list.setSort(id, dir)\n goTo(1)\n}\nconst sortMap = computed(\n () => new Map(sort.value.map((s, i) => [s.column, { dir: s.dir, index: sort.value.length > 1 ? i + 1 : null }])),\n)\nconst headerOf = (id: string) => props.columns.find((c) => c.id === id)?.header ?? id\n\n// Durumlar (05 §10): üç girdi — pending/sebep, satır var mı, hata.\nconst reason = req.reason\nconst pending = req.pending\nconst rowsShown = computed<Row[]>(() => (req.errorKind.value === 'error' ? [] : list.rows.value))\nconst hasRows = computed(() => rowsShown.value.length > 0)\nconst identityChange = computed(() => pending.value && (reason.value === 'query' || reason.value === 'page'))\nconst dim = computed(() => identityChange.value && hasRows.value)\nconst slow = ref(false)\nlet slowTimer: ReturnType<typeof setTimeout> | undefined\nwatch(dim, (on) => {\n clearTimeout(slowTimer)\n slow.value = false\n if (on) slowTimer = setTimeout(() => (slow.value = true), 400)\n})\nconst skeleton = computed(\n () => (pending.value && !hasRows.value) || (!!props.loading && !hasRows.value && !props.error) || slow.value,\n)\nconst refreshing = computed(\n () =>\n (pending.value && (reason.value === 'refresh' || reason.value === 'columns')) ||\n (!!props.loading && hasRows.value && !identityChange.value),\n)\nconst refreshBar = ref(false)\nlet barTimer: ReturnType<typeof setTimeout> | undefined\nwatch(refreshing, (on) => {\n clearTimeout(barTimer)\n refreshBar.value = false\n if (on) barTimer = setTimeout(() => (refreshBar.value = true), 150)\n})\nconst busy = computed(() => identityChange.value || (skeleton.value && !hasRows.value))\nconst bodyState = computed<'error' | 'noResults' | 'noRowsOnPage' | 'empty' | null>(() => {\n if (skeleton.value || hasRows.value || pending.value) return null\n if (req.errorKind.value === 'error') return 'error'\n if (search.value || filters.value.length) return 'noResults'\n if (page.value.number > 1) return 'noRowsOnPage'\n return 'empty'\n})\nconst errorInfo = computed(() => {\n const e = props.error\n return typeof e === 'object' && e ? e : typeof e === 'string' ? { message: e } : {}\n})\nconst noResultsTitle = computed(() => {\n const count = filters.value.length\n const params = { entity: entity.value, q: search.value, count }\n if (search.value && count) return i18n.t('state.noResultsBoth', params)\n if (search.value) return i18n.t('state.noResultsSearch', params)\n return i18n.t('state.noResults', params)\n})\nconst clock = (d: Date) => d.toLocaleTimeString(ctx.locale, { hour: '2-digit', minute: '2-digit' })\n\n// Footer yalnızca snapshot'tan okur (05 §8); istemci modunda satır modeli zaten yerel.\nconst snap = req.snapshot\nconst footerRows = computed(() =>\n req.errorKind.value === 'error' ? 0 : isServer.value ? (snap.value?.rows.length ?? 0) : list.rows.value.length,\n)\nconst footerPage = computed(() => (isServer.value ? (snap.value?.page ?? page.value) : page.value))\nconst footerHasMore = computed(() => (isServer.value ? (snap.value?.hasMore ?? false) : list.canNext.value))\nconst total = computed(() => (isServer.value ? props.total : list.total.value))\n\n// Count total → @count; sonuç sorgu değişene kadar geçerli.\nlet countCtl: AbortController | null = null\nconst counting = ref(false)\nconst countedAt = ref<Date | null>(null)\nconst count = () => {\n countCtl?.abort()\n countCtl = new AbortController()\n counting.value = true\n emit('count', { query: queryWithoutPage(), signal: countCtl.signal })\n}\nwatch(\n () => props.total,\n (t) => {\n if (t === undefined) return\n counting.value = false\n countedAt.value = isServer.value ? new Date() : null\n polite.value = i18n.t('sr.total', { count: fmt.int(t), entity: entity.value })\n },\n)\nwatch(\n () => JSON.stringify([search.value, sort.value, filters.value]),\n () => {\n countCtl?.abort()\n counting.value = false\n countedAt.value = null\n },\n)\n\n// Sayfa değişince gövde başa kayar (05 §8).\nconst grid = ref<InstanceType<typeof GridRoot> | null>(null)\nwatch(\n () => page.value.number,\n () => grid.value?.scrollToTop(),\n)\nconst setPageSize = (size: number) => pref.set({ pageSize: size })\n// Her filtre değişikliğinde sayfa 1, gövde başa (04 §3); ekran okuyucuya eklenen/kaldırılan filtre (08 §5).\nwatch(\n () => JSON.stringify(filters.value),\n (now, before) => {\n goTo(1)\n grid.value?.scrollToTop()\n const prev = new Map((JSON.parse(before) as FilterCondition[]).map((f) => [f.column, JSON.stringify(f)]))\n const next = new Map((JSON.parse(now) as FilterCondition[]).map((f) => [f.column, JSON.stringify(f)]))\n for (const [column, key] of next)\n if (prev.get(column) !== key) {\n const chip = chips.value.find((c) => c.column === column)\n if (chip) {\n const sm = summaryOf(chip)\n polite.value = i18n.t('sr.filterAdded', { summary: `${headerOf(column)} ${sm.text}`.trim() })\n }\n }\n for (const column of prev.keys())\n if (!next.has(column)) polite.value = i18n.t('sr.filterRemoved', { column: headerOf(column) })\n },\n)\n\n// Auto-refresh (05 §3): açıkken footer \"Live\".\nconst autoRefreshOn = ref(false)\nlet autoTimer: ReturnType<typeof setInterval> | undefined\nwatch(autoRefreshOn, (on) => {\n clearInterval(autoTimer)\n if (on && props.autoRefresh) autoTimer = setInterval(() => req.refresh(), props.autoRefresh * 1000)\n})\nconst freshness = computed<'normal' | 'refreshing' | 'stale' | 'live'>(() =>\n autoRefreshOn.value ? 'live' : refreshing.value ? 'refreshing' : req.errorKind.value === 'stale' ? 'stale' : 'normal',\n)\n\n// Toolbar yuvaları (05 §3): yalnızca yapılandırılmış olanlar.\nconst hasSearch = computed(() => props.toolbar !== false && props.columns.some(isSearchable))\nconst hasDisplay = computed(() => props.toolbar === 'auto')\nconst more = computed(() => ({\n refresh: listens('onRequest'),\n export: listens('onExport'),\n import: listens('onImport'),\n print: listens('onPrint'),\n autoRefresh: props.autoRefresh !== undefined,\n}))\nconst hasMore = computed(() => props.toolbar === 'auto' && Object.values(more.value).some(Boolean))\nconst searchPlaceholder = computed(() => props.searchPlaceholder ?? i18n.t('toolbar.search', { entity: entity.value }))\nconst toolbarRef = ref<InstanceType<typeof Toolbar> | null>(null)\nconst displayProps = computed(() => ({\n density: density.value,\n verticalLines: pref.prefs.verticalLines,\n columns: layout.panel.value,\n counts: layout.counts.value,\n sort: sort.value,\n persistent: pref.persistent,\n}))\n// v-on nesnesi: anahtarlar olay adı (Vue `on` önekini kendisi ekler).\nconst displayOn = {\n 'update:density': (d: Density) => pref.set({ density: d }),\n 'column-visible': (id: string, visible: boolean) => layout.setVisible(id, visible),\n 'column-move': (id: string, delta: -1 | 1) => layout.move(id, delta),\n 'columns-all': (visible: boolean) => {\n for (const c of layout.panel.value) if (!c.pinned && c.canHide) layout.setVisible(c.id, visible)\n },\n 'columns-reset': () => layout.reset(vw.active.value?.state.columns),\n 'sort-dir': (column: string, dir: 'asc' | 'desc') => {\n sort.value = sort.value.map((s) => (s.column === column ? { column, dir } : s))\n goTo(1)\n },\n 'sort-remove': (column: string) => onSortSet(column, null),\n 'sort-clear': () => {\n sort.value = []\n goTo(1)\n },\n reset: () => pref.reset(),\n}\nconst onExport = (format: 'csv' | 'xlsx') =>\n emit('export', {\n format,\n query: queryWithoutPage(),\n selection: list.selectedRows.value,\n visibleColumns: visibleColumns.value,\n })\n\n// Birincil hücre (D6): link, aria etiketleri ve Copy için metin; ⋯ sütunu birincil sütun ya da rowActions varsa.\nconst primaryDef = computed(() => props.columns.find((c) => c.primary))\nconst primaryHref = (row: Row) => primaryDef.value?.href?.(row)\nconst primaryLabel = (row: Row): string => {\n const d = primaryDef.value\n const v = d ? (d.accessor ? d.accessor(row) : readPath(row, d.id as string)) : readPath(row, props.rowKey)\n return v === null || v === undefined ? '' : String(v)\n}\nconst rowMenu = computed(() => !!props.rowActions?.length || !!primaryDef.value)\nconst selectedRows = list.selectedRows\nconst clearSelection = () => (rowSelection.value = {})\nconst selectRows = (ids: string[], value: boolean) => {\n const next = { ...rowSelection.value }\n for (const id of ids) {\n if (value) next[id] = true\n else delete next[id]\n }\n rowSelection.value = next\n}\n// Sayfa, sayfa boyutu, filtre, arama, sıralama → seçim temizlenir, açıklar kapanır (D19, 05 §7); refresh'te korunur.\nwatch(\n () => JSON.stringify([search.value, filters.value, sort.value, page.value]),\n () => {\n rowSelection.value = {}\n expanded.value = {}\n grid.value?.measure()\n },\n)\n// Yeni veride olmayan anahtarlar süzülür (05 §12).\nwatch(\n () => props.rows,\n (rows) => {\n const ids = new Set(rows.map(list.rowId))\n const keep = (o: Record<string, boolean>) => Object.fromEntries(Object.entries(o).filter(([id]) => ids.has(id)))\n if (Object.keys(rowSelection.value).some((id) => !ids.has(id)))\n rowSelection.value = keep(rowSelection.value) as Record<string, true>\n if (Object.keys(expanded.value).some((id) => !ids.has(id))) expanded.value = keep(expanded.value)\n },\n)\nwatch(selectedRows, (rows) => {\n emit('selection-change', rows)\n if (rows.length) polite.value = i18n.t('selection.selected', { count: rows.length })\n})\nconst toggleExpand = (id: string, value: boolean) => {\n const next = { ...expanded.value }\n if (value) next[id] = true\n else delete next[id]\n expanded.value = next\n if (!value) return\n void nextTick(() => {\n const row = props.rows.find((r) => list.rowId(r) === id)\n const sub = [\n ...((grid.value?.$el as HTMLElement | undefined)?.querySelectorAll<HTMLElement>('.dt-subrow') ?? []),\n ].find((el) => el.id.endsWith(`-sub-${id}`))\n if (row)\n polite.value = i18n.t('sr.expanded', {\n label: primaryLabel(row),\n count: sub ? sub.querySelectorAll('[role=\"row\"], tr').length : 0,\n })\n })\n}\n/** Satır gövdesi (D6): her zaman `row-click`; `rowClick` modu açar ya da detayı açıp kapatır. */\nconst onRowClick = (row: Row, event: MouseEvent) => {\n emit('row-click', { row, event })\n if (props.rowClick === 'open') {\n ;(event.target as Element | null)\n ?.closest('.dt-row')\n ?.querySelector<HTMLElement>('.dt-cell.is-primary a.dt-link')\n ?.click()\n } else if (props.rowClick === 'expand' && expandOn.value && (canExpandFn.value?.(row) ?? true)) {\n const id = list.rowId(row)\n toggleExpand(id, !expanded.value[id])\n }\n}\nconst onRowOpen = (row: Row, event: MouseEvent) => emit('row-open', { row, href: primaryHref(row) ?? '', event })\n// Toast: yalnızca \"Copied\" (handoff 02 §6); bulk aksiyonlar için toast uygulamanındır (D20).\nconst toast = ref<string | null>(null)\nlet toastTimer: ReturnType<typeof setTimeout> | undefined\nconst copyId = (row: Row) => {\n void navigator.clipboard?.writeText(primaryLabel(row))\n toast.value = i18n.t('cell.copied')\n clearTimeout(toastTimer)\n toastTimer = setTimeout(() => (toast.value = null), 2000)\n}\nconst onPrint = () => emit('print', { query: queryWithoutPage(), visibleColumns: visibleColumns.value })\nconst copyErrorId = () => void navigator.clipboard?.writeText(errorInfo.value.id ?? '')\n\n// Kısayollar (08 §3): `/` arama, `F` filtre, `V` görünüm, `R` yenile, `⌘S` görünümü kaydet; Alt←/→ sayfa (her zaman).\n// Kapsam sayfa; tek harfliler odak metin alanındayken kapalı.\nconst onKey = (e: KeyboardEvent) => {\n if (e.defaultPrevented) return\n const target = e.target instanceof Element ? e.target : null\n // Esc sırayla: açık popover/menü/dialog (odak içindedir) → seçim (05 §6); metin alanında aramanın Esc'i.\n if (e.key === 'Escape') {\n const inLayer = !!target?.closest('[role=\"menu\"], [role=\"dialog\"], [role=\"alertdialog\"], [role=\"listbox\"], .dt-pop')\n if (!e.defaultPrevented && !inLayer && selectedRows.value.length && !(target && isTextInput(target)))\n clearSelection()\n return\n }\n if (e.altKey && !e.ctrlKey && !e.metaKey && (e.key === 'ArrowLeft' || e.key === 'ArrowRight')) {\n if (busy.value) return\n const next = e.key === 'ArrowLeft' ? page.value.number - 1 : page.value.number + 1\n if (next >= 1 && (e.key === 'ArrowLeft' || footerHasMore.value)) {\n e.preventDefault()\n goTo(next)\n }\n return\n }\n if ((e.metaKey || e.ctrlKey) && !e.altKey && !e.shiftKey && (e.key === 's' || e.key === 'S')) {\n if (!props.shortcuts || !vw.edited.value || !ctx.viewsAdapter || viewDialog.value) return\n e.preventDefault()\n if (vw.writable(vw.active.value)) void vw.saveChanges()\n else openSaveAs()\n return\n }\n if (!props.shortcuts || e.ctrlKey || e.metaKey || e.altKey || (target && isTextInput(target))) return\n if (e.key === '/' && hasSearch.value) {\n e.preventDefault()\n toolbarRef.value?.focusSearch()\n } else if ((e.key === 'f' || e.key === 'F') && hasFilter.value) {\n e.preventDefault()\n if (phone.value) filtersSheet.value?.show()\n else pickerOpen.value = true\n } else if ((e.key === 'r' || e.key === 'R') && listens('onRequest')) {\n e.preventDefault()\n req.refresh()\n } else if ((e.key === 'v' || e.key === 'V') && vw.hasViews.value && props.toolbar === 'auto') {\n e.preventDefault()\n viewMenuOpen.value = true\n }\n}\nonMounted(() => window.addEventListener('keydown', onKey))\nonBeforeUnmount(() => {\n window.removeEventListener('keydown', onKey)\n ro?.disconnect()\n clearTimeout(slowTimer)\n clearTimeout(barTimer)\n clearInterval(autoTimer)\n clearTimeout(toastTimer)\n countCtl?.abort()\n})\n\n// Ekran okuyucu duyuruları (08 §5): tek polite + tek assertive bölge.\nwatch(\n () => rowsShown.value.length,\n (n) => {\n if (!pending.value) polite.value = i18n.t('sr.loaded', { count: n })\n },\n)\nwatch(req.updatedAt, () => (polite.value = i18n.t('sr.loaded', { count: rowsShown.value.length })))\nwatch(sort, (s) => {\n const first = s[0]\n if (first)\n polite.value = i18n.t('sr.sorted', {\n column: headerOf(first.column),\n dir: i18n.t(first.dir === 'asc' ? 'sr.asc' : 'sr.desc'),\n })\n})\nwatch(req.errorKind, (k) => {\n if (k === 'error')\n assertive.value = `${i18n.t('state.errorTitle', { entity: entity.value })} ${i18n.t('state.tryAgain')}`\n})\n\n// Tek tooltip, kart kökünde: hücreler, başlıklar ve çipler (02 · Tooltip).\nconst tooltip = useDelegatedTooltip(rootEl)\n\ndefineExpose({ refresh: req.refresh, clearSelection })\n</script>\n\n<template>\n <div ref=\"rootEl\" class=\"dt dt-list\" :class=\"{ 'is-phone': phone }\" :data-density=\"density\">\n <BulkBar\n v-if=\"selectionBar === 'toolbar' && selectedRows.length && toolbar !== false\"\n variant=\"toolbar\"\n :rows=\"selectedRows\"\n :actions=\"bulkActions ?? []\"\n @clear=\"clearSelection\"\n >\n <slot v-if=\"$slots['selection-actions']\" name=\"selection-actions\" :rows=\"selectedRows\" :clear=\"clearSelection\" />\n </BulkBar>\n <Toolbar\n v-else-if=\"toolbar !== false\"\n ref=\"toolbarRef\"\n :size=\"size\"\n :search=\"hasSearch ? search : null\"\n :search-placeholder=\"searchPlaceholder\"\n :has-filter=\"hasFilter\"\n :has-display=\"hasDisplay\"\n :has-more=\"hasMore\"\n @update:search=\"setSearch\"\n >\n <template v-if=\"vw.hasViews.value && toolbar === 'auto'\" #view>\n <ViewMenu\n v-model:open=\"viewMenuOpen\"\n :sections=\"vw.sections.value\"\n :active=\"vw.active.value\"\n :edited=\"vw.edited.value\"\n :has-draft=\"vw.hasDraft\"\n :default-id=\"pref.prefs.defaultViewId\"\n :can-save=\"!!ctx.viewsAdapter\"\n :can-write=\"vw.writable(vw.active.value)\"\n :sheet=\"phone\"\n @select=\"vw.select\"\n @save-changes=\"vw.saveChanges()\"\n @save-as=\"openSaveAs()\"\n @discard=\"vw.discard()\"\n @new=\"openSaveAs()\"\n @rename=\"openRename\"\n @duplicate=\"openSaveAs\"\n @set-default=\"(id) => pref.set({ defaultViewId: id })\"\n @delete=\"(v) => (confirmDelete = v)\"\n />\n </template>\n <template #filter=\"{ iconOnly, phone: p }\">\n <button\n v-if=\"p\"\n type=\"button\"\n class=\"dt-btn dt-btn-icon dt-filter-trigger\"\n :class=\"{ 'is-active': filters.length }\"\n :aria-label=\"i18n.t('toolbar.filter')\"\n @click=\"filtersSheet?.show()\"\n >\n <PhFunnel :size=\"20\" aria-hidden=\"true\" />\n <span v-if=\"filters.length\" class=\"dt-counter\">{{ filters.length }}</span>\n </button>\n <ColumnPicker v-else v-model:open=\"pickerOpen\" :columns=\"columns\" :chips=\"chips\" @pick=\"pick\">\n <template #trigger>\n <button\n type=\"button\"\n class=\"dt-btn has-icon dt-filter-trigger\"\n :class=\"{ 'is-active': filters.length, 'dt-btn-icon': iconOnly && !filters.length }\"\n :aria-label=\"iconOnly ? i18n.t('toolbar.filter') : undefined\"\n >\n <PhFunnel :size=\"16\" aria-hidden=\"true\" />\n <span v-if=\"!iconOnly\">{{ i18n.t('toolbar.filter') }}</span>\n <span v-if=\"filters.length\" class=\"dt-counter\">{{ filters.length }}</span>\n </button>\n </template>\n </ColumnPicker>\n </template>\n <template #display=\"{ iconOnly }\">\n <DisplayPopover\n v-bind=\"displayProps\"\n :icon-only=\"iconOnly\"\n v-on=\"displayOn\"\n @update:vertical-lines=\"(on) => pref.set({ verticalLines: on })\"\n />\n </template>\n <template #more=\"{ phone: p }\">\n <PhoneMoreSheet\n v-if=\"p\"\n v-bind=\"more\"\n :density=\"density\"\n :columns=\"layout.panel.value\"\n :counts=\"layout.counts.value\"\n :sort=\"sort\"\n :persistent=\"pref.persistent\"\n :auto-refresh-on=\"autoRefreshOn\"\n v-on=\"displayOn\"\n @update:auto-refresh-on=\"(v) => (autoRefreshOn = v)\"\n @refresh=\"req.refresh()\"\n @export=\"onExport\"\n @import=\"emit('import')\"\n @print=\"onPrint\"\n />\n <MoreMenu\n v-else\n v-bind=\"more\"\n :auto-refresh-on=\"autoRefreshOn\"\n @update:auto-refresh-on=\"(v) => (autoRefreshOn = v)\"\n @refresh=\"req.refresh()\"\n @export=\"onExport\"\n @import=\"emit('import')\"\n @print=\"onPrint\"\n />\n </template>\n <template v-if=\"$slots['toolbar-end']\" #end=\"{ compact }\">\n <slot name=\"toolbar-end\" :compact=\"compact\" />\n </template>\n </Toolbar>\n\n <FilterBar\n v-if=\"chips.length\"\n :chips=\"chips\"\n :defs=\"defs\"\n :editing=\"editing\"\n :rows=\"rows\"\n :labels=\"labels\"\n :summary-of=\"summaryOf\"\n :currencies-of=\"currenciesOf\"\n :phone=\"phone\"\n @open=\"(c) => filtersSheet?.show(c)\"\n @update:chip=\"updateChip\"\n @remove=\"removeChip\"\n @update:editing=\"setEditing\"\n @clear-all=\"clearFilters\"\n >\n <template #add>\n <ColumnPicker :columns=\"columns\" :chips=\"chips\" @pick=\"pick\">\n <template #trigger>\n <button type=\"button\" class=\"dt-btn dt-btn-ghost dt-btn-sm has-icon dt-filter-add dt-filter-trigger\">\n <PhPlus :size=\"14\" aria-hidden=\"true\" />\n {{ i18n.t('filter.addFilter') }}\n </button>\n </template>\n </ColumnPicker>\n </template>\n </FilterBar>\n\n <FiltersSheet\n v-if=\"phone && hasFilter\"\n ref=\"filtersSheet\"\n :columns=\"columns\"\n :chips=\"chips\"\n :sort=\"sort\"\n :rows=\"rows\"\n :labels=\"labels\"\n :summary-of=\"summaryOf\"\n :currencies-of=\"currenciesOf\"\n @apply=\"applySheet\"\n />\n\n <div v-if=\"req.errorKind.value === 'stale' && req.updatedAt.value\" class=\"dt-strip\" role=\"status\">\n <PhWarning :size=\"16\" aria-hidden=\"true\" />\n <span>{{ i18n.t('state.stale', { time: clock(req.updatedAt.value) }) }}</span>\n <button type=\"button\" class=\"dt-strip-action\" :disabled=\"pending\" @click=\"req.retry()\">\n {{ i18n.t('common.retry') }}\n </button>\n </div>\n\n <GridRoot\n ref=\"grid\"\n :layout=\"layout\"\n :rows=\"rowsShown\"\n :density=\"density\"\n :label=\"ariaLabel\"\n :loading=\"pending || !!loading\"\n :skeleton=\"skeleton\"\n :dim=\"dim\"\n :refreshing=\"refreshBar\"\n :vertical-lines=\"pref.prefs.verticalLines\"\n :row-count=\"total ?? -1\"\n :row-index-offset=\"(footerPage.number - 1) * footerPage.size\"\n :sort=\"sortMap\"\n :filtered-columns=\"filteredColumns\"\n :labels=\"labels\"\n sortable\n :selectable=\"selectable\"\n :selection=\"rowSelection\"\n :expandable=\"expandOn\"\n :expanded=\"expanded\"\n :can-expand=\"canExpandFn\"\n :row-menu=\"rowMenu\"\n :row-actions=\"rowActions\"\n :row-error=\"rowError\"\n :primary-href=\"primaryHref\"\n :primary-label=\"primaryLabel\"\n :primary-header=\"primaryDef?.header\"\n :phone=\"phone\"\n @header-filter=\"pick\"\n @row-click=\"(row, e) => onRowClick(row as Row, e)\"\n @row-open=\"(row, e) => onRowOpen(row as Row, e)\"\n @select-rows=\"selectRows\"\n @select-page=\"list.toggleAllPage\"\n @toggle-expand=\"toggleExpand\"\n @copy-id=\"(row) => copyId(row as Row)\"\n @sort=\"onSort\"\n @sort-set=\"onSortSet\"\n >\n <template v-if=\"req.stillLoading.value\" #notice>\n <PhCircleNotch :size=\"14\" class=\"dt-spin\" aria-hidden=\"true\" />\n {{ i18n.t('state.stillLoading') }}\n </template>\n <template v-if=\"bodyState\" #state>\n <StateMessage\n v-if=\"bodyState === 'error'\"\n kind=\"error\"\n :title=\"i18n.t('state.errorTitle', { entity })\"\n :lines=\"[errorInfo.message, i18n.t('state.errorKept')].filter((l): l is string => !!l)\"\n >\n <button v-if=\"listens('onRequest')\" type=\"button\" class=\"dt-btn\" :disabled=\"pending\" @click=\"req.retry()\">\n {{ i18n.t('state.tryAgain') }}\n </button>\n <template v-if=\"errorInfo.id\" #after>\n <div class=\"dt-state-id\">\n <button type=\"button\" class=\"dt-btn dt-btn-ghost dt-btn-xs\" @click=\"copyErrorId\">\n {{ i18n.t('state.copyErrorId') }}\n </button>\n <code class=\"dt-state-code\">{{ errorInfo.id }}</code>\n </div>\n </template>\n </StateMessage>\n <StateMessage\n v-else-if=\"bodyState === 'noResults'\"\n :kind=\"search ? 'noResultsSearch' : 'noResults'\"\n :title=\"noResultsTitle\"\n >\n <button v-if=\"filters.length === 1\" type=\"button\" class=\"dt-btn\" @click=\"removeChip(filters[0]!.column)\">\n {{ i18n.t('state.removeFilter', { column: headerOf(filters[0]!.column) }) }}\n </button>\n <button v-else-if=\"filters.length\" type=\"button\" class=\"dt-btn\" @click=\"clearFilters\">\n {{ i18n.t('state.clearAllFilters') }}\n </button>\n <button v-if=\"search\" type=\"button\" class=\"dt-btn\" @click=\"setSearch('')\">\n {{ i18n.t('state.clearSearch') }}\n </button>\n </StateMessage>\n <StateMessage v-else-if=\"bodyState === 'noRowsOnPage'\" kind=\"noRowsOnPage\" :title=\"i18n.t('page.noneOnPage')\">\n <button type=\"button\" class=\"dt-btn\" @click=\"goTo(page.number - 1)\">{{ i18n.t('page.previousPage') }}</button>\n </StateMessage>\n <template v-else>\n <slot name=\"empty\">\n <StateMessage kind=\"empty\" :title=\"i18n.t('state.emptyTitle', { entity })\" />\n </slot>\n </template>\n </template>\n <template v-if=\"$slots.expanded\" #expanded=\"{ row, close }\">\n <slot name=\"expanded\" :row=\"row as Row\" :close=\"close\" />\n </template>\n </GridRoot>\n <BulkBar\n v-if=\"selectionBar === 'floating' && selectedRows.length\"\n variant=\"floating\"\n :phone=\"phone\"\n :rows=\"selectedRows\"\n :actions=\"bulkActions ?? []\"\n @clear=\"clearSelection\"\n >\n <slot v-if=\"$slots['selection-actions']\" name=\"selection-actions\" :rows=\"selectedRows\" :clear=\"clearSelection\" />\n </BulkBar>\n <div\n v-if=\"toast\"\n class=\"dt-toast\"\n :class=\"{ 'is-raised': selectionBar === 'floating' && selectedRows.length }\"\n role=\"status\"\n >\n <PhCheck :size=\"16\" aria-hidden=\"true\" />\n {{ toast }}\n </div>\n\n <Footer\n :row-count=\"footerRows\"\n :page=\"footerPage\"\n :has-more=\"footerHasMore\"\n :total=\"total\"\n :countable=\"isServer && countable && listens('onCount')\"\n :counting=\"counting\"\n :counted-at=\"countedAt\"\n :busy=\"busy\"\n :first-load=\"skeleton && !hasRows\"\n :empty=\"bodyState === 'empty'\"\n :page-sizes=\"pageSizes\"\n :updated-at=\"listens('onRequest') ? req.updatedAt.value : null\"\n :freshness=\"freshness\"\n :can-refresh=\"listens('onRequest')\"\n :phone=\"phone\"\n @count=\"count\"\n @page=\"goTo\"\n @page-size=\"setPageSize\"\n @refresh=\"req.refresh()\"\n />\n <span class=\"dt-sr-only\" aria-live=\"polite\">{{ polite }}</span>\n <span class=\"dt-sr-only\" aria-live=\"assertive\">{{ assertive }}</span>\n <div\n v-show=\"tooltip.open.value\"\n class=\"dt-tip\"\n :class=\"{ 'is-multi': tooltip.text.value.includes('\\n') }\"\n role=\"tooltip\"\n :style=\"tooltip.style.value\"\n >\n {{ tooltip.text.value }}\n </div>\n <ViewDialog\n v-if=\"viewDialog\"\n v-model:open=\"viewDialogOpen\"\n :mode=\"viewDialog.mode\"\n :name=\"viewDialog.name\"\n :summary=\"viewDialog.summary\"\n :validate=\"validateViewName\"\n @save=\"onViewDialogSave\"\n />\n <ConfirmDialog\n :open=\"!!confirmDelete\"\n :title=\"i18n.t('views.delete.title', { name: confirmDelete?.name ?? '' })\"\n :body=\"i18n.t('views.delete.body')\"\n :confirm-label=\"i18n.t('views.delete')\"\n danger\n @update:open=\"(o) => !o && (confirmDelete = null)\"\n @confirm=\"removeView\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"Row extends object\">\n// DataTable (05) — Faz 2–3b: toolbar, ızgara, footer, durumlar, veri akışı (`@request`), sıralama, sayfalama, sütun yönetimi,\n// tercihler, filtreler, görünümler. Paket veri çekmez (D18): sorguyu yayar, `rows`/`hasMore`/`loading`/`error` alır.\n// Seçim ve satır menüsü Faz 4.\nimport { PhCheck, PhCircleNotch, PhFunnel, PhPlus, PhWarning } from '@phosphor-icons/vue'\nimport {\n computed,\n defineAsyncComponent,\n getCurrentInstance,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n watch,\n} from 'vue'\nimport { optionLabel } from '../core/cells/format'\nimport { RemoteLabels } from '../core/cells/remoteLabels'\nimport { TYPE_SPECS } from '../core/cells/specs'\nimport { readPath } from '../core/columns/readPath'\nimport { useColumnLayout } from '../core/columns/useColumnLayout'\nimport ColumnPicker from '../core/filters/ColumnPicker.vue'\nimport FilterBar from '../core/filters/FilterBar.vue'\nimport { defaultOperator, isComplete, summarize, toCondition, type Chip, type Summary } from '../core/filters/model'\nimport { getFormat } from '../core/format'\nimport GridRoot from '../core/grid/GridRoot.vue'\nimport { useDelegatedTooltip } from '../core/grid/useDelegatedTooltip'\nimport { isTextInput } from '../core/interaction/isInteractive'\nimport { useDataTableContext } from '../core/plugin'\nimport { usePreferences } from '../core/preferences/usePreferences'\nimport StateMessage from '../core/states/StateMessage.vue'\nimport DisplayPopover from '../core/toolbar/DisplayPopover.vue'\nimport MoreMenu from '../core/toolbar/MoreMenu.vue'\nimport Toolbar from '../core/toolbar/Toolbar.vue'\nimport ConfirmDialog from '../core/ui/ConfirmDialog.vue'\nimport { nameError, type NameError } from '../core/views/model'\nimport { useViews } from '../core/views/useViews'\nimport ViewDialog from '../core/views/ViewDialog.vue'\nimport ViewMenu from '../core/views/ViewMenu.vue'\nimport type {\n BulkAction,\n ColumnDef,\n Density,\n ExpandOptions,\n Plural,\n RowAction,\n RowClickMode,\n TableId,\n View,\n ViewPatch,\n ViewState,\n} from '../types'\nimport type {\n CountRequest,\n FilterCondition,\n QueryWithoutPage,\n SortRule,\n TableError,\n TableQuery,\n TableRequest,\n} from '../types/query'\nimport BulkBar from './BulkBar.vue'\nimport Footer from './footer/Footer.vue'\nimport { isSearchable, useListTable } from './useListTable'\nimport { useRequest } from './useRequest'\n\n// Telefon alt sayfaları yalnızca telefonda yüklenir: çekirdek paket boyutu (10 · ≤ 60 kB).\nconst FiltersSheet = defineAsyncComponent(() => import('../core/filters/FiltersSheet.vue'))\nconst PhoneMoreSheet = defineAsyncComponent(() => import('../core/toolbar/PhoneMoreSheet.vue'))\n\nconst props = withDefaults(\n defineProps<{\n tableId: TableId\n columns: Array<ColumnDef<Row>>\n rows: Row[]\n rowKey?: string\n /** Verilmezse tercihten (Display › Density), o da yoksa standard. */\n density?: Density\n entityName?: Plural\n /** Tek harfli kısayollar (/, F, R). Oklar, Enter, Space, Esc ve Alt←/→ her zaman. */\n shortcuts?: boolean\n /** client: tüm satırlar verilir, arama/sıralama/sayfalama yerelde. server: `@request` ile uygulama çeker. */\n mode?: 'client' | 'server'\n loading?: boolean\n error?: TableError\n /** Sunucu modu: sonraki sayfa var mı (Laravel `next_page_url !== null`). */\n hasMore?: boolean\n /** Biliniyorsa toplam; istemci modunda otomatik. */\n total?: number\n /** Sunucu modu: footer'da \"Count total\" → `@count`. */\n countable?: boolean\n /** Her talepte `query.fields`'e eklenecek ek alanlar. */\n fields?: string[]\n /** Yeni görünen sütunun yolu son talepte yoksa `reason: 'columns'` talebi (400 ms birleştirme). */\n requestOnColumnChange?: boolean\n /** auto: yapılandırılana göre yuvalar; minimal: yalnızca arama + `#toolbar-end`; false: toolbar yok. */\n toolbar?: 'auto' | 'minimal' | false\n searchPlaceholder?: string\n /** Varsayılan 100; tercih varsa o. */\n pageSize?: number\n pageSizes?: number[]\n /** Saniye. Verilmezse More menüsünde Auto-refresh görünmez. */\n autoRefresh?: number\n /** Kodla tanımlı görünümler (kind: 'system'); adapter'daki kişisel görünümlerle birleştirilir (04 §7). */\n views?: View[]\n /** Seçim sütunu; seçim sayfa kapsamlıdır (D19). */\n selectable?: boolean\n /** Seçim çubuğu: yüzer (varsayılan) ya da toolbar'ın yerine. */\n selectionBar?: 'floating' | 'toolbar'\n bulkActions?: Array<BulkAction<Row>>\n /** Satır menüsü (⋯, sağ tık, ⇧F10): Open / Copy yerleşik + bunlar. */\n rowActions?: Array<RowAction<Row>>\n /** Satır gövdesine tıklama (D6). Varsayılan 'none'. */\n rowClick?: RowClickMode\n expand?: boolean | ExpandOptions<Row>\n /** Satır hatası (D35): metin/metin listesi → `--dt-r-bg` + ⋯ hücresinde uyarı ikonu + satırda tooltip. Harita uygulamanın. */\n rowError?: (row: Row) => string | string[] | null | undefined\n }>(),\n {\n rowKey: 'id',\n shortcuts: true,\n mode: 'client',\n countable: false,\n requestOnColumnChange: true,\n toolbar: 'auto',\n pageSize: 100,\n pageSizes: () => [50, 100, 250, 500],\n views: () => [],\n selectable: false,\n selectionBar: 'floating',\n rowClick: 'none',\n expand: false,\n },\n)\nconst emit = defineEmits<{\n /** Sunucu modunda her talep; istemci modunda yalnızca `refresh()`. */\n request: [request: TableRequest]\n count: [request: CountRequest]\n /** Etkileşimli hedef, metin seçimi ve değiştirici tuş dışındaki satır tıklamaları (`rowClick`'ten bağımsız). */\n 'row-click': [payload: { row: Row; event: MouseEvent }]\n /** Birincil linke düz sol tık, satırda ↵, menüde Open, `row-click=\"open\"`. Paket preventDefault yapmaz (05 §7). */\n 'row-open': [payload: { row: Row; href: string; event: MouseEvent }]\n /** Seçim her değiştiğinde; sayfa kapsamlı yüklü satırlar (D19). */\n 'selection-change': [rows: Row[]]\n export: [payload: { format: 'csv' | 'xlsx'; query: QueryWithoutPage; selection: Row[]; visibleColumns: string[] }]\n import: []\n print: [payload: { query: QueryWithoutPage; visibleColumns: string[] }]\n 'view-change': [payload: { id: string; kind: View['kind'] }]\n}>()\ndefineSlots<{\n empty?: () => unknown\n 'toolbar-end'?: (props: { compact: boolean }) => unknown\n /** Satır detayı; veriyi slot bileşeni çeker (05 §7). */\n expanded?: (props: { row: Row; close: () => void }) => unknown\n /** bulkActions yerine özel seçim çubuğu içeriği. */\n 'selection-actions'?: (props: { rows: Row[]; clear: () => void }) => unknown\n}>()\n\nconst ctx = useDataTableContext()\nconst { i18n } = ctx\n// Toolbar yuvaları ve Retry yalnızca uygulama ilgili olayı dinliyorsa (05 §3, §10).\nconst vnodeProps = getCurrentInstance()?.vnode.props ?? {}\nconst listens = (name: string) => name in vnodeProps\nconst isServer = computed(() => props.mode === 'server')\nif (import.meta.env?.DEV && props.mode === 'server' && !listens('onRequest'))\n console.warn(`[data-table] \"${props.tableId}\": mode=\"server\" ama @request dinleyicisi yok; satırlar hiç gelmeyecek.`)\n\nconst entity = computed<Plural>(() => props.entityName ?? { one: props.tableId, other: props.tableId })\nconst ariaLabel = computed(() => entity.value.other)\n\n// Telefon düzeni (05 §11, handoff 04): kartın kendi genişliği < 640 → is-phone; Toolbar daralma eşikleri de buradan (ResizeObserver).\nconst rootEl = ref<HTMLElement | null>(null)\nconst width = ref(1440)\nconst size = computed(() => (width.value >= 1024 ? 'full' : width.value >= 640 ? 'narrow' : 'phone'))\nconst phone = computed(() => size.value === 'phone')\nlet ro: ResizeObserver | undefined\nonMounted(() => {\n const measure = () => (width.value = rootEl.value?.clientWidth || 1440)\n measure()\n if (typeof ResizeObserver !== 'undefined' && rootEl.value) {\n ro = new ResizeObserver(measure)\n ro.observe(rootEl.value)\n }\n})\n\n// Tercihler (05 §9): yoğunluk, dikey çizgiler, sayfa boyutu; adapter yoksa oturumluk.\nconst pref = usePreferences(() => props.tableId, ctx.preferences, {\n density: 'standard',\n verticalLines: false,\n pageSize: props.pageSize,\n defaultViewId: null,\n})\nconst density = computed<Density>(() => props.density ?? pref.prefs.density)\n\nconst layout = useColumnLayout<Row>({\n columns: () => props.columns,\n rows: () => props.rows,\n rowKey: () => props.rowKey,\n phone: () => phone.value,\n})\n\n// Sorgu durumu. Arama/sıralama değişince sayfa 1 (aynı tick → tek talep).\nconst search = ref('')\nconst sort = ref<SortRule[]>([])\nconst page = ref({ number: 1, size: pref.prefs.pageSize })\nconst goTo = (number: number) => (page.value = { ...page.value, number })\nconst setSearch = (value: string) => {\n if (value === search.value) return\n search.value = value\n goTo(1)\n}\nwatch(\n () => pref.prefs.pageSize,\n (size) => (page.value = { number: 1, size }),\n)\n\n// Filtreler (04): çipler ekranda; yalnızca tam olanlar sorguya girer (D2: sütun başına tek çip).\nconst chips = ref<Chip[]>([])\nconst editing = ref<string | null>(null)\nconst pickerOpen = ref(false)\nconst labels = new RemoteLabels()\nconst fmt = getFormat(ctx.locale)\nconst defs = computed(() => new Map(props.columns.map((c) => [c.id as string, c as ColumnDef])))\nconst typeOf = (column: string) => defs.value.get(column)?.type ?? 'string'\nconst filters = computed<FilterCondition[]>(() =>\n chips.value.filter((c) => isComplete(c, typeOf(c.column))).map(toCondition),\n)\nconst filteredColumns = computed(() => new Set(filters.value.map((f) => f.column)))\nconst hasFilter = computed(\n () => props.toolbar === 'auto' && props.columns.some((c) => c.filterable ?? TYPE_SPECS[c.type].filterable),\n)\nconst labelOf = (def: ColumnDef) => (v: string | number) => {\n if (def.type === 'select' || def.type === 'multiselect' || (def.type === 'user' && def.options))\n return optionLabel(def.options, v)\n if ((def.type === 'user' || def.type === 'ajax') && def.remote) return labels.label(def.id as string, def.remote, v)\n return String(v)\n}\nconst summaryOf = (chip: Chip): Summary => {\n const def = defs.value.get(chip.column)!\n return summarize(chip, def, { i18n, fmt, labelOf: labelOf(def) })\n}\nconst currenciesOf = (def: ColumnDef): string[] => {\n if (def.type !== 'currency') return []\n if (typeof def.currency === 'string') return [def.currency]\n return [...new Set(props.rows.map((r) => (def.currency as (row: Row) => string)(r)))]\n}\n/** Picker / header: var olan çipi açar, yoksa tipin varsayılan operatörüyle oluşturup editörünü açar; boolean doğrudan uygulanır. */\nconst pick = (column: string) => {\n const def = defs.value.get(column)\n if (!def) return\n if (phone.value) {\n filtersSheet.value?.show(column)\n return\n }\n if (!chips.value.some((c) => c.column === column)) {\n const op = defaultOperator(def)\n chips.value = [...chips.value, def.type === 'boolean' ? { column, op, value: true } : { column, op }]\n if (def.type === 'boolean') return\n }\n editing.value = column\n}\nconst updateChip = (chip: Chip) => (chips.value = chips.value.map((c) => (c.column === chip.column ? chip : c)))\nconst removeChip = (column: string) => {\n chips.value = chips.value.filter((c) => c.column !== column)\n if (editing.value === column) editing.value = null\n}\n/** Editör değer seçilmeden kapanırsa çip kaldırılır (04 §1). */\nconst setEditing = (column: string | null) => {\n const prev = editing.value\n editing.value = column\n if (prev && prev !== column) {\n const c = chips.value.find((x) => x.column === prev)\n if (c && !isComplete(c, typeOf(prev))) removeChip(prev)\n }\n}\nconst clearFilters = () => {\n chips.value = []\n editing.value = null\n}\n/** Telefon Filters sayfası (04 §9): çipler ve sıralama Show results'la tek adımda uygulanır. */\nconst filtersSheet = ref<{ show: (column?: string) => void } | null>(null)\nconst applySheet = (next: Chip[], s: SortRule[]) => {\n chips.value = next\n editing.value = null\n sort.value = s\n goTo(1)\n}\n\nconst visibleColumns = computed(() => layout.columns.value.map((c) => c.id))\nconst fields = computed(() => {\n const out = new Set<string>([props.rowKey])\n for (const c of layout.columns.value) {\n if (!c.def.accessor) out.add(c.id)\n for (const f of c.def.fields ?? []) out.add(f)\n }\n for (const f of props.fields ?? []) out.add(f)\n return [...out]\n})\nconst query = computed<TableQuery>(() => ({\n search: search.value,\n filters: filters.value,\n sort: sort.value,\n page: page.value,\n columns: visibleColumns.value,\n fields: fields.value,\n}))\nconst queryWithoutPage = (): QueryWithoutPage => {\n const { search, filters, sort, columns, fields } = query.value\n return { search, filters, sort, columns, fields }\n}\n\n// Ekran okuyucu bölgeleri (08 §5); görünüm/filtre/sıralama duyuruları buraya yazar.\nconst polite = ref('')\nconst assertive = ref('')\n\n// Görünümler (04 §7, D4, D5): görünüm = filtre + sıralama + sütun düzeni; uygulama tek adımda (aynı tick) → tek talep.\nconst current = (): ViewState => ({ filters: filters.value, sort: sort.value, columns: layout.state.value })\nconst applyView = (p: ViewPatch) => {\n chips.value = (p.filters ?? []).map((f) => ({ ...f }))\n editing.value = null\n sort.value = p.sort ?? []\n layout.apply(p.columns)\n goTo(1)\n}\nconst vw = useViews({\n tableId: () => props.tableId,\n system: () => props.views,\n adapter: ctx.viewsAdapter,\n locale: () => ctx.locale,\n defaultViewId: () => pref.prefs.defaultViewId,\n setDefaultViewId: (id) => pref.set({ defaultViewId: id }),\n prefsReady: pref.ready,\n current,\n apply: applyView,\n onChange: (v) => {\n emit('view-change', { id: v.id, kind: v.kind })\n polite.value = i18n.t('sr.view', { name: v.name })\n },\n})\nconst viewMenuOpen = ref(false)\nconst viewSummary = (s: ViewState) => {\n const first = s.sort[0]\n const more = s.sort.length > 1 ? ` +${s.sort.length - 1}` : ''\n const pinned = [...s.columns.pinned.left, ...s.columns.pinned.right].map(headerOf).join(', ')\n return {\n filters: s.filters.map((f) => headerOf(f.column)).join(' · ') || i18n.t('common.empty'),\n sort: first ? `${headerOf(first.column)} ${first.dir === 'asc' ? '↑' : '↓'}${more}` : i18n.t('common.empty'),\n columns: [\n i18n.t('views.columnsSummary', { shown: s.columns.visible.length, total: props.columns.length }),\n ...(pinned ? [i18n.t('views.pinnedSummary', { name: pinned })] : []),\n ].join(' · '),\n }\n}\nconst resolveState = (v: View): ViewState => ({\n filters: v.state.filters ?? [],\n sort: v.state.sort ?? [],\n columns: layout.resolve(v.state.columns),\n})\ninterface ViewDialogState {\n mode: 'create' | 'rename'\n name: string\n state: ViewState\n summary: ReturnType<typeof viewSummary> | null\n view?: View\n /** Mevcut düzenleme yeni görünüme taşınır (Save as new / New view); Duplicate'te aktif görünümün taslağı kalır. */\n fromCurrent: boolean\n}\nconst viewDialog = ref<ViewDialogState | null>(null)\nconst viewDialogOpen = computed({\n get: () => !!viewDialog.value,\n set: (o: boolean) => {\n if (!o) viewDialog.value = null\n },\n})\nconst confirmDelete = ref<View | null>(null)\n/** Save as new view / Save as my view / New view: mevcut durum, ad boş. Duplicate: kaynağın kayıtlı durumu, \"{ad} copy\". */\nconst openSaveAs = (view?: View) => {\n const state = view ? resolveState(view) : current()\n viewDialog.value = {\n mode: 'create',\n name: view ? i18n.t('views.copyName', { name: view.name }) : '',\n state,\n summary: viewSummary(state),\n view,\n fromCurrent: !view,\n }\n}\nconst openRename = (view: View) =>\n (viewDialog.value = { mode: 'rename', name: view.name, state: current(), summary: null, view, fromCurrent: false })\nconst validateViewName = (name: string): NameError | null => {\n const d = viewDialog.value\n return nameError(name, vw.all.value, ctx.locale, d?.mode === 'rename' ? d.view?.id : undefined)\n}\nconst onViewDialogSave = (input: { name: string; makeDefault: boolean }) => {\n const d = viewDialog.value\n if (!d) return\n if (d.mode === 'rename' && d.view) void vw.rename(d.view.id, input.name)\n else\n void vw.create({\n name: input.name,\n state: d.state,\n makeDefault: input.makeDefault,\n fromCurrent: d.fromCurrent,\n })\n}\nconst removeView = () => {\n const v = confirmDelete.value\n if (v) void vw.remove(v.id)\n}\n\n// Seçim ve expand (05 §6–7): durum TanStack'te (D23); seçim sayfa kapsamlı (D19), expand anahtarla (refresh'te açık kalır).\nconst rowSelection = ref<Record<string, true>>({})\nconst expanded = ref<Record<string, boolean>>({})\nconst expandOn = computed(() => !!props.expand)\nconst canExpandFn = computed(() => (typeof props.expand === 'object' ? props.expand.canExpand : undefined))\nconst list = useListTable<Row>({\n columns: () => props.columns,\n rows: () => props.rows,\n rowKey: () => props.rowKey,\n mode: () => props.mode,\n locale: ctx.locale,\n sort,\n filters,\n page,\n search,\n hasMore: () => props.hasMore,\n selectable: () => props.selectable,\n rowSelection,\n expanded,\n canExpand: () => canExpandFn.value,\n})\nconst req = useRequest<Row>({\n mode: () => props.mode,\n hasListener: listens('onRequest'),\n query: () => query.value,\n rows: () => props.rows,\n hasMore: () => props.hasMore,\n loading: () => props.loading,\n error: () => props.error,\n requestOnColumnChange: () => props.requestOnColumnChange,\n emit: (r) => emit('request', r),\n})\n\n// Sıralama (04 §6): tık asc → desc → kapalı; ⇧ ikincil (en fazla 3); menüden yön.\nconst onSort = (id: string, additive: boolean) => {\n list.toggleSort(id, additive)\n goTo(1)\n}\nconst onSortSet = (id: string, dir: 'asc' | 'desc' | null) => {\n list.setSort(id, dir)\n goTo(1)\n}\nconst sortMap = computed(\n () => new Map(sort.value.map((s, i) => [s.column, { dir: s.dir, index: sort.value.length > 1 ? i + 1 : null }])),\n)\nconst headerOf = (id: string) => props.columns.find((c) => c.id === id)?.header ?? id\n\n// Durumlar (05 §10): üç girdi — pending/sebep, satır var mı, hata.\nconst reason = req.reason\nconst pending = req.pending\nconst rowsShown = computed<Row[]>(() => (req.errorKind.value === 'error' ? [] : list.rows.value))\nconst hasRows = computed(() => rowsShown.value.length > 0)\nconst identityChange = computed(() => pending.value && (reason.value === 'query' || reason.value === 'page'))\nconst dim = computed(() => identityChange.value && hasRows.value)\nconst slow = ref(false)\nlet slowTimer: ReturnType<typeof setTimeout> | undefined\nwatch(dim, (on) => {\n clearTimeout(slowTimer)\n slow.value = false\n if (on) slowTimer = setTimeout(() => (slow.value = true), 400)\n})\nconst skeleton = computed(\n () => (pending.value && !hasRows.value) || (!!props.loading && !hasRows.value && !props.error) || slow.value,\n)\nconst refreshing = computed(\n () =>\n (pending.value && (reason.value === 'refresh' || reason.value === 'columns')) ||\n (!!props.loading && hasRows.value && !identityChange.value),\n)\nconst refreshBar = ref(false)\nlet barTimer: ReturnType<typeof setTimeout> | undefined\nwatch(refreshing, (on) => {\n clearTimeout(barTimer)\n refreshBar.value = false\n if (on) barTimer = setTimeout(() => (refreshBar.value = true), 150)\n})\nconst busy = computed(() => identityChange.value || (skeleton.value && !hasRows.value))\nconst bodyState = computed<'error' | 'noResults' | 'noRowsOnPage' | 'empty' | null>(() => {\n if (skeleton.value || hasRows.value || pending.value) return null\n if (req.errorKind.value === 'error') return 'error'\n if (search.value || filters.value.length) return 'noResults'\n if (page.value.number > 1) return 'noRowsOnPage'\n return 'empty'\n})\nconst errorInfo = computed(() => {\n const e = props.error\n return typeof e === 'object' && e ? e : typeof e === 'string' ? { message: e } : {}\n})\nconst noResultsTitle = computed(() => {\n const count = filters.value.length\n const params = { entity: entity.value, q: search.value, count }\n if (search.value && count) return i18n.t('state.noResultsBoth', params)\n if (search.value) return i18n.t('state.noResultsSearch', params)\n return i18n.t('state.noResults', params)\n})\nconst clock = (d: Date) => d.toLocaleTimeString(ctx.locale, { hour: '2-digit', minute: '2-digit' })\n\n// Footer yalnızca snapshot'tan okur (05 §8); istemci modunda satır modeli zaten yerel.\nconst snap = req.snapshot\nconst footerRows = computed(() =>\n req.errorKind.value === 'error' ? 0 : isServer.value ? (snap.value?.rows.length ?? 0) : list.rows.value.length,\n)\nconst footerPage = computed(() => (isServer.value ? (snap.value?.page ?? page.value) : page.value))\nconst footerHasMore = computed(() => (isServer.value ? (snap.value?.hasMore ?? false) : list.canNext.value))\nconst total = computed(() => (isServer.value ? props.total : list.total.value))\n\n// Count total → @count; sonuç sorgu değişene kadar geçerli.\nlet countCtl: AbortController | null = null\nconst counting = ref(false)\nconst countedAt = ref<Date | null>(null)\nconst count = () => {\n countCtl?.abort()\n countCtl = new AbortController()\n counting.value = true\n emit('count', { query: queryWithoutPage(), signal: countCtl.signal })\n}\nwatch(\n () => props.total,\n (t) => {\n if (t === undefined) return\n counting.value = false\n countedAt.value = isServer.value ? new Date() : null\n polite.value = i18n.t('sr.total', { count: fmt.int(t), entity: entity.value })\n },\n)\nwatch(\n () => JSON.stringify([search.value, sort.value, filters.value]),\n () => {\n countCtl?.abort()\n counting.value = false\n countedAt.value = null\n },\n)\n\n// Sayfa değişince gövde başa kayar (05 §8).\nconst grid = ref<InstanceType<typeof GridRoot> | null>(null)\nwatch(\n () => page.value.number,\n () => grid.value?.scrollToTop(),\n)\nconst setPageSize = (size: number) => pref.set({ pageSize: size })\n// Her filtre değişikliğinde sayfa 1, gövde başa (04 §3); ekran okuyucuya eklenen/kaldırılan filtre (08 §5).\nwatch(\n () => JSON.stringify(filters.value),\n (now, before) => {\n goTo(1)\n grid.value?.scrollToTop()\n const prev = new Map((JSON.parse(before) as FilterCondition[]).map((f) => [f.column, JSON.stringify(f)]))\n const next = new Map((JSON.parse(now) as FilterCondition[]).map((f) => [f.column, JSON.stringify(f)]))\n for (const [column, key] of next)\n if (prev.get(column) !== key) {\n const chip = chips.value.find((c) => c.column === column)\n if (chip) {\n const sm = summaryOf(chip)\n polite.value = i18n.t('sr.filterAdded', { summary: `${headerOf(column)} ${sm.text}`.trim() })\n }\n }\n for (const column of prev.keys())\n if (!next.has(column)) polite.value = i18n.t('sr.filterRemoved', { column: headerOf(column) })\n },\n)\n\n// Auto-refresh (05 §3): açıkken footer \"Live\".\nconst autoRefreshOn = ref(false)\nlet autoTimer: ReturnType<typeof setInterval> | undefined\nwatch(autoRefreshOn, (on) => {\n clearInterval(autoTimer)\n if (on && props.autoRefresh) autoTimer = setInterval(() => req.refresh(), props.autoRefresh * 1000)\n})\nconst freshness = computed<'normal' | 'refreshing' | 'stale' | 'live'>(() =>\n autoRefreshOn.value ? 'live' : refreshing.value ? 'refreshing' : req.errorKind.value === 'stale' ? 'stale' : 'normal',\n)\n\n// Toolbar yuvaları (05 §3): yalnızca yapılandırılmış olanlar.\nconst hasSearch = computed(() => props.toolbar !== false && props.columns.some(isSearchable))\nconst hasDisplay = computed(() => props.toolbar === 'auto')\nconst more = computed(() => ({\n refresh: listens('onRequest'),\n export: listens('onExport'),\n import: listens('onImport'),\n print: listens('onPrint'),\n autoRefresh: props.autoRefresh !== undefined,\n}))\nconst hasMore = computed(() => props.toolbar === 'auto' && Object.values(more.value).some(Boolean))\nconst searchPlaceholder = computed(() => props.searchPlaceholder ?? i18n.t('toolbar.search', { entity: entity.value }))\nconst toolbarRef = ref<InstanceType<typeof Toolbar> | null>(null)\nconst displayProps = computed(() => ({\n density: density.value,\n verticalLines: pref.prefs.verticalLines,\n columns: layout.panel.value,\n counts: layout.counts.value,\n sort: sort.value,\n persistent: pref.persistent,\n}))\n// v-on nesnesi: anahtarlar olay adı (Vue `on` önekini kendisi ekler).\nconst displayOn = {\n 'update:density': (d: Density) => pref.set({ density: d }),\n 'column-visible': (id: string, visible: boolean) => layout.setVisible(id, visible),\n 'column-move': (id: string, delta: -1 | 1) => layout.move(id, delta),\n 'columns-all': (visible: boolean) => {\n for (const c of layout.panel.value) if (!c.pinned && c.canHide) layout.setVisible(c.id, visible)\n },\n 'columns-reset': () => layout.reset(vw.active.value?.state.columns),\n 'sort-dir': (column: string, dir: 'asc' | 'desc') => {\n sort.value = sort.value.map((s) => (s.column === column ? { column, dir } : s))\n goTo(1)\n },\n 'sort-remove': (column: string) => onSortSet(column, null),\n 'sort-clear': () => {\n sort.value = []\n goTo(1)\n },\n reset: () => pref.reset(),\n}\nconst onExport = (format: 'csv' | 'xlsx') =>\n emit('export', {\n format,\n query: queryWithoutPage(),\n selection: list.selectedRows.value,\n visibleColumns: visibleColumns.value,\n })\n\n// Birincil hücre (D6): link, aria etiketleri ve Copy için metin; ⋯ sütunu birincil sütun ya da rowActions varsa.\nconst primaryDef = computed(() => props.columns.find((c) => c.primary))\nconst primaryHref = (row: Row) => primaryDef.value?.href?.(row)\nconst primaryLabel = (row: Row): string => {\n const d = primaryDef.value\n const v = d ? (d.accessor ? d.accessor(row) : readPath(row, d.id as string)) : readPath(row, props.rowKey)\n return v === null || v === undefined ? '' : String(v)\n}\nconst rowMenu = computed(() => !!props.rowActions?.length || !!primaryDef.value)\nconst selectedRows = list.selectedRows\nconst clearSelection = () => (rowSelection.value = {})\nconst selectRows = (ids: string[], value: boolean) => {\n const next = { ...rowSelection.value }\n for (const id of ids) {\n if (value) next[id] = true\n else delete next[id]\n }\n rowSelection.value = next\n}\n// Sayfa, sayfa boyutu, filtre, arama, sıralama → seçim temizlenir, açıklar kapanır (D19, 05 §7); refresh'te korunur.\nwatch(\n () => JSON.stringify([search.value, filters.value, sort.value, page.value]),\n () => {\n rowSelection.value = {}\n expanded.value = {}\n grid.value?.measure()\n },\n)\n// Yeni veride olmayan anahtarlar süzülür (05 §12).\nwatch(\n () => props.rows,\n (rows) => {\n const ids = new Set(rows.map(list.rowId))\n const keep = (o: Record<string, boolean>) => Object.fromEntries(Object.entries(o).filter(([id]) => ids.has(id)))\n if (Object.keys(rowSelection.value).some((id) => !ids.has(id)))\n rowSelection.value = keep(rowSelection.value) as Record<string, true>\n if (Object.keys(expanded.value).some((id) => !ids.has(id))) expanded.value = keep(expanded.value)\n },\n)\nwatch(selectedRows, (rows) => {\n emit('selection-change', rows)\n if (rows.length) polite.value = i18n.t('selection.selected', { count: rows.length })\n})\nconst toggleExpand = (id: string, value: boolean) => {\n const next = { ...expanded.value }\n if (value) next[id] = true\n else delete next[id]\n expanded.value = next\n if (!value) return\n void nextTick(() => {\n const row = props.rows.find((r) => list.rowId(r) === id)\n const sub = [\n ...((grid.value?.$el as HTMLElement | undefined)?.querySelectorAll<HTMLElement>('.dt-subrow') ?? []),\n ].find((el) => el.id.endsWith(`-sub-${id}`))\n if (row)\n polite.value = i18n.t('sr.expanded', {\n label: primaryLabel(row),\n count: sub ? sub.querySelectorAll('[role=\"row\"], tr').length : 0,\n })\n })\n}\n/** Satır gövdesi (D6): her zaman `row-click`; `rowClick` modu açar ya da detayı açıp kapatır. */\nconst onRowClick = (row: Row, event: MouseEvent) => {\n emit('row-click', { row, event })\n if (props.rowClick === 'open') {\n ;(event.target as Element | null)\n ?.closest('.dt-row')\n ?.querySelector<HTMLElement>('.dt-cell.is-primary a.dt-link')\n ?.click()\n } else if (props.rowClick === 'expand' && expandOn.value && (canExpandFn.value?.(row) ?? true)) {\n const id = list.rowId(row)\n toggleExpand(id, !expanded.value[id])\n }\n}\nconst onRowOpen = (row: Row, event: MouseEvent) => emit('row-open', { row, href: primaryHref(row) ?? '', event })\n// Toast: yalnızca \"Copied\" (handoff 02 §6); bulk aksiyonlar için toast uygulamanındır (D20).\nconst toast = ref<string | null>(null)\nlet toastTimer: ReturnType<typeof setTimeout> | undefined\nconst copyId = (row: Row) => {\n void navigator.clipboard?.writeText(primaryLabel(row))\n toast.value = i18n.t('cell.copied')\n clearTimeout(toastTimer)\n toastTimer = setTimeout(() => (toast.value = null), 2000)\n}\nconst onPrint = () => emit('print', { query: queryWithoutPage(), visibleColumns: visibleColumns.value })\nconst copyErrorId = () => void navigator.clipboard?.writeText(errorInfo.value.id ?? '')\n\n// Kısayollar (08 §3): `/` arama, `F` filtre, `V` görünüm, `R` yenile, `⌘S` görünümü kaydet; Alt←/→ sayfa (her zaman).\n// Kapsam sayfa; tek harfliler odak metin alanındayken kapalı.\nconst onKey = (e: KeyboardEvent) => {\n if (e.defaultPrevented) return\n const target = e.target instanceof Element ? e.target : null\n // Esc sırayla: açık popover/menü/dialog (odak içindedir) → seçim (05 §6); metin alanında aramanın Esc'i.\n if (e.key === 'Escape') {\n const inLayer = !!target?.closest('[role=\"menu\"], [role=\"dialog\"], [role=\"alertdialog\"], [role=\"listbox\"], .dt-pop')\n if (!e.defaultPrevented && !inLayer && selectedRows.value.length && !(target && isTextInput(target)))\n clearSelection()\n return\n }\n if (e.altKey && !e.ctrlKey && !e.metaKey && (e.key === 'ArrowLeft' || e.key === 'ArrowRight')) {\n if (busy.value) return\n const next = e.key === 'ArrowLeft' ? page.value.number - 1 : page.value.number + 1\n if (next >= 1 && (e.key === 'ArrowLeft' || footerHasMore.value)) {\n e.preventDefault()\n goTo(next)\n }\n return\n }\n if ((e.metaKey || e.ctrlKey) && !e.altKey && !e.shiftKey && (e.key === 's' || e.key === 'S')) {\n if (!props.shortcuts || !vw.edited.value || !ctx.viewsAdapter || viewDialog.value) return\n e.preventDefault()\n if (vw.writable(vw.active.value)) void vw.saveChanges()\n else openSaveAs()\n return\n }\n if (!props.shortcuts || e.ctrlKey || e.metaKey || e.altKey || (target && isTextInput(target))) return\n if (e.key === '/' && hasSearch.value) {\n e.preventDefault()\n toolbarRef.value?.focusSearch()\n } else if ((e.key === 'f' || e.key === 'F') && hasFilter.value) {\n e.preventDefault()\n if (phone.value) filtersSheet.value?.show()\n else pickerOpen.value = true\n } else if ((e.key === 'r' || e.key === 'R') && listens('onRequest')) {\n e.preventDefault()\n req.refresh()\n } else if ((e.key === 'v' || e.key === 'V') && vw.hasViews.value && props.toolbar === 'auto') {\n e.preventDefault()\n viewMenuOpen.value = true\n }\n}\nonMounted(() => window.addEventListener('keydown', onKey))\nonBeforeUnmount(() => {\n window.removeEventListener('keydown', onKey)\n ro?.disconnect()\n clearTimeout(slowTimer)\n clearTimeout(barTimer)\n clearInterval(autoTimer)\n clearTimeout(toastTimer)\n countCtl?.abort()\n})\n\n// Ekran okuyucu duyuruları (08 §5): tek polite + tek assertive bölge.\nwatch(\n () => rowsShown.value.length,\n (n) => {\n if (!pending.value) polite.value = i18n.t('sr.loaded', { count: n })\n },\n)\nwatch(req.updatedAt, () => (polite.value = i18n.t('sr.loaded', { count: rowsShown.value.length })))\nwatch(sort, (s) => {\n const first = s[0]\n if (first)\n polite.value = i18n.t('sr.sorted', {\n column: headerOf(first.column),\n dir: i18n.t(first.dir === 'asc' ? 'sr.asc' : 'sr.desc'),\n })\n})\nwatch(req.errorKind, (k) => {\n if (k === 'error')\n assertive.value = `${i18n.t('state.errorTitle', { entity: entity.value })} ${i18n.t('state.tryAgain')}`\n})\n\n// Tek tooltip, kart kökünde: hücreler, başlıklar ve çipler (02 · Tooltip).\nconst tooltip = useDelegatedTooltip(rootEl)\n\ndefineExpose({ refresh: req.refresh, clearSelection })\n</script>\n\n<template>\n <div ref=\"rootEl\" class=\"dt dt-list\" :class=\"{ 'is-phone': phone }\" :data-density=\"density\">\n <BulkBar\n v-if=\"selectionBar === 'toolbar' && selectedRows.length && toolbar !== false\"\n variant=\"toolbar\"\n :rows=\"selectedRows\"\n :actions=\"bulkActions ?? []\"\n @clear=\"clearSelection\"\n >\n <slot v-if=\"$slots['selection-actions']\" name=\"selection-actions\" :rows=\"selectedRows\" :clear=\"clearSelection\" />\n </BulkBar>\n <Toolbar\n v-else-if=\"toolbar !== false\"\n ref=\"toolbarRef\"\n :size=\"size\"\n :search=\"hasSearch ? search : null\"\n :search-placeholder=\"searchPlaceholder\"\n :has-filter=\"hasFilter\"\n :has-display=\"hasDisplay\"\n :has-more=\"hasMore\"\n @update:search=\"setSearch\"\n >\n <template v-if=\"vw.hasViews.value && toolbar === 'auto'\" #view>\n <ViewMenu\n v-model:open=\"viewMenuOpen\"\n :sections=\"vw.sections.value\"\n :active=\"vw.active.value\"\n :edited=\"vw.edited.value\"\n :has-draft=\"vw.hasDraft\"\n :default-id=\"pref.prefs.defaultViewId\"\n :can-save=\"!!ctx.viewsAdapter\"\n :can-write=\"vw.writable(vw.active.value)\"\n :sheet=\"phone\"\n @select=\"vw.select\"\n @save-changes=\"vw.saveChanges()\"\n @save-as=\"openSaveAs()\"\n @discard=\"vw.discard()\"\n @new=\"openSaveAs()\"\n @rename=\"openRename\"\n @duplicate=\"openSaveAs\"\n @set-default=\"(id) => pref.set({ defaultViewId: id })\"\n @delete=\"(v) => (confirmDelete = v)\"\n />\n </template>\n <template #filter=\"{ iconOnly, phone: p }\">\n <button\n v-if=\"p\"\n type=\"button\"\n class=\"dt-btn dt-btn-icon dt-filter-trigger\"\n :class=\"{ 'is-active': filters.length }\"\n :aria-label=\"i18n.t('toolbar.filter')\"\n @click=\"filtersSheet?.show()\"\n >\n <PhFunnel :size=\"20\" aria-hidden=\"true\" />\n <span v-if=\"filters.length\" class=\"dt-counter\">{{ filters.length }}</span>\n </button>\n <ColumnPicker v-else v-model:open=\"pickerOpen\" :columns=\"columns\" :chips=\"chips\" @pick=\"pick\">\n <template #trigger>\n <button\n type=\"button\"\n class=\"dt-btn has-icon dt-filter-trigger\"\n :class=\"{ 'is-active': filters.length, 'dt-btn-icon': iconOnly && !filters.length }\"\n :aria-label=\"iconOnly ? i18n.t('toolbar.filter') : undefined\"\n >\n <PhFunnel :size=\"16\" aria-hidden=\"true\" />\n <span v-if=\"!iconOnly\">{{ i18n.t('toolbar.filter') }}</span>\n <span v-if=\"filters.length\" class=\"dt-counter\">{{ filters.length }}</span>\n </button>\n </template>\n </ColumnPicker>\n </template>\n <template #display=\"{ iconOnly }\">\n <DisplayPopover\n v-bind=\"displayProps\"\n :icon-only=\"iconOnly\"\n v-on=\"displayOn\"\n @update:vertical-lines=\"(on) => pref.set({ verticalLines: on })\"\n />\n </template>\n <template #more=\"{ phone: p }\">\n <PhoneMoreSheet\n v-if=\"p\"\n v-bind=\"more\"\n :density=\"density\"\n :columns=\"layout.panel.value\"\n :counts=\"layout.counts.value\"\n :sort=\"sort\"\n :persistent=\"pref.persistent\"\n :auto-refresh-on=\"autoRefreshOn\"\n v-on=\"displayOn\"\n @update:auto-refresh-on=\"(v) => (autoRefreshOn = v)\"\n @refresh=\"req.refresh()\"\n @export=\"onExport\"\n @import=\"emit('import')\"\n @print=\"onPrint\"\n />\n <MoreMenu\n v-else\n v-bind=\"more\"\n :auto-refresh-on=\"autoRefreshOn\"\n @update:auto-refresh-on=\"(v) => (autoRefreshOn = v)\"\n @refresh=\"req.refresh()\"\n @export=\"onExport\"\n @import=\"emit('import')\"\n @print=\"onPrint\"\n />\n </template>\n <template v-if=\"$slots['toolbar-end']\" #end=\"{ compact }\">\n <slot name=\"toolbar-end\" :compact=\"compact\" />\n </template>\n </Toolbar>\n\n <FilterBar\n v-if=\"chips.length\"\n :chips=\"chips\"\n :defs=\"defs\"\n :editing=\"editing\"\n :rows=\"rows\"\n :labels=\"labels\"\n :summary-of=\"summaryOf\"\n :currencies-of=\"currenciesOf\"\n :phone=\"phone\"\n @open=\"(c) => filtersSheet?.show(c)\"\n @update:chip=\"updateChip\"\n @remove=\"removeChip\"\n @update:editing=\"setEditing\"\n @clear-all=\"clearFilters\"\n >\n <template #add>\n <ColumnPicker :columns=\"columns\" :chips=\"chips\" @pick=\"pick\">\n <template #trigger>\n <button type=\"button\" class=\"dt-btn dt-btn-ghost dt-btn-sm has-icon dt-filter-add dt-filter-trigger\">\n <PhPlus :size=\"14\" aria-hidden=\"true\" />\n {{ i18n.t('filter.addFilter') }}\n </button>\n </template>\n </ColumnPicker>\n </template>\n </FilterBar>\n\n <FiltersSheet\n v-if=\"phone && hasFilter\"\n ref=\"filtersSheet\"\n :columns=\"columns\"\n :chips=\"chips\"\n :sort=\"sort\"\n :rows=\"rows\"\n :labels=\"labels\"\n :summary-of=\"summaryOf\"\n :currencies-of=\"currenciesOf\"\n @apply=\"applySheet\"\n />\n\n <div v-if=\"req.errorKind.value === 'stale' && req.updatedAt.value\" class=\"dt-strip\" role=\"status\">\n <PhWarning :size=\"16\" aria-hidden=\"true\" />\n <span>{{ i18n.t('state.stale', { time: clock(req.updatedAt.value) }) }}</span>\n <button type=\"button\" class=\"dt-strip-action\" :disabled=\"pending\" @click=\"req.retry()\">\n {{ i18n.t('common.retry') }}\n </button>\n </div>\n\n <GridRoot\n ref=\"grid\"\n :layout=\"layout\"\n :rows=\"rowsShown\"\n :density=\"density\"\n :label=\"ariaLabel\"\n :loading=\"pending || !!loading\"\n :skeleton=\"skeleton\"\n :dim=\"dim\"\n :refreshing=\"refreshBar\"\n :vertical-lines=\"pref.prefs.verticalLines\"\n :row-count=\"total ?? -1\"\n :row-index-offset=\"(footerPage.number - 1) * footerPage.size\"\n :sort=\"sortMap\"\n :filtered-columns=\"filteredColumns\"\n :labels=\"labels\"\n sortable\n :selectable=\"selectable\"\n :selection=\"rowSelection\"\n :expandable=\"expandOn\"\n :expanded=\"expanded\"\n :can-expand=\"canExpandFn\"\n :row-menu=\"rowMenu\"\n :row-actions=\"rowActions\"\n :row-error=\"rowError\"\n :primary-href=\"primaryHref\"\n :primary-label=\"primaryLabel\"\n :primary-header=\"primaryDef?.header\"\n :phone=\"phone\"\n @header-filter=\"pick\"\n @row-click=\"(row, e) => onRowClick(row as Row, e)\"\n @row-open=\"(row, e) => onRowOpen(row as Row, e)\"\n @select-rows=\"selectRows\"\n @select-page=\"list.toggleAllPage\"\n @toggle-expand=\"toggleExpand\"\n @copy-id=\"(row) => copyId(row as Row)\"\n @sort=\"onSort\"\n @sort-set=\"onSortSet\"\n >\n <template v-if=\"req.stillLoading.value\" #notice>\n <PhCircleNotch :size=\"14\" class=\"dt-spin\" aria-hidden=\"true\" />\n {{ i18n.t('state.stillLoading') }}\n </template>\n <template v-if=\"bodyState\" #state>\n <StateMessage\n v-if=\"bodyState === 'error'\"\n kind=\"error\"\n :title=\"i18n.t('state.errorTitle', { entity })\"\n :lines=\"[errorInfo.message, i18n.t('state.errorKept')].filter((l): l is string => !!l)\"\n >\n <button v-if=\"listens('onRequest')\" type=\"button\" class=\"dt-btn\" :disabled=\"pending\" @click=\"req.retry()\">\n {{ i18n.t('state.tryAgain') }}\n </button>\n <template v-if=\"errorInfo.id\" #after>\n <div class=\"dt-state-id\">\n <button type=\"button\" class=\"dt-btn dt-btn-ghost dt-btn-xs\" @click=\"copyErrorId\">\n {{ i18n.t('state.copyErrorId') }}\n </button>\n <code class=\"dt-state-code\">{{ errorInfo.id }}</code>\n </div>\n </template>\n </StateMessage>\n <StateMessage\n v-else-if=\"bodyState === 'noResults'\"\n :kind=\"search ? 'noResultsSearch' : 'noResults'\"\n :title=\"noResultsTitle\"\n >\n <button v-if=\"filters.length === 1\" type=\"button\" class=\"dt-btn\" @click=\"removeChip(filters[0]!.column)\">\n {{ i18n.t('state.removeFilter', { column: headerOf(filters[0]!.column) }) }}\n </button>\n <button v-else-if=\"filters.length\" type=\"button\" class=\"dt-btn\" @click=\"clearFilters\">\n {{ i18n.t('state.clearAllFilters') }}\n </button>\n <button v-if=\"search\" type=\"button\" class=\"dt-btn\" @click=\"setSearch('')\">\n {{ i18n.t('state.clearSearch') }}\n </button>\n </StateMessage>\n <StateMessage v-else-if=\"bodyState === 'noRowsOnPage'\" kind=\"noRowsOnPage\" :title=\"i18n.t('page.noneOnPage')\">\n <button type=\"button\" class=\"dt-btn\" @click=\"goTo(page.number - 1)\">{{ i18n.t('page.previousPage') }}</button>\n </StateMessage>\n <template v-else>\n <slot name=\"empty\">\n <StateMessage kind=\"empty\" :title=\"i18n.t('state.emptyTitle', { entity })\" />\n </slot>\n </template>\n </template>\n <template v-if=\"$slots.expanded\" #expanded=\"{ row, close }\">\n <slot name=\"expanded\" :row=\"row as Row\" :close=\"close\" />\n </template>\n </GridRoot>\n <BulkBar\n v-if=\"selectionBar === 'floating' && selectedRows.length\"\n variant=\"floating\"\n :phone=\"phone\"\n :rows=\"selectedRows\"\n :actions=\"bulkActions ?? []\"\n @clear=\"clearSelection\"\n >\n <slot v-if=\"$slots['selection-actions']\" name=\"selection-actions\" :rows=\"selectedRows\" :clear=\"clearSelection\" />\n </BulkBar>\n <div\n v-if=\"toast\"\n class=\"dt-toast\"\n :class=\"{ 'is-raised': selectionBar === 'floating' && selectedRows.length }\"\n role=\"status\"\n >\n <PhCheck :size=\"16\" aria-hidden=\"true\" />\n {{ toast }}\n </div>\n\n <Footer\n :row-count=\"footerRows\"\n :page=\"footerPage\"\n :has-more=\"footerHasMore\"\n :total=\"total\"\n :countable=\"isServer && countable && listens('onCount')\"\n :counting=\"counting\"\n :counted-at=\"countedAt\"\n :busy=\"busy\"\n :first-load=\"skeleton && !hasRows\"\n :empty=\"bodyState === 'empty'\"\n :page-sizes=\"pageSizes\"\n :updated-at=\"listens('onRequest') ? req.updatedAt.value : null\"\n :freshness=\"freshness\"\n :can-refresh=\"listens('onRequest')\"\n :phone=\"phone\"\n @count=\"count\"\n @page=\"goTo\"\n @page-size=\"setPageSize\"\n @refresh=\"req.refresh()\"\n />\n <span class=\"dt-sr-only\" aria-live=\"polite\">{{ polite }}</span>\n <span class=\"dt-sr-only\" aria-live=\"assertive\">{{ assertive }}</span>\n <div\n v-show=\"tooltip.open.value\"\n class=\"dt-tip\"\n :class=\"{ 'is-multi': tooltip.text.value.includes('\\n') }\"\n role=\"tooltip\"\n :style=\"tooltip.style.value\"\n >\n {{ tooltip.text.value }}\n </div>\n <ViewDialog\n v-if=\"viewDialog\"\n v-model:open=\"viewDialogOpen\"\n :mode=\"viewDialog.mode\"\n :name=\"viewDialog.name\"\n :summary=\"viewDialog.summary\"\n :validate=\"validateViewName\"\n @save=\"onViewDialogSave\"\n />\n <ConfirmDialog\n :open=\"!!confirmDelete\"\n :title=\"i18n.t('views.delete.title', { name: confirmDelete?.name ?? '' })\"\n :body=\"i18n.t('views.delete.body')\"\n :confirm-label=\"i18n.t('views.delete')\"\n danger\n @update:open=\"(o) => !o && (confirmDelete = null)\"\n @confirm=\"removeView\"\n />\n </div>\n</template>\n","// Hazır adapter'lar (01 · plugin ve adapter'lar): tarayıcıda saklar; `scope` zorunlu, değişince eski veri taşınmaz.\nimport type { TableId } from '../../types/core'\nimport type { Preferences, PreferencesAdapter, View, ViewsAdapter } from '../../types/views'\n\ninterface KV {\n get: (key: string) => string | null\n set: (key: string, value: string) => void\n}\n\n/** localStorage yoksa ya da kapalıysa (gizli pencere, kota) bellek içi düşer; hata fırlatmaz. */\nfunction storage(): KV {\n try {\n const ls = globalThis.localStorage\n const probe = '__dt_probe__'\n ls.setItem(probe, '1')\n ls.removeItem(probe)\n return { get: (k) => ls.getItem(k), set: (k, v) => ls.setItem(k, v) }\n } catch {\n const mem = new Map<string, string>()\n return {\n get: (k) => mem.get(k) ?? null,\n set: (k, v) => {\n mem.set(k, v)\n },\n }\n }\n}\n\nfunction readJson<T>(kv: KV, key: string, fallback: T): T {\n const raw = kv.get(key)\n if (raw === null) return fallback\n try {\n return JSON.parse(raw) as T\n } catch {\n return fallback\n }\n}\n\nconst requireScope = (scope: unknown, fn: string): string => {\n if (typeof scope !== 'string' || scope === '')\n throw new TypeError(`${fn}: 'scope' zorunlu (uygulama/kiracı anahtarı)`)\n return scope\n}\n\nconst newId = (): string => globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2)\nconst now = (): string => new Date().toISOString()\n\nexport function createLocalStorageViews(options: { scope: string }): ViewsAdapter {\n const scope = requireScope(options?.scope, 'createLocalStorageViews')\n const kv = storage()\n const key = (tableId: TableId) => `dt:${scope}:views:${tableId}`\n const read = (tableId: TableId) => readJson<View[]>(kv, key(tableId), [])\n const write = (tableId: TableId, views: View[]) => kv.set(key(tableId), JSON.stringify(views))\n\n return {\n async list(tableId) {\n return read(tableId)\n },\n async create(tableId, input) {\n const view: View = {\n id: newId(),\n name: input.name,\n kind: 'personal',\n state: input.state,\n updatedAt: now(),\n }\n write(tableId, [...read(tableId), view])\n return view\n },\n async update(tableId, id, patch) {\n const views = read(tableId)\n const i = views.findIndex((v) => v.id === id)\n if (i < 0) throw new Error(`createLocalStorageViews: görünüm yok: ${id}`)\n const next: View = {\n ...views[i]!,\n ...(patch.name !== undefined && { name: patch.name }),\n ...(patch.state !== undefined && { state: patch.state }),\n updatedAt: now(),\n }\n views[i] = next\n write(tableId, views)\n return next\n },\n async remove(tableId, id) {\n write(\n tableId,\n read(tableId).filter((v) => v.id !== id),\n )\n },\n }\n}\n\nexport function createLocalStoragePreferences(options: { scope: string }): PreferencesAdapter {\n const scope = requireScope(options?.scope, 'createLocalStoragePreferences')\n const kv = storage()\n const key = (tableId: TableId) => `dt:${scope}:prefs:${tableId}`\n return {\n get(tableId) {\n return readJson<Partial<Preferences>>(kv, key(tableId), {})\n },\n set(tableId, prefs) {\n kv.set(key(tableId), JSON.stringify({ ...readJson<Partial<Preferences>>(kv, key(tableId), {}), ...prefs }))\n },\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_useModel","_openBlock","_createBlock","_unref","_withCtx","_createVNode","_renderSlot","_createElementVNode","_createTextVNode","_toDisplayString","_createElementBlock","_Fragment","_renderList","_resolveDynamicComponent","_createCommentVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_openBlock","_createElementBlock","_normalizeClass","_unref","_createBlock","_resolveDynamicComponent","_createElementVNode","_toDisplayString","_withCtx","_createVNode","_Fragment","_renderList","_createCommentVNode","_createTextVNode","OptionsEditor","TextEditor","NumberEditor","StarEditor","_sfc_main","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_Fragment","_renderList","_createBlock","FilterChip","_renderSlot","_createCommentVNode","_toDisplayString","_unref","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_openBlock","_createElementBlock","_normalizeClass","_normalizeStyle","_withModifiers","_unref","_createVNode","_createCommentVNode","_createElementVNode","_toDisplayString","_createBlock","_withCtx","_createTextVNode","_Fragment","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_normalizeStyle","_createCommentVNode","_Fragment","_renderList","_createBlock","HeaderCell","SkeletonRow","_createVNode","Row","_renderSlot","_toDisplayString","_sfc_main","$props","_hoisted_1","_hoisted_2","_openBlock","_createBlock","_unref","_withCtx","_createVNode","_createElementVNode","_createTextVNode","_toDisplayString","_createCommentVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_openBlock","_createElementBlock","_normalizeClass","_Fragment","_createVNode","SearchBox","_createElementVNode","_toDisplayString","_unref","_renderSlot","_createBlock","_createCommentVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_useModel","_openBlock","_createBlock","_unref","_withCtx","_createVNode","_createElementVNode","_withModifiers","_createTextVNode","_toDisplayString","_createCommentVNode","_withDirectives","_vModelText","_createElementBlock","_vModelCheckbox","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_useModel","_openBlock","_createBlock","Layer","_unref","_withCtx","_createElementVNode","_createVNode","_toDisplayString","_createElementBlock","_Fragment","_createCommentVNode","_createTextVNode","_renderList","_normalizeClass","_withKeys","_withModifiers","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_openBlock","_createElementBlock","_normalizeClass","_unref","_createVNode","_createCommentVNode","_createElementVNode","_toDisplayString","_renderSlot","_Fragment","_renderList","_createBlock","_resolveDynamicComponent","Layer","_withCtx","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_openBlock","_createElementBlock","_unref","_createElementVNode","_toDisplayString","_Fragment","_createCommentVNode","_createTextVNode","_createVNode","_normalizeClass","_renderList","_sfc_main","$slots","_openBlock","_createElementBlock","_normalizeClass","_unref","_createBlock","BulkBar","_withCtx","_renderSlot","_createCommentVNode","Toolbar","_createSlots","_createVNode","_toDisplayString","ColumnPicker","_createElementVNode","DisplayPopover","_mergeProps","_toHandlers","MoreMenu","ViewMenu","FilterBar","_createTextVNode","GridRoot","StateMessage","Footer","_withDirectives","_normalizeStyle","_vShow","ViewDialog","ConfirmDialog","_sfc_main","typeLabelKey","matches","isPlainRowClick","editorOf","defaultOperator","toCondition","createI18n","createContext","useColumnLayout","avatar","operatorsOf","shapeOf","isComplete","summarize","isNumericType","changeOperator","createDataTable","DATA_TABLE_KEY","useDataTableContext","TYPE_SPECS","readPath","alignOf","DisplayPopover_default","useDelegatedTooltip","RemoteLabels","inlineActionsOf","MOVE_KBD","SearchBox_default","getFormat","opLabel","SkeletonRow_default","comparator","StateMessage_default","exportFile","ConfirmDialog_default","optionLabel","usePreferences","ME","Row_default","SAVE_KBD","isTextInput","TYPE_ICONS","NumberEditor_default","StarEditor_default","OptionsEditor_default","TextEditor_default","Layer_default","_hoisted_1$10","_hoisted_2$10","_hoisted_3$9","_hoisted_4$9","_hoisted_5$9","_hoisted_6$9","_hoisted_7$8","_hoisted_8$8","_hoisted_9$8","ColumnPicker_default","defineComponent","\"open\"","\"openModifiers\"","__emit","props","__props","emit","open","useModel","q","ref","o","filterable","computed","c","match","filtered","ch","chipped","suggested","rest","taken","empty","picked","pick","id","onCloseAutoFocus","openBlock","createBlock","unref","PopoverRoot","_cache","$event","withCtx","createVNode","PopoverTrigger","renderSlot","_ctx","PopoverPortal","PopoverContent","ListboxRoot","createElementVNode","PhMagnifyingGlass","ListboxFilter","i18n","ListboxContent","ListboxGroup","ListboxGroupLabel","createTextVNode","toDisplayString","createElementBlock","Fragment","renderList","ListboxItem","resolveDynamicComponent","createCommentVNode","_hoisted_1$9","_hoisted_2$9","_hoisted_3$8","_hoisted_4$8","_hoisted_5$8","_hoisted_6$8","_hoisted_7$7","_hoisted_8$7","_hoisted_9$7","_hoisted_10$7","_hoisted_11$5","_hoisted_12$5","_hoisted_13$5","_hoisted_14$5","_hoisted_15$2","_hoisted_16$2","_hoisted_17$2","_hoisted_18$2","_hoisted_19$2","FilterChip_default","DateEditor","defineAsyncComponent","type","shape","complete","isBoolean","valueCount","opText","ops","people","tip","aria","editor","status","update","patch","setValue","setOp","op","isMe","unassigned","clear","close","onFocusOutside","body","onOpenAutoFocus","field","toggleBool","normalizeClass","p","DropdownMenuRoot","DropdownMenuTrigger","PhCaretDown","DropdownMenuPortal","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","PhCheck","PhX","FilterBar_default","defOf","column","chipEl","row","el","scrolledEnd","onScroll","ro","onMounted","onBeforeUnmount","watch","nextTick","target","remove","i","next","chip","_hoisted_1$8","_hoisted_2$8","_hoisted_3$7","_hoisted_4$7","_hoisted_5$7","_hoisted_6$7","_hoisted_7$6","_hoisted_8$6","_hoisted_9$6","_hoisted_10$6","_hoisted_11$4","_hoisted_12$4","_hoisted_13$4","_hoisted_14$4","HeaderCell_default","def","numeric","align","unit","canSort","canFilter","descId","useId","menuOpen","resizeHandler","cell","onKeydown","k","left","toFilter","act","action","onMenuCloseAutoFocus","normalizeStyle","withModifiers","PhFunnel","PhArrowUp","PhPushPin","PhDotsThree","DropdownMenuLabel","_hoisted_1$7","_hoisted_2$7","_hoisted_3$6","_hoisted_4$6","_hoisted_5$6","_hoisted_6$6","_hoisted_7$5","_hoisted_8$5","_hoisted_9$5","_hoisted_10$5","SELECT_W","SELECT_W_PHONE","GridRoot_default","__expose","ctx","root","scrollEl","layout","coarse","density","selW","anyError","errorOf","r","maxInline","actions","a","m","menuW","err","n","cols","min","startVars","endVars","name","value","rowHeight","headH","barH","readBarH","readRowHeight","v","env","labels","cellsOf","rowIdAt","isSelected","isExpanded","canExpandRow","labelOf","uid","subrowId","rowUid","e","focusedIndex","onFocusin","anchor","idsBetween","from","to","b","menuIndex","onSelect","shift","selectedCount","allSelected","someSelected","skeleton","count","virtualizer","useVirtualizer","start","range","end","out","f","virtualRows","totalSize","measureItem","index","key","before","now","scrolledStart","shallowRef","pill","pillTimer","lastTop","pillText","downPoint","onMousedown","onClick","rowEl","link","toRaw","sortOf","columnSortable","onHeaderAction","col","focused","\"left\"","additive","d","w","\"right\"","item","_hoisted_1$6","_hoisted_2$6","MoreMenu_default","hasActions","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuSubContent","DropdownMenuCheckboxItem","_hoisted_1$5","_hoisted_2$5","_hoisted_3$5","_hoisted_4$5","_hoisted_5$5","_hoisted_6$5","Toolbar_default","searchOpen","searchBox","phone","phoneSearch","openSearch","cancelSearch","defaultView","preferredId","views","normFilter","filtersKey","fs","sorted","ids","sameState","ca","cb","x","y","nameError","lower","locale","selfId","byName","collator","useViews","saved","all","sections","activeId","active","baseline","drafts","reactive","edited","touched","activate","view","prev","keepDraft","draft","initial","listed","vs","replace","writable","input","_hoisted_1$4","_hoisted_2$4","_hoisted_3$4","_hoisted_4$4","_hoisted_5$4","_hoisted_6$4","_hoisted_7$4","_hoisted_8$4","_hoisted_9$4","_hoisted_10$4","ViewDialog_default","makeDefault","error","focusName","submit","DialogRoot","DialogPortal","DialogOverlay","DialogContent","DialogTitle","DialogDescription","withDirectives","vModelText","vModelCheckbox","DialogClose","_hoisted_1$3","_hoisted_2$3","_hoisted_3$3","_hoisted_4$3","_hoisted_5$3","_hoisted_6$3","_hoisted_7$3","_hoisted_8$3","_hoisted_9$3","_hoisted_10$3","_hoisted_11$3","_hoisted_12$3","_hoisted_13$3","_hoisted_14$3","_hoisted_15$1","_hoisted_16$1","_hoisted_17$1","_hoisted_18$1","_hoisted_19$1","_hoisted_20$1","_hoisted_21$1","ViewMenu_default","label","groups","title","hint","g","isEdited","canEdit","after","fn","PhStack","withKeys","PhPlus","_hoisted_1$2","_hoisted_2$2","_hoisted_3$2","_hoisted_4$2","_hoisted_5$2","_hoisted_6$2","_hoisted_7$2","_hoisted_8$2","_hoisted_9$2","_hoisted_10$2","_hoisted_11$2","_hoisted_12$2","_hoisted_13$2","_hoisted_14$2","BulkBar_default","shown","inBar","bar","others","firstDestructive","disabledOf","tipOf","moreOpen","run","btn","_hoisted_1$1","_hoisted_2$1","_hoisted_3$1","_hoisted_4$1","_hoisted_5$1","_hoisted_6$1","_hoisted_7$1","_hoisted_8$1","_hoisted_9$1","_hoisted_10$1","_hoisted_11$1","_hoisted_12$1","_hoisted_13$1","_hoisted_14$1","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","Footer_default","fmt","lastPage","single","time","canPrev","canNext","updatedText","PhCircleNotch","PhArrowClockwise","s","PhCaretLeft","PhCaretRight","features","tableFeatures","createSortedRowModel","createFilteredRowModel","createPaginatedRowModel","isEmpty","isSearchable","useListTable","defs","toValue","isServer","tanstackColumns","cmp","cond","columnId","normalizedSearch","state","searchableIds","table","useTable","filterValue","functionalUpdate","u","rows","total","toggleSort","current","at","existing","multi","setSort","dir","rowId","sel","STILL_LOADING_MS","COLUMNS_DEBOUNCE_MS","useRequest","pending","reason","snapshot","updatedAt","stillLoading","controller","stillTimer","columnsTimer","lastFields","settle","send","query","why","queryKey","pageKey","fieldsKey","prevQ","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","DataTable_default","FiltersSheet","PhoneMoreSheet","vnodeProps","getCurrentInstance","listens","entity","ariaLabel","rootEl","width","size","measure","pref","colScale","search","sort","page","goTo","setSearch","chips","editing","pickerOpen","typeOf","filters","filteredColumns","hasFilter","summaryOf","currenciesOf","updateChip","removeChip","setEditing","clearFilters","filtersSheet","applySheet","visibleColumns","fields","queryWithoutPage","polite","assertive","vw","viewMenuOpen","viewSummary","first","more","pinned","headerOf","resolveState","viewDialog","viewDialogOpen","confirmDelete","openSaveAs","openRename","validateViewName","onViewDialogSave","removeView","rowSelection","expanded","expandOn","canExpandFn","list","req","onSort","onSortSet","sortMap","rowsShown","hasRows","identityChange","dim","slow","slowTimer","on","refreshing","refreshBar","barTimer","busy","bodyState","errorInfo","noResultsTitle","params","clock","snap","footerRows","footerPage","footerHasMore","countCtl","counting","countedAt","t","grid","setPageSize","sm","autoRefreshOn","autoTimer","freshness","hasSearch","hasDisplay","exportLabel","hasMore","searchPlaceholder","toolbarRef","displayProps","displayOn","phoneSortOn","exportRowsOf","cellValue","onExport","primaryDef","primaryHref","primaryLabel","rowMenu","selectedRows","clearSelection","selectRows","keep","toggleExpand","sub","onRowClick","onRowOpen","toast","toastTimer","copyId","onPrint","copyErrorId","onKey","typing","inLayer","tooltip","createSlots","iconOnly","mergeProps","toHandlers","PhWarning","l","vShow","storage","ls","probe","mem","readJson","raw","kv","fallback","requireScope","scope","newId","createLocalStorageViews","options","tableId","read","write","createLocalStoragePreferences","prefs"],"sources":["../src/core/filters/ColumnPicker.vue","../src/core/filters/ColumnPicker.vue","../src/core/filters/FilterChip.vue","../src/core/filters/FilterChip.vue","../src/core/filters/FilterBar.vue","../src/core/filters/FilterBar.vue","../src/core/grid/HeaderCell.vue","../src/core/grid/HeaderCell.vue","../src/core/grid/GridRoot.vue","../src/core/grid/GridRoot.vue","../src/core/toolbar/MoreMenu.vue","../src/core/toolbar/MoreMenu.vue","../src/core/toolbar/Toolbar.vue","../src/core/toolbar/Toolbar.vue","../src/core/views/model.ts","../src/core/views/useViews.ts","../src/core/views/ViewDialog.vue","../src/core/views/ViewDialog.vue","../src/core/views/ViewMenu.vue","../src/core/views/ViewMenu.vue","../src/list/BulkBar.vue","../src/list/BulkBar.vue","../src/list/footer/Footer.vue","../src/list/footer/Footer.vue","../src/list/useListTable.ts","../src/list/useRequest.ts","../src/list/DataTable.vue","../src/list/DataTable.vue","../src/core/adapters/localStorage.ts"],"sourcesContent":["<script setup lang=\"ts\">\n// Column picker (04 §2, handoff 03 §3.2, T2-01): arama (odaklı) + Filtered (“opens its chip”, D2) · Suggested (≤ 4) · All columns.\nimport { PhMagnifyingGlass } from '@phosphor-icons/vue'\nimport {\n ListboxContent,\n ListboxFilter,\n ListboxGroup,\n ListboxGroupLabel,\n ListboxItem,\n ListboxRoot,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n} from 'reka-ui'\nimport { computed, ref, watch } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport { TYPE_SPECS, typeLabelKey } from '../cells/specs'\nimport { useDataTableContext } from '../plugin'\nimport type { Chip } from './model'\nimport { TYPE_ICONS } from './typeIcons'\n\nconst props = defineProps<{ columns: ColumnDef[]; chips: Chip[] }>()\nconst emit = defineEmits<{ pick: [columnId: string] }>()\nconst open = defineModel<boolean>('open', { default: false })\nconst { i18n } = useDataTableContext()\nconst q = ref('')\nwatch(open, (o) => {\n if (!o) q.value = ''\n})\n\nconst filterable = computed(() => props.columns.filter((c) => c.filterable ?? TYPE_SPECS[c.type].filterable))\nconst match = (c: ColumnDef) => !q.value || c.header.toLocaleLowerCase().includes(q.value.toLocaleLowerCase())\nconst filtered = computed(() =>\n props.chips\n .map((ch) => filterable.value.find((c) => c.id === ch.column))\n .filter((c): c is ColumnDef => !!c && match(c)),\n)\nconst chipped = computed(() => new Set(props.chips.map((c) => c.column)))\nconst suggested = computed(() =>\n filterable.value.filter((c) => c.suggested && !chipped.value.has(c.id as string) && match(c)).slice(0, 4),\n)\nconst rest = computed(() => {\n const taken = new Set([...chipped.value, ...suggested.value.map((c) => c.id as string)])\n return filterable.value.filter((c) => !taken.has(c.id as string) && match(c))\n})\nconst empty = computed(() => !filtered.value.length && !suggested.value.length && !rest.value.length)\n// Seçimle kapanınca odak tetikleyiciye dönmez: açılan çip editörü alır (08 §2 · Popover). Esc'te döner.\nlet picked = false\nconst pick = (id: unknown) => {\n if (typeof id !== 'string') return\n picked = true\n open.value = false\n emit('pick', id)\n}\nconst onCloseAutoFocus = (e: Event) => {\n if (picked) e.preventDefault()\n picked = false\n}\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\">\n <PopoverTrigger as-child><slot name=\"trigger\" /></PopoverTrigger>\n <PopoverPortal>\n <PopoverContent class=\"dt-pop dt-picker\" align=\"start\" :side-offset=\"4\" @close-auto-focus=\"onCloseAutoFocus\">\n <ListboxRoot\n :model-value=\"undefined\"\n selection-behavior=\"replace\"\n highlight-on-hover\n @update:model-value=\"pick\"\n >\n <label class=\"dt-input has-icon dt-picker-search\">\n <span class=\"dt-input-icon\"><PhMagnifyingGlass :size=\"14\" aria-hidden=\"true\" /></span>\n <ListboxFilter\n v-model=\"q\"\n auto-focus\n :placeholder=\"i18n.t('picker.search')\"\n :aria-label=\"i18n.t('picker.search')\"\n />\n </label>\n <ListboxContent class=\"dt-picker-list\" :aria-label=\"i18n.t('display.columns')\">\n <ListboxGroup v-if=\"filtered.length\">\n <ListboxGroupLabel class=\"dt-pop-label\">{{ i18n.t('picker.filtered') }}</ListboxGroupLabel>\n <ListboxItem v-for=\"c in filtered\" :key=\"c.id\" :value=\"c.id\" class=\"dt-picker-item\">\n <component :is=\"TYPE_ICONS[c.type]\" :size=\"14\" aria-hidden=\"true\" />\n <span class=\"dt-picker-name\">{{ c.header }}</span>\n <span class=\"dt-picker-hint\">{{ i18n.t('picker.filteredHint') }}</span>\n </ListboxItem>\n </ListboxGroup>\n <ListboxGroup v-if=\"suggested.length\">\n <ListboxGroupLabel class=\"dt-pop-label\">{{ i18n.t('picker.suggested') }}</ListboxGroupLabel>\n <ListboxItem v-for=\"c in suggested\" :key=\"c.id\" :value=\"c.id\" class=\"dt-picker-item\">\n <component :is=\"TYPE_ICONS[c.type]\" :size=\"14\" aria-hidden=\"true\" />\n <span class=\"dt-picker-name\">{{ c.header }}</span>\n <span class=\"dt-picker-hint\">{{ i18n.t(typeLabelKey(c.type)) }}</span>\n </ListboxItem>\n </ListboxGroup>\n <ListboxGroup v-if=\"rest.length\">\n <ListboxGroupLabel class=\"dt-pop-label\">{{ i18n.t('picker.allColumns') }}</ListboxGroupLabel>\n <ListboxItem v-for=\"c in rest\" :key=\"c.id\" :value=\"c.id\" class=\"dt-picker-item\">\n <component :is=\"TYPE_ICONS[c.type]\" :size=\"14\" aria-hidden=\"true\" />\n <span class=\"dt-picker-name\">{{ c.header }}</span>\n <span class=\"dt-picker-hint\">{{ i18n.t(typeLabelKey(c.type)) }}</span>\n </ListboxItem>\n </ListboxGroup>\n <div v-if=\"empty\" class=\"dt-options-empty\">{{ i18n.t('picker.noMatch') }}</div>\n </ListboxContent>\n </ListboxRoot>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","<script setup lang=\"ts\">\n// Column picker (04 §2, handoff 03 §3.2, T2-01): arama (odaklı) + Filtered (“opens its chip”, D2) · Suggested (≤ 4) · All columns.\nimport { PhMagnifyingGlass } from '@phosphor-icons/vue'\nimport {\n ListboxContent,\n ListboxFilter,\n ListboxGroup,\n ListboxGroupLabel,\n ListboxItem,\n ListboxRoot,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n} from 'reka-ui'\nimport { computed, ref, watch } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport { TYPE_SPECS, typeLabelKey } from '../cells/specs'\nimport { useDataTableContext } from '../plugin'\nimport type { Chip } from './model'\nimport { TYPE_ICONS } from './typeIcons'\n\nconst props = defineProps<{ columns: ColumnDef[]; chips: Chip[] }>()\nconst emit = defineEmits<{ pick: [columnId: string] }>()\nconst open = defineModel<boolean>('open', { default: false })\nconst { i18n } = useDataTableContext()\nconst q = ref('')\nwatch(open, (o) => {\n if (!o) q.value = ''\n})\n\nconst filterable = computed(() => props.columns.filter((c) => c.filterable ?? TYPE_SPECS[c.type].filterable))\nconst match = (c: ColumnDef) => !q.value || c.header.toLocaleLowerCase().includes(q.value.toLocaleLowerCase())\nconst filtered = computed(() =>\n props.chips\n .map((ch) => filterable.value.find((c) => c.id === ch.column))\n .filter((c): c is ColumnDef => !!c && match(c)),\n)\nconst chipped = computed(() => new Set(props.chips.map((c) => c.column)))\nconst suggested = computed(() =>\n filterable.value.filter((c) => c.suggested && !chipped.value.has(c.id as string) && match(c)).slice(0, 4),\n)\nconst rest = computed(() => {\n const taken = new Set([...chipped.value, ...suggested.value.map((c) => c.id as string)])\n return filterable.value.filter((c) => !taken.has(c.id as string) && match(c))\n})\nconst empty = computed(() => !filtered.value.length && !suggested.value.length && !rest.value.length)\n// Seçimle kapanınca odak tetikleyiciye dönmez: açılan çip editörü alır (08 §2 · Popover). Esc'te döner.\nlet picked = false\nconst pick = (id: unknown) => {\n if (typeof id !== 'string') return\n picked = true\n open.value = false\n emit('pick', id)\n}\nconst onCloseAutoFocus = (e: Event) => {\n if (picked) e.preventDefault()\n picked = false\n}\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\">\n <PopoverTrigger as-child><slot name=\"trigger\" /></PopoverTrigger>\n <PopoverPortal>\n <PopoverContent class=\"dt-pop dt-picker\" align=\"start\" :side-offset=\"4\" @close-auto-focus=\"onCloseAutoFocus\">\n <ListboxRoot\n :model-value=\"undefined\"\n selection-behavior=\"replace\"\n highlight-on-hover\n @update:model-value=\"pick\"\n >\n <label class=\"dt-input has-icon dt-picker-search\">\n <span class=\"dt-input-icon\"><PhMagnifyingGlass :size=\"14\" aria-hidden=\"true\" /></span>\n <ListboxFilter\n v-model=\"q\"\n auto-focus\n :placeholder=\"i18n.t('picker.search')\"\n :aria-label=\"i18n.t('picker.search')\"\n />\n </label>\n <ListboxContent class=\"dt-picker-list\" :aria-label=\"i18n.t('display.columns')\">\n <ListboxGroup v-if=\"filtered.length\">\n <ListboxGroupLabel class=\"dt-pop-label\">{{ i18n.t('picker.filtered') }}</ListboxGroupLabel>\n <ListboxItem v-for=\"c in filtered\" :key=\"c.id\" :value=\"c.id\" class=\"dt-picker-item\">\n <component :is=\"TYPE_ICONS[c.type]\" :size=\"14\" aria-hidden=\"true\" />\n <span class=\"dt-picker-name\">{{ c.header }}</span>\n <span class=\"dt-picker-hint\">{{ i18n.t('picker.filteredHint') }}</span>\n </ListboxItem>\n </ListboxGroup>\n <ListboxGroup v-if=\"suggested.length\">\n <ListboxGroupLabel class=\"dt-pop-label\">{{ i18n.t('picker.suggested') }}</ListboxGroupLabel>\n <ListboxItem v-for=\"c in suggested\" :key=\"c.id\" :value=\"c.id\" class=\"dt-picker-item\">\n <component :is=\"TYPE_ICONS[c.type]\" :size=\"14\" aria-hidden=\"true\" />\n <span class=\"dt-picker-name\">{{ c.header }}</span>\n <span class=\"dt-picker-hint\">{{ i18n.t(typeLabelKey(c.type)) }}</span>\n </ListboxItem>\n </ListboxGroup>\n <ListboxGroup v-if=\"rest.length\">\n <ListboxGroupLabel class=\"dt-pop-label\">{{ i18n.t('picker.allColumns') }}</ListboxGroupLabel>\n <ListboxItem v-for=\"c in rest\" :key=\"c.id\" :value=\"c.id\" class=\"dt-picker-item\">\n <component :is=\"TYPE_ICONS[c.type]\" :size=\"14\" aria-hidden=\"true\" />\n <span class=\"dt-picker-name\">{{ c.header }}</span>\n <span class=\"dt-picker-hint\">{{ i18n.t(typeLabelKey(c.type)) }}</span>\n </ListboxItem>\n </ListboxGroup>\n <div v-if=\"empty\" class=\"dt-options-empty\">{{ i18n.t('picker.noMatch') }}</div>\n </ListboxContent>\n </ListboxRoot>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","<script setup lang=\"ts\">\n// Filtre çipi (04 §3, handoff 02 §5): `[ikon] Alan · operatör · değer │ ×` — iki tıklama hedefi. Gövde değer popover'ını\n// açar (üstte operatör menüsü, tipe göre editör, altta durum + Clear); `boolean`'da popover yok, tıklama Yes ↔ No.\nimport { PhCaretDown, PhCheck, PhX } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n} from 'reka-ui'\nimport { computed, defineAsyncComponent, ref } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport type { FilterOp } from '../../types/query'\nimport type { RemoteLabels } from '../cells/remoteLabels'\nimport { avatar } from '../cells/renderCell'\n// Takvim (@internationalized/date) yalnızca tarih çipi açılınca yüklenir: çekirdek paket boyutu (10 · ≤ 60 kB).\nconst DateEditor = defineAsyncComponent(() => import('../editors/DateEditor.vue'))\nimport NumberEditor from '../editors/NumberEditor.vue'\nimport OptionsEditor from '../editors/OptionsEditor.vue'\nimport StarEditor from '../editors/StarEditor.vue'\nimport TextEditor from '../editors/TextEditor.vue'\nimport { useDataTableContext } from '../plugin'\nimport { changeOperator, editorOf, isComplete, opLabel, operatorsOf, shapeOf, type Chip, type Summary } from './model'\nimport { TYPE_ICONS } from './typeIcons'\n\nconst props = defineProps<{\n chip: Chip\n column: ColumnDef\n editing: boolean\n summary: Summary\n rows: object[]\n labels: RemoteLabels\n currencies: string[]\n /** Telefon çipi (handoff 04 §3): operatör ve × yok; tamamı tek düğme, `open` yayar (Filters alt sayfası). */\n phone?: boolean\n}>()\nconst emit = defineEmits<{ 'update:chip': [chip: Chip]; remove: []; 'update:editing': [open: boolean]; open: [] }>()\nconst { i18n } = useDataTableContext()\n\nconst type = computed(() => props.column.type)\nconst shape = computed(() => shapeOf(props.chip.op, type.value))\nconst complete = computed(() => isComplete(props.chip, type.value))\nconst isBoolean = computed(() => type.value === 'boolean')\nconst valueCount = computed(() => (Array.isArray(props.chip.value) ? props.chip.value.length : 1))\nconst opText = computed(() => opLabel(i18n, props.chip.op, type.value, valueCount.value))\nconst ops = computed(() => operatorsOf(props.column))\nconst people = computed(() => props.summary.people?.slice(0, 3) ?? [])\nconst tip = computed(() =>\n props.summary.full && props.summary.full !== props.summary.text ? props.summary.full : undefined,\n)\nconst aria = computed(() =>\n complete.value\n ? i18n.t('filter.valueAria', { column: props.column.header, op: opText.value, value: props.summary.text })\n : i18n.t('filter.chooseValueAria', { column: props.column.header }),\n)\nconst editor = computed(() => editorOf(props.chip.op, type.value))\nconst status = computed(() => {\n if (editor.value === 'options' && valueCount.value && Array.isArray(props.chip.value) && props.chip.value.length)\n return i18n.t('option.selected', { count: props.chip.value.length })\n if (shape.value === 'range') return i18n.t('number.boundsIncluded')\n if (shape.value === 'dateRange') return i18n.t('date.presetsRelative')\n return ''\n})\n\nconst update = (patch: Partial<Chip>) => emit('update:chip', { ...props.chip, ...patch })\nconst setValue = (value: unknown) =>\n update({\n value,\n currency: type.value === 'currency' ? (props.chip.currency ?? props.currencies[0]) : props.chip.currency,\n })\nconst setOp = (op: FilterOp) => emit('update:chip', changeOperator(props.chip, op, type.value))\nconst isMe = () => emit('update:chip', { ...props.chip, op: 'in', value: ['@me'] })\n/** Kişi listesinde Unassigned: `is_empty` ile değişimli (boş değer `in` listesinde taşınamaz). */\nconst unassigned = () => (props.chip.op === 'is_empty' ? setOp('in') : setOp('is_empty'))\nconst clear = () => update({ value: undefined })\nconst close = () => emit('update:editing', false)\n/** Picker / header menüsü kapanırken odak kendi tetikleyicisine döner; bu \"dışarı odak\" yeni açılan editörü kapatmasın. */\nconst onFocusOutside = (e: CustomEvent<{ originalEvent: FocusEvent }>) => {\n const t = e.detail.originalEvent.target\n if (t instanceof Element && t.closest('.dt-filter-trigger, .dt-head-menu, .dt-head-filtered')) e.preventDefault()\n}\n/** Açılınca odak editörün ilk alanına (08 §2 · Popover); reka varsayılanı üstteki operatör düğmesini seçerdi. */\nconst body = ref<HTMLElement | null>(null)\nconst onOpenAutoFocus = (e: Event) => {\n const field = body.value?.querySelector<HTMLElement>('input, textarea')\n if (!field) return\n e.preventDefault()\n field.focus()\n}\nconst toggleBool = () => update({ value: !(props.chip.value === true) })\n</script>\n\n<template>\n <span\n class=\"dt-chip\"\n :class=\"{ 'is-editing': editing, 'is-incomplete': !complete, 'is-phone': phone }\"\n :data-col=\"chip.column\"\n >\n <button\n v-if=\"phone\"\n type=\"button\"\n class=\"dt-chip-body\"\n :aria-label=\"i18n.t('mobile.chipAria', { summary: `${column.header} ${opText} ${summary.text}`.trim() })\"\n @click=\"emit('open')\"\n >\n <component :is=\"TYPE_ICONS[type]\" :size=\"14\" class=\"dt-chip-icon\" aria-hidden=\"true\" />\n <span class=\"dt-chip-field\">{{ column.header }}</span>\n <span class=\"dt-chip-value\">{{ summary.text }}</span>\n </button>\n <PopoverRoot v-else-if=\"!isBoolean\" :open=\"editing\" @update:open=\"(o) => emit('update:editing', o)\">\n <PopoverTrigger as-child>\n <button type=\"button\" class=\"dt-chip-body\" :aria-label=\"aria\">\n <component :is=\"TYPE_ICONS[type]\" :size=\"14\" class=\"dt-chip-icon\" aria-hidden=\"true\" />\n <span class=\"dt-chip-field\">{{ column.header }}</span>\n <span class=\"dt-chip-op\">{{ opText }}</span>\n <span\n v-if=\"shape !== 'none'\"\n class=\"dt-chip-value\"\n :class=\"{ 'is-placeholder': !complete }\"\n :data-dt-tip=\"tip\"\n >\n <template v-if=\"complete && people.length\">\n <span class=\"dt-chip-avatars\">\n <component\n :is=\"() => avatar({ value: p.value, label: p.label })\"\n v-for=\"p in people\"\n :key=\"String(p.value)\"\n />\n </span>\n </template>\n {{ complete ? summary.text : i18n.t('filter.selectValue') }}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverPortal>\n <PopoverContent\n class=\"dt-pop dt-chip-pop\"\n :class=\"`is-${editor ?? 'none'}`\"\n align=\"start\"\n :side-offset=\"4\"\n @focus-outside=\"onFocusOutside\"\n @open-auto-focus=\"onOpenAutoFocus\"\n >\n <div class=\"dt-chip-pop-head\">\n <span class=\"dt-chip-pop-field\">{{ column.header }}</span>\n <DropdownMenuRoot>\n <DropdownMenuTrigger as-child>\n <button type=\"button\" class=\"dt-op-btn\">\n {{ opText }}\n <PhCaretDown :size=\"12\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent class=\"dt-menu dt-op-menu\" align=\"start\" :side-offset=\"6\">\n <DropdownMenuItem v-if=\"type === 'user'\" class=\"dt-menu-item\" @select=\"isMe\">\n {{ i18n.t('op.isMe') }}\n </DropdownMenuItem>\n <template v-for=\"op in ops\" :key=\"op\">\n <DropdownMenuSeparator v-if=\"op === 'is_empty'\" class=\"dt-menu-sep\" />\n <DropdownMenuItem\n class=\"dt-menu-item\"\n :class=\"{ 'is-selected': op === chip.op }\"\n @select=\"setOp(op)\"\n >\n {{ opLabel(i18n, op, type, valueCount) }}\n <PhCheck v-if=\"op === chip.op\" :size=\"14\" class=\"dt-pop-end\" aria-hidden=\"true\" />\n </DropdownMenuItem>\n </template>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </div>\n <div v-if=\"editor\" ref=\"body\" class=\"dt-chip-pop-body\">\n <OptionsEditor\n v-if=\"editor === 'options'\"\n :column=\"column\"\n :op=\"chip.op\"\n :model-value=\"Array.isArray(chip.value) ? (chip.value as Array<string | number>) : []\"\n :rows=\"rows\"\n :labels=\"labels\"\n @update:model-value=\"setValue\"\n @unassigned=\"unassigned\"\n />\n <TextEditor\n v-else-if=\"editor === 'text'\"\n :column=\"column\"\n :op=\"chip.op\"\n :model-value=\"chip.value\"\n @update:model-value=\"setValue\"\n @done=\"close\"\n />\n <NumberEditor\n v-else-if=\"editor === 'number'\"\n :column=\"column\"\n :op=\"chip.op\"\n :model-value=\"chip.value\"\n :currency=\"chip.currency\"\n :currencies=\"currencies\"\n @update:model-value=\"setValue\"\n @update:currency=\"(c) => update({ currency: c })\"\n @done=\"close\"\n />\n <StarEditor\n v-else-if=\"editor === 'star'\"\n :column=\"column\"\n :model-value=\"chip.value\"\n @update:model-value=\"setValue\"\n @done=\"close\"\n />\n <DateEditor v-else :op=\"chip.op\" :model-value=\"chip.value\" @update:model-value=\"setValue\" @done=\"close\" />\n </div>\n <div class=\"dt-pop-foot\">\n <span>{{ status }}</span>\n <button type=\"button\" class=\"dt-pop-action\" :disabled=\"chip.value === undefined\" @click=\"clear\">\n {{ i18n.t('common.clear') }}\n </button>\n </div>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n <button v-else type=\"button\" class=\"dt-chip-body\" :aria-label=\"aria\" @click=\"toggleBool\">\n <component :is=\"TYPE_ICONS[type]\" :size=\"14\" class=\"dt-chip-icon\" aria-hidden=\"true\" />\n <span class=\"dt-chip-field\">{{ column.header }}</span>\n <span class=\"dt-chip-op\">{{ opText }}</span>\n <span class=\"dt-chip-value\">{{ summary.text }}</span>\n </button>\n <button\n v-if=\"!phone\"\n type=\"button\"\n class=\"dt-chip-remove\"\n :aria-label=\"i18n.t('filter.removeAria', { column: column.header })\"\n @click=\"emit('remove')\"\n >\n <PhX :size=\"12\" aria-hidden=\"true\" />\n </button>\n </span>\n</template>\n","<script setup lang=\"ts\">\n// Filtre çipi (04 §3, handoff 02 §5): `[ikon] Alan · operatör · değer │ ×` — iki tıklama hedefi. Gövde değer popover'ını\n// açar (üstte operatör menüsü, tipe göre editör, altta durum + Clear); `boolean`'da popover yok, tıklama Yes ↔ No.\nimport { PhCaretDown, PhCheck, PhX } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n} from 'reka-ui'\nimport { computed, defineAsyncComponent, ref } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport type { FilterOp } from '../../types/query'\nimport type { RemoteLabels } from '../cells/remoteLabels'\nimport { avatar } from '../cells/renderCell'\n// Takvim (@internationalized/date) yalnızca tarih çipi açılınca yüklenir: çekirdek paket boyutu (10 · ≤ 60 kB).\nconst DateEditor = defineAsyncComponent(() => import('../editors/DateEditor.vue'))\nimport NumberEditor from '../editors/NumberEditor.vue'\nimport OptionsEditor from '../editors/OptionsEditor.vue'\nimport StarEditor from '../editors/StarEditor.vue'\nimport TextEditor from '../editors/TextEditor.vue'\nimport { useDataTableContext } from '../plugin'\nimport { changeOperator, editorOf, isComplete, opLabel, operatorsOf, shapeOf, type Chip, type Summary } from './model'\nimport { TYPE_ICONS } from './typeIcons'\n\nconst props = defineProps<{\n chip: Chip\n column: ColumnDef\n editing: boolean\n summary: Summary\n rows: object[]\n labels: RemoteLabels\n currencies: string[]\n /** Telefon çipi (handoff 04 §3): operatör ve × yok; tamamı tek düğme, `open` yayar (Filters alt sayfası). */\n phone?: boolean\n}>()\nconst emit = defineEmits<{ 'update:chip': [chip: Chip]; remove: []; 'update:editing': [open: boolean]; open: [] }>()\nconst { i18n } = useDataTableContext()\n\nconst type = computed(() => props.column.type)\nconst shape = computed(() => shapeOf(props.chip.op, type.value))\nconst complete = computed(() => isComplete(props.chip, type.value))\nconst isBoolean = computed(() => type.value === 'boolean')\nconst valueCount = computed(() => (Array.isArray(props.chip.value) ? props.chip.value.length : 1))\nconst opText = computed(() => opLabel(i18n, props.chip.op, type.value, valueCount.value))\nconst ops = computed(() => operatorsOf(props.column))\nconst people = computed(() => props.summary.people?.slice(0, 3) ?? [])\nconst tip = computed(() =>\n props.summary.full && props.summary.full !== props.summary.text ? props.summary.full : undefined,\n)\nconst aria = computed(() =>\n complete.value\n ? i18n.t('filter.valueAria', { column: props.column.header, op: opText.value, value: props.summary.text })\n : i18n.t('filter.chooseValueAria', { column: props.column.header }),\n)\nconst editor = computed(() => editorOf(props.chip.op, type.value))\nconst status = computed(() => {\n if (editor.value === 'options' && valueCount.value && Array.isArray(props.chip.value) && props.chip.value.length)\n return i18n.t('option.selected', { count: props.chip.value.length })\n if (shape.value === 'range') return i18n.t('number.boundsIncluded')\n if (shape.value === 'dateRange') return i18n.t('date.presetsRelative')\n return ''\n})\n\nconst update = (patch: Partial<Chip>) => emit('update:chip', { ...props.chip, ...patch })\nconst setValue = (value: unknown) =>\n update({\n value,\n currency: type.value === 'currency' ? (props.chip.currency ?? props.currencies[0]) : props.chip.currency,\n })\nconst setOp = (op: FilterOp) => emit('update:chip', changeOperator(props.chip, op, type.value))\nconst isMe = () => emit('update:chip', { ...props.chip, op: 'in', value: ['@me'] })\n/** Kişi listesinde Unassigned: `is_empty` ile değişimli (boş değer `in` listesinde taşınamaz). */\nconst unassigned = () => (props.chip.op === 'is_empty' ? setOp('in') : setOp('is_empty'))\nconst clear = () => update({ value: undefined })\nconst close = () => emit('update:editing', false)\n/** Picker / header menüsü kapanırken odak kendi tetikleyicisine döner; bu \"dışarı odak\" yeni açılan editörü kapatmasın. */\nconst onFocusOutside = (e: CustomEvent<{ originalEvent: FocusEvent }>) => {\n const t = e.detail.originalEvent.target\n if (t instanceof Element && t.closest('.dt-filter-trigger, .dt-head-menu, .dt-head-filtered')) e.preventDefault()\n}\n/** Açılınca odak editörün ilk alanına (08 §2 · Popover); reka varsayılanı üstteki operatör düğmesini seçerdi. */\nconst body = ref<HTMLElement | null>(null)\nconst onOpenAutoFocus = (e: Event) => {\n const field = body.value?.querySelector<HTMLElement>('input, textarea')\n if (!field) return\n e.preventDefault()\n field.focus()\n}\nconst toggleBool = () => update({ value: !(props.chip.value === true) })\n</script>\n\n<template>\n <span\n class=\"dt-chip\"\n :class=\"{ 'is-editing': editing, 'is-incomplete': !complete, 'is-phone': phone }\"\n :data-col=\"chip.column\"\n >\n <button\n v-if=\"phone\"\n type=\"button\"\n class=\"dt-chip-body\"\n :aria-label=\"i18n.t('mobile.chipAria', { summary: `${column.header} ${opText} ${summary.text}`.trim() })\"\n @click=\"emit('open')\"\n >\n <component :is=\"TYPE_ICONS[type]\" :size=\"14\" class=\"dt-chip-icon\" aria-hidden=\"true\" />\n <span class=\"dt-chip-field\">{{ column.header }}</span>\n <span class=\"dt-chip-value\">{{ summary.text }}</span>\n </button>\n <PopoverRoot v-else-if=\"!isBoolean\" :open=\"editing\" @update:open=\"(o) => emit('update:editing', o)\">\n <PopoverTrigger as-child>\n <button type=\"button\" class=\"dt-chip-body\" :aria-label=\"aria\">\n <component :is=\"TYPE_ICONS[type]\" :size=\"14\" class=\"dt-chip-icon\" aria-hidden=\"true\" />\n <span class=\"dt-chip-field\">{{ column.header }}</span>\n <span class=\"dt-chip-op\">{{ opText }}</span>\n <span\n v-if=\"shape !== 'none'\"\n class=\"dt-chip-value\"\n :class=\"{ 'is-placeholder': !complete }\"\n :data-dt-tip=\"tip\"\n >\n <template v-if=\"complete && people.length\">\n <span class=\"dt-chip-avatars\">\n <component\n :is=\"() => avatar({ value: p.value, label: p.label })\"\n v-for=\"p in people\"\n :key=\"String(p.value)\"\n />\n </span>\n </template>\n {{ complete ? summary.text : i18n.t('filter.selectValue') }}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverPortal>\n <PopoverContent\n class=\"dt-pop dt-chip-pop\"\n :class=\"`is-${editor ?? 'none'}`\"\n align=\"start\"\n :side-offset=\"4\"\n @focus-outside=\"onFocusOutside\"\n @open-auto-focus=\"onOpenAutoFocus\"\n >\n <div class=\"dt-chip-pop-head\">\n <span class=\"dt-chip-pop-field\">{{ column.header }}</span>\n <DropdownMenuRoot>\n <DropdownMenuTrigger as-child>\n <button type=\"button\" class=\"dt-op-btn\">\n {{ opText }}\n <PhCaretDown :size=\"12\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent class=\"dt-menu dt-op-menu\" align=\"start\" :side-offset=\"6\">\n <DropdownMenuItem v-if=\"type === 'user'\" class=\"dt-menu-item\" @select=\"isMe\">\n {{ i18n.t('op.isMe') }}\n </DropdownMenuItem>\n <template v-for=\"op in ops\" :key=\"op\">\n <DropdownMenuSeparator v-if=\"op === 'is_empty'\" class=\"dt-menu-sep\" />\n <DropdownMenuItem\n class=\"dt-menu-item\"\n :class=\"{ 'is-selected': op === chip.op }\"\n @select=\"setOp(op)\"\n >\n {{ opLabel(i18n, op, type, valueCount) }}\n <PhCheck v-if=\"op === chip.op\" :size=\"14\" class=\"dt-pop-end\" aria-hidden=\"true\" />\n </DropdownMenuItem>\n </template>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </div>\n <div v-if=\"editor\" ref=\"body\" class=\"dt-chip-pop-body\">\n <OptionsEditor\n v-if=\"editor === 'options'\"\n :column=\"column\"\n :op=\"chip.op\"\n :model-value=\"Array.isArray(chip.value) ? (chip.value as Array<string | number>) : []\"\n :rows=\"rows\"\n :labels=\"labels\"\n @update:model-value=\"setValue\"\n @unassigned=\"unassigned\"\n />\n <TextEditor\n v-else-if=\"editor === 'text'\"\n :column=\"column\"\n :op=\"chip.op\"\n :model-value=\"chip.value\"\n @update:model-value=\"setValue\"\n @done=\"close\"\n />\n <NumberEditor\n v-else-if=\"editor === 'number'\"\n :column=\"column\"\n :op=\"chip.op\"\n :model-value=\"chip.value\"\n :currency=\"chip.currency\"\n :currencies=\"currencies\"\n @update:model-value=\"setValue\"\n @update:currency=\"(c) => update({ currency: c })\"\n @done=\"close\"\n />\n <StarEditor\n v-else-if=\"editor === 'star'\"\n :column=\"column\"\n :model-value=\"chip.value\"\n @update:model-value=\"setValue\"\n @done=\"close\"\n />\n <DateEditor v-else :op=\"chip.op\" :model-value=\"chip.value\" @update:model-value=\"setValue\" @done=\"close\" />\n </div>\n <div class=\"dt-pop-foot\">\n <span>{{ status }}</span>\n <button type=\"button\" class=\"dt-pop-action\" :disabled=\"chip.value === undefined\" @click=\"clear\">\n {{ i18n.t('common.clear') }}\n </button>\n </div>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n <button v-else type=\"button\" class=\"dt-chip-body\" :aria-label=\"aria\" @click=\"toggleBool\">\n <component :is=\"TYPE_ICONS[type]\" :size=\"14\" class=\"dt-chip-icon\" aria-hidden=\"true\" />\n <span class=\"dt-chip-field\">{{ column.header }}</span>\n <span class=\"dt-chip-op\">{{ opText }}</span>\n <span class=\"dt-chip-value\">{{ summary.text }}</span>\n </button>\n <button\n v-if=\"!phone\"\n type=\"button\"\n class=\"dt-chip-remove\"\n :aria-label=\"i18n.t('filter.removeAria', { column: column.header })\"\n @click=\"emit('remove')\"\n >\n <PhX :size=\"12\" aria-hidden=\"true\" />\n </button>\n </span>\n</template>\n","<script setup lang=\"ts\">\n// Filtre satırı (04 §4, D29): tek satır — çipler → Add filter; sağda Clear all sabit. Sığmayan çipler yatay kayar,\n// sağ kenarda solma; düzenlenen / yeni eklenen çip görünür alana kaydırılır. Add filter kayan alanın dışında: çipler sığarken\n// son çipin yanında, taşınca sağda. Sarma ve `+N more` yok (D2 çip sayısını sınırlar).\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport type { RemoteLabels } from '../cells/remoteLabels'\nimport { useDataTableContext } from '../plugin'\nimport FilterChip from './FilterChip.vue'\nimport type { Chip, Summary } from './model'\n\nconst props = defineProps<{\n chips: Chip[]\n defs: ReadonlyMap<string, ColumnDef>\n editing: string | null\n rows: object[]\n labels: RemoteLabels\n summaryOf: (chip: Chip) => Summary\n currenciesOf: (def: ColumnDef) => string[]\n /** Telefon (handoff 04 §3): çipler tek düğme (`open`), Add filter ve Clear all yok (Filters alt sayfasında). */\n phone?: boolean\n}>()\nconst emit = defineEmits<{\n 'update:chip': [chip: Chip]\n remove: [column: string]\n 'update:editing': [column: string | null]\n 'clear-all': []\n open: [column: string]\n}>()\nconst { i18n } = useDataTableContext()\nconst defOf = (column: string) => props.defs.get(column)!\n/** Sütun id'sinde nokta olabilir: seçici yerine dataset karşılaştırması (jsdom'da CSS.escape yok). */\nconst chipEl = (column: string | undefined) =>\n column\n ? [...(row.value?.querySelectorAll<HTMLElement>('.dt-chip') ?? [])].find((el) => el.dataset.col === column)\n : undefined\n\nconst row = ref<HTMLElement | null>(null)\nconst scrolledEnd = ref(false)\nconst onScroll = () => {\n const el = row.value\n if (el) scrolledEnd.value = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n}\nlet ro: ResizeObserver | undefined\nonMounted(() => {\n onScroll()\n if (typeof ResizeObserver !== 'undefined' && row.value) {\n ro = new ResizeObserver(onScroll)\n ro.observe(row.value)\n }\n})\nonBeforeUnmount(() => ro?.disconnect())\nwatch(\n () => [props.chips.length, props.editing],\n () =>\n void nextTick(() => {\n onScroll()\n const target = props.editing ?? props.chips.at(-1)?.column\n chipEl(target)?.scrollIntoView?.({ inline: 'nearest', block: 'nearest' })\n }),\n)\n\n/** × sonrası odak sonraki çipe, yoksa Add filter'a (04 §3). */\nconst remove = (column: string) => {\n const i = props.chips.findIndex((c) => c.column === column)\n const next = props.chips[i + 1]?.column\n emit('remove', column)\n void nextTick(() => {\n const el =\n chipEl(next)?.querySelector<HTMLElement>('.dt-chip-body') ??\n row.value?.parentElement?.querySelector<HTMLElement>('.dt-filter-add')\n el?.focus()\n })\n}\n</script>\n\n<template>\n <div class=\"dt-filter-row\" :class=\"{ 'is-scrolled-end': scrolledEnd }\">\n <div ref=\"row\" class=\"dt-chips\" @scroll.passive=\"onScroll\">\n <FilterChip\n v-for=\"c in chips\"\n :key=\"c.column\"\n :chip=\"c\"\n :column=\"defOf(c.column)\"\n :editing=\"editing === c.column\"\n :summary=\"summaryOf(c)\"\n :rows=\"rows\"\n :labels=\"labels\"\n :currencies=\"currenciesOf(defOf(c.column))\"\n :phone=\"phone\"\n @open=\"emit('open', c.column)\"\n @update:chip=\"(chip) => emit('update:chip', chip)\"\n @update:editing=\"(open) => emit('update:editing', open ? c.column : null)\"\n @remove=\"remove(c.column)\"\n />\n </div>\n <slot v-if=\"!phone\" name=\"add\" />\n <button v-if=\"!phone\" type=\"button\" class=\"dt-btn dt-btn-ghost dt-filter-clear\" @click=\"emit('clear-all')\">\n {{ i18n.t('filter.clearAll') }}\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Filtre satırı (04 §4, D29): tek satır — çipler → Add filter; sağda Clear all sabit. Sığmayan çipler yatay kayar,\n// sağ kenarda solma; düzenlenen / yeni eklenen çip görünür alana kaydırılır. Add filter kayan alanın dışında: çipler sığarken\n// son çipin yanında, taşınca sağda. Sarma ve `+N more` yok (D2 çip sayısını sınırlar).\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport type { RemoteLabels } from '../cells/remoteLabels'\nimport { useDataTableContext } from '../plugin'\nimport FilterChip from './FilterChip.vue'\nimport type { Chip, Summary } from './model'\n\nconst props = defineProps<{\n chips: Chip[]\n defs: ReadonlyMap<string, ColumnDef>\n editing: string | null\n rows: object[]\n labels: RemoteLabels\n summaryOf: (chip: Chip) => Summary\n currenciesOf: (def: ColumnDef) => string[]\n /** Telefon (handoff 04 §3): çipler tek düğme (`open`), Add filter ve Clear all yok (Filters alt sayfasında). */\n phone?: boolean\n}>()\nconst emit = defineEmits<{\n 'update:chip': [chip: Chip]\n remove: [column: string]\n 'update:editing': [column: string | null]\n 'clear-all': []\n open: [column: string]\n}>()\nconst { i18n } = useDataTableContext()\nconst defOf = (column: string) => props.defs.get(column)!\n/** Sütun id'sinde nokta olabilir: seçici yerine dataset karşılaştırması (jsdom'da CSS.escape yok). */\nconst chipEl = (column: string | undefined) =>\n column\n ? [...(row.value?.querySelectorAll<HTMLElement>('.dt-chip') ?? [])].find((el) => el.dataset.col === column)\n : undefined\n\nconst row = ref<HTMLElement | null>(null)\nconst scrolledEnd = ref(false)\nconst onScroll = () => {\n const el = row.value\n if (el) scrolledEnd.value = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n}\nlet ro: ResizeObserver | undefined\nonMounted(() => {\n onScroll()\n if (typeof ResizeObserver !== 'undefined' && row.value) {\n ro = new ResizeObserver(onScroll)\n ro.observe(row.value)\n }\n})\nonBeforeUnmount(() => ro?.disconnect())\nwatch(\n () => [props.chips.length, props.editing],\n () =>\n void nextTick(() => {\n onScroll()\n const target = props.editing ?? props.chips.at(-1)?.column\n chipEl(target)?.scrollIntoView?.({ inline: 'nearest', block: 'nearest' })\n }),\n)\n\n/** × sonrası odak sonraki çipe, yoksa Add filter'a (04 §3). */\nconst remove = (column: string) => {\n const i = props.chips.findIndex((c) => c.column === column)\n const next = props.chips[i + 1]?.column\n emit('remove', column)\n void nextTick(() => {\n const el =\n chipEl(next)?.querySelector<HTMLElement>('.dt-chip-body') ??\n row.value?.parentElement?.querySelector<HTMLElement>('.dt-filter-add')\n el?.focus()\n })\n}\n</script>\n\n<template>\n <div class=\"dt-filter-row\" :class=\"{ 'is-scrolled-end': scrolledEnd }\">\n <div ref=\"row\" class=\"dt-chips\" @scroll.passive=\"onScroll\">\n <FilterChip\n v-for=\"c in chips\"\n :key=\"c.column\"\n :chip=\"c\"\n :column=\"defOf(c.column)\"\n :editing=\"editing === c.column\"\n :summary=\"summaryOf(c)\"\n :rows=\"rows\"\n :labels=\"labels\"\n :currencies=\"currenciesOf(defOf(c.column))\"\n :phone=\"phone\"\n @open=\"emit('open', c.column)\"\n @update:chip=\"(chip) => emit('update:chip', chip)\"\n @update:editing=\"(open) => emit('update:editing', open ? c.column : null)\"\n @remove=\"remove(c.column)\"\n />\n </div>\n <slot v-if=\"!phone\" name=\"add\" />\n <button v-if=\"!phone\" type=\"button\" class=\"dt-btn dt-btn-ghost dt-filter-clear\" @click=\"emit('clear-all')\">\n {{ i18n.t('filter.clearAll') }}\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"Row extends object\">\n// Header hücresi (05 §4 · Header, T4): etiket düğmesi, birim, sıralama oku, filtre işareti, raptiye, ⋯ sütun menüsü,\n// resize tutamacı. Klavye (08 §3): ↵/Space sırala, ⇧F10 menü, ⇧←/→ ±16 px, ⌥⇧←/→ taşı.\nimport { PhArrowUp, PhDotsThree, PhFunnel, PhPushPin } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from 'reka-ui'\nimport { computed, ref, useId } from 'vue'\nimport { TYPE_SPECS, alignOf, isNumericType, typeLabelKey } from '../cells/specs'\nimport type { LayoutColumn } from '../columns/useColumnLayout'\nimport { useDataTableContext } from '../plugin'\nimport { MOVE_KBD, type HeaderAction } from './headerActions'\n\nconst props = defineProps<{\n /** Telefon: `headerShort` varsa o. */\n phone?: boolean\n column: LayoutColumn<Row>\n sort?: 'asc' | 'desc' | null\n /** Çoklu sıralamada öncelik (1 tabanlı). */\n sortIndex?: number | null\n filtered?: boolean\n /** Sürüklenirken canlı genişlik (px); değilse null. */\n resizing?: number | null\n sortable?: boolean\n}>()\nconst emit = defineEmits<{\n sort: [column: LayoutColumn<Row>, additive: boolean]\n filter: [column: LayoutColumn<Row>]\n action: [column: LayoutColumn<Row>, action: HeaderAction]\n /** Klavye: komşu başlığa veya odaklı satıra geç. */\n 'resize-by': [column: LayoutColumn<Row>, delta: number]\n /** Sürükleme başlarken çizilen genişlik: model (minmax) ile ekran aynı olsun, sütun zıplamasın. */\n 'resize-start': [column: LayoutColumn<Row>, renderedWidth: number]\n}>()\n\nconst { i18n } = useDataTableContext()\nconst def = computed(() => props.column.def)\nconst numeric = computed(() => isNumericType(def.value.type))\nconst align = computed(() => alignOf(def.value))\nconst unit = computed(() => (typeof def.value.unit === 'string' ? def.value.unit : undefined))\nconst canSort = computed(() => props.sortable ?? false)\nconst canFilter = computed(() => def.value.filterable ?? TYPE_SPECS[def.value.type].filterable)\n// D33: açıklama tooltip'te ikinci satır, ekran okuyucuya aria-describedby; düğme metnine girmez (erişilebilir ad değişmez).\nconst descId = useId()\nconst tip = computed(() => (def.value.description ? `${def.value.header}\\n${def.value.description}` : def.value.header))\nconst menuOpen = ref(false)\n\nconst resizeHandler = (e: MouseEvent | TouchEvent) => {\n const cell = (e.currentTarget as HTMLElement).parentElement!\n emit('resize-start', props.column, cell.getBoundingClientRect().width)\n props.column.header.getResizeHandler()(e)\n}\n\nconst onKeydown = (e: KeyboardEvent) => {\n const k = e.key\n if (k === 'Enter' || k === ' ') {\n if (canSort.value) {\n e.preventDefault()\n emit('sort', props.column, e.shiftKey)\n }\n return\n }\n if ((k === 'F10' && e.shiftKey) || k === 'ContextMenu') {\n e.preventDefault()\n menuOpen.value = true\n return\n }\n if ((k === 'ArrowLeft' || k === 'ArrowRight') && e.shiftKey) {\n e.preventDefault()\n const left = k === 'ArrowLeft'\n if (e.altKey) emit('action', props.column, left ? 'move-left' : 'move-right')\n else emit('resize-by', props.column, left ? -16 : 16)\n }\n}\n// Filter by this column… ile kapanınca odak ⋯'ya dönmez: açılan çip editörü alır (08 §2 · Popover).\nlet toFilter = false\nconst act = (action: HeaderAction) => {\n toFilter = action === 'filter'\n emit('action', props.column, action)\n}\nconst onMenuCloseAutoFocus = (e: Event) => {\n if (toFilter) e.preventDefault()\n toFilter = false\n}\n</script>\n\n<template>\n <div\n class=\"dt-head-cell\"\n :class=\"[\n `is-${align}`,\n {\n 'is-numeric': numeric,\n 'is-sorted': !!sort,\n 'is-pinned-start': column.pinned === 'start',\n 'is-pinned-end': column.pinned === 'end',\n 'is-pin-edge': column.pinEdge,\n 'is-resizing': resizing !== null && resizing !== undefined,\n 'is-menu-open': menuOpen,\n },\n ]\"\n :style=\"\n column.pinned === 'start'\n ? { left: `var(${column.offsetVar})` }\n : column.pinned === 'end'\n ? { right: `var(${column.offsetVar})` }\n : undefined\n \"\n role=\"columnheader\"\n :aria-sort=\"sort === 'asc' ? 'ascending' : sort === 'desc' ? 'descending' : undefined\"\n :data-col=\"column.id\"\n @contextmenu.prevent=\"menuOpen = true\"\n >\n <button\n v-if=\"filtered\"\n type=\"button\"\n class=\"dt-head-icon dt-head-filtered\"\n :aria-label=\"i18n.t('header.filterBy')\"\n @click=\"emit('filter', column)\"\n >\n <PhFunnel :size=\"14\" weight=\"fill\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n class=\"dt-head-label\"\n :class=\"{ 'is-static': !canSort }\"\n :aria-disabled=\"canSort ? undefined : 'true'\"\n :data-dt-tip=\"tip\"\n :aria-describedby=\"def.description ? descId : undefined\"\n @click=\"canSort && emit('sort', column, $event.shiftKey)\"\n @keydown=\"onKeydown\"\n >\n <span v-if=\"sort && numeric\" class=\"dt-head-sort\" aria-hidden=\"true\">\n <span v-if=\"sortIndex\" class=\"dt-head-sort-index\">{{ sortIndex }}</span>\n <PhArrowUp :size=\"12\" :class=\"{ 'is-desc': sort === 'desc' }\" />\n </span>\n <span class=\"dt-head-text\">{{ (phone && def.headerShort) || def.header }}</span>\n <span v-if=\"unit\" class=\"dt-head-unit\">{{ unit }}</span>\n <span v-if=\"sort && !numeric\" class=\"dt-head-sort\" aria-hidden=\"true\">\n <PhArrowUp :size=\"12\" :class=\"{ 'is-desc': sort === 'desc' }\" />\n <span v-if=\"sortIndex\" class=\"dt-head-sort-index\">{{ sortIndex }}</span>\n </span>\n <PhPushPin v-if=\"column.pinned\" :size=\"12\" class=\"dt-head-pin\" aria-hidden=\"true\" />\n </button>\n <span v-if=\"def.description\" :id=\"descId\" class=\"dt-sr-only\">{{ def.description }}</span>\n <DropdownMenuRoot v-model:open=\"menuOpen\">\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n class=\"dt-head-icon dt-head-menu\"\n :aria-label=\"i18n.t('header.optionsAria', { column: def.header })\"\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n class=\"dt-menu dt-col-menu\"\n align=\"end\"\n :side-offset=\"4\"\n @close-auto-focus=\"onMenuCloseAutoFocus\"\n >\n <DropdownMenuLabel class=\"dt-menu-label\">{{ i18n.t(typeLabelKey(def.type)) }}</DropdownMenuLabel>\n <template v-if=\"canSort\">\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('sort-asc')\">\n {{ i18n.t('header.sortAsc') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('sort-desc')\">\n {{ i18n.t('header.sortDesc') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" :disabled=\"!sort\" @select=\"act('sort-clear')\">\n {{ i18n.t('header.clearSort') }}\n </DropdownMenuItem>\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n </template>\n <template v-if=\"canFilter\">\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('filter')\">\n {{ i18n.t('header.filterBy') }}\n </DropdownMenuItem>\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n </template>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('move-left')\">\n {{ i18n.t('header.moveLeft') }}\n <kbd class=\"dt-kbd\">{{ MOVE_KBD.left }}</kbd>\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('move-right')\">\n {{ i18n.t('header.moveRight') }}\n <kbd class=\"dt-kbd\">{{ MOVE_KBD.right }}</kbd>\n </DropdownMenuItem>\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n <DropdownMenuItem\n class=\"dt-menu-item\"\n :disabled=\"!!column.pinned || !column.header.column.getCanHide()\"\n @select=\"act('hide')\"\n >\n {{ i18n.t('header.hide') }}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n <span class=\"dt-head-sep\" aria-hidden=\"true\" />\n <span class=\"dt-resize\" aria-hidden=\"true\" @mousedown=\"resizeHandler\" @touchstart.passive=\"resizeHandler\">\n <span v-if=\"resizing !== null && resizing !== undefined\" class=\"dt-resize-badge\">\n {{ Math.round(resizing) }} px\n </span>\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"Row extends object\">\n// Header hücresi (05 §4 · Header, T4): etiket düğmesi, birim, sıralama oku, filtre işareti, raptiye, ⋯ sütun menüsü,\n// resize tutamacı. Klavye (08 §3): ↵/Space sırala, ⇧F10 menü, ⇧←/→ ±16 px, ⌥⇧←/→ taşı.\nimport { PhArrowUp, PhDotsThree, PhFunnel, PhPushPin } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from 'reka-ui'\nimport { computed, ref, useId } from 'vue'\nimport { TYPE_SPECS, alignOf, isNumericType, typeLabelKey } from '../cells/specs'\nimport type { LayoutColumn } from '../columns/useColumnLayout'\nimport { useDataTableContext } from '../plugin'\nimport { MOVE_KBD, type HeaderAction } from './headerActions'\n\nconst props = defineProps<{\n /** Telefon: `headerShort` varsa o. */\n phone?: boolean\n column: LayoutColumn<Row>\n sort?: 'asc' | 'desc' | null\n /** Çoklu sıralamada öncelik (1 tabanlı). */\n sortIndex?: number | null\n filtered?: boolean\n /** Sürüklenirken canlı genişlik (px); değilse null. */\n resizing?: number | null\n sortable?: boolean\n}>()\nconst emit = defineEmits<{\n sort: [column: LayoutColumn<Row>, additive: boolean]\n filter: [column: LayoutColumn<Row>]\n action: [column: LayoutColumn<Row>, action: HeaderAction]\n /** Klavye: komşu başlığa veya odaklı satıra geç. */\n 'resize-by': [column: LayoutColumn<Row>, delta: number]\n /** Sürükleme başlarken çizilen genişlik: model (minmax) ile ekran aynı olsun, sütun zıplamasın. */\n 'resize-start': [column: LayoutColumn<Row>, renderedWidth: number]\n}>()\n\nconst { i18n } = useDataTableContext()\nconst def = computed(() => props.column.def)\nconst numeric = computed(() => isNumericType(def.value.type))\nconst align = computed(() => alignOf(def.value))\nconst unit = computed(() => (typeof def.value.unit === 'string' ? def.value.unit : undefined))\nconst canSort = computed(() => props.sortable ?? false)\nconst canFilter = computed(() => def.value.filterable ?? TYPE_SPECS[def.value.type].filterable)\n// D33: açıklama tooltip'te ikinci satır, ekran okuyucuya aria-describedby; düğme metnine girmez (erişilebilir ad değişmez).\nconst descId = useId()\nconst tip = computed(() => (def.value.description ? `${def.value.header}\\n${def.value.description}` : def.value.header))\nconst menuOpen = ref(false)\n\nconst resizeHandler = (e: MouseEvent | TouchEvent) => {\n const cell = (e.currentTarget as HTMLElement).parentElement!\n emit('resize-start', props.column, cell.getBoundingClientRect().width)\n props.column.header.getResizeHandler()(e)\n}\n\nconst onKeydown = (e: KeyboardEvent) => {\n const k = e.key\n if (k === 'Enter' || k === ' ') {\n if (canSort.value) {\n e.preventDefault()\n emit('sort', props.column, e.shiftKey)\n }\n return\n }\n if ((k === 'F10' && e.shiftKey) || k === 'ContextMenu') {\n e.preventDefault()\n menuOpen.value = true\n return\n }\n if ((k === 'ArrowLeft' || k === 'ArrowRight') && e.shiftKey) {\n e.preventDefault()\n const left = k === 'ArrowLeft'\n if (e.altKey) emit('action', props.column, left ? 'move-left' : 'move-right')\n else emit('resize-by', props.column, left ? -16 : 16)\n }\n}\n// Filter by this column… ile kapanınca odak ⋯'ya dönmez: açılan çip editörü alır (08 §2 · Popover).\nlet toFilter = false\nconst act = (action: HeaderAction) => {\n toFilter = action === 'filter'\n emit('action', props.column, action)\n}\nconst onMenuCloseAutoFocus = (e: Event) => {\n if (toFilter) e.preventDefault()\n toFilter = false\n}\n</script>\n\n<template>\n <div\n class=\"dt-head-cell\"\n :class=\"[\n `is-${align}`,\n {\n 'is-numeric': numeric,\n 'is-sorted': !!sort,\n 'is-pinned-start': column.pinned === 'start',\n 'is-pinned-end': column.pinned === 'end',\n 'is-pin-edge': column.pinEdge,\n 'is-resizing': resizing !== null && resizing !== undefined,\n 'is-menu-open': menuOpen,\n },\n ]\"\n :style=\"\n column.pinned === 'start'\n ? { left: `var(${column.offsetVar})` }\n : column.pinned === 'end'\n ? { right: `var(${column.offsetVar})` }\n : undefined\n \"\n role=\"columnheader\"\n :aria-sort=\"sort === 'asc' ? 'ascending' : sort === 'desc' ? 'descending' : undefined\"\n :data-col=\"column.id\"\n @contextmenu.prevent=\"menuOpen = true\"\n >\n <button\n v-if=\"filtered\"\n type=\"button\"\n class=\"dt-head-icon dt-head-filtered\"\n :aria-label=\"i18n.t('header.filterBy')\"\n @click=\"emit('filter', column)\"\n >\n <PhFunnel :size=\"14\" weight=\"fill\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n class=\"dt-head-label\"\n :class=\"{ 'is-static': !canSort }\"\n :aria-disabled=\"canSort ? undefined : 'true'\"\n :data-dt-tip=\"tip\"\n :aria-describedby=\"def.description ? descId : undefined\"\n @click=\"canSort && emit('sort', column, $event.shiftKey)\"\n @keydown=\"onKeydown\"\n >\n <span v-if=\"sort && numeric\" class=\"dt-head-sort\" aria-hidden=\"true\">\n <span v-if=\"sortIndex\" class=\"dt-head-sort-index\">{{ sortIndex }}</span>\n <PhArrowUp :size=\"12\" :class=\"{ 'is-desc': sort === 'desc' }\" />\n </span>\n <span class=\"dt-head-text\">{{ (phone && def.headerShort) || def.header }}</span>\n <span v-if=\"unit\" class=\"dt-head-unit\">{{ unit }}</span>\n <span v-if=\"sort && !numeric\" class=\"dt-head-sort\" aria-hidden=\"true\">\n <PhArrowUp :size=\"12\" :class=\"{ 'is-desc': sort === 'desc' }\" />\n <span v-if=\"sortIndex\" class=\"dt-head-sort-index\">{{ sortIndex }}</span>\n </span>\n <PhPushPin v-if=\"column.pinned\" :size=\"12\" class=\"dt-head-pin\" aria-hidden=\"true\" />\n </button>\n <span v-if=\"def.description\" :id=\"descId\" class=\"dt-sr-only\">{{ def.description }}</span>\n <DropdownMenuRoot v-model:open=\"menuOpen\">\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n class=\"dt-head-icon dt-head-menu\"\n :aria-label=\"i18n.t('header.optionsAria', { column: def.header })\"\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n class=\"dt-menu dt-col-menu\"\n align=\"end\"\n :side-offset=\"4\"\n @close-auto-focus=\"onMenuCloseAutoFocus\"\n >\n <DropdownMenuLabel class=\"dt-menu-label\">{{ i18n.t(typeLabelKey(def.type)) }}</DropdownMenuLabel>\n <template v-if=\"canSort\">\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('sort-asc')\">\n {{ i18n.t('header.sortAsc') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('sort-desc')\">\n {{ i18n.t('header.sortDesc') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" :disabled=\"!sort\" @select=\"act('sort-clear')\">\n {{ i18n.t('header.clearSort') }}\n </DropdownMenuItem>\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n </template>\n <template v-if=\"canFilter\">\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('filter')\">\n {{ i18n.t('header.filterBy') }}\n </DropdownMenuItem>\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n </template>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('move-left')\">\n {{ i18n.t('header.moveLeft') }}\n <kbd class=\"dt-kbd\">{{ MOVE_KBD.left }}</kbd>\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"act('move-right')\">\n {{ i18n.t('header.moveRight') }}\n <kbd class=\"dt-kbd\">{{ MOVE_KBD.right }}</kbd>\n </DropdownMenuItem>\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n <DropdownMenuItem\n class=\"dt-menu-item\"\n :disabled=\"!!column.pinned || !column.header.column.getCanHide()\"\n @select=\"act('hide')\"\n >\n {{ i18n.t('header.hide') }}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n <span class=\"dt-head-sep\" aria-hidden=\"true\" />\n <span class=\"dt-resize\" aria-hidden=\"true\" @mousedown=\"resizeHandler\" @touchstart.passive=\"resizeHandler\">\n <span v-if=\"resizing !== null && resizing !== undefined\" class=\"dt-resize-badge\">\n {{ Math.round(resizing) }} px\n </span>\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Izgara kökü (05 §2–4, §6–8, §10; 08 §1–3; brief §5.5): tek kayan alan, sticky header, sabit sütunlar + koşullu kenar gölgesi,\n// sanal satırlar (@tanstack/vue-virtual; öğe = satır + açık detay, ölçülen yükseklik), header klavyesi ve sütun menüsü (D38: satır\n// klavyesi yok, widget'lar doğal Tab sırasında), seçim sütunu (40 px) ve ⋯ sütunu (44 px; hatalı satır varken 66), satır menüsü, kaydırma hapı. Veri çekmez, sütun düzenini dışarıdan\n// (useColumnLayout) alır; seçim/expand durumunu üstten alır ve niyet olarak yayar.\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, toRaw, useId, watch, watchEffect } from 'vue'\n\n// İç bileşen: satır tipi dış bileşende (DataTable) tiplidir; accessor/cell parametreleri karşıt değişken olduğundan burada any.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyRow = any\nimport type { Density } from '../../types/core'\nimport type { RowAction } from '../../types/list'\nimport { RemoteLabels } from '../cells/remoteLabels'\nimport type { RenderEnv } from '../cells/renderCell'\nimport { TYPE_SPECS } from '../cells/specs'\nimport type { ColumnLayoutApi, LayoutColumn } from '../columns/useColumnLayout'\nimport { getFormat } from '../format'\nimport { isPlainRowClick } from '../interaction/isInteractive'\nimport { useDataTableContext } from '../plugin'\nimport HeaderCell from './HeaderCell.vue'\nimport type { HeaderAction } from './headerActions'\nimport { inlineActionsOf } from './inlineActions'\nimport Row from './Row'\nimport SkeletonRow from './SkeletonRow'\n\nconst props = withDefaults(\n defineProps<{\n layout: ColumnLayoutApi<AnyRow>\n rows: AnyRow[]\n density?: Density\n /** role=grid aria-label. */\n label: string\n /** aria-busy. */\n loading?: boolean\n /** 12 iskelet satır (First load, 400 ms'yi aşan sorgu değişimi). */\n skeleton?: boolean\n /** Sorgu değişimi: eski satırlar soluk + inert (05 §10 · Query change). */\n dim?: boolean\n /** Header altında 2 px belirsiz çubuk (Refreshing). */\n refreshing?: boolean\n verticalLines?: boolean\n /** aria-rowcount; bilinmiyorsa -1. */\n rowCount?: number\n /** Sayfa ofseti: aria-rowindex ve kaydırma hapı (05 §8). */\n rowIndexOffset?: number\n sort?: ReadonlyMap<string, { dir: 'asc' | 'desc'; index: number | null }>\n filteredColumns?: ReadonlySet<string>\n sortable?: boolean\n /** `ajax`/`user` etiket önbelleği; DataTable filtre çipleriyle paylaşır. */\n labels?: RemoteLabels\n /** Seçim sütunu (05 §6); durum `selection` (anahtar → seçili). */\n selectable?: boolean\n selection?: Record<string, boolean>\n /** Birincil hücrede chevron + alt satır (05 §7); durum `expanded` (anahtar → açık). */\n expandable?: boolean\n expanded?: Record<string, boolean>\n canExpand?: (row: AnyRow) => boolean\n /** ⋯ sütunu ve satır menüsü: Open / Copy yerleşik, `rowActions` uygulamanın. */\n rowMenu?: boolean\n rowActions?: RowAction[]\n /** Satır hatası (05 §4, D35): metin/metin listesi; boş → yok. */\n rowError?: (row: AnyRow) => string | string[] | null | undefined\n primaryHref?: (row: AnyRow) => string | undefined\n primaryLabel?: (row: AnyRow) => string\n primaryHeader?: string\n /** Telefon (05 §11): seçim sütunu 48, satır 48 px, kısa header; sabitleme useColumnLayout'ta. */\n phone?: boolean\n }>(),\n { density: 'standard', loading: false, rowCount: -1, rowIndexOffset: 0, sortable: false },\n)\nconst emit = defineEmits<{\n 'row-click': [row: AnyRow, event: MouseEvent]\n /** Birincil linke düz sol tık, satırda ↵, menüde Open (05 §7). Native navigasyon dinleyicide durdurulabilir. */\n 'row-open': [row: AnyRow, event: MouseEvent]\n 'select-rows': [ids: string[], value: boolean]\n 'select-page': [value: boolean]\n 'toggle-expand': [id: string, value: boolean]\n 'copy-id': [row: AnyRow]\n sort: [columnId: string, additive: boolean]\n 'sort-set': [columnId: string, dir: 'asc' | 'desc' | null]\n 'header-filter': [columnId: string]\n}>()\ndefineSlots<{\n notice?: () => unknown\n state?: () => unknown\n expanded?: (props: { row: AnyRow; close: () => void }) => unknown\n}>()\n\nconst ctx = useDataTableContext()\nconst root = ref<HTMLElement | null>(null)\nconst scrollEl = ref<HTMLElement | null>(null)\nconst layout = props.layout\n\n// Dokunmatikte Compact → Standard (02 · Yoğunluk); satır yüksekliği buna göre.\nconst coarse = typeof matchMedia === 'function' && matchMedia('(pointer: coarse)').matches\nconst density = computed<Density>(() => (coarse && props.density === 'compact' ? 'standard' : props.density))\n\n// Seçim (40; telefonda 48) ve ⋯ sütunları düzenin dışında: track'ler başa/sona eklenir, sabit sütun ofsetleri o kadar kayar.\n// ⋯ sütunu içeriğe göre (05 §4): dolgu 8 + ⋯ + 8; sayfada hatalı satır varsa (D35) + ikon + gap; inline aksiyon başına (D36,\n// sayfadaki en kalabalık satır) + düğme + gap. Ölçü token'lardan (02 · Ölçek), CSS: .dt-cell-menu, .dt-row-error.\nconst SELECT_W = 40\nconst SELECT_W_PHONE = 48\nconst MENU_PAD = 8\nconst selW = computed(() => (props.selectable ? (props.phone ? SELECT_W_PHONE : SELECT_W) : 0))\nconst anyError = computed(() => !!props.rowError && props.rows.some((r) => errorOf(r).length > 0))\nconst maxInline = computed(() => {\n const actions = props.rowActions ?? []\n if (!actions.some((a) => a.inline)) return 0\n return props.rows.reduce((m, r) => Math.max(m, inlineActionsOf(actions, r).length), 0)\n})\nconst menuW = computed(() => {\n if (!props.rowMenu) return ''\n const err = anyError.value ? ' + var(--dt-icon) - 2px + var(--dt-space)' : ''\n const n = maxInline.value\n return `calc(${2 * MENU_PAD}px${err} + ${n + 1} * var(--dt-control-h-sm) + ${n} * var(--dt-space))`\n})\n// Genişlikler ve sabit ofsetleri Vue render'ı dışında, senkron (05 · Resize: kare başına < 1 ms).\nwatchEffect(\n () => {\n const el = root.value\n if (!el) return\n const cols = [selW.value ? `${selW.value}px` : '', layout.colsVar.value, menuW.value]\n el.style.setProperty('--cols', cols.filter(Boolean).join(' '))\n const min = `${layout.minWidth.value + selW.value}px`\n el.style.setProperty('--dt-min-w', menuW.value ? `calc(${min} + ${menuW.value})` : min)\n el.style.setProperty('--dt-sel-w', `${selW.value}px`)\n el.style.setProperty('--dt-menu-w', menuW.value || '0px')\n const startVars = new Set(layout.start.value.map((c) => c.offsetVar))\n const endVars = new Set(layout.end.value.map((c) => c.offsetVar))\n for (const [name, value] of Object.entries(layout.offsetVars.value)) {\n if (startVars.has(name)) el.style.setProperty(name, `${parseFloat(value) + selW.value}px`)\n else if (endVars.has(name) && menuW.value) el.style.setProperty(name, `calc(${value} + ${menuW.value})`)\n else el.style.setProperty(name, value)\n }\n },\n { flush: 'sync' },\n)\n\n// Satır yüksekliği token'dan (02): yoğunluk değişince yeniden okunur; jsdom'da boş gelir → 40.\nconst rowHeight = ref(40)\n// Sticky header akış içinde: sanal öğeler header kadar aşağıda başlar (TanStack `scrollMargin`), header görünür alanın üstünü\n// (`scrollPaddingStart`), yatay kaydırma çubuğu altını (`scrollPaddingEnd`) örter. Yoksa ↓ ile inen satır tam bir header\n// yüksekliği kadar kabın altında kalır (08 §2).\nconst headH = ref(36)\nconst barH = ref(0)\nconst readBarH = () => {\n const el = scrollEl.value\n barH.value = el ? Math.max(0, el.offsetHeight - el.clientHeight) : 0\n // Yer kaplayan kaydırma çubukları (Windows, macOS \"her zaman\"): kaydırma hapı çubukların iç köşesine göre durur.\n root.value?.style.setProperty('--dt-bar-w', `${el ? Math.max(0, el.offsetWidth - el.clientWidth) : 0}px`)\n root.value?.style.setProperty('--dt-bar-h', `${barH.value}px`)\n}\nconst readRowHeight = () => {\n const v = root.value ? parseFloat(getComputedStyle(root.value).getPropertyValue('--dt-row-h')) : NaN\n rowHeight.value = Number.isFinite(v) ? v : 40\n headH.value = root.value?.querySelector<HTMLElement>('.dt-head')?.offsetHeight ?? headH.value\n readBarH()\n}\nonMounted(readRowHeight)\nwatch([density, () => props.phone], () => requestAnimationFrame(readRowHeight))\n\nconst env = computed<RenderEnv>(() => ({\n fmt: getFormat(ctx.locale),\n i18n: ctx.i18n,\n today: new Date(),\n labels,\n density: density.value,\n coarse,\n}))\nconst labels = props.labels ?? new RemoteLabels()\n\n/** Sütunun header ve gövde hücreleri (id'de nokta olabilir: CSS.escape yerine dataset karşılaştırması). */\nconst cellsOf = (id: string) =>\n [...(root.value?.querySelectorAll<HTMLElement>('[data-col]') ?? [])].filter((c) => c.dataset.col === id)\n\nconst rowIdAt = (i: number) => layout.rowId(props.rows[i]!)\nconst isSelected = (i: number) => !!props.selection?.[rowIdAt(i)]\nconst isExpanded = (row: AnyRow) => !!props.expanded?.[layout.rowId(row)]\nconst canExpandRow = (row: AnyRow) => !!props.expandable && (props.canExpand?.(row) ?? true)\nconst labelOf = (row: AnyRow) => props.primaryLabel?.(row) ?? layout.rowId(row)\nconst uid = useId()\nconst subrowId = (row: AnyRow) => `${uid}-sub-${layout.rowId(row)}`\nconst rowUid = (row: AnyRow) => `${uid}-r-${layout.rowId(row)}`\n/** `rowError` sonucunu mesaj listesine indirger; boş metinler düşer, boş liste = hata yok. */\nconst errorOf = (row: AnyRow): string[] => {\n const e = props.rowError?.(row)\n return (Array.isArray(e) ? e : [e]).filter((m): m is string => !!m)\n}\n// Odak bir satırdaki widget'tayken o satır DOM'da kalır (08 §2): kaydırma odağı kaybettirmez.\nconst focusedIndex = ref(-1)\nconst onFocusin = (e: FocusEvent) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.dt-row[data-index]')\n focusedIndex.value = row ? Number(row.dataset.index) : -1\n}\n\n// Checkbox ⇧ aralığının çapası (05 §6).\nlet anchor = -1\nconst idsBetween = (a: number, b: number) => {\n const [from, to] = a < b ? [a, b] : [b, a]\n return props.rows.slice(from, to + 1).map((r) => layout.rowId(r))\n}\nconst menuIndex = ref(-1)\n/** Checkbox: ⇧ ile son tıklanan satırla arasındaki aralık aynı değere (05 §6). */\nconst onSelect = (i: number, value: boolean, shift: boolean) => {\n emit('select-rows', shift && anchor >= 0 ? idsBetween(anchor, i) : [rowIdAt(i)], value)\n anchor = i\n}\nconst selectedCount = computed(() =>\n props.selectable ? props.rows.reduce((n, r) => n + (props.selection?.[layout.rowId(r)] ? 1 : 0), 0) : 0,\n)\nconst allSelected = computed(() => props.rows.length > 0 && selectedCount.value === props.rows.length)\nconst someSelected = computed(() => selectedCount.value > 0 && !allSelected.value)\n\nconst skeleton = computed(() => !!props.skeleton)\nconst count = computed(() => (skeleton.value ? 12 : props.rows.length))\n\nconst virtualizer = useVirtualizer(\n computed(() => ({\n count: count.value,\n getScrollElement: () => scrollEl.value,\n estimateSize: () => rowHeight.value + 1, // + 1 px alt kenarlık (02)\n scrollMargin: headH.value,\n scrollPaddingStart: headH.value,\n scrollPaddingEnd: barH.value,\n overscan: 10,\n getItemKey: (i: number) => (skeleton.value ? `sk-${i}` : layout.rowId(props.rows[i]!)),\n // Odaklı satır her zaman DOM'da (08 §2).\n rangeExtractor: (range: { startIndex: number; endIndex: number; overscan: number; count: number }) => {\n const start = Math.max(0, range.startIndex - range.overscan)\n const end = Math.min(range.count - 1, range.endIndex + range.overscan)\n const out: number[] = []\n const f = focusedIndex.value\n if (!skeleton.value && f >= 0 && f < start && f < range.count) out.push(f)\n for (let i = start; i <= end; i++) out.push(i)\n if (!skeleton.value && f > end && f < range.count) out.push(f)\n return out\n },\n })),\n)\nconst virtualRows = computed(() => virtualizer.value.getVirtualItems())\nconst totalSize = computed(() => virtualizer.value.getTotalSize())\n// Açık detay: öğe (satır + alt satır) ölçülür, anahtarla önbellekte kalır; kapanınca satır yüksekliğine döner (05 §7).\nconst measureItem = (el: Element | null, index: number) => {\n if (el && !skeleton.value && isExpanded(props.rows[index])) virtualizer.value.measureElement(el)\n}\nwatch(\n () => new Set(Object.keys(props.expanded ?? {}).filter((k) => props.expanded![k])),\n (now, before) => {\n for (const key of before ?? []) {\n if (now.has(key)) continue\n const i = props.rows.findIndex((r) => layout.rowId(r) === key)\n if (i >= 0) virtualizer.value.resizeItem(i, rowHeight.value + 1)\n }\n },\n)\n\n// Sabit sütun kenar gölgesi yalnızca o yöne kaydırılmışken (05 §4 · Pinned). Dikey kaydırmada konum hapı (05 §8).\nconst scrolledStart = shallowRef(false)\nconst scrolledEnd = shallowRef(false)\nconst pill = shallowRef<{ from: number; to: number } | null>(null)\nlet pillTimer: ReturnType<typeof setTimeout> | undefined\nlet lastTop = 0\nconst onScroll = () => {\n const el = scrollEl.value\n if (!el) return\n readBarH()\n scrolledStart.value = el.scrollLeft > 0\n scrolledEnd.value = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n if (el.scrollTop === lastTop) return\n lastTop = el.scrollTop\n const range = virtualizer.value.range\n if (!range || skeleton.value) return\n pill.value = { from: props.rowIndexOffset + range.startIndex + 1, to: props.rowIndexOffset + range.endIndex + 1 }\n clearTimeout(pillTimer)\n pillTimer = setTimeout(() => (pill.value = null), 900)\n}\nconst pillText = computed(() =>\n pill.value ? ctx.i18n.t('page.scrollPos', { from: pill.value.from, to: pill.value.to }) : '',\n)\nonMounted(() => {\n onScroll()\n if (scrollEl.value && typeof ResizeObserver !== 'undefined') new ResizeObserver(onScroll).observe(scrollEl.value)\n})\nonBeforeUnmount(() => clearTimeout(pillTimer))\n\n// Satır tıklaması: tek guard (05 §7). Sürükleme tespiti için mousedown noktası.\nlet downPoint: { x: number; y: number } | null = null\nconst onMousedown = (e: MouseEvent) => {\n downPoint = { x: e.clientX, y: e.clientY }\n}\nconst onClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n const rowEl = target.closest<HTMLElement>('.dt-row[data-index]')\n if (!rowEl) return\n const row = props.rows[Number(rowEl.dataset.index)]\n if (!row) return\n // Birincil linke düz sol tık → row-open; değiştirici tuş / orta tık tarayıcıya (D6).\n const link = target.closest('a.dt-link')\n if (link && link.closest('.dt-cell.is-primary') && rowEl.contains(link)) {\n if (e.button === 0 && !e.metaKey && !e.ctrlKey && !e.shiftKey && !e.altKey) emit('row-open', toRaw(row), e)\n return\n }\n if (isPlainRowClick(e, rowEl, downPoint)) emit('row-click', toRaw(row), e)\n}\n\nconst sortOf = (id: string) => props.sort?.get(id)\nconst columnSortable = (c: LayoutColumn<AnyRow>) =>\n props.sortable && (c.def.sortable ?? TYPE_SPECS[c.def.type].sortable)\n\n/** Sütun menüsü ve ⌥⇧←/→ (05 §4): sıralama dışındakiler düzenin kendi işi. Taşınan başlığın odağı korunur. */\nconst onHeaderAction = (col: LayoutColumn<AnyRow>, action: HeaderAction) => {\n switch (action) {\n case 'filter':\n emit('header-filter', col.id)\n return\n case 'sort-asc':\n case 'sort-desc':\n case 'sort-clear':\n emit('sort-set', col.id, action === 'sort-clear' ? null : action === 'sort-asc' ? 'asc' : 'desc')\n return\n case 'hide':\n layout.setVisible(col.id, false)\n return\n case 'move-left':\n case 'move-right': {\n const focused = document.activeElement?.closest<HTMLElement>('.dt-head-cell')?.dataset.col === col.id\n layout.move(col.id, action === 'move-left' ? -1 : 1)\n if (focused) void nextTick(() => cellsOf(col.id)[0]?.querySelector<HTMLElement>('.dt-head-label')?.focus())\n }\n }\n}\n// Sayfa/sorgu değişiminde ⇧ aralığının çapası sıfırlanır. Dizi kimliği değil anahtar dizisi izlenir: seçim değişince satır modeli\n// yeniden hesaplanır ama satırlar aynıdır.\nwatch(\n () => props.rows.map((r) => layout.rowId(r)).join('\\u0000'),\n () => (anchor = -1),\n)\n// estimateSize değişimi ölçüm önbelleğini yenilemez (virtual-core memo'su count/getItemKey'e bağlı): yoğunluk değişince sıfırla.\nwatch(rowHeight, () => virtualizer.value.measure())\n\ndefineExpose({\n scrollToIndex: (i: number) => virtualizer.value.scrollToIndex(i),\n scrollToTop: () => {\n if (scrollEl.value) scrollEl.value.scrollTop = 0\n },\n /** Ölçüm önbelleğini sıfırlar (sorgu/sayfa sonrası açıklar kapanınca, 05 §7). */\n measure: () => virtualizer.value.measure(),\n})\n</script>\n\n<template>\n <div\n ref=\"root\"\n class=\"dt-grid\"\n :class=\"{\n 'is-scrolled-start': scrolledStart,\n 'is-scrolled-end': scrolledEnd,\n 'is-skeleton': skeleton,\n 'is-dim': dim,\n 'has-vlines': verticalLines,\n 'is-phone': phone,\n }\"\n role=\"table\"\n :aria-label=\"label\"\n :aria-rowcount=\"rowCount\"\n :aria-colcount=\"layout.columns.value.length + (selectable ? 1 : 0) + (rowMenu ? 1 : 0)\"\n :aria-busy=\"loading || dim ? 'true' : undefined\"\n :data-density=\"density\"\n @mousedown=\"onMousedown\"\n @focusin=\"onFocusin\"\n @click=\"onClick\"\n >\n <!-- Tab ile odaklanan widget'ı tarayıcı kaydırır: sticky header ve yatay çubuk payı (08 §2). -->\n <div\n ref=\"scrollEl\"\n class=\"dt-scroll\"\n :style=\"{ scrollPaddingTop: `${headH}px`, scrollPaddingBottom: `${barH}px` }\"\n @scroll.passive=\"onScroll\"\n >\n <div class=\"dt-head\" role=\"row\" aria-rowindex=\"1\">\n <div\n v-if=\"selectable\"\n class=\"dt-head-cell dt-head-select is-pinned-start\"\n :class=\"{ 'is-pin-edge': !layout.start.value.length }\"\n style=\"left: 0px\"\n role=\"columnheader\"\n >\n <input\n type=\"checkbox\"\n class=\"dt-checkbox\"\n :checked=\"allSelected\"\n :indeterminate=\"someSelected\"\n :aria-label=\"ctx.i18n.t('row.selectPageAria')\"\n @click=\"emit('select-page', !allSelected)\"\n />\n </div>\n <HeaderCell\n v-for=\"col in [...layout.start.value, ...layout.center.value]\"\n :key=\"col.id\"\n :column=\"col\"\n :sort=\"sortOf(col.id)?.dir ?? null\"\n :sort-index=\"sortOf(col.id)?.index ?? null\"\n :filtered=\"filteredColumns?.has(col.id) ?? false\"\n :resizing=\"layout.resizing.value?.id === col.id ? layout.resizing.value.size : null\"\n :sortable=\"columnSortable(col)\"\n :phone=\"phone\"\n @sort=\"(c, additive) => emit('sort', c.id, additive)\"\n @filter=\"(c) => emit('header-filter', c.id)\"\n @action=\"onHeaderAction\"\n @resize-by=\"(c, d) => layout.setWidth(c.id, layout.widthOf(c.id) + d)\"\n @resize-start=\"(c, w) => layout.setWidth(c.id, w)\"\n />\n <div class=\"dt-head-cell dt-cell-fill\" role=\"presentation\" aria-hidden=\"true\" />\n <HeaderCell\n v-for=\"col in layout.end.value\"\n :key=\"col.id\"\n :column=\"col\"\n :sort=\"sortOf(col.id)?.dir ?? null\"\n :sort-index=\"sortOf(col.id)?.index ?? null\"\n :filtered=\"filteredColumns?.has(col.id) ?? false\"\n :resizing=\"layout.resizing.value?.id === col.id ? layout.resizing.value.size : null\"\n :sortable=\"columnSortable(col)\"\n :phone=\"phone\"\n @sort=\"(c, additive) => emit('sort', c.id, additive)\"\n @filter=\"(c) => emit('header-filter', c.id)\"\n @action=\"onHeaderAction\"\n @resize-by=\"(c, d) => layout.setWidth(c.id, layout.widthOf(c.id) + d)\"\n @resize-start=\"(c, w) => layout.setWidth(c.id, w)\"\n />\n <div\n v-if=\"rowMenu\"\n class=\"dt-head-cell dt-head-menu-col is-pinned-end\"\n :class=\"{ 'is-pin-edge': !layout.end.value.length }\"\n style=\"right: 0px\"\n role=\"columnheader\"\n />\n </div>\n <div class=\"dt-body\" role=\"presentation\" :inert=\"dim || undefined\" :style=\"{ height: `${totalSize}px` }\">\n <div\n v-for=\"item in virtualRows\"\n :key=\"String(item.key)\"\n :ref=\"(el) => measureItem(el as Element | null, item.index)\"\n class=\"dt-item\"\n :data-index=\"item.index\"\n :style=\"{ transform: `translateY(${item.start - headH}px)` }\"\n >\n <SkeletonRow v-if=\"skeleton\" :index=\"item.index\" :columns=\"layout.columns.value\" />\n <template v-else>\n <Row\n :row=\"rows[item.index]!\"\n :index=\"item.index\"\n :row-index=\"2 + rowIndexOffset + item.index\"\n :columns=\"layout.columns.value\"\n :env=\"env\"\n :secondary-visible=\"density === 'comfortable'\"\n :label=\"labelOf(rows[item.index])\"\n :selectable=\"selectable\"\n :selected=\"isSelected(item.index)\"\n :select-edge=\"!layout.start.value.length\"\n :expandable=\"expandable\"\n :can-expand=\"canExpandRow(rows[item.index])\"\n :expanded=\"isExpanded(rows[item.index])\"\n :subrow-id=\"subrowId(rows[item.index])\"\n :menu=\"rowMenu\"\n :menu-open=\"menuIndex === item.index\"\n :menu-edge=\"!layout.end.value.length\"\n :row-actions=\"rowActions\"\n :error=\"errorOf(rows[item.index])\"\n :uid=\"rowUid(rows[item.index])\"\n :href=\"primaryHref?.(rows[item.index])\"\n :primary-header=\"primaryHeader\"\n @select=\"(v, shift) => onSelect(item.index, v, shift)\"\n @expand=\"emit('toggle-expand', rowIdAt(item.index), !isExpanded(rows[item.index]))\"\n @menu-open=\"(o) => (menuIndex = o ? item.index : -1)\"\n @open=\"(e) => emit('row-open', toRaw(rows[item.index]), e)\"\n @copy=\"emit('copy-id', toRaw(rows[item.index]))\"\n />\n <div\n v-if=\"isExpanded(rows[item.index])\"\n :id=\"subrowId(rows[item.index])\"\n class=\"dt-subrow\"\n role=\"row\"\n :aria-rowindex=\"2 + rowIndexOffset + item.index\"\n >\n <div role=\"cell\" :aria-colspan=\"layout.columns.value.length\">\n <slot\n name=\"expanded\"\n :row=\"toRaw(rows[item.index])\"\n :close=\"() => emit('toggle-expand', rowIdAt(item.index), false)\"\n />\n </div>\n </div>\n </template>\n </div>\n </div>\n </div>\n <div v-if=\"refreshing\" class=\"dt-refresh-bar\" aria-hidden=\"true\" />\n <div v-if=\"$slots.notice\" class=\"dt-notice\" role=\"status\"><slot name=\"notice\" /></div>\n <div v-if=\"$slots.state && !skeleton && rows.length === 0\" class=\"dt-body-state\"><slot name=\"state\" /></div>\n <div class=\"dt-scroll-pill\" :class=\"{ 'is-visible': pill }\" aria-hidden=\"true\">{{ pillText }}</div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Izgara kökü (05 §2–4, §6–8, §10; 08 §1–3; brief §5.5): tek kayan alan, sticky header, sabit sütunlar + koşullu kenar gölgesi,\n// sanal satırlar (@tanstack/vue-virtual; öğe = satır + açık detay, ölçülen yükseklik), header klavyesi ve sütun menüsü (D38: satır\n// klavyesi yok, widget'lar doğal Tab sırasında), seçim sütunu (40 px) ve ⋯ sütunu (44 px; hatalı satır varken 66), satır menüsü, kaydırma hapı. Veri çekmez, sütun düzenini dışarıdan\n// (useColumnLayout) alır; seçim/expand durumunu üstten alır ve niyet olarak yayar.\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, toRaw, useId, watch, watchEffect } from 'vue'\n\n// İç bileşen: satır tipi dış bileşende (DataTable) tiplidir; accessor/cell parametreleri karşıt değişken olduğundan burada any.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyRow = any\nimport type { Density } from '../../types/core'\nimport type { RowAction } from '../../types/list'\nimport { RemoteLabels } from '../cells/remoteLabels'\nimport type { RenderEnv } from '../cells/renderCell'\nimport { TYPE_SPECS } from '../cells/specs'\nimport type { ColumnLayoutApi, LayoutColumn } from '../columns/useColumnLayout'\nimport { getFormat } from '../format'\nimport { isPlainRowClick } from '../interaction/isInteractive'\nimport { useDataTableContext } from '../plugin'\nimport HeaderCell from './HeaderCell.vue'\nimport type { HeaderAction } from './headerActions'\nimport { inlineActionsOf } from './inlineActions'\nimport Row from './Row'\nimport SkeletonRow from './SkeletonRow'\n\nconst props = withDefaults(\n defineProps<{\n layout: ColumnLayoutApi<AnyRow>\n rows: AnyRow[]\n density?: Density\n /** role=grid aria-label. */\n label: string\n /** aria-busy. */\n loading?: boolean\n /** 12 iskelet satır (First load, 400 ms'yi aşan sorgu değişimi). */\n skeleton?: boolean\n /** Sorgu değişimi: eski satırlar soluk + inert (05 §10 · Query change). */\n dim?: boolean\n /** Header altında 2 px belirsiz çubuk (Refreshing). */\n refreshing?: boolean\n verticalLines?: boolean\n /** aria-rowcount; bilinmiyorsa -1. */\n rowCount?: number\n /** Sayfa ofseti: aria-rowindex ve kaydırma hapı (05 §8). */\n rowIndexOffset?: number\n sort?: ReadonlyMap<string, { dir: 'asc' | 'desc'; index: number | null }>\n filteredColumns?: ReadonlySet<string>\n sortable?: boolean\n /** `ajax`/`user` etiket önbelleği; DataTable filtre çipleriyle paylaşır. */\n labels?: RemoteLabels\n /** Seçim sütunu (05 §6); durum `selection` (anahtar → seçili). */\n selectable?: boolean\n selection?: Record<string, boolean>\n /** Birincil hücrede chevron + alt satır (05 §7); durum `expanded` (anahtar → açık). */\n expandable?: boolean\n expanded?: Record<string, boolean>\n canExpand?: (row: AnyRow) => boolean\n /** ⋯ sütunu ve satır menüsü: Open / Copy yerleşik, `rowActions` uygulamanın. */\n rowMenu?: boolean\n rowActions?: RowAction[]\n /** Satır hatası (05 §4, D35): metin/metin listesi; boş → yok. */\n rowError?: (row: AnyRow) => string | string[] | null | undefined\n primaryHref?: (row: AnyRow) => string | undefined\n primaryLabel?: (row: AnyRow) => string\n primaryHeader?: string\n /** Telefon (05 §11): seçim sütunu 48, satır 48 px, kısa header; sabitleme useColumnLayout'ta. */\n phone?: boolean\n }>(),\n { density: 'standard', loading: false, rowCount: -1, rowIndexOffset: 0, sortable: false },\n)\nconst emit = defineEmits<{\n 'row-click': [row: AnyRow, event: MouseEvent]\n /** Birincil linke düz sol tık, satırda ↵, menüde Open (05 §7). Native navigasyon dinleyicide durdurulabilir. */\n 'row-open': [row: AnyRow, event: MouseEvent]\n 'select-rows': [ids: string[], value: boolean]\n 'select-page': [value: boolean]\n 'toggle-expand': [id: string, value: boolean]\n 'copy-id': [row: AnyRow]\n sort: [columnId: string, additive: boolean]\n 'sort-set': [columnId: string, dir: 'asc' | 'desc' | null]\n 'header-filter': [columnId: string]\n}>()\ndefineSlots<{\n notice?: () => unknown\n state?: () => unknown\n expanded?: (props: { row: AnyRow; close: () => void }) => unknown\n}>()\n\nconst ctx = useDataTableContext()\nconst root = ref<HTMLElement | null>(null)\nconst scrollEl = ref<HTMLElement | null>(null)\nconst layout = props.layout\n\n// Dokunmatikte Compact → Standard (02 · Yoğunluk); satır yüksekliği buna göre.\nconst coarse = typeof matchMedia === 'function' && matchMedia('(pointer: coarse)').matches\nconst density = computed<Density>(() => (coarse && props.density === 'compact' ? 'standard' : props.density))\n\n// Seçim (40; telefonda 48) ve ⋯ sütunları düzenin dışında: track'ler başa/sona eklenir, sabit sütun ofsetleri o kadar kayar.\n// ⋯ sütunu içeriğe göre (05 §4): dolgu 8 + ⋯ + 8; sayfada hatalı satır varsa (D35) + ikon + gap; inline aksiyon başına (D36,\n// sayfadaki en kalabalık satır) + düğme + gap. Ölçü token'lardan (02 · Ölçek), CSS: .dt-cell-menu, .dt-row-error.\nconst SELECT_W = 40\nconst SELECT_W_PHONE = 48\nconst MENU_PAD = 8\nconst selW = computed(() => (props.selectable ? (props.phone ? SELECT_W_PHONE : SELECT_W) : 0))\nconst anyError = computed(() => !!props.rowError && props.rows.some((r) => errorOf(r).length > 0))\nconst maxInline = computed(() => {\n const actions = props.rowActions ?? []\n if (!actions.some((a) => a.inline)) return 0\n return props.rows.reduce((m, r) => Math.max(m, inlineActionsOf(actions, r).length), 0)\n})\nconst menuW = computed(() => {\n if (!props.rowMenu) return ''\n const err = anyError.value ? ' + var(--dt-icon) - 2px + var(--dt-space)' : ''\n const n = maxInline.value\n return `calc(${2 * MENU_PAD}px${err} + ${n + 1} * var(--dt-control-h-sm) + ${n} * var(--dt-space))`\n})\n// Genişlikler ve sabit ofsetleri Vue render'ı dışında, senkron (05 · Resize: kare başına < 1 ms).\nwatchEffect(\n () => {\n const el = root.value\n if (!el) return\n const cols = [selW.value ? `${selW.value}px` : '', layout.colsVar.value, menuW.value]\n el.style.setProperty('--cols', cols.filter(Boolean).join(' '))\n const min = `${layout.minWidth.value + selW.value}px`\n el.style.setProperty('--dt-min-w', menuW.value ? `calc(${min} + ${menuW.value})` : min)\n el.style.setProperty('--dt-sel-w', `${selW.value}px`)\n el.style.setProperty('--dt-menu-w', menuW.value || '0px')\n const startVars = new Set(layout.start.value.map((c) => c.offsetVar))\n const endVars = new Set(layout.end.value.map((c) => c.offsetVar))\n for (const [name, value] of Object.entries(layout.offsetVars.value)) {\n if (startVars.has(name)) el.style.setProperty(name, `${parseFloat(value) + selW.value}px`)\n else if (endVars.has(name) && menuW.value) el.style.setProperty(name, `calc(${value} + ${menuW.value})`)\n else el.style.setProperty(name, value)\n }\n },\n { flush: 'sync' },\n)\n\n// Satır yüksekliği token'dan (02): yoğunluk değişince yeniden okunur; jsdom'da boş gelir → 40.\nconst rowHeight = ref(40)\n// Sticky header akış içinde: sanal öğeler header kadar aşağıda başlar (TanStack `scrollMargin`), header görünür alanın üstünü\n// (`scrollPaddingStart`), yatay kaydırma çubuğu altını (`scrollPaddingEnd`) örter. Yoksa ↓ ile inen satır tam bir header\n// yüksekliği kadar kabın altında kalır (08 §2).\nconst headH = ref(36)\nconst barH = ref(0)\nconst readBarH = () => {\n const el = scrollEl.value\n barH.value = el ? Math.max(0, el.offsetHeight - el.clientHeight) : 0\n // Yer kaplayan kaydırma çubukları (Windows, macOS \"her zaman\"): kaydırma hapı çubukların iç köşesine göre durur.\n root.value?.style.setProperty('--dt-bar-w', `${el ? Math.max(0, el.offsetWidth - el.clientWidth) : 0}px`)\n root.value?.style.setProperty('--dt-bar-h', `${barH.value}px`)\n}\nconst readRowHeight = () => {\n const v = root.value ? parseFloat(getComputedStyle(root.value).getPropertyValue('--dt-row-h')) : NaN\n rowHeight.value = Number.isFinite(v) ? v : 40\n headH.value = root.value?.querySelector<HTMLElement>('.dt-head')?.offsetHeight ?? headH.value\n readBarH()\n}\nonMounted(readRowHeight)\nwatch([density, () => props.phone], () => requestAnimationFrame(readRowHeight))\n\nconst env = computed<RenderEnv>(() => ({\n fmt: getFormat(ctx.locale),\n i18n: ctx.i18n,\n today: new Date(),\n labels,\n density: density.value,\n coarse,\n}))\nconst labels = props.labels ?? new RemoteLabels()\n\n/** Sütunun header ve gövde hücreleri (id'de nokta olabilir: CSS.escape yerine dataset karşılaştırması). */\nconst cellsOf = (id: string) =>\n [...(root.value?.querySelectorAll<HTMLElement>('[data-col]') ?? [])].filter((c) => c.dataset.col === id)\n\nconst rowIdAt = (i: number) => layout.rowId(props.rows[i]!)\nconst isSelected = (i: number) => !!props.selection?.[rowIdAt(i)]\nconst isExpanded = (row: AnyRow) => !!props.expanded?.[layout.rowId(row)]\nconst canExpandRow = (row: AnyRow) => !!props.expandable && (props.canExpand?.(row) ?? true)\nconst labelOf = (row: AnyRow) => props.primaryLabel?.(row) ?? layout.rowId(row)\nconst uid = useId()\nconst subrowId = (row: AnyRow) => `${uid}-sub-${layout.rowId(row)}`\nconst rowUid = (row: AnyRow) => `${uid}-r-${layout.rowId(row)}`\n/** `rowError` sonucunu mesaj listesine indirger; boş metinler düşer, boş liste = hata yok. */\nconst errorOf = (row: AnyRow): string[] => {\n const e = props.rowError?.(row)\n return (Array.isArray(e) ? e : [e]).filter((m): m is string => !!m)\n}\n// Odak bir satırdaki widget'tayken o satır DOM'da kalır (08 §2): kaydırma odağı kaybettirmez.\nconst focusedIndex = ref(-1)\nconst onFocusin = (e: FocusEvent) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.dt-row[data-index]')\n focusedIndex.value = row ? Number(row.dataset.index) : -1\n}\n\n// Checkbox ⇧ aralığının çapası (05 §6).\nlet anchor = -1\nconst idsBetween = (a: number, b: number) => {\n const [from, to] = a < b ? [a, b] : [b, a]\n return props.rows.slice(from, to + 1).map((r) => layout.rowId(r))\n}\nconst menuIndex = ref(-1)\n/** Checkbox: ⇧ ile son tıklanan satırla arasındaki aralık aynı değere (05 §6). */\nconst onSelect = (i: number, value: boolean, shift: boolean) => {\n emit('select-rows', shift && anchor >= 0 ? idsBetween(anchor, i) : [rowIdAt(i)], value)\n anchor = i\n}\nconst selectedCount = computed(() =>\n props.selectable ? props.rows.reduce((n, r) => n + (props.selection?.[layout.rowId(r)] ? 1 : 0), 0) : 0,\n)\nconst allSelected = computed(() => props.rows.length > 0 && selectedCount.value === props.rows.length)\nconst someSelected = computed(() => selectedCount.value > 0 && !allSelected.value)\n\nconst skeleton = computed(() => !!props.skeleton)\nconst count = computed(() => (skeleton.value ? 12 : props.rows.length))\n\nconst virtualizer = useVirtualizer(\n computed(() => ({\n count: count.value,\n getScrollElement: () => scrollEl.value,\n estimateSize: () => rowHeight.value + 1, // + 1 px alt kenarlık (02)\n scrollMargin: headH.value,\n scrollPaddingStart: headH.value,\n scrollPaddingEnd: barH.value,\n overscan: 10,\n getItemKey: (i: number) => (skeleton.value ? `sk-${i}` : layout.rowId(props.rows[i]!)),\n // Odaklı satır her zaman DOM'da (08 §2).\n rangeExtractor: (range: { startIndex: number; endIndex: number; overscan: number; count: number }) => {\n const start = Math.max(0, range.startIndex - range.overscan)\n const end = Math.min(range.count - 1, range.endIndex + range.overscan)\n const out: number[] = []\n const f = focusedIndex.value\n if (!skeleton.value && f >= 0 && f < start && f < range.count) out.push(f)\n for (let i = start; i <= end; i++) out.push(i)\n if (!skeleton.value && f > end && f < range.count) out.push(f)\n return out\n },\n })),\n)\nconst virtualRows = computed(() => virtualizer.value.getVirtualItems())\nconst totalSize = computed(() => virtualizer.value.getTotalSize())\n// Açık detay: öğe (satır + alt satır) ölçülür, anahtarla önbellekte kalır; kapanınca satır yüksekliğine döner (05 §7).\nconst measureItem = (el: Element | null, index: number) => {\n if (el && !skeleton.value && isExpanded(props.rows[index])) virtualizer.value.measureElement(el)\n}\nwatch(\n () => new Set(Object.keys(props.expanded ?? {}).filter((k) => props.expanded![k])),\n (now, before) => {\n for (const key of before ?? []) {\n if (now.has(key)) continue\n const i = props.rows.findIndex((r) => layout.rowId(r) === key)\n if (i >= 0) virtualizer.value.resizeItem(i, rowHeight.value + 1)\n }\n },\n)\n\n// Sabit sütun kenar gölgesi yalnızca o yöne kaydırılmışken (05 §4 · Pinned). Dikey kaydırmada konum hapı (05 §8).\nconst scrolledStart = shallowRef(false)\nconst scrolledEnd = shallowRef(false)\nconst pill = shallowRef<{ from: number; to: number } | null>(null)\nlet pillTimer: ReturnType<typeof setTimeout> | undefined\nlet lastTop = 0\nconst onScroll = () => {\n const el = scrollEl.value\n if (!el) return\n readBarH()\n scrolledStart.value = el.scrollLeft > 0\n scrolledEnd.value = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n if (el.scrollTop === lastTop) return\n lastTop = el.scrollTop\n const range = virtualizer.value.range\n if (!range || skeleton.value) return\n pill.value = { from: props.rowIndexOffset + range.startIndex + 1, to: props.rowIndexOffset + range.endIndex + 1 }\n clearTimeout(pillTimer)\n pillTimer = setTimeout(() => (pill.value = null), 900)\n}\nconst pillText = computed(() =>\n pill.value ? ctx.i18n.t('page.scrollPos', { from: pill.value.from, to: pill.value.to }) : '',\n)\nonMounted(() => {\n onScroll()\n if (scrollEl.value && typeof ResizeObserver !== 'undefined') new ResizeObserver(onScroll).observe(scrollEl.value)\n})\nonBeforeUnmount(() => clearTimeout(pillTimer))\n\n// Satır tıklaması: tek guard (05 §7). Sürükleme tespiti için mousedown noktası.\nlet downPoint: { x: number; y: number } | null = null\nconst onMousedown = (e: MouseEvent) => {\n downPoint = { x: e.clientX, y: e.clientY }\n}\nconst onClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n const rowEl = target.closest<HTMLElement>('.dt-row[data-index]')\n if (!rowEl) return\n const row = props.rows[Number(rowEl.dataset.index)]\n if (!row) return\n // Birincil linke düz sol tık → row-open; değiştirici tuş / orta tık tarayıcıya (D6).\n const link = target.closest('a.dt-link')\n if (link && link.closest('.dt-cell.is-primary') && rowEl.contains(link)) {\n if (e.button === 0 && !e.metaKey && !e.ctrlKey && !e.shiftKey && !e.altKey) emit('row-open', toRaw(row), e)\n return\n }\n if (isPlainRowClick(e, rowEl, downPoint)) emit('row-click', toRaw(row), e)\n}\n\nconst sortOf = (id: string) => props.sort?.get(id)\nconst columnSortable = (c: LayoutColumn<AnyRow>) =>\n props.sortable && (c.def.sortable ?? TYPE_SPECS[c.def.type].sortable)\n\n/** Sütun menüsü ve ⌥⇧←/→ (05 §4): sıralama dışındakiler düzenin kendi işi. Taşınan başlığın odağı korunur. */\nconst onHeaderAction = (col: LayoutColumn<AnyRow>, action: HeaderAction) => {\n switch (action) {\n case 'filter':\n emit('header-filter', col.id)\n return\n case 'sort-asc':\n case 'sort-desc':\n case 'sort-clear':\n emit('sort-set', col.id, action === 'sort-clear' ? null : action === 'sort-asc' ? 'asc' : 'desc')\n return\n case 'hide':\n layout.setVisible(col.id, false)\n return\n case 'move-left':\n case 'move-right': {\n const focused = document.activeElement?.closest<HTMLElement>('.dt-head-cell')?.dataset.col === col.id\n layout.move(col.id, action === 'move-left' ? -1 : 1)\n if (focused) void nextTick(() => cellsOf(col.id)[0]?.querySelector<HTMLElement>('.dt-head-label')?.focus())\n }\n }\n}\n// Sayfa/sorgu değişiminde ⇧ aralığının çapası sıfırlanır. Dizi kimliği değil anahtar dizisi izlenir: seçim değişince satır modeli\n// yeniden hesaplanır ama satırlar aynıdır.\nwatch(\n () => props.rows.map((r) => layout.rowId(r)).join('\\u0000'),\n () => (anchor = -1),\n)\n// estimateSize değişimi ölçüm önbelleğini yenilemez (virtual-core memo'su count/getItemKey'e bağlı): yoğunluk değişince sıfırla.\nwatch(rowHeight, () => virtualizer.value.measure())\n\ndefineExpose({\n scrollToIndex: (i: number) => virtualizer.value.scrollToIndex(i),\n scrollToTop: () => {\n if (scrollEl.value) scrollEl.value.scrollTop = 0\n },\n /** Ölçüm önbelleğini sıfırlar (sorgu/sayfa sonrası açıklar kapanınca, 05 §7). */\n measure: () => virtualizer.value.measure(),\n})\n</script>\n\n<template>\n <div\n ref=\"root\"\n class=\"dt-grid\"\n :class=\"{\n 'is-scrolled-start': scrolledStart,\n 'is-scrolled-end': scrolledEnd,\n 'is-skeleton': skeleton,\n 'is-dim': dim,\n 'has-vlines': verticalLines,\n 'is-phone': phone,\n }\"\n role=\"table\"\n :aria-label=\"label\"\n :aria-rowcount=\"rowCount\"\n :aria-colcount=\"layout.columns.value.length + (selectable ? 1 : 0) + (rowMenu ? 1 : 0)\"\n :aria-busy=\"loading || dim ? 'true' : undefined\"\n :data-density=\"density\"\n @mousedown=\"onMousedown\"\n @focusin=\"onFocusin\"\n @click=\"onClick\"\n >\n <!-- Tab ile odaklanan widget'ı tarayıcı kaydırır: sticky header ve yatay çubuk payı (08 §2). -->\n <div\n ref=\"scrollEl\"\n class=\"dt-scroll\"\n :style=\"{ scrollPaddingTop: `${headH}px`, scrollPaddingBottom: `${barH}px` }\"\n @scroll.passive=\"onScroll\"\n >\n <div class=\"dt-head\" role=\"row\" aria-rowindex=\"1\">\n <div\n v-if=\"selectable\"\n class=\"dt-head-cell dt-head-select is-pinned-start\"\n :class=\"{ 'is-pin-edge': !layout.start.value.length }\"\n style=\"left: 0px\"\n role=\"columnheader\"\n >\n <input\n type=\"checkbox\"\n class=\"dt-checkbox\"\n :checked=\"allSelected\"\n :indeterminate=\"someSelected\"\n :aria-label=\"ctx.i18n.t('row.selectPageAria')\"\n @click=\"emit('select-page', !allSelected)\"\n />\n </div>\n <HeaderCell\n v-for=\"col in [...layout.start.value, ...layout.center.value]\"\n :key=\"col.id\"\n :column=\"col\"\n :sort=\"sortOf(col.id)?.dir ?? null\"\n :sort-index=\"sortOf(col.id)?.index ?? null\"\n :filtered=\"filteredColumns?.has(col.id) ?? false\"\n :resizing=\"layout.resizing.value?.id === col.id ? layout.resizing.value.size : null\"\n :sortable=\"columnSortable(col)\"\n :phone=\"phone\"\n @sort=\"(c, additive) => emit('sort', c.id, additive)\"\n @filter=\"(c) => emit('header-filter', c.id)\"\n @action=\"onHeaderAction\"\n @resize-by=\"(c, d) => layout.setWidth(c.id, layout.widthOf(c.id) + d)\"\n @resize-start=\"(c, w) => layout.setWidth(c.id, w)\"\n />\n <div class=\"dt-head-cell dt-cell-fill\" role=\"presentation\" aria-hidden=\"true\" />\n <HeaderCell\n v-for=\"col in layout.end.value\"\n :key=\"col.id\"\n :column=\"col\"\n :sort=\"sortOf(col.id)?.dir ?? null\"\n :sort-index=\"sortOf(col.id)?.index ?? null\"\n :filtered=\"filteredColumns?.has(col.id) ?? false\"\n :resizing=\"layout.resizing.value?.id === col.id ? layout.resizing.value.size : null\"\n :sortable=\"columnSortable(col)\"\n :phone=\"phone\"\n @sort=\"(c, additive) => emit('sort', c.id, additive)\"\n @filter=\"(c) => emit('header-filter', c.id)\"\n @action=\"onHeaderAction\"\n @resize-by=\"(c, d) => layout.setWidth(c.id, layout.widthOf(c.id) + d)\"\n @resize-start=\"(c, w) => layout.setWidth(c.id, w)\"\n />\n <div\n v-if=\"rowMenu\"\n class=\"dt-head-cell dt-head-menu-col is-pinned-end\"\n :class=\"{ 'is-pin-edge': !layout.end.value.length }\"\n style=\"right: 0px\"\n role=\"columnheader\"\n />\n </div>\n <div class=\"dt-body\" role=\"presentation\" :inert=\"dim || undefined\" :style=\"{ height: `${totalSize}px` }\">\n <div\n v-for=\"item in virtualRows\"\n :key=\"String(item.key)\"\n :ref=\"(el) => measureItem(el as Element | null, item.index)\"\n class=\"dt-item\"\n :data-index=\"item.index\"\n :style=\"{ transform: `translateY(${item.start - headH}px)` }\"\n >\n <SkeletonRow v-if=\"skeleton\" :index=\"item.index\" :columns=\"layout.columns.value\" />\n <template v-else>\n <Row\n :row=\"rows[item.index]!\"\n :index=\"item.index\"\n :row-index=\"2 + rowIndexOffset + item.index\"\n :columns=\"layout.columns.value\"\n :env=\"env\"\n :secondary-visible=\"density === 'comfortable'\"\n :label=\"labelOf(rows[item.index])\"\n :selectable=\"selectable\"\n :selected=\"isSelected(item.index)\"\n :select-edge=\"!layout.start.value.length\"\n :expandable=\"expandable\"\n :can-expand=\"canExpandRow(rows[item.index])\"\n :expanded=\"isExpanded(rows[item.index])\"\n :subrow-id=\"subrowId(rows[item.index])\"\n :menu=\"rowMenu\"\n :menu-open=\"menuIndex === item.index\"\n :menu-edge=\"!layout.end.value.length\"\n :row-actions=\"rowActions\"\n :error=\"errorOf(rows[item.index])\"\n :uid=\"rowUid(rows[item.index])\"\n :href=\"primaryHref?.(rows[item.index])\"\n :primary-header=\"primaryHeader\"\n @select=\"(v, shift) => onSelect(item.index, v, shift)\"\n @expand=\"emit('toggle-expand', rowIdAt(item.index), !isExpanded(rows[item.index]))\"\n @menu-open=\"(o) => (menuIndex = o ? item.index : -1)\"\n @open=\"(e) => emit('row-open', toRaw(rows[item.index]), e)\"\n @copy=\"emit('copy-id', toRaw(rows[item.index]))\"\n />\n <div\n v-if=\"isExpanded(rows[item.index])\"\n :id=\"subrowId(rows[item.index])\"\n class=\"dt-subrow\"\n role=\"row\"\n :aria-rowindex=\"2 + rowIndexOffset + item.index\"\n >\n <div role=\"cell\" :aria-colspan=\"layout.columns.value.length\">\n <slot\n name=\"expanded\"\n :row=\"toRaw(rows[item.index])\"\n :close=\"() => emit('toggle-expand', rowIdAt(item.index), false)\"\n />\n </div>\n </div>\n </template>\n </div>\n </div>\n </div>\n <div v-if=\"refreshing\" class=\"dt-refresh-bar\" aria-hidden=\"true\" />\n <div v-if=\"$slots.notice\" class=\"dt-notice\" role=\"status\"><slot name=\"notice\" /></div>\n <div v-if=\"$slots.state && !skeleton && rows.length === 0\" class=\"dt-body-state\"><slot name=\"state\" /></div>\n <div class=\"dt-scroll-pill\" :class=\"{ 'is-visible': pill }\" aria-hidden=\"true\">{{ pillText }}</div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// More ⋯ menüsü (05 §3): yalnızca uygulamanın dinlediği olaylar ve verilen ayarlar; Refresh `R`, Auto-refresh switch.\n// Telefonda yerini ⋯ alt sayfası (PhoneMoreSheet) alır.\nimport { PhDotsThree } from '@phosphor-icons/vue'\nimport {\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from 'reka-ui'\nimport { useDataTableContext } from '../plugin'\n\nconst props = defineProps<{\n refresh: boolean\n /** Export menü etiketi (\"Export 100 rows\" / \"Export 3 selected rows\"); false → yok. */\n export: string | false\n import: boolean\n print: boolean\n /** `autoRefresh` prop'u verilmişse switch görünür. */\n autoRefresh: boolean\n autoRefreshOn: boolean\n}>()\nconst emit = defineEmits<{\n refresh: []\n export: [format: 'csv' | 'xlsx']\n import: []\n print: []\n 'update:autoRefreshOn': [on: boolean]\n}>()\nconst { i18n } = useDataTableContext()\nconst hasActions = () => props.export || props.import || props.print\n</script>\n\n<template>\n <DropdownMenuRoot>\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n class=\"dt-btn dt-btn-icon\"\n :aria-label=\"i18n.t('toolbar.more')\"\n :data-dt-tip=\"i18n.t('toolbar.more')\"\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent class=\"dt-menu dt-more-menu\" align=\"end\" :side-offset=\"4\">\n <DropdownMenuSub v-if=\"$props.export\">\n <DropdownMenuSubTrigger class=\"dt-menu-item\">{{ $props.export }}</DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent class=\"dt-menu\" :side-offset=\"4\">\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"emit('export', 'csv')\">\n {{ i18n.t('toolbar.csv') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"emit('export', 'xlsx')\">\n {{ i18n.t('toolbar.xlsx') }}\n </DropdownMenuItem>\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n <DropdownMenuItem v-if=\"$props.import\" class=\"dt-menu-item\" @select=\"emit('import')\">\n {{ i18n.t('toolbar.import') }}\n </DropdownMenuItem>\n <DropdownMenuItem v-if=\"print\" class=\"dt-menu-item\" @select=\"emit('print')\">\n {{ i18n.t('toolbar.print') }}\n </DropdownMenuItem>\n <DropdownMenuSeparator v-if=\"hasActions() && (refresh || autoRefresh)\" class=\"dt-menu-sep\" />\n <DropdownMenuItem v-if=\"refresh\" class=\"dt-menu-item\" @select=\"emit('refresh')\">\n {{ i18n.t('toolbar.refresh') }}\n <kbd class=\"dt-kbd\">R</kbd>\n </DropdownMenuItem>\n <DropdownMenuCheckboxItem\n v-if=\"autoRefresh\"\n class=\"dt-menu-item\"\n :model-value=\"autoRefreshOn\"\n @update:model-value=\"(v) => emit('update:autoRefreshOn', v === true)\"\n >\n {{ i18n.t('toolbar.autoRefresh') }}\n <span class=\"dt-switch dt-pop-end\" :data-state=\"autoRefreshOn ? 'checked' : 'unchecked'\" aria-hidden=\"true\">\n <span class=\"dt-switch-thumb\" />\n </span>\n </DropdownMenuCheckboxItem>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n</template>\n","<script setup lang=\"ts\">\n// More ⋯ menüsü (05 §3): yalnızca uygulamanın dinlediği olaylar ve verilen ayarlar; Refresh `R`, Auto-refresh switch.\n// Telefonda yerini ⋯ alt sayfası (PhoneMoreSheet) alır.\nimport { PhDotsThree } from '@phosphor-icons/vue'\nimport {\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from 'reka-ui'\nimport { useDataTableContext } from '../plugin'\n\nconst props = defineProps<{\n refresh: boolean\n /** Export menü etiketi (\"Export 100 rows\" / \"Export 3 selected rows\"); false → yok. */\n export: string | false\n import: boolean\n print: boolean\n /** `autoRefresh` prop'u verilmişse switch görünür. */\n autoRefresh: boolean\n autoRefreshOn: boolean\n}>()\nconst emit = defineEmits<{\n refresh: []\n export: [format: 'csv' | 'xlsx']\n import: []\n print: []\n 'update:autoRefreshOn': [on: boolean]\n}>()\nconst { i18n } = useDataTableContext()\nconst hasActions = () => props.export || props.import || props.print\n</script>\n\n<template>\n <DropdownMenuRoot>\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n class=\"dt-btn dt-btn-icon\"\n :aria-label=\"i18n.t('toolbar.more')\"\n :data-dt-tip=\"i18n.t('toolbar.more')\"\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent class=\"dt-menu dt-more-menu\" align=\"end\" :side-offset=\"4\">\n <DropdownMenuSub v-if=\"$props.export\">\n <DropdownMenuSubTrigger class=\"dt-menu-item\">{{ $props.export }}</DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent class=\"dt-menu\" :side-offset=\"4\">\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"emit('export', 'csv')\">\n {{ i18n.t('toolbar.csv') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"emit('export', 'xlsx')\">\n {{ i18n.t('toolbar.xlsx') }}\n </DropdownMenuItem>\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n <DropdownMenuItem v-if=\"$props.import\" class=\"dt-menu-item\" @select=\"emit('import')\">\n {{ i18n.t('toolbar.import') }}\n </DropdownMenuItem>\n <DropdownMenuItem v-if=\"print\" class=\"dt-menu-item\" @select=\"emit('print')\">\n {{ i18n.t('toolbar.print') }}\n </DropdownMenuItem>\n <DropdownMenuSeparator v-if=\"hasActions() && (refresh || autoRefresh)\" class=\"dt-menu-sep\" />\n <DropdownMenuItem v-if=\"refresh\" class=\"dt-menu-item\" @select=\"emit('refresh')\">\n {{ i18n.t('toolbar.refresh') }}\n <kbd class=\"dt-kbd\">R</kbd>\n </DropdownMenuItem>\n <DropdownMenuCheckboxItem\n v-if=\"autoRefresh\"\n class=\"dt-menu-item\"\n :model-value=\"autoRefreshOn\"\n @update:model-value=\"(v) => emit('update:autoRefreshOn', v === true)\"\n >\n {{ i18n.t('toolbar.autoRefresh') }}\n <span class=\"dt-switch dt-pop-end\" :data-state=\"autoRefreshOn ? 'checked' : 'unchecked'\" aria-hidden=\"true\">\n <span class=\"dt-switch-thumb\" />\n </span>\n </DropdownMenuCheckboxItem>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n</template>\n","<script setup lang=\"ts\">\n// Toolbar (05 §3, §11; T1, T13): yalnızca yapılandırılmış yuvalar; daralma kartın genişliğiyle (`size`, DataTable ölçer).\n// Sıra: görünüm · [arama · Filter] (tam ortada) · [Display · ⋯] │ birincil (köşeli parantez: birleşik düğme grubu, D43).\n// Masaüstünde üç sütunlu ızgara (iki yan eşit pay). ≥1024 etiketli · 640–1023 arama ve Display ikon ·\n// <640 telefon (yanlar ve gruplar display: contents, düz flex sırası):\n// görünüm · boşluk · arama · Filter · ⋯ · ayırıcı · birincil (CSS order);\n// arama açılınca toolbar'ın yerini alır (T13-03), Cancel temizleyip kapatır.\nimport { PhMagnifyingGlass } from '@phosphor-icons/vue'\nimport { computed, ref } from 'vue'\nimport { useDataTableContext } from '../plugin'\nimport SearchBox from './SearchBox.vue'\n\nconst props = defineProps<{\n size: 'full' | 'narrow' | 'phone'\n /** null: arama yuvası yok. */\n search: string | null\n searchPlaceholder: string\n hasFilter: boolean\n hasDisplay: boolean\n /** ⋯ menüsünde en az bir öğe var mı. */\n hasMore: boolean\n}>()\nconst emit = defineEmits<{ 'update:search': [value: string] }>()\nconst { i18n } = useDataTableContext()\n\nconst searchOpen = ref(false)\nconst searchBox = ref<InstanceType<typeof SearchBox> | null>(null)\nconst phone = computed(() => props.size === 'phone')\nconst phoneSearch = computed(() => phone.value && (searchOpen.value || !!props.search))\nconst openSearch = () => {\n searchOpen.value = true\n requestAnimationFrame(() => searchBox.value?.focus())\n}\nconst cancelSearch = () => {\n searchOpen.value = false\n emit('update:search', '')\n}\ndefineExpose({\n focusSearch: () => {\n if (props.size !== 'full' && !searchOpen.value && !props.search) openSearch()\n else searchBox.value?.focus()\n },\n})\n</script>\n\n<template>\n <div class=\"dt-toolbar\" :class=\"[`is-${size}`, { 'is-zoned': !phoneSearch }]\" role=\"toolbar\">\n <template v-if=\"phoneSearch\">\n <SearchBox\n ref=\"searchBox\"\n :model-value=\"search ?? ''\"\n :placeholder=\"searchPlaceholder\"\n phone\n @update:model-value=\"(v) => emit('update:search', v)\"\n />\n <button type=\"button\" class=\"dt-btn dt-btn-ghost dt-search-cancel\" @click=\"cancelSearch\">\n {{ i18n.t('common.cancel') }}\n </button>\n </template>\n <template v-else>\n <div class=\"dt-toolbar-side is-start\"><slot name=\"view\" /></div>\n <div class=\"dt-btn-group\">\n <template v-if=\"search !== null\">\n <button\n v-if=\"size !== 'full' && !searchOpen && !search\"\n type=\"button\"\n class=\"dt-btn dt-btn-icon dt-search-open\"\n :aria-label=\"searchPlaceholder\"\n :data-dt-tip=\"searchPlaceholder\"\n @click=\"openSearch\"\n >\n <PhMagnifyingGlass :size=\"phone ? 20 : 16\" aria-hidden=\"true\" />\n </button>\n <SearchBox\n v-else\n ref=\"searchBox\"\n :model-value=\"search\"\n :placeholder=\"searchPlaceholder\"\n @update:model-value=\"(v) => emit('update:search', v)\"\n @focusout=\"searchOpen = false\"\n />\n </template>\n <slot v-if=\"hasFilter\" name=\"filter\" :icon-only=\"phone\" :phone=\"phone\" />\n </div>\n <span class=\"dt-toolbar-spacer\" />\n <div class=\"dt-toolbar-side is-end\">\n <div class=\"dt-btn-group\">\n <slot v-if=\"hasDisplay && !phone\" name=\"display\" :icon-only=\"size !== 'full'\" />\n <slot v-if=\"hasMore || (hasDisplay && phone)\" name=\"more\" :phone=\"phone\" />\n </div>\n <template v-if=\"$slots.end\">\n <span class=\"dt-toolbar-sep\" aria-hidden=\"true\" />\n <span class=\"dt-toolbar-end\"><slot name=\"end\" :compact=\"phone\" /></span>\n </template>\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Toolbar (05 §3, §11; T1, T13): yalnızca yapılandırılmış yuvalar; daralma kartın genişliğiyle (`size`, DataTable ölçer).\n// Sıra: görünüm · [arama · Filter] (tam ortada) · [Display · ⋯] │ birincil (köşeli parantez: birleşik düğme grubu, D43).\n// Masaüstünde üç sütunlu ızgara (iki yan eşit pay). ≥1024 etiketli · 640–1023 arama ve Display ikon ·\n// <640 telefon (yanlar ve gruplar display: contents, düz flex sırası):\n// görünüm · boşluk · arama · Filter · ⋯ · ayırıcı · birincil (CSS order);\n// arama açılınca toolbar'ın yerini alır (T13-03), Cancel temizleyip kapatır.\nimport { PhMagnifyingGlass } from '@phosphor-icons/vue'\nimport { computed, ref } from 'vue'\nimport { useDataTableContext } from '../plugin'\nimport SearchBox from './SearchBox.vue'\n\nconst props = defineProps<{\n size: 'full' | 'narrow' | 'phone'\n /** null: arama yuvası yok. */\n search: string | null\n searchPlaceholder: string\n hasFilter: boolean\n hasDisplay: boolean\n /** ⋯ menüsünde en az bir öğe var mı. */\n hasMore: boolean\n}>()\nconst emit = defineEmits<{ 'update:search': [value: string] }>()\nconst { i18n } = useDataTableContext()\n\nconst searchOpen = ref(false)\nconst searchBox = ref<InstanceType<typeof SearchBox> | null>(null)\nconst phone = computed(() => props.size === 'phone')\nconst phoneSearch = computed(() => phone.value && (searchOpen.value || !!props.search))\nconst openSearch = () => {\n searchOpen.value = true\n requestAnimationFrame(() => searchBox.value?.focus())\n}\nconst cancelSearch = () => {\n searchOpen.value = false\n emit('update:search', '')\n}\ndefineExpose({\n focusSearch: () => {\n if (props.size !== 'full' && !searchOpen.value && !props.search) openSearch()\n else searchBox.value?.focus()\n },\n})\n</script>\n\n<template>\n <div class=\"dt-toolbar\" :class=\"[`is-${size}`, { 'is-zoned': !phoneSearch }]\" role=\"toolbar\">\n <template v-if=\"phoneSearch\">\n <SearchBox\n ref=\"searchBox\"\n :model-value=\"search ?? ''\"\n :placeholder=\"searchPlaceholder\"\n phone\n @update:model-value=\"(v) => emit('update:search', v)\"\n />\n <button type=\"button\" class=\"dt-btn dt-btn-ghost dt-search-cancel\" @click=\"cancelSearch\">\n {{ i18n.t('common.cancel') }}\n </button>\n </template>\n <template v-else>\n <div class=\"dt-toolbar-side is-start\"><slot name=\"view\" /></div>\n <div class=\"dt-btn-group\">\n <template v-if=\"search !== null\">\n <button\n v-if=\"size !== 'full' && !searchOpen && !search\"\n type=\"button\"\n class=\"dt-btn dt-btn-icon dt-search-open\"\n :aria-label=\"searchPlaceholder\"\n :data-dt-tip=\"searchPlaceholder\"\n @click=\"openSearch\"\n >\n <PhMagnifyingGlass :size=\"phone ? 20 : 16\" aria-hidden=\"true\" />\n </button>\n <SearchBox\n v-else\n ref=\"searchBox\"\n :model-value=\"search\"\n :placeholder=\"searchPlaceholder\"\n @update:model-value=\"(v) => emit('update:search', v)\"\n @focusout=\"searchOpen = false\"\n />\n </template>\n <slot v-if=\"hasFilter\" name=\"filter\" :icon-only=\"phone\" :phone=\"phone\" />\n </div>\n <span class=\"dt-toolbar-spacer\" />\n <div class=\"dt-toolbar-side is-end\">\n <div class=\"dt-btn-group\">\n <slot v-if=\"hasDisplay && !phone\" name=\"display\" :icon-only=\"size !== 'full'\" />\n <slot v-if=\"hasMore || (hasDisplay && phone)\" name=\"more\" :phone=\"phone\" />\n </div>\n <template v-if=\"$slots.end\">\n <span class=\"dt-toolbar-sep\" aria-hidden=\"true\" />\n <span class=\"dt-toolbar-end\"><slot name=\"end\" :compact=\"phone\" /></span>\n </template>\n </div>\n </template>\n </div>\n</template>\n","// Görünüm modeli (04 §7, D4, D5): varsayılan görünüm sırası, düzenlenmiş durum karşılaştırması, ad doğrulama, sıralama.\nimport type { FilterCondition } from '../../types/query'\nimport type { View, ViewState } from '../../types/views'\n\n/** Ekran açılırken: kullanıcı varsayılanı (tercih) → system `default` → ilk system view → yok (tablonun varsayılanı). */\nexport function defaultView(views: View[], preferredId: string | null | undefined): View | null {\n return (\n (preferredId ? views.find((v) => v.id === preferredId) : undefined) ??\n views.find((v) => v.kind === 'system' && v.default) ??\n views.find((v) => v.kind === 'system') ??\n null\n )\n}\n\nconst normFilter = (f: FilterCondition) => {\n const v = 'value' in f ? f.value : undefined\n return { ...f, value: Array.isArray(v) ? [...(v as unknown[])].sort() : v }\n}\nconst filtersKey = (fs: FilterCondition[]) =>\n JSON.stringify(fs.map(normFilter).sort((a, b) => a.column.localeCompare(b.column)))\nconst sorted = (ids: string[]) => [...ids].sort().join('\\u0000')\n\n/** Normalize karşılaştırma: `in` değerleri sırasız, görünürler küme, genişlikte ±2 px tolerans. */\nexport function sameState(a: ViewState, b: ViewState): boolean {\n if (filtersKey(a.filters) !== filtersKey(b.filters)) return false\n if (JSON.stringify(a.sort) !== JSON.stringify(b.sort)) return false\n const ca = a.columns\n const cb = b.columns\n if (ca.order.join('\\u0000') !== cb.order.join('\\u0000') || sorted(ca.visible) !== sorted(cb.visible)) return false\n if (ca.pinned.left.join('\\u0000') !== cb.pinned.left.join('\\u0000')) return false\n if (ca.pinned.right.join('\\u0000') !== cb.pinned.right.join('\\u0000')) return false\n for (const id of new Set([...Object.keys(ca.widths), ...Object.keys(cb.widths)])) {\n const x = ca.widths[id]\n const y = cb.widths[id]\n if (x === undefined || y === undefined ? x !== y : Math.abs(x - y) > 2) return false\n }\n return true\n}\n\nexport type NameError = 'required' | 'tooLong' | 'taken'\n/** Save as new view / Rename (04 §7): zorunlu, en fazla 60, kişisel görünümler arasında benzersiz (büyük/küçük harf duyarsız). */\nexport function nameError(name: string, views: View[], locale: string, selfId?: string): NameError | null {\n const n = name.trim()\n if (!n) return 'required'\n if (n.length > 60) return 'tooLong'\n const lower = n.toLocaleLowerCase(locale)\n const taken = views.some(\n (v) => v.kind === 'personal' && v.id !== selfId && v.name.toLocaleLowerCase(locale) === lower,\n )\n return taken ? 'taken' : null\n}\n\n/** Kişisel görünümler ada göre (yerel ayar karşılaştırması); system kod sırasında kalır. */\nexport const byName = (views: View[], collator: Intl.Collator): View[] =>\n [...views].sort((a, b) => collator.compare(a.name, b.name))\n","// Görünümler (04 §7, D4, D5, D30): `views` prop'u (system) + adapter (personal) birleşimi, açılış seçimi, düzenlenmiş\n// durum (bellekte, oturum boyu, görünüm başına), kaydet / kopyala / yeniden adlandır / sil. Paket veri çekmez (D18);\n// adapter'ı uygulama verir, yoksa kaydetme yoktur.\nimport { computed, reactive, ref, shallowRef } from 'vue'\nimport type { TableId } from '../../types/core'\nimport type { View, ViewPatch, ViewState, ViewsAdapter } from '../../types/views'\nimport { getFormat } from '../format'\nimport { byName, defaultView, sameState } from './model'\n\nexport interface ViewsOptions {\n tableId: () => TableId\n system: () => View[]\n adapter: ViewsAdapter | null\n locale: () => string\n defaultViewId: () => string | null\n setDefaultViewId: (id: string | null) => void\n /** Tercihler yüklendi; kullanıcı varsayılanı ancak o zaman bilinir. */\n prefsReady: Promise<void>\n /** Tablonun etkin durumu (filtre + sıralama + sütun düzeni). */\n current: () => ViewState\n /** Tek adımda uygular; eksik alanlar tablonun varsayılanı (tek talep). */\n apply: (patch: ViewPatch) => void\n onChange: (view: View) => void\n}\n\nexport function useViews(o: ViewsOptions) {\n const saved = ref<View[]>([])\n const all = computed(() => [...o.system(), ...saved.value])\n const sections = computed(() => {\n const collator = getFormat(o.locale()).collator()\n return {\n system: o.system(),\n personal: byName(\n saved.value.filter((v) => v.kind === 'personal'),\n collator,\n ),\n }\n })\n const activeId = ref<string | null>(null)\n const active = computed(() => all.value.find((v) => v.id === activeId.value) ?? null)\n /** Uygulandıktan sonraki etkin durum: \"edited\" bununla karşılaştırılır. */\n const baseline = shallowRef<ViewState | null>(null)\n /** Kaydedilmemiş çalışma kopyaları (görünüm başına); sayfa yenilenince gider. */\n const drafts = reactive(new Map<string, ViewState>())\n const edited = computed(() => !!active.value && !!baseline.value && !sameState(o.current(), baseline.value))\n let touched = false\n\n const activate = (id: string, keepDraft = true) => {\n const view = all.value.find((v) => v.id === id)\n if (!view) return\n const prev = active.value\n if (prev) {\n if (keepDraft && edited.value) drafts.set(prev.id, o.current())\n else drafts.delete(prev.id)\n }\n activeId.value = id\n o.apply(view.state)\n baseline.value = o.current()\n const draft = drafts.get(id)\n if (draft) o.apply(draft)\n o.onChange(view)\n }\n\n const initial = defaultView(all.value, o.defaultViewId())\n if (initial) activate(initial.id)\n const listed = o.adapter\n ? o.adapter\n .list(o.tableId())\n .then((vs) => {\n saved.value = vs\n })\n .catch(() => {})\n : Promise.resolve()\n // Kullanıcı varsayılanı kişisel bir görünüm olabilir: liste ve tercih gelince, dokunulmadıysa ona geçilir.\n void Promise.all([listed, o.prefsReady]).then(() => {\n if (touched || edited.value) return\n const v = defaultView(all.value, o.defaultViewId())\n if (v && v.id !== activeId.value) activate(v.id)\n })\n\n const replace = (next: View) => (saved.value = saved.value.map((v) => (v.id === next.id ? next : v)))\n const writable = (v: View | null) => !!v && !!o.adapter && v.kind !== 'system'\n\n return {\n all,\n sections,\n active,\n edited,\n hasViews: computed(() => all.value.length > 0),\n hasDraft: (id: string) => drafts.has(id),\n writable,\n select: (id: string) => {\n touched = true\n activate(id)\n },\n saveChanges: async () => {\n const v = active.value\n if (!writable(v) || !o.adapter) return\n replace(await o.adapter.update(o.tableId(), v!.id, { state: o.current() }))\n baseline.value = o.current()\n drafts.delete(v!.id)\n },\n discard: () => {\n const v = active.value\n if (!v) return\n o.apply(v.state)\n baseline.value = o.current()\n drafts.delete(v.id)\n },\n /** Save as new view / New view / Duplicate; kayıt sonrası yeni görünüm aktif. `fromCurrent`: mevcut düzenleme yeni görünüme taşındı. */\n create: async (input: { name: string; state: ViewState; makeDefault: boolean; fromCurrent: boolean }) => {\n if (!o.adapter) return\n const v = await o.adapter.create(o.tableId(), { name: input.name, state: input.state })\n saved.value = [...saved.value, v]\n if (input.makeDefault) o.setDefaultViewId(v.id)\n touched = true\n activate(v.id, !input.fromCurrent)\n },\n rename: async (id: string, name: string) => {\n if (o.adapter) replace(await o.adapter.update(o.tableId(), id, { name }))\n },\n /** Onay sonrası hemen `remove`; aktif silinirse varsayılana, varsayılan silinirse system default'a (04 §7). */\n remove: async (id: string) => {\n if (!o.adapter) return\n await o.adapter.remove(o.tableId(), id)\n saved.value = saved.value.filter((v) => v.id !== id)\n drafts.delete(id)\n if (o.defaultViewId() === id) o.setDefaultViewId(null)\n if (activeId.value === id) {\n activeId.value = null\n baseline.value = null\n const d = defaultView(all.value, o.defaultViewId())\n if (d) activate(d.id)\n else o.apply({})\n }\n },\n }\n}\n","<script setup lang=\"ts\">\n// Save as new view (04 §7, handoff 03 §4.2, T3-04) ve Rename: Name (odaklı; Duplicate'ten \"{ad} copy\" seçili), özet,\n// Make this my default view. Enter kaydeder; hata alanın altında.\nimport {\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogOverlay,\n DialogPortal,\n DialogRoot,\n DialogTitle,\n} from 'reka-ui'\nimport { ref, watch } from 'vue'\nimport { useDataTableContext } from '../plugin'\nimport type { NameError } from './model'\n\nconst props = defineProps<{\n mode: 'create' | 'rename'\n name: string\n /** Yalnızca create: Filters / Sort / Columns satırları. */\n summary: { filters: string; sort: string; columns: string } | null\n validate: (name: string) => NameError | null\n}>()\nconst emit = defineEmits<{ save: [input: { name: string; makeDefault: boolean }] }>()\nconst open = defineModel<boolean>('open', { default: false })\nconst { i18n } = useDataTableContext()\n\nconst name = ref(props.name)\nconst makeDefault = ref(false)\nconst error = ref<NameError | null>(null)\nconst input = ref<HTMLInputElement | null>(null)\nwatch(open, (o) => {\n if (!o) return\n name.value = props.name\n makeDefault.value = false\n error.value = null\n})\nconst focusName = (e: Event) => {\n e.preventDefault()\n input.value?.focus()\n input.value?.select()\n}\nconst submit = () => {\n error.value = props.validate(name.value)\n if (error.value) return\n emit('save', { name: name.value.trim(), makeDefault: makeDefault.value })\n open.value = false\n}\n</script>\n\n<template>\n <DialogRoot v-model:open=\"open\">\n <DialogPortal>\n <DialogOverlay class=\"dt-scrim\" />\n <DialogContent class=\"dt-dialog dt-view-dialog\" @open-auto-focus=\"focusName\">\n <form @submit.prevent=\"submit\">\n <DialogTitle class=\"dt-dialog-title\">\n {{ i18n.t(mode === 'rename' ? 'views.rename' : 'views.dialogTitle') }}\n </DialogTitle>\n <DialogDescription v-if=\"mode === 'create'\" class=\"dt-dialog-body\">\n {{ i18n.t('views.dialogBody') }}\n </DialogDescription>\n <label class=\"dt-field\">\n <span class=\"dt-field-label\">{{ i18n.t('views.name') }}</span>\n <span class=\"dt-input\">\n <input ref=\"input\" v-model=\"name\" type=\"text\" :aria-invalid=\"error ? 'true' : undefined\" />\n </span>\n <span v-if=\"error\" class=\"dt-field-error\" role=\"alert\">{{ i18n.t(`views.err.${error}`) }}</span>\n </label>\n <div v-if=\"summary\" class=\"dt-view-summary\">\n <span>{{ i18n.t('views.filters') }}</span>\n <span>{{ summary.filters }}</span>\n <span>{{ i18n.t('views.sort') }}</span>\n <span>{{ summary.sort }}</span>\n <span>{{ i18n.t('views.columns') }}</span>\n <span>{{ summary.columns }}</span>\n </div>\n <template v-if=\"mode === 'create'\">\n <label class=\"dt-check-row\">\n <input v-model=\"makeDefault\" type=\"checkbox\" class=\"dt-checkbox\" />\n {{ i18n.t('views.makeDefault') }}\n </label>\n </template>\n <div class=\"dt-dialog-actions\">\n <DialogClose as-child>\n <button type=\"button\" class=\"dt-btn\">{{ i18n.t('common.cancel') }}</button>\n </DialogClose>\n <button type=\"submit\" class=\"dt-btn dt-btn-primary\">\n {{ i18n.t(mode === 'rename' ? 'common.save' : 'views.save') }}\n </button>\n </div>\n </form>\n </DialogContent>\n </DialogPortal>\n </DialogRoot>\n</template>\n","<script setup lang=\"ts\">\n// Save as new view (04 §7, handoff 03 §4.2, T3-04) ve Rename: Name (odaklı; Duplicate'ten \"{ad} copy\" seçili), özet,\n// Make this my default view. Enter kaydeder; hata alanın altında.\nimport {\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogOverlay,\n DialogPortal,\n DialogRoot,\n DialogTitle,\n} from 'reka-ui'\nimport { ref, watch } from 'vue'\nimport { useDataTableContext } from '../plugin'\nimport type { NameError } from './model'\n\nconst props = defineProps<{\n mode: 'create' | 'rename'\n name: string\n /** Yalnızca create: Filters / Sort / Columns satırları. */\n summary: { filters: string; sort: string; columns: string } | null\n validate: (name: string) => NameError | null\n}>()\nconst emit = defineEmits<{ save: [input: { name: string; makeDefault: boolean }] }>()\nconst open = defineModel<boolean>('open', { default: false })\nconst { i18n } = useDataTableContext()\n\nconst name = ref(props.name)\nconst makeDefault = ref(false)\nconst error = ref<NameError | null>(null)\nconst input = ref<HTMLInputElement | null>(null)\nwatch(open, (o) => {\n if (!o) return\n name.value = props.name\n makeDefault.value = false\n error.value = null\n})\nconst focusName = (e: Event) => {\n e.preventDefault()\n input.value?.focus()\n input.value?.select()\n}\nconst submit = () => {\n error.value = props.validate(name.value)\n if (error.value) return\n emit('save', { name: name.value.trim(), makeDefault: makeDefault.value })\n open.value = false\n}\n</script>\n\n<template>\n <DialogRoot v-model:open=\"open\">\n <DialogPortal>\n <DialogOverlay class=\"dt-scrim\" />\n <DialogContent class=\"dt-dialog dt-view-dialog\" @open-auto-focus=\"focusName\">\n <form @submit.prevent=\"submit\">\n <DialogTitle class=\"dt-dialog-title\">\n {{ i18n.t(mode === 'rename' ? 'views.rename' : 'views.dialogTitle') }}\n </DialogTitle>\n <DialogDescription v-if=\"mode === 'create'\" class=\"dt-dialog-body\">\n {{ i18n.t('views.dialogBody') }}\n </DialogDescription>\n <label class=\"dt-field\">\n <span class=\"dt-field-label\">{{ i18n.t('views.name') }}</span>\n <span class=\"dt-input\">\n <input ref=\"input\" v-model=\"name\" type=\"text\" :aria-invalid=\"error ? 'true' : undefined\" />\n </span>\n <span v-if=\"error\" class=\"dt-field-error\" role=\"alert\">{{ i18n.t(`views.err.${error}`) }}</span>\n </label>\n <div v-if=\"summary\" class=\"dt-view-summary\">\n <span>{{ i18n.t('views.filters') }}</span>\n <span>{{ summary.filters }}</span>\n <span>{{ i18n.t('views.sort') }}</span>\n <span>{{ summary.sort }}</span>\n <span>{{ i18n.t('views.columns') }}</span>\n <span>{{ summary.columns }}</span>\n </div>\n <template v-if=\"mode === 'create'\">\n <label class=\"dt-check-row\">\n <input v-model=\"makeDefault\" type=\"checkbox\" class=\"dt-checkbox\" />\n {{ i18n.t('views.makeDefault') }}\n </label>\n </template>\n <div class=\"dt-dialog-actions\">\n <DialogClose as-child>\n <button type=\"button\" class=\"dt-btn\">{{ i18n.t('common.cancel') }}</button>\n </DialogClose>\n <button type=\"submit\" class=\"dt-btn dt-btn-primary\">\n {{ i18n.t(mode === 'rename' ? 'common.save' : 'views.save') }}\n </button>\n </div>\n </form>\n </DialogContent>\n </DialogPortal>\n </DialogRoot>\n</template>\n","<script setup lang=\"ts\">\n// Görünüm seçici + menüsü (04 §7, handoff 03 §4.1, T3-01/02/03): üstte kaydetme bölümü (yalnızca düzenlenmişse, D27),\n// Find a view…, System / My views bölümleri (D30: paylaşım yok), satır ⋯ menüsü, altta New view. Kısayol `V` DataTable'da.\nimport { PhCaretDown, PhCheck, PhDotsThree, PhMagnifyingGlass, PhPlus, PhStack } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n ListboxContent,\n ListboxFilter,\n ListboxGroup,\n ListboxGroupLabel,\n ListboxItem,\n ListboxRoot,\n} from 'reka-ui'\nimport { computed, ref, watch } from 'vue'\nimport type { View } from '../../types/views'\nimport { SAVE_KBD } from '../interaction/kbd'\nimport { useDataTableContext } from '../plugin'\nimport Layer from '../ui/Layer.vue'\n\nconst props = defineProps<{\n sections: { system: View[]; personal: View[] }\n active: View | null\n edited: boolean\n hasDraft: (id: string) => boolean\n defaultId: string | null\n /** Adapter var: kaydetme, New view, Duplicate. */\n canSave: boolean\n /** Aktif görünüm üzerine yazılabilir (personal). */\n canWrite: boolean\n /** Telefon: popover yerine alt sayfa (T13-06). */\n sheet?: boolean\n}>()\nconst emit = defineEmits<{\n select: [id: string]\n 'save-changes': []\n 'save-as': []\n discard: []\n new: []\n rename: [view: View]\n duplicate: [view: View]\n 'set-default': [id: string]\n delete: [view: View]\n}>()\nconst open = defineModel<boolean>('open', { default: false })\nconst { i18n } = useDataTableContext()\nconst q = ref('')\nwatch(open, (o) => {\n if (!o) q.value = ''\n})\n\nconst label = computed(() => {\n const name = props.active?.name ?? i18n.t('views.title')\n return i18n.t(props.edited ? 'sr.viewEdited' : 'sr.view', { name })\n})\nconst match = (v: View) => !q.value || v.name.toLocaleLowerCase().includes(q.value.toLocaleLowerCase())\nconst groups = computed(() =>\n (\n [\n ['system', 'views.system', 'views.builtIn'],\n ['personal', 'views.mine', 'views.onlyYou'],\n ] as const\n )\n .map(([key, title, hint]) => ({ key, title, hint, views: props.sections[key].filter(match) }))\n .filter((g) => g.views.length),\n)\nconst isEdited = (v: View) => (v.id === props.active?.id ? props.edited : props.hasDraft(v.id))\nconst canEdit = (v: View) => props.canSave && v.kind !== 'system'\n\n/** Dialog açan eylemler popover kapandıktan sonra: kapanış odağı tetikleyiciye dönerken dialog'u kapatmasın. */\nconst after = (fn: () => void) => {\n open.value = false\n setTimeout(fn, 0)\n}\nconst pick = (id: unknown) => {\n if (typeof id !== 'string') return\n open.value = false\n emit('select', id)\n}\n</script>\n\n<template>\n <Layer\n v-model:open=\"open\"\n :sheet=\"sheet\"\n :title=\"i18n.t('views.title')\"\n hide-title\n content-class=\"dt-views\"\n align=\"start\"\n >\n <template #trigger>\n <button type=\"button\" class=\"dt-btn dt-btn-ghost has-icon dt-view-trigger\" :aria-label=\"label\">\n <span class=\"dt-view-icon\" aria-hidden=\"true\"><PhStack :size=\"16\" /></span>\n <span class=\"dt-view-name\">{{ active?.name ?? i18n.t('views.title') }}</span>\n <template v-if=\"edited\">\n <span class=\"dt-view-dot\" aria-hidden=\"true\" />\n <span class=\"dt-view-edited\">{{ i18n.t('views.edited') }}</span>\n </template>\n <PhCaretDown :size=\"14\" aria-hidden=\"true\" />\n </button>\n </template>\n <template v-if=\"edited && active\">\n <div class=\"dt-pop-label\">{{ i18n.t('views.editedName', { name: active.name }) }}</div>\n <template v-if=\"canWrite\">\n <button type=\"button\" class=\"dt-pop-item dt-view-action\" @click=\"after(() => emit('save-changes'))\">\n <span class=\"dt-view-action-main\">\n {{ i18n.t('views.saveChanges') }}\n <kbd class=\"dt-kbd\">{{ SAVE_KBD }}</kbd>\n </span>\n <span class=\"dt-view-action-sub\">{{ i18n.t('views.updates', { name: active.name }) }}</span>\n </button>\n <button type=\"button\" class=\"dt-pop-item dt-view-action\" @click=\"after(() => emit('save-as'))\">\n <span class=\"dt-view-action-main\">{{ i18n.t('views.saveAsNew') }}</span>\n <span class=\"dt-view-action-sub\">{{ i18n.t('views.keepsUnchanged', { name: active.name }) }}</span>\n </button>\n </template>\n <button\n v-else-if=\"canSave\"\n type=\"button\"\n class=\"dt-pop-item dt-view-action is-single\"\n @click=\"after(() => emit('save-as'))\"\n >\n <span class=\"dt-view-action-main\">\n {{ i18n.t('views.saveAsMine') }}\n <kbd class=\"dt-kbd\">{{ SAVE_KBD }}</kbd>\n </span>\n </button>\n <button type=\"button\" class=\"dt-pop-item dt-view-action is-single\" @click=\"after(() => emit('discard'))\">\n <span class=\"dt-view-action-main\">{{ i18n.t('views.discard') }}</span>\n </button>\n <div class=\"dt-pop-sep\" />\n </template>\n <ListboxRoot :model-value=\"active?.id\" selection-behavior=\"replace\" highlight-on-hover @update:model-value=\"pick\">\n <label class=\"dt-input has-icon dt-picker-search\">\n <span class=\"dt-input-icon\"><PhMagnifyingGlass :size=\"14\" aria-hidden=\"true\" /></span>\n <ListboxFilter v-model=\"q\" auto-focus :placeholder=\"i18n.t('views.find')\" :aria-label=\"i18n.t('views.find')\" />\n </label>\n <ListboxContent class=\"dt-views-list\">\n <ListboxGroup v-for=\"g in groups\" :key=\"g.key\">\n <ListboxGroupLabel class=\"dt-pop-label\">\n {{ i18n.t(g.title) }}\n <span>{{ i18n.t(g.hint) }}</span>\n </ListboxGroupLabel>\n <div v-for=\"v in g.views\" :key=\"v.id\" class=\"dt-view-row\" :class=\"{ 'is-active': v.id === active?.id }\">\n <ListboxItem :value=\"v.id\" class=\"dt-view-item\">\n <PhCheck v-if=\"sheet && v.id === active?.id\" :size=\"18\" class=\"dt-view-check\" aria-hidden=\"true\" />\n <span class=\"dt-view-row-name\">{{ v.name }}</span>\n <template v-if=\"isEdited(v)\">\n <span class=\"dt-view-dot\" aria-hidden=\"true\" />\n <span class=\"dt-view-edited\">{{ i18n.t('views.edited') }}</span>\n </template>\n <span v-if=\"v.id === defaultId\" class=\"dt-view-default\">{{ i18n.t('views.default') }}</span>\n </ListboxItem>\n <DropdownMenuRoot>\n <DropdownMenuTrigger as-child>\n <!-- Enter/Space ⋯'yi açar; Listbox'a ulaşıp satırı seçmesin (klavye). -->\n <button\n type=\"button\"\n class=\"dt-icon-btn-sm dt-view-more\"\n :aria-label=\"i18n.t('common.more')\"\n @keydown.enter.space.stop\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent class=\"dt-menu dt-view-row-menu\" side=\"right\" align=\"start\" :side-offset=\"8\">\n <DropdownMenuItem v-if=\"canEdit(v)\" class=\"dt-menu-item\" @select=\"after(() => emit('rename', v))\">\n {{ i18n.t('views.rename') }}\n </DropdownMenuItem>\n <DropdownMenuItem v-if=\"canSave\" class=\"dt-menu-item\" @select=\"after(() => emit('duplicate', v))\">\n {{ i18n.t('views.duplicate') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"emit('set-default', v.id)\">\n {{ i18n.t('views.setDefault') }}\n </DropdownMenuItem>\n <template v-if=\"canEdit(v)\">\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n <DropdownMenuItem class=\"dt-menu-item is-destructive\" @select=\"after(() => emit('delete', v))\">\n {{ i18n.t('views.delete') }}\n </DropdownMenuItem>\n </template>\n <div v-if=\"v.kind === 'system'\" class=\"dt-view-note\">{{ i18n.t('views.systemNote') }}</div>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </div>\n </ListboxGroup>\n <div v-if=\"!groups.length\" class=\"dt-options-empty\">{{ i18n.t('views.noMatch') }}</div>\n </ListboxContent>\n </ListboxRoot>\n <template v-if=\"canSave\">\n <div class=\"dt-pop-sep\" />\n <button type=\"button\" class=\"dt-pop-item dt-view-new\" @click=\"after(() => emit('new'))\">\n <PhPlus :size=\"14\" aria-hidden=\"true\" />\n {{ i18n.t('views.new') }}\n </button>\n </template>\n </Layer>\n</template>\n","<script setup lang=\"ts\">\n// Görünüm seçici + menüsü (04 §7, handoff 03 §4.1, T3-01/02/03): üstte kaydetme bölümü (yalnızca düzenlenmişse, D27),\n// Find a view…, System / My views bölümleri (D30: paylaşım yok), satır ⋯ menüsü, altta New view. Kısayol `V` DataTable'da.\nimport { PhCaretDown, PhCheck, PhDotsThree, PhMagnifyingGlass, PhPlus, PhStack } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n ListboxContent,\n ListboxFilter,\n ListboxGroup,\n ListboxGroupLabel,\n ListboxItem,\n ListboxRoot,\n} from 'reka-ui'\nimport { computed, ref, watch } from 'vue'\nimport type { View } from '../../types/views'\nimport { SAVE_KBD } from '../interaction/kbd'\nimport { useDataTableContext } from '../plugin'\nimport Layer from '../ui/Layer.vue'\n\nconst props = defineProps<{\n sections: { system: View[]; personal: View[] }\n active: View | null\n edited: boolean\n hasDraft: (id: string) => boolean\n defaultId: string | null\n /** Adapter var: kaydetme, New view, Duplicate. */\n canSave: boolean\n /** Aktif görünüm üzerine yazılabilir (personal). */\n canWrite: boolean\n /** Telefon: popover yerine alt sayfa (T13-06). */\n sheet?: boolean\n}>()\nconst emit = defineEmits<{\n select: [id: string]\n 'save-changes': []\n 'save-as': []\n discard: []\n new: []\n rename: [view: View]\n duplicate: [view: View]\n 'set-default': [id: string]\n delete: [view: View]\n}>()\nconst open = defineModel<boolean>('open', { default: false })\nconst { i18n } = useDataTableContext()\nconst q = ref('')\nwatch(open, (o) => {\n if (!o) q.value = ''\n})\n\nconst label = computed(() => {\n const name = props.active?.name ?? i18n.t('views.title')\n return i18n.t(props.edited ? 'sr.viewEdited' : 'sr.view', { name })\n})\nconst match = (v: View) => !q.value || v.name.toLocaleLowerCase().includes(q.value.toLocaleLowerCase())\nconst groups = computed(() =>\n (\n [\n ['system', 'views.system', 'views.builtIn'],\n ['personal', 'views.mine', 'views.onlyYou'],\n ] as const\n )\n .map(([key, title, hint]) => ({ key, title, hint, views: props.sections[key].filter(match) }))\n .filter((g) => g.views.length),\n)\nconst isEdited = (v: View) => (v.id === props.active?.id ? props.edited : props.hasDraft(v.id))\nconst canEdit = (v: View) => props.canSave && v.kind !== 'system'\n\n/** Dialog açan eylemler popover kapandıktan sonra: kapanış odağı tetikleyiciye dönerken dialog'u kapatmasın. */\nconst after = (fn: () => void) => {\n open.value = false\n setTimeout(fn, 0)\n}\nconst pick = (id: unknown) => {\n if (typeof id !== 'string') return\n open.value = false\n emit('select', id)\n}\n</script>\n\n<template>\n <Layer\n v-model:open=\"open\"\n :sheet=\"sheet\"\n :title=\"i18n.t('views.title')\"\n hide-title\n content-class=\"dt-views\"\n align=\"start\"\n >\n <template #trigger>\n <button type=\"button\" class=\"dt-btn dt-btn-ghost has-icon dt-view-trigger\" :aria-label=\"label\">\n <span class=\"dt-view-icon\" aria-hidden=\"true\"><PhStack :size=\"16\" /></span>\n <span class=\"dt-view-name\">{{ active?.name ?? i18n.t('views.title') }}</span>\n <template v-if=\"edited\">\n <span class=\"dt-view-dot\" aria-hidden=\"true\" />\n <span class=\"dt-view-edited\">{{ i18n.t('views.edited') }}</span>\n </template>\n <PhCaretDown :size=\"14\" aria-hidden=\"true\" />\n </button>\n </template>\n <template v-if=\"edited && active\">\n <div class=\"dt-pop-label\">{{ i18n.t('views.editedName', { name: active.name }) }}</div>\n <template v-if=\"canWrite\">\n <button type=\"button\" class=\"dt-pop-item dt-view-action\" @click=\"after(() => emit('save-changes'))\">\n <span class=\"dt-view-action-main\">\n {{ i18n.t('views.saveChanges') }}\n <kbd class=\"dt-kbd\">{{ SAVE_KBD }}</kbd>\n </span>\n <span class=\"dt-view-action-sub\">{{ i18n.t('views.updates', { name: active.name }) }}</span>\n </button>\n <button type=\"button\" class=\"dt-pop-item dt-view-action\" @click=\"after(() => emit('save-as'))\">\n <span class=\"dt-view-action-main\">{{ i18n.t('views.saveAsNew') }}</span>\n <span class=\"dt-view-action-sub\">{{ i18n.t('views.keepsUnchanged', { name: active.name }) }}</span>\n </button>\n </template>\n <button\n v-else-if=\"canSave\"\n type=\"button\"\n class=\"dt-pop-item dt-view-action is-single\"\n @click=\"after(() => emit('save-as'))\"\n >\n <span class=\"dt-view-action-main\">\n {{ i18n.t('views.saveAsMine') }}\n <kbd class=\"dt-kbd\">{{ SAVE_KBD }}</kbd>\n </span>\n </button>\n <button type=\"button\" class=\"dt-pop-item dt-view-action is-single\" @click=\"after(() => emit('discard'))\">\n <span class=\"dt-view-action-main\">{{ i18n.t('views.discard') }}</span>\n </button>\n <div class=\"dt-pop-sep\" />\n </template>\n <ListboxRoot :model-value=\"active?.id\" selection-behavior=\"replace\" highlight-on-hover @update:model-value=\"pick\">\n <label class=\"dt-input has-icon dt-picker-search\">\n <span class=\"dt-input-icon\"><PhMagnifyingGlass :size=\"14\" aria-hidden=\"true\" /></span>\n <ListboxFilter v-model=\"q\" auto-focus :placeholder=\"i18n.t('views.find')\" :aria-label=\"i18n.t('views.find')\" />\n </label>\n <ListboxContent class=\"dt-views-list\">\n <ListboxGroup v-for=\"g in groups\" :key=\"g.key\">\n <ListboxGroupLabel class=\"dt-pop-label\">\n {{ i18n.t(g.title) }}\n <span>{{ i18n.t(g.hint) }}</span>\n </ListboxGroupLabel>\n <div v-for=\"v in g.views\" :key=\"v.id\" class=\"dt-view-row\" :class=\"{ 'is-active': v.id === active?.id }\">\n <ListboxItem :value=\"v.id\" class=\"dt-view-item\">\n <PhCheck v-if=\"sheet && v.id === active?.id\" :size=\"18\" class=\"dt-view-check\" aria-hidden=\"true\" />\n <span class=\"dt-view-row-name\">{{ v.name }}</span>\n <template v-if=\"isEdited(v)\">\n <span class=\"dt-view-dot\" aria-hidden=\"true\" />\n <span class=\"dt-view-edited\">{{ i18n.t('views.edited') }}</span>\n </template>\n <span v-if=\"v.id === defaultId\" class=\"dt-view-default\">{{ i18n.t('views.default') }}</span>\n </ListboxItem>\n <DropdownMenuRoot>\n <DropdownMenuTrigger as-child>\n <!-- Enter/Space ⋯'yi açar; Listbox'a ulaşıp satırı seçmesin (klavye). -->\n <button\n type=\"button\"\n class=\"dt-icon-btn-sm dt-view-more\"\n :aria-label=\"i18n.t('common.more')\"\n @keydown.enter.space.stop\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent class=\"dt-menu dt-view-row-menu\" side=\"right\" align=\"start\" :side-offset=\"8\">\n <DropdownMenuItem v-if=\"canEdit(v)\" class=\"dt-menu-item\" @select=\"after(() => emit('rename', v))\">\n {{ i18n.t('views.rename') }}\n </DropdownMenuItem>\n <DropdownMenuItem v-if=\"canSave\" class=\"dt-menu-item\" @select=\"after(() => emit('duplicate', v))\">\n {{ i18n.t('views.duplicate') }}\n </DropdownMenuItem>\n <DropdownMenuItem class=\"dt-menu-item\" @select=\"emit('set-default', v.id)\">\n {{ i18n.t('views.setDefault') }}\n </DropdownMenuItem>\n <template v-if=\"canEdit(v)\">\n <DropdownMenuSeparator class=\"dt-menu-sep\" />\n <DropdownMenuItem class=\"dt-menu-item is-destructive\" @select=\"after(() => emit('delete', v))\">\n {{ i18n.t('views.delete') }}\n </DropdownMenuItem>\n </template>\n <div v-if=\"v.kind === 'system'\" class=\"dt-view-note\">{{ i18n.t('views.systemNote') }}</div>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </div>\n </ListboxGroup>\n <div v-if=\"!groups.length\" class=\"dt-options-empty\">{{ i18n.t('views.noMatch') }}</div>\n </ListboxContent>\n </ListboxRoot>\n <template v-if=\"canSave\">\n <div class=\"dt-pop-sep\" />\n <button type=\"button\" class=\"dt-pop-item dt-view-new\" @click=\"after(() => emit('new'))\">\n <PhPlus :size=\"14\" aria-hidden=\"true\" />\n {{ i18n.t('views.new') }}\n </button>\n </template>\n </Layer>\n</template>\n","<script setup lang=\"ts\" generic=\"Row extends object\">\n// Bulk bar (05 §6, handoff 03 §7, T5-01/03/04): [sayaç] │ aksiyonlar (en fazla 3 `inBar`) │ ⋯ (kalanlar, yıkıcı en altta) │ ×.\n// Yüzer (varsayılan: kartın altında ortada, 64 px, düzeni kaydırmaz) ya da toolbar'ın yerine. `run(rows)` beklenmez (D20).\nimport { PhDotsThree, PhX } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from 'reka-ui'\nimport { computed, ref } from 'vue'\nimport type { BulkAction } from '../types/list'\nimport { useDataTableContext } from '../core/plugin'\nimport Layer from '../core/ui/Layer.vue'\n\nconst props = defineProps<{\n rows: Row[]\n actions: Array<BulkAction<Row>>\n variant: 'floating' | 'toolbar'\n /** Telefon (handoff 04 §7): en çok 2 aksiyon + More alt sayfası; ikon üstte, etiket altta. */\n phone?: boolean\n}>()\nconst emit = defineEmits<{ clear: [] }>()\ndefineSlots<{ default?: () => unknown }>()\nconst { i18n } = useDataTableContext()\n\n/** `when(rows)` false olan ne bar'da ne menüde (D36). */\nconst shown = computed(() => props.actions.filter((a) => !a.when || a.when(props.rows)))\nconst inBar = computed(() => shown.value.filter((a) => a.inBar).slice(0, props.phone ? 2 : 3))\n/** ⋯ menüsü: bar'da olmayanlar; yıkıcılar en altta, ayırıcıdan sonra. */\nconst rest = computed(() => {\n const bar = new Set(inBar.value)\n const others = shown.value.filter((a) => !bar.has(a))\n return [...others.filter((a) => !a.destructive), ...others.filter((a) => a.destructive)]\n})\nconst firstDestructive = computed(() => rest.value.findIndex((a) => a.destructive))\nconst disabledOf = (a: BulkAction<Row>): boolean | string => a.disabled?.(props.rows) ?? false\n/** Tooltip / ikinci satır: `disabled` gerekçesi varsa o, yoksa `description` (D36). */\nconst tipOf = (a: BulkAction<Row>): string | undefined => {\n const d = disabledOf(a)\n return typeof d === 'string' ? d : a.description\n}\nconst moreOpen = ref(false)\nconst run = (a: BulkAction<Row>) => {\n if (disabledOf(a)) return\n moreOpen.value = false\n void a.run(props.rows)\n}\nconst btn = computed(() => (props.variant === 'toolbar' ? 'dt-btn has-icon' : 'dt-bulk-btn'))\n</script>\n\n<template>\n <div\n class=\"dt-bulk\"\n :class=\"[`is-${variant}`, { 'is-phone': phone }]\"\n role=\"toolbar\"\n :aria-label=\"i18n.t('bulk.aria')\"\n >\n <button\n v-if=\"variant === 'toolbar'\"\n type=\"button\"\n class=\"dt-btn dt-btn-icon\"\n :aria-label=\"i18n.t('selection.clear')\"\n :data-dt-tip=\"i18n.t('selection.clear')\"\n @click=\"emit('clear')\"\n >\n <PhX :size=\"16\" aria-hidden=\"true\" />\n </button>\n <span class=\"dt-bulk-count\" role=\"status\">{{ i18n.t('selection.selected', { count: rows.length }) }}</span>\n <span class=\"dt-bulk-sep\" aria-hidden=\"true\" />\n <slot>\n <button\n v-for=\"a in inBar\"\n :key=\"a.id\"\n type=\"button\"\n :class=\"[btn, { 'is-destructive': a.destructive }]\"\n :disabled=\"!!disabledOf(a)\"\n :data-dt-tip=\"tipOf(a)\"\n @click=\"run(a)\"\n >\n <component :is=\"a.icon\" v-if=\"a.icon\" :size=\"phone ? 18 : 16\" aria-hidden=\"true\" />\n <span>{{ a.label }}</span>\n </button>\n <Layer v-if=\"rest.length && phone\" v-model:open=\"moreOpen\" sheet hide-title :title=\"i18n.t('bulk.moreAria')\">\n <template #trigger>\n <button type=\"button\" class=\"dt-bulk-btn dt-bulk-more\" :aria-label=\"i18n.t('bulk.moreAria')\">\n <PhDotsThree :size=\"18\" weight=\"bold\" aria-hidden=\"true\" />\n <span>{{ i18n.t('common.more') }}</span>\n </button>\n </template>\n <div class=\"dt-bsheet-label\">{{ i18n.t('selection.selected', { count: rows.length }) }}</div>\n <template v-for=\"(a, i) in rest\" :key=\"a.id\">\n <div v-if=\"i === firstDestructive\" class=\"dt-bsheet-sep\" />\n <button\n type=\"button\"\n class=\"dt-bsheet-row\"\n :class=\"{ 'is-destructive': a.destructive }\"\n :disabled=\"!!disabledOf(a)\"\n @click=\"run(a)\"\n >\n <span class=\"dt-menu-text\">\n <span>{{ a.label }}</span>\n <span v-if=\"tipOf(a)\" class=\"dt-menu-sub\">{{ tipOf(a) }}</span>\n </span>\n </button>\n </template>\n </Layer>\n <DropdownMenuRoot v-else-if=\"rest.length\">\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n :class=\"[btn, 'dt-bulk-more', { 'dt-btn-icon': variant === 'toolbar' }]\"\n :aria-label=\"i18n.t('bulk.moreAria')\"\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n class=\"dt-menu dt-bulk-menu\"\n :side=\"variant === 'floating' ? 'top' : 'bottom'\"\n align=\"start\"\n :side-offset=\"variant === 'floating' ? 12 : 4\"\n >\n <template v-for=\"(a, i) in rest\" :key=\"a.id\">\n <DropdownMenuSeparator v-if=\"i === firstDestructive\" class=\"dt-menu-sep\" />\n <DropdownMenuItem\n class=\"dt-menu-item\"\n :class=\"{ 'is-destructive': a.destructive, 'is-two-line': tipOf(a) }\"\n :disabled=\"!!disabledOf(a)\"\n @select=\"run(a)\"\n >\n <span class=\"dt-menu-text\">\n <span>{{ a.label }}</span>\n <span v-if=\"tipOf(a)\" class=\"dt-menu-sub\">{{ tipOf(a) }}</span>\n </span>\n </DropdownMenuItem>\n </template>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </slot>\n <template v-if=\"variant === 'floating'\">\n <span class=\"dt-bulk-sep\" aria-hidden=\"true\" />\n <button\n type=\"button\"\n class=\"dt-bulk-btn dt-bulk-icon\"\n :aria-label=\"i18n.t('selection.clear')\"\n :data-dt-tip=\"i18n.t('selection.clear')\"\n @click=\"emit('clear')\"\n >\n <PhX :size=\"16\" aria-hidden=\"true\" />\n </button>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"Row extends object\">\n// Bulk bar (05 §6, handoff 03 §7, T5-01/03/04): [sayaç] │ aksiyonlar (en fazla 3 `inBar`) │ ⋯ (kalanlar, yıkıcı en altta) │ ×.\n// Yüzer (varsayılan: kartın altında ortada, 64 px, düzeni kaydırmaz) ya da toolbar'ın yerine. `run(rows)` beklenmez (D20).\nimport { PhDotsThree, PhX } from '@phosphor-icons/vue'\nimport {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from 'reka-ui'\nimport { computed, ref } from 'vue'\nimport type { BulkAction } from '../types/list'\nimport { useDataTableContext } from '../core/plugin'\nimport Layer from '../core/ui/Layer.vue'\n\nconst props = defineProps<{\n rows: Row[]\n actions: Array<BulkAction<Row>>\n variant: 'floating' | 'toolbar'\n /** Telefon (handoff 04 §7): en çok 2 aksiyon + More alt sayfası; ikon üstte, etiket altta. */\n phone?: boolean\n}>()\nconst emit = defineEmits<{ clear: [] }>()\ndefineSlots<{ default?: () => unknown }>()\nconst { i18n } = useDataTableContext()\n\n/** `when(rows)` false olan ne bar'da ne menüde (D36). */\nconst shown = computed(() => props.actions.filter((a) => !a.when || a.when(props.rows)))\nconst inBar = computed(() => shown.value.filter((a) => a.inBar).slice(0, props.phone ? 2 : 3))\n/** ⋯ menüsü: bar'da olmayanlar; yıkıcılar en altta, ayırıcıdan sonra. */\nconst rest = computed(() => {\n const bar = new Set(inBar.value)\n const others = shown.value.filter((a) => !bar.has(a))\n return [...others.filter((a) => !a.destructive), ...others.filter((a) => a.destructive)]\n})\nconst firstDestructive = computed(() => rest.value.findIndex((a) => a.destructive))\nconst disabledOf = (a: BulkAction<Row>): boolean | string => a.disabled?.(props.rows) ?? false\n/** Tooltip / ikinci satır: `disabled` gerekçesi varsa o, yoksa `description` (D36). */\nconst tipOf = (a: BulkAction<Row>): string | undefined => {\n const d = disabledOf(a)\n return typeof d === 'string' ? d : a.description\n}\nconst moreOpen = ref(false)\nconst run = (a: BulkAction<Row>) => {\n if (disabledOf(a)) return\n moreOpen.value = false\n void a.run(props.rows)\n}\nconst btn = computed(() => (props.variant === 'toolbar' ? 'dt-btn has-icon' : 'dt-bulk-btn'))\n</script>\n\n<template>\n <div\n class=\"dt-bulk\"\n :class=\"[`is-${variant}`, { 'is-phone': phone }]\"\n role=\"toolbar\"\n :aria-label=\"i18n.t('bulk.aria')\"\n >\n <button\n v-if=\"variant === 'toolbar'\"\n type=\"button\"\n class=\"dt-btn dt-btn-icon\"\n :aria-label=\"i18n.t('selection.clear')\"\n :data-dt-tip=\"i18n.t('selection.clear')\"\n @click=\"emit('clear')\"\n >\n <PhX :size=\"16\" aria-hidden=\"true\" />\n </button>\n <span class=\"dt-bulk-count\" role=\"status\">{{ i18n.t('selection.selected', { count: rows.length }) }}</span>\n <span class=\"dt-bulk-sep\" aria-hidden=\"true\" />\n <slot>\n <button\n v-for=\"a in inBar\"\n :key=\"a.id\"\n type=\"button\"\n :class=\"[btn, { 'is-destructive': a.destructive }]\"\n :disabled=\"!!disabledOf(a)\"\n :data-dt-tip=\"tipOf(a)\"\n @click=\"run(a)\"\n >\n <component :is=\"a.icon\" v-if=\"a.icon\" :size=\"phone ? 18 : 16\" aria-hidden=\"true\" />\n <span>{{ a.label }}</span>\n </button>\n <Layer v-if=\"rest.length && phone\" v-model:open=\"moreOpen\" sheet hide-title :title=\"i18n.t('bulk.moreAria')\">\n <template #trigger>\n <button type=\"button\" class=\"dt-bulk-btn dt-bulk-more\" :aria-label=\"i18n.t('bulk.moreAria')\">\n <PhDotsThree :size=\"18\" weight=\"bold\" aria-hidden=\"true\" />\n <span>{{ i18n.t('common.more') }}</span>\n </button>\n </template>\n <div class=\"dt-bsheet-label\">{{ i18n.t('selection.selected', { count: rows.length }) }}</div>\n <template v-for=\"(a, i) in rest\" :key=\"a.id\">\n <div v-if=\"i === firstDestructive\" class=\"dt-bsheet-sep\" />\n <button\n type=\"button\"\n class=\"dt-bsheet-row\"\n :class=\"{ 'is-destructive': a.destructive }\"\n :disabled=\"!!disabledOf(a)\"\n @click=\"run(a)\"\n >\n <span class=\"dt-menu-text\">\n <span>{{ a.label }}</span>\n <span v-if=\"tipOf(a)\" class=\"dt-menu-sub\">{{ tipOf(a) }}</span>\n </span>\n </button>\n </template>\n </Layer>\n <DropdownMenuRoot v-else-if=\"rest.length\">\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n :class=\"[btn, 'dt-bulk-more', { 'dt-btn-icon': variant === 'toolbar' }]\"\n :aria-label=\"i18n.t('bulk.moreAria')\"\n >\n <PhDotsThree :size=\"16\" weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n class=\"dt-menu dt-bulk-menu\"\n :side=\"variant === 'floating' ? 'top' : 'bottom'\"\n align=\"start\"\n :side-offset=\"variant === 'floating' ? 12 : 4\"\n >\n <template v-for=\"(a, i) in rest\" :key=\"a.id\">\n <DropdownMenuSeparator v-if=\"i === firstDestructive\" class=\"dt-menu-sep\" />\n <DropdownMenuItem\n class=\"dt-menu-item\"\n :class=\"{ 'is-destructive': a.destructive, 'is-two-line': tipOf(a) }\"\n :disabled=\"!!disabledOf(a)\"\n @select=\"run(a)\"\n >\n <span class=\"dt-menu-text\">\n <span>{{ a.label }}</span>\n <span v-if=\"tipOf(a)\" class=\"dt-menu-sub\">{{ tipOf(a) }}</span>\n </span>\n </DropdownMenuItem>\n </template>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </slot>\n <template v-if=\"variant === 'floating'\">\n <span class=\"dt-bulk-sep\" aria-hidden=\"true\" />\n <button\n type=\"button\"\n class=\"dt-bulk-btn dt-bulk-icon\"\n :aria-label=\"i18n.t('selection.clear')\"\n :data-dt-tip=\"i18n.t('selection.clear')\"\n @click=\"emit('clear')\"\n >\n <PhX :size=\"16\" aria-hidden=\"true\" />\n </button>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Footer (05 §8, brief §6.13, T9-12): yalnızca snapshot'tan okur; simple sayfalama (D7); tazelik bilgisi burada.\nimport { PhArrowClockwise, PhCaretDown, PhCaretLeft, PhCaretRight, PhCircleNotch } from '@phosphor-icons/vue'\nimport { computed } from 'vue'\nimport { getFormat } from '../../core/format'\nimport { useDataTableContext } from '../../core/plugin'\n\nconst props = defineProps<{\n /** Snapshot'taki satır sayısı ve sayfa (1 tabanlı). */\n rowCount: number\n page: { number: number; size: number }\n hasMore: boolean\n /** Biliniyorsa toplam (istemci modunda hep; sunucuda Count total sonrası). */\n total?: number\n /** Sunucu modu: footer'da Count total düğmesi; sonuç \"counted 09:42\" eki alır. */\n countable: boolean\n counting: boolean\n countedAt: Date | null\n /** `page` / `query` talebi sürüyor: sayfalama kilitli. */\n busy: boolean\n /** İlk yükleme: \"Loading…\". */\n firstLoad: boolean\n /** Gövde Empty (filtre/arama yok) mu: \"No rows\" / \"0 rows\". */\n empty: boolean\n pageSizes: number[]\n updatedAt: Date | null\n freshness: 'normal' | 'refreshing' | 'stale' | 'live'\n canRefresh: boolean\n /** Telefon (handoff 04 §5): sayfa boyutu ve tazelik yok; 44 px Önceki / Sonraki. */\n phone?: boolean\n}>()\nconst emit = defineEmits<{ count: []; page: [number: number]; 'page-size': [size: number]; refresh: [] }>()\nconst { i18n, locale } = useDataTableContext()\nconst fmt = getFormat(locale)\n\nconst from = computed(() => (props.page.number - 1) * props.page.size + 1)\nconst to = computed(() => from.value + props.rowCount - 1)\nconst lastPage = computed(() => !props.hasMore)\nconst single = computed(() => props.page.number === 1 && lastPage.value)\nconst time = (d: Date) => d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' })\n\nconst canPrev = computed(() => props.page.number > 1 && !props.busy)\nconst canNext = computed(() => props.hasMore && !props.busy)\nconst updatedText = computed(() => {\n if (!props.updatedAt) return ''\n const ago = Date.now() - props.updatedAt.getTime()\n return ago < 60_000\n ? i18n.t('toolbar.updatedJustNow')\n : i18n.t('toolbar.updatedAgo', { time: fmt.relative(props.updatedAt, new Date(), 'short') })\n})\n</script>\n\n<template>\n <div class=\"dt-footer\" role=\"navigation\" :aria-label=\"i18n.t('page.nav')\">\n <div class=\"dt-footer-left\">\n <span v-if=\"firstLoad\" class=\"dt-footer-muted\">{{ i18n.t('common.loading') }}</span>\n <span v-else-if=\"rowCount === 0\" class=\"dt-footer-rows\">{{ i18n.t(empty ? 'page.none' : 'page.zero') }}</span>\n <template v-else>\n <span class=\"dt-footer-rows\">{{ i18n.t('page.rows', { from: fmt.int(from), to: fmt.int(to) }) }}</span>\n <template v-if=\"total !== undefined && !single\">\n <span class=\"dt-footer-of\">{{ i18n.t('page.of', { total: fmt.int(total) }) }}</span>\n <span v-if=\"countedAt\" class=\"dt-footer-muted\">\n · {{ i18n.t('page.counted', { time: time(countedAt) }) }}\n </span>\n </template>\n <span v-else-if=\"counting\" class=\"dt-footer-muted\">\n {{ i18n.t('page.of', { total: '' }) }}\n <PhCircleNotch :size=\"12\" class=\"dt-spin\" aria-hidden=\"true\" />\n {{ i18n.t('page.counting') }}\n </span>\n <span v-else-if=\"lastPage && !single\" class=\"dt-footer-muted\">· {{ i18n.t('page.end') }}</span>\n <button\n v-else-if=\"countable && !single\"\n type=\"button\"\n class=\"dt-btn dt-btn-ghost dt-btn-xs dt-footer-count\"\n @click=\"emit('count')\"\n >\n · {{ i18n.t('page.countTotal') }}\n </button>\n </template>\n <template v-if=\"!phone && (updatedAt || freshness !== 'normal')\">\n <span class=\"dt-footer-vsep\" aria-hidden=\"true\" />\n <span v-if=\"freshness === 'live'\" class=\"dt-footer-live\">\n <span class=\"dt-live-dot\" aria-hidden=\"true\" />\n {{ i18n.t('toolbar.live') }}\n </span>\n <span v-else-if=\"freshness === 'refreshing'\" class=\"dt-footer-muted\" role=\"status\">\n {{ i18n.t('state.updating') }}\n </span>\n <span v-else-if=\"updatedAt\" class=\"dt-footer-updated\" :class=\"{ 'is-stale': freshness === 'stale' }\">\n {{ updatedText }}\n </span>\n <button\n v-if=\"canRefresh\"\n type=\"button\"\n class=\"dt-icon-btn-sm\"\n :aria-label=\"i18n.t('toolbar.refresh')\"\n :data-dt-tip=\"`${i18n.t('toolbar.refresh')} · R`\"\n @click=\"emit('refresh')\"\n >\n <PhArrowClockwise :size=\"14\" :class=\"{ 'dt-spin': freshness === 'refreshing' }\" aria-hidden=\"true\" />\n </button>\n </template>\n </div>\n <div class=\"dt-footer-right\">\n <label v-if=\"!phone\" class=\"dt-footer-size\">\n <span class=\"dt-footer-size-label\">{{ i18n.t('page.perPage') }}</span>\n <span class=\"dt-select\">\n <select\n :value=\"page.size\"\n :disabled=\"busy\"\n @change=\"emit('page-size', Number(($event.target as HTMLSelectElement).value))\"\n >\n <option v-for=\"s in pageSizes\" :key=\"s\" :value=\"s\">{{ s }}</option>\n </select>\n <PhCaretDown :size=\"12\" aria-hidden=\"true\" />\n </span>\n </label>\n <span v-if=\"!phone\" class=\"dt-footer-vsep\" aria-hidden=\"true\" />\n <button\n type=\"button\"\n class=\"dt-btn dt-btn-sm has-icon dt-footer-prev\"\n :aria-label=\"phone ? i18n.t('page.previous') : undefined\"\n :disabled=\"!canPrev\"\n @click=\"emit('page', page.number - 1)\"\n >\n <PhCaretLeft :size=\"phone ? 18 : 14\" aria-hidden=\"true\" />\n <span>{{ i18n.t('page.previous') }}</span>\n </button>\n <button\n type=\"button\"\n class=\"dt-btn dt-btn-sm dt-footer-next\"\n :aria-label=\"phone ? i18n.t('page.next') : undefined\"\n :disabled=\"!canNext\"\n @click=\"emit('page', page.number + 1)\"\n >\n <span>{{ i18n.t('page.next') }}</span>\n <PhCaretRight :size=\"phone ? 18 : 14\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Footer (05 §8, brief §6.13, T9-12): yalnızca snapshot'tan okur; simple sayfalama (D7); tazelik bilgisi burada.\nimport { PhArrowClockwise, PhCaretDown, PhCaretLeft, PhCaretRight, PhCircleNotch } from '@phosphor-icons/vue'\nimport { computed } from 'vue'\nimport { getFormat } from '../../core/format'\nimport { useDataTableContext } from '../../core/plugin'\n\nconst props = defineProps<{\n /** Snapshot'taki satır sayısı ve sayfa (1 tabanlı). */\n rowCount: number\n page: { number: number; size: number }\n hasMore: boolean\n /** Biliniyorsa toplam (istemci modunda hep; sunucuda Count total sonrası). */\n total?: number\n /** Sunucu modu: footer'da Count total düğmesi; sonuç \"counted 09:42\" eki alır. */\n countable: boolean\n counting: boolean\n countedAt: Date | null\n /** `page` / `query` talebi sürüyor: sayfalama kilitli. */\n busy: boolean\n /** İlk yükleme: \"Loading…\". */\n firstLoad: boolean\n /** Gövde Empty (filtre/arama yok) mu: \"No rows\" / \"0 rows\". */\n empty: boolean\n pageSizes: number[]\n updatedAt: Date | null\n freshness: 'normal' | 'refreshing' | 'stale' | 'live'\n canRefresh: boolean\n /** Telefon (handoff 04 §5): sayfa boyutu ve tazelik yok; 44 px Önceki / Sonraki. */\n phone?: boolean\n}>()\nconst emit = defineEmits<{ count: []; page: [number: number]; 'page-size': [size: number]; refresh: [] }>()\nconst { i18n, locale } = useDataTableContext()\nconst fmt = getFormat(locale)\n\nconst from = computed(() => (props.page.number - 1) * props.page.size + 1)\nconst to = computed(() => from.value + props.rowCount - 1)\nconst lastPage = computed(() => !props.hasMore)\nconst single = computed(() => props.page.number === 1 && lastPage.value)\nconst time = (d: Date) => d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' })\n\nconst canPrev = computed(() => props.page.number > 1 && !props.busy)\nconst canNext = computed(() => props.hasMore && !props.busy)\nconst updatedText = computed(() => {\n if (!props.updatedAt) return ''\n const ago = Date.now() - props.updatedAt.getTime()\n return ago < 60_000\n ? i18n.t('toolbar.updatedJustNow')\n : i18n.t('toolbar.updatedAgo', { time: fmt.relative(props.updatedAt, new Date(), 'short') })\n})\n</script>\n\n<template>\n <div class=\"dt-footer\" role=\"navigation\" :aria-label=\"i18n.t('page.nav')\">\n <div class=\"dt-footer-left\">\n <span v-if=\"firstLoad\" class=\"dt-footer-muted\">{{ i18n.t('common.loading') }}</span>\n <span v-else-if=\"rowCount === 0\" class=\"dt-footer-rows\">{{ i18n.t(empty ? 'page.none' : 'page.zero') }}</span>\n <template v-else>\n <span class=\"dt-footer-rows\">{{ i18n.t('page.rows', { from: fmt.int(from), to: fmt.int(to) }) }}</span>\n <template v-if=\"total !== undefined && !single\">\n <span class=\"dt-footer-of\">{{ i18n.t('page.of', { total: fmt.int(total) }) }}</span>\n <span v-if=\"countedAt\" class=\"dt-footer-muted\">\n · {{ i18n.t('page.counted', { time: time(countedAt) }) }}\n </span>\n </template>\n <span v-else-if=\"counting\" class=\"dt-footer-muted\">\n {{ i18n.t('page.of', { total: '' }) }}\n <PhCircleNotch :size=\"12\" class=\"dt-spin\" aria-hidden=\"true\" />\n {{ i18n.t('page.counting') }}\n </span>\n <span v-else-if=\"lastPage && !single\" class=\"dt-footer-muted\">· {{ i18n.t('page.end') }}</span>\n <button\n v-else-if=\"countable && !single\"\n type=\"button\"\n class=\"dt-btn dt-btn-ghost dt-btn-xs dt-footer-count\"\n @click=\"emit('count')\"\n >\n · {{ i18n.t('page.countTotal') }}\n </button>\n </template>\n <template v-if=\"!phone && (updatedAt || freshness !== 'normal')\">\n <span class=\"dt-footer-vsep\" aria-hidden=\"true\" />\n <span v-if=\"freshness === 'live'\" class=\"dt-footer-live\">\n <span class=\"dt-live-dot\" aria-hidden=\"true\" />\n {{ i18n.t('toolbar.live') }}\n </span>\n <span v-else-if=\"freshness === 'refreshing'\" class=\"dt-footer-muted\" role=\"status\">\n {{ i18n.t('state.updating') }}\n </span>\n <span v-else-if=\"updatedAt\" class=\"dt-footer-updated\" :class=\"{ 'is-stale': freshness === 'stale' }\">\n {{ updatedText }}\n </span>\n <button\n v-if=\"canRefresh\"\n type=\"button\"\n class=\"dt-icon-btn-sm\"\n :aria-label=\"i18n.t('toolbar.refresh')\"\n :data-dt-tip=\"`${i18n.t('toolbar.refresh')} · R`\"\n @click=\"emit('refresh')\"\n >\n <PhArrowClockwise :size=\"14\" :class=\"{ 'dt-spin': freshness === 'refreshing' }\" aria-hidden=\"true\" />\n </button>\n </template>\n </div>\n <div class=\"dt-footer-right\">\n <label v-if=\"!phone\" class=\"dt-footer-size\">\n <span class=\"dt-footer-size-label\">{{ i18n.t('page.perPage') }}</span>\n <span class=\"dt-select\">\n <select\n :value=\"page.size\"\n :disabled=\"busy\"\n @change=\"emit('page-size', Number(($event.target as HTMLSelectElement).value))\"\n >\n <option v-for=\"s in pageSizes\" :key=\"s\" :value=\"s\">{{ s }}</option>\n </select>\n <PhCaretDown :size=\"12\" aria-hidden=\"true\" />\n </span>\n </label>\n <span v-if=\"!phone\" class=\"dt-footer-vsep\" aria-hidden=\"true\" />\n <button\n type=\"button\"\n class=\"dt-btn dt-btn-sm has-icon dt-footer-prev\"\n :aria-label=\"phone ? i18n.t('page.previous') : undefined\"\n :disabled=\"!canPrev\"\n @click=\"emit('page', page.number - 1)\"\n >\n <PhCaretLeft :size=\"phone ? 18 : 14\" aria-hidden=\"true\" />\n <span>{{ i18n.t('page.previous') }}</span>\n </button>\n <button\n type=\"button\"\n class=\"dt-btn dt-btn-sm dt-footer-next\"\n :aria-label=\"phone ? i18n.t('page.next') : undefined\"\n :disabled=\"!canNext\"\n @click=\"emit('page', page.number + 1)\"\n >\n <span>{{ i18n.t('page.next') }}</span>\n <PhCaretRight :size=\"phone ? 18 : 14\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n</template>\n","// Liste satır modeli (01 · TanStack sınırı, D23): istemci modunda arama + sıralama + sayfalama TanStack row model'leriyle;\n// sunucu modunda `manual*` ile satırlar olduğu gibi (işlemi sunucu yapar). Sıralama kuralları 04 §6. Seçim ve expand\n// durumu TanStack'te (D23); seçim sayfa kapsamlı (D19).\nimport {\n columnFilteringFeature,\n createFilteredRowModel,\n createPaginatedRowModel,\n createSortedRowModel,\n functionalUpdate,\n globalFilteringFeature,\n rowExpandingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n tableFeatures,\n useTable,\n type ColumnDef as TanstackColumnDef,\n} from '@tanstack/vue-table'\nimport { computed, toValue, type MaybeRefOrGetter, type Ref } from 'vue'\nimport { comparator } from '../core/cells/compare'\nimport { TYPE_SPECS } from '../core/cells/specs'\nimport { readPath } from '../core/columns/readPath'\nimport { matches } from '../core/filters/model'\nimport type { ColumnDef } from '../types/columns'\nimport type { FilterCondition, SortRule } from '../types/query'\n\nexport const MAX_SORT = 3\n\nconst features = tableFeatures({\n rowSortingFeature,\n sortedRowModel: createSortedRowModel(),\n // globalFiltering, columnFiltering'i ön koşul ister (TanStack); sütun filtreleri Faz 3'te kullanılır.\n columnFilteringFeature,\n globalFilteringFeature,\n filteredRowModel: createFilteredRowModel(),\n rowPaginationFeature,\n paginatedRowModel: createPaginatedRowModel(),\n rowSelectionFeature,\n rowExpandingFeature,\n})\ntype Features = typeof features\n\nexport interface ListTableOptions<Row extends object> {\n columns: MaybeRefOrGetter<Array<ColumnDef<Row>>>\n rows: MaybeRefOrGetter<Row[]>\n rowKey: MaybeRefOrGetter<string>\n mode: MaybeRefOrGetter<'client' | 'server'>\n locale: MaybeRefOrGetter<string>\n sort: Ref<SortRule[]>\n /** Tam (eksik olmayan) koşullar; istemci modunda sütun başına `filterFn` (04 §1). */\n filters?: Ref<FilterCondition[]>\n /** 1 tabanlı (Laravel simplePaginate). */\n page: Ref<{ number: number; size: number }>\n search: Ref<string>\n /** Sunucu modu: sonraki sayfa var mı. */\n hasMore: MaybeRefOrGetter<boolean | undefined>\n selectable?: MaybeRefOrGetter<boolean>\n /** Satır anahtarı → seçili (05 §6; TanStack `RowSelectionState`). */\n rowSelection?: Ref<Record<string, true>>\n /** Satır anahtarı → açık (05 §7). */\n expanded?: Ref<Record<string, boolean>>\n canExpand?: MaybeRefOrGetter<((row: Row) => boolean) | undefined>\n}\n\nconst isEmpty = (v: unknown) => v === null || v === undefined || v === ''\n\nexport const isSearchable = (def: ColumnDef): boolean => def.searchable ?? TYPE_SPECS[def.type].searchable\n\nexport function useListTable<Row extends object>(o: ListTableOptions<Row>) {\n const defs = computed(() => toValue(o.columns))\n const locale = computed(() => toValue(o.locale))\n const isServer = computed(() => toValue(o.mode) === 'server')\n\n const tanstackColumns = computed<Array<TanstackColumnDef<Features, Row, unknown>>>(() =>\n defs.value.map((d) => {\n const id = d.id as string\n const cmp = comparator(d, locale.value)\n return {\n id,\n accessorFn: d.accessor ?? ((row: Row) => readPath(row, id)),\n enableSorting: d.sortable ?? TYPE_SPECS[d.type].sortable,\n enableGlobalFilter: isSearchable(d),\n enableColumnFilter: d.filterable ?? TYPE_SPECS[d.type].filterable,\n filterFn: (row, columnId, cond: FilterCondition) =>\n matches(cond, row.getValue(columnId), { locale: locale.value }),\n sortFn: (a, b, columnId) => cmp(a.getValue(columnId), b.getValue(columnId)),\n sortUndefined: 1,\n }\n }),\n )\n\n // Arama metni küçük harfe locale'e göre çevrilir (09: I/ı, İ/i doğru eşleşmeli); TanStack'e normalize değer gider.\n const normalizedSearch = computed(() => o.search.value.trim().toLocaleLowerCase(locale.value))\n const state = computed(() => ({\n sorting: o.sort.value.map((s) => ({ id: s.column, desc: s.dir === 'desc' })),\n pagination: { pageIndex: o.page.value.number - 1, pageSize: o.page.value.size },\n globalFilter: normalizedSearch.value,\n columnFilters: (o.filters?.value ?? []).map((f) => ({ id: f.column, value: f })),\n rowSelection: o.rowSelection?.value ?? {},\n expanded: o.expanded?.value ?? {},\n }))\n const searchableIds = computed(() => new Set(defs.value.filter(isSearchable).map((d) => d.id as string)))\n\n const table = useTable<Features, Row>({\n features,\n columns: tanstackColumns,\n data: computed(() => toValue(o.rows)),\n getRowId: (row: Row) => String(readPath(row, toValue(o.rowKey))),\n state,\n manualSorting: isServer,\n manualFiltering: isServer,\n manualPagination: isServer,\n // Sunucu: sayfa sayısı bilinmez; hasMore varken -1 (sınırsız), yoksa bu sayfa son.\n autoResetPageIndex: false,\n enableSortingRemoval: true,\n maxMultiSortColCount: MAX_SORT,\n enableRowSelection: computed(() => toValue(o.selectable) ?? false),\n enableExpanding: computed(() => !!o.expanded),\n getRowCanExpand: (row) => toValue(o.canExpand)?.(row.original) ?? true,\n getColumnCanGlobalFilter: (column) => searchableIds.value.has(column.id),\n globalFilterFn: (row, columnId, filterValue: string) => {\n const v = row.getValue(columnId)\n if (isEmpty(v)) return false\n return String(v).toLocaleLowerCase(locale.value).includes(filterValue)\n },\n // Reka/Vue güncellemeleri bizde: state kontrollü, TanStack'in kendi updater'ları kullanılmaz.\n onSortingChange: () => {},\n onPaginationChange: () => {},\n onGlobalFilterChange: () => {},\n onColumnFiltersChange: () => {},\n onRowSelectionChange: (u) => {\n if (o.rowSelection) o.rowSelection.value = functionalUpdate(u, o.rowSelection.value)\n },\n onExpandedChange: (u) => {\n if (!o.expanded) return\n const next = functionalUpdate(u, o.expanded.value)\n if (next !== true) o.expanded.value = next\n },\n })\n\n /** Sayfadaki satırlar (istemci: süzülmüş + sıralı + dilimlenmiş; sunucu: verilen). */\n const rows = computed<Row[]>(() =>\n isServer.value ? toValue(o.rows) : table.getRowModel().rows.map((r) => r.original),\n )\n /** İstemci modunda eşleşen toplam; sunucuda bilinmez. */\n const total = computed<number | undefined>(() =>\n isServer.value ? undefined : table.getPrePaginatedRowModel().rows.length,\n )\n const canNext = computed(() =>\n isServer.value ? (toValue(o.hasMore) ?? false) : o.page.value.number * o.page.value.size < (total.value ?? 0),\n )\n const canPrev = computed(() => o.page.value.number > 1)\n\n /** Header tıklaması: asc → desc → kapalı; diğerleri kalkar. ⇧: ekle / yön değiştir / kaldır, en fazla 3 (dördüncüde en eski düşer). */\n const toggleSort = (column: string, multi: boolean) => {\n const current = o.sort.value\n const at = current.findIndex((s) => s.column === column)\n const existing = at >= 0 ? current[at]! : null\n const next: SortRule | null = !existing\n ? { column, dir: 'asc' }\n : existing.dir === 'asc'\n ? { column, dir: 'desc' }\n : null\n if (!multi) {\n o.sort.value = next ? [next] : []\n return\n }\n const rest = current.filter((s) => s.column !== column)\n if (!next) o.sort.value = rest\n else if (at >= 0) o.sort.value = current.map((s) => (s.column === column ? next : s))\n else o.sort.value = [...rest, next].slice(-MAX_SORT)\n }\n const setSort = (column: string, dir: 'asc' | 'desc' | null) => {\n o.sort.value = dir ? [{ column, dir }] : o.sort.value.filter((s) => s.column !== column)\n }\n\n const rowId = (row: Row) => String(readPath(row, toValue(o.rowKey)))\n /** Sayfadaki seçili satırlar (D19): yalnızca yüklü satırlar arasından. */\n const selectedRows = computed<Row[]>(() => {\n const sel = o.rowSelection?.value ?? {}\n return rows.value.filter((r) => sel[rowId(r)])\n })\n\n return {\n rows,\n total,\n canNext,\n canPrev,\n toggleSort,\n setSort,\n rowId,\n selectedRows,\n /** Header checkbox (05 §6): bu sayfadaki yüklü satırlar. */\n toggleAllPage: (value: boolean) => table.toggleAllPageRowsSelected(value),\n }\n}\n","// Talep akışı (05 §10, brief §6.2, D18): paket veri çekmez; sorguyu `@request` ile yayar, uygulama `rows` / `hasMore` /\n// `loading` / `error` verir. Her yeni talep öncekinin `signal`'ini abort eder; `pending`, talep yayıldığı andan\n// `rows`/`error` değişene veya `loading` düşene kadar sürer (uygulama `loading`'i geç yazsa da Empty yanıp sönmez).\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue'\nimport type { RequestReason, TableError, TableQuery, TableRequest } from '../types/query'\n\nexport interface Snapshot<Row> {\n rows: Row[]\n hasMore: boolean\n page: { number: number; size: number }\n}\n\nexport interface RequestOptions<Row> {\n mode: () => 'client' | 'server'\n /** `@request` dinleyicisi var mı (istemci modunda Refresh/Retry yalnızca o zaman görünür). */\n hasListener: boolean\n query: () => TableQuery\n rows: () => Row[]\n hasMore: () => boolean | undefined\n loading: () => boolean | undefined\n error: () => TableError | undefined\n requestOnColumnChange: () => boolean\n emit: (request: TableRequest) => void\n}\n\nconst STILL_LOADING_MS = 10_000\nconst COLUMNS_DEBOUNCE_MS = 400\n\nexport function useRequest<Row>(o: RequestOptions<Row>) {\n const pending = ref(false)\n const reason = ref<RequestReason | null>(null)\n const snapshot = shallowRef<Snapshot<Row> | null>(null)\n const updatedAt = ref<Date | null>(null)\n const stillLoading = ref(false)\n let controller: AbortController | null = null\n let stillTimer: ReturnType<typeof setTimeout> | undefined\n let columnsTimer: ReturnType<typeof setTimeout> | undefined\n /** Son yayılan talebin istediği alanlar: yeni görünen sütun bunların dışındaysa `columns` talebi. */\n let lastFields = new Set<string>()\n\n const settle = () => {\n pending.value = false\n stillLoading.value = false\n clearTimeout(stillTimer)\n }\n\n const send = (why: RequestReason) => {\n controller?.abort()\n controller = new AbortController()\n const query = o.query()\n lastFields = new Set(query.fields)\n reason.value = why\n pending.value = true\n stillLoading.value = false\n clearTimeout(stillTimer)\n stillTimer = setTimeout(() => (stillLoading.value = pending.value), STILL_LOADING_MS)\n o.emit({ query, reason: why, signal: controller.signal })\n }\n\n const isServer = () => o.mode() === 'server'\n\n // Sorgu (arama, filtre, sıralama, sütunlar) → 'query'; yalnızca sayfa → 'page'. Aynı tick'te sayfa sıfırlanırsa tek talep.\n const queryKey = computed(() => {\n const q = o.query()\n return JSON.stringify([q.search, q.filters, q.sort])\n })\n const pageKey = computed(() => JSON.stringify(o.query().page))\n const fieldsKey = computed(() => o.query().fields.join('\\u0000'))\n\n watch([queryKey, pageKey], ([q], [prevQ]) => {\n if (!isServer()) return\n send(q !== prevQ ? 'query' : 'page')\n })\n watch(fieldsKey, () => {\n if (!isServer() || !o.requestOnColumnChange()) return\n if (o.query().fields.every((f) => lastFields.has(f))) return\n clearTimeout(columnsTimer)\n columnsTimer = setTimeout(() => send('columns'), COLUMNS_DEBOUNCE_MS)\n })\n\n // Bitiş: satırlar değişti (başarılı), hata geldi, ya da uygulama loading'i düşürdü.\n watch(o.rows, (rows) => {\n snapshot.value = { rows, hasMore: o.hasMore() ?? false, page: o.query().page }\n updatedAt.value = new Date()\n settle()\n })\n watch(o.error, (err) => {\n if (err) settle()\n })\n watch(o.loading, (now, before) => {\n if (before && !now) settle()\n })\n\n onMounted(() => {\n if (isServer()) send('initial')\n else {\n snapshot.value = { rows: o.rows(), hasMore: false, page: o.query().page }\n updatedAt.value = new Date()\n }\n })\n onBeforeUnmount(() => {\n controller?.abort()\n clearTimeout(stillTimer)\n clearTimeout(columnsTimer)\n })\n\n /** Hata türü: sorgu/sayfa/ilk talep hatası satırları geçersiz kılar (Error); yenileme hatası eskiyi korur (Stale). */\n const errorKind = computed<'error' | 'stale' | null>(() => {\n if (!o.error()) return null\n const r = reason.value\n const keepsRows = (r === 'refresh' || r === 'columns' || r === null) && (snapshot.value?.rows.length ?? 0) > 0\n return keepsRows ? 'stale' : 'error'\n })\n\n return {\n pending,\n reason,\n snapshot,\n updatedAt,\n stillLoading,\n errorKind,\n /** Son talebi aynı sorguyla, 'refresh' sebebiyle yeniden yayar (satırlar yerinde kalır). */\n refresh: () => {\n if (o.hasListener) send('refresh')\n },\n /** Retry / Try again: son sebeple aynı sorgu. */\n retry: () => {\n if (o.hasListener) send(reason.value ?? 'refresh')\n },\n }\n}\n","<script setup lang=\"ts\" generic=\"Row extends object\">\n// DataTable (05) — Faz 2–3b: toolbar, ızgara, footer, durumlar, veri akışı (`@request`), sıralama, sayfalama, sütun yönetimi,\n// tercihler, filtreler, görünümler. Paket veri çekmez (D18): sorguyu yayar, `rows`/`hasMore`/`loading`/`error` alır.\n// Seçim ve satır menüsü Faz 4.\nimport { PhCheck, PhCircleNotch, PhFunnel, PhPlus, PhWarning } from '@phosphor-icons/vue'\nimport {\n computed,\n defineAsyncComponent,\n getCurrentInstance,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n watch,\n} from 'vue'\nimport { optionLabel } from '../core/cells/format'\nimport { RemoteLabels } from '../core/cells/remoteLabels'\nimport { TYPE_SPECS } from '../core/cells/specs'\nimport { readPath } from '../core/columns/readPath'\nimport { exportFile } from '../core/export/write'\nimport { useColumnLayout } from '../core/columns/useColumnLayout'\nimport ColumnPicker from '../core/filters/ColumnPicker.vue'\nimport FilterBar from '../core/filters/FilterBar.vue'\nimport { defaultOperator, isComplete, summarize, toCondition, type Chip, type Summary } from '../core/filters/model'\nimport { getFormat } from '../core/format'\nimport GridRoot from '../core/grid/GridRoot.vue'\nimport { useDelegatedTooltip } from '../core/grid/useDelegatedTooltip'\nimport { isTextInput } from '../core/interaction/isInteractive'\nimport { useDataTableContext } from '../core/plugin'\nimport { usePreferences } from '../core/preferences/usePreferences'\nimport StateMessage from '../core/states/StateMessage.vue'\nimport DisplayPopover from '../core/toolbar/DisplayPopover.vue'\nimport type { ColumnsDraft } from '../core/toolbar/ColumnsDialog.vue'\nimport MoreMenu from '../core/toolbar/MoreMenu.vue'\nimport Toolbar from '../core/toolbar/Toolbar.vue'\nimport ConfirmDialog from '../core/ui/ConfirmDialog.vue'\nimport { nameError, type NameError } from '../core/views/model'\nimport { useViews } from '../core/views/useViews'\nimport ViewDialog from '../core/views/ViewDialog.vue'\nimport ViewMenu from '../core/views/ViewMenu.vue'\nimport type {\n BulkAction,\n ColumnDef,\n Density,\n ExpandOptions,\n Plural,\n RowAction,\n RowClickMode,\n TableId,\n View,\n ViewPatch,\n ViewState,\n} from '../types'\nimport type {\n CountRequest,\n FilterCondition,\n QueryWithoutPage,\n SortRule,\n TableError,\n TableQuery,\n TableRequest,\n} from '../types/query'\nimport BulkBar from './BulkBar.vue'\nimport Footer from './footer/Footer.vue'\nimport { isSearchable, useListTable } from './useListTable'\nimport { useRequest } from './useRequest'\n\n// Telefon alt sayfaları yalnızca telefonda yüklenir: çekirdek paket boyutu (10 · ≤ 60 kB).\nconst FiltersSheet = defineAsyncComponent(() => import('../core/filters/FiltersSheet.vue'))\nconst PhoneMoreSheet = defineAsyncComponent(() => import('../core/toolbar/PhoneMoreSheet.vue'))\n\nconst props = withDefaults(\n defineProps<{\n tableId: TableId\n columns: Array<ColumnDef<Row>>\n rows: Row[]\n rowKey?: string\n /** Verilmezse tercihten (Display › Density), o da yoksa standard. */\n density?: Density\n entityName?: Plural\n /** Tek harfli kısayollar (/, F, R). Oklar, Enter, Space, Esc ve Alt←/→ her zaman. */\n shortcuts?: boolean\n /** client: tüm satırlar verilir, arama/sıralama/sayfalama yerelde. server: `@request` ile uygulama çeker. */\n mode?: 'client' | 'server'\n loading?: boolean\n error?: TableError\n /** Sunucu modu: sonraki sayfa var mı (Laravel `next_page_url !== null`). */\n hasMore?: boolean\n /** Biliniyorsa toplam; istemci modunda otomatik. */\n total?: number\n /** Sunucu modu: footer'da \"Count total\" → `@count`. */\n countable?: boolean\n /** Her talepte `query.fields`'e eklenecek ek alanlar. */\n fields?: string[]\n /** Yeni görünen sütunun yolu son talepte yoksa `reason: 'columns'` talebi (400 ms birleştirme). */\n requestOnColumnChange?: boolean\n /** auto: yapılandırılana göre yuvalar; minimal: yalnızca arama + `#toolbar-end`; false: toolbar yok. */\n toolbar?: 'auto' | 'minimal' | false\n searchPlaceholder?: string\n /** Varsayılan 100; tercih varsa o. */\n pageSize?: number\n pageSizes?: number[]\n /** Saniye. Verilmezse More menüsünde Auto-refresh görünmez. */\n autoRefresh?: number\n /** Kodla tanımlı görünümler (kind: 'system'); adapter'daki kişisel görünümlerle birleştirilir (04 §7). */\n views?: View[]\n /** Seçim sütunu; seçim sayfa kapsamlıdır (D19). */\n selectable?: boolean\n /** Seçim çubuğu: yüzer (varsayılan) ya da toolbar'ın yerine. */\n selectionBar?: 'floating' | 'toolbar'\n bulkActions?: Array<BulkAction<Row>>\n /** Satır menüsü (⋯, sağ tık, ⇧F10): Open / Copy yerleşik + bunlar. */\n rowActions?: Array<RowAction<Row>>\n /** Satır gövdesine tıklama (D6). Varsayılan 'none'. */\n rowClick?: RowClickMode\n expand?: boolean | ExpandOptions<Row>\n /** Satır hatası (D35): metin/metin listesi → `--dt-r-bg` + ⋯ hücresinde uyarı ikonu + satırda tooltip. Harita uygulamanın. */\n rowError?: (row: Row) => string | string[] | null | undefined\n /** More › Export (D46). Varsayılan açık; `false` gizler (ör. yetki). */\n exportable?: boolean\n }>(),\n {\n rowKey: 'id',\n shortcuts: true,\n mode: 'client',\n countable: false,\n requestOnColumnChange: true,\n toolbar: 'auto',\n pageSize: 100,\n pageSizes: () => [50, 100, 250, 500],\n views: () => [],\n selectable: false,\n selectionBar: 'floating',\n rowClick: 'none',\n expand: false,\n exportable: true,\n },\n)\nconst emit = defineEmits<{\n /** Sunucu modunda her talep; istemci modunda yalnızca `refresh()`. */\n request: [request: TableRequest]\n count: [request: CountRequest]\n /** Etkileşimli hedef, metin seçimi ve değiştirici tuş dışındaki satır tıklamaları (`rowClick`'ten bağımsız). */\n 'row-click': [payload: { row: Row; event: MouseEvent }]\n /** Birincil linke düz sol tık, satırda ↵, menüde Open, `row-click=\"open\"`. Paket preventDefault yapmaz (05 §7). */\n 'row-open': [payload: { row: Row; href: string; event: MouseEvent }]\n /** Seçim her değiştiğinde; sayfa kapsamlı yüklü satırlar (D19). */\n 'selection-change': [rows: Row[]]\n /** Dinlenirse paket dosya yazmaz (D46); `rows` paketin yazacağı satırlardır (seçim ya da sayfa). */\n export: [\n payload: {\n format: 'csv' | 'xlsx'\n query: QueryWithoutPage\n selection: Row[]\n rows: Row[]\n visibleColumns: string[]\n },\n ]\n import: []\n print: [payload: { query: QueryWithoutPage; visibleColumns: string[] }]\n 'view-change': [payload: { id: string; kind: View['kind'] }]\n}>()\ndefineSlots<{\n empty?: () => unknown\n 'toolbar-end'?: (props: { compact: boolean }) => unknown\n /** Satır detayı; veriyi slot bileşeni çeker (05 §7). */\n expanded?: (props: { row: Row; close: () => void }) => unknown\n /** bulkActions yerine özel seçim çubuğu içeriği. */\n 'selection-actions'?: (props: { rows: Row[]; clear: () => void }) => unknown\n}>()\n\nconst ctx = useDataTableContext()\nconst { i18n } = ctx\n// Toolbar yuvaları ve Retry yalnızca uygulama ilgili olayı dinliyorsa (05 §3, §10).\nconst vnodeProps = getCurrentInstance()?.vnode.props ?? {}\nconst listens = (name: string) => name in vnodeProps\nconst isServer = computed(() => props.mode === 'server')\nif (import.meta.env?.DEV && props.mode === 'server' && !listens('onRequest'))\n console.warn(`[data-table] \"${props.tableId}\": mode=\"server\" ama @request dinleyicisi yok; satırlar hiç gelmeyecek.`)\n\nconst entity = computed<Plural>(() => props.entityName ?? { one: props.tableId, other: props.tableId })\nconst ariaLabel = computed(() => entity.value.other)\n\n// Telefon düzeni (05 §11, handoff 04): kartın kendi genişliği < 640 → is-phone; Toolbar daralma eşikleri de buradan (ResizeObserver).\nconst rootEl = ref<HTMLElement | null>(null)\nconst width = ref(1440)\nconst size = computed(() => (width.value >= 1024 ? 'full' : width.value >= 640 ? 'narrow' : 'phone'))\nconst phone = computed(() => size.value === 'phone')\nlet ro: ResizeObserver | undefined\nonMounted(() => {\n const measure = () => (width.value = rootEl.value?.clientWidth || 1440)\n measure()\n if (typeof ResizeObserver !== 'undefined' && rootEl.value) {\n ro = new ResizeObserver(measure)\n ro.observe(rootEl.value)\n }\n})\n\n// Tercihler (05 §9): yoğunluk, dikey çizgiler, sayfa boyutu; adapter yoksa oturumluk.\nconst pref = usePreferences(() => props.tableId, ctx.preferences, {\n density: 'standard',\n verticalLines: false,\n pageSize: props.pageSize,\n defaultViewId: null,\n})\nconst density = computed<Density>(() => props.density ?? pref.prefs.density)\n\n// Varsayılan sütun genişlikleri 13 px yazıya göre (03); yoğunluğun hücre yazısı (--dt-fs) büyüdükçe o oranda genişler.\nconst colScale = ref(1)\nwatch(\n [density, rootEl],\n () => {\n const fs = rootEl.value ? parseFloat(getComputedStyle(rootEl.value).getPropertyValue('--dt-fs')) : NaN\n colScale.value = Number.isFinite(fs) ? fs / 13 : 1\n },\n { flush: 'post' },\n)\nconst layout = useColumnLayout<Row>({\n columns: () => props.columns,\n rows: () => props.rows,\n rowKey: () => props.rowKey,\n phone: () => phone.value,\n scale: colScale,\n})\n\n// Sorgu durumu. Arama/sıralama değişince sayfa 1 (aynı tick → tek talep).\nconst search = ref('')\nconst sort = ref<SortRule[]>([])\nconst page = ref({ number: 1, size: pref.prefs.pageSize })\nconst goTo = (number: number) => (page.value = { ...page.value, number })\nconst setSearch = (value: string) => {\n if (value === search.value) return\n search.value = value\n goTo(1)\n}\nwatch(\n () => pref.prefs.pageSize,\n (size) => (page.value = { number: 1, size }),\n)\n\n// Filtreler (04): çipler ekranda; yalnızca tam olanlar sorguya girer (D2: sütun başına tek çip).\nconst chips = ref<Chip[]>([])\nconst editing = ref<string | null>(null)\nconst pickerOpen = ref(false)\nconst labels = new RemoteLabels()\nconst fmt = getFormat(ctx.locale)\nconst defs = computed(() => new Map(props.columns.map((c) => [c.id as string, c as ColumnDef])))\nconst typeOf = (column: string) => defs.value.get(column)?.type ?? 'string'\nconst filters = computed<FilterCondition[]>(() =>\n chips.value.filter((c) => isComplete(c, typeOf(c.column))).map(toCondition),\n)\nconst filteredColumns = computed(() => new Set(filters.value.map((f) => f.column)))\nconst hasFilter = computed(\n () => props.toolbar === 'auto' && props.columns.some((c) => c.filterable ?? TYPE_SPECS[c.type].filterable),\n)\nconst labelOf = (def: ColumnDef) => (v: string | number) => {\n if (def.type === 'select' || def.type === 'multiselect' || (def.type === 'user' && def.options))\n return optionLabel(def.options, v)\n if ((def.type === 'user' || def.type === 'ajax') && def.remote) return labels.label(def.id as string, def.remote, v)\n return String(v)\n}\nconst summaryOf = (chip: Chip): Summary => {\n const def = defs.value.get(chip.column)!\n return summarize(chip, def, { i18n, fmt, labelOf: labelOf(def) })\n}\nconst currenciesOf = (def: ColumnDef): string[] => {\n if (def.type !== 'currency') return []\n if (typeof def.currency === 'string') return [def.currency]\n return [...new Set(props.rows.map((r) => (def.currency as (row: Row) => string)(r)))]\n}\n/** Picker / header: var olan çipi açar, yoksa tipin varsayılan operatörüyle oluşturup editörünü açar; boolean doğrudan uygulanır. */\nconst pick = (column: string) => {\n const def = defs.value.get(column)\n if (!def) return\n if (phone.value) {\n filtersSheet.value?.show(column)\n return\n }\n if (!chips.value.some((c) => c.column === column)) {\n const op = defaultOperator(def)\n chips.value = [...chips.value, def.type === 'boolean' ? { column, op, value: true } : { column, op }]\n if (def.type === 'boolean') return\n }\n editing.value = column\n}\nconst updateChip = (chip: Chip) => (chips.value = chips.value.map((c) => (c.column === chip.column ? chip : c)))\nconst removeChip = (column: string) => {\n chips.value = chips.value.filter((c) => c.column !== column)\n if (editing.value === column) editing.value = null\n}\n/** Editör değer seçilmeden kapanırsa çip kaldırılır (04 §1). */\nconst setEditing = (column: string | null) => {\n const prev = editing.value\n editing.value = column\n if (prev && prev !== column) {\n const c = chips.value.find((x) => x.column === prev)\n if (c && !isComplete(c, typeOf(prev))) removeChip(prev)\n }\n}\nconst clearFilters = () => {\n chips.value = []\n editing.value = null\n}\n/** Telefon Filters sayfası (04 §9): çipler ve sıralama Show results'la tek adımda uygulanır. */\nconst filtersSheet = ref<{ show: (column?: string) => void } | null>(null)\nconst applySheet = (next: Chip[], s: SortRule[]) => {\n chips.value = next\n editing.value = null\n sort.value = s\n goTo(1)\n}\n\nconst visibleColumns = computed(() => layout.columns.value.map((c) => c.id))\nconst fields = computed(() => {\n const out = new Set<string>([props.rowKey])\n for (const c of layout.columns.value) {\n if (!c.def.accessor) out.add(c.id)\n for (const f of c.def.fields ?? []) out.add(f)\n }\n for (const f of props.fields ?? []) out.add(f)\n return [...out]\n})\nconst query = computed<TableQuery>(() => ({\n search: search.value,\n filters: filters.value,\n sort: sort.value,\n page: page.value,\n columns: visibleColumns.value,\n fields: fields.value,\n}))\nconst queryWithoutPage = (): QueryWithoutPage => {\n const { search, filters, sort, columns, fields } = query.value\n return { search, filters, sort, columns, fields }\n}\n\n// Ekran okuyucu bölgeleri (08 §5); görünüm/filtre/sıralama duyuruları buraya yazar.\nconst polite = ref('')\nconst assertive = ref('')\n\n// Görünümler (04 §7, D4, D5): görünüm = filtre + sıralama + sütun düzeni; uygulama tek adımda (aynı tick) → tek talep.\nconst current = (): ViewState => ({ filters: filters.value, sort: sort.value, columns: layout.state.value })\nconst applyView = (p: ViewPatch) => {\n chips.value = (p.filters ?? []).map((f) => ({ ...f }))\n editing.value = null\n sort.value = p.sort ?? []\n layout.apply(p.columns)\n goTo(1)\n}\nconst vw = useViews({\n tableId: () => props.tableId,\n system: () => props.views,\n adapter: ctx.viewsAdapter,\n locale: () => ctx.locale,\n defaultViewId: () => pref.prefs.defaultViewId,\n setDefaultViewId: (id) => pref.set({ defaultViewId: id }),\n prefsReady: pref.ready,\n current,\n apply: applyView,\n onChange: (v) => {\n emit('view-change', { id: v.id, kind: v.kind })\n polite.value = i18n.t('sr.view', { name: v.name })\n },\n})\nconst viewMenuOpen = ref(false)\nconst viewSummary = (s: ViewState) => {\n const first = s.sort[0]\n const more = s.sort.length > 1 ? ` +${s.sort.length - 1}` : ''\n const pinned = [...s.columns.pinned.left, ...s.columns.pinned.right].map(headerOf).join(', ')\n return {\n filters: s.filters.map((f) => headerOf(f.column)).join(' · ') || i18n.t('common.empty'),\n sort: first ? `${headerOf(first.column)} ${first.dir === 'asc' ? '↑' : '↓'}${more}` : i18n.t('common.empty'),\n columns: [\n i18n.t('views.columnsSummary', { shown: s.columns.visible.length, total: props.columns.length }),\n ...(pinned ? [i18n.t('views.pinnedSummary', { name: pinned })] : []),\n ].join(' · '),\n }\n}\nconst resolveState = (v: View): ViewState => ({\n filters: v.state.filters ?? [],\n sort: v.state.sort ?? [],\n columns: layout.resolve(v.state.columns),\n})\ninterface ViewDialogState {\n mode: 'create' | 'rename'\n name: string\n state: ViewState\n summary: ReturnType<typeof viewSummary> | null\n view?: View\n /** Mevcut düzenleme yeni görünüme taşınır (Save as new / New view); Duplicate'te aktif görünümün taslağı kalır. */\n fromCurrent: boolean\n}\nconst viewDialog = ref<ViewDialogState | null>(null)\nconst viewDialogOpen = computed({\n get: () => !!viewDialog.value,\n set: (o: boolean) => {\n if (!o) viewDialog.value = null\n },\n})\nconst confirmDelete = ref<View | null>(null)\n/** Save as new view / Save as my view / New view: mevcut durum, ad boş. Duplicate: kaynağın kayıtlı durumu, \"{ad} copy\". */\nconst openSaveAs = (view?: View) => {\n const state = view ? resolveState(view) : current()\n viewDialog.value = {\n mode: 'create',\n name: view ? i18n.t('views.copyName', { name: view.name }) : '',\n state,\n summary: viewSummary(state),\n view,\n fromCurrent: !view,\n }\n}\nconst openRename = (view: View) =>\n (viewDialog.value = { mode: 'rename', name: view.name, state: current(), summary: null, view, fromCurrent: false })\nconst validateViewName = (name: string): NameError | null => {\n const d = viewDialog.value\n return nameError(name, vw.all.value, ctx.locale, d?.mode === 'rename' ? d.view?.id : undefined)\n}\nconst onViewDialogSave = (input: { name: string; makeDefault: boolean }) => {\n const d = viewDialog.value\n if (!d) return\n if (d.mode === 'rename' && d.view) void vw.rename(d.view.id, input.name)\n else\n void vw.create({\n name: input.name,\n state: d.state,\n makeDefault: input.makeDefault,\n fromCurrent: d.fromCurrent,\n })\n}\nconst removeView = () => {\n const v = confirmDelete.value\n if (v) void vw.remove(v.id)\n}\n\n// Seçim ve expand (05 §6–7): durum TanStack'te (D23); seçim sayfa kapsamlı (D19), expand anahtarla (refresh'te açık kalır).\nconst rowSelection = ref<Record<string, true>>({})\nconst expanded = ref<Record<string, boolean>>({})\nconst expandOn = computed(() => !!props.expand)\nconst canExpandFn = computed(() => (typeof props.expand === 'object' ? props.expand.canExpand : undefined))\nconst list = useListTable<Row>({\n columns: () => props.columns,\n rows: () => props.rows,\n rowKey: () => props.rowKey,\n mode: () => props.mode,\n locale: ctx.locale,\n sort,\n filters,\n page,\n search,\n hasMore: () => props.hasMore,\n selectable: () => props.selectable,\n rowSelection,\n expanded,\n canExpand: () => canExpandFn.value,\n})\nconst req = useRequest<Row>({\n mode: () => props.mode,\n hasListener: listens('onRequest'),\n query: () => query.value,\n rows: () => props.rows,\n hasMore: () => props.hasMore,\n loading: () => props.loading,\n error: () => props.error,\n requestOnColumnChange: () => props.requestOnColumnChange,\n emit: (r) => emit('request', r),\n})\n\n// Sıralama (04 §6): tık asc → desc → kapalı; ⇧ ikincil (en fazla 3); menüden yön.\nconst onSort = (id: string, additive: boolean) => {\n list.toggleSort(id, additive)\n goTo(1)\n}\nconst onSortSet = (id: string, dir: 'asc' | 'desc' | null) => {\n list.setSort(id, dir)\n goTo(1)\n}\nconst sortMap = computed(\n () => new Map(sort.value.map((s, i) => [s.column, { dir: s.dir, index: sort.value.length > 1 ? i + 1 : null }])),\n)\nconst headerOf = (id: string) => props.columns.find((c) => c.id === id)?.header ?? id\n\n// Durumlar (05 §10): üç girdi — pending/sebep, satır var mı, hata.\nconst reason = req.reason\nconst pending = req.pending\nconst rowsShown = computed<Row[]>(() => (req.errorKind.value === 'error' ? [] : list.rows.value))\nconst hasRows = computed(() => rowsShown.value.length > 0)\nconst identityChange = computed(() => pending.value && (reason.value === 'query' || reason.value === 'page'))\nconst dim = computed(() => identityChange.value && hasRows.value)\nconst slow = ref(false)\nlet slowTimer: ReturnType<typeof setTimeout> | undefined\nwatch(dim, (on) => {\n clearTimeout(slowTimer)\n slow.value = false\n if (on) slowTimer = setTimeout(() => (slow.value = true), 400)\n})\nconst skeleton = computed(\n () => (pending.value && !hasRows.value) || (!!props.loading && !hasRows.value && !props.error) || slow.value,\n)\nconst refreshing = computed(\n () =>\n (pending.value && (reason.value === 'refresh' || reason.value === 'columns')) ||\n (!!props.loading && hasRows.value && !identityChange.value),\n)\nconst refreshBar = ref(false)\nlet barTimer: ReturnType<typeof setTimeout> | undefined\nwatch(refreshing, (on) => {\n clearTimeout(barTimer)\n refreshBar.value = false\n if (on) barTimer = setTimeout(() => (refreshBar.value = true), 150)\n})\nconst busy = computed(() => identityChange.value || (skeleton.value && !hasRows.value))\nconst bodyState = computed<'error' | 'noResults' | 'noRowsOnPage' | 'empty' | null>(() => {\n if (skeleton.value || hasRows.value || pending.value) return null\n if (req.errorKind.value === 'error') return 'error'\n if (search.value || filters.value.length) return 'noResults'\n if (page.value.number > 1) return 'noRowsOnPage'\n return 'empty'\n})\nconst errorInfo = computed(() => {\n const e = props.error\n return typeof e === 'object' && e ? e : typeof e === 'string' ? { message: e } : {}\n})\nconst noResultsTitle = computed(() => {\n const count = filters.value.length\n const params = { entity: entity.value, q: search.value, count }\n if (search.value && count) return i18n.t('state.noResultsBoth', params)\n if (search.value) return i18n.t('state.noResultsSearch', params)\n return i18n.t('state.noResults', params)\n})\nconst clock = (d: Date) => d.toLocaleTimeString(ctx.locale, { hour: '2-digit', minute: '2-digit' })\n\n// Footer yalnızca snapshot'tan okur (05 §8); istemci modunda satır modeli zaten yerel.\nconst snap = req.snapshot\nconst footerRows = computed(() =>\n req.errorKind.value === 'error' ? 0 : isServer.value ? (snap.value?.rows.length ?? 0) : list.rows.value.length,\n)\nconst footerPage = computed(() => (isServer.value ? (snap.value?.page ?? page.value) : page.value))\nconst footerHasMore = computed(() => (isServer.value ? (snap.value?.hasMore ?? false) : list.canNext.value))\nconst total = computed(() => (isServer.value ? props.total : list.total.value))\n\n// Count total → @count; sonuç sorgu değişene kadar geçerli.\nlet countCtl: AbortController | null = null\nconst counting = ref(false)\nconst countedAt = ref<Date | null>(null)\nconst count = () => {\n countCtl?.abort()\n countCtl = new AbortController()\n counting.value = true\n emit('count', { query: queryWithoutPage(), signal: countCtl.signal })\n}\nwatch(\n () => props.total,\n (t) => {\n if (t === undefined) return\n counting.value = false\n countedAt.value = isServer.value ? new Date() : null\n polite.value = i18n.t('sr.total', { count: fmt.int(t), entity: entity.value })\n },\n)\nwatch(\n () => JSON.stringify([search.value, sort.value, filters.value]),\n () => {\n countCtl?.abort()\n counting.value = false\n countedAt.value = null\n },\n)\n\n// Sayfa değişince gövde başa kayar (05 §8).\nconst grid = ref<InstanceType<typeof GridRoot> | null>(null)\nwatch(\n () => page.value.number,\n () => grid.value?.scrollToTop(),\n)\nconst setPageSize = (size: number) => pref.set({ pageSize: size })\n// Her filtre değişikliğinde sayfa 1, gövde başa (04 §3); ekran okuyucuya eklenen/kaldırılan filtre (08 §5).\nwatch(\n () => JSON.stringify(filters.value),\n (now, before) => {\n goTo(1)\n grid.value?.scrollToTop()\n const prev = new Map((JSON.parse(before) as FilterCondition[]).map((f) => [f.column, JSON.stringify(f)]))\n const next = new Map((JSON.parse(now) as FilterCondition[]).map((f) => [f.column, JSON.stringify(f)]))\n for (const [column, key] of next)\n if (prev.get(column) !== key) {\n const chip = chips.value.find((c) => c.column === column)\n if (chip) {\n const sm = summaryOf(chip)\n polite.value = i18n.t('sr.filterAdded', { summary: `${headerOf(column)} ${sm.text}`.trim() })\n }\n }\n for (const column of prev.keys())\n if (!next.has(column)) polite.value = i18n.t('sr.filterRemoved', { column: headerOf(column) })\n },\n)\n\n// Auto-refresh (05 §3): açıkken footer \"Live\".\nconst autoRefreshOn = ref(false)\nlet autoTimer: ReturnType<typeof setInterval> | undefined\nwatch(autoRefreshOn, (on) => {\n clearInterval(autoTimer)\n if (on && props.autoRefresh) autoTimer = setInterval(() => req.refresh(), props.autoRefresh * 1000)\n})\nconst freshness = computed<'normal' | 'refreshing' | 'stale' | 'live'>(() =>\n autoRefreshOn.value ? 'live' : refreshing.value ? 'refreshing' : req.errorKind.value === 'stale' ? 'stale' : 'normal',\n)\n\n// Toolbar yuvaları (05 §3): yalnızca yapılandırılmış olanlar.\nconst hasSearch = computed(() => props.toolbar !== false && props.columns.some(isSearchable))\nconst hasDisplay = computed(() => props.toolbar === 'auto')\nconst more = computed(() => ({\n refresh: listens('onRequest'),\n export: props.exportable ? exportLabel.value : (false as const),\n import: listens('onImport'),\n print: listens('onPrint'),\n autoRefresh: props.autoRefresh !== undefined,\n}))\nconst hasMore = computed(() => props.toolbar === 'auto' && Object.values(more.value).some(Boolean))\nconst searchPlaceholder = computed(() => props.searchPlaceholder ?? i18n.t('toolbar.search', { entity: entity.value }))\nconst toolbarRef = ref<InstanceType<typeof Toolbar> | null>(null)\nconst displayProps = computed(() => ({\n density: density.value,\n verticalLines: pref.prefs.verticalLines,\n columns: layout.panel.value,\n counts: layout.counts.value,\n persistent: pref.persistent,\n}))\n// v-on nesnesi: anahtarlar olay adı (Vue `on` önekini kendisi ekler).\nconst displayOn = {\n 'update:density': (d: Density) => pref.set({ density: d }),\n 'columns-save': (d: ColumnsDraft) => layout.arrange(d),\n // Display › Reset: tercihler + sütun düzeni aktif görünümün kayıtlı haline; filtre ve sıralama korunur.\n reset: () => {\n pref.reset()\n layout.reset(vw.active.value?.state.columns)\n },\n}\n// Telefon ⋯ sayfasında Sort › kalır (masaüstü Display'de yok).\nconst phoneSortOn = {\n 'sort-dir': (column: string, dir: 'asc' | 'desc') => {\n sort.value = sort.value.map((s) => (s.column === column ? { column, dir } : s))\n goTo(1)\n },\n 'sort-remove': (column: string) => onSortSet(column, null),\n 'sort-clear': () => {\n sort.value = []\n goTo(1)\n },\n}\n// Export (D46): ekranda görünen sütunlar ve satırlar — seçim varsa seçili satırlar, yoksa sayfadaki satırlar.\nconst exportRowsOf = () => (list.selectedRows.value.length ? list.selectedRows.value : rowsShown.value)\nconst exportLabel = computed(() => {\n const n = list.selectedRows.value.length\n return n\n ? i18n.t('toolbar.exportSelected', { count: n })\n : i18n.t('toolbar.export', { count: rowsShown.value.length })\n})\nconst cellValue = (row: Row, def: ColumnDef<Row>) =>\n def.accessor ? def.accessor(row) : readPath(row, def.id as string)\nconst onExport = (format: 'csv' | 'xlsx') => {\n const rows = exportRowsOf()\n if (listens('onExport'))\n return emit('export', {\n format,\n query: queryWithoutPage(),\n selection: list.selectedRows.value,\n rows,\n visibleColumns: visibleColumns.value,\n })\n void exportFile({\n format,\n columns: layout.columns.value.map((c) => c.def),\n rows,\n read: cellValue,\n env: { fmt, i18n, today: new Date(), labels },\n name: entity.value.other,\n })\n}\n\n// Birincil hücre (D6): link, aria etiketleri ve Copy için metin; ⋯ sütunu birincil sütun ya da rowActions varsa.\nconst primaryDef = computed(() => props.columns.find((c) => c.primary))\nconst primaryHref = (row: Row) => primaryDef.value?.href?.(row)\nconst primaryLabel = (row: Row): string => {\n const d = primaryDef.value\n const v = d ? (d.accessor ? d.accessor(row) : readPath(row, d.id as string)) : readPath(row, props.rowKey)\n return v === null || v === undefined ? '' : String(v)\n}\nconst rowMenu = computed(() => !!props.rowActions?.length || !!primaryDef.value)\nconst selectedRows = list.selectedRows\nconst clearSelection = () => (rowSelection.value = {})\nconst selectRows = (ids: string[], value: boolean) => {\n const next = { ...rowSelection.value }\n for (const id of ids) {\n if (value) next[id] = true\n else delete next[id]\n }\n rowSelection.value = next\n}\n// Sayfa, sayfa boyutu, filtre, arama, sıralama → seçim temizlenir, açıklar kapanır (D19, 05 §7); refresh'te korunur.\nwatch(\n () => JSON.stringify([search.value, filters.value, sort.value, page.value]),\n () => {\n rowSelection.value = {}\n expanded.value = {}\n grid.value?.measure()\n },\n)\n// Yeni veride olmayan anahtarlar süzülür (05 §12).\nwatch(\n () => props.rows,\n (rows) => {\n const ids = new Set(rows.map(list.rowId))\n const keep = (o: Record<string, boolean>) => Object.fromEntries(Object.entries(o).filter(([id]) => ids.has(id)))\n if (Object.keys(rowSelection.value).some((id) => !ids.has(id)))\n rowSelection.value = keep(rowSelection.value) as Record<string, true>\n if (Object.keys(expanded.value).some((id) => !ids.has(id))) expanded.value = keep(expanded.value)\n },\n)\nwatch(selectedRows, (rows) => {\n emit('selection-change', rows)\n if (rows.length) polite.value = i18n.t('selection.selected', { count: rows.length })\n})\nconst toggleExpand = (id: string, value: boolean) => {\n const next = { ...expanded.value }\n if (value) next[id] = true\n else delete next[id]\n expanded.value = next\n if (!value) return\n void nextTick(() => {\n const row = props.rows.find((r) => list.rowId(r) === id)\n const sub = [\n ...((grid.value?.$el as HTMLElement | undefined)?.querySelectorAll<HTMLElement>('.dt-subrow') ?? []),\n ].find((el) => el.id.endsWith(`-sub-${id}`))\n if (row)\n polite.value = i18n.t('sr.expanded', {\n label: primaryLabel(row),\n count: sub ? sub.querySelectorAll('[role=\"row\"], tr').length : 0,\n })\n })\n}\n/** Satır gövdesi (D6): her zaman `row-click`; `rowClick` modu açar ya da detayı açıp kapatır. */\nconst onRowClick = (row: Row, event: MouseEvent) => {\n emit('row-click', { row, event })\n if (props.rowClick === 'open') {\n ;(event.target as Element | null)\n ?.closest('.dt-row')\n ?.querySelector<HTMLElement>('.dt-cell.is-primary a.dt-link')\n ?.click()\n } else if (props.rowClick === 'expand' && expandOn.value && (canExpandFn.value?.(row) ?? true)) {\n const id = list.rowId(row)\n toggleExpand(id, !expanded.value[id])\n }\n}\nconst onRowOpen = (row: Row, event: MouseEvent) => emit('row-open', { row, href: primaryHref(row) ?? '', event })\n// Toast: yalnızca \"Copied\" (handoff 02 §6); bulk aksiyonlar için toast uygulamanındır (D20).\nconst toast = ref<string | null>(null)\nlet toastTimer: ReturnType<typeof setTimeout> | undefined\nconst copyId = (row: Row) => {\n void navigator.clipboard?.writeText(primaryLabel(row))\n toast.value = i18n.t('cell.copied')\n clearTimeout(toastTimer)\n toastTimer = setTimeout(() => (toast.value = null), 2000)\n}\nconst onPrint = () => emit('print', { query: queryWithoutPage(), visibleColumns: visibleColumns.value })\nconst copyErrorId = () => void navigator.clipboard?.writeText(errorInfo.value.id ?? '')\n\n// Kısayollar (08 §3): `/` arama, `F` filtre, `V` görünüm, `R` yenile, `⌘S` görünümü kaydet; Alt←/→ sayfa (her zaman).\n// Kapsam sayfa; tek harfliler odak metin alanındayken kapalı.\nconst onKey = (e: KeyboardEvent) => {\n if (e.defaultPrevented) return\n const target = e.target instanceof Element ? e.target : null\n // Seçim checkbox'ları Tab durağı (D38): odakları kısayolları ve Esc'i kapatmaz.\n const typing = !!target && isTextInput(target) && !(target instanceof HTMLInputElement && target.type === 'checkbox')\n // Esc sırayla: açık popover/menü/dialog (odak içindedir) → seçim (05 §6); metin alanında aramanın Esc'i.\n if (e.key === 'Escape') {\n const inLayer = !!target?.closest('[role=\"menu\"], [role=\"dialog\"], [role=\"alertdialog\"], [role=\"listbox\"], .dt-pop')\n if (!e.defaultPrevented && !inLayer && selectedRows.value.length && !typing) clearSelection()\n return\n }\n if (e.altKey && !e.ctrlKey && !e.metaKey && (e.key === 'ArrowLeft' || e.key === 'ArrowRight')) {\n if (busy.value) return\n const next = e.key === 'ArrowLeft' ? page.value.number - 1 : page.value.number + 1\n if (next >= 1 && (e.key === 'ArrowLeft' || footerHasMore.value)) {\n e.preventDefault()\n goTo(next)\n }\n return\n }\n if ((e.metaKey || e.ctrlKey) && !e.altKey && !e.shiftKey && (e.key === 's' || e.key === 'S')) {\n if (!props.shortcuts || !vw.edited.value || !ctx.viewsAdapter || viewDialog.value) return\n e.preventDefault()\n if (vw.writable(vw.active.value)) void vw.saveChanges()\n else openSaveAs()\n return\n }\n if (!props.shortcuts || e.ctrlKey || e.metaKey || e.altKey || typing) return\n if (e.key === '/' && hasSearch.value) {\n e.preventDefault()\n toolbarRef.value?.focusSearch()\n } else if ((e.key === 'f' || e.key === 'F') && hasFilter.value) {\n e.preventDefault()\n if (phone.value) filtersSheet.value?.show()\n else pickerOpen.value = true\n } else if ((e.key === 'r' || e.key === 'R') && listens('onRequest')) {\n e.preventDefault()\n req.refresh()\n } else if ((e.key === 'v' || e.key === 'V') && vw.hasViews.value && props.toolbar === 'auto') {\n e.preventDefault()\n viewMenuOpen.value = true\n }\n}\nonMounted(() => window.addEventListener('keydown', onKey))\nonBeforeUnmount(() => {\n window.removeEventListener('keydown', onKey)\n ro?.disconnect()\n clearTimeout(slowTimer)\n clearTimeout(barTimer)\n clearInterval(autoTimer)\n clearTimeout(toastTimer)\n countCtl?.abort()\n})\n\n// Ekran okuyucu duyuruları (08 §5): tek polite + tek assertive bölge.\nwatch(\n () => rowsShown.value.length,\n (n) => {\n if (!pending.value) polite.value = i18n.t('sr.loaded', { count: n })\n },\n)\nwatch(req.updatedAt, () => (polite.value = i18n.t('sr.loaded', { count: rowsShown.value.length })))\nwatch(sort, (s) => {\n const first = s[0]\n if (first)\n polite.value = i18n.t('sr.sorted', {\n column: headerOf(first.column),\n dir: i18n.t(first.dir === 'asc' ? 'sr.asc' : 'sr.desc'),\n })\n})\nwatch(req.errorKind, (k) => {\n if (k === 'error')\n assertive.value = `${i18n.t('state.errorTitle', { entity: entity.value })} ${i18n.t('state.tryAgain')}`\n})\n\n// Tek tooltip, kart kökünde: hücreler, başlıklar ve çipler (02 · Tooltip).\nconst tooltip = useDelegatedTooltip(rootEl)\n\ndefineExpose({ refresh: req.refresh, clearSelection })\n</script>\n\n<template>\n <div ref=\"rootEl\" class=\"dt dt-list\" :class=\"{ 'is-phone': phone }\" :data-density=\"density\">\n <BulkBar\n v-if=\"selectionBar === 'toolbar' && selectedRows.length && toolbar !== false\"\n variant=\"toolbar\"\n :rows=\"selectedRows\"\n :actions=\"bulkActions ?? []\"\n @clear=\"clearSelection\"\n >\n <slot v-if=\"$slots['selection-actions']\" name=\"selection-actions\" :rows=\"selectedRows\" :clear=\"clearSelection\" />\n </BulkBar>\n <Toolbar\n v-else-if=\"toolbar !== false\"\n ref=\"toolbarRef\"\n :size=\"size\"\n :search=\"hasSearch ? search : null\"\n :search-placeholder=\"searchPlaceholder\"\n :has-filter=\"hasFilter\"\n :has-display=\"hasDisplay\"\n :has-more=\"hasMore\"\n @update:search=\"setSearch\"\n >\n <template v-if=\"vw.hasViews.value && toolbar === 'auto'\" #view>\n <ViewMenu\n v-model:open=\"viewMenuOpen\"\n :sections=\"vw.sections.value\"\n :active=\"vw.active.value\"\n :edited=\"vw.edited.value\"\n :has-draft=\"vw.hasDraft\"\n :default-id=\"pref.prefs.defaultViewId\"\n :can-save=\"!!ctx.viewsAdapter\"\n :can-write=\"vw.writable(vw.active.value)\"\n :sheet=\"phone\"\n @select=\"vw.select\"\n @save-changes=\"vw.saveChanges()\"\n @save-as=\"openSaveAs()\"\n @discard=\"vw.discard()\"\n @new=\"openSaveAs()\"\n @rename=\"openRename\"\n @duplicate=\"openSaveAs\"\n @set-default=\"(id) => pref.set({ defaultViewId: id })\"\n @delete=\"(v) => (confirmDelete = v)\"\n />\n </template>\n <template #filter=\"{ iconOnly, phone: p }\">\n <button\n v-if=\"p\"\n type=\"button\"\n class=\"dt-btn dt-btn-icon dt-filter-trigger\"\n :class=\"{ 'is-active': filters.length }\"\n :aria-label=\"i18n.t('toolbar.filter')\"\n @click=\"filtersSheet?.show()\"\n >\n <PhFunnel :size=\"20\" aria-hidden=\"true\" />\n <span v-if=\"filters.length\" class=\"dt-counter\">{{ filters.length }}</span>\n </button>\n <ColumnPicker v-else v-model:open=\"pickerOpen\" :columns=\"columns\" :chips=\"chips\" @pick=\"pick\">\n <template #trigger>\n <button\n type=\"button\"\n class=\"dt-btn has-icon dt-filter-trigger\"\n :class=\"{ 'is-active': filters.length, 'dt-btn-icon': iconOnly && !filters.length }\"\n :aria-label=\"iconOnly ? i18n.t('toolbar.filter') : undefined\"\n >\n <PhFunnel :size=\"16\" aria-hidden=\"true\" />\n <span v-if=\"!iconOnly\">{{ i18n.t('toolbar.filter') }}</span>\n <span v-if=\"filters.length\" class=\"dt-counter\">{{ filters.length }}</span>\n </button>\n </template>\n </ColumnPicker>\n </template>\n <template #display=\"{ iconOnly }\">\n <DisplayPopover\n v-bind=\"displayProps\"\n :icon-only=\"iconOnly\"\n v-on=\"displayOn\"\n @update:vertical-lines=\"(on) => pref.set({ verticalLines: on })\"\n />\n </template>\n <template #more=\"{ phone: p }\">\n <PhoneMoreSheet\n v-if=\"p\"\n v-bind=\"more\"\n :density=\"density\"\n :columns=\"layout.panel.value\"\n :counts=\"layout.counts.value\"\n :sort=\"sort\"\n :persistent=\"pref.persistent\"\n :auto-refresh-on=\"autoRefreshOn\"\n v-on=\"{ ...displayOn, ...phoneSortOn }\"\n @update:auto-refresh-on=\"(v) => (autoRefreshOn = v)\"\n @refresh=\"req.refresh()\"\n @export=\"onExport\"\n @import=\"emit('import')\"\n @print=\"onPrint\"\n />\n <MoreMenu\n v-else\n v-bind=\"more\"\n :auto-refresh-on=\"autoRefreshOn\"\n @update:auto-refresh-on=\"(v) => (autoRefreshOn = v)\"\n @refresh=\"req.refresh()\"\n @export=\"onExport\"\n @import=\"emit('import')\"\n @print=\"onPrint\"\n />\n </template>\n <template v-if=\"$slots['toolbar-end']\" #end=\"{ compact }\">\n <slot name=\"toolbar-end\" :compact=\"compact\" />\n </template>\n </Toolbar>\n\n <FilterBar\n v-if=\"chips.length\"\n :chips=\"chips\"\n :defs=\"defs\"\n :editing=\"editing\"\n :rows=\"rows\"\n :labels=\"labels\"\n :summary-of=\"summaryOf\"\n :currencies-of=\"currenciesOf\"\n :phone=\"phone\"\n @open=\"(c) => filtersSheet?.show(c)\"\n @update:chip=\"updateChip\"\n @remove=\"removeChip\"\n @update:editing=\"setEditing\"\n @clear-all=\"clearFilters\"\n >\n <template #add>\n <ColumnPicker :columns=\"columns\" :chips=\"chips\" @pick=\"pick\">\n <template #trigger>\n <button type=\"button\" class=\"dt-btn dt-btn-ghost dt-btn-sm has-icon dt-filter-add dt-filter-trigger\">\n <PhPlus :size=\"14\" aria-hidden=\"true\" />\n {{ i18n.t('filter.addFilter') }}\n </button>\n </template>\n </ColumnPicker>\n </template>\n </FilterBar>\n\n <FiltersSheet\n v-if=\"phone && hasFilter\"\n ref=\"filtersSheet\"\n :columns=\"columns\"\n :chips=\"chips\"\n :sort=\"sort\"\n :rows=\"rows\"\n :labels=\"labels\"\n :summary-of=\"summaryOf\"\n :currencies-of=\"currenciesOf\"\n @apply=\"applySheet\"\n />\n\n <div v-if=\"req.errorKind.value === 'stale' && req.updatedAt.value\" class=\"dt-strip\" role=\"status\">\n <PhWarning :size=\"16\" aria-hidden=\"true\" />\n <span>{{ i18n.t('state.stale', { time: clock(req.updatedAt.value) }) }}</span>\n <button type=\"button\" class=\"dt-strip-action\" :disabled=\"pending\" @click=\"req.retry()\">\n {{ i18n.t('common.retry') }}\n </button>\n </div>\n\n <GridRoot\n ref=\"grid\"\n :layout=\"layout\"\n :rows=\"rowsShown\"\n :density=\"density\"\n :label=\"ariaLabel\"\n :loading=\"pending || !!loading\"\n :skeleton=\"skeleton\"\n :dim=\"dim\"\n :refreshing=\"refreshBar\"\n :vertical-lines=\"pref.prefs.verticalLines\"\n :row-count=\"total ?? -1\"\n :row-index-offset=\"(footerPage.number - 1) * footerPage.size\"\n :sort=\"sortMap\"\n :filtered-columns=\"filteredColumns\"\n :labels=\"labels\"\n sortable\n :selectable=\"selectable\"\n :selection=\"rowSelection\"\n :expandable=\"expandOn\"\n :expanded=\"expanded\"\n :can-expand=\"canExpandFn\"\n :row-menu=\"rowMenu\"\n :row-actions=\"rowActions\"\n :row-error=\"rowError\"\n :primary-href=\"primaryHref\"\n :primary-label=\"primaryLabel\"\n :primary-header=\"primaryDef?.header\"\n :phone=\"phone\"\n @header-filter=\"pick\"\n @row-click=\"(row, e) => onRowClick(row as Row, e)\"\n @row-open=\"(row, e) => onRowOpen(row as Row, e)\"\n @select-rows=\"selectRows\"\n @select-page=\"list.toggleAllPage\"\n @toggle-expand=\"toggleExpand\"\n @copy-id=\"(row) => copyId(row as Row)\"\n @sort=\"onSort\"\n @sort-set=\"onSortSet\"\n >\n <template v-if=\"req.stillLoading.value\" #notice>\n <PhCircleNotch :size=\"14\" class=\"dt-spin\" aria-hidden=\"true\" />\n {{ i18n.t('state.stillLoading') }}\n </template>\n <template v-if=\"bodyState\" #state>\n <StateMessage\n v-if=\"bodyState === 'error'\"\n kind=\"error\"\n :title=\"i18n.t('state.errorTitle', { entity })\"\n :lines=\"[errorInfo.message, i18n.t('state.errorKept')].filter((l): l is string => !!l)\"\n >\n <button v-if=\"listens('onRequest')\" type=\"button\" class=\"dt-btn\" :disabled=\"pending\" @click=\"req.retry()\">\n {{ i18n.t('state.tryAgain') }}\n </button>\n <template v-if=\"errorInfo.id\" #after>\n <div class=\"dt-state-id\">\n <button type=\"button\" class=\"dt-btn dt-btn-ghost dt-btn-xs\" @click=\"copyErrorId\">\n {{ i18n.t('state.copyErrorId') }}\n </button>\n <code class=\"dt-state-code\">{{ errorInfo.id }}</code>\n </div>\n </template>\n </StateMessage>\n <StateMessage\n v-else-if=\"bodyState === 'noResults'\"\n :kind=\"search ? 'noResultsSearch' : 'noResults'\"\n :title=\"noResultsTitle\"\n >\n <button v-if=\"filters.length === 1\" type=\"button\" class=\"dt-btn\" @click=\"removeChip(filters[0]!.column)\">\n {{ i18n.t('state.removeFilter', { column: headerOf(filters[0]!.column) }) }}\n </button>\n <button v-else-if=\"filters.length\" type=\"button\" class=\"dt-btn\" @click=\"clearFilters\">\n {{ i18n.t('state.clearAllFilters') }}\n </button>\n <button v-if=\"search\" type=\"button\" class=\"dt-btn\" @click=\"setSearch('')\">\n {{ i18n.t('state.clearSearch') }}\n </button>\n </StateMessage>\n <StateMessage v-else-if=\"bodyState === 'noRowsOnPage'\" kind=\"noRowsOnPage\" :title=\"i18n.t('page.noneOnPage')\">\n <button type=\"button\" class=\"dt-btn\" @click=\"goTo(page.number - 1)\">{{ i18n.t('page.previousPage') }}</button>\n </StateMessage>\n <template v-else>\n <slot name=\"empty\">\n <StateMessage kind=\"empty\" :title=\"i18n.t('state.emptyTitle', { entity })\" />\n </slot>\n </template>\n </template>\n <template v-if=\"$slots.expanded\" #expanded=\"{ row, close }\">\n <slot name=\"expanded\" :row=\"row as Row\" :close=\"close\" />\n </template>\n </GridRoot>\n <BulkBar\n v-if=\"selectionBar === 'floating' && selectedRows.length\"\n variant=\"floating\"\n :phone=\"phone\"\n :rows=\"selectedRows\"\n :actions=\"bulkActions ?? []\"\n @clear=\"clearSelection\"\n >\n <slot v-if=\"$slots['selection-actions']\" name=\"selection-actions\" :rows=\"selectedRows\" :clear=\"clearSelection\" />\n </BulkBar>\n <div\n v-if=\"toast\"\n class=\"dt-toast\"\n :class=\"{ 'is-raised': selectionBar === 'floating' && selectedRows.length }\"\n role=\"status\"\n >\n <PhCheck :size=\"16\" aria-hidden=\"true\" />\n {{ toast }}\n </div>\n\n <Footer\n :row-count=\"footerRows\"\n :page=\"footerPage\"\n :has-more=\"footerHasMore\"\n :total=\"total\"\n :countable=\"isServer && countable && listens('onCount')\"\n :counting=\"counting\"\n :counted-at=\"countedAt\"\n :busy=\"busy\"\n :first-load=\"skeleton && !hasRows\"\n :empty=\"bodyState === 'empty'\"\n :page-sizes=\"pageSizes\"\n :updated-at=\"listens('onRequest') ? req.updatedAt.value : null\"\n :freshness=\"freshness\"\n :can-refresh=\"listens('onRequest')\"\n :phone=\"phone\"\n @count=\"count\"\n @page=\"goTo\"\n @page-size=\"setPageSize\"\n @refresh=\"req.refresh()\"\n />\n <span class=\"dt-sr-only\" aria-live=\"polite\">{{ polite }}</span>\n <span class=\"dt-sr-only\" aria-live=\"assertive\">{{ assertive }}</span>\n <div\n v-show=\"tooltip.open.value\"\n class=\"dt-tip\"\n :class=\"{ 'is-multi': tooltip.text.value.includes('\\n') }\"\n role=\"tooltip\"\n :style=\"tooltip.style.value\"\n >\n {{ tooltip.text.value }}\n </div>\n <ViewDialog\n v-if=\"viewDialog\"\n v-model:open=\"viewDialogOpen\"\n :mode=\"viewDialog.mode\"\n :name=\"viewDialog.name\"\n :summary=\"viewDialog.summary\"\n :validate=\"validateViewName\"\n @save=\"onViewDialogSave\"\n />\n <ConfirmDialog\n :open=\"!!confirmDelete\"\n :title=\"i18n.t('views.delete.title', { name: confirmDelete?.name ?? '' })\"\n :body=\"i18n.t('views.delete.body')\"\n :confirm-label=\"i18n.t('views.delete')\"\n danger\n @update:open=\"(o) => !o && (confirmDelete = null)\"\n @confirm=\"removeView\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"Row extends object\">\n// DataTable (05) — Faz 2–3b: toolbar, ızgara, footer, durumlar, veri akışı (`@request`), sıralama, sayfalama, sütun yönetimi,\n// tercihler, filtreler, görünümler. Paket veri çekmez (D18): sorguyu yayar, `rows`/`hasMore`/`loading`/`error` alır.\n// Seçim ve satır menüsü Faz 4.\nimport { PhCheck, PhCircleNotch, PhFunnel, PhPlus, PhWarning } from '@phosphor-icons/vue'\nimport {\n computed,\n defineAsyncComponent,\n getCurrentInstance,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n watch,\n} from 'vue'\nimport { optionLabel } from '../core/cells/format'\nimport { RemoteLabels } from '../core/cells/remoteLabels'\nimport { TYPE_SPECS } from '../core/cells/specs'\nimport { readPath } from '../core/columns/readPath'\nimport { exportFile } from '../core/export/write'\nimport { useColumnLayout } from '../core/columns/useColumnLayout'\nimport ColumnPicker from '../core/filters/ColumnPicker.vue'\nimport FilterBar from '../core/filters/FilterBar.vue'\nimport { defaultOperator, isComplete, summarize, toCondition, type Chip, type Summary } from '../core/filters/model'\nimport { getFormat } from '../core/format'\nimport GridRoot from '../core/grid/GridRoot.vue'\nimport { useDelegatedTooltip } from '../core/grid/useDelegatedTooltip'\nimport { isTextInput } from '../core/interaction/isInteractive'\nimport { useDataTableContext } from '../core/plugin'\nimport { usePreferences } from '../core/preferences/usePreferences'\nimport StateMessage from '../core/states/StateMessage.vue'\nimport DisplayPopover from '../core/toolbar/DisplayPopover.vue'\nimport type { ColumnsDraft } from '../core/toolbar/ColumnsDialog.vue'\nimport MoreMenu from '../core/toolbar/MoreMenu.vue'\nimport Toolbar from '../core/toolbar/Toolbar.vue'\nimport ConfirmDialog from '../core/ui/ConfirmDialog.vue'\nimport { nameError, type NameError } from '../core/views/model'\nimport { useViews } from '../core/views/useViews'\nimport ViewDialog from '../core/views/ViewDialog.vue'\nimport ViewMenu from '../core/views/ViewMenu.vue'\nimport type {\n BulkAction,\n ColumnDef,\n Density,\n ExpandOptions,\n Plural,\n RowAction,\n RowClickMode,\n TableId,\n View,\n ViewPatch,\n ViewState,\n} from '../types'\nimport type {\n CountRequest,\n FilterCondition,\n QueryWithoutPage,\n SortRule,\n TableError,\n TableQuery,\n TableRequest,\n} from '../types/query'\nimport BulkBar from './BulkBar.vue'\nimport Footer from './footer/Footer.vue'\nimport { isSearchable, useListTable } from './useListTable'\nimport { useRequest } from './useRequest'\n\n// Telefon alt sayfaları yalnızca telefonda yüklenir: çekirdek paket boyutu (10 · ≤ 60 kB).\nconst FiltersSheet = defineAsyncComponent(() => import('../core/filters/FiltersSheet.vue'))\nconst PhoneMoreSheet = defineAsyncComponent(() => import('../core/toolbar/PhoneMoreSheet.vue'))\n\nconst props = withDefaults(\n defineProps<{\n tableId: TableId\n columns: Array<ColumnDef<Row>>\n rows: Row[]\n rowKey?: string\n /** Verilmezse tercihten (Display › Density), o da yoksa standard. */\n density?: Density\n entityName?: Plural\n /** Tek harfli kısayollar (/, F, R). Oklar, Enter, Space, Esc ve Alt←/→ her zaman. */\n shortcuts?: boolean\n /** client: tüm satırlar verilir, arama/sıralama/sayfalama yerelde. server: `@request` ile uygulama çeker. */\n mode?: 'client' | 'server'\n loading?: boolean\n error?: TableError\n /** Sunucu modu: sonraki sayfa var mı (Laravel `next_page_url !== null`). */\n hasMore?: boolean\n /** Biliniyorsa toplam; istemci modunda otomatik. */\n total?: number\n /** Sunucu modu: footer'da \"Count total\" → `@count`. */\n countable?: boolean\n /** Her talepte `query.fields`'e eklenecek ek alanlar. */\n fields?: string[]\n /** Yeni görünen sütunun yolu son talepte yoksa `reason: 'columns'` talebi (400 ms birleştirme). */\n requestOnColumnChange?: boolean\n /** auto: yapılandırılana göre yuvalar; minimal: yalnızca arama + `#toolbar-end`; false: toolbar yok. */\n toolbar?: 'auto' | 'minimal' | false\n searchPlaceholder?: string\n /** Varsayılan 100; tercih varsa o. */\n pageSize?: number\n pageSizes?: number[]\n /** Saniye. Verilmezse More menüsünde Auto-refresh görünmez. */\n autoRefresh?: number\n /** Kodla tanımlı görünümler (kind: 'system'); adapter'daki kişisel görünümlerle birleştirilir (04 §7). */\n views?: View[]\n /** Seçim sütunu; seçim sayfa kapsamlıdır (D19). */\n selectable?: boolean\n /** Seçim çubuğu: yüzer (varsayılan) ya da toolbar'ın yerine. */\n selectionBar?: 'floating' | 'toolbar'\n bulkActions?: Array<BulkAction<Row>>\n /** Satır menüsü (⋯, sağ tık, ⇧F10): Open / Copy yerleşik + bunlar. */\n rowActions?: Array<RowAction<Row>>\n /** Satır gövdesine tıklama (D6). Varsayılan 'none'. */\n rowClick?: RowClickMode\n expand?: boolean | ExpandOptions<Row>\n /** Satır hatası (D35): metin/metin listesi → `--dt-r-bg` + ⋯ hücresinde uyarı ikonu + satırda tooltip. Harita uygulamanın. */\n rowError?: (row: Row) => string | string[] | null | undefined\n /** More › Export (D46). Varsayılan açık; `false` gizler (ör. yetki). */\n exportable?: boolean\n }>(),\n {\n rowKey: 'id',\n shortcuts: true,\n mode: 'client',\n countable: false,\n requestOnColumnChange: true,\n toolbar: 'auto',\n pageSize: 100,\n pageSizes: () => [50, 100, 250, 500],\n views: () => [],\n selectable: false,\n selectionBar: 'floating',\n rowClick: 'none',\n expand: false,\n exportable: true,\n },\n)\nconst emit = defineEmits<{\n /** Sunucu modunda her talep; istemci modunda yalnızca `refresh()`. */\n request: [request: TableRequest]\n count: [request: CountRequest]\n /** Etkileşimli hedef, metin seçimi ve değiştirici tuş dışındaki satır tıklamaları (`rowClick`'ten bağımsız). */\n 'row-click': [payload: { row: Row; event: MouseEvent }]\n /** Birincil linke düz sol tık, satırda ↵, menüde Open, `row-click=\"open\"`. Paket preventDefault yapmaz (05 §7). */\n 'row-open': [payload: { row: Row; href: string; event: MouseEvent }]\n /** Seçim her değiştiğinde; sayfa kapsamlı yüklü satırlar (D19). */\n 'selection-change': [rows: Row[]]\n /** Dinlenirse paket dosya yazmaz (D46); `rows` paketin yazacağı satırlardır (seçim ya da sayfa). */\n export: [\n payload: {\n format: 'csv' | 'xlsx'\n query: QueryWithoutPage\n selection: Row[]\n rows: Row[]\n visibleColumns: string[]\n },\n ]\n import: []\n print: [payload: { query: QueryWithoutPage; visibleColumns: string[] }]\n 'view-change': [payload: { id: string; kind: View['kind'] }]\n}>()\ndefineSlots<{\n empty?: () => unknown\n 'toolbar-end'?: (props: { compact: boolean }) => unknown\n /** Satır detayı; veriyi slot bileşeni çeker (05 §7). */\n expanded?: (props: { row: Row; close: () => void }) => unknown\n /** bulkActions yerine özel seçim çubuğu içeriği. */\n 'selection-actions'?: (props: { rows: Row[]; clear: () => void }) => unknown\n}>()\n\nconst ctx = useDataTableContext()\nconst { i18n } = ctx\n// Toolbar yuvaları ve Retry yalnızca uygulama ilgili olayı dinliyorsa (05 §3, §10).\nconst vnodeProps = getCurrentInstance()?.vnode.props ?? {}\nconst listens = (name: string) => name in vnodeProps\nconst isServer = computed(() => props.mode === 'server')\nif (import.meta.env?.DEV && props.mode === 'server' && !listens('onRequest'))\n console.warn(`[data-table] \"${props.tableId}\": mode=\"server\" ama @request dinleyicisi yok; satırlar hiç gelmeyecek.`)\n\nconst entity = computed<Plural>(() => props.entityName ?? { one: props.tableId, other: props.tableId })\nconst ariaLabel = computed(() => entity.value.other)\n\n// Telefon düzeni (05 §11, handoff 04): kartın kendi genişliği < 640 → is-phone; Toolbar daralma eşikleri de buradan (ResizeObserver).\nconst rootEl = ref<HTMLElement | null>(null)\nconst width = ref(1440)\nconst size = computed(() => (width.value >= 1024 ? 'full' : width.value >= 640 ? 'narrow' : 'phone'))\nconst phone = computed(() => size.value === 'phone')\nlet ro: ResizeObserver | undefined\nonMounted(() => {\n const measure = () => (width.value = rootEl.value?.clientWidth || 1440)\n measure()\n if (typeof ResizeObserver !== 'undefined' && rootEl.value) {\n ro = new ResizeObserver(measure)\n ro.observe(rootEl.value)\n }\n})\n\n// Tercihler (05 §9): yoğunluk, dikey çizgiler, sayfa boyutu; adapter yoksa oturumluk.\nconst pref = usePreferences(() => props.tableId, ctx.preferences, {\n density: 'standard',\n verticalLines: false,\n pageSize: props.pageSize,\n defaultViewId: null,\n})\nconst density = computed<Density>(() => props.density ?? pref.prefs.density)\n\n// Varsayılan sütun genişlikleri 13 px yazıya göre (03); yoğunluğun hücre yazısı (--dt-fs) büyüdükçe o oranda genişler.\nconst colScale = ref(1)\nwatch(\n [density, rootEl],\n () => {\n const fs = rootEl.value ? parseFloat(getComputedStyle(rootEl.value).getPropertyValue('--dt-fs')) : NaN\n colScale.value = Number.isFinite(fs) ? fs / 13 : 1\n },\n { flush: 'post' },\n)\nconst layout = useColumnLayout<Row>({\n columns: () => props.columns,\n rows: () => props.rows,\n rowKey: () => props.rowKey,\n phone: () => phone.value,\n scale: colScale,\n})\n\n// Sorgu durumu. Arama/sıralama değişince sayfa 1 (aynı tick → tek talep).\nconst search = ref('')\nconst sort = ref<SortRule[]>([])\nconst page = ref({ number: 1, size: pref.prefs.pageSize })\nconst goTo = (number: number) => (page.value = { ...page.value, number })\nconst setSearch = (value: string) => {\n if (value === search.value) return\n search.value = value\n goTo(1)\n}\nwatch(\n () => pref.prefs.pageSize,\n (size) => (page.value = { number: 1, size }),\n)\n\n// Filtreler (04): çipler ekranda; yalnızca tam olanlar sorguya girer (D2: sütun başına tek çip).\nconst chips = ref<Chip[]>([])\nconst editing = ref<string | null>(null)\nconst pickerOpen = ref(false)\nconst labels = new RemoteLabels()\nconst fmt = getFormat(ctx.locale)\nconst defs = computed(() => new Map(props.columns.map((c) => [c.id as string, c as ColumnDef])))\nconst typeOf = (column: string) => defs.value.get(column)?.type ?? 'string'\nconst filters = computed<FilterCondition[]>(() =>\n chips.value.filter((c) => isComplete(c, typeOf(c.column))).map(toCondition),\n)\nconst filteredColumns = computed(() => new Set(filters.value.map((f) => f.column)))\nconst hasFilter = computed(\n () => props.toolbar === 'auto' && props.columns.some((c) => c.filterable ?? TYPE_SPECS[c.type].filterable),\n)\nconst labelOf = (def: ColumnDef) => (v: string | number) => {\n if (def.type === 'select' || def.type === 'multiselect' || (def.type === 'user' && def.options))\n return optionLabel(def.options, v)\n if ((def.type === 'user' || def.type === 'ajax') && def.remote) return labels.label(def.id as string, def.remote, v)\n return String(v)\n}\nconst summaryOf = (chip: Chip): Summary => {\n const def = defs.value.get(chip.column)!\n return summarize(chip, def, { i18n, fmt, labelOf: labelOf(def) })\n}\nconst currenciesOf = (def: ColumnDef): string[] => {\n if (def.type !== 'currency') return []\n if (typeof def.currency === 'string') return [def.currency]\n return [...new Set(props.rows.map((r) => (def.currency as (row: Row) => string)(r)))]\n}\n/** Picker / header: var olan çipi açar, yoksa tipin varsayılan operatörüyle oluşturup editörünü açar; boolean doğrudan uygulanır. */\nconst pick = (column: string) => {\n const def = defs.value.get(column)\n if (!def) return\n if (phone.value) {\n filtersSheet.value?.show(column)\n return\n }\n if (!chips.value.some((c) => c.column === column)) {\n const op = defaultOperator(def)\n chips.value = [...chips.value, def.type === 'boolean' ? { column, op, value: true } : { column, op }]\n if (def.type === 'boolean') return\n }\n editing.value = column\n}\nconst updateChip = (chip: Chip) => (chips.value = chips.value.map((c) => (c.column === chip.column ? chip : c)))\nconst removeChip = (column: string) => {\n chips.value = chips.value.filter((c) => c.column !== column)\n if (editing.value === column) editing.value = null\n}\n/** Editör değer seçilmeden kapanırsa çip kaldırılır (04 §1). */\nconst setEditing = (column: string | null) => {\n const prev = editing.value\n editing.value = column\n if (prev && prev !== column) {\n const c = chips.value.find((x) => x.column === prev)\n if (c && !isComplete(c, typeOf(prev))) removeChip(prev)\n }\n}\nconst clearFilters = () => {\n chips.value = []\n editing.value = null\n}\n/** Telefon Filters sayfası (04 §9): çipler ve sıralama Show results'la tek adımda uygulanır. */\nconst filtersSheet = ref<{ show: (column?: string) => void } | null>(null)\nconst applySheet = (next: Chip[], s: SortRule[]) => {\n chips.value = next\n editing.value = null\n sort.value = s\n goTo(1)\n}\n\nconst visibleColumns = computed(() => layout.columns.value.map((c) => c.id))\nconst fields = computed(() => {\n const out = new Set<string>([props.rowKey])\n for (const c of layout.columns.value) {\n if (!c.def.accessor) out.add(c.id)\n for (const f of c.def.fields ?? []) out.add(f)\n }\n for (const f of props.fields ?? []) out.add(f)\n return [...out]\n})\nconst query = computed<TableQuery>(() => ({\n search: search.value,\n filters: filters.value,\n sort: sort.value,\n page: page.value,\n columns: visibleColumns.value,\n fields: fields.value,\n}))\nconst queryWithoutPage = (): QueryWithoutPage => {\n const { search, filters, sort, columns, fields } = query.value\n return { search, filters, sort, columns, fields }\n}\n\n// Ekran okuyucu bölgeleri (08 §5); görünüm/filtre/sıralama duyuruları buraya yazar.\nconst polite = ref('')\nconst assertive = ref('')\n\n// Görünümler (04 §7, D4, D5): görünüm = filtre + sıralama + sütun düzeni; uygulama tek adımda (aynı tick) → tek talep.\nconst current = (): ViewState => ({ filters: filters.value, sort: sort.value, columns: layout.state.value })\nconst applyView = (p: ViewPatch) => {\n chips.value = (p.filters ?? []).map((f) => ({ ...f }))\n editing.value = null\n sort.value = p.sort ?? []\n layout.apply(p.columns)\n goTo(1)\n}\nconst vw = useViews({\n tableId: () => props.tableId,\n system: () => props.views,\n adapter: ctx.viewsAdapter,\n locale: () => ctx.locale,\n defaultViewId: () => pref.prefs.defaultViewId,\n setDefaultViewId: (id) => pref.set({ defaultViewId: id }),\n prefsReady: pref.ready,\n current,\n apply: applyView,\n onChange: (v) => {\n emit('view-change', { id: v.id, kind: v.kind })\n polite.value = i18n.t('sr.view', { name: v.name })\n },\n})\nconst viewMenuOpen = ref(false)\nconst viewSummary = (s: ViewState) => {\n const first = s.sort[0]\n const more = s.sort.length > 1 ? ` +${s.sort.length - 1}` : ''\n const pinned = [...s.columns.pinned.left, ...s.columns.pinned.right].map(headerOf).join(', ')\n return {\n filters: s.filters.map((f) => headerOf(f.column)).join(' · ') || i18n.t('common.empty'),\n sort: first ? `${headerOf(first.column)} ${first.dir === 'asc' ? '↑' : '↓'}${more}` : i18n.t('common.empty'),\n columns: [\n i18n.t('views.columnsSummary', { shown: s.columns.visible.length, total: props.columns.length }),\n ...(pinned ? [i18n.t('views.pinnedSummary', { name: pinned })] : []),\n ].join(' · '),\n }\n}\nconst resolveState = (v: View): ViewState => ({\n filters: v.state.filters ?? [],\n sort: v.state.sort ?? [],\n columns: layout.resolve(v.state.columns),\n})\ninterface ViewDialogState {\n mode: 'create' | 'rename'\n name: string\n state: ViewState\n summary: ReturnType<typeof viewSummary> | null\n view?: View\n /** Mevcut düzenleme yeni görünüme taşınır (Save as new / New view); Duplicate'te aktif görünümün taslağı kalır. */\n fromCurrent: boolean\n}\nconst viewDialog = ref<ViewDialogState | null>(null)\nconst viewDialogOpen = computed({\n get: () => !!viewDialog.value,\n set: (o: boolean) => {\n if (!o) viewDialog.value = null\n },\n})\nconst confirmDelete = ref<View | null>(null)\n/** Save as new view / Save as my view / New view: mevcut durum, ad boş. Duplicate: kaynağın kayıtlı durumu, \"{ad} copy\". */\nconst openSaveAs = (view?: View) => {\n const state = view ? resolveState(view) : current()\n viewDialog.value = {\n mode: 'create',\n name: view ? i18n.t('views.copyName', { name: view.name }) : '',\n state,\n summary: viewSummary(state),\n view,\n fromCurrent: !view,\n }\n}\nconst openRename = (view: View) =>\n (viewDialog.value = { mode: 'rename', name: view.name, state: current(), summary: null, view, fromCurrent: false })\nconst validateViewName = (name: string): NameError | null => {\n const d = viewDialog.value\n return nameError(name, vw.all.value, ctx.locale, d?.mode === 'rename' ? d.view?.id : undefined)\n}\nconst onViewDialogSave = (input: { name: string; makeDefault: boolean }) => {\n const d = viewDialog.value\n if (!d) return\n if (d.mode === 'rename' && d.view) void vw.rename(d.view.id, input.name)\n else\n void vw.create({\n name: input.name,\n state: d.state,\n makeDefault: input.makeDefault,\n fromCurrent: d.fromCurrent,\n })\n}\nconst removeView = () => {\n const v = confirmDelete.value\n if (v) void vw.remove(v.id)\n}\n\n// Seçim ve expand (05 §6–7): durum TanStack'te (D23); seçim sayfa kapsamlı (D19), expand anahtarla (refresh'te açık kalır).\nconst rowSelection = ref<Record<string, true>>({})\nconst expanded = ref<Record<string, boolean>>({})\nconst expandOn = computed(() => !!props.expand)\nconst canExpandFn = computed(() => (typeof props.expand === 'object' ? props.expand.canExpand : undefined))\nconst list = useListTable<Row>({\n columns: () => props.columns,\n rows: () => props.rows,\n rowKey: () => props.rowKey,\n mode: () => props.mode,\n locale: ctx.locale,\n sort,\n filters,\n page,\n search,\n hasMore: () => props.hasMore,\n selectable: () => props.selectable,\n rowSelection,\n expanded,\n canExpand: () => canExpandFn.value,\n})\nconst req = useRequest<Row>({\n mode: () => props.mode,\n hasListener: listens('onRequest'),\n query: () => query.value,\n rows: () => props.rows,\n hasMore: () => props.hasMore,\n loading: () => props.loading,\n error: () => props.error,\n requestOnColumnChange: () => props.requestOnColumnChange,\n emit: (r) => emit('request', r),\n})\n\n// Sıralama (04 §6): tık asc → desc → kapalı; ⇧ ikincil (en fazla 3); menüden yön.\nconst onSort = (id: string, additive: boolean) => {\n list.toggleSort(id, additive)\n goTo(1)\n}\nconst onSortSet = (id: string, dir: 'asc' | 'desc' | null) => {\n list.setSort(id, dir)\n goTo(1)\n}\nconst sortMap = computed(\n () => new Map(sort.value.map((s, i) => [s.column, { dir: s.dir, index: sort.value.length > 1 ? i + 1 : null }])),\n)\nconst headerOf = (id: string) => props.columns.find((c) => c.id === id)?.header ?? id\n\n// Durumlar (05 §10): üç girdi — pending/sebep, satır var mı, hata.\nconst reason = req.reason\nconst pending = req.pending\nconst rowsShown = computed<Row[]>(() => (req.errorKind.value === 'error' ? [] : list.rows.value))\nconst hasRows = computed(() => rowsShown.value.length > 0)\nconst identityChange = computed(() => pending.value && (reason.value === 'query' || reason.value === 'page'))\nconst dim = computed(() => identityChange.value && hasRows.value)\nconst slow = ref(false)\nlet slowTimer: ReturnType<typeof setTimeout> | undefined\nwatch(dim, (on) => {\n clearTimeout(slowTimer)\n slow.value = false\n if (on) slowTimer = setTimeout(() => (slow.value = true), 400)\n})\nconst skeleton = computed(\n () => (pending.value && !hasRows.value) || (!!props.loading && !hasRows.value && !props.error) || slow.value,\n)\nconst refreshing = computed(\n () =>\n (pending.value && (reason.value === 'refresh' || reason.value === 'columns')) ||\n (!!props.loading && hasRows.value && !identityChange.value),\n)\nconst refreshBar = ref(false)\nlet barTimer: ReturnType<typeof setTimeout> | undefined\nwatch(refreshing, (on) => {\n clearTimeout(barTimer)\n refreshBar.value = false\n if (on) barTimer = setTimeout(() => (refreshBar.value = true), 150)\n})\nconst busy = computed(() => identityChange.value || (skeleton.value && !hasRows.value))\nconst bodyState = computed<'error' | 'noResults' | 'noRowsOnPage' | 'empty' | null>(() => {\n if (skeleton.value || hasRows.value || pending.value) return null\n if (req.errorKind.value === 'error') return 'error'\n if (search.value || filters.value.length) return 'noResults'\n if (page.value.number > 1) return 'noRowsOnPage'\n return 'empty'\n})\nconst errorInfo = computed(() => {\n const e = props.error\n return typeof e === 'object' && e ? e : typeof e === 'string' ? { message: e } : {}\n})\nconst noResultsTitle = computed(() => {\n const count = filters.value.length\n const params = { entity: entity.value, q: search.value, count }\n if (search.value && count) return i18n.t('state.noResultsBoth', params)\n if (search.value) return i18n.t('state.noResultsSearch', params)\n return i18n.t('state.noResults', params)\n})\nconst clock = (d: Date) => d.toLocaleTimeString(ctx.locale, { hour: '2-digit', minute: '2-digit' })\n\n// Footer yalnızca snapshot'tan okur (05 §8); istemci modunda satır modeli zaten yerel.\nconst snap = req.snapshot\nconst footerRows = computed(() =>\n req.errorKind.value === 'error' ? 0 : isServer.value ? (snap.value?.rows.length ?? 0) : list.rows.value.length,\n)\nconst footerPage = computed(() => (isServer.value ? (snap.value?.page ?? page.value) : page.value))\nconst footerHasMore = computed(() => (isServer.value ? (snap.value?.hasMore ?? false) : list.canNext.value))\nconst total = computed(() => (isServer.value ? props.total : list.total.value))\n\n// Count total → @count; sonuç sorgu değişene kadar geçerli.\nlet countCtl: AbortController | null = null\nconst counting = ref(false)\nconst countedAt = ref<Date | null>(null)\nconst count = () => {\n countCtl?.abort()\n countCtl = new AbortController()\n counting.value = true\n emit('count', { query: queryWithoutPage(), signal: countCtl.signal })\n}\nwatch(\n () => props.total,\n (t) => {\n if (t === undefined) return\n counting.value = false\n countedAt.value = isServer.value ? new Date() : null\n polite.value = i18n.t('sr.total', { count: fmt.int(t), entity: entity.value })\n },\n)\nwatch(\n () => JSON.stringify([search.value, sort.value, filters.value]),\n () => {\n countCtl?.abort()\n counting.value = false\n countedAt.value = null\n },\n)\n\n// Sayfa değişince gövde başa kayar (05 §8).\nconst grid = ref<InstanceType<typeof GridRoot> | null>(null)\nwatch(\n () => page.value.number,\n () => grid.value?.scrollToTop(),\n)\nconst setPageSize = (size: number) => pref.set({ pageSize: size })\n// Her filtre değişikliğinde sayfa 1, gövde başa (04 §3); ekran okuyucuya eklenen/kaldırılan filtre (08 §5).\nwatch(\n () => JSON.stringify(filters.value),\n (now, before) => {\n goTo(1)\n grid.value?.scrollToTop()\n const prev = new Map((JSON.parse(before) as FilterCondition[]).map((f) => [f.column, JSON.stringify(f)]))\n const next = new Map((JSON.parse(now) as FilterCondition[]).map((f) => [f.column, JSON.stringify(f)]))\n for (const [column, key] of next)\n if (prev.get(column) !== key) {\n const chip = chips.value.find((c) => c.column === column)\n if (chip) {\n const sm = summaryOf(chip)\n polite.value = i18n.t('sr.filterAdded', { summary: `${headerOf(column)} ${sm.text}`.trim() })\n }\n }\n for (const column of prev.keys())\n if (!next.has(column)) polite.value = i18n.t('sr.filterRemoved', { column: headerOf(column) })\n },\n)\n\n// Auto-refresh (05 §3): açıkken footer \"Live\".\nconst autoRefreshOn = ref(false)\nlet autoTimer: ReturnType<typeof setInterval> | undefined\nwatch(autoRefreshOn, (on) => {\n clearInterval(autoTimer)\n if (on && props.autoRefresh) autoTimer = setInterval(() => req.refresh(), props.autoRefresh * 1000)\n})\nconst freshness = computed<'normal' | 'refreshing' | 'stale' | 'live'>(() =>\n autoRefreshOn.value ? 'live' : refreshing.value ? 'refreshing' : req.errorKind.value === 'stale' ? 'stale' : 'normal',\n)\n\n// Toolbar yuvaları (05 §3): yalnızca yapılandırılmış olanlar.\nconst hasSearch = computed(() => props.toolbar !== false && props.columns.some(isSearchable))\nconst hasDisplay = computed(() => props.toolbar === 'auto')\nconst more = computed(() => ({\n refresh: listens('onRequest'),\n export: props.exportable ? exportLabel.value : (false as const),\n import: listens('onImport'),\n print: listens('onPrint'),\n autoRefresh: props.autoRefresh !== undefined,\n}))\nconst hasMore = computed(() => props.toolbar === 'auto' && Object.values(more.value).some(Boolean))\nconst searchPlaceholder = computed(() => props.searchPlaceholder ?? i18n.t('toolbar.search', { entity: entity.value }))\nconst toolbarRef = ref<InstanceType<typeof Toolbar> | null>(null)\nconst displayProps = computed(() => ({\n density: density.value,\n verticalLines: pref.prefs.verticalLines,\n columns: layout.panel.value,\n counts: layout.counts.value,\n persistent: pref.persistent,\n}))\n// v-on nesnesi: anahtarlar olay adı (Vue `on` önekini kendisi ekler).\nconst displayOn = {\n 'update:density': (d: Density) => pref.set({ density: d }),\n 'columns-save': (d: ColumnsDraft) => layout.arrange(d),\n // Display › Reset: tercihler + sütun düzeni aktif görünümün kayıtlı haline; filtre ve sıralama korunur.\n reset: () => {\n pref.reset()\n layout.reset(vw.active.value?.state.columns)\n },\n}\n// Telefon ⋯ sayfasında Sort › kalır (masaüstü Display'de yok).\nconst phoneSortOn = {\n 'sort-dir': (column: string, dir: 'asc' | 'desc') => {\n sort.value = sort.value.map((s) => (s.column === column ? { column, dir } : s))\n goTo(1)\n },\n 'sort-remove': (column: string) => onSortSet(column, null),\n 'sort-clear': () => {\n sort.value = []\n goTo(1)\n },\n}\n// Export (D46): ekranda görünen sütunlar ve satırlar — seçim varsa seçili satırlar, yoksa sayfadaki satırlar.\nconst exportRowsOf = () => (list.selectedRows.value.length ? list.selectedRows.value : rowsShown.value)\nconst exportLabel = computed(() => {\n const n = list.selectedRows.value.length\n return n\n ? i18n.t('toolbar.exportSelected', { count: n })\n : i18n.t('toolbar.export', { count: rowsShown.value.length })\n})\nconst cellValue = (row: Row, def: ColumnDef<Row>) =>\n def.accessor ? def.accessor(row) : readPath(row, def.id as string)\nconst onExport = (format: 'csv' | 'xlsx') => {\n const rows = exportRowsOf()\n if (listens('onExport'))\n return emit('export', {\n format,\n query: queryWithoutPage(),\n selection: list.selectedRows.value,\n rows,\n visibleColumns: visibleColumns.value,\n })\n void exportFile({\n format,\n columns: layout.columns.value.map((c) => c.def),\n rows,\n read: cellValue,\n env: { fmt, i18n, today: new Date(), labels },\n name: entity.value.other,\n })\n}\n\n// Birincil hücre (D6): link, aria etiketleri ve Copy için metin; ⋯ sütunu birincil sütun ya da rowActions varsa.\nconst primaryDef = computed(() => props.columns.find((c) => c.primary))\nconst primaryHref = (row: Row) => primaryDef.value?.href?.(row)\nconst primaryLabel = (row: Row): string => {\n const d = primaryDef.value\n const v = d ? (d.accessor ? d.accessor(row) : readPath(row, d.id as string)) : readPath(row, props.rowKey)\n return v === null || v === undefined ? '' : String(v)\n}\nconst rowMenu = computed(() => !!props.rowActions?.length || !!primaryDef.value)\nconst selectedRows = list.selectedRows\nconst clearSelection = () => (rowSelection.value = {})\nconst selectRows = (ids: string[], value: boolean) => {\n const next = { ...rowSelection.value }\n for (const id of ids) {\n if (value) next[id] = true\n else delete next[id]\n }\n rowSelection.value = next\n}\n// Sayfa, sayfa boyutu, filtre, arama, sıralama → seçim temizlenir, açıklar kapanır (D19, 05 §7); refresh'te korunur.\nwatch(\n () => JSON.stringify([search.value, filters.value, sort.value, page.value]),\n () => {\n rowSelection.value = {}\n expanded.value = {}\n grid.value?.measure()\n },\n)\n// Yeni veride olmayan anahtarlar süzülür (05 §12).\nwatch(\n () => props.rows,\n (rows) => {\n const ids = new Set(rows.map(list.rowId))\n const keep = (o: Record<string, boolean>) => Object.fromEntries(Object.entries(o).filter(([id]) => ids.has(id)))\n if (Object.keys(rowSelection.value).some((id) => !ids.has(id)))\n rowSelection.value = keep(rowSelection.value) as Record<string, true>\n if (Object.keys(expanded.value).some((id) => !ids.has(id))) expanded.value = keep(expanded.value)\n },\n)\nwatch(selectedRows, (rows) => {\n emit('selection-change', rows)\n if (rows.length) polite.value = i18n.t('selection.selected', { count: rows.length })\n})\nconst toggleExpand = (id: string, value: boolean) => {\n const next = { ...expanded.value }\n if (value) next[id] = true\n else delete next[id]\n expanded.value = next\n if (!value) return\n void nextTick(() => {\n const row = props.rows.find((r) => list.rowId(r) === id)\n const sub = [\n ...((grid.value?.$el as HTMLElement | undefined)?.querySelectorAll<HTMLElement>('.dt-subrow') ?? []),\n ].find((el) => el.id.endsWith(`-sub-${id}`))\n if (row)\n polite.value = i18n.t('sr.expanded', {\n label: primaryLabel(row),\n count: sub ? sub.querySelectorAll('[role=\"row\"], tr').length : 0,\n })\n })\n}\n/** Satır gövdesi (D6): her zaman `row-click`; `rowClick` modu açar ya da detayı açıp kapatır. */\nconst onRowClick = (row: Row, event: MouseEvent) => {\n emit('row-click', { row, event })\n if (props.rowClick === 'open') {\n ;(event.target as Element | null)\n ?.closest('.dt-row')\n ?.querySelector<HTMLElement>('.dt-cell.is-primary a.dt-link')\n ?.click()\n } else if (props.rowClick === 'expand' && expandOn.value && (canExpandFn.value?.(row) ?? true)) {\n const id = list.rowId(row)\n toggleExpand(id, !expanded.value[id])\n }\n}\nconst onRowOpen = (row: Row, event: MouseEvent) => emit('row-open', { row, href: primaryHref(row) ?? '', event })\n// Toast: yalnızca \"Copied\" (handoff 02 §6); bulk aksiyonlar için toast uygulamanındır (D20).\nconst toast = ref<string | null>(null)\nlet toastTimer: ReturnType<typeof setTimeout> | undefined\nconst copyId = (row: Row) => {\n void navigator.clipboard?.writeText(primaryLabel(row))\n toast.value = i18n.t('cell.copied')\n clearTimeout(toastTimer)\n toastTimer = setTimeout(() => (toast.value = null), 2000)\n}\nconst onPrint = () => emit('print', { query: queryWithoutPage(), visibleColumns: visibleColumns.value })\nconst copyErrorId = () => void navigator.clipboard?.writeText(errorInfo.value.id ?? '')\n\n// Kısayollar (08 §3): `/` arama, `F` filtre, `V` görünüm, `R` yenile, `⌘S` görünümü kaydet; Alt←/→ sayfa (her zaman).\n// Kapsam sayfa; tek harfliler odak metin alanındayken kapalı.\nconst onKey = (e: KeyboardEvent) => {\n if (e.defaultPrevented) return\n const target = e.target instanceof Element ? e.target : null\n // Seçim checkbox'ları Tab durağı (D38): odakları kısayolları ve Esc'i kapatmaz.\n const typing = !!target && isTextInput(target) && !(target instanceof HTMLInputElement && target.type === 'checkbox')\n // Esc sırayla: açık popover/menü/dialog (odak içindedir) → seçim (05 §6); metin alanında aramanın Esc'i.\n if (e.key === 'Escape') {\n const inLayer = !!target?.closest('[role=\"menu\"], [role=\"dialog\"], [role=\"alertdialog\"], [role=\"listbox\"], .dt-pop')\n if (!e.defaultPrevented && !inLayer && selectedRows.value.length && !typing) clearSelection()\n return\n }\n if (e.altKey && !e.ctrlKey && !e.metaKey && (e.key === 'ArrowLeft' || e.key === 'ArrowRight')) {\n if (busy.value) return\n const next = e.key === 'ArrowLeft' ? page.value.number - 1 : page.value.number + 1\n if (next >= 1 && (e.key === 'ArrowLeft' || footerHasMore.value)) {\n e.preventDefault()\n goTo(next)\n }\n return\n }\n if ((e.metaKey || e.ctrlKey) && !e.altKey && !e.shiftKey && (e.key === 's' || e.key === 'S')) {\n if (!props.shortcuts || !vw.edited.value || !ctx.viewsAdapter || viewDialog.value) return\n e.preventDefault()\n if (vw.writable(vw.active.value)) void vw.saveChanges()\n else openSaveAs()\n return\n }\n if (!props.shortcuts || e.ctrlKey || e.metaKey || e.altKey || typing) return\n if (e.key === '/' && hasSearch.value) {\n e.preventDefault()\n toolbarRef.value?.focusSearch()\n } else if ((e.key === 'f' || e.key === 'F') && hasFilter.value) {\n e.preventDefault()\n if (phone.value) filtersSheet.value?.show()\n else pickerOpen.value = true\n } else if ((e.key === 'r' || e.key === 'R') && listens('onRequest')) {\n e.preventDefault()\n req.refresh()\n } else if ((e.key === 'v' || e.key === 'V') && vw.hasViews.value && props.toolbar === 'auto') {\n e.preventDefault()\n viewMenuOpen.value = true\n }\n}\nonMounted(() => window.addEventListener('keydown', onKey))\nonBeforeUnmount(() => {\n window.removeEventListener('keydown', onKey)\n ro?.disconnect()\n clearTimeout(slowTimer)\n clearTimeout(barTimer)\n clearInterval(autoTimer)\n clearTimeout(toastTimer)\n countCtl?.abort()\n})\n\n// Ekran okuyucu duyuruları (08 §5): tek polite + tek assertive bölge.\nwatch(\n () => rowsShown.value.length,\n (n) => {\n if (!pending.value) polite.value = i18n.t('sr.loaded', { count: n })\n },\n)\nwatch(req.updatedAt, () => (polite.value = i18n.t('sr.loaded', { count: rowsShown.value.length })))\nwatch(sort, (s) => {\n const first = s[0]\n if (first)\n polite.value = i18n.t('sr.sorted', {\n column: headerOf(first.column),\n dir: i18n.t(first.dir === 'asc' ? 'sr.asc' : 'sr.desc'),\n })\n})\nwatch(req.errorKind, (k) => {\n if (k === 'error')\n assertive.value = `${i18n.t('state.errorTitle', { entity: entity.value })} ${i18n.t('state.tryAgain')}`\n})\n\n// Tek tooltip, kart kökünde: hücreler, başlıklar ve çipler (02 · Tooltip).\nconst tooltip = useDelegatedTooltip(rootEl)\n\ndefineExpose({ refresh: req.refresh, clearSelection })\n</script>\n\n<template>\n <div ref=\"rootEl\" class=\"dt dt-list\" :class=\"{ 'is-phone': phone }\" :data-density=\"density\">\n <BulkBar\n v-if=\"selectionBar === 'toolbar' && selectedRows.length && toolbar !== false\"\n variant=\"toolbar\"\n :rows=\"selectedRows\"\n :actions=\"bulkActions ?? []\"\n @clear=\"clearSelection\"\n >\n <slot v-if=\"$slots['selection-actions']\" name=\"selection-actions\" :rows=\"selectedRows\" :clear=\"clearSelection\" />\n </BulkBar>\n <Toolbar\n v-else-if=\"toolbar !== false\"\n ref=\"toolbarRef\"\n :size=\"size\"\n :search=\"hasSearch ? search : null\"\n :search-placeholder=\"searchPlaceholder\"\n :has-filter=\"hasFilter\"\n :has-display=\"hasDisplay\"\n :has-more=\"hasMore\"\n @update:search=\"setSearch\"\n >\n <template v-if=\"vw.hasViews.value && toolbar === 'auto'\" #view>\n <ViewMenu\n v-model:open=\"viewMenuOpen\"\n :sections=\"vw.sections.value\"\n :active=\"vw.active.value\"\n :edited=\"vw.edited.value\"\n :has-draft=\"vw.hasDraft\"\n :default-id=\"pref.prefs.defaultViewId\"\n :can-save=\"!!ctx.viewsAdapter\"\n :can-write=\"vw.writable(vw.active.value)\"\n :sheet=\"phone\"\n @select=\"vw.select\"\n @save-changes=\"vw.saveChanges()\"\n @save-as=\"openSaveAs()\"\n @discard=\"vw.discard()\"\n @new=\"openSaveAs()\"\n @rename=\"openRename\"\n @duplicate=\"openSaveAs\"\n @set-default=\"(id) => pref.set({ defaultViewId: id })\"\n @delete=\"(v) => (confirmDelete = v)\"\n />\n </template>\n <template #filter=\"{ iconOnly, phone: p }\">\n <button\n v-if=\"p\"\n type=\"button\"\n class=\"dt-btn dt-btn-icon dt-filter-trigger\"\n :class=\"{ 'is-active': filters.length }\"\n :aria-label=\"i18n.t('toolbar.filter')\"\n @click=\"filtersSheet?.show()\"\n >\n <PhFunnel :size=\"20\" aria-hidden=\"true\" />\n <span v-if=\"filters.length\" class=\"dt-counter\">{{ filters.length }}</span>\n </button>\n <ColumnPicker v-else v-model:open=\"pickerOpen\" :columns=\"columns\" :chips=\"chips\" @pick=\"pick\">\n <template #trigger>\n <button\n type=\"button\"\n class=\"dt-btn has-icon dt-filter-trigger\"\n :class=\"{ 'is-active': filters.length, 'dt-btn-icon': iconOnly && !filters.length }\"\n :aria-label=\"iconOnly ? i18n.t('toolbar.filter') : undefined\"\n >\n <PhFunnel :size=\"16\" aria-hidden=\"true\" />\n <span v-if=\"!iconOnly\">{{ i18n.t('toolbar.filter') }}</span>\n <span v-if=\"filters.length\" class=\"dt-counter\">{{ filters.length }}</span>\n </button>\n </template>\n </ColumnPicker>\n </template>\n <template #display=\"{ iconOnly }\">\n <DisplayPopover\n v-bind=\"displayProps\"\n :icon-only=\"iconOnly\"\n v-on=\"displayOn\"\n @update:vertical-lines=\"(on) => pref.set({ verticalLines: on })\"\n />\n </template>\n <template #more=\"{ phone: p }\">\n <PhoneMoreSheet\n v-if=\"p\"\n v-bind=\"more\"\n :density=\"density\"\n :columns=\"layout.panel.value\"\n :counts=\"layout.counts.value\"\n :sort=\"sort\"\n :persistent=\"pref.persistent\"\n :auto-refresh-on=\"autoRefreshOn\"\n v-on=\"{ ...displayOn, ...phoneSortOn }\"\n @update:auto-refresh-on=\"(v) => (autoRefreshOn = v)\"\n @refresh=\"req.refresh()\"\n @export=\"onExport\"\n @import=\"emit('import')\"\n @print=\"onPrint\"\n />\n <MoreMenu\n v-else\n v-bind=\"more\"\n :auto-refresh-on=\"autoRefreshOn\"\n @update:auto-refresh-on=\"(v) => (autoRefreshOn = v)\"\n @refresh=\"req.refresh()\"\n @export=\"onExport\"\n @import=\"emit('import')\"\n @print=\"onPrint\"\n />\n </template>\n <template v-if=\"$slots['toolbar-end']\" #end=\"{ compact }\">\n <slot name=\"toolbar-end\" :compact=\"compact\" />\n </template>\n </Toolbar>\n\n <FilterBar\n v-if=\"chips.length\"\n :chips=\"chips\"\n :defs=\"defs\"\n :editing=\"editing\"\n :rows=\"rows\"\n :labels=\"labels\"\n :summary-of=\"summaryOf\"\n :currencies-of=\"currenciesOf\"\n :phone=\"phone\"\n @open=\"(c) => filtersSheet?.show(c)\"\n @update:chip=\"updateChip\"\n @remove=\"removeChip\"\n @update:editing=\"setEditing\"\n @clear-all=\"clearFilters\"\n >\n <template #add>\n <ColumnPicker :columns=\"columns\" :chips=\"chips\" @pick=\"pick\">\n <template #trigger>\n <button type=\"button\" class=\"dt-btn dt-btn-ghost dt-btn-sm has-icon dt-filter-add dt-filter-trigger\">\n <PhPlus :size=\"14\" aria-hidden=\"true\" />\n {{ i18n.t('filter.addFilter') }}\n </button>\n </template>\n </ColumnPicker>\n </template>\n </FilterBar>\n\n <FiltersSheet\n v-if=\"phone && hasFilter\"\n ref=\"filtersSheet\"\n :columns=\"columns\"\n :chips=\"chips\"\n :sort=\"sort\"\n :rows=\"rows\"\n :labels=\"labels\"\n :summary-of=\"summaryOf\"\n :currencies-of=\"currenciesOf\"\n @apply=\"applySheet\"\n />\n\n <div v-if=\"req.errorKind.value === 'stale' && req.updatedAt.value\" class=\"dt-strip\" role=\"status\">\n <PhWarning :size=\"16\" aria-hidden=\"true\" />\n <span>{{ i18n.t('state.stale', { time: clock(req.updatedAt.value) }) }}</span>\n <button type=\"button\" class=\"dt-strip-action\" :disabled=\"pending\" @click=\"req.retry()\">\n {{ i18n.t('common.retry') }}\n </button>\n </div>\n\n <GridRoot\n ref=\"grid\"\n :layout=\"layout\"\n :rows=\"rowsShown\"\n :density=\"density\"\n :label=\"ariaLabel\"\n :loading=\"pending || !!loading\"\n :skeleton=\"skeleton\"\n :dim=\"dim\"\n :refreshing=\"refreshBar\"\n :vertical-lines=\"pref.prefs.verticalLines\"\n :row-count=\"total ?? -1\"\n :row-index-offset=\"(footerPage.number - 1) * footerPage.size\"\n :sort=\"sortMap\"\n :filtered-columns=\"filteredColumns\"\n :labels=\"labels\"\n sortable\n :selectable=\"selectable\"\n :selection=\"rowSelection\"\n :expandable=\"expandOn\"\n :expanded=\"expanded\"\n :can-expand=\"canExpandFn\"\n :row-menu=\"rowMenu\"\n :row-actions=\"rowActions\"\n :row-error=\"rowError\"\n :primary-href=\"primaryHref\"\n :primary-label=\"primaryLabel\"\n :primary-header=\"primaryDef?.header\"\n :phone=\"phone\"\n @header-filter=\"pick\"\n @row-click=\"(row, e) => onRowClick(row as Row, e)\"\n @row-open=\"(row, e) => onRowOpen(row as Row, e)\"\n @select-rows=\"selectRows\"\n @select-page=\"list.toggleAllPage\"\n @toggle-expand=\"toggleExpand\"\n @copy-id=\"(row) => copyId(row as Row)\"\n @sort=\"onSort\"\n @sort-set=\"onSortSet\"\n >\n <template v-if=\"req.stillLoading.value\" #notice>\n <PhCircleNotch :size=\"14\" class=\"dt-spin\" aria-hidden=\"true\" />\n {{ i18n.t('state.stillLoading') }}\n </template>\n <template v-if=\"bodyState\" #state>\n <StateMessage\n v-if=\"bodyState === 'error'\"\n kind=\"error\"\n :title=\"i18n.t('state.errorTitle', { entity })\"\n :lines=\"[errorInfo.message, i18n.t('state.errorKept')].filter((l): l is string => !!l)\"\n >\n <button v-if=\"listens('onRequest')\" type=\"button\" class=\"dt-btn\" :disabled=\"pending\" @click=\"req.retry()\">\n {{ i18n.t('state.tryAgain') }}\n </button>\n <template v-if=\"errorInfo.id\" #after>\n <div class=\"dt-state-id\">\n <button type=\"button\" class=\"dt-btn dt-btn-ghost dt-btn-xs\" @click=\"copyErrorId\">\n {{ i18n.t('state.copyErrorId') }}\n </button>\n <code class=\"dt-state-code\">{{ errorInfo.id }}</code>\n </div>\n </template>\n </StateMessage>\n <StateMessage\n v-else-if=\"bodyState === 'noResults'\"\n :kind=\"search ? 'noResultsSearch' : 'noResults'\"\n :title=\"noResultsTitle\"\n >\n <button v-if=\"filters.length === 1\" type=\"button\" class=\"dt-btn\" @click=\"removeChip(filters[0]!.column)\">\n {{ i18n.t('state.removeFilter', { column: headerOf(filters[0]!.column) }) }}\n </button>\n <button v-else-if=\"filters.length\" type=\"button\" class=\"dt-btn\" @click=\"clearFilters\">\n {{ i18n.t('state.clearAllFilters') }}\n </button>\n <button v-if=\"search\" type=\"button\" class=\"dt-btn\" @click=\"setSearch('')\">\n {{ i18n.t('state.clearSearch') }}\n </button>\n </StateMessage>\n <StateMessage v-else-if=\"bodyState === 'noRowsOnPage'\" kind=\"noRowsOnPage\" :title=\"i18n.t('page.noneOnPage')\">\n <button type=\"button\" class=\"dt-btn\" @click=\"goTo(page.number - 1)\">{{ i18n.t('page.previousPage') }}</button>\n </StateMessage>\n <template v-else>\n <slot name=\"empty\">\n <StateMessage kind=\"empty\" :title=\"i18n.t('state.emptyTitle', { entity })\" />\n </slot>\n </template>\n </template>\n <template v-if=\"$slots.expanded\" #expanded=\"{ row, close }\">\n <slot name=\"expanded\" :row=\"row as Row\" :close=\"close\" />\n </template>\n </GridRoot>\n <BulkBar\n v-if=\"selectionBar === 'floating' && selectedRows.length\"\n variant=\"floating\"\n :phone=\"phone\"\n :rows=\"selectedRows\"\n :actions=\"bulkActions ?? []\"\n @clear=\"clearSelection\"\n >\n <slot v-if=\"$slots['selection-actions']\" name=\"selection-actions\" :rows=\"selectedRows\" :clear=\"clearSelection\" />\n </BulkBar>\n <div\n v-if=\"toast\"\n class=\"dt-toast\"\n :class=\"{ 'is-raised': selectionBar === 'floating' && selectedRows.length }\"\n role=\"status\"\n >\n <PhCheck :size=\"16\" aria-hidden=\"true\" />\n {{ toast }}\n </div>\n\n <Footer\n :row-count=\"footerRows\"\n :page=\"footerPage\"\n :has-more=\"footerHasMore\"\n :total=\"total\"\n :countable=\"isServer && countable && listens('onCount')\"\n :counting=\"counting\"\n :counted-at=\"countedAt\"\n :busy=\"busy\"\n :first-load=\"skeleton && !hasRows\"\n :empty=\"bodyState === 'empty'\"\n :page-sizes=\"pageSizes\"\n :updated-at=\"listens('onRequest') ? req.updatedAt.value : null\"\n :freshness=\"freshness\"\n :can-refresh=\"listens('onRequest')\"\n :phone=\"phone\"\n @count=\"count\"\n @page=\"goTo\"\n @page-size=\"setPageSize\"\n @refresh=\"req.refresh()\"\n />\n <span class=\"dt-sr-only\" aria-live=\"polite\">{{ polite }}</span>\n <span class=\"dt-sr-only\" aria-live=\"assertive\">{{ assertive }}</span>\n <div\n v-show=\"tooltip.open.value\"\n class=\"dt-tip\"\n :class=\"{ 'is-multi': tooltip.text.value.includes('\\n') }\"\n role=\"tooltip\"\n :style=\"tooltip.style.value\"\n >\n {{ tooltip.text.value }}\n </div>\n <ViewDialog\n v-if=\"viewDialog\"\n v-model:open=\"viewDialogOpen\"\n :mode=\"viewDialog.mode\"\n :name=\"viewDialog.name\"\n :summary=\"viewDialog.summary\"\n :validate=\"validateViewName\"\n @save=\"onViewDialogSave\"\n />\n <ConfirmDialog\n :open=\"!!confirmDelete\"\n :title=\"i18n.t('views.delete.title', { name: confirmDelete?.name ?? '' })\"\n :body=\"i18n.t('views.delete.body')\"\n :confirm-label=\"i18n.t('views.delete')\"\n danger\n @update:open=\"(o) => !o && (confirmDelete = null)\"\n @confirm=\"removeView\"\n />\n </div>\n</template>\n","// Hazır adapter'lar (01 · plugin ve adapter'lar): tarayıcıda saklar; `scope` zorunlu, değişince eski veri taşınmaz.\nimport type { TableId } from '../../types/core'\nimport type { Preferences, PreferencesAdapter, View, ViewsAdapter } from '../../types/views'\n\ninterface KV {\n get: (key: string) => string | null\n set: (key: string, value: string) => void\n}\n\n/** localStorage yoksa ya da kapalıysa (gizli pencere, kota) bellek içi düşer; hata fırlatmaz. */\nfunction storage(): KV {\n try {\n const ls = globalThis.localStorage\n const probe = '__dt_probe__'\n ls.setItem(probe, '1')\n ls.removeItem(probe)\n return { get: (k) => ls.getItem(k), set: (k, v) => ls.setItem(k, v) }\n } catch {\n const mem = new Map<string, string>()\n return {\n get: (k) => mem.get(k) ?? null,\n set: (k, v) => {\n mem.set(k, v)\n },\n }\n }\n}\n\nfunction readJson<T>(kv: KV, key: string, fallback: T): T {\n const raw = kv.get(key)\n if (raw === null) return fallback\n try {\n return JSON.parse(raw) as T\n } catch {\n return fallback\n }\n}\n\nconst requireScope = (scope: unknown, fn: string): string => {\n if (typeof scope !== 'string' || scope === '')\n throw new TypeError(`${fn}: 'scope' zorunlu (uygulama/kiracı anahtarı)`)\n return scope\n}\n\nconst newId = (): string => globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2)\nconst now = (): string => new Date().toISOString()\n\nexport function createLocalStorageViews(options: { scope: string }): ViewsAdapter {\n const scope = requireScope(options?.scope, 'createLocalStorageViews')\n const kv = storage()\n const key = (tableId: TableId) => `dt:${scope}:views:${tableId}`\n const read = (tableId: TableId) => readJson<View[]>(kv, key(tableId), [])\n const write = (tableId: TableId, views: View[]) => kv.set(key(tableId), JSON.stringify(views))\n\n return {\n async list(tableId) {\n return read(tableId)\n },\n async create(tableId, input) {\n const view: View = {\n id: newId(),\n name: input.name,\n kind: 'personal',\n state: input.state,\n updatedAt: now(),\n }\n write(tableId, [...read(tableId), view])\n return view\n },\n async update(tableId, id, patch) {\n const views = read(tableId)\n const i = views.findIndex((v) => v.id === id)\n if (i < 0) throw new Error(`createLocalStorageViews: görünüm yok: ${id}`)\n const next: View = {\n ...views[i]!,\n ...(patch.name !== undefined && { name: patch.name }),\n ...(patch.state !== undefined && { state: patch.state }),\n updatedAt: now(),\n }\n views[i] = next\n write(tableId, views)\n return next\n },\n async remove(tableId, id) {\n write(\n tableId,\n read(tableId).filter((v) => v.id !== id),\n )\n },\n }\n}\n\nexport function createLocalStoragePreferences(options: { scope: string }): PreferencesAdapter {\n const scope = requireScope(options?.scope, 'createLocalStoragePreferences')\n const kv = storage()\n const key = (tableId: TableId) => `dt:${scope}:prefs:${tableId}`\n return {\n get(tableId) {\n return readJson<Partial<Preferences>>(kv, key(tableId), {})\n },\n set(tableId, prefs) {\n kv.set(key(tableId), JSON.stringify({ ...readJson<Partial<Preferences>>(kv, key(tableId), {}), ...prefs }))\n },\n }\n}\n"],"mappings":"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"}