@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.
Files changed (126) hide show
  1. package/dist/design-system.css +1 -1
  2. package/dist/design-system.js +24 -16
  3. package/dist/design-system177.js +29 -326
  4. package/dist/design-system177.js.map +1 -1
  5. package/dist/design-system179.js +1 -1
  6. package/dist/design-system179.js.map +1 -1
  7. package/dist/design-system180.js +73 -85
  8. package/dist/design-system180.js.map +1 -1
  9. package/dist/design-system182.js +1 -1
  10. package/dist/design-system182.js.map +1 -1
  11. package/dist/design-system183.js +32 -105
  12. package/dist/design-system183.js.map +1 -1
  13. package/dist/design-system185.js +4 -5
  14. package/dist/design-system185.js.map +1 -1
  15. package/dist/design-system186.js +26 -104
  16. package/dist/design-system186.js.map +1 -1
  17. package/dist/design-system188.js +4 -5
  18. package/dist/design-system188.js.map +1 -1
  19. package/dist/design-system189.js +23 -727
  20. package/dist/design-system189.js.map +1 -1
  21. package/dist/design-system191.js +1 -1
  22. package/dist/design-system191.js.map +1 -1
  23. package/dist/design-system192.js +31 -11
  24. package/dist/design-system192.js.map +1 -1
  25. package/dist/design-system194.js +8 -0
  26. package/dist/design-system194.js.map +1 -0
  27. package/dist/design-system195.js +332 -5
  28. package/dist/design-system195.js.map +1 -1
  29. package/dist/design-system197.js +5 -46
  30. package/dist/design-system197.js.map +1 -1
  31. package/dist/design-system198.js +100 -4
  32. package/dist/design-system198.js.map +1 -1
  33. package/dist/design-system200.js +8 -0
  34. package/dist/design-system200.js.map +1 -0
  35. package/dist/design-system201.js +19 -5
  36. package/dist/design-system201.js.map +1 -1
  37. package/dist/design-system202.js +4 -119
  38. package/dist/design-system202.js.map +1 -1
  39. package/dist/design-system203.js +6 -0
  40. package/dist/design-system203.js.map +1 -0
  41. package/dist/design-system204.js +419 -5
  42. package/dist/design-system204.js.map +1 -1
  43. package/dist/design-system206.js +8 -0
  44. package/dist/design-system206.js.map +1 -0
  45. package/dist/design-system207.js +108 -5
  46. package/dist/design-system207.js.map +1 -1
  47. package/dist/design-system209.js +6 -4
  48. package/dist/design-system209.js.map +1 -1
  49. package/dist/design-system210.js +90 -154
  50. package/dist/design-system210.js.map +1 -1
  51. package/dist/design-system212.js +5 -4
  52. package/dist/design-system212.js.map +1 -1
  53. package/dist/design-system213.js +737 -7
  54. package/dist/design-system213.js.map +1 -1
  55. package/dist/design-system215.js +8 -0
  56. package/dist/design-system215.js.map +1 -0
  57. package/dist/design-system216.js +11 -5
  58. package/dist/design-system216.js.map +1 -1
  59. package/dist/design-system217.js +451 -506
  60. package/dist/design-system217.js.map +1 -1
  61. package/dist/design-system219.js +4 -5
  62. package/dist/design-system219.js.map +1 -1
  63. package/dist/design-system220.js +3 -7
  64. package/dist/design-system220.js.map +1 -1
  65. package/dist/design-system221.js +41 -369
  66. package/dist/design-system221.js.map +1 -1
  67. package/dist/design-system222.js +7 -0
  68. package/dist/design-system222.js.map +1 -0
  69. package/dist/design-system223.js +283 -6
  70. package/dist/design-system223.js.map +1 -1
  71. package/dist/design-system225.js +8 -0
  72. package/dist/design-system225.js.map +1 -0
  73. package/dist/design-system226.js +122 -0
  74. package/dist/design-system226.js.map +1 -0
  75. package/dist/design-system228.js +8 -0
  76. package/dist/design-system228.js.map +1 -0
  77. package/dist/{design-system205.js → design-system229.js} +1 -1
  78. package/dist/{design-system205.js.map → design-system229.js.map} +1 -1
  79. package/dist/design-system231.js +8 -0
  80. package/dist/design-system231.js.map +1 -0
  81. package/dist/{design-system208.js → design-system232.js} +1 -1
  82. package/dist/{design-system208.js.map → design-system232.js.map} +1 -1
  83. package/dist/design-system233.js +7 -0
  84. package/dist/design-system233.js.map +1 -0
  85. package/dist/design-system234.js +173 -0
  86. package/dist/design-system234.js.map +1 -0
  87. package/dist/design-system236.js +8 -0
  88. package/dist/design-system236.js.map +1 -0
  89. package/dist/design-system237.js +10 -0
  90. package/dist/design-system237.js.map +1 -0
  91. package/dist/{design-system214.js → design-system238.js} +2 -2
  92. package/dist/{design-system214.js.map → design-system238.js.map} +1 -1
  93. package/dist/design-system240.js +8 -0
  94. package/dist/design-system240.js.map +1 -0
  95. package/dist/design-system241.js +583 -0
  96. package/dist/design-system241.js.map +1 -0
  97. package/dist/design-system243.js +9 -0
  98. package/dist/design-system243.js.map +1 -0
  99. package/dist/design-system244.js +10 -0
  100. package/dist/design-system244.js.map +1 -0
  101. package/dist/design-system245.js +377 -0
  102. package/dist/design-system245.js.map +1 -0
  103. package/dist/design-system247.js +9 -0
  104. package/dist/design-system247.js.map +1 -0
  105. package/dist/types/components/BSkeleton/BSkeleton.spec.d.ts +1 -0
  106. package/dist/types/components/BSkeleton/BSkeleton.vue.d.ts +46 -0
  107. package/dist/types/components/BSkeleton/BSkeletonAvatar.vue.d.ts +12 -0
  108. package/dist/types/components/BSkeleton/BSkeletonButton.vue.d.ts +14 -0
  109. package/dist/types/components/BSkeleton/BSkeletonImage.vue.d.ts +7 -0
  110. package/dist/types/components/BSkeleton/BSkeletonInput.vue.d.ts +12 -0
  111. package/dist/types/components/BSkeleton/BSkeletonNode.vue.d.ts +19 -0
  112. package/dist/types/components/BSkeleton/index.d.ts +7 -0
  113. package/dist/types/components/BSkeleton/types.d.ts +20 -0
  114. package/dist/types/components/BSplitter/BSplitter.spec.d.ts +1 -0
  115. package/dist/types/components/BSplitter/BSplitter.vue.d.ts +45 -0
  116. package/dist/types/components/BSplitter/BSplitterPanel.vue.d.ts +40 -0
  117. package/dist/types/components/BSplitter/index.d.ts +3 -0
  118. package/dist/types/components/BSplitter/types.d.ts +42 -0
  119. package/dist/types/components/index.d.ts +2 -0
  120. package/package.json +1 -1
  121. package/dist/design-system193.js +0 -528
  122. package/dist/design-system193.js.map +0 -1
  123. package/dist/design-system196.js +0 -6
  124. package/dist/design-system196.js.map +0 -1
  125. package/dist/design-system199.js +0 -286
  126. package/dist/design-system199.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"design-system217.js","names":[],"sources":["../src/components/BTree/BTree.vue?vue&type=script&setup=true&lang.ts"],"sourcesContent":["import { defineComponent as _defineComponent } from 'vue'\nimport { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, createCommentVNode as _createCommentVNode, renderSlot as _renderSlot, withModifiers as _withModifiers, normalizeClass as _normalizeClass, withKeys as _withKeys, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, normalizeStyle as _normalizeStyle, createStaticVNode as _createStaticVNode } from \"vue\"\n\nconst _hoisted_1 = [\"aria-multiselectable\"]\nconst _hoisted_2 = [\"data-node-key\", \"aria-expanded\", \"aria-selected\", \"aria-checked\", \"aria-disabled\", \"aria-level\", \"tabindex\", \"draggable\", \"onClick\", \"onDblclick\", \"onContextmenu\", \"onDragstart\", \"onDragenter\", \"onDragover\", \"onDragleave\", \"onDragend\", \"onDrop\"]\nconst _hoisted_3 = {\n key: 0,\n class: \"b-tree__drag-handle\",\n \"aria-hidden\": \"true\"\n}\nconst _hoisted_4 = [\"onClick\"]\nconst _hoisted_5 = {\n key: 1,\n class: \"b-tree__switcher-icon b-tree__switcher-icon--spin\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"aria-hidden\": \"true\"\n}\nconst _hoisted_6 = {\n key: 2,\n class: \"b-tree__switcher b-tree__switcher--leaf\",\n \"aria-hidden\": \"true\"\n}\nconst _hoisted_7 = [\"aria-label\", \"aria-checked\", \"aria-disabled\", \"onClick\", \"onKeydown\"]\nconst _hoisted_8 = {\n key: 4,\n class: \"b-tree__icon\",\n \"aria-hidden\": \"true\"\n}\nconst _hoisted_9 = { key: 0 }\n\nimport { computed, nextTick, ref, watch } from 'vue';\nimport type {\n BTreeCheckedKeys,\n BTreeCheckInfo,\n BTreeDragInfo,\n BTreeDropInfo,\n BTreeExpandInfo,\n BTreeFieldNames,\n BTreeFlatNode,\n BTreeNodeData,\n BTreeNodeKey,\n BTreeScrollToOptions,\n BTreeSelectInfo,\n} from './types';\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\n\nexport default /*@__PURE__*/_defineComponent({\n __name: 'BTree',\n props: {\n treeData: { default: () => ([]) },\n fieldNames: { default: () => ({}) },\n checkable: { type: Boolean, default: false },\n checkStrictly: { type: Boolean, default: false },\n checkedKeys: { default: () => (undefined) },\n defaultCheckedKeys: { default: () => ([]) },\n selectedKeys: { default: () => (undefined) },\n defaultSelectedKeys: { default: () => ([]) },\n expandedKeys: { default: () => (undefined) },\n defaultExpandedKeys: { default: () => ([]) },\n defaultExpandAll: { type: Boolean, default: false },\n defaultExpandParent: { type: Boolean, default: true },\n autoExpandParent: { type: Boolean, default: false },\n multiple: { type: Boolean, default: false },\n selectable: { type: Boolean, default: true },\n disabled: { type: Boolean, default: false },\n showIcon: { type: Boolean, default: false },\n showLine: { type: Boolean, default: false },\n blockNode: { type: Boolean, default: false },\n draggable: { type: Boolean, default: false },\n loadData: { type: Function, default: undefined },\n loadedKeys: { default: () => (undefined) },\n filterTreeNode: { type: Function, default: undefined },\n height: { default: () => (undefined) },\n virtual: { type: Boolean, default: false },\n directory: { type: Boolean, default: false },\n expandAction: { type: [String, Boolean], default: 'click' }\n },\n emits: [\"check\", \"expand\", \"select\", \"load\", \"rightClick\", \"dragStart\", \"dragEnter\", \"dragOver\", \"dragLeave\", \"dragEnd\", \"drop\", \"dblclick\", \"update:checkedKeys\", \"update:selectedKeys\", \"update:expandedKeys\", \"update:loadedKeys\"],\n setup(__props: any, { expose: __expose, emit: __emit }) {\n\n\n\n// ─── Emits ────────────────────────────────────────────────────────────────────\n\nconst emit = __emit;\n\n// ─── Slots ────────────────────────────────────────────────────────────────────\n\n\n\n// ─── Resolved field names ─────────────────────────────────────────────────────\n\nconst fKey = computed(() => __props.fieldNames.key ?? 'key');\nconst fTitle = computed(() => __props.fieldNames.title ?? 'title');\nconst fChildren = computed(() => __props.fieldNames.children ?? 'children');\n\nfunction nodeKey(n: BTreeNodeData): BTreeNodeKey {\n return n[fKey.value] as BTreeNodeKey;\n}\nfunction nodeTitle(n: BTreeNodeData): string {\n return (n[fTitle.value] as string) ?? '';\n}\nfunction nodeChildren(n: BTreeNodeData): BTreeNodeData[] | undefined {\n return n[fChildren.value] as BTreeNodeData[] | undefined;\n}\n\n// ─── Internal state ───────────────────────────────────────────────────────────\n\nconst internalExpanded = ref<Set<BTreeNodeKey>>(new Set());\nconst internalSelected = ref<Set<BTreeNodeKey>>(new Set());\nconst internalChecked = ref<Set<BTreeNodeKey>>(new Set());\nconst internalHalfChecked = ref<Set<BTreeNodeKey>>(new Set());\nconst internalLoaded = ref<Set<BTreeNodeKey>>(new Set());\nconst loadingKeys = ref<Set<BTreeNodeKey>>(new Set());\nconst dragNodeKey = ref<BTreeNodeKey | null>(null);\n\n// Controlled getters\nconst isControlledExpanded = computed(() => __props.expandedKeys !== undefined);\nconst isControlledSelected = computed(() => __props.selectedKeys !== undefined);\nconst isControlledChecked = computed(() => __props.checkedKeys !== undefined);\nconst isControlledLoaded = computed(() => __props.loadedKeys !== undefined);\n\nconst activeExpanded = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledExpanded.value) return new Set(__props.expandedKeys);\n return internalExpanded.value;\n});\n\nconst activeSelected = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledSelected.value) return new Set(__props.selectedKeys);\n return internalSelected.value;\n});\n\nconst activeChecked = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledChecked.value) {\n const raw = __props.checkedKeys as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n if (Array.isArray(raw)) return new Set(raw);\n return new Set(raw.checked);\n }\n return internalChecked.value;\n});\n\nconst activeHalfChecked = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledChecked.value) {\n const raw = __props.checkedKeys as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n if (!Array.isArray(raw) && 'halfChecked' in raw) return new Set(raw.halfChecked);\n }\n return internalHalfChecked.value;\n});\n\nconst activeLoaded = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledLoaded.value) return new Set(__props.loadedKeys);\n return internalLoaded.value;\n});\n\n// ─── Flatten tree ─────────────────────────────────────────────────────────────\n\nfunction flattenTree(nodes: BTreeNodeData[], depth = 0, parentVisible = true): BTreeFlatNode[] {\n const result: BTreeFlatNode[] = [];\n for (const node of nodes) {\n const key = nodeKey(node);\n const isExpanded = activeExpanded.value.has(key);\n const visible = parentVisible;\n result.push({ key, data: node, depth, visible });\n const children = nodeChildren(node);\n if (children?.length) {\n result.push(...flattenTree(children, depth + 1, visible && isExpanded));\n }\n }\n return result;\n}\n\nconst flatNodes = computed(() => flattenTree(__props.treeData));\nconst visibleNodes = computed(() => flatNodes.value.filter((n) => n.visible));\n\n// ─── Mount: apply defaults ────────────────────────────────────────────────────\n\nfunction collectAllKeys(nodes: BTreeNodeData[]): BTreeNodeKey[] {\n const keys: BTreeNodeKey[] = [];\n for (const n of nodes) {\n keys.push(nodeKey(n));\n const children = nodeChildren(n);\n if (children?.length) keys.push(...collectAllKeys(children));\n }\n return keys;\n}\n\nfunction collectParentKeys(nodes: BTreeNodeData[], targetKeys: Set<BTreeNodeKey>): BTreeNodeKey[] {\n const parents: BTreeNodeKey[] = [];\n function walk(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n const children = nodeChildren(n);\n if (children?.length) {\n const hasDescendant = children.some(\n (c) => targetKeys.has(nodeKey(c)) || walk([c]) !== undefined,\n );\n if (hasDescendant) parents.push(nodeKey(n));\n walk(children);\n }\n }\n }\n walk(nodes);\n return parents;\n}\n\n// Initialise uncontrolled state once\nif (!isControlledExpanded.value) {\n if (__props.defaultExpandAll) {\n internalExpanded.value = new Set(\n collectAllKeys(__props.treeData).filter((k) => {\n const flat = flatNodes.value.find((n) => n.key === k);\n return flat ? !!nodeChildren(flat.data)?.length : false;\n }),\n );\n } else if (__props.defaultExpandedKeys.length) {\n const init = new Set<BTreeNodeKey>(__props.defaultExpandedKeys);\n if (__props.defaultExpandParent) {\n collectParentKeys(__props.treeData, init).forEach((k) => init.add(k));\n }\n internalExpanded.value = init;\n }\n}\nif (!isControlledSelected.value && __props.defaultSelectedKeys.length) {\n internalSelected.value = new Set(__props.defaultSelectedKeys);\n}\nif (!isControlledChecked.value && __props.defaultCheckedKeys.length) {\n internalChecked.value = new Set(__props.defaultCheckedKeys);\n if (!__props.checkStrictly) propagateChecks(internalChecked.value);\n}\n\n// Auto-expand parents when controlled expandedKeys change\nwatch(\n () => __props.expandedKeys,\n (keys) => {\n if (!__props.autoExpandParent || !keys) return;\n const set = new Set(keys);\n collectParentKeys(__props.treeData, set).forEach((k) => set.add(k));\n emit('update:expandedKeys', [...set]);\n },\n);\n\n// ─── Checkbox propagation ─────────────────────────────────────────────────────\n\nfunction propagateChecks(checked: Set<BTreeNodeKey>) {\n // Bottom-up: compute half-checked from actual checked leaves\n const half = new Set<BTreeNodeKey>();\n function walk(nodes: BTreeNodeData[]): { all: boolean; some: boolean } {\n let allChecked = true;\n let someChecked = false;\n for (const n of nodes) {\n const key = nodeKey(n);\n const children = nodeChildren(n);\n if (children?.length) {\n const sub = walk(children);\n if (sub.all) {\n checked.add(key);\n someChecked = true;\n } else if (sub.some) {\n checked.delete(key);\n half.add(key);\n allChecked = false;\n someChecked = true;\n } else {\n if (!checked.has(key)) allChecked = false;\n else someChecked = true;\n }\n } else {\n if (!checked.has(key)) allChecked = false;\n else someChecked = true;\n }\n }\n return { all: allChecked, some: someChecked };\n }\n walk(__props.treeData);\n internalHalfChecked.value = half;\n}\n\n// ─── Node helpers ─────────────────────────────────────────────────────────────\n\nfunction hasChildren(node: BTreeNodeData): boolean {\n const ch = nodeChildren(node);\n return !!ch?.length || (!!__props.loadData && !node.isLeaf);\n}\n\nfunction isExpanded(key: BTreeNodeKey): boolean {\n return activeExpanded.value.has(key);\n}\nfunction isSelected(key: BTreeNodeKey): boolean {\n return activeSelected.value.has(key);\n}\nfunction isChecked(key: BTreeNodeKey): boolean {\n return activeChecked.value.has(key);\n}\nfunction isHalfChecked(key: BTreeNodeKey): boolean {\n return activeHalfChecked.value.has(key);\n}\nfunction isLoading(key: BTreeNodeKey): boolean {\n return loadingKeys.value.has(key);\n}\nfunction isLoaded(key: BTreeNodeKey): boolean {\n return activeLoaded.value.has(key);\n}\nfunction isFiltered(node: BTreeNodeData): boolean {\n return __props.filterTreeNode ? __props.filterTreeNode(node) : false;\n}\n\n// ─── Expand / collapse ────────────────────────────────────────────────────────\n\nasync function toggleExpand(node: BTreeNodeData, event?: MouseEvent | KeyboardEvent) {\n const key = nodeKey(node);\n if (node.disabled || __props.disabled) return;\n\n const expanding = !isExpanded(key);\n\n // Async load\n if (expanding && __props.loadData && !isLoaded(key) && !isLoading(key)) {\n loadingKeys.value.add(key);\n try {\n await __props.loadData(node);\n if (!isControlledLoaded.value) internalLoaded.value.add(key);\n emit('update:loadedKeys', [...activeLoaded.value, key]);\n } finally {\n loadingKeys.value.delete(key);\n }\n }\n\n let nextSet: Set<BTreeNodeKey>;\n if (isControlledExpanded.value) {\n nextSet = new Set(__props.expandedKeys);\n } else {\n nextSet = new Set(internalExpanded.value);\n }\n\n if (expanding) nextSet.add(key);\n else nextSet.delete(key);\n\n if (!isControlledExpanded.value) internalExpanded.value = nextSet;\n emit('update:expandedKeys', [...nextSet]);\n\n const info: BTreeExpandInfo = { expanded: expanding, node, event };\n emit('expand', [...nextSet], info);\n}\n\n// ─── Select ───────────────────────────────────────────────────────────────────\n\nfunction handleSelect(node: BTreeNodeData, event: MouseEvent | KeyboardEvent) {\n if (!__props.selectable || node.selectable === false || node.disabled || __props.disabled) return;\n const key = nodeKey(node);\n\n let nextSet: Set<BTreeNodeKey>;\n if (isControlledSelected.value) {\n nextSet = new Set(__props.selectedKeys);\n } else {\n nextSet = new Set(internalSelected.value);\n }\n\n if (nextSet.has(key)) {\n nextSet.delete(key);\n } else {\n if (!__props.multiple) nextSet.clear();\n nextSet.add(key);\n }\n\n if (!isControlledSelected.value) internalSelected.value = nextSet;\n emit('update:selectedKeys', [...nextSet]);\n\n const info: BTreeSelectInfo = {\n event,\n selected: nextSet.has(key),\n node,\n selectedNodes: flatNodes.value.filter((n) => nextSet.has(n.key)).map((n) => n.data),\n nativeEvent: event,\n };\n emit('select', [...nextSet], info);\n}\n\n// ─── Check ────────────────────────────────────────────────────────────────────\n\nfunction handleCheck(node: BTreeNodeData, event: MouseEvent | KeyboardEvent) {\n if (!__props.checkable || node.disableCheckbox || node.disabled || __props.disabled) return;\n const key = nodeKey(node);\n\n let nextChecked: Set<BTreeNodeKey>;\n if (isControlledChecked.value) {\n const raw = __props.checkedKeys as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n nextChecked = new Set(Array.isArray(raw) ? raw : raw.checked);\n } else {\n nextChecked = new Set(internalChecked.value);\n }\n\n if (nextChecked.has(key)) {\n nextChecked.delete(key);\n // Uncheck all descendants\n if (!__props.checkStrictly) {\n function uncheckDesc(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n nextChecked.delete(nodeKey(n));\n const ch = nodeChildren(n);\n if (ch?.length) uncheckDesc(ch);\n }\n }\n const children = nodeChildren(node);\n if (children?.length) uncheckDesc(children);\n }\n } else {\n nextChecked.add(key);\n // Check all descendants\n if (!__props.checkStrictly) {\n function checkDesc(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n if (!n.disableCheckbox && !n.disabled) nextChecked.add(nodeKey(n));\n const ch = nodeChildren(n);\n if (ch?.length) checkDesc(ch);\n }\n }\n const children = nodeChildren(node);\n if (children?.length) checkDesc(children);\n }\n }\n\n if (!__props.checkStrictly && !isControlledChecked.value) {\n propagateChecks(nextChecked);\n }\n\n const checkedNodes = flatNodes.value.filter((n) => nextChecked.has(n.key)).map((n) => n.data);\n\n const info: BTreeCheckInfo = {\n event,\n node,\n checked: nextChecked.has(key),\n checkedNodes,\n checkedNodesPositions: checkedNodes.map((n) => ({ node: n, pos: '0' })),\n halfCheckedKeys: [...activeHalfChecked.value],\n nativeEvent: event,\n };\n\n if (!isControlledChecked.value) internalChecked.value = nextChecked;\n\n const emitValue: BTreeNodeKey[] | BTreeCheckedKeys = __props.checkStrictly\n ? { checked: [...nextChecked], halfChecked: [...activeHalfChecked.value] }\n : [...nextChecked];\n\n emit('update:checkedKeys', emitValue);\n emit('check', emitValue, info);\n}\n\n// ─── Drag & Drop ──────────────────────────────────────────────────────────────\n\nfunction handleDragStart(event: DragEvent, node: BTreeNodeData) {\n if (!__props.draggable) return;\n dragNodeKey.value = nodeKey(node);\n event.dataTransfer?.setData('text/plain', String(nodeKey(node)));\n emit('dragStart', { event, node });\n}\n\nfunction handleDragEnter(event: DragEvent, node: BTreeNodeData) {\n if (!__props.draggable) return;\n event.preventDefault();\n emit('dragEnter', { event, node, expandedKeys: [...activeExpanded.value] });\n}\n\nfunction handleDragOver(event: DragEvent, node: BTreeNodeData) {\n if (!__props.draggable) return;\n event.preventDefault();\n emit('dragOver', { event, node });\n}\n\nfunction handleDragLeave(event: DragEvent, node: BTreeNodeData) {\n if (!__props.draggable) return;\n emit('dragLeave', { event, node });\n}\n\nfunction handleDragEnd(event: DragEvent, node: BTreeNodeData) {\n if (!__props.draggable) return;\n dragNodeKey.value = null;\n emit('dragEnd', { event, node });\n}\n\nfunction handleDrop(event: DragEvent, node: BTreeNodeData) {\n if (!__props.draggable) return;\n event.preventDefault();\n const dragFlat = flatNodes.value.find((n) => n.key === dragNodeKey.value);\n if (!dragFlat) return;\n\n emit('drop', {\n event,\n node,\n dragNode: dragFlat.data,\n dragNodesKeys: [dragFlat.key],\n dropPosition: 0,\n dropToGap: false,\n });\n dragNodeKey.value = null;\n}\n\n// ─── Keyboard navigation ──────────────────────────────────────────────────────\n\nconst treeRef = ref<HTMLElement | null>(null);\n\nconst focusedNodeKey = ref<BTreeNodeKey | null>(visibleNodes.value[0]?.key ?? null);\n\nfunction handleTreeKeydown(event: KeyboardEvent) {\n const visible = visibleNodes.value;\n if (!visible.length) return;\n\n const currentIdx = visible.findIndex((n) => n.key === focusedNodeKey.value);\n const current = visible[currentIdx];\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n const next = visible[currentIdx + 1];\n if (next) {\n focusedNodeKey.value = next.key;\n nextTick(() => focusNode(next.key));\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n const prev = visible[currentIdx - 1];\n if (prev) {\n focusedNodeKey.value = prev.key;\n nextTick(() => focusNode(prev.key));\n }\n break;\n }\n case 'ArrowRight': {\n event.preventDefault();\n if (!current) break;\n if (hasChildren(current.data) && !isExpanded(current.key)) {\n toggleExpand(current.data, event);\n } else if (isExpanded(current.key)) {\n const firstChild = visible[currentIdx + 1];\n if (firstChild?.depth > current.depth) {\n focusedNodeKey.value = firstChild.key;\n nextTick(() => focusNode(firstChild.key));\n }\n }\n break;\n }\n case 'ArrowLeft': {\n event.preventDefault();\n if (!current) break;\n if (isExpanded(current.key)) {\n toggleExpand(current.data, event);\n } else if (current.depth > 0) {\n // Move to parent\n for (let i = currentIdx - 1; i >= 0; i--) {\n if (visible[i].depth < current.depth) {\n focusedNodeKey.value = visible[i].key;\n nextTick(() => focusNode(visible[i].key));\n break;\n }\n }\n }\n break;\n }\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (!current) break;\n if (__props.checkable) {\n handleCheck(current.data, event);\n } else if (__props.selectable) {\n handleSelect(current.data, event);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n if (visible[0]) {\n focusedNodeKey.value = visible[0].key;\n nextTick(() => focusNode(visible[0].key));\n }\n break;\n }\n case 'End': {\n event.preventDefault();\n const last = visible[visible.length - 1];\n if (last) {\n focusedNodeKey.value = last.key;\n nextTick(() => focusNode(last.key));\n }\n break;\n }\n }\n}\n\nfunction focusNode(key: BTreeNodeKey) {\n const el = treeRef.value?.querySelector<HTMLElement>(\n `[data-node-key=\"${String(key).replace(/[\"\\\\]/g, '\\\\$&')}\"]`,\n );\n el?.focus();\n}\n\n// ─── Directory-mode: click/dblclick expand ────────────────────────────────────\n\nfunction handleNodeClick(node: BTreeNodeData, event: MouseEvent) {\n if (__props.directory && __props.expandAction === 'click' && hasChildren(node)) {\n toggleExpand(node, event);\n }\n handleSelect(node, event);\n}\n\nfunction handleNodeDblClick(node: BTreeNodeData, event: MouseEvent) {\n if (__props.directory && __props.expandAction === 'doubleClick' && hasChildren(node)) {\n toggleExpand(node, event);\n }\n emit('dblclick', event, node);\n}\n\n// ─── Scroll to ────────────────────────────────────────────────────────────────\n\nfunction scrollTo(opts: BTreeScrollToOptions) {\n nextTick(() => {\n const el = treeRef.value?.querySelector<HTMLElement>(\n `[data-node-key=\"${String(opts.key).replace(/[\"\\\\]/g, '\\\\$&')}\"]`,\n );\n const alignMap = { top: 'start', bottom: 'end', auto: 'nearest' } as const;\n el?.scrollIntoView?.({ block: alignMap[opts.align ?? 'auto'] });\n });\n}\n\n__expose({ scrollTo });\n\n// ─── Right click ─────────────────────────────────────────────────────────────\n\nfunction handleRightClick(event: MouseEvent, node: BTreeNodeData) {\n event.preventDefault();\n emit('rightClick', { event, node });\n}\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n ref_key: \"treeRef\",\n ref: treeRef,\n class: _normalizeClass([\"b-tree\", {\n 'b-tree--checkable': __props.checkable,\n 'b-tree--show-line': __props.showLine,\n 'b-tree--block-node': __props.blockNode,\n 'b-tree--directory': __props.directory,\n 'b-tree--disabled': __props.disabled,\n }]),\n role: \"tree\",\n \"aria-multiselectable\": __props.multiple || undefined,\n style: _normalizeStyle(__props.height ? { height: `${__props.height}px`, overflowY: 'auto' } : undefined),\n onKeydown: handleTreeKeydown\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(visibleNodes.value, (flatNode) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n key: flatNode.key,\n \"data-node-key\": String(flatNode.key),\n class: _normalizeClass([\"b-tree__node\", {\n 'b-tree__node--selected': isSelected(flatNode.key),\n 'b-tree__node--checked': isChecked(flatNode.key),\n 'b-tree__node--half-checked': isHalfChecked(flatNode.key),\n 'b-tree__node--expanded': isExpanded(flatNode.key),\n 'b-tree__node--disabled': flatNode.data.disabled || __props.disabled,\n 'b-tree__node--leaf': !hasChildren(flatNode.data),\n 'b-tree__node--loading': isLoading(flatNode.key),\n 'b-tree__node--dragging': __props.draggable && dragNodeKey.value === flatNode.key,\n 'b-tree__node--filtered': isFiltered(flatNode.data),\n 'b-tree__node--block': __props.blockNode,\n }]),\n role: \"treeitem\",\n \"aria-expanded\": hasChildren(flatNode.data) ? isExpanded(flatNode.key) : undefined,\n \"aria-selected\": __props.selectable ? isSelected(flatNode.key) : undefined,\n \"aria-checked\": __props.checkable ? isChecked(flatNode.key) : undefined,\n \"aria-disabled\": flatNode.data.disabled || __props.disabled || undefined,\n \"aria-level\": flatNode.depth + 1,\n tabindex: flatNode.key === focusedNodeKey.value ? 0 : -1,\n style: _normalizeStyle({ '--b-tree-node-indent': `${flatNode.depth * 24}px` }),\n draggable: __props.draggable ? 'true' : undefined,\n onClick: _withModifiers(($event: any) => (handleNodeClick(flatNode.data, $event)), [\"stop\"]),\n onDblclick: _withModifiers(($event: any) => (handleNodeDblClick(flatNode.data, $event)), [\"stop\"]),\n onContextmenu: _withModifiers(($event: any) => (handleRightClick($event, flatNode.data)), [\"stop\"]),\n onDragstart: ($event: any) => (handleDragStart($event, flatNode.data)),\n onDragenter: ($event: any) => (handleDragEnter($event, flatNode.data)),\n onDragover: ($event: any) => (handleDragOver($event, flatNode.data)),\n onDragleave: ($event: any) => (handleDragLeave($event, flatNode.data)),\n onDragend: ($event: any) => (handleDragEnd($event, flatNode.data)),\n onDrop: ($event: any) => (handleDrop($event, flatNode.data))\n }, [\n (__props.draggable)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_3, [...(_cache[0] || (_cache[0] = [\n _createStaticVNode(\"<svg viewBox=\\\"0 0 16 16\\\" fill=\\\"currentColor\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" data-v-08bb45f2><circle cx=\\\"5\\\" cy=\\\"3.5\\\" r=\\\"1.25\\\" data-v-08bb45f2></circle><circle cx=\\\"5\\\" cy=\\\"8\\\" r=\\\"1.25\\\" data-v-08bb45f2></circle><circle cx=\\\"5\\\" cy=\\\"12.5\\\" r=\\\"1.25\\\" data-v-08bb45f2></circle><circle cx=\\\"11\\\" cy=\\\"3.5\\\" r=\\\"1.25\\\" data-v-08bb45f2></circle><circle cx=\\\"11\\\" cy=\\\"8\\\" r=\\\"1.25\\\" data-v-08bb45f2></circle><circle cx=\\\"11\\\" cy=\\\"12.5\\\" r=\\\"1.25\\\" data-v-08bb45f2></circle></svg>\", 1)\n ]))]))\n : _createCommentVNode(\"\", true),\n _cache[4] || (_cache[4] = _createElementVNode(\"span\", {\n class: \"b-tree__indent\",\n \"aria-hidden\": \"true\"\n }, null, -1)),\n (hasChildren(flatNode.data))\n ? (_openBlock(), _createElementBlock(\"span\", {\n key: 1,\n class: _normalizeClass([\"b-tree__switcher\", {\n 'b-tree__switcher--expanded': isExpanded(flatNode.key),\n 'b-tree__switcher--loading': isLoading(flatNode.key),\n }]),\n \"aria-hidden\": \"true\",\n onClick: _withModifiers(($event: any) => (toggleExpand(flatNode.data, $event)), [\"stop\"])\n }, [\n (!isLoading(flatNode.key))\n ? _renderSlot(_ctx.$slots, \"switcherIcon\", {\n key: 0,\n node: flatNode.data,\n expanded: isExpanded(flatNode.key)\n }, () => [\n _cache[1] || (_cache[1] = _createElementVNode(\"svg\", {\n class: \"b-tree__switcher-icon\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"aria-hidden\": \"true\"\n }, [\n _createElementVNode(\"path\", {\n d: \"M9 18L15 12L9 6\",\n stroke: \"currentColor\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n })\n ], -1))\n ], true)\n : _createCommentVNode(\"\", true),\n (isLoading(flatNode.key))\n ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_5, [...(_cache[2] || (_cache[2] = [\n _createElementVNode(\"circle\", {\n cx: \"12\",\n cy: \"12\",\n r: \"9\",\n stroke: \"currentColor\",\n \"stroke-width\": \"2\",\n \"stroke-dasharray\": \"42\",\n \"stroke-dashoffset\": \"14\",\n \"stroke-linecap\": \"round\"\n }, null, -1)\n ]))]))\n : _createCommentVNode(\"\", true)\n ], 10, _hoisted_4))\n : (__props.showLine)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_6))\n : _createCommentVNode(\"\", true),\n (__props.checkable && flatNode.data.checkable !== false)\n ? (_openBlock(), _createElementBlock(\"span\", {\n key: 3,\n class: _normalizeClass([\"b-tree__checkbox\", {\n 'b-tree__checkbox--checked': isChecked(flatNode.key),\n 'b-tree__checkbox--indeterminate': isHalfChecked(flatNode.key),\n 'b-tree__checkbox--disabled':\n flatNode.data.disableCheckbox || flatNode.data.disabled || __props.disabled,\n }]),\n role: \"checkbox\",\n \"aria-label\": nodeTitle(flatNode.data),\n \"aria-checked\": isHalfChecked(flatNode.key) ? 'mixed' : isChecked(flatNode.key),\n \"aria-disabled\": \n flatNode.data.disableCheckbox || flatNode.data.disabled || __props.disabled || undefined\n ,\n tabindex: \"-1\",\n onClick: _withModifiers(($event: any) => (handleCheck(flatNode.data, $event)), [\"stop\"]),\n onKeydown: [\n _withKeys(_withModifiers(($event: any) => (handleCheck(flatNode.data, $event)), [\"prevent\"]), [\"enter\"]),\n _withKeys(_withModifiers(($event: any) => (handleCheck(flatNode.data, $event)), [\"prevent\"]), [\"space\"])\n ]\n }, [...(_cache[3] || (_cache[3] = [\n _createElementVNode(\"span\", {\n class: \"b-tree__checkbox-inner\",\n \"aria-hidden\": \"true\"\n }, null, -1)\n ]))], 42, _hoisted_7))\n : _createCommentVNode(\"\", true),\n (__props.showIcon || flatNode.data.icon || _ctx.$slots.icon)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_8, [\n _renderSlot(_ctx.$slots, \"icon\", {\n node: flatNode.data\n }, () => [\n (flatNode.data.icon)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_9, _toDisplayString(flatNode.data.icon), 1))\n : _createCommentVNode(\"\", true)\n ], true)\n ]))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"span\", {\n class: _normalizeClass([\"b-tree__title\", { 'b-tree__title--filtered': isFiltered(flatNode.data) }])\n }, [\n _renderSlot(_ctx.$slots, \"title\", {\n node: flatNode.data\n }, () => [\n _createTextVNode(_toDisplayString(nodeTitle(flatNode.data)), 1)\n ], true)\n ], 2)\n ], 46, _hoisted_2))\n }), 128))\n ], 46, _hoisted_1))\n}\n}\n\n})"],"mappings":";;AAGA,IAAM,KAAa,CAAC,uBAAuB,EACrC,KAAa;CAAC;CAAiB;CAAiB;CAAiB;CAAgB;CAAiB;CAAc;CAAY;CAAa;CAAW;CAAc;CAAiB;CAAe;CAAe;CAAc;CAAe;CAAa;CAAS,EACpQ,KAAa;CACjB,KAAK;CACL,OAAO;CACP,eAAe;CAChB,EACK,KAAa,CAAC,UAAU,EACxB,KAAa;CACjB,KAAK;CACL,OAAO;CACP,SAAS;CACT,MAAM;CACN,OAAO;CACP,eAAe;CAChB,EACK,KAAa;CACjB,KAAK;CACL,OAAO;CACP,eAAe;CAChB,EACK,KAAa;CAAC;CAAc;CAAgB;CAAiB;CAAW;CAAY,EACpF,KAAa;CACjB,KAAK;CACL,OAAO;CACP,eAAe;CAChB,EACK,KAAa,EAAE,KAAK,GAAG,EAoB7B,IAA4B,kBAAiB;CAC3C,QAAQ;CACR,OAAO;EACL,UAAU,EAAE,eAAgB,EAAE,EAAG;EACjC,YAAY,EAAE,gBAAgB,EAAE,GAAG;EACnC,WAAW;GAAE,MAAM;GAAS,SAAS;GAAO;EAC5C,eAAe;GAAE,MAAM;GAAS,SAAS;GAAO;EAChD,aAAa,EAAE,eAAgB,KAAA,GAAY;EAC3C,oBAAoB,EAAE,eAAgB,EAAE,EAAG;EAC3C,cAAc,EAAE,eAAgB,KAAA,GAAY;EAC5C,qBAAqB,EAAE,eAAgB,EAAE,EAAG;EAC5C,cAAc,EAAE,eAAgB,KAAA,GAAY;EAC5C,qBAAqB,EAAE,eAAgB,EAAE,EAAG;EAC5C,kBAAkB;GAAE,MAAM;GAAS,SAAS;GAAO;EACnD,qBAAqB;GAAE,MAAM;GAAS,SAAS;GAAM;EACrD,kBAAkB;GAAE,MAAM;GAAS,SAAS;GAAO;EACnD,UAAU;GAAE,MAAM;GAAS,SAAS;GAAO;EAC3C,YAAY;GAAE,MAAM;GAAS,SAAS;GAAM;EAC5C,UAAU;GAAE,MAAM;GAAS,SAAS;GAAO;EAC3C,UAAU;GAAE,MAAM;GAAS,SAAS;GAAO;EAC3C,UAAU;GAAE,MAAM;GAAS,SAAS;GAAO;EAC3C,WAAW;GAAE,MAAM;GAAS,SAAS;GAAO;EAC5C,WAAW;GAAE,MAAM;GAAS,SAAS;GAAO;EAC5C,UAAU;GAAE,MAAM;GAAU,SAAS,KAAA;GAAW;EAChD,YAAY,EAAE,eAAgB,KAAA,GAAY;EAC1C,gBAAgB;GAAE,MAAM;GAAU,SAAS,KAAA;GAAW;EACtD,QAAQ,EAAE,eAAgB,KAAA,GAAY;EACtC,SAAS;GAAE,MAAM;GAAS,SAAS;GAAO;EAC1C,WAAW;GAAE,MAAM;GAAS,SAAS;GAAO;EAC5C,cAAc;GAAE,MAAM,CAAC,QAAQ,QAAQ;GAAE,SAAS;GAAS;EAC5D;CACD,OAAO;EAAC;EAAS;EAAU;EAAU;EAAQ;EAAc;EAAa;EAAa;EAAY;EAAa;EAAW;EAAQ;EAAY;EAAsB;EAAuB;EAAuB;EAAoB;CACrO,MAAM,GAAc,EAAE,QAAQ,GAAU,MAAM,MAAU;EAM1D,IAAM,IAAO,IAQP,KAAO,QAAe,EAAQ,WAAW,OAAO,MAAM,EACtD,KAAS,QAAe,EAAQ,WAAW,SAAS,QAAQ,EAC5D,KAAY,QAAe,EAAQ,WAAW,YAAY,WAAW;EAE3E,SAAS,EAAQ,GAAgC;AAC/C,UAAO,EAAE,GAAK;;EAEhB,SAAS,EAAU,GAA0B;AAC3C,UAAQ,EAAE,GAAO,UAAqB;;EAExC,SAAS,EAAa,GAA+C;AACnE,UAAO,EAAE,GAAU;;EAKrB,IAAM,IAAmB,kBAAuB,IAAI,KAAK,CAAC,EACpD,IAAmB,kBAAuB,IAAI,KAAK,CAAC,EACpD,IAAkB,kBAAuB,IAAI,KAAK,CAAC,EACnD,IAAsB,kBAAuB,IAAI,KAAK,CAAC,EACvD,IAAiB,kBAAuB,IAAI,KAAK,CAAC,EAClD,IAAc,kBAAuB,IAAI,KAAK,CAAC,EAC/C,IAAc,EAAyB,KAAK,EAG5C,IAAuB,QAAe,EAAQ,iBAAiB,KAAA,EAAU,EACzE,IAAuB,QAAe,EAAQ,iBAAiB,KAAA,EAAU,EACzE,IAAsB,QAAe,EAAQ,gBAAgB,KAAA,EAAU,EACvE,IAAqB,QAAe,EAAQ,eAAe,KAAA,EAAU,EAErE,IAAiB,QACjB,EAAqB,QAAc,IAAI,IAAI,EAAQ,aAAa,GAC7D,EAAiB,MACxB,EAEI,KAAiB,QACjB,EAAqB,QAAc,IAAI,IAAI,EAAQ,aAAa,GAC7D,EAAiB,MACxB,EAEI,KAAgB,QAAkC;AACtD,OAAI,EAAoB,OAAO;IAC7B,IAAM,IAAM,EAAQ;AAIpB,WADI,MAAM,QAAQ,EAAI,GAAS,IAAI,IAAI,EAAI,GACpC,IAAI,IAAI,EAAI,QAAQ;;AAE7B,UAAO,EAAgB;IACvB,EAEI,IAAoB,QAAkC;AAC1D,OAAI,EAAoB,OAAO;IAC7B,IAAM,IAAM,EAAQ;AAGpB,QAAI,CAAC,MAAM,QAAQ,EAAI,IAAI,iBAAiB,EAAK,QAAO,IAAI,IAAI,EAAI,YAAY;;AAElF,UAAO,EAAoB;IAC3B,EAEI,IAAe,QACf,EAAmB,QAAc,IAAI,IAAI,EAAQ,WAAW,GACzD,EAAe,MACtB;EAIF,SAAS,EAAY,GAAwB,IAAQ,GAAG,IAAgB,IAAuB;GAC7F,IAAM,IAA0B,EAAE;AAClC,QAAK,IAAM,KAAQ,GAAO;IACxB,IAAM,IAAM,EAAQ,EAAK,EACnB,IAAa,EAAe,MAAM,IAAI,EAAI,EAC1C,IAAU;AAChB,MAAO,KAAK;KAAE;KAAK,MAAM;KAAM;KAAO;KAAS,CAAC;IAChD,IAAM,IAAW,EAAa,EAAK;AACnC,IAAI,GAAU,UACZ,EAAO,KAAK,GAAG,EAAY,GAAU,IAAQ,GAAG,KAAW,EAAW,CAAC;;AAG3E,UAAO;;EAGT,IAAM,IAAY,QAAe,EAAY,EAAQ,SAAS,CAAC,EACzD,IAAe,QAAe,EAAU,MAAM,QAAQ,MAAM,EAAE,QAAQ,CAAC;EAI7E,SAAS,EAAe,GAAwC;GAC9D,IAAM,IAAuB,EAAE;AAC/B,QAAK,IAAM,KAAK,GAAO;AACrB,MAAK,KAAK,EAAQ,EAAE,CAAC;IACrB,IAAM,IAAW,EAAa,EAAE;AAChC,IAAI,GAAU,UAAQ,EAAK,KAAK,GAAG,EAAe,EAAS,CAAC;;AAE9D,UAAO;;EAGT,SAAS,EAAkB,GAAwB,GAA+C;GAChG,IAAM,IAA0B,EAAE;GAClC,SAAS,EAAK,GAAwB;AACpC,SAAK,IAAM,KAAK,GAAO;KACrB,IAAM,IAAW,EAAa,EAAE;AAChC,KAAI,GAAU,WACU,EAAS,MAC5B,MAAM,EAAW,IAAI,EAAQ,EAAE,CAAC,IAAI,EAAK,CAAC,EAAE,CAAC,KAAK,KAAA,EACpD,IACkB,EAAQ,KAAK,EAAQ,EAAE,CAAC,EAC3C,EAAK,EAAS;;;AAKpB,UADA,EAAK,EAAM,EACJ;;AAIT,MAAI,CAAC,EAAqB;OACpB,EAAQ,iBACV,GAAiB,QAAQ,IAAI,IAC3B,EAAe,EAAQ,SAAS,CAAC,QAAQ,MAAM;IAC7C,IAAM,IAAO,EAAU,MAAM,MAAM,MAAM,EAAE,QAAQ,EAAE;AACrD,WAAO,IAAO,CAAC,CAAC,EAAa,EAAK,KAAK,EAAE,SAAS;KAClD,CACH;YACQ,EAAQ,oBAAoB,QAAQ;IAC7C,IAAM,IAAO,IAAI,IAAkB,EAAQ,oBAAoB;AAI/D,IAHI,EAAQ,uBACV,EAAkB,EAAQ,UAAU,EAAK,CAAC,SAAS,MAAM,EAAK,IAAI,EAAE,CAAC,EAEvE,EAAiB,QAAQ;;;AAY7B,EATI,CAAC,EAAqB,SAAS,EAAQ,oBAAoB,WAC7D,EAAiB,QAAQ,IAAI,IAAI,EAAQ,oBAAoB,GAE3D,CAAC,EAAoB,SAAS,EAAQ,mBAAmB,WAC3D,EAAgB,QAAQ,IAAI,IAAI,EAAQ,mBAAmB,EACtD,EAAQ,iBAAe,EAAgB,EAAgB,MAAM,GAIpE,SACQ,EAAQ,eACb,MAAS;AACR,OAAI,CAAC,EAAQ,oBAAoB,CAAC,EAAM;GACxC,IAAM,IAAM,IAAI,IAAI,EAAK;AAEzB,GADA,EAAkB,EAAQ,UAAU,EAAI,CAAC,SAAS,MAAM,EAAI,IAAI,EAAE,CAAC,EACnE,EAAK,uBAAuB,CAAC,GAAG,EAAI,CAAC;IAExC;EAID,SAAS,EAAgB,GAA4B;GAEnD,IAAM,oBAAO,IAAI,KAAmB;GACpC,SAAS,EAAK,GAAyD;IACrE,IAAI,IAAa,IACb,IAAc;AAClB,SAAK,IAAM,KAAK,GAAO;KACrB,IAAM,IAAM,EAAQ,EAAE,EAChB,IAAW,EAAa,EAAE;AAChC,SAAI,GAAU,QAAQ;MACpB,IAAM,IAAM,EAAK,EAAS;AAC1B,MAAI,EAAI,OACN,EAAQ,IAAI,EAAI,EAChB,IAAc,MACL,EAAI,QACb,EAAQ,OAAO,EAAI,EACnB,EAAK,IAAI,EAAI,EACb,IAAa,IACb,IAAc,MAET,EAAQ,IAAI,EAAI,GAChB,IAAc,KADI,IAAa;YAIjC,EAAQ,IAAI,EAAI,GAChB,IAAc,KADI,IAAa;;AAIxC,WAAO;KAAE,KAAK;KAAY,MAAM;KAAa;;AAG/C,GADA,EAAK,EAAQ,SAAS,EACtB,EAAoB,QAAQ;;EAK9B,SAAS,EAAY,GAA8B;AAEjD,UAAO,CAAC,CADG,EAAa,EAAK,EAChB,UAAW,CAAC,CAAC,EAAQ,YAAY,CAAC,EAAK;;EAGtD,SAAS,EAAW,GAA4B;AAC9C,UAAO,EAAe,MAAM,IAAI,EAAI;;EAEtC,SAAS,EAAW,GAA4B;AAC9C,UAAO,GAAe,MAAM,IAAI,EAAI;;EAEtC,SAAS,EAAU,GAA4B;AAC7C,UAAO,GAAc,MAAM,IAAI,EAAI;;EAErC,SAAS,EAAc,GAA4B;AACjD,UAAO,EAAkB,MAAM,IAAI,EAAI;;EAEzC,SAAS,EAAU,GAA4B;AAC7C,UAAO,EAAY,MAAM,IAAI,EAAI;;EAEnC,SAAS,GAAS,GAA4B;AAC5C,UAAO,EAAa,MAAM,IAAI,EAAI;;EAEpC,SAAS,EAAW,GAA8B;AAChD,UAAO,EAAQ,iBAAiB,EAAQ,eAAe,EAAK,GAAG;;EAKjE,eAAe,EAAa,GAAqB,GAAoC;GACnF,IAAM,IAAM,EAAQ,EAAK;AACzB,OAAI,EAAK,YAAY,EAAQ,SAAU;GAEvC,IAAM,IAAY,CAAC,EAAW,EAAI;AAGlC,OAAI,KAAa,EAAQ,YAAY,CAAC,GAAS,EAAI,IAAI,CAAC,EAAU,EAAI,EAAE;AACtE,MAAY,MAAM,IAAI,EAAI;AAC1B,QAAI;AAGF,KAFA,MAAM,EAAQ,SAAS,EAAK,EACvB,EAAmB,SAAO,EAAe,MAAM,IAAI,EAAI,EAC5D,EAAK,qBAAqB,CAAC,GAAG,EAAa,OAAO,EAAI,CAAC;cAC/C;AACR,OAAY,MAAM,OAAO,EAAI;;;GAIjC,IAAI;AAWJ,GAVA,AAGE,IAHE,EAAqB,QACb,IAAI,IAAI,EAAQ,aAAa,GAE7B,IAAI,IAAI,EAAiB,MAAM,EAGvC,IAAW,EAAQ,IAAI,EAAI,GAC1B,EAAQ,OAAO,EAAI,EAEnB,EAAqB,UAAO,EAAiB,QAAQ,IAC1D,EAAK,uBAAuB,CAAC,GAAG,EAAQ,CAAC;GAEzC,IAAM,IAAwB;IAAE,UAAU;IAAW;IAAM;IAAO;AAClE,KAAK,UAAU,CAAC,GAAG,EAAQ,EAAE,EAAK;;EAKpC,SAAS,EAAa,GAAqB,GAAmC;AAC5E,OAAI,CAAC,EAAQ,cAAc,EAAK,eAAe,MAAS,EAAK,YAAY,EAAQ,SAAU;GAC3F,IAAM,IAAM,EAAQ,EAAK,EAErB;AAeJ,GAdA,AAGE,IAHE,EAAqB,QACb,IAAI,IAAI,EAAQ,aAAa,GAE7B,IAAI,IAAI,EAAiB,MAAM,EAGvC,EAAQ,IAAI,EAAI,GAClB,EAAQ,OAAO,EAAI,IAEd,EAAQ,YAAU,EAAQ,OAAO,EACtC,EAAQ,IAAI,EAAI,GAGb,EAAqB,UAAO,EAAiB,QAAQ,IAC1D,EAAK,uBAAuB,CAAC,GAAG,EAAQ,CAAC;GAEzC,IAAM,IAAwB;IAC5B;IACA,UAAU,EAAQ,IAAI,EAAI;IAC1B;IACA,eAAe,EAAU,MAAM,QAAQ,MAAM,EAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK;IACnF,aAAa;IACd;AACD,KAAK,UAAU,CAAC,GAAG,EAAQ,EAAE,EAAK;;EAKpC,SAAS,EAAY,GAAqB,GAAmC;AAC3E,OAAI,CAAC,EAAQ,aAAa,EAAK,mBAAmB,EAAK,YAAY,EAAQ,SAAU;GACrF,IAAM,IAAM,EAAQ,EAAK,EAErB;AACJ,OAAI,EAAoB,OAAO;IAC7B,IAAM,IAAM,EAAQ;AAGpB,QAAc,IAAI,IAAI,MAAM,QAAQ,EAAI,GAAG,IAAM,EAAI,QAAQ;SAE7D,KAAc,IAAI,IAAI,EAAgB,MAAM;AAG9C,OAAI,EAAY,IAAI,EAAI,EAGtB;QAFA,EAAY,OAAO,EAAI,EAEnB,CAAC,EAAQ,eAAe;KAC1B,SAAS,EAAY,GAAwB;AAC3C,WAAK,IAAM,KAAK,GAAO;AACrB,SAAY,OAAO,EAAQ,EAAE,CAAC;OAC9B,IAAM,IAAK,EAAa,EAAE;AAC1B,OAAI,GAAI,UAAQ,EAAY,EAAG;;;KAGnC,IAAM,IAAW,EAAa,EAAK;AACnC,KAAI,GAAU,UAAQ,EAAY,EAAS;;cAG7C,EAAY,IAAI,EAAI,EAEhB,CAAC,EAAQ,eAAe;IAC1B,SAAS,EAAU,GAAwB;AACzC,UAAK,IAAM,KAAK,GAAO;AACrB,MAAI,CAAC,EAAE,mBAAmB,CAAC,EAAE,YAAU,EAAY,IAAI,EAAQ,EAAE,CAAC;MAClE,IAAM,IAAK,EAAa,EAAE;AAC1B,MAAI,GAAI,UAAQ,EAAU,EAAG;;;IAGjC,IAAM,IAAW,EAAa,EAAK;AACnC,IAAI,GAAU,UAAQ,EAAU,EAAS;;AAI7C,GAAI,CAAC,EAAQ,iBAAiB,CAAC,EAAoB,SACjD,EAAgB,EAAY;GAG9B,IAAM,IAAe,EAAU,MAAM,QAAQ,MAAM,EAAY,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,EAEvF,IAAuB;IAC3B;IACA;IACA,SAAS,EAAY,IAAI,EAAI;IAC7B;IACA,uBAAuB,EAAa,KAAK,OAAO;KAAE,MAAM;KAAG,KAAK;KAAK,EAAE;IACvE,iBAAiB,CAAC,GAAG,EAAkB,MAAM;IAC7C,aAAa;IACd;AAED,GAAK,EAAoB,UAAO,EAAgB,QAAQ;GAExD,IAAM,IAA+C,EAAQ,gBACzD;IAAE,SAAS,CAAC,GAAG,EAAY;IAAE,aAAa,CAAC,GAAG,EAAkB,MAAM;IAAE,GACxE,CAAC,GAAG,EAAY;AAGpB,GADA,EAAK,sBAAsB,EAAU,EACrC,EAAK,SAAS,GAAW,EAAK;;EAKhC,SAAS,GAAgB,GAAkB,GAAqB;AACzD,KAAQ,cACb,EAAY,QAAQ,EAAQ,EAAK,EACjC,EAAM,cAAc,QAAQ,cAAc,OAAO,EAAQ,EAAK,CAAC,CAAC,EAChE,EAAK,aAAa;IAAE;IAAO;IAAM,CAAC;;EAGpC,SAAS,GAAgB,GAAkB,GAAqB;AACzD,KAAQ,cACb,EAAM,gBAAgB,EACtB,EAAK,aAAa;IAAE;IAAO;IAAM,cAAc,CAAC,GAAG,EAAe,MAAM;IAAE,CAAC;;EAG7E,SAAS,GAAe,GAAkB,GAAqB;AACxD,KAAQ,cACb,EAAM,gBAAgB,EACtB,EAAK,YAAY;IAAE;IAAO;IAAM,CAAC;;EAGnC,SAAS,GAAgB,GAAkB,GAAqB;AACzD,KAAQ,aACb,EAAK,aAAa;IAAE;IAAO;IAAM,CAAC;;EAGpC,SAAS,GAAc,GAAkB,GAAqB;AACvD,KAAQ,cACb,EAAY,QAAQ,MACpB,EAAK,WAAW;IAAE;IAAO;IAAM,CAAC;;EAGlC,SAAS,GAAW,GAAkB,GAAqB;AACzD,OAAI,CAAC,EAAQ,UAAW;AACxB,KAAM,gBAAgB;GACtB,IAAM,IAAW,EAAU,MAAM,MAAM,MAAM,EAAE,QAAQ,EAAY,MAAM;AACpE,SAEL,EAAK,QAAQ;IACX;IACA;IACA,UAAU,EAAS;IACnB,eAAe,CAAC,EAAS,IAAI;IAC7B,cAAc;IACd,WAAW;IACZ,CAAC,EACF,EAAY,QAAQ;;EAKtB,IAAM,IAAU,EAAwB,KAAK,EAEvC,IAAiB,EAAyB,EAAa,MAAM,IAAI,OAAO,KAAK;EAEnF,SAAS,GAAkB,GAAsB;GAC/C,IAAM,IAAU,EAAa;AAC7B,OAAI,CAAC,EAAQ,OAAQ;GAErB,IAAM,IAAa,EAAQ,WAAW,MAAM,EAAE,QAAQ,EAAe,MAAM,EACrE,IAAU,EAAQ;AAExB,WAAQ,EAAM,KAAd;IACE,KAAK,aAAa;AAChB,OAAM,gBAAgB;KACtB,IAAM,IAAO,EAAQ,IAAa;AAClC,KAAI,MACF,EAAe,QAAQ,EAAK,KAC5B,QAAe,EAAU,EAAK,IAAI,CAAC;AAErC;;IAEF,KAAK,WAAW;AACd,OAAM,gBAAgB;KACtB,IAAM,IAAO,EAAQ,IAAa;AAClC,KAAI,MACF,EAAe,QAAQ,EAAK,KAC5B,QAAe,EAAU,EAAK,IAAI,CAAC;AAErC;;IAEF,KAAK;AAEH,SADA,EAAM,gBAAgB,EAClB,CAAC,EAAS;AACd,SAAI,EAAY,EAAQ,KAAK,IAAI,CAAC,EAAW,EAAQ,IAAI,CACvD,GAAa,EAAQ,MAAM,EAAM;cACxB,EAAW,EAAQ,IAAI,EAAE;MAClC,IAAM,IAAa,EAAQ,IAAa;AACxC,MAAI,GAAY,QAAQ,EAAQ,UAC9B,EAAe,QAAQ,EAAW,KAClC,QAAe,EAAU,EAAW,IAAI,CAAC;;AAG7C;IAEF,KAAK;AAEH,SADA,EAAM,gBAAgB,EAClB,CAAC,EAAS;AACd,SAAI,EAAW,EAAQ,IAAI,CACzB,GAAa,EAAQ,MAAM,EAAM;cACxB,EAAQ,QAAQ;WAEpB,IAAI,IAAI,IAAa,GAAG,KAAK,GAAG,IACnC,KAAI,EAAQ,GAAG,QAAQ,EAAQ,OAAO;AAEpC,OADA,EAAe,QAAQ,EAAQ,GAAG,KAClC,QAAe,EAAU,EAAQ,GAAG,IAAI,CAAC;AACzC;;;AAIN;IAEF,KAAK;IACL,KAAK;AAEH,SADA,EAAM,gBAAgB,EAClB,CAAC,EAAS;AACd,KAAI,EAAQ,YACV,EAAY,EAAQ,MAAM,EAAM,GACvB,EAAQ,cACjB,EAAa,EAAQ,MAAM,EAAM;AAEnC;IAEF,KAAK;AAEH,KADA,EAAM,gBAAgB,EAClB,EAAQ,OACV,EAAe,QAAQ,EAAQ,GAAG,KAClC,QAAe,EAAU,EAAQ,GAAG,IAAI,CAAC;AAE3C;IAEF,KAAK,OAAO;AACV,OAAM,gBAAgB;KACtB,IAAM,IAAO,EAAQ,EAAQ,SAAS;AACtC,KAAI,MACF,EAAe,QAAQ,EAAK,KAC5B,QAAe,EAAU,EAAK,IAAI,CAAC;AAErC;;;;EAKN,SAAS,EAAU,GAAmB;AAIpC,IAHW,EAAQ,OAAO,cACxB,mBAAmB,OAAO,EAAI,CAAC,QAAQ,UAAU,OAAO,CAAC,IAC1D,GACG,OAAO;;EAKb,SAAS,GAAgB,GAAqB,GAAmB;AAI/D,GAHI,EAAQ,aAAa,EAAQ,iBAAiB,WAAW,EAAY,EAAK,IAC5E,EAAa,GAAM,EAAM,EAE3B,EAAa,GAAM,EAAM;;EAG3B,SAAS,GAAmB,GAAqB,GAAmB;AAIlE,GAHI,EAAQ,aAAa,EAAQ,iBAAiB,iBAAiB,EAAY,EAAK,IAClF,EAAa,GAAM,EAAM,EAE3B,EAAK,YAAY,GAAO,EAAK;;EAK/B,SAAS,GAAS,GAA4B;AAC5C,WAAe;AAKb,KAJW,EAAQ,OAAO,cACxB,mBAAmB,OAAO,EAAK,IAAI,CAAC,QAAQ,UAAU,OAAO,CAAC,IAC/D,GAEG,iBAAiB,EAAE,OADN;KAAE,KAAK;KAAS,QAAQ;KAAO,MAAM;KAAW,CAC1B,EAAK,SAAS,SAAS,CAAC;KAC/D;;AAGJ,IAAS,EAAE,cAAU,CAAC;EAItB,SAAS,GAAiB,GAAmB,GAAqB;AAEhE,GADA,EAAM,gBAAgB,EACtB,EAAK,cAAc;IAAE;IAAO;IAAM,CAAC;;AAGrC,UAAQ,GAAU,OACR,GAAY,EAAE,EAAoB,OAAO;GAC/C,SAAS;GACT,KAAK;GACL,OAAO,EAAgB,CAAC,UAAU;IAChC,qBAAqB,EAAQ;IAC7B,qBAAqB,EAAQ;IAC7B,sBAAsB,EAAQ;IAC9B,qBAAqB,EAAQ;IAC7B,oBAAoB,EAAQ;IAC7B,CAAC,CAAC;GACH,MAAM;GACN,wBAAwB,EAAQ,YAAY,KAAA;GAC5C,OAAO,EAAgB,EAAQ,SAAS;IAAE,QAAQ,GAAG,EAAQ,OAAO;IAAK,WAAW;IAAQ,GAAG,KAAA,EAAU;GACzG,WAAW;GACZ,EAAE,EACA,EAAW,GAAK,EAAE,EAAoB,GAAW,MAAM,GAAY,EAAa,QAAQ,OAC/E,GAAY,EAAE,EAAoB,OAAO;GAC/C,KAAK,EAAS;GACd,iBAAiB,OAAO,EAAS,IAAI;GACrC,OAAO,EAAgB,CAAC,gBAAgB;IACtC,0BAA0B,EAAW,EAAS,IAAI;IAClD,yBAAyB,EAAU,EAAS,IAAI;IAChD,8BAA8B,EAAc,EAAS,IAAI;IACzD,0BAA0B,EAAW,EAAS,IAAI;IAClD,0BAA0B,EAAS,KAAK,YAAY,EAAQ;IAC5D,sBAAsB,CAAC,EAAY,EAAS,KAAK;IACjD,yBAAyB,EAAU,EAAS,IAAI;IAChD,0BAA0B,EAAQ,aAAa,EAAY,UAAU,EAAS;IAC9E,0BAA0B,EAAW,EAAS,KAAK;IACnD,uBAAuB,EAAQ;IAChC,CAAC,CAAC;GACH,MAAM;GACN,iBAAiB,EAAY,EAAS,KAAK,GAAG,EAAW,EAAS,IAAI,GAAG,KAAA;GACzE,iBAAiB,EAAQ,aAAa,EAAW,EAAS,IAAI,GAAG,KAAA;GACjE,gBAAgB,EAAQ,YAAY,EAAU,EAAS,IAAI,GAAG,KAAA;GAC9D,iBAAiB,EAAS,KAAK,YAAY,EAAQ,YAAY,KAAA;GAC/D,cAAc,EAAS,QAAQ;GAC/B,UAAU,EAAS,QAAQ,EAAe,QAAQ,IAAI;GACtD,OAAO,EAAgB,EAAE,wBAAwB,GAAG,EAAS,QAAQ,GAAG,KAAK,CAAC;GAC9E,WAAW,EAAQ,YAAY,SAAS,KAAA;GACxC,SAAS,GAAgB,MAAiB,GAAgB,EAAS,MAAM,EAAO,EAAG,CAAC,OAAO,CAAC;GAC5F,YAAY,GAAgB,MAAiB,GAAmB,EAAS,MAAM,EAAO,EAAG,CAAC,OAAO,CAAC;GAClG,eAAe,GAAgB,MAAiB,GAAiB,GAAQ,EAAS,KAAK,EAAG,CAAC,OAAO,CAAC;GACnG,cAAc,MAAiB,GAAgB,GAAQ,EAAS,KAAK;GACrE,cAAc,MAAiB,GAAgB,GAAQ,EAAS,KAAK;GACrE,aAAa,MAAiB,GAAe,GAAQ,EAAS,KAAK;GACnE,cAAc,MAAiB,GAAgB,GAAQ,EAAS,KAAK;GACrE,YAAY,MAAiB,GAAc,GAAQ,EAAS,KAAK;GACjE,SAAS,MAAiB,GAAW,GAAQ,EAAS,KAAK;GAC5D,EAAE;GACA,EAAQ,aACJ,GAAY,EAAE,EAAoB,QAAQ,IAAY,CAAC,GAAI,AAAc,EAAO,OAAK,CACpF,EAAmB,ifAAif,EAAE,CACvgB,CAAG,CAAC,IACL,EAAoB,IAAI,GAAK;GACjC,AAAc,EAAO,OAAK,EAAoB,QAAQ;IACpD,OAAO;IACP,eAAe;IAChB,EAAE,MAAM,GAAG;GACX,EAAY,EAAS,KAAK,IACtB,GAAY,EAAE,EAAoB,QAAQ;IACzC,KAAK;IACL,OAAO,EAAgB,CAAC,oBAAoB;KAC9C,8BAA8B,EAAW,EAAS,IAAI;KACtD,6BAA6B,EAAU,EAAS,IAAI;KACrD,CAAC,CAAC;IACC,eAAe;IACf,SAAS,GAAgB,MAAiB,EAAa,EAAS,MAAM,EAAO,EAAG,CAAC,OAAO,CAAC;IAC1F,EAAE,CACC,EAAU,EAAS,IAAI,GAsBrB,EAAoB,IAAI,GAAK,GArB7B,EAAY,EAAK,QAAQ,gBAAgB;IACvC,KAAK;IACL,MAAM,EAAS;IACf,UAAU,EAAW,EAAS,IAAI;IACnC,QAAQ,CACP,AAAc,EAAO,OAAK,EAAoB,OAAO;IACnD,OAAO;IACP,SAAS;IACT,MAAM;IACN,OAAO;IACP,eAAe;IAChB,EAAE,CACD,EAAoB,QAAQ;IAC1B,GAAG;IACH,QAAQ;IACR,gBAAgB;IAChB,kBAAkB;IAClB,mBAAmB;IACpB,CAAC,CACH,EAAE,GAAG,CACP,EAAE,GAAK,EAEX,EAAU,EAAS,IAAI,IACnB,GAAY,EAAE,EAAoB,OAAO,IAAY,CAAC,GAAI,AAAc,EAAO,OAAK,CACnF,EAAoB,UAAU;IAC5B,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,QAAQ;IACR,gBAAgB;IAChB,oBAAoB;IACpB,qBAAqB;IACrB,kBAAkB;IACnB,EAAE,MAAM,GAAG,CACb,CAAG,CAAC,IACL,EAAoB,IAAI,GAAK,CAClC,EAAE,IAAI,GAAW,IACjB,EAAQ,YACN,GAAY,EAAE,EAAoB,QAAQ,GAAW,IACtD,EAAoB,IAAI,GAAK;GAClC,EAAQ,aAAa,EAAS,KAAK,cAAc,MAC7C,GAAY,EAAE,EAAoB,QAAQ;IACzC,KAAK;IACL,OAAO,EAAgB,CAAC,oBAAoB;KAC9C,6BAA6B,EAAU,EAAS,IAAI;KACpD,mCAAmC,EAAc,EAAS,IAAI;KAC9D,8BACE,EAAS,KAAK,mBAAmB,EAAS,KAAK,YAAY,EAAQ;KACtE,CAAC,CAAC;IACC,MAAM;IACN,cAAc,EAAU,EAAS,KAAK;IACtC,gBAAgB,EAAc,EAAS,IAAI,GAAG,UAAU,EAAU,EAAS,IAAI;IAC/E,iBACF,EAAS,KAAK,mBAAmB,EAAS,KAAK,YAAY,EAAQ,YAAY,KAAA;IAE7E,UAAU;IACV,SAAS,GAAgB,MAAiB,EAAY,EAAS,MAAM,EAAO,EAAG,CAAC,OAAO,CAAC;IACxF,WAAW,CACT,GAAU,GAAgB,MAAiB,EAAY,EAAS,MAAM,EAAO,EAAG,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,EACxG,GAAU,GAAgB,MAAiB,EAAY,EAAS,MAAM,EAAO,EAAG,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,CACzG;IACF,EAAE,CAAC,GAAI,AAAc,EAAO,OAAK,CAChC,EAAoB,QAAQ;IAC1B,OAAO;IACP,eAAe;IAChB,EAAE,MAAM,GAAG,CACb,CAAG,EAAE,IAAI,GAAW,IACrB,EAAoB,IAAI,GAAK;GAChC,EAAQ,YAAY,EAAS,KAAK,QAAQ,EAAK,OAAO,QAClD,GAAY,EAAE,EAAoB,QAAQ,IAAY,CACrD,EAAY,EAAK,QAAQ,QAAQ,EAC/B,MAAM,EAAS,MAChB,QAAQ,CACN,EAAS,KAAK,QACV,GAAY,EAAE,EAAoB,QAAQ,IAAY,EAAiB,EAAS,KAAK,KAAK,EAAE,EAAE,IAC/F,EAAoB,IAAI,GAAK,CAClC,EAAE,GAAK,CACT,CAAC,IACF,EAAoB,IAAI,GAAK;GACjC,EAAoB,QAAQ,EAC1B,OAAO,EAAgB,CAAC,iBAAiB,EAAE,2BAA2B,EAAW,EAAS,KAAK,EAAE,CAAC,CAAC,EACpG,EAAE,CACD,EAAY,EAAK,QAAQ,SAAS,EAChC,MAAM,EAAS,MAChB,QAAQ,CACP,EAAiB,EAAiB,EAAU,EAAS,KAAK,CAAC,EAAE,EAAE,CAChE,EAAE,GAAK,CACT,EAAE,EAAE;GACN,EAAE,IAAI,GAAW,EAClB,EAAE,IAAI,EACT,EAAE,IAAI,GAAW;;CAInB,CAAA"}
