@7pmlabs/design-system 1.0.9 → 1.0.10
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/design-system.css +1 -1
- package/dist/design-system.js +24 -16
- package/dist/design-system177.js +29 -326
- package/dist/design-system177.js.map +1 -1
- package/dist/design-system179.js +1 -1
- package/dist/design-system179.js.map +1 -1
- package/dist/design-system180.js +73 -85
- package/dist/design-system180.js.map +1 -1
- package/dist/design-system182.js +1 -1
- package/dist/design-system182.js.map +1 -1
- package/dist/design-system183.js +32 -105
- package/dist/design-system183.js.map +1 -1
- package/dist/design-system185.js +4 -5
- package/dist/design-system185.js.map +1 -1
- package/dist/design-system186.js +26 -104
- package/dist/design-system186.js.map +1 -1
- package/dist/design-system188.js +4 -5
- package/dist/design-system188.js.map +1 -1
- package/dist/design-system189.js +23 -727
- package/dist/design-system189.js.map +1 -1
- package/dist/design-system191.js +1 -1
- package/dist/design-system191.js.map +1 -1
- package/dist/design-system192.js +31 -11
- package/dist/design-system192.js.map +1 -1
- package/dist/design-system194.js +8 -0
- package/dist/design-system194.js.map +1 -0
- package/dist/design-system195.js +332 -5
- package/dist/design-system195.js.map +1 -1
- package/dist/design-system197.js +5 -46
- package/dist/design-system197.js.map +1 -1
- package/dist/design-system198.js +100 -4
- package/dist/design-system198.js.map +1 -1
- package/dist/design-system200.js +8 -0
- package/dist/design-system200.js.map +1 -0
- package/dist/design-system201.js +19 -5
- package/dist/design-system201.js.map +1 -1
- package/dist/design-system202.js +4 -119
- package/dist/design-system202.js.map +1 -1
- package/dist/design-system203.js +6 -0
- package/dist/design-system203.js.map +1 -0
- package/dist/design-system204.js +419 -5
- package/dist/design-system204.js.map +1 -1
- package/dist/design-system206.js +8 -0
- package/dist/design-system206.js.map +1 -0
- package/dist/design-system207.js +108 -5
- package/dist/design-system207.js.map +1 -1
- package/dist/design-system209.js +6 -4
- package/dist/design-system209.js.map +1 -1
- package/dist/design-system210.js +90 -154
- package/dist/design-system210.js.map +1 -1
- package/dist/design-system212.js +5 -4
- package/dist/design-system212.js.map +1 -1
- package/dist/design-system213.js +737 -7
- package/dist/design-system213.js.map +1 -1
- package/dist/design-system215.js +8 -0
- package/dist/design-system215.js.map +1 -0
- package/dist/design-system216.js +11 -5
- package/dist/design-system216.js.map +1 -1
- package/dist/design-system217.js +451 -506
- package/dist/design-system217.js.map +1 -1
- package/dist/design-system219.js +4 -5
- package/dist/design-system219.js.map +1 -1
- package/dist/design-system220.js +3 -7
- package/dist/design-system220.js.map +1 -1
- package/dist/design-system221.js +41 -369
- package/dist/design-system221.js.map +1 -1
- package/dist/design-system222.js +7 -0
- package/dist/design-system222.js.map +1 -0
- package/dist/design-system223.js +283 -6
- package/dist/design-system223.js.map +1 -1
- package/dist/design-system225.js +8 -0
- package/dist/design-system225.js.map +1 -0
- package/dist/design-system226.js +122 -0
- package/dist/design-system226.js.map +1 -0
- package/dist/design-system228.js +8 -0
- package/dist/design-system228.js.map +1 -0
- package/dist/{design-system205.js → design-system229.js} +1 -1
- package/dist/{design-system205.js.map → design-system229.js.map} +1 -1
- package/dist/design-system231.js +8 -0
- package/dist/design-system231.js.map +1 -0
- package/dist/{design-system208.js → design-system232.js} +1 -1
- package/dist/{design-system208.js.map → design-system232.js.map} +1 -1
- package/dist/design-system233.js +7 -0
- package/dist/design-system233.js.map +1 -0
- package/dist/design-system234.js +173 -0
- package/dist/design-system234.js.map +1 -0
- package/dist/design-system236.js +8 -0
- package/dist/design-system236.js.map +1 -0
- package/dist/design-system237.js +10 -0
- package/dist/design-system237.js.map +1 -0
- package/dist/{design-system214.js → design-system238.js} +2 -2
- package/dist/{design-system214.js.map → design-system238.js.map} +1 -1
- package/dist/design-system240.js +8 -0
- package/dist/design-system240.js.map +1 -0
- package/dist/design-system241.js +583 -0
- package/dist/design-system241.js.map +1 -0
- package/dist/design-system243.js +9 -0
- package/dist/design-system243.js.map +1 -0
- package/dist/design-system244.js +10 -0
- package/dist/design-system244.js.map +1 -0
- package/dist/design-system245.js +377 -0
- package/dist/design-system245.js.map +1 -0
- package/dist/design-system247.js +9 -0
- package/dist/design-system247.js.map +1 -0
- package/dist/types/components/BSkeleton/BSkeleton.spec.d.ts +1 -0
- package/dist/types/components/BSkeleton/BSkeleton.vue.d.ts +46 -0
- package/dist/types/components/BSkeleton/BSkeletonAvatar.vue.d.ts +12 -0
- package/dist/types/components/BSkeleton/BSkeletonButton.vue.d.ts +14 -0
- package/dist/types/components/BSkeleton/BSkeletonImage.vue.d.ts +7 -0
- package/dist/types/components/BSkeleton/BSkeletonInput.vue.d.ts +12 -0
- package/dist/types/components/BSkeleton/BSkeletonNode.vue.d.ts +19 -0
- package/dist/types/components/BSkeleton/index.d.ts +7 -0
- package/dist/types/components/BSkeleton/types.d.ts +20 -0
- package/dist/types/components/BSplitter/BSplitter.spec.d.ts +1 -0
- package/dist/types/components/BSplitter/BSplitter.vue.d.ts +45 -0
- package/dist/types/components/BSplitter/BSplitterPanel.vue.d.ts +40 -0
- package/dist/types/components/BSplitter/index.d.ts +3 -0
- package/dist/types/components/BSplitter/types.d.ts +42 -0
- package/dist/types/components/index.d.ts +2 -0
- package/package.json +1 -1
- package/dist/design-system193.js +0 -528
- package/dist/design-system193.js.map +0 -1
- package/dist/design-system196.js +0 -6
- package/dist/design-system196.js.map +0 -1
- package/dist/design-system199.js +0 -286
- package/dist/design-system199.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-system213.js","names":[],"sources":["../src/components/BTour/types.ts"],"sourcesContent":["import type { InjectionKey } from 'vue';\n\n// ─────────────────────────────────────────────\n// Enums\n// ─────────────────────────────────────────────\n\nexport enum BTourPlacement {\n Center = 'center',\n Top = 'top',\n TopLeft = 'topLeft',\n TopRight = 'topRight',\n Bottom = 'bottom',\n BottomLeft = 'bottomLeft',\n BottomRight = 'bottomRight',\n Left = 'left',\n LeftTop = 'leftTop',\n LeftBottom = 'leftBottom',\n Right = 'right',\n RightTop = 'rightTop',\n RightBottom = 'rightBottom',\n}\n\nexport enum BTourType {\n Default = 'default',\n Primary = 'primary',\n}\n\n// ─────────────────────────────────────────────\n// Interfaces\n// ─────────────────────────────────────────────\n\nexport interface BTourArrowOptions {\n /** Point the arrow at the center of the target element. */\n pointAtCenter?: boolean;\n}\n\nexport interface BTourGapOptions {\n /** Pixel offset between the highlight box and the target element. */\n offset?: number | [number, number];\n /** Border-radius of the highlight box (px). */\n radius?: number;\n}\n\nexport interface BTourButtonProps {\n children?: string;\n onClick?: () => void;\n className?: string;\n style?: Record<string, string>;\n}\n\nexport interface BTourScrollIntoViewOptions {\n behavior?: ScrollBehavior;\n block?: ScrollLogicalPosition;\n inline?: ScrollLogicalPosition;\n}\n\nexport interface BTourStep {\n /** Title of the step. */\n title: string;\n /** Description text for the step. */\n description?: string;\n /** Cover image or video URL shown above title, or arbitrary HTML. */\n cover?: string;\n /**\n * CSS selector string, HTMLElement reference, or getter function\n * returning an element. Passing `null` centers the tour popup.\n */\n target?: string | HTMLElement | (() => HTMLElement | null) | null;\n /** Arrow configuration for this step (overrides Tour-level). */\n arrow?: boolean | BTourArrowOptions;\n /** Placement for this step (overrides Tour-level). */\n placement?: `${BTourPlacement}`;\n /** Mask configuration for this step (overrides Tour-level). */\n mask?: boolean | { style?: Record<string, string>; color?: string };\n /** Type variant for this step (overrides Tour-level). */\n type?: `${BTourType}`;\n /** Custom next-button props. */\n nextButtonProps?: BTourButtonProps;\n /** Custom prev-button props. */\n prevButtonProps?: BTourButtonProps;\n /** Custom close icon for this step. */\n closeIcon?: boolean | string;\n /** Scroll-into-view options for this step. */\n scrollIntoViewOptions?: boolean | BTourScrollIntoViewOptions;\n /** Fired when this step's close button is clicked. */\n onClose?: () => void;\n}\n\n// ─────────────────────────────────────────────\n// Internal computed step (resolved)\n// ─────────────────────────────────────────────\n\nexport interface BTourResolvedStep extends BTourStep {\n resolvedTarget: HTMLElement | null;\n index: number;\n}\n\n// ─────────────────────────────────────────────\n// Injection key (unused currently - kept for extensibility)\n// ─────────────────────────────────────────────\n\nexport const BTourContextKey: InjectionKey<null> = Symbol('BTourContext');\n"],"mappings":";AAMA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,SAAA,UACA,EAAA,MAAA,OACA,EAAA,UAAA,WACA,EAAA,WAAA,YACA,EAAA,SAAA,UACA,EAAA,aAAA,cACA,EAAA,cAAA,eACA,EAAA,OAAA,QACA,EAAA,UAAA,WACA,EAAA,aAAA,cACA,EAAA,QAAA,SACA,EAAA,WAAA,YACA,EAAA,cAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,UAAA,WACA,EAAA,UAAA;KACD"}
|
|
1
|
+
{"version":3,"file":"design-system213.js","names":[],"sources":["../src/components/BTable/BTable.vue?vue&type=script&setup=true&lang.ts"],"sourcesContent":["import { defineComponent as _defineComponent } from 'vue'\nimport { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderSlot as _renderSlot, normalizeStyle as _normalizeStyle, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, normalizeClass as _normalizeClass, withModifiers as _withModifiers, vModelText as _vModelText, withDirectives as _withDirectives, mergeProps as _mergeProps, resolveDynamicComponent as _resolveDynamicComponent, createBlock as _createBlock, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode } from \"vue\"\n\nconst _hoisted_1 = [\"aria-label\", \"aria-busy\"]\nconst _hoisted_2 = {\n key: 0,\n class: \"b-table__loading-overlay\",\n role: \"status\",\n \"aria-live\": \"polite\",\n \"aria-label\": \"Loading data\"\n}\nconst _hoisted_3 = [\"aria-hidden\"]\nconst _hoisted_4 = [\"aria-hidden\", \"tabindex\"]\nconst _hoisted_5 = {\n key: 0,\n class: \"b-table__caption\"\n}\nconst _hoisted_6 = {\n key: 1,\n style: {\"width\":\"48px\"}\n}\nconst _hoisted_7 = [\"rowspan\", \"aria-label\"]\nconst _hoisted_8 = { key: 0 }\nconst _hoisted_9 = {\n key: 1,\n class: \"b-table__checkbox-wrapper\"\n}\nconst _hoisted_10 = [\"checked\", \"indeterminate\", \"aria-label\"]\nconst _hoisted_11 = [\"rowspan\"]\nconst _hoisted_12 = [\"colspan\", \"rowspan\", \"aria-sort\"]\nconst _hoisted_13 = { class: \"b-table__th-inner\" }\nconst _hoisted_14 = [\"aria-label\", \"data-sort\", \"onClick\"]\nconst _hoisted_15 = {\n class: \"b-table__sorter-inner\",\n \"aria-hidden\": \"true\"\n}\nconst _hoisted_16 = [\"aria-expanded\", \"aria-label\", \"onClick\"]\nconst _hoisted_17 = [\"aria-label\"]\nconst _hoisted_18 = {\n key: 0,\n class: \"b-table__filter-search\"\n}\nconst _hoisted_19 = [\"onUpdate:modelValue\"]\nconst _hoisted_20 = [\"aria-multiselectable\"]\nconst _hoisted_21 = [\"aria-selected\"]\nconst _hoisted_22 = { class: \"b-table__filter-item-label\" }\nconst _hoisted_23 = [\"type\", \"checked\", \"onChange\"]\nconst _hoisted_24 = { class: \"b-table__filter-actions\" }\nconst _hoisted_25 = [\"onClick\"]\nconst _hoisted_26 = [\"onClick\"]\nconst _hoisted_27 = { class: \"b-table__tbody\" }\nconst _hoisted_28 = {\n key: 0,\n class: \"b-table__tr--empty\"\n}\nconst _hoisted_29 = [\"colspan\"]\nconst _hoisted_30 = { class: \"b-table__empty\" }\nconst _hoisted_31 = { class: \"b-table__empty-text\" }\nconst _hoisted_32 = {\n key: 0,\n class: \"b-table__td b-table__td--selection\"\n}\nconst _hoisted_33 = { class: \"b-table__checkbox-wrapper\" }\nconst _hoisted_34 = [\"type\", \"checked\", \"disabled\", \"aria-label\", \"onChange\"]\nconst _hoisted_35 = {\n key: 1,\n class: \"b-table__td b-table__td--expand\"\n}\nconst _hoisted_36 = [\"aria-label\", \"aria-expanded\", \"onClick\"]\nconst _hoisted_37 = [\"title\"]\nconst _hoisted_38 = [\"colspan\"]\nconst _hoisted_39 = [\"aria-hidden\"]\nconst _hoisted_40 = [\"aria-hidden\"]\nconst _hoisted_41 = {\n key: 0,\n class: \"b-table__pagination-total\"\n}\nconst _hoisted_42 = { class: \"b-table__pagination-controls\" }\nconst _hoisted_43 = [\"disabled\"]\nconst _hoisted_44 = [\"aria-label\", \"aria-current\", \"onClick\"]\nconst _hoisted_45 = {\n key: 1,\n class: \"b-table__page-ellipsis\",\n \"aria-hidden\": \"true\"\n}\nconst _hoisted_46 = {\n key: 2,\n class: \"b-table__page-ellipsis\",\n \"aria-hidden\": \"true\"\n}\nconst _hoisted_47 = [\"disabled\"]\nconst _hoisted_48 = [\"value\"]\nconst _hoisted_49 = [\"value\"]\nconst _hoisted_50 = {\n key: 1,\n class: \"b-table__page-jump\"\n}\nconst _hoisted_51 = [\"max\"]\n\nimport type { CSSProperties } from 'vue';\nimport { computed, nextTick, onMounted, ref, watch } from 'vue';\n\nimport type {\n BTableChangeExtra,\n BTableColumnType,\n BTableExpandable,\n BTableFilterOption,\n BTableFilterState,\n BTableFilterValue,\n BTablePaginationConfig,\n BTableRowSelection,\n BTableScrollConfig,\n BTableSize,\n BTableSortOrder,\n BTableSorterResult,\n} from './types';\n\n// ─────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────\n\ninterface ColumnSortState {\n key: string | number;\n order: BTableSortOrder;\n}\n\ninterface HeaderCell {\n col: BTableColumnType<T>;\n colSpan: number;\n rowSpan: number;\n isLeaf: boolean;\n}\n\n\nexport default /*@__PURE__*/_defineComponent({\n __name: 'BTable',\n props: {\n dataSource: { default: () => ([]) },\n columns: { default: () => ([]) },\n rowKey: { type: [String, Function], default: 'key' },\n size: { default: 'default' },\n bordered: { type: Boolean, default: false },\n loading: { type: Boolean, default: false },\n showHeader: { type: Boolean, default: true },\n tableLayout: {},\n scroll: {},\n pagination: { type: [Object, Boolean], default: false },\n rowSelection: {},\n expandable: {},\n sticky: { type: [Boolean, Object], default: false },\n caption: {},\n locale: {},\n rowClassName: { type: Function },\n onRow: { type: Function },\n onHeaderRow: { type: Function },\n components: {}\n },\n emits: [\"change\", \"expandedRowsChange\", \"expand\"],\n setup(__props: any, { emit: __emit }) {\n\n\n\n// ─────────────────────────────────────────────\n// Emits\n// ─────────────────────────────────────────────\n\nconst emit = __emit;\n\n// ─────────────────────────────────────────────\n// Slots\n// ─────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n// ─────────────────────────────────────────────\n// Locale defaults\n// ─────────────────────────────────────────────\n\nconst resolvedLocale = computed(() => ({\n emptyText: __props.locale?.emptyText ?? 'No data',\n filterConfirm: __props.locale?.filterConfirm ?? 'OK',\n filterReset: __props.locale?.filterReset ?? 'Reset',\n selectAll: __props.locale?.selectAll ?? 'Select all data',\n selectInvert: __props.locale?.selectInvert ?? 'Invert current page',\n selectionAll: __props.locale?.selectionAll ?? 'Select all data',\n sortTitle: __props.locale?.sortTitle ?? 'Sort',\n expand: __props.locale?.expand ?? 'Expand row',\n collapse: __props.locale?.collapse ?? 'Collapse row',\n}));\n\n// ─────────────────────────────────────────────\n// Row-key helper\n// ─────────────────────────────────────────────\n\nfunction getRowKey(record: T, index: number): string | number {\n if (typeof __props.rowKey === 'function') return __props.rowKey(record);\n const val = record[__props.rowKey as string];\n return (val as string | number) ?? index;\n}\n\n// ─────────────────────────────────────────────\n// Nested value accessor (dot-path)\n// ─────────────────────────────────────────────\n\nfunction getValue(record: T, dataIndex?: string | string[]): unknown {\n if (!dataIndex) return undefined;\n const keys = Array.isArray(dataIndex) ? dataIndex : dataIndex.split('.');\n let cur: unknown = record;\n for (const k of keys) {\n if (cur == null || typeof cur !== 'object') return undefined;\n cur = (cur as Record<string, unknown>)[k];\n }\n return cur;\n}\n\n// ─────────────────────────────────────────────\n// Sort state\n// ─────────────────────────────────────────────\n\nconst internalSortState = ref<ColumnSortState>({ key: '', order: null });\n\nfunction columnSortKey(col: BTableColumnType<T>): string | number {\n return (\n col.key ?? (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : (col.dataIndex ?? ''))\n );\n}\n\nfunction getColumnSortOrder(col: BTableColumnType<T>): BTableSortOrder {\n if (col.sortOrder !== undefined) return col.sortOrder;\n const key = columnSortKey(col);\n if (internalSortState.value.key === key) return internalSortState.value.order;\n return col.defaultSortOrder ?? null;\n}\n\nfunction cycleSortOrder(current: BTableSortOrder, directions: BTableSortOrder[]): BTableSortOrder {\n const cycle = directions.length ? directions : ['ascend' as const, 'descend' as const, null];\n const idx = cycle.indexOf(current);\n return cycle[(idx + 1) % cycle.length] ?? null;\n}\n\nfunction handleSort(col: BTableColumnType<T>) {\n if (!col.sorter) return;\n const key = columnSortKey(col);\n const current = getColumnSortOrder(col);\n const directions = col.sortDirections ?? ['ascend', 'descend', null];\n const next = cycleSortOrder(current, directions);\n\n // Controlled sort is driven by parent via col.sortOrder\n if (col.sortOrder === undefined) {\n internalSortState.value = { key, order: next };\n }\n\n const sorterResult: BTableSorterResult<T> = {\n column: col,\n order: next,\n field: col.dataIndex,\n columnKey: key,\n };\n emit('change', currentPagination.value, currentFilters.value, sorterResult, {\n currentDataSource: processedData.value,\n action: 'sort',\n });\n}\n\n// ─────────────────────────────────────────────\n// Filter state\n// ─────────────────────────────────────────────\n\nconst internalFilters = ref<BTableFilterState>({});\nconst openFilterKey = ref<string | number | null>(null);\nconst filterSearchMap = ref<Record<string | number, string>>({});\n\nfunction getColumnFilterKey(col: BTableColumnType<T>): string | number {\n return (\n col.key ?? (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : (col.dataIndex ?? ''))\n );\n}\n\nfunction getColumnFilterValue(col: BTableColumnType<T>): BTableFilterValue | null {\n if (col.filteredValue !== undefined) return col.filteredValue;\n return internalFilters.value[getColumnFilterKey(col)] ?? col.defaultFilteredValue ?? null;\n}\n\nconst currentFilters = computed<BTableFilterState>(() => {\n const result: BTableFilterState = {};\n for (const col of flatColumns.value) {\n if (col.filters || col.filteredValue !== undefined) {\n const key = getColumnFilterKey(col);\n result[key] = getColumnFilterValue(col);\n }\n }\n return result;\n});\n\nfunction toggleFilterPanel(col: BTableColumnType<T>) {\n const key = getColumnFilterKey(col);\n openFilterKey.value = openFilterKey.value === key ? null : key;\n}\n\nfunction applyFilters(col: BTableColumnType<T>, values: BTableFilterValue) {\n const key = getColumnFilterKey(col);\n if (col.filteredValue === undefined) {\n internalFilters.value = { ...internalFilters.value, [key]: values.length ? values : null };\n }\n openFilterKey.value = null;\n\n // Reset to page 1 on filter change\n if (col.filterResetToDefaultFilteredValue !== false) {\n internalPage.value = 1;\n }\n\n emit('change', currentPagination.value, currentFilters.value, buildActiveSorter(), {\n currentDataSource: processedData.value,\n action: 'filter',\n });\n}\n\nfunction resetFilter(col: BTableColumnType<T>) {\n const key = getColumnFilterKey(col);\n const defaults = col.defaultFilteredValue ?? [];\n if (col.filteredValue === undefined) {\n internalFilters.value = { ...internalFilters.value, [key]: defaults.length ? defaults : null };\n }\n openFilterKey.value = null;\n emit('change', currentPagination.value, currentFilters.value, buildActiveSorter(), {\n currentDataSource: processedData.value,\n action: 'filter',\n });\n}\n\nfunction buildActiveSorter(): BTableSorterResult<T> {\n const sortCol = flatColumns.value.find((c) => getColumnSortOrder(c) !== null);\n if (!sortCol) return { order: null };\n return {\n column: sortCol,\n order: getColumnSortOrder(sortCol),\n field: sortCol.dataIndex,\n columnKey: columnSortKey(sortCol),\n };\n}\n\nfunction getFilteredOptions(col: BTableColumnType<T>): BTableFilterOption[] {\n const search = filterSearchMap.value[getColumnFilterKey(col)] ?? '';\n if (!search) return col.filters ?? [];\n const lc = search.toLowerCase();\n const filterFn =\n typeof col.filterSearch === 'function'\n ? col.filterSearch\n : (input: string, opt: BTableFilterOption) =>\n opt.text.toLowerCase().includes(input.toLowerCase());\n return (col.filters ?? []).filter((opt) => filterFn(lc, opt));\n}\n\n// Temp filter selections while the dropdown is open\nconst tempFilterValues = ref<Record<string | number, BTableFilterValue>>({});\n\nfunction openFilter(col: BTableColumnType<T>) {\n const key = getColumnFilterKey(col);\n tempFilterValues.value[key] = [...(getColumnFilterValue(col) ?? [])];\n toggleFilterPanel(col);\n}\n\nfunction toggleTempFilter(col: BTableColumnType<T>, value: string | number | boolean) {\n const key = getColumnFilterKey(col);\n const current = tempFilterValues.value[key] ?? [];\n if (col.filterMultiple !== false) {\n const idx = current.indexOf(value);\n tempFilterValues.value[key] =\n idx === -1 ? [...current, value] : current.filter((v) => v !== value);\n } else {\n tempFilterValues.value[key] = [value];\n }\n}\n\nfunction confirmFilter(col: BTableColumnType<T>) {\n const key = getColumnFilterKey(col);\n applyFilters(col, tempFilterValues.value[key] ?? []);\n}\n\n// ─────────────────────────────────────────────\n// Pagination state\n// ─────────────────────────────────────────────\n\nconst internalPage = ref(1);\nconst internalPageSize = ref(\n typeof __props.pagination === 'object' ? (__props.pagination.defaultPageSize ?? __props.pagination.pageSize ?? 10) : 10,\n);\n\nwatch(\n () => (typeof __props.pagination === 'object' ? __props.pagination.pageSize : undefined),\n (ps) => {\n if (ps != null) internalPageSize.value = ps;\n },\n);\n\nconst currentPage = computed(() =>\n typeof __props.pagination === 'object' && __props.pagination.current != null\n ? __props.pagination.current\n : internalPage.value,\n);\n\nconst currentPageSize = computed(() =>\n typeof __props.pagination === 'object' && __props.pagination.pageSize != null\n ? __props.pagination.pageSize\n : internalPageSize.value,\n);\n\nconst currentPagination = computed<BTablePaginationConfig>(() => ({\n current: currentPage.value,\n pageSize: currentPageSize.value,\n total: filteredData.value.length,\n}));\n\nfunction goToPage(page: number) {\n if (typeof __props.pagination === 'object' && __props.pagination.current == null) {\n internalPage.value = page;\n }\n if (typeof __props.pagination === 'object') {\n __props.pagination.onChange?.(page, currentPageSize.value);\n }\n emit(\n 'change',\n { ...currentPagination.value, current: page },\n currentFilters.value,\n buildActiveSorter(),\n {\n currentDataSource: processedData.value,\n action: 'paginate',\n },\n );\n}\n\nfunction changePageSize(size: number) {\n internalPageSize.value = size;\n internalPage.value = 1;\n if (typeof __props.pagination === 'object') {\n __props.pagination.onShowSizeChange?.(1, size);\n }\n}\n\nconst totalPages = computed(() => Math.ceil(filteredData.value.length / currentPageSize.value));\n\nconst pageSizeOptions = computed(() =>\n typeof __props.pagination === 'object' && __props.pagination.pageSizeOptions\n ? __props.pagination.pageSizeOptions.map(Number)\n : [10, 20, 50, 100],\n);\n\n// ─────────────────────────────────────────────\n// Data processing pipeline\n// ─────────────────────────────────────────────\n\nconst filteredData = computed<T[]>(() => {\n let data = [...__props.dataSource];\n\n for (const col of flatColumns.value) {\n const filterValues = getColumnFilterValue(col);\n if (!filterValues || filterValues.length === 0) continue;\n\n if (col.onFilter) {\n data = data.filter((record) =>\n (filterValues as (string | number | boolean)[]).some((v) => col.onFilter!(v, record)),\n );\n } else if (col.dataIndex) {\n data = data.filter((record) => {\n const val = getValue(record, col.dataIndex);\n return (filterValues as (string | number | boolean)[]).some(\n (v) => String(val) === String(v),\n );\n });\n }\n }\n return data;\n});\n\nconst sortedData = computed<T[]>(() => {\n const data = [...filteredData.value];\n const sortCol = flatColumns.value.find((c) => getColumnSortOrder(c) !== null);\n if (!sortCol || !sortCol.sorter) return data;\n\n const order = getColumnSortOrder(sortCol);\n if (!order) return data;\n\n if (typeof sortCol.sorter === 'function') {\n data.sort((a, b) => {\n const res = (sortCol.sorter as (a: T, b: T) => number)(a, b);\n return order === 'ascend' ? res : -res;\n });\n } else {\n // Default sort: compare string values\n data.sort((a, b) => {\n const av = String(getValue(a, sortCol.dataIndex) ?? '');\n const bv = String(getValue(b, sortCol.dataIndex) ?? '');\n return order === 'ascend' ? av.localeCompare(bv) : bv.localeCompare(av);\n });\n }\n return data;\n});\n\nconst processedData = computed<T[]>(() => {\n if (!__props.pagination) return sortedData.value;\n const start = (currentPage.value - 1) * currentPageSize.value;\n return sortedData.value.slice(start, start + currentPageSize.value);\n});\n\n// ─────────────────────────────────────────────\n// Column processing\n// ─────────────────────────────────────────────\n\n/** Flatten leaf columns (skip group columns for data rendering) */\nconst flatColumns = computed<BTableColumnType<T>[]>(() => {\n function flatten(cols: BTableColumnType<T>[]): BTableColumnType<T>[] {\n const result: BTableColumnType<T>[] = [];\n for (const col of cols) {\n if (col.children?.length) {\n result.push(...flatten(col.children));\n } else {\n result.push(col);\n }\n }\n return result;\n }\n return flatten(__props.columns);\n});\n\n/** Header rows for colspan/rowspan grouped headers */\nconst headerRows = computed<HeaderCell[][]>(() => {\n function getDepth(col: BTableColumnType<T>): number {\n if (!col.children?.length) return 1;\n return 1 + Math.max(...col.children.map(getDepth));\n }\n\n const maxDepth = Math.max(...__props.columns.map(getDepth), 1);\n\n function buildRows(\n cols: BTableColumnType<T>[],\n rows: HeaderCell[][],\n rowIdx: number,\n ) {\n for (const col of cols) {\n const isLeaf = !col.children?.length;\n const cell: HeaderCell = {\n col,\n colSpan: isLeaf ? 1 : flattenLeafCount(col),\n rowSpan: isLeaf ? maxDepth - rowIdx : 1,\n isLeaf,\n };\n if (!rows[rowIdx]) rows[rowIdx] = [];\n rows[rowIdx].push(cell);\n if (!isLeaf) {\n buildRows(col.children!, rows, rowIdx + 1);\n }\n }\n }\n\n function flattenLeafCount(col: BTableColumnType<T>): number {\n if (!col.children?.length) return 1;\n return col.children.reduce((s, c) => s + flattenLeafCount(c), 0);\n }\n\n const rows: HeaderCell[][] = [];\n buildRows(__props.columns, rows, 0);\n return rows;\n});\n\n// ─────────────────────────────────────────────\n// Row selection state\n// ─────────────────────────────────────────────\n\nconst internalSelectedKeys = ref<Set<string | number>>(\n new Set(__props.rowSelection?.defaultSelectedRowKeys ?? []),\n);\n\nconst selectedKeys = computed<Set<string | number>>(() => {\n if (__props.rowSelection?.selectedRowKeys) return new Set(__props.rowSelection.selectedRowKeys);\n return internalSelectedKeys.value;\n});\n\nconst isCheckbox = computed(() => __props.rowSelection?.type !== 'radio');\n\nconst pageRowKeys = computed(() => processedData.value.map((r, i) => getRowKey(r, i)));\n\nconst selectablePageKeys = computed(() =>\n pageRowKeys.value.filter((key, i) => {\n const checkboxProps = __props.rowSelection?.getCheckboxProps?.(processedData.value[i]);\n return !checkboxProps?.disabled;\n }),\n);\n\nconst allPageSelected = computed(\n () =>\n selectablePageKeys.value.length > 0 &&\n selectablePageKeys.value.every((k) => selectedKeys.value.has(k)),\n);\n\nconst somePageSelected = computed(\n () => !allPageSelected.value && selectablePageKeys.value.some((k) => selectedKeys.value.has(k)),\n);\n\nfunction setSelectedKeys(keys: Set<string | number>) {\n if (!__props.rowSelection?.selectedRowKeys) {\n internalSelectedKeys.value = keys;\n }\n const keyArr = [...keys];\n const rows = __props.dataSource.filter((r, i) => keys.has(getRowKey(r, i)));\n __props.rowSelection?.onChange?.(keyArr, rows);\n}\n\nfunction toggleRow(record: T, index: number, event: Event) {\n const key = getRowKey(record, index);\n const keys = new Set(selectedKeys.value);\n if (isCheckbox.value) {\n if (keys.has(key)) {\n keys.delete(key);\n __props.rowSelection?.onSelect?.(\n record,\n false,\n [...keys].map((k) => __props.dataSource.find((r, i) => getRowKey(r, i) === k)!),\n event,\n );\n } else {\n keys.add(key);\n __props.rowSelection?.onSelect?.(\n record,\n true,\n [...keys].map((k) => __props.dataSource.find((r, i) => getRowKey(r, i) === k)!),\n event,\n );\n }\n } else {\n keys.clear();\n keys.add(key);\n __props.rowSelection?.onSelect?.(record, true, [record], event);\n }\n setSelectedKeys(keys);\n}\n\n \nfunction toggleAllPage(_event: Event) {\n const keys = new Set(\n __props.rowSelection?.preserveSelectedRowKeys ? selectedKeys.value : new Set<string | number>(),\n );\n if (allPageSelected.value) {\n selectablePageKeys.value.forEach((k) => keys.delete(k));\n __props.rowSelection?.onSelectAll?.(false, [], processedData.value);\n } else {\n selectablePageKeys.value.forEach((k) => keys.add(k));\n __props.rowSelection?.onSelectAll?.(\n true,\n [...keys].map((k) => __props.dataSource.find((r, i) => getRowKey(r, i) === k)!),\n processedData.value,\n );\n }\n setSelectedKeys(keys);\n}\n\n// ─────────────────────────────────────────────\n// Expand state\n// ─────────────────────────────────────────────\n\nconst internalExpandedKeys = ref<Set<string | number>>(\n new Set(__props.expandable?.defaultExpandedRowKeys ?? []),\n);\n\nconst expandedKeys = computed<Set<string | number>>(() => {\n if (__props.expandable?.expandedRowKeys) return new Set(__props.expandable.expandedRowKeys);\n return internalExpandedKeys.value;\n});\n\n \nfunction toggleExpand(record: T, index: number, _event: MouseEvent) {\n const key = getRowKey(record, index);\n const keys = new Set(expandedKeys.value);\n const isExpanded = keys.has(key);\n if (isExpanded) {\n keys.delete(key);\n } else {\n keys.add(key);\n }\n if (!__props.expandable?.expandedRowKeys) {\n internalExpandedKeys.value = keys;\n }\n __props.expandable?.onExpand?.(!isExpanded, record);\n __props.expandable?.onExpandedRowsChange?.([...keys]);\n emit('expand', !isExpanded, record);\n emit('expandedRowsChange', [...keys]);\n}\n\nfunction isRowExpanded(record: T, index: number): boolean {\n return expandedKeys.value.has(getRowKey(record, index));\n}\n\nfunction isRowExpandable(record: T): boolean {\n if (__props.expandable?.rowExpandable) return __props.expandable.rowExpandable(record);\n const childKey = __props.expandable?.childrenColumnName ?? 'children';\n const children = (record as Record<string, unknown>)[childKey];\n return Array.isArray(children) && children.length > 0;\n}\n\n// ─────────────────────────────────────────────\n// Cell value helper\n// ─────────────────────────────────────────────\n\nfunction getCellValue(record: T, col: BTableColumnType<T>): unknown {\n return getValue(record, col.dataIndex);\n}\n\nfunction getColumnKey(col: BTableColumnType<T>, idx: number): string | number {\n return (\n col.key ?? (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : (col.dataIndex ?? idx))\n );\n}\n\n// ─────────────────────────────────────────────\n// Sticky offset\n// ─────────────────────────────────────────────\n\nconst stickyOffsetHeader = computed(() =>\n typeof __props.sticky === 'object' ? (__props.sticky.offsetHeader ?? 0) : 0,\n);\n\n// ─────────────────────────────────────────────\n// Scroll wrapper ref\n// ─────────────────────────────────────────────\n\nconst scrollRef = ref<HTMLElement | null>(null);\nconst hasHorizontalScroll = ref(false);\n\nonMounted(() => {\n checkScroll();\n});\n\nwatch(\n () => __props.columns,\n () => nextTick(checkScroll),\n);\n\nfunction checkScroll() {\n if (!scrollRef.value) return;\n hasHorizontalScroll.value = scrollRef.value.scrollWidth > scrollRef.value.clientWidth;\n}\n\n// ─────────────────────────────────────────────\n// Root class / style\n// ─────────────────────────────────────────────\n\nconst rootClasses = computed(() => [\n 'b-table',\n {\n 'b-table--bordered': __props.bordered,\n 'b-table--loading': __props.loading,\n 'b-table--small': __props.size === 'small',\n 'b-table--middle': __props.size === 'middle',\n 'b-table--sticky': __props.sticky,\n 'b-table--fixed-header': !!__props.scroll?.y,\n 'b-table--scroll-x': !!__props.scroll?.x,\n 'b-table--has-selection': !!__props.rowSelection,\n 'b-table--has-expand': !!__props.expandable,\n 'b-table--empty': processedData.value.length === 0,\n },\n]);\n\nconst tableStyle = computed<CSSProperties>(() => {\n const s: CSSProperties = {};\n if (__props.tableLayout) s.tableLayout = __props.tableLayout;\n if (__props.scroll?.x === true) s.minWidth = '100%';\n else if (__props.scroll?.x) s.width = typeof __props.scroll.x === 'number' ? `${__props.scroll.x}px` : __props.scroll.x;\n return s;\n});\n\nconst wrapperStyle = computed<CSSProperties>(() => {\n const s: CSSProperties = {};\n if (__props.scroll?.x) {\n s.overflowX = 'auto';\n }\n if (__props.scroll?.y) {\n s.overflowY = 'auto';\n s.maxHeight = typeof __props.scroll.y === 'number' ? `${__props.scroll.y}px` : __props.scroll.y;\n }\n return s;\n});\n\nconst stickyHeaderStyle = computed<CSSProperties>(() => {\n if (!__props.sticky) return {};\n return {\n position: 'sticky',\n top: stickyOffsetHeader.value ? `${stickyOffsetHeader.value}px` : '0',\n zIndex: 2,\n };\n});\n\n// ─────────────────────────────────────────────\n// Sort icon helper\n// ─────────────────────────────────────────────\n\nfunction getSortIcon(col: BTableColumnType<T>): 'asc' | 'desc' | 'none' {\n const order = getColumnSortOrder(col);\n if (order === 'ascend') return 'asc';\n if (order === 'descend') return 'desc';\n return 'none';\n}\n\n// ─────────────────────────────────────────────\n// Ellipsis helper\n// ─────────────────────────────────────────────\n\nfunction getEllipsis(col: BTableColumnType<T>): boolean {\n if (typeof col.ellipsis === 'boolean') return col.ellipsis;\n return !!col.ellipsis;\n}\n\n// ─────────────────────────────────────────────\n// Column width style\n// ─────────────────────────────────────────────\n\nfunction colWidthStyle(col: BTableColumnType<T>): CSSProperties {\n const s: CSSProperties = {};\n if (col.width != null) s.width = typeof col.width === 'number' ? `${col.width}px` : col.width;\n if (col.minWidth != null) s.minWidth = `${col.minWidth}px`;\n if (col.maxWidth != null) s.maxWidth = `${col.maxWidth}px`;\n if (col.align) s.textAlign = col.align;\n return s;\n}\n\n// ─────────────────────────────────────────────\n// Page jump (simple pagination)\n// ─────────────────────────────────────────────\n\nconst jumpInput = ref('');\nfunction handleJumpKeydown(e: KeyboardEvent) {\n if (e.key === 'Enter') {\n const p = parseInt(jumpInput.value, 10);\n if (!isNaN(p) && p >= 1 && p <= totalPages.value) {\n goToPage(p);\n }\n jumpInput.value = '';\n }\n}\n\n// ─────────────────────────────────────────────\n// Filter keyboard handler (close on Escape)\n// ─────────────────────────────────────────────\n\nfunction handleFilterKeydown(e: KeyboardEvent) {\n if (e.key === 'Escape') openFilterKey.value = null;\n}\n\n// ─────────────────────────────────────────────\n// Get cell style\n// ─────────────────────────────────────────────\n\nfunction getCellStyle(\n col: BTableColumnType<T>,\n record: T,\n rowIndex: number,\n): CSSProperties | undefined {\n if (!col.cellStyle) return undefined;\n if (typeof col.cellStyle === 'function') return col.cellStyle(record, rowIndex);\n return col.cellStyle;\n}\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass(rootClasses.value),\n role: \"region\",\n \"aria-label\": __props.caption ?? undefined,\n \"aria-busy\": __props.loading ? 'true' : undefined\n }, [\n (__props.loading)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [...(_cache[5] || (_cache[5] = [\n _createStaticVNode(\"<div class=\\\"b-table__spin\\\" aria-hidden=\\\"true\\\"><span class=\\\"b-table__spin-dot\\\"></span><span class=\\\"b-table__spin-dot\\\"></span><span class=\\\"b-table__spin-dot\\\"></span><span class=\\\"b-table__spin-dot\\\"></span></div>\", 1)\n ]))]))\n : _createCommentVNode(\"\", true),\n (_ctx.$slots.title)\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"b-table__title\",\n \"aria-hidden\": __props.loading ? 'true' : undefined,\n style: _normalizeStyle(__props.loading ? { visibility: 'hidden' } : {})\n }, [\n _renderSlot(_ctx.$slots, \"title\")\n ], 12, _hoisted_3))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"div\", {\n ref_key: \"scrollRef\",\n ref: scrollRef,\n class: \"b-table__scroll-wrapper\",\n style: _normalizeStyle([wrapperStyle.value, __props.loading ? { visibility: 'hidden' } : {}]),\n \"aria-hidden\": __props.loading ? 'true' : undefined,\n tabindex: __props.scroll?.x || __props.scroll?.y ? 0 : undefined\n }, [\n _createElementVNode(\"table\", {\n class: \"b-table__table\",\n style: _normalizeStyle(tableStyle.value),\n role: \"table\"\n }, [\n (__props.caption)\n ? (_openBlock(), _createElementBlock(\"caption\", _hoisted_5, _toDisplayString(__props.caption), 1))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"colgroup\", null, [\n (__props.rowSelection)\n ? (_openBlock(), _createElementBlock(\"col\", {\n key: 0,\n style: _normalizeStyle({\n width: __props.rowSelection.columnWidth\n ? typeof __props.rowSelection.columnWidth === 'number'\n ? `${__props.rowSelection.columnWidth}px`\n : __props.rowSelection.columnWidth\n : '48px',\n })\n }, null, 4))\n : _createCommentVNode(\"\", true),\n (__props.expandable && __props.expandable.showExpandColumn !== false)\n ? (_openBlock(), _createElementBlock(\"col\", _hoisted_6))\n : _createCommentVNode(\"\", true),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(flatColumns.value, (col, ci) => {\n return (_openBlock(), _createElementBlock(\"col\", {\n key: getColumnKey(col, ci),\n style: _normalizeStyle(colWidthStyle(col))\n }, null, 4))\n }), 128))\n ]),\n (__props.showHeader)\n ? (_openBlock(), _createElementBlock(\"thead\", {\n key: 1,\n class: \"b-table__thead\",\n style: _normalizeStyle(stickyHeaderStyle.value)\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(headerRows.value, (row, ri) => {\n return (_openBlock(), _createElementBlock(\"tr\", _mergeProps({\n key: ri,\n class: \"b-table__tr b-table__tr--header\"\n }, { ref_for: true }, __props.onHeaderRow?.(__props.columns, ri)), [\n (__props.rowSelection && ri === 0)\n ? (_openBlock(), _createElementBlock(\"th\", {\n key: 0,\n class: \"b-table__th b-table__th--selection\",\n rowspan: headerRows.value.length,\n scope: \"col\",\n \"aria-label\": resolvedLocale.value.selectAll\n }, [\n (__props.rowSelection.columnTitle)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_8, _toDisplayString(__props.rowSelection.columnTitle), 1))\n : (isCheckbox.value && !__props.rowSelection.hideSelectAll)\n ? (_openBlock(), _createElementBlock(\"label\", _hoisted_9, [\n _createElementVNode(\"input\", {\n type: \"checkbox\",\n class: \"b-table__checkbox\",\n checked: allPageSelected.value,\n indeterminate: somePageSelected.value,\n \"aria-label\": resolvedLocale.value.selectAll,\n onChange: _cache[0] || (_cache[0] = ($event: any) => (toggleAllPage($event)))\n }, null, 40, _hoisted_10),\n _createElementVNode(\"span\", {\n class: _normalizeClass([\"b-table__checkbox-inner\", {\n 'b-table__checkbox-inner--indeterminate': somePageSelected.value,\n 'b-table__checkbox-inner--checked': allPageSelected.value,\n }]),\n \"aria-hidden\": \"true\"\n }, null, 2)\n ]))\n : _createCommentVNode(\"\", true)\n ], 8, _hoisted_7))\n : _createCommentVNode(\"\", true),\n (__props.expandable && __props.expandable.showExpandColumn !== false && ri === 0)\n ? (_openBlock(), _createElementBlock(\"th\", {\n key: 1,\n class: \"b-table__th b-table__th--expand\",\n rowspan: headerRows.value.length,\n scope: \"col\",\n \"aria-hidden\": \"true\"\n }, null, 8, _hoisted_11))\n : _createCommentVNode(\"\", true),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(row, (cell) => {\n return (_openBlock(), _createElementBlock(\"th\", _mergeProps({\n key: getColumnKey(cell.col, 0),\n class: [\"b-table__th\", {\n 'b-table__th--sorted': getColumnSortOrder(cell.col) !== null,\n 'b-table__th--sortable': !!cell.col.sorter,\n 'b-table__th--filtered': (getColumnFilterValue(cell.col)?.length ?? 0) > 0,\n [`b-table__th--align-${cell.col.align ?? 'left'}`]: true,\n [cell.col.className ?? '']: !!cell.col.className,\n }],\n colspan: cell.colSpan > 1 ? cell.colSpan : undefined,\n rowspan: cell.rowSpan > 1 ? cell.rowSpan : undefined,\n style: colWidthStyle(cell.col),\n scope: \"col\",\n \"aria-sort\": \n cell.col.sorter\n ? getColumnSortOrder(cell.col) === 'ascend'\n ? 'ascending'\n : getColumnSortOrder(cell.col) === 'descend'\n ? 'descending'\n : 'none'\n : undefined\n \n }, { ref_for: true }, __props.onHeaderRow?.(__props.columns, 0)), [\n _createElementVNode(\"div\", _hoisted_13, [\n _createElementVNode(\"span\", {\n class: _normalizeClass([\"b-table__col-title\", { 'b-table__col-title--rowspan': cell.rowSpan > 1 }])\n }, _toDisplayString(cell.col.titleText ?? cell.col.title), 3),\n (cell.col.sorter && cell.isLeaf)\n ? (_openBlock(), _createElementBlock(\"button\", {\n key: 0,\n class: \"b-table__sorter\",\n type: \"button\",\n \"aria-label\": `${resolvedLocale.value.sortTitle}: ${cell.col.titleText ?? cell.col.title}`,\n \"data-sort\": getSortIcon(cell.col),\n onClick: _withModifiers(($event: any) => (handleSort(cell.col)), [\"stop\"])\n }, [\n _createElementVNode(\"span\", _hoisted_15, [\n (_openBlock(), _createElementBlock(\"svg\", {\n class: _normalizeClass([\"b-table__sort-up\", { active: getSortIcon(cell.col) === 'asc' }]),\n viewBox: \"0 0 1024 1024\",\n width: \"1em\",\n height: \"1em\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [...(_cache[6] || (_cache[6] = [\n _createElementVNode(\"path\", { d: \"M858.9 689L530.5 308.2a24 24 0 0 0-36.9 0L165.1 689c-4.7 5.2-.4 13 6.5 13h496.8c6.9 0 11.2-7.8 6.5-13z\" }, null, -1)\n ]))], 2)),\n (_openBlock(), _createElementBlock(\"svg\", {\n class: _normalizeClass([\"b-table__sort-down\", { active: getSortIcon(cell.col) === 'desc' }]),\n viewBox: \"0 0 1024 1024\",\n width: \"1em\",\n height: \"1em\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [...(_cache[7] || (_cache[7] = [\n _createElementVNode(\"path\", { d: \"M840.4 300H183.6c-19.7 0-30.7 20.8-18.5 35l328.4 380.8c9.4 10.9 27.5 10.9 37 0L858.9 335c12.2-14.2 1.2-35-18.5-35z\" }, null, -1)\n ]))], 2))\n ])\n ], 8, _hoisted_14))\n : _createCommentVNode(\"\", true),\n (cell.col.filters && cell.isLeaf)\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: _normalizeClass([\"b-table__filter-trigger\", {\n 'b-table__filter-trigger--active':\n (getColumnFilterValue(cell.col)?.length ?? 0) > 0 ||\n openFilterKey.value === getColumnFilterKey(cell.col),\n }])\n }, [\n _createElementVNode(\"button\", {\n type: \"button\",\n class: \"b-table__filter-btn\",\n \"aria-expanded\": \n openFilterKey.value === getColumnFilterKey(cell.col) ? 'true' : 'false'\n ,\n \"aria-label\": `Filter ${cell.col.titleText ?? cell.col.title}`,\n onClick: _withModifiers(($event: any) => (openFilter(cell.col)), [\"stop\"])\n }, [...(_cache[8] || (_cache[8] = [\n _createElementVNode(\"svg\", {\n viewBox: \"0 0 1024 1024\",\n width: \"1em\",\n height: \"1em\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createElementVNode(\"path\", { d: \"M880.1 154H143.9c-24.5 0-39.8 26.7-27.5 48L349 597.4V838c0 17.8 14.5 32 32.3 32h263.4c17.8 0 32.3-14.2 32.3-32V597.4L909.6 202c12.3-21.3-3-48-29.5-48z\" })\n ], -1)\n ]))], 8, _hoisted_16),\n (openFilterKey.value === getColumnFilterKey(cell.col))\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"b-table__filter-dropdown\",\n role: \"dialog\",\n \"aria-label\": `Filter ${cell.col.titleText ?? cell.col.title}`,\n onKeydown: handleFilterKeydown\n }, [\n (cell.col.filterSearch)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [\n _withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": ($event: any) => ((filterSearchMap.value[getColumnFilterKey(cell.col)]) = $event),\n type: \"search\",\n class: \"b-table__filter-search-input\",\n placeholder: \"Search...\",\n \"aria-label\": \"Search filter options\"\n }, null, 8, _hoisted_19), [\n [_vModelText, filterSearchMap.value[getColumnFilterKey(cell.col)]]\n ])\n ]))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"ul\", {\n class: \"b-table__filter-list\",\n role: \"listbox\",\n \"aria-multiselectable\": cell.col.filterMultiple !== false ? 'true' : 'false'\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(getFilteredOptions(cell.col), (opt) => {\n return (_openBlock(), _createElementBlock(\"li\", {\n key: String(opt.value),\n class: \"b-table__filter-item\",\n role: \"option\",\n \"aria-selected\": \n (tempFilterValues.value[getColumnFilterKey(cell.col)] ?? []).includes(opt.value)\n \n }, [\n _createElementVNode(\"label\", _hoisted_22, [\n _createElementVNode(\"input\", {\n type: cell.col.filterMultiple !== false ? 'checkbox' : 'radio',\n class: \"b-table__filter-item-input\",\n checked: \n (tempFilterValues.value[getColumnFilterKey(cell.col)] ?? []).includes(\n opt.value,\n )\n ,\n onChange: ($event: any) => (toggleTempFilter(cell.col, opt.value))\n }, null, 40, _hoisted_23),\n _createElementVNode(\"span\", null, _toDisplayString(opt.text), 1)\n ])\n ], 8, _hoisted_21))\n }), 128))\n ], 8, _hoisted_20),\n _createElementVNode(\"div\", _hoisted_24, [\n _createElementVNode(\"button\", {\n type: \"button\",\n class: \"b-table__filter-reset\",\n onClick: ($event: any) => (resetFilter(cell.col))\n }, _toDisplayString(resolvedLocale.value.filterReset), 9, _hoisted_25),\n _createElementVNode(\"button\", {\n type: \"button\",\n class: \"b-table__filter-confirm\",\n onClick: ($event: any) => (confirmFilter(cell.col))\n }, _toDisplayString(resolvedLocale.value.filterConfirm), 9, _hoisted_26)\n ])\n ], 40, _hoisted_17))\n : _createCommentVNode(\"\", true)\n ], 2))\n : _createCommentVNode(\"\", true)\n ])\n ], 16, _hoisted_12))\n }), 128))\n ], 16))\n }), 128))\n ], 4))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"tbody\", _hoisted_27, [\n (processedData.value.length === 0)\n ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_28, [\n _createElementVNode(\"td\", {\n class: \"b-table__td b-table__td--empty\",\n colspan: \n flatColumns.value.length +\n (__props.rowSelection ? 1 : 0) +\n (__props.expandable && __props.expandable.showExpandColumn !== false ? 1 : 0)\n \n }, [\n _renderSlot(_ctx.$slots, \"emptyText\", {}, () => [\n _createElementVNode(\"div\", _hoisted_30, [\n _cache[9] || (_cache[9] = _createStaticVNode(\"<svg class=\\\"b-table__empty-icon\\\" viewBox=\\\"0 0 64 41\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" aria-hidden=\\\"true\\\"><g transform=\\\"translate(0 1)\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\"><ellipse cx=\\\"32\\\" cy=\\\"33\\\" rx=\\\"32\\\" ry=\\\"7\\\" fill=\\\"currentColor\\\" opacity=\\\".2\\\"></ellipse><g fill-rule=\\\"nonzero\\\" stroke=\\\"currentColor\\\"><path d=\\\"M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z\\\"></path><path d=\\\"M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z\\\" fill=\\\"currentColor\\\" opacity=\\\".08\\\"></path></g></g></svg>\", 1)),\n _createElementVNode(\"p\", _hoisted_31, _toDisplayString(resolvedLocale.value.emptyText), 1)\n ])\n ])\n ], 8, _hoisted_29)\n ]))\n : _createCommentVNode(\"\", true),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(processedData.value, (record, rowIndex) => {\n return (_openBlock(), _createElementBlock(_Fragment, {\n key: getRowKey(record, rowIndex)\n }, [\n _createElementVNode(\"tr\", _mergeProps({\n class: [\"b-table__tr b-table__tr--data\", [\n __props.rowClassName?.(record, rowIndex),\n {\n 'b-table__tr--selected': selectedKeys.value.has(getRowKey(record, rowIndex)),\n 'b-table__tr--expanded': isRowExpanded(record, rowIndex),\n },\n ]]\n }, { ref_for: true }, __props.onRow?.(record, rowIndex)), [\n (__props.rowSelection)\n ? (_openBlock(), _createElementBlock(\"td\", _hoisted_32, [\n _createElementVNode(\"label\", _hoisted_33, [\n _createElementVNode(\"input\", _mergeProps({\n type: isCheckbox.value ? 'checkbox' : 'radio',\n class: \"b-table__checkbox\",\n checked: selectedKeys.value.has(getRowKey(record, rowIndex)),\n disabled: !!__props.rowSelection.getCheckboxProps?.(record)?.disabled,\n \"aria-label\": `Select row ${rowIndex + 1}`\n }, { ref_for: true }, __props.rowSelection.getCheckboxProps?.(record), {\n onChange: ($event: any) => (toggleRow(record, rowIndex, $event))\n }), null, 16, _hoisted_34),\n _createElementVNode(\"span\", {\n class: _normalizeClass([\"b-table__checkbox-inner\", {\n 'b-table__checkbox-inner--checked': selectedKeys.value.has(\n getRowKey(record, rowIndex),\n ),\n }]),\n \"aria-hidden\": \"true\"\n }, null, 2)\n ])\n ]))\n : _createCommentVNode(\"\", true),\n (__props.expandable && __props.expandable.showExpandColumn !== false)\n ? (_openBlock(), _createElementBlock(\"td\", _hoisted_35, [\n (isRowExpandable(record))\n ? (_openBlock(), _createElementBlock(\"button\", {\n key: 0,\n type: \"button\",\n class: _normalizeClass([\"b-table__expand-btn\", { 'b-table__expand-btn--expanded': isRowExpanded(record, rowIndex) }]),\n \"aria-label\": \n isRowExpanded(record, rowIndex)\n ? resolvedLocale.value.collapse\n : resolvedLocale.value.expand\n ,\n \"aria-expanded\": isRowExpanded(record, rowIndex) ? 'true' : 'false',\n onClick: ($event: any) => (toggleExpand(record, rowIndex, $event))\n }, [...(_cache[10] || (_cache[10] = [\n _createElementVNode(\"svg\", {\n class: \"b-table__expand-icon\",\n viewBox: \"0 0 1024 1024\",\n width: \"1em\",\n height: \"1em\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createElementVNode(\"path\", { d: \"M765.7 486.8L314.9 134.7A7.97 7.97 0 0 0 302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 0 0 0-50.4z\" })\n ], -1)\n ]))], 10, _hoisted_36))\n : _createCommentVNode(\"\", true)\n ]))\n : _createCommentVNode(\"\", true),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(flatColumns.value, (col, ci) => {\n return (_openBlock(), _createElementBlock(\"td\", {\n key: getColumnKey(col, ci),\n class: _normalizeClass([\"b-table__td\", {\n [`b-table__td--align-${col.align ?? 'left'}`]: true,\n 'b-table__td--ellipsis': getEllipsis(col),\n [col.className ?? '']: !!col.className,\n }]),\n style: _normalizeStyle([colWidthStyle(col), getCellStyle(col, record, rowIndex)])\n }, [\n (_ctx.$slots[String(getColumnKey(col, ci))])\n ? _renderSlot(_ctx.$slots, String(getColumnKey(col, ci)), {\n key: 0,\n value: getCellValue(record, col),\n record: record,\n index: rowIndex,\n column: col\n })\n : (col.customRender)\n ? (_openBlock(), _createBlock(_resolveDynamicComponent(\n () =>\n col.customRender!({\n value: getCellValue(record, col),\n record,\n index: rowIndex,\n column: col,\n })\n ), { key: 1 }))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n (getEllipsis(col))\n ? (_openBlock(), _createElementBlock(\"span\", {\n key: 0,\n class: \"b-table__cell-ellipsis\",\n title: \n typeof col.ellipsis === 'object' && col.ellipsis.showTitle !== false\n ? String(getCellValue(record, col) ?? '')\n : undefined\n \n }, _toDisplayString(getCellValue(record, col)), 9, _hoisted_37))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createTextVNode(_toDisplayString(getCellValue(record, col)), 1)\n ], 64))\n ], 64))\n ], 6))\n }), 128))\n ], 16),\n (__props.expandable && isRowExpanded(record, rowIndex))\n ? (_openBlock(), _createElementBlock(\"tr\", {\n class: \"b-table__tr b-table__tr--expanded-content\",\n key: `${getRowKey(record, rowIndex)}-expanded`\n }, [\n _createElementVNode(\"td\", {\n colspan: \n flatColumns.value.length +\n (__props.rowSelection ? 1 : 0) +\n (__props.expandable && __props.expandable.showExpandColumn !== false ? 1 : 0)\n ,\n class: \"b-table__td b-table__td--expanded\"\n }, [\n (__props.expandable.expandedRowRender)\n ? (_openBlock(), _createBlock(_resolveDynamicComponent(\n () =>\n __props.expandable.expandedRowRender!(\n record,\n rowIndex,\n 0,\n isRowExpanded(record, rowIndex),\n )\n ), { key: 0 }))\n : _renderSlot(_ctx.$slots, \"expandedRow\", {\n key: 1,\n record: record,\n index: rowIndex\n })\n ], 8, _hoisted_38)\n ]))\n : _createCommentVNode(\"\", true)\n ], 64))\n }), 128)),\n _renderSlot(_ctx.$slots, \"summary\", { pageData: processedData.value })\n ])\n ], 4)\n ], 12, _hoisted_4),\n (_ctx.$slots.footer)\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 2,\n class: \"b-table__footer\",\n \"aria-hidden\": __props.loading ? 'true' : undefined,\n style: _normalizeStyle(__props.loading ? { visibility: 'hidden' } : {})\n }, [\n _renderSlot(_ctx.$slots, \"footer\")\n ], 12, _hoisted_39))\n : _createCommentVNode(\"\", true),\n (__props.pagination !== false && filteredData.value.length > 0)\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 3,\n class: \"b-table__pagination\",\n role: \"navigation\",\n \"aria-label\": \"Table pagination\",\n \"aria-hidden\": __props.loading ? 'true' : undefined,\n style: _normalizeStyle(__props.loading ? { visibility: 'hidden' } : {})\n }, [\n (typeof __props.pagination === 'object' && __props.pagination.showTotal)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_41, _toDisplayString(__props.pagination.showTotal(filteredData.value.length, [\n (currentPage.value - 1) * currentPageSize.value + 1,\n Math.min(currentPage.value * currentPageSize.value, filteredData.value.length),\n ])), 1))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"div\", _hoisted_42, [\n _createElementVNode(\"button\", {\n type: \"button\",\n class: \"b-table__page-btn\",\n disabled: currentPage.value <= 1,\n \"aria-label\": 'Previous page',\n onClick: _cache[1] || (_cache[1] = ($event: any) => (goToPage(currentPage.value - 1)))\n }, [...(_cache[11] || (_cache[11] = [\n _createElementVNode(\"svg\", {\n viewBox: \"0 0 1024 1024\",\n width: \"1em\",\n height: \"1em\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createElementVNode(\"path\", { d: \"M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.96 31.96 0 0 0 0 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z\" })\n ], -1)\n ]))], 8, _hoisted_43),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(totalPages.value, (page) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: page }, [\n (\n totalPages.value <= 7 ||\n page === 1 ||\n page === totalPages.value ||\n Math.abs(page - currentPage.value) <= 1\n )\n ? (_openBlock(), _createElementBlock(\"button\", {\n key: 0,\n type: \"button\",\n class: _normalizeClass([\"b-table__page-btn\", { 'b-table__page-btn--active': page === currentPage.value }]),\n \"aria-label\": `Page ${page}`,\n \"aria-current\": page === currentPage.value ? 'page' : undefined,\n onClick: ($event: any) => (goToPage(page))\n }, _toDisplayString(page), 11, _hoisted_44))\n : (page === 2 && currentPage.value > 4)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_45, \"…\"))\n : (page === totalPages.value - 1 && currentPage.value < totalPages.value - 3)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_46, \"…\"))\n : _createCommentVNode(\"\", true)\n ], 64))\n }), 128)),\n _createElementVNode(\"button\", {\n type: \"button\",\n class: \"b-table__page-btn\",\n disabled: currentPage.value >= totalPages.value,\n \"aria-label\": 'Next page',\n onClick: _cache[2] || (_cache[2] = ($event: any) => (goToPage(currentPage.value + 1)))\n }, [...(_cache[12] || (_cache[12] = [\n _createElementVNode(\"svg\", {\n viewBox: \"0 0 1024 1024\",\n width: \"1em\",\n height: \"1em\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createElementVNode(\"path\", { d: \"M765.7 486.8L314.9 134.7A7.97 7.97 0 0 0 302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 0 0 0-50.4z\" })\n ], -1)\n ]))], 8, _hoisted_47),\n (typeof __props.pagination === 'object' && __props.pagination.showSizeChanger)\n ? (_openBlock(), _createElementBlock(\"select\", {\n key: 0,\n class: \"b-table__page-size\",\n value: currentPageSize.value,\n \"aria-label\": 'Rows per page',\n onChange: _cache[3] || (_cache[3] = ($event: any) => (changePageSize(Number(($event.target as HTMLSelectElement).value))))\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(pageSizeOptions.value, (ps) => {\n return (_openBlock(), _createElementBlock(\"option\", {\n key: ps,\n value: ps\n }, _toDisplayString(ps) + \" / page\", 9, _hoisted_49))\n }), 128))\n ], 40, _hoisted_48))\n : _createCommentVNode(\"\", true),\n (typeof __props.pagination === 'object' && __props.pagination.showQuickJumper)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_50, [\n _cache[13] || (_cache[13] = _createTextVNode(\" Go to \", -1)),\n _withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = ($event: any) => ((jumpInput).value = $event)),\n type: \"number\",\n class: \"b-table__page-jump-input\",\n min: 1,\n max: totalPages.value,\n \"aria-label\": \"Go to page\",\n onKeydown: handleJumpKeydown\n }, null, 40, _hoisted_51), [\n [_vModelText, jumpInput.value]\n ])\n ]))\n : _createCommentVNode(\"\", true)\n ])\n ], 12, _hoisted_40))\n : _createCommentVNode(\"\", true)\n ], 10, _hoisted_1))\n}\n}\n\n})"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-system215.js","names":[],"sources":["../src/components/BTable/BTable.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"T extends Record<string, unknown> = Record<string, unknown>\">\nimport type { CSSProperties } from 'vue';\nimport { computed, nextTick, onMounted, ref, watch } from 'vue';\n\nimport type {\n BTableChangeExtra,\n BTableColumnType,\n BTableExpandable,\n BTableFilterOption,\n BTableFilterState,\n BTableFilterValue,\n BTablePaginationConfig,\n BTableRowSelection,\n BTableScrollConfig,\n BTableSize,\n BTableSortOrder,\n BTableSorterResult,\n} from './types';\n\n// ─────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────\n\nconst {\n dataSource = [],\n columns = [],\n rowKey = 'key',\n size = 'default',\n bordered = false,\n loading = false,\n showHeader = true,\n tableLayout,\n scroll,\n pagination = false,\n rowSelection,\n expandable,\n sticky = false,\n caption,\n locale,\n rowClassName,\n onRow,\n onHeaderRow,\n components: _customComponents, \n} = defineProps<{\n /** Data array */\n dataSource?: T[];\n /** Column definitions */\n columns?: BTableColumnType<T>[];\n /** Unique row key - a field name string or extractor function */\n rowKey?: string | ((record: T) => string | number);\n /** Table size */\n size?: BTableSize;\n /** Show outer border and column borders */\n bordered?: boolean;\n /** Loading state */\n loading?: boolean;\n /** Show table header */\n showHeader?: boolean;\n /** Table layout algorithm */\n tableLayout?: 'auto' | 'fixed';\n /** Scroll config */\n scroll?: BTableScrollConfig;\n /** Pagination config; false to disable */\n pagination?: BTablePaginationConfig | false;\n /** Row selection config */\n rowSelection?: BTableRowSelection<T>;\n /** Expandable config */\n expandable?: BTableExpandable<T>;\n /** Make table header sticky */\n sticky?:\n | boolean\n | { offsetHeader?: number; offsetScroll?: number; getContainer?: () => HTMLElement };\n /** Table caption (accessibility) */\n caption?: string;\n /** Custom locale text */\n locale?: {\n emptyText?: string;\n filterConfirm?: string;\n filterReset?: string;\n selectAll?: string;\n selectInvert?: string;\n selectionAll?: string;\n sortTitle?: string;\n expand?: string;\n collapse?: string;\n };\n /** Custom row class name */\n rowClassName?: (record: T, index: number) => string;\n /** Custom row event handlers */\n onRow?: (record: T, index: number) => Record<string, unknown>;\n /** Custom header row event handlers */\n onHeaderRow?: (columns: BTableColumnType<T>[], index: number) => Record<string, unknown>;\n /** Override internal table elements */\n components?: {\n table?: unknown;\n header?: { wrapper?: unknown; row?: unknown; cell?: unknown };\n body?: { wrapper?: unknown; row?: unknown; cell?: unknown };\n };\n}>();\n\n// ─────────────────────────────────────────────\n// Emits\n// ─────────────────────────────────────────────\n\nconst emit = defineEmits<{\n (\n e: 'change',\n pagination: BTablePaginationConfig,\n filters: BTableFilterState,\n sorter: BTableSorterResult<T> | BTableSorterResult<T>[],\n extra: BTableChangeExtra<T>,\n ): void;\n (e: 'expandedRowsChange', expandedRows: (string | number)[]): void;\n (e: 'expand', expanded: boolean, record: T): void;\n}>();\n\n// ─────────────────────────────────────────────\n// Slots\n// ─────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ndefineSlots<Record<string, ((props: any) => unknown) | undefined>>();\n\n// ─────────────────────────────────────────────\n// Locale defaults\n// ─────────────────────────────────────────────\n\nconst resolvedLocale = computed(() => ({\n emptyText: locale?.emptyText ?? 'No data',\n filterConfirm: locale?.filterConfirm ?? 'OK',\n filterReset: locale?.filterReset ?? 'Reset',\n selectAll: locale?.selectAll ?? 'Select all data',\n selectInvert: locale?.selectInvert ?? 'Invert current page',\n selectionAll: locale?.selectionAll ?? 'Select all data',\n sortTitle: locale?.sortTitle ?? 'Sort',\n expand: locale?.expand ?? 'Expand row',\n collapse: locale?.collapse ?? 'Collapse row',\n}));\n\n// ─────────────────────────────────────────────\n// Row-key helper\n// ─────────────────────────────────────────────\n\nfunction getRowKey(record: T, index: number): string | number {\n if (typeof rowKey === 'function') return rowKey(record);\n const val = record[rowKey as string];\n return (val as string | number) ?? index;\n}\n\n// ─────────────────────────────────────────────\n// Nested value accessor (dot-path)\n// ─────────────────────────────────────────────\n\nfunction getValue(record: T, dataIndex?: string | string[]): unknown {\n if (!dataIndex) return undefined;\n const keys = Array.isArray(dataIndex) ? dataIndex : dataIndex.split('.');\n let cur: unknown = record;\n for (const k of keys) {\n if (cur == null || typeof cur !== 'object') return undefined;\n cur = (cur as Record<string, unknown>)[k];\n }\n return cur;\n}\n\n// ─────────────────────────────────────────────\n// Sort state\n// ─────────────────────────────────────────────\n\ninterface ColumnSortState {\n key: string | number;\n order: BTableSortOrder;\n}\n\nconst internalSortState = ref<ColumnSortState>({ key: '', order: null });\n\nfunction columnSortKey(col: BTableColumnType<T>): string | number {\n return (\n col.key ?? (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : (col.dataIndex ?? ''))\n );\n}\n\nfunction getColumnSortOrder(col: BTableColumnType<T>): BTableSortOrder {\n if (col.sortOrder !== undefined) return col.sortOrder;\n const key = columnSortKey(col);\n if (internalSortState.value.key === key) return internalSortState.value.order;\n return col.defaultSortOrder ?? null;\n}\n\nfunction cycleSortOrder(current: BTableSortOrder, directions: BTableSortOrder[]): BTableSortOrder {\n const cycle = directions.length ? directions : ['ascend' as const, 'descend' as const, null];\n const idx = cycle.indexOf(current);\n return cycle[(idx + 1) % cycle.length] ?? null;\n}\n\nfunction handleSort(col: BTableColumnType<T>) {\n if (!col.sorter) return;\n const key = columnSortKey(col);\n const current = getColumnSortOrder(col);\n const directions = col.sortDirections ?? ['ascend', 'descend', null];\n const next = cycleSortOrder(current, directions);\n\n // Controlled sort is driven by parent via col.sortOrder\n if (col.sortOrder === undefined) {\n internalSortState.value = { key, order: next };\n }\n\n const sorterResult: BTableSorterResult<T> = {\n column: col,\n order: next,\n field: col.dataIndex,\n columnKey: key,\n };\n emit('change', currentPagination.value, currentFilters.value, sorterResult, {\n currentDataSource: processedData.value,\n action: 'sort',\n });\n}\n\n// ─────────────────────────────────────────────\n// Filter state\n// ─────────────────────────────────────────────\n\nconst internalFilters = ref<BTableFilterState>({});\nconst openFilterKey = ref<string | number | null>(null);\nconst filterSearchMap = ref<Record<string | number, string>>({});\n\nfunction getColumnFilterKey(col: BTableColumnType<T>): string | number {\n return (\n col.key ?? (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : (col.dataIndex ?? ''))\n );\n}\n\nfunction getColumnFilterValue(col: BTableColumnType<T>): BTableFilterValue | null {\n if (col.filteredValue !== undefined) return col.filteredValue;\n return internalFilters.value[getColumnFilterKey(col)] ?? col.defaultFilteredValue ?? null;\n}\n\nconst currentFilters = computed<BTableFilterState>(() => {\n const result: BTableFilterState = {};\n for (const col of flatColumns.value) {\n if (col.filters || col.filteredValue !== undefined) {\n const key = getColumnFilterKey(col);\n result[key] = getColumnFilterValue(col);\n }\n }\n return result;\n});\n\nfunction toggleFilterPanel(col: BTableColumnType<T>) {\n const key = getColumnFilterKey(col);\n openFilterKey.value = openFilterKey.value === key ? null : key;\n}\n\nfunction applyFilters(col: BTableColumnType<T>, values: BTableFilterValue) {\n const key = getColumnFilterKey(col);\n if (col.filteredValue === undefined) {\n internalFilters.value = { ...internalFilters.value, [key]: values.length ? values : null };\n }\n openFilterKey.value = null;\n\n // Reset to page 1 on filter change\n if (col.filterResetToDefaultFilteredValue !== false) {\n internalPage.value = 1;\n }\n\n emit('change', currentPagination.value, currentFilters.value, buildActiveSorter(), {\n currentDataSource: processedData.value,\n action: 'filter',\n });\n}\n\nfunction resetFilter(col: BTableColumnType<T>) {\n const key = getColumnFilterKey(col);\n const defaults = col.defaultFilteredValue ?? [];\n if (col.filteredValue === undefined) {\n internalFilters.value = { ...internalFilters.value, [key]: defaults.length ? defaults : null };\n }\n openFilterKey.value = null;\n emit('change', currentPagination.value, currentFilters.value, buildActiveSorter(), {\n currentDataSource: processedData.value,\n action: 'filter',\n });\n}\n\nfunction buildActiveSorter(): BTableSorterResult<T> {\n const sortCol = flatColumns.value.find((c) => getColumnSortOrder(c) !== null);\n if (!sortCol) return { order: null };\n return {\n column: sortCol,\n order: getColumnSortOrder(sortCol),\n field: sortCol.dataIndex,\n columnKey: columnSortKey(sortCol),\n };\n}\n\nfunction getFilteredOptions(col: BTableColumnType<T>): BTableFilterOption[] {\n const search = filterSearchMap.value[getColumnFilterKey(col)] ?? '';\n if (!search) return col.filters ?? [];\n const lc = search.toLowerCase();\n const filterFn =\n typeof col.filterSearch === 'function'\n ? col.filterSearch\n : (input: string, opt: BTableFilterOption) =>\n opt.text.toLowerCase().includes(input.toLowerCase());\n return (col.filters ?? []).filter((opt) => filterFn(lc, opt));\n}\n\n// Temp filter selections while the dropdown is open\nconst tempFilterValues = ref<Record<string | number, BTableFilterValue>>({});\n\nfunction openFilter(col: BTableColumnType<T>) {\n const key = getColumnFilterKey(col);\n tempFilterValues.value[key] = [...(getColumnFilterValue(col) ?? [])];\n toggleFilterPanel(col);\n}\n\nfunction toggleTempFilter(col: BTableColumnType<T>, value: string | number | boolean) {\n const key = getColumnFilterKey(col);\n const current = tempFilterValues.value[key] ?? [];\n if (col.filterMultiple !== false) {\n const idx = current.indexOf(value);\n tempFilterValues.value[key] =\n idx === -1 ? [...current, value] : current.filter((v) => v !== value);\n } else {\n tempFilterValues.value[key] = [value];\n }\n}\n\nfunction confirmFilter(col: BTableColumnType<T>) {\n const key = getColumnFilterKey(col);\n applyFilters(col, tempFilterValues.value[key] ?? []);\n}\n\n// ─────────────────────────────────────────────\n// Pagination state\n// ─────────────────────────────────────────────\n\nconst internalPage = ref(1);\nconst internalPageSize = ref(\n typeof pagination === 'object' ? (pagination.defaultPageSize ?? pagination.pageSize ?? 10) : 10,\n);\n\nwatch(\n () => (typeof pagination === 'object' ? pagination.pageSize : undefined),\n (ps) => {\n if (ps != null) internalPageSize.value = ps;\n },\n);\n\nconst currentPage = computed(() =>\n typeof pagination === 'object' && pagination.current != null\n ? pagination.current\n : internalPage.value,\n);\n\nconst currentPageSize = computed(() =>\n typeof pagination === 'object' && pagination.pageSize != null\n ? pagination.pageSize\n : internalPageSize.value,\n);\n\nconst currentPagination = computed<BTablePaginationConfig>(() => ({\n current: currentPage.value,\n pageSize: currentPageSize.value,\n total: filteredData.value.length,\n}));\n\nfunction goToPage(page: number) {\n if (typeof pagination === 'object' && pagination.current == null) {\n internalPage.value = page;\n }\n if (typeof pagination === 'object') {\n pagination.onChange?.(page, currentPageSize.value);\n }\n emit(\n 'change',\n { ...currentPagination.value, current: page },\n currentFilters.value,\n buildActiveSorter(),\n {\n currentDataSource: processedData.value,\n action: 'paginate',\n },\n );\n}\n\nfunction changePageSize(size: number) {\n internalPageSize.value = size;\n internalPage.value = 1;\n if (typeof pagination === 'object') {\n pagination.onShowSizeChange?.(1, size);\n }\n}\n\nconst totalPages = computed(() => Math.ceil(filteredData.value.length / currentPageSize.value));\n\nconst pageSizeOptions = computed(() =>\n typeof pagination === 'object' && pagination.pageSizeOptions\n ? pagination.pageSizeOptions.map(Number)\n : [10, 20, 50, 100],\n);\n\n// ─────────────────────────────────────────────\n// Data processing pipeline\n// ─────────────────────────────────────────────\n\nconst filteredData = computed<T[]>(() => {\n let data = [...dataSource];\n\n for (const col of flatColumns.value) {\n const filterValues = getColumnFilterValue(col);\n if (!filterValues || filterValues.length === 0) continue;\n\n if (col.onFilter) {\n data = data.filter((record) =>\n (filterValues as (string | number | boolean)[]).some((v) => col.onFilter!(v, record)),\n );\n } else if (col.dataIndex) {\n data = data.filter((record) => {\n const val = getValue(record, col.dataIndex);\n return (filterValues as (string | number | boolean)[]).some(\n (v) => String(val) === String(v),\n );\n });\n }\n }\n return data;\n});\n\nconst sortedData = computed<T[]>(() => {\n const data = [...filteredData.value];\n const sortCol = flatColumns.value.find((c) => getColumnSortOrder(c) !== null);\n if (!sortCol || !sortCol.sorter) return data;\n\n const order = getColumnSortOrder(sortCol);\n if (!order) return data;\n\n if (typeof sortCol.sorter === 'function') {\n data.sort((a, b) => {\n const res = (sortCol.sorter as (a: T, b: T) => number)(a, b);\n return order === 'ascend' ? res : -res;\n });\n } else {\n // Default sort: compare string values\n data.sort((a, b) => {\n const av = String(getValue(a, sortCol.dataIndex) ?? '');\n const bv = String(getValue(b, sortCol.dataIndex) ?? '');\n return order === 'ascend' ? av.localeCompare(bv) : bv.localeCompare(av);\n });\n }\n return data;\n});\n\nconst processedData = computed<T[]>(() => {\n if (!pagination) return sortedData.value;\n const start = (currentPage.value - 1) * currentPageSize.value;\n return sortedData.value.slice(start, start + currentPageSize.value);\n});\n\n// ─────────────────────────────────────────────\n// Column processing\n// ─────────────────────────────────────────────\n\n/** Flatten leaf columns (skip group columns for data rendering) */\nconst flatColumns = computed<BTableColumnType<T>[]>(() => {\n function flatten(cols: BTableColumnType<T>[]): BTableColumnType<T>[] {\n const result: BTableColumnType<T>[] = [];\n for (const col of cols) {\n if (col.children?.length) {\n result.push(...flatten(col.children));\n } else {\n result.push(col);\n }\n }\n return result;\n }\n return flatten(columns);\n});\n\n/** Header rows for colspan/rowspan grouped headers */\ninterface HeaderCell {\n col: BTableColumnType<T>;\n colSpan: number;\n rowSpan: number;\n isLeaf: boolean;\n}\n\nconst headerRows = computed<HeaderCell[][]>(() => {\n function getDepth(col: BTableColumnType<T>): number {\n if (!col.children?.length) return 1;\n return 1 + Math.max(...col.children.map(getDepth));\n }\n\n const maxDepth = Math.max(...columns.map(getDepth), 1);\n\n function buildRows(\n cols: BTableColumnType<T>[],\n rows: HeaderCell[][],\n rowIdx: number,\n ) {\n for (const col of cols) {\n const isLeaf = !col.children?.length;\n const cell: HeaderCell = {\n col,\n colSpan: isLeaf ? 1 : flattenLeafCount(col),\n rowSpan: isLeaf ? maxDepth - rowIdx : 1,\n isLeaf,\n };\n if (!rows[rowIdx]) rows[rowIdx] = [];\n rows[rowIdx].push(cell);\n if (!isLeaf) {\n buildRows(col.children!, rows, rowIdx + 1);\n }\n }\n }\n\n function flattenLeafCount(col: BTableColumnType<T>): number {\n if (!col.children?.length) return 1;\n return col.children.reduce((s, c) => s + flattenLeafCount(c), 0);\n }\n\n const rows: HeaderCell[][] = [];\n buildRows(columns, rows, 0);\n return rows;\n});\n\n// ─────────────────────────────────────────────\n// Row selection state\n// ─────────────────────────────────────────────\n\nconst internalSelectedKeys = ref<Set<string | number>>(\n new Set(rowSelection?.defaultSelectedRowKeys ?? []),\n);\n\nconst selectedKeys = computed<Set<string | number>>(() => {\n if (rowSelection?.selectedRowKeys) return new Set(rowSelection.selectedRowKeys);\n return internalSelectedKeys.value;\n});\n\nconst isCheckbox = computed(() => rowSelection?.type !== 'radio');\n\nconst pageRowKeys = computed(() => processedData.value.map((r, i) => getRowKey(r, i)));\n\nconst selectablePageKeys = computed(() =>\n pageRowKeys.value.filter((key, i) => {\n const checkboxProps = rowSelection?.getCheckboxProps?.(processedData.value[i]);\n return !checkboxProps?.disabled;\n }),\n);\n\nconst allPageSelected = computed(\n () =>\n selectablePageKeys.value.length > 0 &&\n selectablePageKeys.value.every((k) => selectedKeys.value.has(k)),\n);\n\nconst somePageSelected = computed(\n () => !allPageSelected.value && selectablePageKeys.value.some((k) => selectedKeys.value.has(k)),\n);\n\nfunction setSelectedKeys(keys: Set<string | number>) {\n if (!rowSelection?.selectedRowKeys) {\n internalSelectedKeys.value = keys;\n }\n const keyArr = [...keys];\n const rows = dataSource.filter((r, i) => keys.has(getRowKey(r, i)));\n rowSelection?.onChange?.(keyArr, rows);\n}\n\nfunction toggleRow(record: T, index: number, event: Event) {\n const key = getRowKey(record, index);\n const keys = new Set(selectedKeys.value);\n if (isCheckbox.value) {\n if (keys.has(key)) {\n keys.delete(key);\n rowSelection?.onSelect?.(\n record,\n false,\n [...keys].map((k) => dataSource.find((r, i) => getRowKey(r, i) === k)!),\n event,\n );\n } else {\n keys.add(key);\n rowSelection?.onSelect?.(\n record,\n true,\n [...keys].map((k) => dataSource.find((r, i) => getRowKey(r, i) === k)!),\n event,\n );\n }\n } else {\n keys.clear();\n keys.add(key);\n rowSelection?.onSelect?.(record, true, [record], event);\n }\n setSelectedKeys(keys);\n}\n\n \nfunction toggleAllPage(_event: Event) {\n const keys = new Set(\n rowSelection?.preserveSelectedRowKeys ? selectedKeys.value : new Set<string | number>(),\n );\n if (allPageSelected.value) {\n selectablePageKeys.value.forEach((k) => keys.delete(k));\n rowSelection?.onSelectAll?.(false, [], processedData.value);\n } else {\n selectablePageKeys.value.forEach((k) => keys.add(k));\n rowSelection?.onSelectAll?.(\n true,\n [...keys].map((k) => dataSource.find((r, i) => getRowKey(r, i) === k)!),\n processedData.value,\n );\n }\n setSelectedKeys(keys);\n}\n\n// ─────────────────────────────────────────────\n// Expand state\n// ─────────────────────────────────────────────\n\nconst internalExpandedKeys = ref<Set<string | number>>(\n new Set(expandable?.defaultExpandedRowKeys ?? []),\n);\n\nconst expandedKeys = computed<Set<string | number>>(() => {\n if (expandable?.expandedRowKeys) return new Set(expandable.expandedRowKeys);\n return internalExpandedKeys.value;\n});\n\n \nfunction toggleExpand(record: T, index: number, _event: MouseEvent) {\n const key = getRowKey(record, index);\n const keys = new Set(expandedKeys.value);\n const isExpanded = keys.has(key);\n if (isExpanded) {\n keys.delete(key);\n } else {\n keys.add(key);\n }\n if (!expandable?.expandedRowKeys) {\n internalExpandedKeys.value = keys;\n }\n expandable?.onExpand?.(!isExpanded, record);\n expandable?.onExpandedRowsChange?.([...keys]);\n emit('expand', !isExpanded, record);\n emit('expandedRowsChange', [...keys]);\n}\n\nfunction isRowExpanded(record: T, index: number): boolean {\n return expandedKeys.value.has(getRowKey(record, index));\n}\n\nfunction isRowExpandable(record: T): boolean {\n if (expandable?.rowExpandable) return expandable.rowExpandable(record);\n const childKey = expandable?.childrenColumnName ?? 'children';\n const children = (record as Record<string, unknown>)[childKey];\n return Array.isArray(children) && children.length > 0;\n}\n\n// ─────────────────────────────────────────────\n// Cell value helper\n// ─────────────────────────────────────────────\n\nfunction getCellValue(record: T, col: BTableColumnType<T>): unknown {\n return getValue(record, col.dataIndex);\n}\n\nfunction getColumnKey(col: BTableColumnType<T>, idx: number): string | number {\n return (\n col.key ?? (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : (col.dataIndex ?? idx))\n );\n}\n\n// ─────────────────────────────────────────────\n// Sticky offset\n// ─────────────────────────────────────────────\n\nconst stickyOffsetHeader = computed(() =>\n typeof sticky === 'object' ? (sticky.offsetHeader ?? 0) : 0,\n);\n\n// ─────────────────────────────────────────────\n// Scroll wrapper ref\n// ─────────────────────────────────────────────\n\nconst scrollRef = ref<HTMLElement | null>(null);\nconst hasHorizontalScroll = ref(false);\n\nonMounted(() => {\n checkScroll();\n});\n\nwatch(\n () => columns,\n () => nextTick(checkScroll),\n);\n\nfunction checkScroll() {\n if (!scrollRef.value) return;\n hasHorizontalScroll.value = scrollRef.value.scrollWidth > scrollRef.value.clientWidth;\n}\n\n// ─────────────────────────────────────────────\n// Root class / style\n// ─────────────────────────────────────────────\n\nconst rootClasses = computed(() => [\n 'b-table',\n {\n 'b-table--bordered': bordered,\n 'b-table--loading': loading,\n 'b-table--small': size === 'small',\n 'b-table--middle': size === 'middle',\n 'b-table--sticky': sticky,\n 'b-table--fixed-header': !!scroll?.y,\n 'b-table--scroll-x': !!scroll?.x,\n 'b-table--has-selection': !!rowSelection,\n 'b-table--has-expand': !!expandable,\n 'b-table--empty': processedData.value.length === 0,\n },\n]);\n\nconst tableStyle = computed<CSSProperties>(() => {\n const s: CSSProperties = {};\n if (tableLayout) s.tableLayout = tableLayout;\n if (scroll?.x === true) s.minWidth = '100%';\n else if (scroll?.x) s.width = typeof scroll.x === 'number' ? `${scroll.x}px` : scroll.x;\n return s;\n});\n\nconst wrapperStyle = computed<CSSProperties>(() => {\n const s: CSSProperties = {};\n if (scroll?.x) {\n s.overflowX = 'auto';\n }\n if (scroll?.y) {\n s.overflowY = 'auto';\n s.maxHeight = typeof scroll.y === 'number' ? `${scroll.y}px` : scroll.y;\n }\n return s;\n});\n\nconst stickyHeaderStyle = computed<CSSProperties>(() => {\n if (!sticky) return {};\n return {\n position: 'sticky',\n top: stickyOffsetHeader.value ? `${stickyOffsetHeader.value}px` : '0',\n zIndex: 2,\n };\n});\n\n// ─────────────────────────────────────────────\n// Sort icon helper\n// ─────────────────────────────────────────────\n\nfunction getSortIcon(col: BTableColumnType<T>): 'asc' | 'desc' | 'none' {\n const order = getColumnSortOrder(col);\n if (order === 'ascend') return 'asc';\n if (order === 'descend') return 'desc';\n return 'none';\n}\n\n// ─────────────────────────────────────────────\n// Ellipsis helper\n// ─────────────────────────────────────────────\n\nfunction getEllipsis(col: BTableColumnType<T>): boolean {\n if (typeof col.ellipsis === 'boolean') return col.ellipsis;\n return !!col.ellipsis;\n}\n\n// ─────────────────────────────────────────────\n// Column width style\n// ─────────────────────────────────────────────\n\nfunction colWidthStyle(col: BTableColumnType<T>): CSSProperties {\n const s: CSSProperties = {};\n if (col.width != null) s.width = typeof col.width === 'number' ? `${col.width}px` : col.width;\n if (col.minWidth != null) s.minWidth = `${col.minWidth}px`;\n if (col.maxWidth != null) s.maxWidth = `${col.maxWidth}px`;\n if (col.align) s.textAlign = col.align;\n return s;\n}\n\n// ─────────────────────────────────────────────\n// Page jump (simple pagination)\n// ─────────────────────────────────────────────\n\nconst jumpInput = ref('');\nfunction handleJumpKeydown(e: KeyboardEvent) {\n if (e.key === 'Enter') {\n const p = parseInt(jumpInput.value, 10);\n if (!isNaN(p) && p >= 1 && p <= totalPages.value) {\n goToPage(p);\n }\n jumpInput.value = '';\n }\n}\n\n// ─────────────────────────────────────────────\n// Filter keyboard handler (close on Escape)\n// ─────────────────────────────────────────────\n\nfunction handleFilterKeydown(e: KeyboardEvent) {\n if (e.key === 'Escape') openFilterKey.value = null;\n}\n\n// ─────────────────────────────────────────────\n// Get cell style\n// ─────────────────────────────────────────────\n\nfunction getCellStyle(\n col: BTableColumnType<T>,\n record: T,\n rowIndex: number,\n): CSSProperties | undefined {\n if (!col.cellStyle) return undefined;\n if (typeof col.cellStyle === 'function') return col.cellStyle(record, rowIndex);\n return col.cellStyle;\n}\n</script>\n\n<template>\n <div\n :class=\"rootClasses\"\n role=\"region\"\n :aria-label=\"caption ?? undefined\"\n :aria-busy=\"loading ? 'true' : undefined\"\n >\n <!-- Loading overlay -->\n <div\n v-if=\"loading\"\n class=\"b-table__loading-overlay\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Loading data\"\n >\n <div class=\"b-table__spin\" aria-hidden=\"true\">\n <span class=\"b-table__spin-dot\" />\n <span class=\"b-table__spin-dot\" />\n <span class=\"b-table__spin-dot\" />\n <span class=\"b-table__spin-dot\" />\n </div>\n </div>\n\n <!-- Title slot -->\n <div\n v-if=\"$slots.title\"\n class=\"b-table__title\"\n :aria-hidden=\"loading ? 'true' : undefined\"\n :style=\"loading ? { visibility: 'hidden' } : {}\"\n >\n <slot name=\"title\" />\n </div>\n\n <!-- Scroll wrapper -->\n <div\n ref=\"scrollRef\"\n class=\"b-table__scroll-wrapper\"\n :style=\"[wrapperStyle, loading ? { visibility: 'hidden' } : {}]\"\n :aria-hidden=\"loading ? 'true' : undefined\"\n :tabindex=\"scroll?.x || scroll?.y ? 0 : undefined\"\n >\n <table class=\"b-table__table\" :style=\"tableStyle\" role=\"table\">\n <!-- Caption (a11y) -->\n <caption v-if=\"caption\" class=\"b-table__caption\">\n {{\n caption\n }}\n </caption>\n\n <!-- Colgroup for widths -->\n <colgroup>\n <col\n v-if=\"rowSelection\"\n :style=\"{\n width: rowSelection.columnWidth\n ? typeof rowSelection.columnWidth === 'number'\n ? `${rowSelection.columnWidth}px`\n : rowSelection.columnWidth\n : '48px',\n }\"\n />\n <col v-if=\"expandable && expandable.showExpandColumn !== false\" style=\"width: 48px\" />\n <col\n v-for=\"(col, ci) in flatColumns\"\n :key=\"getColumnKey(col, ci)\"\n :style=\"colWidthStyle(col)\"\n />\n </colgroup>\n\n <!-- Header -->\n <thead v-if=\"showHeader\" class=\"b-table__thead\" :style=\"stickyHeaderStyle\">\n <tr\n v-for=\"(row, ri) in headerRows\"\n :key=\"ri\"\n class=\"b-table__tr b-table__tr--header\"\n v-bind=\"onHeaderRow?.(columns, ri)\"\n >\n <!-- Select-all cell (first header row only) -->\n <th\n v-if=\"rowSelection && ri === 0\"\n class=\"b-table__th b-table__th--selection\"\n :rowspan=\"headerRows.length\"\n scope=\"col\"\n :aria-label=\"resolvedLocale.selectAll\"\n >\n <span v-if=\"rowSelection.columnTitle\">{{ rowSelection.columnTitle }}</span>\n <label\n v-else-if=\"isCheckbox && !rowSelection.hideSelectAll\"\n class=\"b-table__checkbox-wrapper\"\n >\n <input\n type=\"checkbox\"\n class=\"b-table__checkbox\"\n :checked=\"allPageSelected\"\n :indeterminate=\"somePageSelected\"\n :aria-label=\"resolvedLocale.selectAll\"\n @change=\"toggleAllPage($event)\"\n />\n <span\n class=\"b-table__checkbox-inner\"\n :class=\"{\n 'b-table__checkbox-inner--indeterminate': somePageSelected,\n 'b-table__checkbox-inner--checked': allPageSelected,\n }\"\n aria-hidden=\"true\"\n />\n </label>\n </th>\n\n <!-- Expand cell (first header row only) -->\n <th\n v-if=\"expandable && expandable.showExpandColumn !== false && ri === 0\"\n class=\"b-table__th b-table__th--expand\"\n :rowspan=\"headerRows.length\"\n scope=\"col\"\n aria-hidden=\"true\"\n />\n\n <!-- Column header cells -->\n <th\n v-for=\"cell in row\"\n :key=\"getColumnKey(cell.col, 0)\"\n class=\"b-table__th\"\n :class=\"{\n 'b-table__th--sorted': getColumnSortOrder(cell.col) !== null,\n 'b-table__th--sortable': !!cell.col.sorter,\n 'b-table__th--filtered': (getColumnFilterValue(cell.col)?.length ?? 0) > 0,\n [`b-table__th--align-${cell.col.align ?? 'left'}`]: true,\n [cell.col.className ?? '']: !!cell.col.className,\n }\"\n :colspan=\"cell.colSpan > 1 ? cell.colSpan : undefined\"\n :rowspan=\"cell.rowSpan > 1 ? cell.rowSpan : undefined\"\n :style=\"colWidthStyle(cell.col)\"\n scope=\"col\"\n :aria-sort=\"\n cell.col.sorter\n ? getColumnSortOrder(cell.col) === 'ascend'\n ? 'ascending'\n : getColumnSortOrder(cell.col) === 'descend'\n ? 'descending'\n : 'none'\n : undefined\n \"\n v-bind=\"onHeaderRow?.(columns, 0)\"\n >\n <div class=\"b-table__th-inner\">\n <!-- Title -->\n <span\n class=\"b-table__col-title\"\n :class=\"{ 'b-table__col-title--rowspan': cell.rowSpan > 1 }\"\n >{{ cell.col.titleText ?? cell.col.title }}</span\n >\n\n <!-- Sorter -->\n <button\n v-if=\"cell.col.sorter && cell.isLeaf\"\n class=\"b-table__sorter\"\n type=\"button\"\n :aria-label=\"`${resolvedLocale.sortTitle}: ${cell.col.titleText ?? cell.col.title}`\"\n :data-sort=\"getSortIcon(cell.col)\"\n @click.stop=\"handleSort(cell.col)\"\n >\n <span class=\"b-table__sorter-inner\" aria-hidden=\"true\">\n <svg\n class=\"b-table__sort-up\"\n :class=\"{ active: getSortIcon(cell.col) === 'asc' }\"\n viewBox=\"0 0 1024 1024\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M858.9 689L530.5 308.2a24 24 0 0 0-36.9 0L165.1 689c-4.7 5.2-.4 13 6.5 13h496.8c6.9 0 11.2-7.8 6.5-13z\"\n />\n </svg>\n <svg\n class=\"b-table__sort-down\"\n :class=\"{ active: getSortIcon(cell.col) === 'desc' }\"\n viewBox=\"0 0 1024 1024\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M840.4 300H183.6c-19.7 0-30.7 20.8-18.5 35l328.4 380.8c9.4 10.9 27.5 10.9 37 0L858.9 335c12.2-14.2 1.2-35-18.5-35z\"\n />\n </svg>\n </span>\n </button>\n\n <!-- Filter trigger -->\n <div\n v-if=\"cell.col.filters && cell.isLeaf\"\n class=\"b-table__filter-trigger\"\n :class=\"{\n 'b-table__filter-trigger--active':\n (getColumnFilterValue(cell.col)?.length ?? 0) > 0 ||\n openFilterKey === getColumnFilterKey(cell.col),\n }\"\n >\n <button\n type=\"button\"\n class=\"b-table__filter-btn\"\n :aria-expanded=\"\n openFilterKey === getColumnFilterKey(cell.col) ? 'true' : 'false'\n \"\n :aria-label=\"`Filter ${cell.col.titleText ?? cell.col.title}`\"\n @click.stop=\"openFilter(cell.col)\"\n >\n <svg\n viewBox=\"0 0 1024 1024\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M880.1 154H143.9c-24.5 0-39.8 26.7-27.5 48L349 597.4V838c0 17.8 14.5 32 32.3 32h263.4c17.8 0 32.3-14.2 32.3-32V597.4L909.6 202c12.3-21.3-3-48-29.5-48z\"\n />\n </svg>\n </button>\n\n <!-- Filter dropdown -->\n <div\n v-if=\"openFilterKey === getColumnFilterKey(cell.col)\"\n class=\"b-table__filter-dropdown\"\n role=\"dialog\"\n :aria-label=\"`Filter ${cell.col.titleText ?? cell.col.title}`\"\n @keydown=\"handleFilterKeydown\"\n >\n <!-- Search input -->\n <div v-if=\"cell.col.filterSearch\" class=\"b-table__filter-search\">\n <input\n v-model=\"filterSearchMap[getColumnFilterKey(cell.col)]\"\n type=\"search\"\n class=\"b-table__filter-search-input\"\n placeholder=\"Search...\"\n aria-label=\"Search filter options\"\n />\n </div>\n\n <!-- Options -->\n <ul\n class=\"b-table__filter-list\"\n role=\"listbox\"\n :aria-multiselectable=\"cell.col.filterMultiple !== false ? 'true' : 'false'\"\n >\n <li\n v-for=\"opt in getFilteredOptions(cell.col)\"\n :key=\"String(opt.value)\"\n class=\"b-table__filter-item\"\n role=\"option\"\n :aria-selected=\"\n (tempFilterValues[getColumnFilterKey(cell.col)] ?? []).includes(opt.value)\n \"\n >\n <label class=\"b-table__filter-item-label\">\n <input\n :type=\"cell.col.filterMultiple !== false ? 'checkbox' : 'radio'\"\n class=\"b-table__filter-item-input\"\n :checked=\"\n (tempFilterValues[getColumnFilterKey(cell.col)] ?? []).includes(\n opt.value,\n )\n \"\n @change=\"toggleTempFilter(cell.col, opt.value)\"\n />\n <span>{{ opt.text }}</span>\n </label>\n </li>\n </ul>\n\n <!-- Actions -->\n <div class=\"b-table__filter-actions\">\n <button\n type=\"button\"\n class=\"b-table__filter-reset\"\n @click=\"resetFilter(cell.col)\"\n >\n {{ resolvedLocale.filterReset }}\n </button>\n <button\n type=\"button\"\n class=\"b-table__filter-confirm\"\n @click=\"confirmFilter(cell.col)\"\n >\n {{ resolvedLocale.filterConfirm }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </th>\n </tr>\n </thead>\n\n <!-- Body -->\n <tbody class=\"b-table__tbody\">\n <!-- Empty state -->\n <tr v-if=\"processedData.length === 0\" class=\"b-table__tr--empty\">\n <td\n class=\"b-table__td b-table__td--empty\"\n :colspan=\"\n flatColumns.length +\n (rowSelection ? 1 : 0) +\n (expandable && expandable.showExpandColumn !== false ? 1 : 0)\n \"\n >\n <slot name=\"emptyText\">\n <div class=\"b-table__empty\">\n <svg\n class=\"b-table__empty-icon\"\n viewBox=\"0 0 64 41\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <g transform=\"translate(0 1)\" fill=\"none\" fill-rule=\"evenodd\">\n <ellipse cx=\"32\" cy=\"33\" rx=\"32\" ry=\"7\" fill=\"currentColor\" opacity=\".2\" />\n <g fill-rule=\"nonzero\" stroke=\"currentColor\">\n <path\n d=\"M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z\"\n />\n <path\n d=\"M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z\"\n fill=\"currentColor\"\n opacity=\".08\"\n />\n </g>\n </g>\n </svg>\n <p class=\"b-table__empty-text\">{{ resolvedLocale.emptyText }}</p>\n </div>\n </slot>\n </td>\n </tr>\n\n <!-- Data rows -->\n <template v-for=\"(record, rowIndex) in processedData\" :key=\"getRowKey(record, rowIndex)\">\n <tr\n class=\"b-table__tr b-table__tr--data\"\n :class=\"[\n rowClassName?.(record, rowIndex),\n {\n 'b-table__tr--selected': selectedKeys.has(getRowKey(record, rowIndex)),\n 'b-table__tr--expanded': isRowExpanded(record, rowIndex),\n },\n ]\"\n v-bind=\"onRow?.(record, rowIndex)\"\n >\n <!-- Selection cell -->\n <td v-if=\"rowSelection\" class=\"b-table__td b-table__td--selection\">\n <label class=\"b-table__checkbox-wrapper\">\n <input\n :type=\"isCheckbox ? 'checkbox' : 'radio'\"\n class=\"b-table__checkbox\"\n :checked=\"selectedKeys.has(getRowKey(record, rowIndex))\"\n :disabled=\"!!rowSelection.getCheckboxProps?.(record)?.disabled\"\n :aria-label=\"`Select row ${rowIndex + 1}`\"\n v-bind=\"rowSelection.getCheckboxProps?.(record)\"\n @change=\"toggleRow(record, rowIndex, $event)\"\n />\n <span\n class=\"b-table__checkbox-inner\"\n :class=\"{\n 'b-table__checkbox-inner--checked': selectedKeys.has(\n getRowKey(record, rowIndex),\n ),\n }\"\n aria-hidden=\"true\"\n />\n </label>\n </td>\n\n <!-- Expand toggle cell -->\n <td\n v-if=\"expandable && expandable.showExpandColumn !== false\"\n class=\"b-table__td b-table__td--expand\"\n >\n <button\n v-if=\"isRowExpandable(record)\"\n type=\"button\"\n class=\"b-table__expand-btn\"\n :class=\"{ 'b-table__expand-btn--expanded': isRowExpanded(record, rowIndex) }\"\n :aria-label=\"\n isRowExpanded(record, rowIndex)\n ? resolvedLocale.collapse\n : resolvedLocale.expand\n \"\n :aria-expanded=\"isRowExpanded(record, rowIndex) ? 'true' : 'false'\"\n @click=\"toggleExpand(record, rowIndex, $event)\"\n >\n <svg\n class=\"b-table__expand-icon\"\n viewBox=\"0 0 1024 1024\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M765.7 486.8L314.9 134.7A7.97 7.97 0 0 0 302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 0 0 0-50.4z\"\n />\n </svg>\n </button>\n </td>\n\n <!-- Data cells -->\n <td\n v-for=\"(col, ci) in flatColumns\"\n :key=\"getColumnKey(col, ci)\"\n class=\"b-table__td\"\n :class=\"{\n [`b-table__td--align-${col.align ?? 'left'}`]: true,\n 'b-table__td--ellipsis': getEllipsis(col),\n [col.className ?? '']: !!col.className,\n }\"\n :style=\"[colWidthStyle(col), getCellStyle(col, record, rowIndex)]\"\n >\n <!-- Slot-based rendering (by column key) -->\n <slot\n v-if=\"$slots[String(getColumnKey(col, ci))]\"\n :name=\"String(getColumnKey(col, ci))\"\n :value=\"getCellValue(record, col)\"\n :record=\"record\"\n :index=\"rowIndex\"\n :column=\"col\"\n />\n <!-- customRender function -->\n <component\n v-else-if=\"col.customRender\"\n :is=\"\n () =>\n col.customRender!({\n value: getCellValue(record, col),\n record,\n index: rowIndex,\n column: col,\n })\n \"\n />\n <!-- Default: raw cell value -->\n <template v-else>\n <span\n v-if=\"getEllipsis(col)\"\n class=\"b-table__cell-ellipsis\"\n :title=\"\n typeof col.ellipsis === 'object' && col.ellipsis.showTitle !== false\n ? String(getCellValue(record, col) ?? '')\n : undefined\n \"\n >{{ getCellValue(record, col) }}</span\n >\n <template v-else>{{ getCellValue(record, col) }}</template>\n </template>\n </td>\n </tr>\n\n <!-- Expanded row content -->\n <tr\n v-if=\"expandable && isRowExpanded(record, rowIndex)\"\n class=\"b-table__tr b-table__tr--expanded-content\"\n :key=\"`${getRowKey(record, rowIndex)}-expanded`\"\n >\n <td\n :colspan=\"\n flatColumns.length +\n (rowSelection ? 1 : 0) +\n (expandable && expandable.showExpandColumn !== false ? 1 : 0)\n \"\n class=\"b-table__td b-table__td--expanded\"\n >\n <component\n v-if=\"expandable.expandedRowRender\"\n :is=\"\n () =>\n expandable.expandedRowRender!(\n record,\n rowIndex,\n 0,\n isRowExpanded(record, rowIndex),\n )\n \"\n />\n <slot v-else name=\"expandedRow\" :record=\"record\" :index=\"rowIndex\" />\n </td>\n </tr>\n </template>\n\n <!-- Summary slot -->\n <slot name=\"summary\" :page-data=\"processedData\" />\n </tbody>\n </table>\n </div>\n\n <!-- Footer slot -->\n <div\n v-if=\"$slots.footer\"\n class=\"b-table__footer\"\n :aria-hidden=\"loading ? 'true' : undefined\"\n :style=\"loading ? { visibility: 'hidden' } : {}\"\n >\n <slot name=\"footer\" />\n </div>\n\n <!-- Pagination -->\n <div\n v-if=\"pagination !== false && filteredData.length > 0\"\n class=\"b-table__pagination\"\n role=\"navigation\"\n aria-label=\"Table pagination\"\n :aria-hidden=\"loading ? 'true' : undefined\"\n :style=\"loading ? { visibility: 'hidden' } : {}\"\n >\n <!-- Total info -->\n <span\n v-if=\"typeof pagination === 'object' && pagination.showTotal\"\n class=\"b-table__pagination-total\"\n >\n {{\n pagination.showTotal(filteredData.length, [\n (currentPage - 1) * currentPageSize + 1,\n Math.min(currentPage * currentPageSize, filteredData.length),\n ])\n }}\n </span>\n\n <div class=\"b-table__pagination-controls\">\n <!-- Prev -->\n <button\n type=\"button\"\n class=\"b-table__page-btn\"\n :disabled=\"currentPage <= 1\"\n :aria-label=\"'Previous page'\"\n @click=\"goToPage(currentPage - 1)\"\n >\n <svg\n viewBox=\"0 0 1024 1024\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.96 31.96 0 0 0 0 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z\"\n />\n </svg>\n </button>\n\n <!-- Page numbers -->\n <template v-for=\"page in totalPages\" :key=\"page\">\n <button\n v-if=\"\n totalPages <= 7 ||\n page === 1 ||\n page === totalPages ||\n Math.abs(page - currentPage) <= 1\n \"\n type=\"button\"\n class=\"b-table__page-btn\"\n :class=\"{ 'b-table__page-btn--active': page === currentPage }\"\n :aria-label=\"`Page ${page}`\"\n :aria-current=\"page === currentPage ? 'page' : undefined\"\n @click=\"goToPage(page)\"\n >\n {{ page }}\n </button>\n <span\n v-else-if=\"page === 2 && currentPage > 4\"\n class=\"b-table__page-ellipsis\"\n aria-hidden=\"true\"\n >…</span\n >\n <span\n v-else-if=\"page === totalPages - 1 && currentPage < totalPages - 3\"\n class=\"b-table__page-ellipsis\"\n aria-hidden=\"true\"\n >…</span\n >\n </template>\n\n <!-- Next -->\n <button\n type=\"button\"\n class=\"b-table__page-btn\"\n :disabled=\"currentPage >= totalPages\"\n :aria-label=\"'Next page'\"\n @click=\"goToPage(currentPage + 1)\"\n >\n <svg\n viewBox=\"0 0 1024 1024\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M765.7 486.8L314.9 134.7A7.97 7.97 0 0 0 302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 0 0 0-50.4z\"\n />\n </svg>\n </button>\n\n <!-- Page size changer -->\n <select\n v-if=\"typeof pagination === 'object' && pagination.showSizeChanger\"\n class=\"b-table__page-size\"\n :value=\"currentPageSize\"\n :aria-label=\"'Rows per page'\"\n @change=\"changePageSize(Number(($event.target as HTMLSelectElement).value))\"\n >\n <option v-for=\"ps in pageSizeOptions\" :key=\"ps\" :value=\"ps\">{{ ps }} / page</option>\n </select>\n\n <!-- Quick jump -->\n <span\n v-if=\"typeof pagination === 'object' && pagination.showQuickJumper\"\n class=\"b-table__page-jump\"\n >\n Go to\n <input\n v-model=\"jumpInput\"\n type=\"number\"\n class=\"b-table__page-jump-input\"\n :min=\"1\"\n :max=\"totalPages\"\n aria-label=\"Go to page\"\n @keydown=\"handleJumpKeydown\"\n />\n </span>\n </div>\n </div>\n </div>\n</template>\n\n<style>\n/* ─────────────────────────────────────────────\n BTable - CSS custom properties (scoped to root)\n ───────────────────────────────────────────── */\n.b-table {\n /* Colors */\n --b-table-bg: oklch(100% 0 0);\n --b-table-color: oklch(20% 0.02 260);\n --b-table-border-color: oklch(88% 0.01 260);\n --b-table-header-bg: oklch(97% 0.005 260);\n --b-table-header-color: oklch(30% 0.02 260);\n --b-table-row-hover-bg: oklch(96% 0.01 260);\n --b-table-row-selected-bg: oklch(94% 0.03 262);\n --b-table-row-expanded-bg: oklch(98% 0.005 260);\n --b-table-empty-color: oklch(48% 0.01 260);\n --b-table-footer-bg: oklch(97% 0.005 260);\n --b-table-loading-overlay-bg: oklch(100% 0 0);\n --b-table-sticky-z-index: 2;\n\n /* Sort / filter */\n --b-table-sorter-color: oklch(65% 0.01 260);\n --b-table-sorter-active-color: oklch(54.6% 0.245 262.881);\n --b-table-filter-active-color: oklch(54.6% 0.245 262.881);\n --b-table-filter-dropdown-bg: oklch(100% 0 0);\n --b-table-filter-dropdown-shadow: 0 6px 16px oklch(0% 0 0 / 8%), 0 3px 6px oklch(0% 0 0 / 4%);\n\n /* Checkbox */\n --b-table-checkbox-size: 16px;\n --b-table-checkbox-border: 1px solid oklch(75% 0.01 260);\n --b-table-checkbox-checked-bg: oklch(54.6% 0.245 262.881);\n --b-table-checkbox-checked-border: oklch(54.6% 0.245 262.881);\n --b-table-checkbox-radius: 4px;\n\n /* Expand */\n --b-table-expand-icon-size: 17px;\n --b-table-expand-icon-color: oklch(45% 0.02 260);\n --b-table-expand-icon-hover-color: oklch(54.6% 0.245 262.881);\n\n /* Spacing */\n --b-table-cell-padding: 12px 16px;\n --b-table-cell-padding-middle: 8px 16px;\n --b-table-cell-padding-small: 4px 8px;\n --b-table-font-size: 14px;\n --b-table-border-radius: 8px;\n\n /* Pagination */\n --b-table-pagination-color: oklch(30% 0.02 260);\n --b-table-pagination-btn-size: 32px;\n --b-table-pagination-btn-radius: 6px;\n --b-table-pagination-btn-border: 1px solid oklch(88% 0.01 260);\n --b-table-pagination-btn-active-bg: oklch(54.6% 0.245 262.881);\n --b-table-pagination-btn-active-color: oklch(100% 0 0);\n --b-table-pagination-btn-hover-bg: oklch(95% 0.01 262);\n\n /* Spin */\n --b-table-spin-color: oklch(54.6% 0.245 262.881);\n --b-table-spin-size: 32px;\n\n /* Transition */\n --b-table-transition-duration: 200ms;\n\n position: relative;\n font-size: var(--b-table-font-size);\n color: var(--b-table-color);\n background: var(--b-table-bg);\n border-radius: var(--b-table-border-radius);\n line-height: 1.5715;\n box-sizing: border-box;\n}\n\n/* ── Scroll wrapper ── */\n.b-table__scroll-wrapper {\n width: 100%;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n background: var(--b-table-bg);\n}\n\n.b-table__scroll-wrapper:focus-visible {\n outline: 2px solid oklch(54.6% 0.245 262.881);\n outline-offset: -2px;\n}\n\n/* ── Table element ── */\n.b-table__table {\n width: 100%;\n border-collapse: collapse;\n table-layout: auto;\n background: var(--b-table-bg);\n}\n\n/* ── Caption ── */\n.b-table__caption {\n /* Visually hidden - accessible label is surfaced via aria-label on the region landmark */\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n background: var(--b-table-bg);\n}\n\n/* ── Header ── */\n.b-table__thead {\n background: var(--b-table-header-bg);\n}\n\n/* Explicit background on every header <tr> so axe's elementsFromPoint algorithm\n can resolve the background when a rowspan-2 th's text sits on the row boundary\n and the sibling <tr> appears as a non-ancestor in the z-stack. */\n.b-table__tr--header {\n background: var(--b-table-header-bg);\n}\n\n.b-table__th {\n padding: var(--b-table-cell-padding);\n font-weight: 600;\n color: var(--b-table-header-color);\n text-align: left;\n vertical-align: top;\n white-space: nowrap;\n border-bottom: 1px solid var(--b-table-border-color);\n box-sizing: border-box;\n background: var(--b-table-header-bg);\n}\n\n.b-table--middle .b-table__th {\n padding: var(--b-table-cell-padding-middle);\n}\n\n.b-table--small .b-table__th {\n padding: var(--b-table-cell-padding-small);\n}\n\n.b-table__th--align-center {\n text-align: center;\n}\n.b-table__th--align-right {\n text-align: right;\n}\n\n.b-table__th-inner {\n display: flex;\n align-items: center;\n gap: 4px;\n width: 100%;\n background: var(--b-table-header-bg);\n}\n\n.b-table__col-title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n background: var(--b-table-header-bg);\n}\n\n/* Rowspan headers span multiple rows; removing overflow:hidden prevents axe's\n elementsFromPoint from finding the sibling <tr> as an unresolvable overlay. */\n.b-table__col-title--rowspan {\n overflow: visible;\n}\n\n/* ── Sorter ── */\n.b-table__sorter {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n color: var(--b-table-sorter-color);\n background: none;\n border: none;\n padding: 0;\n gap: 0;\n flex-shrink: 0;\n transition: color var(--b-table-transition-duration);\n}\n\n.b-table__sorter:hover,\n.b-table__th--sorted .b-table__sorter {\n color: var(--b-table-sorter-active-color);\n}\n\n.b-table__sorter-inner {\n display: flex;\n flex-direction: column;\n line-height: 1;\n}\n\n.b-table__sort-up,\n.b-table__sort-down {\n display: block;\n width: 11px;\n height: 7px;\n color: var(--b-table-sorter-color);\n transition: color var(--b-table-transition-duration);\n}\n\n.b-table__sort-up.active {\n color: var(--b-table-sorter-active-color);\n}\n.b-table__sort-down.active {\n color: var(--b-table-sorter-active-color);\n}\n\n/* ── Filter ── */\n.b-table__filter-trigger {\n position: relative;\n display: inline-flex;\n flex-shrink: 0;\n}\n\n.b-table__filter-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: var(--b-table-sorter-color);\n background: none;\n border: none;\n padding: 2px 4px;\n border-radius: 4px;\n transition:\n color var(--b-table-transition-duration),\n background var(--b-table-transition-duration);\n}\n\n.b-table__filter-btn:hover,\n.b-table__filter-trigger--active .b-table__filter-btn {\n color: var(--b-table-filter-active-color);\n background: oklch(94% 0.02 262);\n}\n\n.b-table__filter-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 10;\n min-width: 160px;\n background: var(--b-table-filter-dropdown-bg);\n border-radius: 8px;\n box-shadow: var(--b-table-filter-dropdown-shadow);\n padding: 4px 0;\n outline: none;\n}\n\n.b-table__filter-search {\n padding: 8px 12px;\n border-bottom: 1px solid var(--b-table-border-color);\n}\n\n.b-table__filter-search-input {\n width: 100%;\n border: 1px solid var(--b-table-border-color);\n border-radius: 4px;\n padding: 4px 8px;\n font-size: 13px;\n outline: none;\n background: var(--b-table-bg);\n color: var(--b-table-color);\n box-sizing: border-box;\n}\n\n.b-table__filter-search-input:focus {\n border-color: var(--b-table-sorter-active-color);\n box-shadow: 0 0 0 2px oklch(54.6% 0.245 262.881 / 20%);\n}\n\n.b-table__filter-list {\n list-style: none;\n margin: 0;\n padding: 4px 0;\n max-height: 200px;\n overflow-y: auto;\n}\n\n.b-table__filter-item {\n padding: 0;\n}\n\n.b-table__filter-item-label {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n cursor: pointer;\n font-size: 13px;\n transition: background var(--b-table-transition-duration);\n}\n\n.b-table__filter-item-label:hover {\n background: var(--b-table-row-hover-bg);\n}\n\n.b-table__filter-item-input {\n accent-color: var(--b-table-sorter-active-color);\n}\n\n.b-table__filter-actions {\n display: flex;\n justify-content: space-between;\n padding: 8px 12px;\n border-top: 1px solid var(--b-table-border-color);\n gap: 8px;\n}\n\n.b-table__filter-reset {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 13px;\n color: var(--b-table-color);\n padding: 4px 8px;\n border-radius: 4px;\n transition: background var(--b-table-transition-duration);\n}\n\n.b-table__filter-reset:hover {\n background: var(--b-table-row-hover-bg);\n}\n\n.b-table__filter-confirm {\n background: oklch(54.6% 0.245 262.881);\n color: oklch(100% 0 0);\n border: none;\n cursor: pointer;\n font-size: 13px;\n padding: 4px 12px;\n border-radius: 4px;\n transition: background var(--b-table-transition-duration);\n}\n\n.b-table__filter-confirm:hover {\n background: oklch(49% 0.24 262.881);\n}\n\n/* ── Selection cells ── */\n.b-table__th--selection,\n.b-table__td--selection {\n text-align: center;\n padding: 0 !important;\n width: 48px;\n}\n\n.b-table__checkbox-wrapper {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n position: relative;\n padding: 0 8px;\n height: 100%;\n}\n\n.b-table__checkbox {\n /* Visually hidden but accessible */\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n margin: 0;\n}\n\n.b-table__checkbox:focus-visible + .b-table__checkbox-inner {\n outline: 2px solid oklch(54.6% 0.245 262.881);\n outline-offset: 2px;\n}\n\n.b-table__checkbox-inner {\n display: inline-block;\n width: var(--b-table-checkbox-size);\n height: var(--b-table-checkbox-size);\n border: var(--b-table-checkbox-border);\n border-radius: var(--b-table-checkbox-radius);\n background: var(--b-table-bg);\n transition:\n border-color var(--b-table-transition-duration),\n background var(--b-table-transition-duration);\n position: relative;\n flex-shrink: 0;\n}\n\n.b-table__checkbox-inner--checked {\n background: var(--b-table-checkbox-checked-bg);\n border-color: var(--b-table-checkbox-checked-border);\n}\n\n/* Checkmark */\n.b-table__checkbox-inner--checked::after {\n content: '';\n position: absolute;\n top: 2px;\n left: 5px;\n width: 4px;\n height: 8px;\n border: 2px solid oklch(100% 0 0);\n border-top: none;\n border-left: none;\n transform: rotate(45deg);\n}\n\n/* Indeterminate dash */\n.b-table__checkbox-inner--indeterminate {\n background: var(--b-table-checkbox-checked-bg);\n border-color: var(--b-table-checkbox-checked-border);\n}\n\n.b-table__checkbox-inner--indeterminate::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n width: 8px;\n height: 2px;\n background: oklch(100% 0 0);\n transform: translate(-50%, -50%);\n border: none;\n}\n\n/* ── Expand toggle cell ── */\n.b-table__th--expand,\n.b-table__td--expand {\n text-align: center;\n width: 48px;\n padding: 0 !important;\n}\n\n.b-table__expand-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--b-table-expand-icon-size);\n height: var(--b-table-expand-icon-size);\n border: 1px solid var(--b-table-border-color);\n border-radius: 4px;\n background: var(--b-table-bg);\n cursor: pointer;\n color: var(--b-table-expand-icon-color);\n padding: 0;\n transition:\n color var(--b-table-transition-duration),\n border-color var(--b-table-transition-duration);\n}\n\n.b-table__expand-btn:hover {\n color: var(--b-table-expand-icon-hover-color);\n border-color: var(--b-table-expand-icon-hover-color);\n}\n\n.b-table__expand-icon {\n transition: transform var(--b-table-transition-duration);\n}\n\n.b-table__expand-btn--expanded .b-table__expand-icon {\n transform: rotate(90deg);\n}\n\n/* ── Body cells ── */\n.b-table__td {\n padding: var(--b-table-cell-padding);\n border-bottom: 1px solid var(--b-table-border-color);\n background: var(--b-table-bg);\n color: var(--b-table-color);\n box-sizing: border-box;\n vertical-align: middle;\n transition: background var(--b-table-transition-duration);\n}\n\n.b-table--middle .b-table__td {\n padding: var(--b-table-cell-padding-middle);\n}\n.b-table--small .b-table__td {\n padding: var(--b-table-cell-padding-small);\n}\n\n.b-table__td--align-center {\n text-align: center;\n}\n.b-table__td--align-right {\n text-align: right;\n}\n\n.b-table__td--ellipsis {\n overflow: hidden;\n}\n\n.b-table__cell-ellipsis {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ── Row states ── */\n.b-table__tr--data:hover > .b-table__td {\n background: var(--b-table-row-hover-bg);\n}\n\n.b-table__tr--selected > .b-table__td {\n background: var(--b-table-row-selected-bg);\n}\n\n.b-table__tr--expanded-content > .b-table__td--expanded {\n background: var(--b-table-row-expanded-bg);\n}\n\n/* ── Bordered ── */\n.b-table--bordered {\n border: 1px solid var(--b-table-border-color);\n border-radius: var(--b-table-border-radius);\n overflow: hidden;\n}\n\n.b-table--bordered .b-table__th,\n.b-table--bordered .b-table__td {\n border-right: 1px solid var(--b-table-border-color);\n}\n\n.b-table--bordered .b-table__th:last-child,\n.b-table--bordered .b-table__td:last-child {\n border-right: none;\n}\n\n/* ── Empty ── */\n.b-table__td--empty {\n padding: 48px 16px;\n text-align: center;\n border-bottom: none;\n}\n\n.b-table__empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n}\n\n.b-table__empty-icon {\n width: 64px;\n height: 41px;\n color: var(--b-table-empty-color);\n}\n\n.b-table__empty-text {\n margin: 0;\n color: var(--b-table-empty-color);\n font-size: 14px;\n}\n\n/* ── Title / Footer ── */\n.b-table__title,\n.b-table__footer {\n padding: 12px 16px;\n background: var(--b-table-footer-bg);\n border: 1px solid var(--b-table-border-color);\n}\n\n.b-table__title {\n border-bottom: none;\n border-radius: var(--b-table-border-radius) var(--b-table-border-radius) 0 0;\n}\n.b-table__footer {\n border-top: none;\n border-radius: 0 0 var(--b-table-border-radius) var(--b-table-border-radius);\n}\n\n/* ── Loading ── */\n.b-table__loading-overlay {\n position: absolute;\n inset: 0;\n z-index: 4;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--b-table-loading-overlay-bg);\n border-radius: var(--b-table-border-radius);\n}\n\n.b-table__spin {\n display: inline-flex;\n gap: 4px;\n align-items: center;\n}\n\n.b-table__spin-dot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--b-table-spin-color);\n animation: b-table-spin-bounce 1.2s ease-in-out infinite;\n}\n\n.b-table__spin-dot:nth-child(1) {\n animation-delay: 0ms;\n}\n.b-table__spin-dot:nth-child(2) {\n animation-delay: 160ms;\n}\n.b-table__spin-dot:nth-child(3) {\n animation-delay: 320ms;\n}\n.b-table__spin-dot:nth-child(4) {\n animation-delay: 480ms;\n}\n\n@keyframes b-table-spin-bounce {\n 0%,\n 60%,\n 100% {\n transform: scale(1);\n opacity: 0.5;\n }\n 30% {\n transform: scale(1.4);\n opacity: 1;\n }\n}\n\n/* ── Pagination ── */\n.b-table__pagination {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 12px 0 4px;\n flex-wrap: wrap;\n color: var(--b-table-pagination-color);\n font-size: 14px;\n}\n\n.b-table__pagination-total {\n margin-right: auto;\n}\n\n.b-table__pagination-controls {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n.b-table__page-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--b-table-pagination-btn-size);\n height: var(--b-table-pagination-btn-size);\n padding: 0 8px;\n border: var(--b-table-pagination-btn-border);\n border-radius: var(--b-table-pagination-btn-radius);\n background: var(--b-table-bg);\n color: var(--b-table-pagination-color);\n cursor: pointer;\n font-size: 14px;\n transition:\n background var(--b-table-transition-duration),\n border-color var(--b-table-transition-duration),\n color var(--b-table-transition-duration);\n}\n\n.b-table__page-btn:hover:not(:disabled) {\n background: var(--b-table-pagination-btn-hover-bg);\n border-color: oklch(54.6% 0.245 262.881);\n color: oklch(54.6% 0.245 262.881);\n}\n\n.b-table__page-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.b-table__page-btn--active {\n background: var(--b-table-pagination-btn-active-bg);\n border-color: var(--b-table-pagination-btn-active-bg);\n color: var(--b-table-pagination-btn-active-color);\n font-weight: 600;\n}\n\n.b-table__page-ellipsis {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--b-table-pagination-btn-size);\n height: var(--b-table-pagination-btn-size);\n font-size: 14px;\n color: var(--b-table-empty-color);\n letter-spacing: 2px;\n}\n\n.b-table__page-size {\n height: var(--b-table-pagination-btn-size);\n border: var(--b-table-pagination-btn-border);\n border-radius: var(--b-table-pagination-btn-radius);\n background: var(--b-table-bg);\n color: var(--b-table-pagination-color);\n padding: 0 24px 0 8px;\n font-size: 14px;\n cursor: pointer;\n outline: none;\n appearance: auto;\n}\n\n.b-table__page-jump {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 14px;\n}\n\n.b-table__page-jump-input {\n width: 48px;\n height: var(--b-table-pagination-btn-size);\n border: var(--b-table-pagination-btn-border);\n border-radius: var(--b-table-pagination-btn-radius);\n text-align: center;\n font-size: 14px;\n padding: 0 4px;\n background: var(--b-table-bg);\n color: var(--b-table-pagination-color);\n outline: none;\n box-sizing: border-box;\n}\n\n.b-table__page-jump-input:focus {\n border-color: oklch(54.6% 0.245 262.881);\n box-shadow: 0 0 0 2px oklch(54.6% 0.245 262.881 / 20%);\n}\n\n/* ── Sticky header ── */\n.b-table--sticky .b-table__thead {\n position: sticky;\n top: 0;\n z-index: var(--b-table-sticky-z-index);\n}\n\n/* ── Dark mode ── */\n[data-prefers-color='dark'] .b-table {\n --b-table-bg: oklch(18% 0.015 260);\n --b-table-color: oklch(88% 0.01 260);\n --b-table-border-color: oklch(32% 0.02 260);\n --b-table-header-bg: oklch(22% 0.02 260);\n --b-table-header-color: oklch(85% 0.01 260);\n --b-table-row-hover-bg: oklch(25% 0.02 260);\n --b-table-row-selected-bg: oklch(26% 0.04 262);\n --b-table-row-expanded-bg: oklch(21% 0.015 260);\n --b-table-empty-color: oklch(55% 0.01 260);\n --b-table-footer-bg: oklch(22% 0.02 260);\n --b-table-loading-overlay-bg: oklch(18% 0.015 260);\n --b-table-filter-dropdown-bg: oklch(22% 0.02 260);\n --b-table-filter-dropdown-shadow: 0 6px 16px oklch(0% 0 0 / 30%), 0 3px 6px oklch(0% 0 0 / 20%);\n --b-table-checkbox-border: 1px solid oklch(48% 0.02 260);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-table {\n --b-table-bg: oklch(18% 0.015 260);\n --b-table-color: oklch(88% 0.01 260);\n --b-table-border-color: oklch(32% 0.02 260);\n --b-table-header-bg: oklch(22% 0.02 260);\n --b-table-header-color: oklch(85% 0.01 260);\n --b-table-row-hover-bg: oklch(25% 0.02 260);\n --b-table-row-selected-bg: oklch(26% 0.04 262);\n --b-table-row-expanded-bg: oklch(21% 0.015 260);\n --b-table-empty-color: oklch(55% 0.01 260);\n --b-table-footer-bg: oklch(22% 0.02 260);\n --b-table-loading-overlay-bg: oklch(18% 0.015 260);\n --b-table-filter-dropdown-bg: oklch(22% 0.02 260);\n --b-table-filter-dropdown-shadow: 0 6px 16px oklch(0% 0 0 / 30%), 0 3px 6px oklch(0% 0 0 / 20%);\n --b-table-checkbox-border: 1px solid oklch(48% 0.02 260);\n }\n}\n\n/* ── Reduced motion ── */\n@media (prefers-reduced-motion: reduce) {\n .b-table {\n --b-table-transition-duration: 0ms;\n }\n\n .b-table__spin-dot {\n animation: none;\n }\n\n .b-table__expand-icon {\n transition: none;\n }\n}\n</style>\n"],"mappings":""}
|
package/dist/design-system216.js
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
/*
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
//#region src/components/BTimePicker/types.ts
|
|
2
|
+
var e = /* @__PURE__ */ function(e) {
|
|
3
|
+
return e.Small = "sm", e.Medium = "md", e.Large = "lg", e;
|
|
4
|
+
}({}), t = /* @__PURE__ */ function(e) {
|
|
5
|
+
return e.Outlined = "outlined", e.Filled = "filled", e.Borderless = "borderless", e.Underlined = "underlined", e;
|
|
6
|
+
}({}), n = /* @__PURE__ */ function(e) {
|
|
7
|
+
return e.Error = "error", e.Warning = "warning", e;
|
|
8
|
+
}({}), r = /* @__PURE__ */ function(e) {
|
|
9
|
+
return e.BottomLeft = "bottom-left", e.BottomRight = "bottom-right", e.TopLeft = "top-left", e.TopRight = "top-right", e;
|
|
10
|
+
}({});
|
|
5
11
|
//#endregion
|
|
6
|
-
export { t as
|
|
12
|
+
export { r as BTimePickerPlacement, e as BTimePickerSize, n as BTimePickerStatus, t as BTimePickerVariant };
|
|
7
13
|
|
|
8
14
|
//# sourceMappingURL=design-system216.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-system216.js","names":[],"sources":["../src/components/BTour/BTour.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport {\n BTourPlacement,\n BTourType,\n type BTourArrowOptions,\n type BTourButtonProps,\n type BTourGapOptions,\n type BTourResolvedStep,\n type BTourScrollIntoViewOptions,\n type BTourStep,\n} from './types.ts';\n\n// ─────────────────────────────────────────────\n// Props & emits\n// ─────────────────────────────────────────────\nconst {\n steps = [],\n open = undefined,\n current = undefined,\n defaultCurrent = 0,\n arrow = true,\n placement = BTourPlacement.Bottom,\n type = BTourType.Default,\n mask = true,\n gap = { offset: 6, radius: 2 },\n zIndex = 1070,\n keyboard = true,\n scrollIntoViewOptions = true,\n getPopupContainer: _getPopupContainer = undefined,\n closeIcon = true,\n disabledInteraction = false,\n} = defineProps<{\n /** Array of step definition objects. */\n steps?: BTourStep[];\n /**\n * Controlled open state. Pair with `current` and `onChange`/`onClose`.\n * Omit to use uncontrolled mode.\n */\n open?: boolean;\n /**\n * Controlled current step index.\n * Omit to use uncontrolled mode.\n */\n current?: number;\n /** Initial step index in uncontrolled mode. @default 0 */\n defaultCurrent?: number;\n /** Show arrow on the popup. Pass `{ pointAtCenter: true }` to center it. */\n arrow?: boolean | BTourArrowOptions;\n /** Default placement for all steps (step-level overrides this). @default 'bottom' */\n placement?: `${BTourPlacement}`;\n /** Visual type variant. @default 'default' */\n type?: `${BTourType}`;\n /**\n * Mask overlay. `false` disables, `true` uses defaults,\n * or object `{ color, style }` for custom styling.\n */\n mask?: boolean | { style?: Record<string, string>; color?: string };\n /** Gap between highlight box and target element. */\n gap?: BTourGapOptions;\n /** z-index of the tour popup and mask. @default 1070 */\n zIndex?: number;\n /** Enable keyboard navigation (ArrowLeft/Right, Escape). @default true */\n keyboard?: boolean;\n /** Scroll target into view. Pass options object or `false` to disable. */\n scrollIntoViewOptions?: boolean | BTourScrollIntoViewOptions;\n /** Container element for the tour popup. Defaults to `document.body`. */\n getPopupContainer?: () => HTMLElement;\n /** Custom close icon. `false` hides the close button. */\n closeIcon?: boolean | string;\n /** Disable pointer interaction on the highlighted region. @default false */\n disabledInteraction?: boolean;\n}>();\n\nconst emit = defineEmits<{\n /** Fired when the current step changes. */\n (e: 'change', current: number): void;\n /** Fired when the tour is closed (X button or Finish). */\n (e: 'close', current: number): void;\n /** Fires when open state changes (v-model:open). */\n (e: 'update:open', value: boolean): void;\n /** Fires when current step changes (v-model:current). */\n (e: 'update:current', value: number): void;\n /** Fired after the tour finishes (last step next). */\n (e: 'finish'): void;\n}>();\n\ndefineSlots<{\n /** Custom cover content for the tour step. */\n cover?(): unknown;\n /** Override indicator dots/numbers rendering. Receives `{ current, total }`. */\n indicatorsRender?(props: { current: number; total: number }): unknown;\n}>();\n\n// ─────────────────────────────────────────────\n// Internal state\n// ─────────────────────────────────────────────\nconst internalOpen = ref(false);\nconst internalCurrent = ref(defaultCurrent);\n\nconst isControlledOpen = computed(() => open !== undefined);\nconst isControlledCurrent = computed(() => current !== undefined);\n\nconst isOpen = computed(() => (isControlledOpen.value ? open! : internalOpen.value));\nconst currentStep = computed(() => (isControlledCurrent.value ? current! : internalCurrent.value));\n\n// ─────────────────────────────────────────────\n// Derived step data\n// ─────────────────────────────────────────────\nconst totalSteps = computed(() => steps.length);\n\nconst resolvedSteps = computed<BTourResolvedStep[]>(() =>\n steps.map((step, index) => {\n let resolvedTarget: HTMLElement | null = null;\n if (step.target) {\n if (typeof step.target === 'string') {\n resolvedTarget = document.querySelector<HTMLElement>(step.target);\n } else if (typeof step.target === 'function') {\n resolvedTarget = step.target();\n } else {\n resolvedTarget = step.target;\n }\n }\n return { ...step, resolvedTarget, index };\n }),\n);\n\nconst activeStep = computed<BTourResolvedStep | undefined>(\n () => resolvedSteps.value[currentStep.value],\n);\n\n/** Effective placement for the current step (step overrides tour-level). */\nconst effectivePlacement = computed(() => activeStep.value?.placement ?? placement);\n\n/** Effective arrow config for the current step. */\nconst effectiveArrow = computed(() => activeStep.value?.arrow ?? arrow);\n\nconst showArrow = computed(() => effectiveArrow.value !== false);\n\nconst arrowPointAtCenter = computed(\n () => typeof effectiveArrow.value === 'object' && effectiveArrow.value.pointAtCenter,\n);\n\n/** Effective type for the current step. */\nconst effectiveType = computed(() => activeStep.value?.type ?? type);\n\n/** Effective mask for the current step. */\nconst effectiveMask = computed(() => activeStep.value?.mask ?? mask);\n\nconst showMask = computed(() => effectiveMask.value !== false);\n\nconst maskColor = computed(() => {\n if (typeof effectiveMask.value === 'object' && effectiveMask.value.color) {\n return effectiveMask.value.color;\n }\n return undefined;\n});\n\n/** Whether to show the close button. */\nconst showCloseIcon = computed(() => {\n const stepClose = activeStep.value?.closeIcon;\n const val = stepClose !== undefined ? stepClose : closeIcon;\n return val !== false;\n});\n\n// ─────────────────────────────────────────────\n// Highlight box (target element spotlight)\n// ─────────────────────────────────────────────\ninterface HighlightRect {\n top: number;\n left: number;\n width: number;\n height: number;\n radius: number;\n}\n\nconst highlightRect = ref<HighlightRect | null>(null);\nconst popupStyle = ref<Record<string, string>>({});\n\nconst gapOffset = computed(() => {\n const o = gap?.offset ?? 6;\n return Array.isArray(o) ? o : [o, o];\n});\nconst gapRadius = computed(() => gap?.radius ?? 2);\n\nfunction updateHighlight() {\n const step = activeStep.value;\n if (!step || !isOpen.value) {\n highlightRect.value = null;\n popupStyle.value = {};\n return;\n }\n\n const target = step.resolvedTarget;\n if (!target) {\n // Center the popup when no target\n highlightRect.value = null;\n popupStyle.value = {\n position: 'fixed',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n };\n return;\n }\n\n const rect = target.getBoundingClientRect();\n const [offsetV, offsetH] = gapOffset.value;\n highlightRect.value = {\n top: rect.top - offsetV,\n left: rect.left - offsetH,\n width: rect.width + offsetH * 2,\n height: rect.height + offsetV * 2,\n radius: gapRadius.value,\n };\n\n // Position the popup relative to the highlight\n computePopupStyle(rect);\n}\n\nfunction computePopupStyle(rect: DOMRect) {\n const GAP = 12;\n const eff = effectivePlacement.value;\n const style: Record<string, string> = { position: 'fixed' };\n const [offsetV, offsetH] = gapOffset.value;\n\n const top = rect.top - offsetV;\n const bottom = rect.bottom + offsetV;\n const left = rect.left - offsetH;\n const right = rect.right + offsetH;\n const midX = rect.left + rect.width / 2;\n const midY = rect.top + rect.height / 2;\n\n switch (eff) {\n case BTourPlacement.Top:\n style.bottom = `${window.innerHeight - top + GAP}px`;\n style.left = `${midX}px`;\n style.transform = 'translateX(-50%)';\n break;\n case BTourPlacement.TopLeft:\n style.bottom = `${window.innerHeight - top + GAP}px`;\n style.left = `${left}px`;\n break;\n case BTourPlacement.TopRight:\n style.bottom = `${window.innerHeight - top + GAP}px`;\n style.right = `${window.innerWidth - right}px`;\n break;\n case BTourPlacement.Bottom:\n style.top = `${bottom + GAP}px`;\n style.left = `${midX}px`;\n style.transform = 'translateX(-50%)';\n break;\n case BTourPlacement.BottomLeft:\n style.top = `${bottom + GAP}px`;\n style.left = `${left}px`;\n break;\n case BTourPlacement.BottomRight:\n style.top = `${bottom + GAP}px`;\n style.right = `${window.innerWidth - right}px`;\n break;\n case BTourPlacement.Left:\n style.top = `${midY}px`;\n style.right = `${window.innerWidth - left + GAP}px`;\n style.transform = 'translateY(-50%)';\n break;\n case BTourPlacement.LeftTop:\n style.top = `${top}px`;\n style.right = `${window.innerWidth - left + GAP}px`;\n break;\n case BTourPlacement.LeftBottom:\n style.bottom = `${window.innerHeight - bottom}px`;\n style.right = `${window.innerWidth - left + GAP}px`;\n break;\n case BTourPlacement.Right:\n style.top = `${midY}px`;\n style.left = `${right + GAP}px`;\n style.transform = 'translateY(-50%)';\n break;\n case BTourPlacement.RightTop:\n style.top = `${top}px`;\n style.left = `${right + GAP}px`;\n break;\n case BTourPlacement.RightBottom:\n style.bottom = `${window.innerHeight - bottom}px`;\n style.left = `${right + GAP}px`;\n break;\n case BTourPlacement.Center:\n style.top = '50%';\n style.left = '50%';\n style.transform = 'translate(-50%, -50%)';\n break;\n default:\n style.top = `${bottom + GAP}px`;\n style.left = `${midX}px`;\n style.transform = 'translateX(-50%)';\n }\n\n popupStyle.value = style;\n}\n\n// ─────────────────────────────────────────────\n// Arrow positioning class\n// ─────────────────────────────────────────────\nconst arrowClass = computed(() => {\n if (!showArrow.value) return '';\n const eff = effectivePlacement.value;\n\n if (\n [BTourPlacement.Bottom, BTourPlacement.BottomLeft, BTourPlacement.BottomRight].includes(\n eff as BTourPlacement,\n )\n ) {\n return 'b-tour__arrow--top';\n }\n if (\n [BTourPlacement.Top, BTourPlacement.TopLeft, BTourPlacement.TopRight].includes(\n eff as BTourPlacement,\n )\n ) {\n return 'b-tour__arrow--bottom';\n }\n if (\n [BTourPlacement.Right, BTourPlacement.RightTop, BTourPlacement.RightBottom].includes(\n eff as BTourPlacement,\n )\n ) {\n return 'b-tour__arrow--left';\n }\n if (\n [BTourPlacement.Left, BTourPlacement.LeftTop, BTourPlacement.LeftBottom].includes(\n eff as BTourPlacement,\n )\n ) {\n return 'b-tour__arrow--right';\n }\n return '';\n});\n\n// ─────────────────────────────────────────────\n// Open / close helpers\n// ─────────────────────────────────────────────\nfunction doClose() {\n emit('close', currentStep.value);\n if (isControlledOpen.value) {\n emit('update:open', false);\n } else {\n internalOpen.value = false;\n }\n}\n\nfunction setCurrentStep(step: number) {\n emit('change', step);\n if (isControlledCurrent.value) {\n emit('update:current', step);\n } else {\n internalCurrent.value = step;\n }\n}\n\nfunction goNext() {\n if (currentStep.value >= totalSteps.value - 1) {\n emit('finish');\n doClose();\n return;\n }\n setCurrentStep(currentStep.value + 1);\n}\n\nfunction goPrev() {\n if (currentStep.value <= 0) return;\n setCurrentStep(currentStep.value - 1);\n}\n\n// ─────────────────────────────────────────────\n// Scroll target into view\n// ─────────────────────────────────────────────\nfunction scrollIntoView(el: HTMLElement) {\n const opt = activeStep.value?.scrollIntoViewOptions ?? scrollIntoViewOptions;\n if (opt === false) return;\n const options: ScrollIntoViewOptions =\n typeof opt === 'object'\n ? (opt as ScrollIntoViewOptions)\n : { behavior: 'smooth', block: 'center', inline: 'nearest' };\n el.scrollIntoView(options);\n}\n\n// ─────────────────────────────────────────────\n// Focus management\n// ─────────────────────────────────────────────\nlet previouslyFocused: HTMLElement | null = null;\nconst popupRef = ref<HTMLDivElement | null>(null);\n\nconst focusableSelector =\n 'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nfunction focusFirst() {\n nextTick(() => {\n if (!popupRef.value) return;\n const first = popupRef.value.querySelector<HTMLElement>(focusableSelector);\n if (first) {\n first.focus();\n } else {\n popupRef.value.focus();\n }\n });\n}\n\nfunction trapFocus(e: KeyboardEvent) {\n if (e.key !== 'Tab' || !popupRef.value) return;\n const focusable = Array.from(popupRef.value.querySelectorAll<HTMLElement>(focusableSelector));\n if (focusable.length === 0) {\n e.preventDefault();\n return;\n }\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n}\n\n// ─────────────────────────────────────────────\n// Keyboard navigation\n// ─────────────────────────────────────────────\nfunction onKeydown(e: KeyboardEvent) {\n if (!keyboard) return;\n if (e.key === 'Escape') {\n e.preventDefault();\n doClose();\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n goNext();\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n goPrev();\n }\n trapFocus(e);\n}\n\n// ─────────────────────────────────────────────\n// Resize / scroll → update highlight\n// ─────────────────────────────────────────────\nlet resizeObserver: ResizeObserver | null = null;\nlet targetObserver: ResizeObserver | null = null;\n\nfunction observeTarget(el: HTMLElement | null) {\n targetObserver?.disconnect();\n if (!el) return;\n targetObserver = new ResizeObserver(updateHighlight);\n targetObserver.observe(el);\n}\n\nfunction onScrollOrResize() {\n if (isOpen.value) updateHighlight();\n}\n\nonMounted(() => {\n resizeObserver = new ResizeObserver(onScrollOrResize);\n resizeObserver.observe(document.documentElement);\n window.addEventListener('scroll', onScrollOrResize, { passive: true });\n});\n\nonBeforeUnmount(() => {\n resizeObserver?.disconnect();\n targetObserver?.disconnect();\n window.removeEventListener('scroll', onScrollOrResize);\n});\n\n// ─────────────────────────────────────────────\n// Watchers\n// ─────────────────────────────────────────────\nwatch(\n [isOpen, currentStep],\n ([open]) => {\n if (!open) {\n highlightRect.value = null;\n popupStyle.value = {};\n targetObserver?.disconnect();\n nextTick(() => previouslyFocused?.focus());\n return;\n }\n const step = resolvedSteps.value[currentStep.value];\n if (step?.resolvedTarget) {\n scrollIntoView(step.resolvedTarget);\n observeTarget(step.resolvedTarget);\n }\n nextTick(() => {\n updateHighlight();\n if (open) {\n previouslyFocused = document.activeElement as HTMLElement | null;\n focusFirst();\n }\n });\n },\n { immediate: true, flush: 'post' },\n);\n\n// ─────────────────────────────────────────────\n// SVG mask clip-path (spotlight cutout)\n// ─────────────────────────────────────────────\nconst maskId = `b-tour-mask-${Math.random().toString(36).slice(2, 9)}`;\n\nconst svgViewBox = computed(() => {\n const vw = typeof window !== 'undefined' ? window.innerWidth : 1440;\n const vh = typeof window !== 'undefined' ? window.innerHeight : 900;\n return `0 0 ${vw} ${vh}`;\n});\n\nconst maskStyle = computed<Record<string, string>>(() => {\n if (typeof effectiveMask.value === 'object' && effectiveMask.value.style) {\n return effectiveMask.value.style;\n }\n return {};\n});\n\n// ─────────────────────────────────────────────\n// Cover image helpers\n// ─────────────────────────────────────────────\nconst hasCover = computed(() => Boolean(activeStep.value?.cover));\n\nfunction stripBtnProps(props: BTourButtonProps | undefined) {\n if (!props) return {};\n const { onClick: _onClick, children: _children, ...rest } = props;\n return rest;\n}\n</script>\n\n<template>\n <Teleport to=\"body\">\n <Transition name=\"b-tour-fade\">\n <div\n v-if=\"isOpen && totalSteps > 0\"\n class=\"b-tour\"\n :class=\"[`b-tour--${effectiveType}`]\"\n :style=\"{ '--b-tour-z-index': String(zIndex) }\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-label=\"activeStep?.title\"\n >\n <!-- ── Mask overlay (SVG spotlight) ── -->\n <svg\n v-if=\"showMask\"\n class=\"b-tour__mask\"\n :style=\"[{ zIndex: zIndex - 1 }, maskStyle]\"\n xmlns=\"http://www.w3.org/2000/svg\"\n :viewBox=\"svgViewBox\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <defs>\n <mask :id=\"maskId\">\n <!-- White = visible (full viewport) -->\n <rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"white\" />\n <!-- Black = transparent cutout (target spotlight) -->\n <rect\n v-if=\"highlightRect\"\n :x=\"highlightRect.left\"\n :y=\"highlightRect.top\"\n :width=\"highlightRect.width\"\n :height=\"highlightRect.height\"\n :rx=\"highlightRect.radius\"\n fill=\"black\"\n />\n </mask>\n </defs>\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n :fill=\"maskColor ?? 'var(--b-tour-mask-bg)'\"\n :mask=\"`url(#${maskId})`\"\n :style=\"{ pointerEvents: disabledInteraction ? 'all' : 'none' }\"\n />\n </svg>\n\n <!-- ── Highlight border around target ── -->\n <div\n v-if=\"highlightRect\"\n class=\"b-tour__spotlight\"\n :style=\"{\n top: `${highlightRect.top}px`,\n left: `${highlightRect.left}px`,\n width: `${highlightRect.width}px`,\n height: `${highlightRect.height}px`,\n borderRadius: `${highlightRect.radius}px`,\n zIndex: zIndex - 1,\n pointerEvents: disabledInteraction ? 'none' : 'auto',\n }\"\n aria-hidden=\"true\"\n />\n\n <!-- ── Popup card ── -->\n <div\n ref=\"popupRef\"\n class=\"b-tour__popup\"\n :class=\"[\n `b-tour__popup--${effectivePlacement}`,\n { 'b-tour__popup--no-arrow': !showArrow || !highlightRect },\n ]\"\n :style=\"[{ zIndex }, popupStyle]\"\n tabindex=\"-1\"\n @keydown=\"onKeydown\"\n >\n <!-- Arrow -->\n <div\n v-if=\"showArrow && highlightRect && arrowClass\"\n class=\"b-tour__arrow\"\n :class=\"[arrowClass, { 'b-tour__arrow--center': arrowPointAtCenter }]\"\n aria-hidden=\"true\"\n />\n\n <!-- Cover media -->\n <div v-if=\"hasCover\" class=\"b-tour__cover\">\n <img\n v-if=\"typeof activeStep?.cover === 'string'\"\n :src=\"activeStep.cover\"\n class=\"b-tour__cover-img\"\n alt=\"\"\n aria-hidden=\"true\"\n />\n <slot v-else name=\"cover\" />\n </div>\n\n <!-- Header -->\n <div class=\"b-tour__header\">\n <h4 class=\"b-tour__title\">\n {{ activeStep?.title }}\n </h4>\n\n <!-- Close button -->\n <button\n v-if=\"showCloseIcon\"\n type=\"button\"\n class=\"b-tour__close\"\n aria-label=\"Close tour\"\n @click=\"doClose\"\n >\n <svg\n v-if=\"\n closeIcon === true ||\n activeStep?.closeIcon === true ||\n activeStep?.closeIcon === undefined\n \"\n class=\"b-tour__close-icon\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n />\n </svg>\n <span v-else>{{ typeof closeIcon === 'string' ? closeIcon : '✕' }}</span>\n </button>\n </div>\n\n <!-- Description -->\n <div v-if=\"activeStep?.description\" class=\"b-tour__description\">\n {{ activeStep.description }}\n </div>\n\n <!-- Footer -->\n <div class=\"b-tour__footer\">\n <!-- Indicators -->\n <div class=\"b-tour__indicators\" aria-label=\"Step progress\">\n <slot name=\"indicatorsRender\" :current=\"currentStep\" :total=\"totalSteps\">\n <span\n v-for=\"(_, i) in steps\"\n :key=\"i\"\n class=\"b-tour__indicator\"\n :class=\"{ 'b-tour__indicator--active': i === currentStep }\"\n role=\"presentation\"\n :aria-current=\"i === currentStep ? 'step' : undefined\"\n />\n </slot>\n </div>\n\n <!-- Actions -->\n <div class=\"b-tour__actions\">\n <!-- Prev button -->\n <button\n v-if=\"currentStep > 0\"\n type=\"button\"\n class=\"b-tour__btn b-tour__btn--prev\"\n v-bind=\"stripBtnProps(activeStep?.prevButtonProps)\"\n @click=\"\n () => {\n activeStep?.prevButtonProps?.onClick?.();\n goPrev();\n }\n \"\n >\n {{ activeStep?.prevButtonProps?.children ?? 'Previous' }}\n </button>\n\n <!-- Next / Finish button -->\n <button\n type=\"button\"\n class=\"b-tour__btn b-tour__btn--next\"\n v-bind=\"stripBtnProps(activeStep?.nextButtonProps)\"\n @click=\"\n () => {\n activeStep?.nextButtonProps?.onClick?.();\n goNext();\n }\n \"\n >\n {{\n activeStep?.nextButtonProps?.children ??\n (currentStep >= totalSteps - 1 ? 'Finish' : 'Next')\n }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n\n<style>\n/* ────────────────────────────────────────────\n Design tokens - scoped to component root\n (Never on :root - always on .b-tour)\n ──────────────────────────────────────────── */\n.b-tour {\n /* AntD token: zIndexPopup → 1070 */\n --b-tour-z-index: 1070;\n\n /* AntD token: closeBtnSize → 22px */\n --b-tour-close-btn-size: 22px;\n\n /* AntD token: primaryNextBtnHoverBg → rgb(240,240,240) */\n --b-tour-primary-next-btn-hover-bg: rgb(240, 240, 240);\n\n /* AntD token: primaryPrevBtnBg → rgba(255,255,255,0.15) */\n --b-tour-primary-prev-btn-bg: rgba(255, 255, 255, 0.15);\n\n /* Extended tokens for full component coverage */\n --b-tour-popup-bg: #fff;\n --b-tour-popup-color: oklch(25% 0 0);\n --b-tour-popup-font-size: 0.875rem;\n --b-tour-popup-line-height: 1.5;\n --b-tour-popup-border-radius: 0.5rem;\n --b-tour-popup-max-width: 320px;\n --b-tour-popup-min-width: 220px;\n --b-tour-popup-padding: 1rem;\n --b-tour-popup-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n\n --b-tour-title-font-size: 1rem;\n --b-tour-title-font-weight: 600;\n --b-tour-title-color: oklch(15% 0 0);\n\n --b-tour-description-color: oklch(35% 0 0);\n --b-tour-description-font-size: 0.875rem;\n\n --b-tour-mask-bg: rgba(0, 0, 0, 0.45);\n\n --b-tour-arrow-size: 10px;\n --b-tour-arrow-bg: #fff;\n\n --b-tour-indicator-size: 6px;\n --b-tour-indicator-bg: oklch(80% 0 0);\n --b-tour-indicator-active-bg: oklch(55% 0.169 237.323); /* primary */\n\n --b-tour-btn-font-size: 0.875rem;\n --b-tour-btn-border-radius: 0.375rem;\n --b-tour-btn-padding: 0.25rem 0.75rem;\n\n --b-tour-next-btn-bg: oklch(55% 0.169 237.323);\n --b-tour-next-btn-color: #fff;\n --b-tour-next-btn-hover-bg: oklch(48% 0.158 241.966);\n\n --b-tour-prev-btn-bg: transparent;\n --b-tour-prev-btn-color: oklch(35% 0 0);\n --b-tour-prev-btn-border: 1px solid oklch(80% 0 0);\n --b-tour-prev-btn-hover-bg: oklch(96% 0 0);\n\n --b-tour-close-color: oklch(55% 0 0);\n --b-tour-close-hover-color: oklch(25% 0 0);\n\n --b-tour-cover-border-radius: 0.5rem 0.5rem 0 0;\n\n --b-tour-transition-duration: 250ms;\n\n /* Primary type overrides */\n --b-tour-primary-popup-bg: oklch(55% 0.169 237.323);\n --b-tour-primary-title-color: #fff;\n --b-tour-primary-description-color: rgba(255, 255, 255, 0.85);\n --b-tour-primary-close-color: rgba(255, 255, 255, 0.75);\n --b-tour-primary-close-hover-color: #fff;\n --b-tour-primary-indicator-bg: rgba(255, 255, 255, 0.4);\n --b-tour-primary-indicator-active-bg: #fff;\n --b-tour-primary-arrow-bg: oklch(55% 0.169 237.323);\n}\n\n/* ── Dark mode ── */\n[data-prefers-color='dark'] .b-tour {\n --b-tour-popup-bg: oklch(22% 0 0);\n --b-tour-popup-color: oklch(90% 0 0);\n --b-tour-popup-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 3px 6px -4px rgba(0, 0, 0, 0.48),\n 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n --b-tour-title-color: oklch(95% 0 0);\n --b-tour-description-color: oklch(72% 0 0);\n --b-tour-mask-bg: rgba(0, 0, 0, 0.65);\n --b-tour-arrow-bg: oklch(22% 0 0);\n --b-tour-indicator-bg: oklch(40% 0 0);\n --b-tour-prev-btn-color: oklch(85% 0 0);\n --b-tour-prev-btn-border: 1px solid oklch(35% 0 0);\n --b-tour-prev-btn-hover-bg: oklch(30% 0 0);\n --b-tour-close-color: oklch(65% 0 0);\n --b-tour-close-hover-color: oklch(90% 0 0);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-tour {\n --b-tour-popup-bg: oklch(22% 0 0);\n --b-tour-popup-color: oklch(90% 0 0);\n --b-tour-popup-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 3px 6px -4px rgba(0, 0, 0, 0.48),\n 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n --b-tour-title-color: oklch(95% 0 0);\n --b-tour-description-color: oklch(72% 0 0);\n --b-tour-mask-bg: rgba(0, 0, 0, 0.65);\n --b-tour-arrow-bg: oklch(22% 0 0);\n --b-tour-indicator-bg: oklch(40% 0 0);\n --b-tour-prev-btn-color: oklch(85% 0 0);\n --b-tour-prev-btn-border: 1px solid oklch(35% 0 0);\n --b-tour-prev-btn-hover-bg: oklch(30% 0 0);\n --b-tour-close-color: oklch(65% 0 0);\n --b-tour-close-hover-color: oklch(90% 0 0);\n }\n}\n\n/* ─────────────────────────────────────────────\n Tour container (fullscreen overlay wrapper)\n ───────────────────────────────────────────── */\n.b-tour {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: var(--b-tour-z-index);\n}\n\n/* ─────────────────────────────────────────────\n Mask (SVG spotlight overlay)\n ───────────────────────────────────────────── */\n.b-tour__mask {\n position: fixed;\n inset: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n}\n\n/* ─────────────────────────────────────────────\n Spotlight border ring\n ───────────────────────────────────────────── */\n.b-tour__spotlight {\n position: fixed;\n box-shadow: 0 0 0 9999px transparent;\n box-sizing: border-box;\n pointer-events: auto;\n}\n\n/* ─────────────────────────────────────────────\n Popup card\n ───────────────────────────────────────────── */\n.b-tour__popup {\n position: fixed;\n background: var(--b-tour-popup-bg);\n color: var(--b-tour-popup-color);\n font-size: var(--b-tour-popup-font-size);\n line-height: var(--b-tour-popup-line-height);\n border-radius: var(--b-tour-popup-border-radius);\n box-shadow: var(--b-tour-popup-shadow);\n max-width: var(--b-tour-popup-max-width);\n min-width: var(--b-tour-popup-min-width);\n width: max-content;\n box-sizing: border-box;\n pointer-events: auto;\n outline: none;\n}\n\n/* ─────────────────────────────────────────────\n Arrow\n ───────────────────────────────────────────── */\n.b-tour__arrow {\n position: absolute;\n width: var(--b-tour-arrow-size);\n height: var(--b-tour-arrow-size);\n background: var(--b-tour-arrow-bg);\n transform: rotate(45deg);\n pointer-events: none;\n z-index: 1;\n}\n\n/* Arrow positions: which edge of the popup the arrow sits on */\n.b-tour__arrow--top {\n top: calc(var(--b-tour-arrow-size) / -2);\n left: 50%;\n margin-left: calc(var(--b-tour-arrow-size) / -2);\n}\n.b-tour__arrow--bottom {\n bottom: calc(var(--b-tour-arrow-size) / -2);\n left: 50%;\n margin-left: calc(var(--b-tour-arrow-size) / -2);\n}\n.b-tour__arrow--left {\n left: calc(var(--b-tour-arrow-size) / -2);\n top: 50%;\n margin-top: calc(var(--b-tour-arrow-size) / -2);\n}\n.b-tour__arrow--right {\n right: calc(var(--b-tour-arrow-size) / -2);\n top: 50%;\n margin-top: calc(var(--b-tour-arrow-size) / -2);\n}\n\n/* Center arrow along axis */\n.b-tour__arrow--center {\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n}\n\n/* ─────────────────────────────────────────────\n Cover image\n ───────────────────────────────────────────── */\n.b-tour__cover {\n border-radius: var(--b-tour-cover-border-radius);\n overflow: hidden;\n margin: 0;\n}\n\n.b-tour__cover-img {\n display: block;\n width: 100%;\n height: auto;\n object-fit: cover;\n}\n\n/* ─────────────────────────────────────────────\n Header (title + close)\n ───────────────────────────────────────────── */\n.b-tour__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 0.5rem;\n padding: var(--b-tour-popup-padding) var(--b-tour-popup-padding) 0;\n}\n\n.b-tour__title {\n flex: 1;\n margin: 0;\n font-size: var(--b-tour-title-font-size);\n font-weight: var(--b-tour-title-font-weight);\n color: var(--b-tour-title-color);\n line-height: 1.4;\n}\n\n/* ─────────────────────────────────────────────\n Close button\n ───────────────────────────────────────────── */\n.b-tour__close {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--b-tour-close-btn-size);\n height: var(--b-tour-close-btn-size);\n padding: 0;\n margin-top: 0.1em;\n border: none;\n border-radius: 0.25rem;\n background: transparent;\n color: var(--b-tour-close-color);\n cursor: pointer;\n transition: color var(--b-tour-transition-duration) ease;\n}\n\n.b-tour__close:hover {\n color: var(--b-tour-close-hover-color);\n}\n\n.b-tour__close:focus-visible {\n outline: 2px solid var(--b-tour-next-btn-bg);\n outline-offset: 2px;\n}\n\n.b-tour__close-icon {\n width: 1em;\n height: 1em;\n fill: currentColor;\n display: block;\n}\n\n/* ─────────────────────────────────────────────\n Description\n ───────────────────────────────────────────── */\n.b-tour__description {\n padding: 0.5rem var(--b-tour-popup-padding);\n font-size: var(--b-tour-description-font-size);\n color: var(--b-tour-description-color);\n line-height: var(--b-tour-popup-line-height);\n}\n\n/* ─────────────────────────────────────────────\n Footer (indicators + actions)\n ───────────────────────────────────────────── */\n.b-tour__footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem var(--b-tour-popup-padding) var(--b-tour-popup-padding);\n gap: 0.75rem;\n}\n\n/* ── Indicators ── */\n.b-tour__indicators {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n flex-wrap: wrap;\n}\n\n.b-tour__indicator {\n display: inline-block;\n width: var(--b-tour-indicator-size);\n height: var(--b-tour-indicator-size);\n border-radius: 50%;\n background: var(--b-tour-indicator-bg);\n transition:\n background var(--b-tour-transition-duration) ease,\n width var(--b-tour-transition-duration) ease;\n}\n\n.b-tour__indicator--active {\n background: var(--b-tour-indicator-active-bg);\n width: calc(var(--b-tour-indicator-size) * 2.5);\n border-radius: calc(var(--b-tour-indicator-size) / 2);\n}\n\n/* ── Actions ── */\n.b-tour__actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-left: auto;\n}\n\n/* ── Buttons ── */\n.b-tour__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--b-tour-btn-padding);\n border-radius: var(--b-tour-btn-border-radius);\n font-size: var(--b-tour-btn-font-size);\n font-weight: 500;\n cursor: pointer;\n transition:\n background var(--b-tour-transition-duration) ease,\n color var(--b-tour-transition-duration) ease;\n white-space: nowrap;\n}\n\n.b-tour__btn:focus-visible {\n outline: 2px solid var(--b-tour-next-btn-bg);\n outline-offset: 2px;\n}\n\n.b-tour__btn--prev {\n background: var(--b-tour-prev-btn-bg);\n color: var(--b-tour-prev-btn-color);\n border: var(--b-tour-prev-btn-border);\n}\n\n.b-tour__btn--prev:hover {\n background: var(--b-tour-prev-btn-hover-bg);\n}\n\n.b-tour__btn--next {\n background: var(--b-tour-next-btn-bg);\n color: var(--b-tour-next-btn-color);\n border: none;\n}\n\n.b-tour__btn--next:hover {\n background: var(--b-tour-next-btn-hover-bg);\n}\n\n/* ─────────────────────────────────────────────\n Primary type variant\n ───────────────────────────────────────────── */\n.b-tour--primary .b-tour__popup {\n background: var(--b-tour-primary-popup-bg);\n}\n\n.b-tour--primary .b-tour__title {\n color: var(--b-tour-primary-title-color);\n}\n\n.b-tour--primary .b-tour__description {\n color: var(--b-tour-primary-description-color);\n}\n\n.b-tour--primary .b-tour__close {\n color: var(--b-tour-primary-close-color);\n}\n\n.b-tour--primary .b-tour__close:hover {\n color: var(--b-tour-primary-close-hover-color);\n}\n\n.b-tour--primary .b-tour__indicator {\n background: var(--b-tour-primary-indicator-bg);\n}\n\n.b-tour--primary .b-tour__indicator--active {\n background: var(--b-tour-primary-indicator-active-bg);\n}\n\n.b-tour--primary .b-tour__arrow {\n background: var(--b-tour-primary-arrow-bg);\n}\n\n.b-tour--primary .b-tour__btn--prev {\n background: var(--b-tour-primary-prev-btn-bg);\n color: #fff;\n border: 1px solid rgba(255, 255, 255, 0.4);\n}\n\n.b-tour--primary .b-tour__btn--prev:hover {\n background: rgba(255, 255, 255, 0.25);\n}\n\n.b-tour--primary .b-tour__btn--next {\n background: #fff;\n color: oklch(55% 0.169 237.323);\n}\n\n.b-tour--primary .b-tour__btn--next:hover {\n background: var(--b-tour-primary-next-btn-hover-bg);\n}\n\n/* ─────────────────────────────────────────────\n Transition\n ───────────────────────────────────────────── */\n.b-tour-fade-enter-active,\n.b-tour-fade-leave-active {\n transition: opacity var(--b-tour-transition-duration) ease;\n}\n\n.b-tour-fade-enter-from,\n.b-tour-fade-leave-to {\n opacity: 0;\n}\n\n/* ── Reduced motion ── */\n@media (prefers-reduced-motion: reduce) {\n .b-tour-fade-enter-active,\n .b-tour-fade-leave-active {\n transition-duration: 0ms;\n }\n\n .b-tour__indicator,\n .b-tour__btn,\n .b-tour__close {\n transition-duration: 0ms;\n }\n}\n</style>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"design-system216.js","names":[],"sources":["../src/components/BTimePicker/types.ts"],"sourcesContent":["export enum BTimePickerSize {\n Small = 'sm',\n Medium = 'md',\n Large = 'lg',\n}\n\nexport enum BTimePickerVariant {\n Outlined = 'outlined',\n Filled = 'filled',\n Borderless = 'borderless',\n Underlined = 'underlined',\n}\n\nexport enum BTimePickerStatus {\n Error = 'error',\n Warning = 'warning',\n}\n\nexport enum BTimePickerPlacement {\n BottomLeft = 'bottom-left',\n BottomRight = 'bottom-right',\n TopLeft = 'top-left',\n TopRight = 'top-right',\n}\n\nexport interface BTimePickerDisabledTime {\n disabledHours?: () => number[];\n disabledMinutes?: (hour: number) => number[];\n disabledSeconds?: (hour: number, minute: number) => number[];\n}\n"],"mappings":";AAAA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,QAAA,MACA,EAAA,SAAA,MACA,EAAA,QAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,WAAA,YACA,EAAA,SAAA,UACA,EAAA,aAAA,cACA,EAAA,aAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,QAAA,SACA,EAAA,UAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,aAAA,eACA,EAAA,cAAA,gBACA,EAAA,UAAA,YACA,EAAA,WAAA;KACD"}
|