1
+ {"version":3,"file":"design-system217.js","names":[],"sources":["../src/components/BTimePicker/BTimePicker.vue?vue&type=script&setup=true&lang.ts"],"sourcesContent":["import { useModel as _useModel, mergeModels as _mergeModels, defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, normalizeStyle as _normalizeStyle, renderList as _renderList, Fragment as _Fragment, normalizeClass as _normalizeClass } from \"vue\"\n\nconst _hoisted_1 = [\"id\", \"aria-expanded\", \"aria-controls\", \"aria-describedby\", \"aria-label\", \"placeholder\", \"disabled\", \"readonly\", \"value\"]\nconst _hoisted_2 = { class: \"b-time-picker__suffix\" }\nconst _hoisted_3 = {\n key: 0,\n class: \"b-time-picker__icon\",\n \"aria-hidden\": \"true\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"2\"\n}\nconst _hoisted_4 = [\"id\"]\nconst _hoisted_5 = [\"id\"]\nconst _hoisted_6 = {\n class: \"b-time-picker__columns\",\n role: \"group\",\n \"aria-label\": \"Time selection columns\"\n}\nconst _hoisted_7 = [\"aria-activedescendant\"]\nconst _hoisted_8 = [\"id\", \"aria-selected\", \"aria-disabled\", \"onClick\"]\nconst _hoisted_9 = [\"aria-activedescendant\"]\nconst _hoisted_10 = [\"id\", \"aria-selected\", \"aria-disabled\", \"onClick\"]\nconst _hoisted_11 = [\"aria-activedescendant\"]\nconst _hoisted_12 = [\"id\", \"aria-selected\", \"aria-disabled\", \"onClick\"]\nconst _hoisted_13 = [\"aria-selected\"]\nconst _hoisted_14 = [\"aria-selected\"]\nconst _hoisted_15 = {\n key: 0,\n class: \"b-time-picker__footer\"\n}\n\nimport { useComponentId } from '@/composables/useComponentId.ts';\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\n\nimport {\n BTimePickerPlacement,\n BTimePickerSize,\n BTimePickerStatus,\n BTimePickerVariant,\n type BTimePickerDisabledTime,\n} from './types';\n\n\nexport default /*@__PURE__*/_defineComponent({\n __name: 'BTimePicker',\n props: /*@__PURE__*/_mergeModels({\n size: { default: () => (BTimePickerSize.Medium) },\n variant: { default: () => (BTimePickerVariant.Outlined) },\n placeholder: { default: 'Select time' },\n disabled: { type: Boolean, default: false },\n inputReadOnly: { type: Boolean, default: false },\n allowClear: { type: Boolean, default: true },\n showNow: { type: Boolean, default: true },\n use12Hours: { type: Boolean, default: false },\n hourStep: { default: 1 },\n minuteStep: { default: 1 },\n secondStep: { default: 1 },\n format: {},\n placement: { default: () => (BTimePickerPlacement.BottomLeft) },\n status: {},\n hideDisabledOptions: { type: Boolean, default: false },\n needConfirm: { type: Boolean, default: true },\n changeOnScroll: { type: Boolean, default: false },\n showHour: { type: Boolean, default: true },\n showMinute: { type: Boolean, default: true },\n showSecond: { type: Boolean, default: true },\n defaultOpen: { type: Boolean, default: false },\n defaultValue: {},\n open: { type: Boolean },\n disabledTime: { type: Function }\n }, {\n \"modelValue\": { default: undefined },\n \"modelModifiers\": {},\n }),\n emits: /*@__PURE__*/_mergeModels([\"change\", \"openChange\"], [\"update:modelValue\"]),\n setup(__props: any, { expose: __expose, emit: __emit }) {\n\n\n\nconst model = _useModel<Date | null>(__props, \"modelValue\");\n\nconst emit = __emit;\n\nconst inputEl = ref<HTMLInputElement | null>(null);\nconst panelEl = ref<HTMLElement | null>(null);\nconst hourColEl = ref<HTMLElement | null>(null);\nconst minuteColEl = ref<HTMLElement | null>(null);\nconst secondColEl = ref<HTMLElement | null>(null);\nconst ampmColEl = ref<HTMLElement | null>(null);\n\n__expose({\n focus: () => inputEl.value?.focus(),\n blur: () => inputEl.value?.blur(),\n});\n\nconst { componentUID } = useComponentId();\nconst anchorName = computed(() => `--b-time-picker-${componentUID.value}`);\n\n// ─────────────────────────────────────────────\n// State\n// ─────────────────────────────────────────────\nconst isOpen = ref(__props.defaultOpen);\nconst isPanelOpen = ref(__props.open !== undefined ? !!__props.open : __props.defaultOpen);\nconst internalValue = ref<Date | null>(__props.defaultValue ?? null);\nconst pendingHour = ref<number | null>(null);\nconst pendingMinute = ref<number | null>(null);\nconst pendingSecond = ref<number | null>(null);\nconst pendingAmpm = ref<'AM' | 'PM' | null>(null);\nconst inputText = ref('');\nconst focusedColumn = ref<'hour' | 'minute' | 'second' | 'ampm'>('hour');\n\nconst selectedTime = computed({\n get: () => model.value ?? internalValue.value,\n set: (val) => {\n internalValue.value = val;\n model.value = val;\n },\n});\n\n// ─────────────────────────────────────────────\n// Format\n// ─────────────────────────────────────────────\nconst activeFormat = computed(() => {\n if (__props.format) return __props.format;\n const parts: string[] = [];\n if (__props.showHour) parts.push(__props.use12Hours ? 'hh' : 'HH');\n if (__props.showMinute) parts.push('mm');\n if (__props.showSecond) parts.push('ss');\n const base = parts.join(':');\n return __props.use12Hours ? `${base} A` : base;\n});\n\nfunction pad(n: number): string {\n return String(n).padStart(2, '0');\n}\n\nfunction formatTime(d: Date | null): string {\n if (!d) return '';\n const h = d.getHours();\n const m = d.getMinutes();\n const s = d.getSeconds();\n const ampm = h >= 12 ? 'PM' : 'AM';\n\n let result = activeFormat.value;\n if (__props.use12Hours) {\n const h12 = h % 12 || 12;\n result = result.replace('hh', pad(h12));\n result = result.replace('h', String(h12));\n result = result.replace('A', ampm);\n result = result.replace('a', ampm.toLowerCase());\n } else {\n result = result.replace('HH', pad(h));\n result = result.replace('H', String(h));\n }\n result = result.replace('mm', pad(m));\n result = result.replace('ss', pad(s));\n return result;\n}\n\nfunction parseTimeString(str: string): Date | null {\n if (!str.trim()) return null;\n const timeRegex12 = /(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*(AM|PM|am|pm)?/;\n const match = str.match(timeRegex12);\n if (!match) return null;\n\n let h = parseInt(match[1], 10);\n const m = parseInt(match[2], 10);\n const s = match[3] ? parseInt(match[3], 10) : 0;\n const period = match[4]?.toUpperCase();\n\n if (__props.use12Hours && period) {\n if (period === 'PM' && h < 12) h += 12;\n if (period === 'AM' && h === 12) h = 0;\n }\n\n if (h < 0 || h > 23 || m < 0 || m > 59 || s < 0 || s > 59) return null;\n\n const d = new Date();\n d.setHours(h, m, s, 0);\n return d;\n}\n\n// ─────────────────────────────────────────────\n// Disabled time logic\n// ─────────────────────────────────────────────\nconst disabledHours = computed<number[]>(() => {\n if (!__props.disabledTime) return [];\n const dt = __props.disabledTime();\n return dt.disabledHours?.() ?? [];\n});\n\nconst disabledMinutes = computed<number[]>(() => {\n if (!__props.disabledTime) return [];\n const dt = __props.disabledTime();\n const h = pendingHour.value ?? selectedTime.value?.getHours() ?? 0;\n return dt.disabledMinutes?.(h) ?? [];\n});\n\nconst disabledSeconds = computed<number[]>(() => {\n if (!__props.disabledTime) return [];\n const dt = __props.disabledTime();\n const h = pendingHour.value ?? selectedTime.value?.getHours() ?? 0;\n const m = pendingMinute.value ?? selectedTime.value?.getMinutes() ?? 0;\n return dt.disabledSeconds?.(h, m) ?? [];\n});\n\n// ─────────────────────────────────────────────\n// Column data\n// ─────────────────────────────────────────────\nconst hours = computed(() => {\n const list: number[] = [];\n if (__props.use12Hours) {\n for (let i = 1; i <= 12; i += __props.hourStep) list.push(i);\n } else {\n for (let i = 0; i < 24; i += __props.hourStep) list.push(i);\n }\n if (__props.hideDisabledOptions) {\n return list.filter((h) => !disabledHours.value.includes(__props.use12Hours ? to24Hour(h, pendingAmpm.value ?? 'AM') : h));\n }\n return list;\n});\n\nconst minutes = computed(() => {\n const list: number[] = [];\n for (let i = 0; i < 60; i += __props.minuteStep) list.push(i);\n if (__props.hideDisabledOptions) {\n return list.filter((m) => !disabledMinutes.value.includes(m));\n }\n return list;\n});\n\nconst seconds = computed(() => {\n const list: number[] = [];\n for (let i = 0; i < 60; i += __props.secondStep) list.push(i);\n if (__props.hideDisabledOptions) {\n return list.filter((s) => !disabledSeconds.value.includes(s));\n }\n return list;\n});\n\nfunction to24Hour(h12: number, period: 'AM' | 'PM'): number {\n if (period === 'AM') return h12 === 12 ? 0 : h12;\n return h12 === 12 ? 12 : h12 + 12;\n}\n\nfunction to12Hour(h24: number): { hour: number; period: 'AM' | 'PM' } {\n const period: 'AM' | 'PM' = h24 >= 12 ? 'PM' : 'AM';\n const hour = h24 % 12 || 12;\n return { hour, period };\n}\n\n// ─────────────────────────────────────────────\n// Panel open/close\n// ─────────────────────────────────────────────\nfunction openPanel() {\n if (__props.disabled) return;\n isOpen.value = true;\n isPanelOpen.value = true;\n emit('openChange', true);\n panelEl.value?.showPopover?.();\n syncPendingFromValue();\n nextTick(() => scrollToSelected());\n}\n\nfunction closePanel() {\n isOpen.value = false;\n isPanelOpen.value = false;\n emit('openChange', false);\n panelEl.value?.hidePopover?.();\n inputEl.value?.focus();\n}\n\nfunction togglePanel() {\n if (isPanelOpen.value) closePanel();\n else openPanel();\n}\n\nfunction handlePopoverToggle(e: Event) {\n const toggleEvent = e as ToggleEvent;\n const nowOpen = toggleEvent.newState === 'open';\n isOpen.value = nowOpen;\n isPanelOpen.value = nowOpen;\n if (!nowOpen) emit('openChange', false);\n}\n\n// ─────────────────────────────────────────────\n// Sync pending state\n// ─────────────────────────────────────────────\nfunction syncPendingFromValue() {\n const t = selectedTime.value;\n if (t) {\n if (__props.use12Hours) {\n const { hour, period } = to12Hour(t.getHours());\n pendingHour.value = hour;\n pendingAmpm.value = period;\n } else {\n pendingHour.value = t.getHours();\n }\n pendingMinute.value = t.getMinutes();\n pendingSecond.value = t.getSeconds();\n } else {\n pendingHour.value = null;\n pendingMinute.value = null;\n pendingSecond.value = null;\n pendingAmpm.value = null;\n }\n}\n\n// ─────────────────────────────────────────────\n// Selection\n// ─────────────────────────────────────────────\nfunction selectHour(h: number) {\n const h24 = __props.use12Hours ? to24Hour(h, pendingAmpm.value ?? 'AM') : h;\n if (disabledHours.value.includes(h24)) return;\n pendingHour.value = h;\n if (!__props.needConfirm && !__props.changeOnScroll) applyPendingIfComplete();\n else if (__props.changeOnScroll) applyPending();\n}\n\nfunction selectMinute(m: number) {\n if (disabledMinutes.value.includes(m)) return;\n pendingMinute.value = m;\n if (!__props.needConfirm && !__props.changeOnScroll) applyPendingIfComplete();\n else if (__props.changeOnScroll) applyPending();\n}\n\nfunction selectSecond(s: number) {\n if (disabledSeconds.value.includes(s)) return;\n pendingSecond.value = s;\n if (!__props.needConfirm && !__props.changeOnScroll) applyPendingIfComplete();\n else if (__props.changeOnScroll) applyPending();\n}\n\nfunction selectAmpm(val: 'AM' | 'PM') {\n pendingAmpm.value = val;\n if (!__props.needConfirm && !__props.changeOnScroll) applyPendingIfComplete();\n else if (__props.changeOnScroll) applyPending();\n}\n\nfunction applyPendingIfComplete() {\n if (pendingHour.value !== null && pendingMinute.value !== null) {\n if (__props.showSecond && pendingSecond.value === null) return;\n if (__props.use12Hours && pendingAmpm.value === null) return;\n applyPending();\n closePanel();\n }\n}\n\nfunction applyPending() {\n const h = pendingHour.value ?? 0;\n const m = pendingMinute.value ?? 0;\n const s = pendingSecond.value ?? 0;\n const h24 = __props.use12Hours ? to24Hour(h, pendingAmpm.value ?? 'AM') : h;\n\n const d = new Date();\n d.setHours(h24, m, s, 0);\n selectedTime.value = d;\n inputText.value = formatTime(d);\n emit('change', d, formatTime(d));\n}\n\nfunction handleOk() {\n applyPending();\n closePanel();\n}\n\nfunction handleNow() {\n const now = new Date();\n if (__props.use12Hours) {\n const { hour, period } = to12Hour(now.getHours());\n pendingHour.value = hour;\n pendingAmpm.value = period;\n } else {\n pendingHour.value = now.getHours();\n }\n pendingMinute.value = now.getMinutes();\n pendingSecond.value = now.getSeconds();\n nextTick(() => scrollToSelected());\n if (!__props.needConfirm) {\n applyPending();\n closePanel();\n }\n}\n\nfunction handleClear(e: Event) {\n e.stopPropagation();\n selectedTime.value = null;\n inputText.value = '';\n pendingHour.value = null;\n pendingMinute.value = null;\n pendingSecond.value = null;\n pendingAmpm.value = null;\n emit('change', null, '');\n}\n\n// ─────────────────────────────────────────────\n// Input handling\n// ─────────────────────────────────────────────\nfunction handleInputChange(e: Event) {\n const val = (e.target as HTMLInputElement).value;\n inputText.value = val;\n}\n\nfunction handleInputBlur() {\n if (!isPanelOpen.value) {\n const parsed = parseTimeString(inputText.value);\n if (parsed) {\n selectedTime.value = parsed;\n inputText.value = formatTime(parsed);\n emit('change', parsed, formatTime(parsed));\n } else if (inputText.value === '') {\n selectedTime.value = null;\n emit('change', null, '');\n } else {\n inputText.value = formatTime(selectedTime.value);\n }\n }\n}\n\nfunction handleInputKeydown(e: KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') {\n if (!isPanelOpen.value) {\n e.preventDefault();\n openPanel();\n } else if (e.key === 'Enter') {\n e.preventDefault();\n const parsed = parseTimeString(inputText.value);\n if (parsed) {\n selectedTime.value = parsed;\n inputText.value = formatTime(parsed);\n emit('change', parsed, formatTime(parsed));\n }\n closePanel();\n }\n } else if (e.key === 'Escape') {\n if (isPanelOpen.value) {\n e.preventDefault();\n closePanel();\n }\n }\n}\n\n// ─────────────────────────────────────────────\n// Panel keyboard navigation\n// ─────────────────────────────────────────────\nfunction handlePanelKeydown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.preventDefault();\n closePanel();\n return;\n }\n\n if (e.key === 'Tab') {\n const columns: ('hour' | 'minute' | 'second' | 'ampm')[] = [];\n if (__props.showHour) columns.push('hour');\n if (__props.showMinute) columns.push('minute');\n if (__props.showSecond) columns.push('second');\n if (__props.use12Hours) columns.push('ampm');\n\n const idx = columns.indexOf(focusedColumn.value);\n if (e.shiftKey) {\n if (idx > 0) {\n e.preventDefault();\n focusedColumn.value = columns[idx - 1];\n }\n } else {\n if (idx < columns.length - 1) {\n e.preventDefault();\n focusedColumn.value = columns[idx + 1];\n }\n }\n return;\n }\n\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const delta = e.key === 'ArrowUp' ? -1 : 1;\n adjustFocusedColumn(delta);\n return;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n handleOk();\n }\n}\n\nfunction adjustFocusedColumn(delta: number) {\n if (focusedColumn.value === 'hour') {\n const list = hours.value;\n const current = pendingHour.value ?? list[0];\n const idx = list.indexOf(current);\n const next = list[Math.max(0, Math.min(list.length - 1, idx + delta))];\n selectHour(next);\n scrollColumnTo(hourColEl.value, list.indexOf(next));\n } else if (focusedColumn.value === 'minute') {\n const list = minutes.value;\n const current = pendingMinute.value ?? list[0];\n const idx = list.indexOf(current);\n const next = list[Math.max(0, Math.min(list.length - 1, idx + delta))];\n selectMinute(next);\n scrollColumnTo(minuteColEl.value, list.indexOf(next));\n } else if (focusedColumn.value === 'second') {\n const list = seconds.value;\n const current = pendingSecond.value ?? list[0];\n const idx = list.indexOf(current);\n const next = list[Math.max(0, Math.min(list.length - 1, idx + delta))];\n selectSecond(next);\n scrollColumnTo(secondColEl.value, list.indexOf(next));\n } else if (focusedColumn.value === 'ampm') {\n const val = pendingAmpm.value === 'AM' ? 'PM' : 'AM';\n selectAmpm(val);\n }\n}\n\n// ─────────────────────────────────────────────\n// Scroll helpers\n// ─────────────────────────────────────────────\nfunction scrollColumnTo(col: HTMLElement | null, idx: number) {\n if (!col || !col.scrollTo) return;\n const cellHeight = 28;\n col.scrollTo({ top: idx * cellHeight, behavior: 'smooth' });\n}\n\nfunction scrollToSelected() {\n if (pendingHour.value !== null) {\n const idx = hours.value.indexOf(pendingHour.value);\n if (idx >= 0) scrollColumnTo(hourColEl.value, idx);\n }\n if (pendingMinute.value !== null) {\n const idx = minutes.value.indexOf(pendingMinute.value);\n if (idx >= 0) scrollColumnTo(minuteColEl.value, idx);\n }\n if (pendingSecond.value !== null && __props.showSecond) {\n const idx = seconds.value.indexOf(pendingSecond.value);\n if (idx >= 0) scrollColumnTo(secondColEl.value, idx);\n }\n if (pendingAmpm.value && __props.use12Hours) {\n const idx = pendingAmpm.value === 'AM' ? 0 : 1;\n scrollColumnTo(ampmColEl.value, idx);\n }\n}\n\n// ─────────────────────────────────────────────\n// Click outside\n// ─────────────────────────────────────────────\nfunction handleClickOutside(e: MouseEvent) {\n if (!isPanelOpen.value) return;\n const target = e.target as Node;\n if (panelEl.value?.contains(target)) return;\n if (inputEl.value?.parentElement?.contains(target)) return;\n closePanel();\n}\n\nonMounted(() => {\n document.addEventListener('mousedown', handleClickOutside);\n});\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', handleClickOutside);\n});\n\n// ─────────────────────────────────────────────\n// Watchers\n// ─────────────────────────────────────────────\nwatch(\n () => __props.open,\n (val) => {\n if (val !== undefined) {\n if (val) openPanel();\n else closePanel();\n }\n },\n);\n\nwatch(selectedTime, (val) => {\n inputText.value = formatTime(val);\n});\n\n// Init display\ninputText.value = formatTime(selectedTime.value);\n\n// ─────────────────────────────────────────────\n// Computed classes\n// ─────────────────────────────────────────────\nconst rootClasses = computed(() => [\n 'b-time-picker',\n `b-time-picker--${__props.size}`,\n `b-time-picker--${__props.variant}`,\n {\n 'b-time-picker--disabled': __props.disabled,\n 'b-time-picker--open': isPanelOpen.value,\n [`b-time-picker--${__props.status}`]: !!__props.status,\n },\n]);\n\nconst isHourDisabled = (h: number) => {\n const h24 = __props.use12Hours ? to24Hour(h, pendingAmpm.value ?? 'AM') : h;\n return disabledHours.value.includes(h24);\n};\nconst isMinuteDisabled = (m: number) => disabledMinutes.value.includes(m);\nconst isSecondDisabled = (s: number) => disabledSeconds.value.includes(s);\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass(rootClasses.value)\n }, [\n _createElementVNode(\"div\", {\n class: \"b-time-picker__input-wrap\",\n style: _normalizeStyle({ anchorName: anchorName.value }),\n onClick: togglePanel\n }, [\n _createElementVNode(\"input\", {\n id: `b-time-picker-input-${_unref(componentUID)}`,\n ref_key: \"inputEl\",\n ref: inputEl,\n class: \"b-time-picker__input\",\n type: \"text\",\n role: \"combobox\",\n \"aria-expanded\": isPanelOpen.value,\n \"aria-haspopup\": \"dialog\",\n \"aria-controls\": isPanelOpen.value ? `b-time-picker-panel-${_unref(componentUID)}` : undefined,\n \"aria-describedby\": __props.status ? `b-time-picker-status-${_unref(componentUID)}` : undefined,\n \"aria-label\": __props.placeholder,\n placeholder: __props.placeholder,\n disabled: __props.disabled,\n readonly: __props.inputReadOnly,\n value: inputText.value,\n autocomplete: \"off\",\n onInput: handleInputChange,\n onBlur: handleInputBlur,\n onKeydown: handleInputKeydown\n }, null, 40, _hoisted_1),\n _createElementVNode(\"span\", _hoisted_2, [\n (!__props.allowClear || !selectedTime.value)\n ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_3, [...(_cache[2] || (_cache[2] = [\n _createElementVNode(\"circle\", {\n cx: \"12\",\n cy: \"12\",\n r: \"10\"\n }, null, -1),\n _createElementVNode(\"polyline\", { points: \"12 6 12 12 16 14\" }, null, -1)\n ]))]))\n : (_openBlock(), _createElementBlock(\"button\", {\n key: 1,\n class: \"b-time-picker__clear\",\n type: \"button\",\n \"aria-label\": \"Clear time\",\n tabindex: \"-1\",\n onClick: handleClear\n }, [...(_cache[3] || (_cache[3] = [\n _createElementVNode(\"svg\", {\n \"aria-hidden\": \"true\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"2\"\n }, [\n _createElementVNode(\"circle\", {\n cx: \"12\",\n cy: \"12\",\n r: \"10\"\n }),\n _createElementVNode(\"line\", {\n x1: \"15\",\n y1: \"9\",\n x2: \"9\",\n y2: \"15\"\n }),\n _createElementVNode(\"line\", {\n x1: \"9\",\n y1: \"9\",\n x2: \"15\",\n y2: \"15\"\n })\n ], -1)\n ]))]))\n ]),\n (__props.status)\n ? (_openBlock(), _createElementBlock(\"span\", {\n key: 0,\n id: `b-time-picker-status-${_unref(componentUID)}`,\n class: \"b-time-picker__status-text\",\n \"aria-live\": \"polite\"\n }, _toDisplayString(__props.status), 9, _hoisted_4))\n : _createCommentVNode(\"\", true)\n ], 4),\n _createElementVNode(\"div\", {\n id: `b-time-picker-panel-${_unref(componentUID)}`,\n ref_key: \"panelEl\",\n ref: panelEl,\n class: \"b-time-picker__panel\",\n popover: \"\",\n role: \"dialog\",\n \"aria-label\": 'Time picker',\n \"aria-modal\": true,\n style: _normalizeStyle({ positionAnchor: anchorName.value }),\n onToggle: handlePopoverToggle,\n onKeydown: handlePanelKeydown\n }, [\n _createElementVNode(\"div\", _hoisted_6, [\n (__props.showHour)\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n ref_key: \"hourColEl\",\n ref: hourColEl,\n class: \"b-time-picker__column\",\n role: \"listbox\",\n \"aria-label\": 'Hours',\n \"aria-activedescendant\": pendingHour.value !== null ? `b-time-picker-hour-${pendingHour.value}-${_unref(componentUID)}` : undefined\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(hours.value, (h) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n id: `b-time-picker-hour-${h}-${_unref(componentUID)}`,\n key: h,\n class: _normalizeClass([\"b-time-picker__cell\", {\n 'b-time-picker__cell--selected': pendingHour.value === h,\n 'b-time-picker__cell--disabled': isHourDisabled(h),\n 'b-time-picker__cell--focused': focusedColumn.value === 'hour' && pendingHour.value === h,\n }]),\n role: \"option\",\n \"aria-selected\": pendingHour.value === h,\n \"aria-disabled\": isHourDisabled(h),\n onClick: ($event: any) => (selectHour(h))\n }, _toDisplayString(pad(h)), 11, _hoisted_8))\n }), 128))\n ], 8, _hoisted_7))\n : _createCommentVNode(\"\", true),\n (__props.showMinute)\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n ref_key: \"minuteColEl\",\n ref: minuteColEl,\n class: \"b-time-picker__column\",\n role: \"listbox\",\n \"aria-label\": 'Minutes',\n \"aria-activedescendant\": pendingMinute.value !== null ? `b-time-picker-minute-${pendingMinute.value}-${_unref(componentUID)}` : undefined\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(minutes.value, (m) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n id: `b-time-picker-minute-${m}-${_unref(componentUID)}`,\n key: m,\n class: _normalizeClass([\"b-time-picker__cell\", {\n 'b-time-picker__cell--selected': pendingMinute.value === m,\n 'b-time-picker__cell--disabled': isMinuteDisabled(m),\n 'b-time-picker__cell--focused': focusedColumn.value === 'minute' && pendingMinute.value === m,\n }]),\n role: \"option\",\n \"aria-selected\": pendingMinute.value === m,\n \"aria-disabled\": isMinuteDisabled(m),\n onClick: ($event: any) => (selectMinute(m))\n }, _toDisplayString(pad(m)), 11, _hoisted_10))\n }), 128))\n ], 8, _hoisted_9))\n : _createCommentVNode(\"\", true),\n (__props.showSecond)\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 2,\n ref_key: \"secondColEl\",\n ref: secondColEl,\n class: \"b-time-picker__column\",\n role: \"listbox\",\n \"aria-label\": 'Seconds',\n \"aria-activedescendant\": pendingSecond.value !== null ? `b-time-picker-second-${pendingSecond.value}-${_unref(componentUID)}` : undefined\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(seconds.value, (s) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n id: `b-time-picker-second-${s}-${_unref(componentUID)}`,\n key: s,\n class: _normalizeClass([\"b-time-picker__cell\", {\n 'b-time-picker__cell--selected': pendingSecond.value === s,\n 'b-time-picker__cell--disabled': isSecondDisabled(s),\n 'b-time-picker__cell--focused': focusedColumn.value === 'second' && pendingSecond.value === s,\n }]),\n role: \"option\",\n \"aria-selected\": pendingSecond.value === s,\n \"aria-disabled\": isSecondDisabled(s),\n onClick: ($event: any) => (selectSecond(s))\n }, _toDisplayString(pad(s)), 11, _hoisted_12))\n }), 128))\n ], 8, _hoisted_11))\n : _createCommentVNode(\"\", true),\n (__props.use12Hours)\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 3,\n ref_key: \"ampmColEl\",\n ref: ampmColEl,\n class: \"b-time-picker__column b-time-picker__column--ampm\",\n role: \"listbox\",\n \"aria-label\": \"AM/PM\"\n }, [\n _createElementVNode(\"div\", {\n class: _normalizeClass([\"b-time-picker__cell\", {\n 'b-time-picker__cell--selected': pendingAmpm.value === 'AM',\n 'b-time-picker__cell--focused': focusedColumn.value === 'ampm' && pendingAmpm.value === 'AM',\n }]),\n role: \"option\",\n \"aria-selected\": pendingAmpm.value === 'AM',\n onClick: _cache[0] || (_cache[0] = ($event: any) => (selectAmpm('AM')))\n }, \" AM \", 10, _hoisted_13),\n _createElementVNode(\"div\", {\n class: _normalizeClass([\"b-time-picker__cell\", {\n 'b-time-picker__cell--selected': pendingAmpm.value === 'PM',\n 'b-time-picker__cell--focused': focusedColumn.value === 'ampm' && pendingAmpm.value === 'PM',\n }]),\n role: \"option\",\n \"aria-selected\": pendingAmpm.value === 'PM',\n onClick: _cache[1] || (_cache[1] = ($event: any) => (selectAmpm('PM')))\n }, \" PM \", 10, _hoisted_14)\n ], 512))\n : _createCommentVNode(\"\", true)\n ]),\n (__props.needConfirm || __props.showNow)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_15, [\n (__props.showNow)\n ? (_openBlock(), _createElementBlock(\"button\", {\n key: 0,\n class: \"b-time-picker__now-btn\",\n type: \"button\",\n onClick: handleNow\n }, \" Now \"))\n : _createCommentVNode(\"\", true),\n (__props.needConfirm)\n ? (_openBlock(), _createElementBlock(\"button\", {\n key: 1,\n class: \"b-time-picker__ok-btn\",\n type: \"button\",\n onClick: handleOk\n }, \" OK \"))\n : _createCommentVNode(\"\", true)\n ]))\n : _createCommentVNode(\"\", true)\n ], 44, _hoisted_5)\n ], 2))\n}\n}\n\n})"],"mappings":"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"}
@@ -1,9 +1,8 @@
1
- import e from "./design-system14.js";
2
- import t from "./design-system217.js";
1
+ import e from "./design-system217.js";
3
2
  /* empty css */
4
- //#region src/components/BTree/BTree.vue
5
- var n = /* @__PURE__ */ e(t, [["__scopeId", "data-v-08bb45f2"]]);
3
+ //#region src/components/BTimePicker/BTimePicker.vue
4
+ var t = e;
6
5
  //#endregion
7
- export { n as default };
6
+ export { t as default };
8
7
 
9
8
  //# sourceMappingURL=design-system219.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"design-system219.js","names":[],"sources":["../src/components/BTree/BTree.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch } from 'vue';\nimport type {\n BTreeCheckedKeys,\n BTreeCheckInfo,\n BTreeDragInfo,\n BTreeDropInfo,\n BTreeExpandInfo,\n BTreeFieldNames,\n BTreeFlatNode,\n BTreeNodeData,\n BTreeNodeKey,\n BTreeScrollToOptions,\n BTreeSelectInfo,\n} from './types';\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nconst {\n treeData = [],\n fieldNames = {},\n checkable = false,\n checkStrictly = false,\n checkedKeys: checkedKeysProp = undefined,\n defaultCheckedKeys = [],\n selectedKeys: selectedKeysProp = undefined,\n defaultSelectedKeys = [],\n expandedKeys: expandedKeysProp = undefined,\n defaultExpandedKeys = [],\n defaultExpandAll = false,\n defaultExpandParent = true,\n autoExpandParent = false,\n multiple = false,\n selectable = true,\n disabled = false,\n showIcon = false,\n showLine = false,\n blockNode = false,\n draggable = false,\n loadData = undefined,\n loadedKeys: loadedKeysProp = undefined,\n filterTreeNode = undefined,\n height = undefined,\n virtual: _virtual = false,\n directory = false,\n expandAction = 'click',\n} = defineProps<{\n /** Tree node data array */\n treeData?: BTreeNodeData[];\n /** Custom field name mappings (key/title/children) */\n fieldNames?: BTreeFieldNames;\n /** Whether to show checkboxes */\n checkable?: boolean;\n /** Check parent/child independently */\n checkStrictly?: boolean;\n /** Controlled checked node keys */\n checkedKeys?: BTreeNodeKey[] | BTreeCheckedKeys;\n /** Default checked node keys (uncontrolled) */\n defaultCheckedKeys?: BTreeNodeKey[];\n /** Controlled selected node keys */\n selectedKeys?: BTreeNodeKey[];\n /** Default selected node keys (uncontrolled) */\n defaultSelectedKeys?: BTreeNodeKey[];\n /** Controlled expanded node keys */\n expandedKeys?: BTreeNodeKey[];\n /** Default expanded node keys (uncontrolled) */\n defaultExpandedKeys?: BTreeNodeKey[];\n /** Expand all nodes on mount */\n defaultExpandAll?: boolean;\n /** Auto expand parent of defaultExpandedKeys nodes */\n defaultExpandParent?: boolean;\n /** Auto expand parent when expandedKeys changes */\n autoExpandParent?: boolean;\n /** Allow multiple selection */\n multiple?: boolean;\n /** Allow node selection */\n selectable?: boolean;\n /** Disable entire tree */\n disabled?: boolean;\n /** Show node icons */\n showIcon?: boolean;\n /** Show connector lines */\n showLine?: boolean;\n /** Node takes full row width */\n blockNode?: boolean;\n /** Enable drag-and-drop */\n draggable?: boolean;\n /** Async load children */\n loadData?: (node: BTreeNodeData) => Promise<void>;\n /** Controlled loaded node keys */\n loadedKeys?: BTreeNodeKey[];\n /** Predicate to highlight nodes */\n filterTreeNode?: (node: BTreeNodeData) => boolean;\n /** Fixed height for virtual scroll (px) */\n height?: number;\n /** Enable virtual scroll (requires height) */\n virtual?: boolean;\n /** Enable DirectoryTree mode */\n directory?: boolean;\n /** DirectoryTree: expansion trigger (click | doubleClick | false) */\n expandAction?: 'click' | 'doubleClick' | false;\n}>();\n\n// ─── Emits ────────────────────────────────────────────────────────────────────\n\nconst emit = defineEmits<{\n /** Fires when check state changes */\n check: [keys: BTreeNodeKey[] | BTreeCheckedKeys, info: BTreeCheckInfo];\n /** Fires when expand state changes */\n expand: [keys: BTreeNodeKey[], info: BTreeExpandInfo];\n /** Fires when selection changes */\n select: [keys: BTreeNodeKey[], info: BTreeSelectInfo];\n /** Fires when async load finishes */\n load: [keys: BTreeNodeKey[], info: { event: Event; node: BTreeNodeData }];\n /** Fires on right-click */\n rightClick: [info: { event: MouseEvent; node: BTreeNodeData }];\n /** Fires on drag start */\n dragStart: [info: BTreeDragInfo];\n /** Fires when dragged over a node */\n dragEnter: [info: { event: DragEvent; node: BTreeNodeData; expandedKeys: BTreeNodeKey[] }];\n /** Fires while dragging over a node */\n dragOver: [info: BTreeDragInfo];\n /** Fires when leaving a node during drag */\n dragLeave: [info: BTreeDragInfo];\n /** Fires when drag ends */\n dragEnd: [info: BTreeDragInfo];\n /** Fires on drop */\n drop: [info: BTreeDropInfo];\n /** Fires on double-click */\n dblclick: [event: MouseEvent, node: BTreeNodeData];\n /** v-model:checkedKeys */\n 'update:checkedKeys': [keys: BTreeNodeKey[] | BTreeCheckedKeys];\n /** v-model:selectedKeys */\n 'update:selectedKeys': [keys: BTreeNodeKey[]];\n /** v-model:expandedKeys */\n 'update:expandedKeys': [keys: BTreeNodeKey[]];\n /** v-model:loadedKeys */\n 'update:loadedKeys': [keys: BTreeNodeKey[]];\n}>();\n\n// ─── Slots ────────────────────────────────────────────────────────────────────\n\ndefineSlots<{\n /** Default icon for all nodes */\n icon(props: { node: BTreeNodeData }): unknown;\n /** Custom switcher icon */\n switcherIcon(props: { node: BTreeNodeData; expanded: boolean }): unknown;\n /** Custom title renderer */\n title(props: { node: BTreeNodeData }): unknown;\n}>();\n\n// ─── Resolved field names ─────────────────────────────────────────────────────\n\nconst fKey = computed(() => fieldNames.key ?? 'key');\nconst fTitle = computed(() => fieldNames.title ?? 'title');\nconst fChildren = computed(() => fieldNames.children ?? 'children');\n\nfunction nodeKey(n: BTreeNodeData): BTreeNodeKey {\n return n[fKey.value] as BTreeNodeKey;\n}\nfunction nodeTitle(n: BTreeNodeData): string {\n return (n[fTitle.value] as string) ?? '';\n}\nfunction nodeChildren(n: BTreeNodeData): BTreeNodeData[] | undefined {\n return n[fChildren.value] as BTreeNodeData[] | undefined;\n}\n\n// ─── Internal state ───────────────────────────────────────────────────────────\n\nconst internalExpanded = ref<Set<BTreeNodeKey>>(new Set());\nconst internalSelected = ref<Set<BTreeNodeKey>>(new Set());\nconst internalChecked = ref<Set<BTreeNodeKey>>(new Set());\nconst internalHalfChecked = ref<Set<BTreeNodeKey>>(new Set());\nconst internalLoaded = ref<Set<BTreeNodeKey>>(new Set());\nconst loadingKeys = ref<Set<BTreeNodeKey>>(new Set());\nconst dragNodeKey = ref<BTreeNodeKey | null>(null);\n\n// Controlled getters\nconst isControlledExpanded = computed(() => expandedKeysProp !== undefined);\nconst isControlledSelected = computed(() => selectedKeysProp !== undefined);\nconst isControlledChecked = computed(() => checkedKeysProp !== undefined);\nconst isControlledLoaded = computed(() => loadedKeysProp !== undefined);\n\nconst activeExpanded = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledExpanded.value) return new Set(expandedKeysProp);\n return internalExpanded.value;\n});\n\nconst activeSelected = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledSelected.value) return new Set(selectedKeysProp);\n return internalSelected.value;\n});\n\nconst activeChecked = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledChecked.value) {\n const raw = checkedKeysProp as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n if (Array.isArray(raw)) return new Set(raw);\n return new Set(raw.checked);\n }\n return internalChecked.value;\n});\n\nconst activeHalfChecked = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledChecked.value) {\n const raw = checkedKeysProp as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n if (!Array.isArray(raw) && 'halfChecked' in raw) return new Set(raw.halfChecked);\n }\n return internalHalfChecked.value;\n});\n\nconst activeLoaded = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledLoaded.value) return new Set(loadedKeysProp);\n return internalLoaded.value;\n});\n\n// ─── Flatten tree ─────────────────────────────────────────────────────────────\n\nfunction flattenTree(nodes: BTreeNodeData[], depth = 0, parentVisible = true): BTreeFlatNode[] {\n const result: BTreeFlatNode[] = [];\n for (const node of nodes) {\n const key = nodeKey(node);\n const isExpanded = activeExpanded.value.has(key);\n const visible = parentVisible;\n result.push({ key, data: node, depth, visible });\n const children = nodeChildren(node);\n if (children?.length) {\n result.push(...flattenTree(children, depth + 1, visible && isExpanded));\n }\n }\n return result;\n}\n\nconst flatNodes = computed(() => flattenTree(treeData));\nconst visibleNodes = computed(() => flatNodes.value.filter((n) => n.visible));\n\n// ─── Mount: apply defaults ────────────────────────────────────────────────────\n\nfunction collectAllKeys(nodes: BTreeNodeData[]): BTreeNodeKey[] {\n const keys: BTreeNodeKey[] = [];\n for (const n of nodes) {\n keys.push(nodeKey(n));\n const children = nodeChildren(n);\n if (children?.length) keys.push(...collectAllKeys(children));\n }\n return keys;\n}\n\nfunction collectParentKeys(nodes: BTreeNodeData[], targetKeys: Set<BTreeNodeKey>): BTreeNodeKey[] {\n const parents: BTreeNodeKey[] = [];\n function walk(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n const children = nodeChildren(n);\n if (children?.length) {\n const hasDescendant = children.some(\n (c) => targetKeys.has(nodeKey(c)) || walk([c]) !== undefined,\n );\n if (hasDescendant) parents.push(nodeKey(n));\n walk(children);\n }\n }\n }\n walk(nodes);\n return parents;\n}\n\n// Initialise uncontrolled state once\nif (!isControlledExpanded.value) {\n if (defaultExpandAll) {\n internalExpanded.value = new Set(\n collectAllKeys(treeData).filter((k) => {\n const flat = flatNodes.value.find((n) => n.key === k);\n return flat ? !!nodeChildren(flat.data)?.length : false;\n }),\n );\n } else if (defaultExpandedKeys.length) {\n const init = new Set<BTreeNodeKey>(defaultExpandedKeys);\n if (defaultExpandParent) {\n collectParentKeys(treeData, init).forEach((k) => init.add(k));\n }\n internalExpanded.value = init;\n }\n}\nif (!isControlledSelected.value && defaultSelectedKeys.length) {\n internalSelected.value = new Set(defaultSelectedKeys);\n}\nif (!isControlledChecked.value && defaultCheckedKeys.length) {\n internalChecked.value = new Set(defaultCheckedKeys);\n if (!checkStrictly) propagateChecks(internalChecked.value);\n}\n\n// Auto-expand parents when controlled expandedKeys change\nwatch(\n () => expandedKeysProp,\n (keys) => {\n if (!autoExpandParent || !keys) return;\n const set = new Set(keys);\n collectParentKeys(treeData, set).forEach((k) => set.add(k));\n emit('update:expandedKeys', [...set]);\n },\n);\n\n// ─── Checkbox propagation ─────────────────────────────────────────────────────\n\nfunction propagateChecks(checked: Set<BTreeNodeKey>) {\n // Bottom-up: compute half-checked from actual checked leaves\n const half = new Set<BTreeNodeKey>();\n function walk(nodes: BTreeNodeData[]): { all: boolean; some: boolean } {\n let allChecked = true;\n let someChecked = false;\n for (const n of nodes) {\n const key = nodeKey(n);\n const children = nodeChildren(n);\n if (children?.length) {\n const sub = walk(children);\n if (sub.all) {\n checked.add(key);\n someChecked = true;\n } else if (sub.some) {\n checked.delete(key);\n half.add(key);\n allChecked = false;\n someChecked = true;\n } else {\n if (!checked.has(key)) allChecked = false;\n else someChecked = true;\n }\n } else {\n if (!checked.has(key)) allChecked = false;\n else someChecked = true;\n }\n }\n return { all: allChecked, some: someChecked };\n }\n walk(treeData);\n internalHalfChecked.value = half;\n}\n\n// ─── Node helpers ─────────────────────────────────────────────────────────────\n\nfunction hasChildren(node: BTreeNodeData): boolean {\n const ch = nodeChildren(node);\n return !!ch?.length || (!!loadData && !node.isLeaf);\n}\n\nfunction isExpanded(key: BTreeNodeKey): boolean {\n return activeExpanded.value.has(key);\n}\nfunction isSelected(key: BTreeNodeKey): boolean {\n return activeSelected.value.has(key);\n}\nfunction isChecked(key: BTreeNodeKey): boolean {\n return activeChecked.value.has(key);\n}\nfunction isHalfChecked(key: BTreeNodeKey): boolean {\n return activeHalfChecked.value.has(key);\n}\nfunction isLoading(key: BTreeNodeKey): boolean {\n return loadingKeys.value.has(key);\n}\nfunction isLoaded(key: BTreeNodeKey): boolean {\n return activeLoaded.value.has(key);\n}\nfunction isFiltered(node: BTreeNodeData): boolean {\n return filterTreeNode ? filterTreeNode(node) : false;\n}\n\n// ─── Expand / collapse ────────────────────────────────────────────────────────\n\nasync function toggleExpand(node: BTreeNodeData, event?: MouseEvent | KeyboardEvent) {\n const key = nodeKey(node);\n if (node.disabled || disabled) return;\n\n const expanding = !isExpanded(key);\n\n // Async load\n if (expanding && loadData && !isLoaded(key) && !isLoading(key)) {\n loadingKeys.value.add(key);\n try {\n await loadData(node);\n if (!isControlledLoaded.value) internalLoaded.value.add(key);\n emit('update:loadedKeys', [...activeLoaded.value, key]);\n } finally {\n loadingKeys.value.delete(key);\n }\n }\n\n let nextSet: Set<BTreeNodeKey>;\n if (isControlledExpanded.value) {\n nextSet = new Set(expandedKeysProp);\n } else {\n nextSet = new Set(internalExpanded.value);\n }\n\n if (expanding) nextSet.add(key);\n else nextSet.delete(key);\n\n if (!isControlledExpanded.value) internalExpanded.value = nextSet;\n emit('update:expandedKeys', [...nextSet]);\n\n const info: BTreeExpandInfo = { expanded: expanding, node, event };\n emit('expand', [...nextSet], info);\n}\n\n// ─── Select ───────────────────────────────────────────────────────────────────\n\nfunction handleSelect(node: BTreeNodeData, event: MouseEvent | KeyboardEvent) {\n if (!selectable || node.selectable === false || node.disabled || disabled) return;\n const key = nodeKey(node);\n\n let nextSet: Set<BTreeNodeKey>;\n if (isControlledSelected.value) {\n nextSet = new Set(selectedKeysProp);\n } else {\n nextSet = new Set(internalSelected.value);\n }\n\n if (nextSet.has(key)) {\n nextSet.delete(key);\n } else {\n if (!multiple) nextSet.clear();\n nextSet.add(key);\n }\n\n if (!isControlledSelected.value) internalSelected.value = nextSet;\n emit('update:selectedKeys', [...nextSet]);\n\n const info: BTreeSelectInfo = {\n event,\n selected: nextSet.has(key),\n node,\n selectedNodes: flatNodes.value.filter((n) => nextSet.has(n.key)).map((n) => n.data),\n nativeEvent: event,\n };\n emit('select', [...nextSet], info);\n}\n\n// ─── Check ────────────────────────────────────────────────────────────────────\n\nfunction handleCheck(node: BTreeNodeData, event: MouseEvent | KeyboardEvent) {\n if (!checkable || node.disableCheckbox || node.disabled || disabled) return;\n const key = nodeKey(node);\n\n let nextChecked: Set<BTreeNodeKey>;\n if (isControlledChecked.value) {\n const raw = checkedKeysProp as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n nextChecked = new Set(Array.isArray(raw) ? raw : raw.checked);\n } else {\n nextChecked = new Set(internalChecked.value);\n }\n\n if (nextChecked.has(key)) {\n nextChecked.delete(key);\n // Uncheck all descendants\n if (!checkStrictly) {\n function uncheckDesc(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n nextChecked.delete(nodeKey(n));\n const ch = nodeChildren(n);\n if (ch?.length) uncheckDesc(ch);\n }\n }\n const children = nodeChildren(node);\n if (children?.length) uncheckDesc(children);\n }\n } else {\n nextChecked.add(key);\n // Check all descendants\n if (!checkStrictly) {\n function checkDesc(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n if (!n.disableCheckbox && !n.disabled) nextChecked.add(nodeKey(n));\n const ch = nodeChildren(n);\n if (ch?.length) checkDesc(ch);\n }\n }\n const children = nodeChildren(node);\n if (children?.length) checkDesc(children);\n }\n }\n\n if (!checkStrictly && !isControlledChecked.value) {\n propagateChecks(nextChecked);\n }\n\n const checkedNodes = flatNodes.value.filter((n) => nextChecked.has(n.key)).map((n) => n.data);\n\n const info: BTreeCheckInfo = {\n event,\n node,\n checked: nextChecked.has(key),\n checkedNodes,\n checkedNodesPositions: checkedNodes.map((n) => ({ node: n, pos: '0' })),\n halfCheckedKeys: [...activeHalfChecked.value],\n nativeEvent: event,\n };\n\n if (!isControlledChecked.value) internalChecked.value = nextChecked;\n\n const emitValue: BTreeNodeKey[] | BTreeCheckedKeys = checkStrictly\n ? { checked: [...nextChecked], halfChecked: [...activeHalfChecked.value] }\n : [...nextChecked];\n\n emit('update:checkedKeys', emitValue);\n emit('check', emitValue, info);\n}\n\n// ─── Drag & Drop ──────────────────────────────────────────────────────────────\n\nfunction handleDragStart(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n dragNodeKey.value = nodeKey(node);\n event.dataTransfer?.setData('text/plain', String(nodeKey(node)));\n emit('dragStart', { event, node });\n}\n\nfunction handleDragEnter(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n event.preventDefault();\n emit('dragEnter', { event, node, expandedKeys: [...activeExpanded.value] });\n}\n\nfunction handleDragOver(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n event.preventDefault();\n emit('dragOver', { event, node });\n}\n\nfunction handleDragLeave(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n emit('dragLeave', { event, node });\n}\n\nfunction handleDragEnd(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n dragNodeKey.value = null;\n emit('dragEnd', { event, node });\n}\n\nfunction handleDrop(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n event.preventDefault();\n const dragFlat = flatNodes.value.find((n) => n.key === dragNodeKey.value);\n if (!dragFlat) return;\n\n emit('drop', {\n event,\n node,\n dragNode: dragFlat.data,\n dragNodesKeys: [dragFlat.key],\n dropPosition: 0,\n dropToGap: false,\n });\n dragNodeKey.value = null;\n}\n\n// ─── Keyboard navigation ──────────────────────────────────────────────────────\n\nconst treeRef = ref<HTMLElement | null>(null);\n\nconst focusedNodeKey = ref<BTreeNodeKey | null>(visibleNodes.value[0]?.key ?? null);\n\nfunction handleTreeKeydown(event: KeyboardEvent) {\n const visible = visibleNodes.value;\n if (!visible.length) return;\n\n const currentIdx = visible.findIndex((n) => n.key === focusedNodeKey.value);\n const current = visible[currentIdx];\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n const next = visible[currentIdx + 1];\n if (next) {\n focusedNodeKey.value = next.key;\n nextTick(() => focusNode(next.key));\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n const prev = visible[currentIdx - 1];\n if (prev) {\n focusedNodeKey.value = prev.key;\n nextTick(() => focusNode(prev.key));\n }\n break;\n }\n case 'ArrowRight': {\n event.preventDefault();\n if (!current) break;\n if (hasChildren(current.data) && !isExpanded(current.key)) {\n toggleExpand(current.data, event);\n } else if (isExpanded(current.key)) {\n const firstChild = visible[currentIdx + 1];\n if (firstChild?.depth > current.depth) {\n focusedNodeKey.value = firstChild.key;\n nextTick(() => focusNode(firstChild.key));\n }\n }\n break;\n }\n case 'ArrowLeft': {\n event.preventDefault();\n if (!current) break;\n if (isExpanded(current.key)) {\n toggleExpand(current.data, event);\n } else if (current.depth > 0) {\n // Move to parent\n for (let i = currentIdx - 1; i >= 0; i--) {\n if (visible[i].depth < current.depth) {\n focusedNodeKey.value = visible[i].key;\n nextTick(() => focusNode(visible[i].key));\n break;\n }\n }\n }\n break;\n }\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (!current) break;\n if (checkable) {\n handleCheck(current.data, event);\n } else if (selectable) {\n handleSelect(current.data, event);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n if (visible[0]) {\n focusedNodeKey.value = visible[0].key;\n nextTick(() => focusNode(visible[0].key));\n }\n break;\n }\n case 'End': {\n event.preventDefault();\n const last = visible[visible.length - 1];\n if (last) {\n focusedNodeKey.value = last.key;\n nextTick(() => focusNode(last.key));\n }\n break;\n }\n }\n}\n\nfunction focusNode(key: BTreeNodeKey) {\n const el = treeRef.value?.querySelector<HTMLElement>(\n `[data-node-key=\"${String(key).replace(/[\"\\\\]/g, '\\\\$&')}\"]`,\n );\n el?.focus();\n}\n\n// ─── Directory-mode: click/dblclick expand ────────────────────────────────────\n\nfunction handleNodeClick(node: BTreeNodeData, event: MouseEvent) {\n if (directory && expandAction === 'click' && hasChildren(node)) {\n toggleExpand(node, event);\n }\n handleSelect(node, event);\n}\n\nfunction handleNodeDblClick(node: BTreeNodeData, event: MouseEvent) {\n if (directory && expandAction === 'doubleClick' && hasChildren(node)) {\n toggleExpand(node, event);\n }\n emit('dblclick', event, node);\n}\n\n// ─── Scroll to ────────────────────────────────────────────────────────────────\n\nfunction scrollTo(opts: BTreeScrollToOptions) {\n nextTick(() => {\n const el = treeRef.value?.querySelector<HTMLElement>(\n `[data-node-key=\"${String(opts.key).replace(/[\"\\\\]/g, '\\\\$&')}\"]`,\n );\n const alignMap = { top: 'start', bottom: 'end', auto: 'nearest' } as const;\n el?.scrollIntoView?.({ block: alignMap[opts.align ?? 'auto'] });\n });\n}\n\ndefineExpose({ scrollTo });\n\n// ─── Right click ─────────────────────────────────────────────────────────────\n\nfunction handleRightClick(event: MouseEvent, node: BTreeNodeData) {\n event.preventDefault();\n emit('rightClick', { event, node });\n}\n</script>\n\n<template>\n <div\n ref=\"treeRef\"\n class=\"b-tree\"\n :class=\"{\n 'b-tree--checkable': checkable,\n 'b-tree--show-line': showLine,\n 'b-tree--block-node': blockNode,\n 'b-tree--directory': directory,\n 'b-tree--disabled': disabled,\n }\"\n role=\"tree\"\n :aria-multiselectable=\"multiple || undefined\"\n :style=\"height ? { height: `${height}px`, overflowY: 'auto' } : undefined\"\n @keydown=\"handleTreeKeydown\"\n >\n <template v-for=\"flatNode in visibleNodes\" :key=\"flatNode.key\">\n <div\n :data-node-key=\"String(flatNode.key)\"\n class=\"b-tree__node\"\n :class=\"{\n 'b-tree__node--selected': isSelected(flatNode.key),\n 'b-tree__node--checked': isChecked(flatNode.key),\n 'b-tree__node--half-checked': isHalfChecked(flatNode.key),\n 'b-tree__node--expanded': isExpanded(flatNode.key),\n 'b-tree__node--disabled': flatNode.data.disabled || disabled,\n 'b-tree__node--leaf': !hasChildren(flatNode.data),\n 'b-tree__node--loading': isLoading(flatNode.key),\n 'b-tree__node--dragging': draggable && dragNodeKey === flatNode.key,\n 'b-tree__node--filtered': isFiltered(flatNode.data),\n 'b-tree__node--block': blockNode,\n }\"\n role=\"treeitem\"\n :aria-expanded=\"hasChildren(flatNode.data) ? isExpanded(flatNode.key) : undefined\"\n :aria-selected=\"selectable ? isSelected(flatNode.key) : undefined\"\n :aria-checked=\"checkable ? isChecked(flatNode.key) : undefined\"\n :aria-disabled=\"flatNode.data.disabled || disabled || undefined\"\n :aria-level=\"flatNode.depth + 1\"\n :tabindex=\"flatNode.key === focusedNodeKey ? 0 : -1\"\n :style=\"{ '--b-tree-node-indent': `${flatNode.depth * 24}px` }\"\n :draggable=\"draggable ? 'true' : undefined\"\n @click.stop=\"handleNodeClick(flatNode.data, $event)\"\n @dblclick.stop=\"handleNodeDblClick(flatNode.data, $event)\"\n @contextmenu.stop=\"handleRightClick($event, flatNode.data)\"\n @dragstart=\"handleDragStart($event, flatNode.data)\"\n @dragenter=\"handleDragEnter($event, flatNode.data)\"\n @dragover=\"handleDragOver($event, flatNode.data)\"\n @dragleave=\"handleDragLeave($event, flatNode.data)\"\n @dragend=\"handleDragEnd($event, flatNode.data)\"\n @drop=\"handleDrop($event, flatNode.data)\"\n >\n <!-- Drag handle (visible on row hover when draggable) -->\n <span v-if=\"draggable\" class=\"b-tree__drag-handle\" aria-hidden=\"true\">\n <!-- HolderOutlined: 2×3 dot grid -->\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"5\" cy=\"3.5\" r=\"1.25\" />\n <circle cx=\"5\" cy=\"8\" r=\"1.25\" />\n <circle cx=\"5\" cy=\"12.5\" r=\"1.25\" />\n <circle cx=\"11\" cy=\"3.5\" r=\"1.25\" />\n <circle cx=\"11\" cy=\"8\" r=\"1.25\" />\n <circle cx=\"11\" cy=\"12.5\" r=\"1.25\" />\n </svg>\n </span>\n\n <!-- Indent spacer -->\n <span class=\"b-tree__indent\" aria-hidden=\"true\" />\n\n <!-- Switcher (expand/collapse) -->\n <span\n v-if=\"hasChildren(flatNode.data)\"\n class=\"b-tree__switcher\"\n :class=\"{\n 'b-tree__switcher--expanded': isExpanded(flatNode.key),\n 'b-tree__switcher--loading': isLoading(flatNode.key),\n }\"\n aria-hidden=\"true\"\n @click.stop=\"toggleExpand(flatNode.data, $event)\"\n >\n <slot\n v-if=\"!isLoading(flatNode.key)\"\n name=\"switcherIcon\"\n :node=\"flatNode.data\"\n :expanded=\"isExpanded(flatNode.key)\"\n >\n <!-- Default chevron SVG -->\n <svg\n class=\"b-tree__switcher-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M9 18L15 12L9 6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </slot>\n <!-- Loading spinner -->\n <svg\n v-if=\"isLoading(flatNode.key)\"\n class=\"b-tree__switcher-icon b-tree__switcher-icon--spin\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-dasharray=\"42\"\n stroke-dashoffset=\"14\"\n stroke-linecap=\"round\"\n />\n </svg>\n </span>\n <!-- Leaf placeholder -->\n <span\n v-else-if=\"showLine\"\n class=\"b-tree__switcher b-tree__switcher--leaf\"\n aria-hidden=\"true\"\n />\n\n <!-- Checkbox -->\n <span\n v-if=\"checkable && flatNode.data.checkable !== false\"\n class=\"b-tree__checkbox\"\n :class=\"{\n 'b-tree__checkbox--checked': isChecked(flatNode.key),\n 'b-tree__checkbox--indeterminate': isHalfChecked(flatNode.key),\n 'b-tree__checkbox--disabled':\n flatNode.data.disableCheckbox || flatNode.data.disabled || disabled,\n }\"\n role=\"checkbox\"\n :aria-label=\"nodeTitle(flatNode.data)\"\n :aria-checked=\"isHalfChecked(flatNode.key) ? 'mixed' : isChecked(flatNode.key)\"\n :aria-disabled=\"\n flatNode.data.disableCheckbox || flatNode.data.disabled || disabled || undefined\n \"\n tabindex=\"-1\"\n @click.stop=\"handleCheck(flatNode.data, $event)\"\n @keydown.enter.prevent=\"handleCheck(flatNode.data, $event)\"\n @keydown.space.prevent=\"handleCheck(flatNode.data, $event)\"\n >\n <span class=\"b-tree__checkbox-inner\" aria-hidden=\"true\" />\n </span>\n\n <!-- Icon -->\n <span\n v-if=\"showIcon || flatNode.data.icon || $slots.icon\"\n class=\"b-tree__icon\"\n aria-hidden=\"true\"\n >\n <slot name=\"icon\" :node=\"flatNode.data\">\n <span v-if=\"flatNode.data.icon\">{{ flatNode.data.icon }}</span>\n </slot>\n </span>\n\n <!-- Title -->\n <span\n class=\"b-tree__title\"\n :class=\"{ 'b-tree__title--filtered': isFiltered(flatNode.data) }\"\n >\n <slot name=\"title\" :node=\"flatNode.data\">\n {{ nodeTitle(flatNode.data) }}\n </slot>\n </span>\n </div>\n </template>\n </div>\n</template>\n\n<style scoped>\n/* ─── Root ──────────────────────────────────────────────────────────────────── */\n.b-tree {\n /* Layout */\n --b-tree-indent-size: 24px;\n --b-tree-node-height: 24px;\n --b-tree-switcher-size: 24px;\n --b-tree-checkbox-size: 16px;\n --b-tree-icon-size: 14px;\n --b-tree-gap: 4px;\n --b-tree-border-radius: 6px;\n --b-tree-font-size: 14px;\n\n /* Colors – light mode */\n --b-tree-node-hover-bg: oklch(95% 0.003 264);\n --b-tree-node-hover-color: oklch(20% 0.014 264);\n --b-tree-node-selected-bg: oklch(94% 0.08 254);\n --b-tree-node-selected-color: oklch(20% 0.014 264);\n --b-tree-node-disabled-color: oklch(70% 0.005 264);\n --b-tree-switcher-color: oklch(55% 0.008 264);\n --b-tree-checkbox-border: oklch(75% 0.008 264);\n --b-tree-checkbox-bg: oklch(100% 0 0);\n --b-tree-checkbox-checked-bg: oklch(55% 0.22 260);\n --b-tree-checkbox-checked-border: oklch(55% 0.22 260);\n --b-tree-checkbox-indeterminate-bg: oklch(55% 0.22 260);\n --b-tree-line-color: oklch(88% 0.006 264);\n --b-tree-title-color: oklch(20% 0.014 264);\n --b-tree-title-filtered-color: oklch(55% 0.22 260);\n --b-tree-directory-selected-bg: oklch(55% 0.22 260);\n --b-tree-directory-selected-color: oklch(100% 0 0);\n\n /* Motion */\n --b-tree-transition-duration: 200ms;\n --b-tree-spin-duration: 700ms;\n\n display: block;\n font-size: var(--b-tree-font-size);\n line-height: var(--b-tree-node-height);\n color: var(--b-tree-title-color);\n outline: none;\n}\n\n/* ─── Dark mode ─────────────────────────────────────────────────────────────── */\n[data-prefers-color='dark'] .b-tree {\n --b-tree-node-hover-bg: oklch(28% 0.012 264);\n --b-tree-node-hover-color: oklch(92% 0.006 264);\n --b-tree-node-selected-bg: oklch(30% 0.06 254);\n --b-tree-node-selected-color: oklch(92% 0.006 264);\n --b-tree-node-disabled-color: oklch(45% 0.005 264);\n --b-tree-switcher-color: oklch(65% 0.008 264);\n --b-tree-checkbox-border: oklch(45% 0.008 264);\n --b-tree-checkbox-bg: oklch(22% 0.012 264);\n --b-tree-checkbox-checked-bg: oklch(55% 0.22 260);\n --b-tree-checkbox-checked-border: oklch(55% 0.22 260);\n --b-tree-checkbox-indeterminate-bg: oklch(55% 0.22 260);\n --b-tree-line-color: oklch(35% 0.008 264);\n --b-tree-title-color: oklch(92% 0.006 264);\n --b-tree-title-filtered-color: oklch(65% 0.22 260);\n --b-tree-directory-selected-bg: oklch(45% 0.22 260);\n --b-tree-directory-selected-color: oklch(100% 0 0);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-tree {\n --b-tree-node-hover-bg: oklch(28% 0.012 264);\n --b-tree-node-hover-color: oklch(92% 0.006 264);\n --b-tree-node-selected-bg: oklch(30% 0.06 254);\n --b-tree-node-selected-color: oklch(92% 0.006 264);\n --b-tree-node-disabled-color: oklch(45% 0.005 264);\n --b-tree-switcher-color: oklch(65% 0.008 264);\n --b-tree-checkbox-border: oklch(45% 0.008 264);\n --b-tree-checkbox-bg: oklch(22% 0.012 264);\n --b-tree-checkbox-checked-bg: oklch(55% 0.22 260);\n --b-tree-checkbox-checked-border: oklch(55% 0.22 260);\n --b-tree-checkbox-indeterminate-bg: oklch(55% 0.22 260);\n --b-tree-line-color: oklch(35% 0.008 264);\n --b-tree-title-color: oklch(92% 0.006 264);\n --b-tree-title-filtered-color: oklch(65% 0.22 260);\n --b-tree-directory-selected-bg: oklch(45% 0.22 260);\n --b-tree-directory-selected-color: oklch(100% 0 0);\n }\n}\n\n/* ─── Node ───────────────────────────────────────────────────────────────────── */\n.b-tree__node {\n display: flex;\n align-items: center;\n gap: var(--b-tree-gap);\n height: var(--b-tree-node-height);\n padding-inline-start: var(--b-tree-node-indent);\n border-radius: var(--b-tree-border-radius);\n cursor: pointer;\n outline: none;\n transition:\n background-color var(--b-tree-transition-duration) ease,\n color var(--b-tree-transition-duration) ease;\n user-select: none;\n position: relative;\n}\n\n.b-tree__node:hover {\n background-color: var(--b-tree-node-hover-bg);\n color: var(--b-tree-node-hover-color);\n}\n\n.b-tree__node:focus-visible {\n outline: 2px solid var(--b-tree-checkbox-checked-bg);\n outline-offset: -1px;\n}\n\n.b-tree__node--selected {\n background-color: var(--b-tree-node-selected-bg);\n color: var(--b-tree-node-selected-color);\n font-weight: 500;\n}\n\n.b-tree__node--selected:hover {\n background-color: var(--b-tree-node-selected-bg);\n}\n\n.b-tree__node--disabled {\n cursor: not-allowed;\n color: var(--b-tree-node-disabled-color);\n}\n\n.b-tree__node--disabled:hover {\n background-color: transparent;\n}\n\n.b-tree__node--block {\n padding-inline-end: 8px;\n}\n\n/* ─── Directory mode selected ───────────────────────────────────────────────── */\n.b-tree--directory .b-tree__node--selected {\n background-color: var(--b-tree-directory-selected-bg);\n color: var(--b-tree-directory-selected-color);\n}\n\n.b-tree--directory .b-tree__node--selected:hover {\n background-color: var(--b-tree-directory-selected-bg);\n}\n\n/* ─── Indent ─────────────────────────────────────────────────────────────────── */\n.b-tree__indent {\n display: inline-block;\n flex-shrink: 0;\n}\n\n/* ─── Switcher ───────────────────────────────────────────────────────────────── */\n.b-tree__switcher {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--b-tree-switcher-size);\n height: var(--b-tree-switcher-size);\n color: var(--b-tree-switcher-color);\n transition: color var(--b-tree-transition-duration) ease;\n}\n\n.b-tree__switcher:hover {\n color: var(--b-tree-checkbox-checked-bg);\n}\n\n.b-tree__switcher--leaf {\n pointer-events: none;\n}\n\n.b-tree__switcher-icon {\n width: 12px;\n height: 12px;\n flex-shrink: 0;\n transition: transform var(--b-tree-transition-duration) ease;\n}\n\n.b-tree__switcher--expanded .b-tree__switcher-icon:not(.b-tree__switcher-icon--spin) {\n transform: rotate(90deg);\n}\n\n/* Loading spinner */\n@keyframes b-tree-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.b-tree__switcher-icon--spin {\n animation: b-tree-spin var(--b-tree-spin-duration) linear infinite;\n}\n\n/* ─── Show lines ─────────────────────────────────────────────────────────────── */\n.b-tree--show-line .b-tree__node:not(:last-child)::before {\n content: '';\n position: absolute;\n inset-inline-start: calc(var(--b-tree-node-indent) + var(--b-tree-switcher-size) / 2);\n top: var(--b-tree-node-height);\n width: 1px;\n height: var(--b-tree-node-height);\n background-color: var(--b-tree-line-color);\n pointer-events: none;\n}\n\n/* ─── Checkbox ───────────────────────────────────────────────────────────────── */\n.b-tree__checkbox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n cursor: pointer;\n line-height: 1;\n}\n\n.b-tree__checkbox--disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.b-tree__checkbox-inner {\n display: inline-block;\n width: var(--b-tree-checkbox-size);\n height: var(--b-tree-checkbox-size);\n border: 1.5px solid var(--b-tree-checkbox-border);\n border-radius: 3px;\n background-color: var(--b-tree-checkbox-bg);\n position: relative;\n transition:\n border-color var(--b-tree-transition-duration) ease,\n background-color var(--b-tree-transition-duration) ease;\n}\n\n/* Checked tick */\n.b-tree__checkbox--checked .b-tree__checkbox-inner {\n border-color: var(--b-tree-checkbox-checked-border);\n background-color: var(--b-tree-checkbox-checked-bg);\n}\n\n.b-tree__checkbox--checked .b-tree__checkbox-inner::after {\n content: '';\n position: absolute;\n inset-inline-start: 4px;\n top: 1px;\n width: 5px;\n height: 8px;\n border: 2px solid #fff;\n border-top: none;\n border-inline-start: none;\n transform: rotate(45deg);\n}\n\n/* Indeterminate dash */\n.b-tree__checkbox--indeterminate .b-tree__checkbox-inner {\n border-color: var(--b-tree-checkbox-indeterminate-bg);\n background-color: var(--b-tree-checkbox-indeterminate-bg);\n}\n\n.b-tree__checkbox--indeterminate .b-tree__checkbox-inner::after {\n content: '';\n position: absolute;\n inset-inline-start: 2px;\n top: 50%;\n width: calc(100% - 4px);\n height: 2px;\n background-color: #fff;\n transform: translateY(-50%);\n}\n\n/* ─── Icon ───────────────────────────────────────────────────────────────────── */\n.b-tree__icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n font-size: var(--b-tree-icon-size);\n}\n\n/* ─── Title ──────────────────────────────────────────────────────────────────── */\n.b-tree__title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: inherit;\n}\n\n.b-tree__title--filtered {\n color: var(--b-tree-title-filtered-color);\n font-weight: 500;\n}\n\n/* ─── Drag handle ─────────────────────────────────────────────────────────── */\n.b-tree__drag-handle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 12px;\n height: var(--b-tree-node-height);\n color: var(--b-tree-switcher-color);\n cursor: grab;\n}\n\n.b-tree__drag-handle svg {\n width: 12px;\n height: 12px;\n display: block;\n}\n\n.b-tree__drag-handle:active {\n cursor: grabbing;\n}\n\n/* ─── Dragging node ──────────────────────────────────────────────────────────── */\n.b-tree__node--dragging {\n opacity: 0.5;\n}\n\n/* ─── Reduced motion ─────────────────────────────────────────────────────────── */\n@media (prefers-reduced-motion: reduce) {\n .b-tree {\n --b-tree-transition-duration: 0ms;\n --b-tree-spin-duration: 0ms;\n }\n\n .b-tree__switcher-icon {\n transition: none;\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"design-system219.js","names":[],"sources":["../src/components/BTimePicker/BTimePicker.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useComponentId } from '@/composables/useComponentId.ts';\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\n\nimport {\n BTimePickerPlacement,\n BTimePickerSize,\n BTimePickerStatus,\n BTimePickerVariant,\n type BTimePickerDisabledTime,\n} from './types';\n\nconst {\n size = BTimePickerSize.Medium,\n variant = BTimePickerVariant.Outlined,\n placeholder = 'Select time',\n disabled = false,\n inputReadOnly = false,\n allowClear = true,\n showNow = true,\n use12Hours = false,\n hourStep = 1,\n minuteStep = 1,\n secondStep = 1,\n format,\n placement: _placement = BTimePickerPlacement.BottomLeft,\n status,\n hideDisabledOptions = false,\n needConfirm = true,\n changeOnScroll = false,\n showHour = true,\n showMinute = true,\n showSecond = true,\n defaultOpen = false,\n defaultValue,\n open,\n disabledTime,\n} = defineProps<{\n /** Size of the input */\n size?: `${BTimePickerSize}`;\n /** Visual variant */\n variant?: `${BTimePickerVariant}`;\n /** Placeholder text */\n placeholder?: string;\n /** Disable the picker */\n disabled?: boolean;\n /** Make input read-only (useful for touch devices) */\n inputReadOnly?: boolean;\n /** Show clear button */\n allowClear?: boolean;\n /** Show \"Now\" button in footer */\n showNow?: boolean;\n /** Use 12-hour format with AM/PM */\n use12Hours?: boolean;\n /** Hour selection step */\n hourStep?: number;\n /** Minute selection step */\n minuteStep?: number;\n /** Second selection step */\n secondStep?: number;\n /** Time format string (e.g. 'HH:mm:ss', 'hh:mm a') */\n format?: string;\n /** Popup placement */\n placement?: `${BTimePickerPlacement}`;\n /** Validation status */\n status?: `${BTimePickerStatus}`;\n /** Hide disabled time options from columns */\n hideDisabledOptions?: boolean;\n /** Require OK button confirmation before applying value */\n needConfirm?: boolean;\n /** Update value on scroll instead of click */\n changeOnScroll?: boolean;\n /** Show hour column */\n showHour?: boolean;\n /** Show minute column */\n showMinute?: boolean;\n /** Show second column */\n showSecond?: boolean;\n /** Default open state */\n defaultOpen?: boolean;\n /** Default value (uncontrolled) */\n defaultValue?: Date;\n /** Controlled open state */\n open?: boolean;\n /** Function returning disabled hours/minutes/seconds */\n disabledTime?: () => BTimePickerDisabledTime;\n}>();\n\nconst model = defineModel<Date | null>({ default: undefined });\n\nconst emit = defineEmits<{\n change: [time: Date | null, timeString: string];\n openChange: [open: boolean];\n}>();\n\nconst inputEl = ref<HTMLInputElement | null>(null);\nconst panelEl = ref<HTMLElement | null>(null);\nconst hourColEl = ref<HTMLElement | null>(null);\nconst minuteColEl = ref<HTMLElement | null>(null);\nconst secondColEl = ref<HTMLElement | null>(null);\nconst ampmColEl = ref<HTMLElement | null>(null);\n\ndefineExpose({\n focus: () => inputEl.value?.focus(),\n blur: () => inputEl.value?.blur(),\n});\n\nconst { componentUID } = useComponentId();\nconst anchorName = computed(() => `--b-time-picker-${componentUID.value}`);\n\n// ─────────────────────────────────────────────\n// State\n// ─────────────────────────────────────────────\nconst isOpen = ref(defaultOpen);\nconst isPanelOpen = ref(open !== undefined ? !!open : defaultOpen);\nconst internalValue = ref<Date | null>(defaultValue ?? null);\nconst pendingHour = ref<number | null>(null);\nconst pendingMinute = ref<number | null>(null);\nconst pendingSecond = ref<number | null>(null);\nconst pendingAmpm = ref<'AM' | 'PM' | null>(null);\nconst inputText = ref('');\nconst focusedColumn = ref<'hour' | 'minute' | 'second' | 'ampm'>('hour');\n\nconst selectedTime = computed({\n get: () => model.value ?? internalValue.value,\n set: (val) => {\n internalValue.value = val;\n model.value = val;\n },\n});\n\n// ─────────────────────────────────────────────\n// Format\n// ─────────────────────────────────────────────\nconst activeFormat = computed(() => {\n if (format) return format;\n const parts: string[] = [];\n if (showHour) parts.push(use12Hours ? 'hh' : 'HH');\n if (showMinute) parts.push('mm');\n if (showSecond) parts.push('ss');\n const base = parts.join(':');\n return use12Hours ? `${base} A` : base;\n});\n\nfunction pad(n: number): string {\n return String(n).padStart(2, '0');\n}\n\nfunction formatTime(d: Date | null): string {\n if (!d) return '';\n const h = d.getHours();\n const m = d.getMinutes();\n const s = d.getSeconds();\n const ampm = h >= 12 ? 'PM' : 'AM';\n\n let result = activeFormat.value;\n if (use12Hours) {\n const h12 = h % 12 || 12;\n result = result.replace('hh', pad(h12));\n result = result.replace('h', String(h12));\n result = result.replace('A', ampm);\n result = result.replace('a', ampm.toLowerCase());\n } else {\n result = result.replace('HH', pad(h));\n result = result.replace('H', String(h));\n }\n result = result.replace('mm', pad(m));\n result = result.replace('ss', pad(s));\n return result;\n}\n\nfunction parseTimeString(str: string): Date | null {\n if (!str.trim()) return null;\n const timeRegex12 = /(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*(AM|PM|am|pm)?/;\n const match = str.match(timeRegex12);\n if (!match) return null;\n\n let h = parseInt(match[1], 10);\n const m = parseInt(match[2], 10);\n const s = match[3] ? parseInt(match[3], 10) : 0;\n const period = match[4]?.toUpperCase();\n\n if (use12Hours && period) {\n if (period === 'PM' && h < 12) h += 12;\n if (period === 'AM' && h === 12) h = 0;\n }\n\n if (h < 0 || h > 23 || m < 0 || m > 59 || s < 0 || s > 59) return null;\n\n const d = new Date();\n d.setHours(h, m, s, 0);\n return d;\n}\n\n// ─────────────────────────────────────────────\n// Disabled time logic\n// ─────────────────────────────────────────────\nconst disabledHours = computed<number[]>(() => {\n if (!disabledTime) return [];\n const dt = disabledTime();\n return dt.disabledHours?.() ?? [];\n});\n\nconst disabledMinutes = computed<number[]>(() => {\n if (!disabledTime) return [];\n const dt = disabledTime();\n const h = pendingHour.value ?? selectedTime.value?.getHours() ?? 0;\n return dt.disabledMinutes?.(h) ?? [];\n});\n\nconst disabledSeconds = computed<number[]>(() => {\n if (!disabledTime) return [];\n const dt = disabledTime();\n const h = pendingHour.value ?? selectedTime.value?.getHours() ?? 0;\n const m = pendingMinute.value ?? selectedTime.value?.getMinutes() ?? 0;\n return dt.disabledSeconds?.(h, m) ?? [];\n});\n\n// ─────────────────────────────────────────────\n// Column data\n// ─────────────────────────────────────────────\nconst hours = computed(() => {\n const list: number[] = [];\n if (use12Hours) {\n for (let i = 1; i <= 12; i += hourStep) list.push(i);\n } else {\n for (let i = 0; i < 24; i += hourStep) list.push(i);\n }\n if (hideDisabledOptions) {\n return list.filter((h) => !disabledHours.value.includes(use12Hours ? to24Hour(h, pendingAmpm.value ?? 'AM') : h));\n }\n return list;\n});\n\nconst minutes = computed(() => {\n const list: number[] = [];\n for (let i = 0; i < 60; i += minuteStep) list.push(i);\n if (hideDisabledOptions) {\n return list.filter((m) => !disabledMinutes.value.includes(m));\n }\n return list;\n});\n\nconst seconds = computed(() => {\n const list: number[] = [];\n for (let i = 0; i < 60; i += secondStep) list.push(i);\n if (hideDisabledOptions) {\n return list.filter((s) => !disabledSeconds.value.includes(s));\n }\n return list;\n});\n\nfunction to24Hour(h12: number, period: 'AM' | 'PM'): number {\n if (period === 'AM') return h12 === 12 ? 0 : h12;\n return h12 === 12 ? 12 : h12 + 12;\n}\n\nfunction to12Hour(h24: number): { hour: number; period: 'AM' | 'PM' } {\n const period: 'AM' | 'PM' = h24 >= 12 ? 'PM' : 'AM';\n const hour = h24 % 12 || 12;\n return { hour, period };\n}\n\n// ─────────────────────────────────────────────\n// Panel open/close\n// ─────────────────────────────────────────────\nfunction openPanel() {\n if (disabled) return;\n isOpen.value = true;\n isPanelOpen.value = true;\n emit('openChange', true);\n panelEl.value?.showPopover?.();\n syncPendingFromValue();\n nextTick(() => scrollToSelected());\n}\n\nfunction closePanel() {\n isOpen.value = false;\n isPanelOpen.value = false;\n emit('openChange', false);\n panelEl.value?.hidePopover?.();\n inputEl.value?.focus();\n}\n\nfunction togglePanel() {\n if (isPanelOpen.value) closePanel();\n else openPanel();\n}\n\nfunction handlePopoverToggle(e: Event) {\n const toggleEvent = e as ToggleEvent;\n const nowOpen = toggleEvent.newState === 'open';\n isOpen.value = nowOpen;\n isPanelOpen.value = nowOpen;\n if (!nowOpen) emit('openChange', false);\n}\n\n// ─────────────────────────────────────────────\n// Sync pending state\n// ─────────────────────────────────────────────\nfunction syncPendingFromValue() {\n const t = selectedTime.value;\n if (t) {\n if (use12Hours) {\n const { hour, period } = to12Hour(t.getHours());\n pendingHour.value = hour;\n pendingAmpm.value = period;\n } else {\n pendingHour.value = t.getHours();\n }\n pendingMinute.value = t.getMinutes();\n pendingSecond.value = t.getSeconds();\n } else {\n pendingHour.value = null;\n pendingMinute.value = null;\n pendingSecond.value = null;\n pendingAmpm.value = null;\n }\n}\n\n// ─────────────────────────────────────────────\n// Selection\n// ─────────────────────────────────────────────\nfunction selectHour(h: number) {\n const h24 = use12Hours ? to24Hour(h, pendingAmpm.value ?? 'AM') : h;\n if (disabledHours.value.includes(h24)) return;\n pendingHour.value = h;\n if (!needConfirm && !changeOnScroll) applyPendingIfComplete();\n else if (changeOnScroll) applyPending();\n}\n\nfunction selectMinute(m: number) {\n if (disabledMinutes.value.includes(m)) return;\n pendingMinute.value = m;\n if (!needConfirm && !changeOnScroll) applyPendingIfComplete();\n else if (changeOnScroll) applyPending();\n}\n\nfunction selectSecond(s: number) {\n if (disabledSeconds.value.includes(s)) return;\n pendingSecond.value = s;\n if (!needConfirm && !changeOnScroll) applyPendingIfComplete();\n else if (changeOnScroll) applyPending();\n}\n\nfunction selectAmpm(val: 'AM' | 'PM') {\n pendingAmpm.value = val;\n if (!needConfirm && !changeOnScroll) applyPendingIfComplete();\n else if (changeOnScroll) applyPending();\n}\n\nfunction applyPendingIfComplete() {\n if (pendingHour.value !== null && pendingMinute.value !== null) {\n if (showSecond && pendingSecond.value === null) return;\n if (use12Hours && pendingAmpm.value === null) return;\n applyPending();\n closePanel();\n }\n}\n\nfunction applyPending() {\n const h = pendingHour.value ?? 0;\n const m = pendingMinute.value ?? 0;\n const s = pendingSecond.value ?? 0;\n const h24 = use12Hours ? to24Hour(h, pendingAmpm.value ?? 'AM') : h;\n\n const d = new Date();\n d.setHours(h24, m, s, 0);\n selectedTime.value = d;\n inputText.value = formatTime(d);\n emit('change', d, formatTime(d));\n}\n\nfunction handleOk() {\n applyPending();\n closePanel();\n}\n\nfunction handleNow() {\n const now = new Date();\n if (use12Hours) {\n const { hour, period } = to12Hour(now.getHours());\n pendingHour.value = hour;\n pendingAmpm.value = period;\n } else {\n pendingHour.value = now.getHours();\n }\n pendingMinute.value = now.getMinutes();\n pendingSecond.value = now.getSeconds();\n nextTick(() => scrollToSelected());\n if (!needConfirm) {\n applyPending();\n closePanel();\n }\n}\n\nfunction handleClear(e: Event) {\n e.stopPropagation();\n selectedTime.value = null;\n inputText.value = '';\n pendingHour.value = null;\n pendingMinute.value = null;\n pendingSecond.value = null;\n pendingAmpm.value = null;\n emit('change', null, '');\n}\n\n// ─────────────────────────────────────────────\n// Input handling\n// ─────────────────────────────────────────────\nfunction handleInputChange(e: Event) {\n const val = (e.target as HTMLInputElement).value;\n inputText.value = val;\n}\n\nfunction handleInputBlur() {\n if (!isPanelOpen.value) {\n const parsed = parseTimeString(inputText.value);\n if (parsed) {\n selectedTime.value = parsed;\n inputText.value = formatTime(parsed);\n emit('change', parsed, formatTime(parsed));\n } else if (inputText.value === '') {\n selectedTime.value = null;\n emit('change', null, '');\n } else {\n inputText.value = formatTime(selectedTime.value);\n }\n }\n}\n\nfunction handleInputKeydown(e: KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') {\n if (!isPanelOpen.value) {\n e.preventDefault();\n openPanel();\n } else if (e.key === 'Enter') {\n e.preventDefault();\n const parsed = parseTimeString(inputText.value);\n if (parsed) {\n selectedTime.value = parsed;\n inputText.value = formatTime(parsed);\n emit('change', parsed, formatTime(parsed));\n }\n closePanel();\n }\n } else if (e.key === 'Escape') {\n if (isPanelOpen.value) {\n e.preventDefault();\n closePanel();\n }\n }\n}\n\n// ─────────────────────────────────────────────\n// Panel keyboard navigation\n// ─────────────────────────────────────────────\nfunction handlePanelKeydown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.preventDefault();\n closePanel();\n return;\n }\n\n if (e.key === 'Tab') {\n const columns: ('hour' | 'minute' | 'second' | 'ampm')[] = [];\n if (showHour) columns.push('hour');\n if (showMinute) columns.push('minute');\n if (showSecond) columns.push('second');\n if (use12Hours) columns.push('ampm');\n\n const idx = columns.indexOf(focusedColumn.value);\n if (e.shiftKey) {\n if (idx > 0) {\n e.preventDefault();\n focusedColumn.value = columns[idx - 1];\n }\n } else {\n if (idx < columns.length - 1) {\n e.preventDefault();\n focusedColumn.value = columns[idx + 1];\n }\n }\n return;\n }\n\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const delta = e.key === 'ArrowUp' ? -1 : 1;\n adjustFocusedColumn(delta);\n return;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n handleOk();\n }\n}\n\nfunction adjustFocusedColumn(delta: number) {\n if (focusedColumn.value === 'hour') {\n const list = hours.value;\n const current = pendingHour.value ?? list[0];\n const idx = list.indexOf(current);\n const next = list[Math.max(0, Math.min(list.length - 1, idx + delta))];\n selectHour(next);\n scrollColumnTo(hourColEl.value, list.indexOf(next));\n } else if (focusedColumn.value === 'minute') {\n const list = minutes.value;\n const current = pendingMinute.value ?? list[0];\n const idx = list.indexOf(current);\n const next = list[Math.max(0, Math.min(list.length - 1, idx + delta))];\n selectMinute(next);\n scrollColumnTo(minuteColEl.value, list.indexOf(next));\n } else if (focusedColumn.value === 'second') {\n const list = seconds.value;\n const current = pendingSecond.value ?? list[0];\n const idx = list.indexOf(current);\n const next = list[Math.max(0, Math.min(list.length - 1, idx + delta))];\n selectSecond(next);\n scrollColumnTo(secondColEl.value, list.indexOf(next));\n } else if (focusedColumn.value === 'ampm') {\n const val = pendingAmpm.value === 'AM' ? 'PM' : 'AM';\n selectAmpm(val);\n }\n}\n\n// ─────────────────────────────────────────────\n// Scroll helpers\n// ─────────────────────────────────────────────\nfunction scrollColumnTo(col: HTMLElement | null, idx: number) {\n if (!col || !col.scrollTo) return;\n const cellHeight = 28;\n col.scrollTo({ top: idx * cellHeight, behavior: 'smooth' });\n}\n\nfunction scrollToSelected() {\n if (pendingHour.value !== null) {\n const idx = hours.value.indexOf(pendingHour.value);\n if (idx >= 0) scrollColumnTo(hourColEl.value, idx);\n }\n if (pendingMinute.value !== null) {\n const idx = minutes.value.indexOf(pendingMinute.value);\n if (idx >= 0) scrollColumnTo(minuteColEl.value, idx);\n }\n if (pendingSecond.value !== null && showSecond) {\n const idx = seconds.value.indexOf(pendingSecond.value);\n if (idx >= 0) scrollColumnTo(secondColEl.value, idx);\n }\n if (pendingAmpm.value && use12Hours) {\n const idx = pendingAmpm.value === 'AM' ? 0 : 1;\n scrollColumnTo(ampmColEl.value, idx);\n }\n}\n\n// ─────────────────────────────────────────────\n// Click outside\n// ─────────────────────────────────────────────\nfunction handleClickOutside(e: MouseEvent) {\n if (!isPanelOpen.value) return;\n const target = e.target as Node;\n if (panelEl.value?.contains(target)) return;\n if (inputEl.value?.parentElement?.contains(target)) return;\n closePanel();\n}\n\nonMounted(() => {\n document.addEventListener('mousedown', handleClickOutside);\n});\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', handleClickOutside);\n});\n\n// ─────────────────────────────────────────────\n// Watchers\n// ─────────────────────────────────────────────\nwatch(\n () => open,\n (val) => {\n if (val !== undefined) {\n if (val) openPanel();\n else closePanel();\n }\n },\n);\n\nwatch(selectedTime, (val) => {\n inputText.value = formatTime(val);\n});\n\n// Init display\ninputText.value = formatTime(selectedTime.value);\n\n// ─────────────────────────────────────────────\n// Computed classes\n// ─────────────────────────────────────────────\nconst rootClasses = computed(() => [\n 'b-time-picker',\n `b-time-picker--${size}`,\n `b-time-picker--${variant}`,\n {\n 'b-time-picker--disabled': disabled,\n 'b-time-picker--open': isPanelOpen.value,\n [`b-time-picker--${status}`]: !!status,\n },\n]);\n\nconst isHourDisabled = (h: number) => {\n const h24 = use12Hours ? to24Hour(h, pendingAmpm.value ?? 'AM') : h;\n return disabledHours.value.includes(h24);\n};\nconst isMinuteDisabled = (m: number) => disabledMinutes.value.includes(m);\nconst isSecondDisabled = (s: number) => disabledSeconds.value.includes(s);\n</script>\n\n<template>\n <div :class=\"rootClasses\">\n <div\n class=\"b-time-picker__input-wrap\"\n :style=\"{ anchorName }\"\n @click=\"togglePanel\"\n >\n <input\n :id=\"`b-time-picker-input-${componentUID}`\"\n ref=\"inputEl\"\n class=\"b-time-picker__input\"\n type=\"text\"\n role=\"combobox\"\n :aria-expanded=\"isPanelOpen\"\n aria-haspopup=\"dialog\"\n :aria-controls=\"isPanelOpen ? `b-time-picker-panel-${componentUID}` : undefined\"\n :aria-describedby=\"status ? `b-time-picker-status-${componentUID}` : undefined\"\n :aria-label=\"placeholder\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"inputReadOnly\"\n :value=\"inputText\"\n autocomplete=\"off\"\n @input=\"handleInputChange\"\n @blur=\"handleInputBlur\"\n @keydown=\"handleInputKeydown\"\n />\n <span class=\"b-time-picker__suffix\">\n <svg\n v-if=\"!allowClear || !selectedTime\"\n class=\"b-time-picker__icon\"\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n <button\n v-else\n class=\"b-time-picker__clear\"\n type=\"button\"\n aria-label=\"Clear time\"\n tabindex=\"-1\"\n @click=\"handleClear\"\n >\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n </button>\n </span>\n <span\n v-if=\"status\"\n :id=\"`b-time-picker-status-${componentUID}`\"\n class=\"b-time-picker__status-text\"\n aria-live=\"polite\"\n >\n {{ status }}\n </span>\n </div>\n\n <div\n :id=\"`b-time-picker-panel-${componentUID}`\"\n ref=\"panelEl\"\n class=\"b-time-picker__panel\"\n popover\n role=\"dialog\"\n :aria-label=\"'Time picker'\"\n :aria-modal=\"true\"\n :style=\"{ positionAnchor: anchorName }\"\n @toggle=\"handlePopoverToggle\"\n @keydown=\"handlePanelKeydown\"\n >\n <div class=\"b-time-picker__columns\" role=\"group\" aria-label=\"Time selection columns\">\n <!-- Hour Column -->\n <div\n v-if=\"showHour\"\n ref=\"hourColEl\"\n class=\"b-time-picker__column\"\n role=\"listbox\"\n :aria-label=\"'Hours'\"\n :aria-activedescendant=\"pendingHour !== null ? `b-time-picker-hour-${pendingHour}-${componentUID}` : undefined\"\n >\n <div\n v-for=\"h in hours\"\n :id=\"`b-time-picker-hour-${h}-${componentUID}`\"\n :key=\"h\"\n class=\"b-time-picker__cell\"\n :class=\"{\n 'b-time-picker__cell--selected': pendingHour === h,\n 'b-time-picker__cell--disabled': isHourDisabled(h),\n 'b-time-picker__cell--focused': focusedColumn === 'hour' && pendingHour === h,\n }\"\n role=\"option\"\n :aria-selected=\"pendingHour === h\"\n :aria-disabled=\"isHourDisabled(h)\"\n @click=\"selectHour(h)\"\n >\n {{ pad(h) }}\n </div>\n </div>\n\n <!-- Minute Column -->\n <div\n v-if=\"showMinute\"\n ref=\"minuteColEl\"\n class=\"b-time-picker__column\"\n role=\"listbox\"\n :aria-label=\"'Minutes'\"\n :aria-activedescendant=\"pendingMinute !== null ? `b-time-picker-minute-${pendingMinute}-${componentUID}` : undefined\"\n >\n <div\n v-for=\"m in minutes\"\n :id=\"`b-time-picker-minute-${m}-${componentUID}`\"\n :key=\"m\"\n class=\"b-time-picker__cell\"\n :class=\"{\n 'b-time-picker__cell--selected': pendingMinute === m,\n 'b-time-picker__cell--disabled': isMinuteDisabled(m),\n 'b-time-picker__cell--focused': focusedColumn === 'minute' && pendingMinute === m,\n }\"\n role=\"option\"\n :aria-selected=\"pendingMinute === m\"\n :aria-disabled=\"isMinuteDisabled(m)\"\n @click=\"selectMinute(m)\"\n >\n {{ pad(m) }}\n </div>\n </div>\n\n <!-- Second Column -->\n <div\n v-if=\"showSecond\"\n ref=\"secondColEl\"\n class=\"b-time-picker__column\"\n role=\"listbox\"\n :aria-label=\"'Seconds'\"\n :aria-activedescendant=\"pendingSecond !== null ? `b-time-picker-second-${pendingSecond}-${componentUID}` : undefined\"\n >\n <div\n v-for=\"s in seconds\"\n :id=\"`b-time-picker-second-${s}-${componentUID}`\"\n :key=\"s\"\n class=\"b-time-picker__cell\"\n :class=\"{\n 'b-time-picker__cell--selected': pendingSecond === s,\n 'b-time-picker__cell--disabled': isSecondDisabled(s),\n 'b-time-picker__cell--focused': focusedColumn === 'second' && pendingSecond === s,\n }\"\n role=\"option\"\n :aria-selected=\"pendingSecond === s\"\n :aria-disabled=\"isSecondDisabled(s)\"\n @click=\"selectSecond(s)\"\n >\n {{ pad(s) }}\n </div>\n </div>\n\n <!-- AM/PM Column -->\n <div\n v-if=\"use12Hours\"\n ref=\"ampmColEl\"\n class=\"b-time-picker__column b-time-picker__column--ampm\"\n role=\"listbox\"\n aria-label=\"AM/PM\"\n >\n <div\n class=\"b-time-picker__cell\"\n :class=\"{\n 'b-time-picker__cell--selected': pendingAmpm === 'AM',\n 'b-time-picker__cell--focused': focusedColumn === 'ampm' && pendingAmpm === 'AM',\n }\"\n role=\"option\"\n :aria-selected=\"pendingAmpm === 'AM'\"\n @click=\"selectAmpm('AM')\"\n >\n AM\n </div>\n <div\n class=\"b-time-picker__cell\"\n :class=\"{\n 'b-time-picker__cell--selected': pendingAmpm === 'PM',\n 'b-time-picker__cell--focused': focusedColumn === 'ampm' && pendingAmpm === 'PM',\n }\"\n role=\"option\"\n :aria-selected=\"pendingAmpm === 'PM'\"\n @click=\"selectAmpm('PM')\"\n >\n PM\n </div>\n </div>\n </div>\n\n <div v-if=\"needConfirm || showNow\" class=\"b-time-picker__footer\">\n <button\n v-if=\"showNow\"\n class=\"b-time-picker__now-btn\"\n type=\"button\"\n @click=\"handleNow\"\n >\n Now\n </button>\n <button\n v-if=\"needConfirm\"\n class=\"b-time-picker__ok-btn\"\n type=\"button\"\n @click=\"handleOk\"\n >\n OK\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<style>\n.b-time-picker {\n --b-time-picker-input-font-size: 14px;\n --b-time-picker-input-font-size-lg: 16px;\n --b-time-picker-input-font-size-sm: 14px;\n --b-time-picker-padding-block: 4px;\n --b-time-picker-padding-block-lg: 7px;\n --b-time-picker-padding-block-sm: 0px;\n --b-time-picker-padding-inline: 11px;\n --b-time-picker-padding-inline-lg: 11px;\n --b-time-picker-padding-inline-sm: 7px;\n --b-time-picker-border-color: #d9d9d9;\n --b-time-picker-hover-border-color: #4096ff;\n --b-time-picker-active-border-color: #1677ff;\n --b-time-picker-active-shadow: 0 0 0 2px rgba(5, 145, 255, 0.1);\n --b-time-picker-error-active-shadow: 0 0 0 2px rgba(255, 38, 5, 0.06);\n --b-time-picker-warning-active-shadow: 0 0 0 2px rgba(255, 215, 5, 0.1);\n --b-time-picker-bg: #ffffff;\n --b-time-picker-hover-bg: #ffffff;\n --b-time-picker-active-bg: #ffffff;\n --b-time-picker-text-color: rgba(0, 0, 0, 0.88);\n --b-time-picker-placeholder-color: rgba(0, 0, 0, 0.25);\n --b-time-picker-icon-color: rgba(0, 0, 0, 0.25);\n --b-time-picker-clear-color: rgba(0, 0, 0, 0.25);\n --b-time-picker-clear-hover-color: rgba(0, 0, 0, 0.45);\n --b-time-picker-disabled-bg: rgba(0, 0, 0, 0.04);\n --b-time-picker-disabled-color: rgba(0, 0, 0, 0.25);\n --b-time-picker-panel-bg: #ffffff;\n --b-time-picker-panel-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n --b-time-picker-cell-height: 28px;\n --b-time-picker-cell-width: 56px;\n --b-time-picker-cell-hover-bg: rgba(0, 0, 0, 0.04);\n --b-time-picker-cell-selected-bg: #e6f4ff;\n --b-time-picker-cell-disabled-bg: rgba(0, 0, 0, 0.04);\n --b-time-picker-cell-disabled-color: rgba(0, 0, 0, 0.25);\n --b-time-picker-column-height: 224px;\n --b-time-picker-column-width: 56px;\n --b-time-picker-footer-bg: #ffffff;\n --b-time-picker-border-radius: 6px;\n --b-time-picker-panel-border-radius: 8px;\n --b-time-picker-transition-duration: 0.2s;\n --b-time-picker-z-index-popup: 1050;\n\n position: relative;\n display: inline-flex;\n width: 100%;\n max-width: 200px;\n}\n\n/* ──── Input Wrap ──── */\n.b-time-picker__input-wrap {\n display: flex;\n align-items: center;\n width: 100%;\n background: var(--b-time-picker-bg);\n border: 1px solid var(--b-time-picker-border-color);\n border-radius: var(--b-time-picker-border-radius);\n padding: var(--b-time-picker-padding-block) var(--b-time-picker-padding-inline);\n cursor: pointer;\n transition:\n border-color var(--b-time-picker-transition-duration),\n box-shadow var(--b-time-picker-transition-duration),\n background var(--b-time-picker-transition-duration);\n}\n\n.b-time-picker__input-wrap:hover {\n border-color: var(--b-time-picker-hover-border-color);\n background: var(--b-time-picker-hover-bg);\n}\n\n.b-time-picker--open .b-time-picker__input-wrap {\n border-color: var(--b-time-picker-active-border-color);\n box-shadow: var(--b-time-picker-active-shadow);\n background: var(--b-time-picker-active-bg);\n}\n\n/* ──── Size Variants ──── */\n.b-time-picker--sm .b-time-picker__input-wrap {\n padding: var(--b-time-picker-padding-block-sm) var(--b-time-picker-padding-inline-sm);\n}\n\n.b-time-picker--sm .b-time-picker__input {\n font-size: var(--b-time-picker-input-font-size-sm);\n}\n\n.b-time-picker--lg .b-time-picker__input-wrap {\n padding: var(--b-time-picker-padding-block-lg) var(--b-time-picker-padding-inline-lg);\n}\n\n.b-time-picker--lg .b-time-picker__input {\n font-size: var(--b-time-picker-input-font-size-lg);\n}\n\n/* ──── Variant Styles ──── */\n.b-time-picker--filled .b-time-picker__input-wrap {\n background: rgba(0, 0, 0, 0.04);\n border-color: transparent;\n}\n\n.b-time-picker--filled .b-time-picker__input-wrap:hover {\n background: rgba(0, 0, 0, 0.06);\n}\n\n.b-time-picker--borderless .b-time-picker__input-wrap {\n border-color: transparent;\n background: transparent;\n box-shadow: none;\n}\n\n.b-time-picker--underlined .b-time-picker__input-wrap {\n border-radius: 0;\n border: none;\n border-bottom: 1px solid var(--b-time-picker-border-color);\n}\n\n.b-time-picker--underlined .b-time-picker__input-wrap:hover {\n border-bottom-color: var(--b-time-picker-hover-border-color);\n}\n\n.b-time-picker--underlined.b-time-picker--open .b-time-picker__input-wrap {\n border-bottom-color: var(--b-time-picker-active-border-color);\n box-shadow: none;\n}\n\n/* ──── Status ──── */\n.b-time-picker--error .b-time-picker__input-wrap {\n border-color: #ff4d4f;\n}\n\n.b-time-picker--error.b-time-picker--open .b-time-picker__input-wrap {\n box-shadow: var(--b-time-picker-error-active-shadow);\n}\n\n.b-time-picker--warning .b-time-picker__input-wrap {\n border-color: #faad14;\n}\n\n.b-time-picker--warning.b-time-picker--open .b-time-picker__input-wrap {\n box-shadow: var(--b-time-picker-warning-active-shadow);\n}\n\n/* ──── Disabled ──── */\n.b-time-picker--disabled .b-time-picker__input-wrap {\n background: var(--b-time-picker-disabled-bg);\n border-color: var(--b-time-picker-border-color);\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.b-time-picker--disabled .b-time-picker__input {\n color: var(--b-time-picker-disabled-color);\n cursor: not-allowed;\n}\n\n/* ──── Input ──── */\n.b-time-picker__input {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n font-size: var(--b-time-picker-input-font-size);\n color: var(--b-time-picker-text-color);\n line-height: 1.5;\n padding: 0;\n min-width: 0;\n}\n\n.b-time-picker__input::placeholder {\n color: var(--b-time-picker-placeholder-color);\n}\n\n/* ──── Suffix / Icons ──── */\n.b-time-picker__suffix {\n display: flex;\n align-items: center;\n margin-left: 4px;\n flex-shrink: 0;\n}\n\n.b-time-picker__icon {\n width: 14px;\n height: 14px;\n color: var(--b-time-picker-icon-color);\n}\n\n.b-time-picker__clear {\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: none;\n padding: 0;\n cursor: pointer;\n color: var(--b-time-picker-clear-color);\n transition: color var(--b-time-picker-transition-duration);\n}\n\n.b-time-picker__clear:hover {\n color: var(--b-time-picker-clear-hover-color);\n}\n\n.b-time-picker__clear svg {\n width: 14px;\n height: 14px;\n}\n\n.b-time-picker__status-text {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n}\n\n/* ──── Panel ──── */\n.b-time-picker__panel {\n position: absolute;\n position-anchor: var(--b-time-picker-anchor);\n inset: unset;\n top: anchor(bottom);\n left: anchor(left);\n margin: 0;\n margin-top: 4px;\n padding: 0;\n border: none;\n border-radius: var(--b-time-picker-panel-border-radius);\n background: var(--b-time-picker-panel-bg);\n box-shadow: var(--b-time-picker-panel-shadow);\n z-index: var(--b-time-picker-z-index-popup);\n overflow: hidden;\n opacity: 0;\n transform: translateY(-4px);\n transition:\n opacity var(--b-time-picker-transition-duration) ease,\n transform var(--b-time-picker-transition-duration) ease;\n}\n\n.b-time-picker__panel:popover-open {\n opacity: 1;\n transform: translateY(0);\n}\n\n@starting-style {\n .b-time-picker__panel:popover-open {\n opacity: 0;\n transform: translateY(-4px);\n }\n}\n\n/* ──── Columns ──── */\n.b-time-picker__columns {\n display: flex;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.b-time-picker__column {\n width: var(--b-time-picker-column-width);\n height: var(--b-time-picker-column-height);\n overflow-y: auto;\n overflow-x: hidden;\n border-right: 1px solid #f0f0f0;\n scroll-behavior: smooth;\n scrollbar-width: thin;\n}\n\n.b-time-picker__column:last-child {\n border-right: none;\n}\n\n/* ──── Cells ──── */\n.b-time-picker__cell {\n height: var(--b-time-picker-cell-height);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 14px;\n color: var(--b-time-picker-text-color);\n transition: background var(--b-time-picker-transition-duration);\n user-select: none;\n}\n\n.b-time-picker__cell:hover {\n background: var(--b-time-picker-cell-hover-bg);\n}\n\n.b-time-picker__cell--selected {\n background: var(--b-time-picker-cell-selected-bg);\n font-weight: 600;\n}\n\n.b-time-picker__cell--focused {\n outline: 2px solid var(--b-time-picker-active-border-color);\n outline-offset: -2px;\n}\n\n.b-time-picker__cell--disabled {\n color: var(--b-time-picker-cell-disabled-color);\n background: var(--b-time-picker-cell-disabled-bg);\n cursor: not-allowed;\n}\n\n.b-time-picker__cell--disabled:hover {\n background: var(--b-time-picker-cell-disabled-bg);\n}\n\n/* ──── Footer ──── */\n.b-time-picker__footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 8px;\n background: var(--b-time-picker-footer-bg);\n}\n\n.b-time-picker__now-btn {\n border: none;\n background: none;\n color: var(--b-time-picker-active-border-color);\n cursor: pointer;\n font-size: 14px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background var(--b-time-picker-transition-duration);\n}\n\n.b-time-picker__now-btn:hover {\n background: rgba(0, 0, 0, 0.04);\n}\n\n.b-time-picker__ok-btn {\n border: none;\n background: var(--b-time-picker-active-border-color);\n color: #fff;\n cursor: pointer;\n font-size: 14px;\n padding: 2px 12px;\n border-radius: 4px;\n font-weight: 500;\n line-height: 1.5;\n transition:\n background var(--b-time-picker-transition-duration),\n opacity var(--b-time-picker-transition-duration);\n}\n\n.b-time-picker__ok-btn:hover {\n opacity: 0.85;\n}\n\n/* ──── Placement ──── */\n.b-time-picker--bottom-right .b-time-picker__panel {\n left: unset;\n right: anchor(right);\n}\n\n.b-time-picker--top-left .b-time-picker__panel {\n top: unset;\n bottom: anchor(top);\n margin-top: 0;\n margin-bottom: 4px;\n}\n\n.b-time-picker--top-right .b-time-picker__panel {\n top: unset;\n bottom: anchor(top);\n left: unset;\n right: anchor(right);\n margin-top: 0;\n margin-bottom: 4px;\n}\n\n/* ──── Dark Mode ──── */\n[data-prefers-color='dark'] .b-time-picker {\n --b-time-picker-bg: #141414;\n --b-time-picker-hover-bg: #141414;\n --b-time-picker-active-bg: #141414;\n --b-time-picker-border-color: #424242;\n --b-time-picker-hover-border-color: #165dff;\n --b-time-picker-active-border-color: #1668dc;\n --b-time-picker-active-shadow: 0 0 0 2px rgba(22, 104, 220, 0.15);\n --b-time-picker-text-color: rgba(255, 255, 255, 0.85);\n --b-time-picker-placeholder-color: rgba(255, 255, 255, 0.25);\n --b-time-picker-icon-color: rgba(255, 255, 255, 0.3);\n --b-time-picker-clear-color: rgba(255, 255, 255, 0.3);\n --b-time-picker-clear-hover-color: rgba(255, 255, 255, 0.55);\n --b-time-picker-disabled-bg: rgba(255, 255, 255, 0.08);\n --b-time-picker-disabled-color: rgba(255, 255, 255, 0.25);\n --b-time-picker-panel-bg: #1f1f1f;\n --b-time-picker-panel-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n --b-time-picker-cell-hover-bg: rgba(255, 255, 255, 0.08);\n --b-time-picker-cell-selected-bg: #111a2c;\n --b-time-picker-cell-disabled-bg: rgba(255, 255, 255, 0.04);\n --b-time-picker-cell-disabled-color: rgba(255, 255, 255, 0.25);\n --b-time-picker-footer-bg: #1f1f1f;\n --b-time-picker-error-active-shadow: 0 0 0 2px rgba(220, 56, 72, 0.15);\n --b-time-picker-warning-active-shadow: 0 0 0 2px rgba(217, 146, 0, 0.15);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-time-picker {\n --b-time-picker-bg: #141414;\n --b-time-picker-hover-bg: #141414;\n --b-time-picker-active-bg: #141414;\n --b-time-picker-border-color: #424242;\n --b-time-picker-hover-border-color: #165dff;\n --b-time-picker-active-border-color: #1668dc;\n --b-time-picker-active-shadow: 0 0 0 2px rgba(22, 104, 220, 0.15);\n --b-time-picker-text-color: rgba(255, 255, 255, 0.85);\n --b-time-picker-placeholder-color: rgba(255, 255, 255, 0.25);\n --b-time-picker-icon-color: rgba(255, 255, 255, 0.3);\n --b-time-picker-clear-color: rgba(255, 255, 255, 0.3);\n --b-time-picker-clear-hover-color: rgba(255, 255, 255, 0.55);\n --b-time-picker-disabled-bg: rgba(255, 255, 255, 0.08);\n --b-time-picker-disabled-color: rgba(255, 255, 255, 0.25);\n --b-time-picker-panel-bg: #1f1f1f;\n --b-time-picker-panel-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n --b-time-picker-cell-hover-bg: rgba(255, 255, 255, 0.08);\n --b-time-picker-cell-selected-bg: #111a2c;\n --b-time-picker-cell-disabled-bg: rgba(255, 255, 255, 0.04);\n --b-time-picker-cell-disabled-color: rgba(255, 255, 255, 0.25);\n --b-time-picker-footer-bg: #1f1f1f;\n --b-time-picker-error-active-shadow: 0 0 0 2px rgba(220, 56, 72, 0.15);\n --b-time-picker-warning-active-shadow: 0 0 0 2px rgba(217, 146, 0, 0.15);\n }\n}\n\n/* ──── Reduced Motion ──── */\n@media (prefers-reduced-motion: reduce) {\n .b-time-picker,\n .b-time-picker * {\n --b-time-picker-transition-duration: 0ms;\n transition-duration: 0ms !important;\n animation-duration: 0ms !important;\n }\n\n .b-time-picker__column {\n scroll-behavior: auto;\n }\n}\n</style>\n"],"mappings":""}
@@ -1,10 +1,6 @@
1
- //#region src/components/BUpload/types.ts
2
- var e = /* @__PURE__ */ function(e) {
3
- return e.Text = "text", e.Picture = "picture", e.PictureCard = "picture-card", e.PictureCircle = "picture-circle", e;
4
- }({}), t = /* @__PURE__ */ function(e) {
5
- return e.Uploading = "uploading", e.Done = "done", e.Error = "error", e.Removed = "removed", e;
6
- }({});
1
+ //#region src/components/BTabs/types.ts
2
+ var e = Symbol("BTabsContext");
7
3
  //#endregion
8
- export { t as BUploadFileStatus, e as BUploadListType };
4
+ export { e as BTabsContextKey };
9
5
 
10
6
  //# sourceMappingURL=design-system220.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"design-system220.js","names":[],"sources":["../src/components/BUpload/types.ts"],"sourcesContent":["export enum BUploadListType {\n Text = 'text',\n Picture = 'picture',\n PictureCard = 'picture-card',\n PictureCircle = 'picture-circle',\n}\n\nexport enum BUploadFileStatus {\n Uploading = 'uploading',\n Done = 'done',\n Error = 'error',\n Removed = 'removed',\n}\n\nexport interface BUploadFile {\n uid: string;\n name: string;\n status?: BUploadFileStatus;\n percent?: number;\n url?: string;\n thumbUrl?: string;\n response?: unknown;\n error?: unknown;\n originFileObj?: File;\n size?: number;\n type?: string;\n}\n\nexport interface BUploadChangeInfo {\n file: BUploadFile;\n fileList: BUploadFile[];\n event?: ProgressEvent;\n}\n\nexport interface BUploadRequestOption {\n action: string;\n file: File;\n filename: string;\n headers?: Record<string, string>;\n data?: Record<string, unknown>;\n withCredentials?: boolean;\n method?: string;\n onProgress?: (event: { percent: number }) => void;\n onSuccess?: (response: unknown) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface BUploadShowUploadList {\n showPreviewIcon?: boolean;\n showRemoveIcon?: boolean;\n showDownloadIcon?: boolean;\n}\n"],"mappings":";AAAA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,OAAA,QACA,EAAA,UAAA,WACA,EAAA,cAAA,gBACA,EAAA,gBAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,YAAA,aACA,EAAA,OAAA,QACA,EAAA,QAAA,SACA,EAAA,UAAA;KACD"}
1
+ {"version":3,"file":"design-system220.js","names":[],"sources":["../src/components/BTabs/types.ts"],"sourcesContent":["import type { ComputedRef, InjectionKey, VNode } from 'vue';\n\nexport type BTabsType = 'line' | 'card' | 'editable-card';\nexport type BTabsPlacement = 'top' | 'bottom' | 'left' | 'right';\nexport type BTabsSize = 'small' | 'middle' | 'large';\n\nexport interface BTabItem {\n /** Unique identifier for the tab. */\n key: string;\n /** Tab header text or VNode. */\n label?: string | VNode;\n /** Whether the tab is disabled. @default false */\n disabled?: boolean;\n /** Whether the close button is shown (editable-card only). @default true */\n closable?: boolean;\n /** Whether to destroy content when tab is hidden. @default false */\n destroyOnHidden?: boolean;\n /** Whether to force render content even when not active. @default false */\n forceRender?: boolean;\n /** Whether to keep this tab's component state alive when switching away. Overrides global keepAlive. */\n keepAlive?: boolean;\n}\n\n// ─────────────────────────────────────────────\n// BTabPane registration (provide/inject)\n// ─────────────────────────────────────────────\n\nexport interface BTabPaneRegistration {\n /** Unique key for this pane. */\n key: string;\n /** Tab label (text or VNode). */\n label?: string | VNode;\n /** Whether tab is disabled. */\n disabled?: boolean;\n /** Whether close button shows in editable-card mode. */\n closable?: boolean;\n /** Whether to destroy when hidden. */\n destroyOnHidden?: boolean;\n /** Whether to force render even when inactive. */\n forceRender?: boolean;\n /** Per-pane keepAlive override. */\n keepAlive?: boolean;\n /** Render function for the pane content (from BTabPane's default slot). */\n renderContent: () => VNode[];\n /** Optional render function for custom label (from BTabPane's tab slot). */\n renderLabel?: () => VNode[];\n}\n\n// ─────────────────────────────────────────────\n// Context injected from BTabs to BTabPane children\n// ─────────────────────────────────────────────\n\nexport interface BTabsContext {\n /** Currently active tab key. */\n activeKey: ComputedRef<string>;\n /** Tab type. */\n type: ComputedRef<BTabsType>;\n /** Tab size. */\n size: ComputedRef<BTabsSize>;\n /** Tab placement. */\n placement: ComputedRef<BTabsPlacement>;\n /** Global keepAlive setting. */\n keepAlive: ComputedRef<boolean>;\n /** Global destroyOnHidden setting. */\n destroyOnHidden: ComputedRef<boolean>;\n /** Register a pane. */\n register: (pane: BTabPaneRegistration) => void;\n /** Unregister a pane by key. */\n unregister: (key: string) => void;\n /** Update a registered pane's data (when props change reactively). */\n update: (key: string, pane: BTabPaneRegistration) => void;\n}\n\nexport const BTabsContextKey: InjectionKey<BTabsContext> = Symbol('BTabsContext');\n"],"mappings":";AAyEA,IAAa,IAA8C,OAAO,eAAe"}