@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-system241.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":"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"}
@@ -0,0 +1,9 @@
1
+ import e from "./design-system14.js";
2
+ import t from "./design-system241.js";
3
+ /* empty css */
4
+ //#region src/components/BTree/BTree.vue
5
+ var n = /* @__PURE__ */ e(t, [["__scopeId", "data-v-08bb45f2"]]);
6
+ //#endregion
7
+ export { n as default };
8
+
9
+ //# sourceMappingURL=design-system243.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-system243.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":""}
@@ -0,0 +1,10 @@
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
+ }({});
7
+ //#endregion
8
+ export { t as BUploadFileStatus, e as BUploadListType };
9
+
10
+ //# sourceMappingURL=design-system244.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-system244.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"}
@@ -0,0 +1,377 @@
1
+ import { useComponentId as e } from "./design-system10.js";
2
+ import { BUploadFileStatus as t, BUploadListType as n } from "./design-system244.js";
3
+ import { Fragment as r, computed as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createStaticVNode as c, defineComponent as l, mergeModels as u, normalizeClass as d, normalizeStyle as f, onMounted as p, openBlock as m, ref as h, renderList as g, renderSlot as _, toDisplayString as v, unref as y, useAttrs as b, useModel as x, watch as ee, withModifiers as S } from "vue";
4
+ //#region src/components/BUpload/BUpload.vue?vue&type=script&setup=true&lang.ts
5
+ var C = [
6
+ "tabindex",
7
+ "aria-disabled",
8
+ "aria-label"
9
+ ], w = {
10
+ key: 0,
11
+ class: "b-upload__card-trigger"
12
+ }, T = {
13
+ key: 1,
14
+ class: "b-upload__default-text"
15
+ }, E = [
16
+ "accept",
17
+ "multiple",
18
+ "disabled",
19
+ "webkitdirectory"
20
+ ], te = {
21
+ key: 0,
22
+ class: "b-upload__item-thumbnail",
23
+ "aria-hidden": "true"
24
+ }, ne = ["src", "alt"], re = {
25
+ key: 1,
26
+ class: "b-upload__item-file-icon"
27
+ }, D = { class: "b-upload__item-info" }, O = ["title"], k = { class: "b-upload__item-actions" }, A = ["onClick"], j = ["onClick"], M = ["disabled", "onClick"], N = ["aria-valuenow", "aria-label"], P = {
28
+ key: 2,
29
+ class: "b-upload__hint"
30
+ }, F = /* @__PURE__ */ l({
31
+ inheritAttrs: !1,
32
+ __name: "BUpload",
33
+ props: /* @__PURE__ */ u({
34
+ accept: { default: "" },
35
+ action: {
36
+ type: [String, Function],
37
+ default: ""
38
+ },
39
+ multiple: {
40
+ type: Boolean,
41
+ default: !1
42
+ },
43
+ disabled: {
44
+ type: Boolean,
45
+ default: !1
46
+ },
47
+ directory: {
48
+ type: Boolean,
49
+ default: !1
50
+ },
51
+ maxCount: {},
52
+ listType: { default: () => n.Text },
53
+ method: { default: "POST" },
54
+ name: { default: "file" },
55
+ headers: {},
56
+ data: { type: [Object, Function] },
57
+ withCredentials: {
58
+ type: Boolean,
59
+ default: !1
60
+ },
61
+ openFileDialogOnClick: {
62
+ type: Boolean,
63
+ default: !0
64
+ },
65
+ showUploadList: {
66
+ type: [Boolean, Object],
67
+ default: !0
68
+ },
69
+ defaultFileList: { default: () => [] },
70
+ beforeUpload: { type: Function },
71
+ customRequest: { type: Function }
72
+ }, {
73
+ fileList: { default: void 0 },
74
+ fileListModifiers: {}
75
+ }),
76
+ emits: /* @__PURE__ */ u([
77
+ "change",
78
+ "remove",
79
+ "preview",
80
+ "download",
81
+ "drop"
82
+ ], ["update:fileList"]),
83
+ setup(l, { expose: u, emit: F }) {
84
+ let I = b(), L = x(l, "fileList"), R = F, { componentUID: z } = e(), B = h(null), V = h(!1), H = h(Array.isArray(l.defaultFileList) ? [...l.defaultFileList] : []), U = i({
85
+ get: () => L.value === void 0 ? H.value : L.value,
86
+ set: (e) => {
87
+ H.value = e, L.value !== void 0 && (L.value = e);
88
+ }
89
+ });
90
+ p(() => {
91
+ L.value === void 0 && l.defaultFileList.length > 0 && (H.value = [...l.defaultFileList]);
92
+ }), ee(() => L.value, (e) => {
93
+ e !== void 0 && (H.value = e);
94
+ });
95
+ let W = i(() => l.listType === n.PictureCard || l.listType === n.PictureCircle), G = i(() => l.showUploadList === !1 ? !1 : l.showUploadList === !0 ? {
96
+ showPreviewIcon: !0,
97
+ showRemoveIcon: !0,
98
+ showDownloadIcon: !1
99
+ } : l.showUploadList), K = i(() => l.maxCount !== void 0 && l.maxCount !== 1 && U.value.length >= l.maxCount), q = 0;
100
+ function J() {
101
+ return q += 1, `b-upload-${z.value}-${q}-${Date.now()}`;
102
+ }
103
+ function Y(e) {
104
+ return {
105
+ uid: J(),
106
+ name: e.name,
107
+ size: e.size,
108
+ type: e.type,
109
+ status: t.Uploading,
110
+ percent: 0,
111
+ originFileObj: e
112
+ };
113
+ }
114
+ function X(e, t, n) {
115
+ U.value = t, R("change", {
116
+ file: e,
117
+ fileList: t,
118
+ event: n
119
+ });
120
+ }
121
+ function ie(e) {
122
+ let t = new XMLHttpRequest();
123
+ t.upload.addEventListener("progress", (t) => {
124
+ t.lengthComputable && e.onProgress && e.onProgress({ percent: Math.round(t.loaded / t.total * 100) });
125
+ }), t.addEventListener("load", () => {
126
+ t.status >= 200 && t.status < 300 ? e.onSuccess?.(t.response) : e.onError?.(/* @__PURE__ */ Error(`Upload failed with status ${t.status}`));
127
+ }), t.addEventListener("error", () => {
128
+ e.onError?.(/* @__PURE__ */ Error("Upload network error"));
129
+ }), t.open(e.method || "POST", e.action, !0), e.withCredentials && (t.withCredentials = !0), e.headers && Object.entries(e.headers).forEach(([e, n]) => {
130
+ t.setRequestHeader(e, n);
131
+ });
132
+ let n = new FormData();
133
+ e.data && Object.entries(e.data).forEach(([e, t]) => {
134
+ n.append(e, t);
135
+ }), n.append(e.filename, e.file), t.send(n);
136
+ }
137
+ async function ae(e, t) {
138
+ if (l.beforeUpload) try {
139
+ let n = await l.beforeUpload(e, t);
140
+ if (n === !1) return;
141
+ if (n instanceof Blob) {
142
+ Z(n instanceof File ? n : new File([n], e.name, { type: n.type }));
143
+ return;
144
+ }
145
+ } catch {
146
+ return;
147
+ }
148
+ Z(e);
149
+ }
150
+ function Z(e) {
151
+ let n = Y(e), r;
152
+ r = l.maxCount === 1 ? [n] : l.maxCount === void 0 ? [...U.value, n] : [...U.value, n].slice(-l.maxCount), X(n, r), (typeof l.action == "function" ? l.action(e) : Promise.resolve(l.action)).then((r) => {
153
+ let i = l.customRequest || ie, a = typeof l.data == "function" ? l.data(n) : l.data || {};
154
+ i({
155
+ action: r,
156
+ file: e,
157
+ filename: l.name,
158
+ headers: l.headers,
159
+ data: a,
160
+ withCredentials: l.withCredentials,
161
+ method: l.method,
162
+ onProgress: (e) => {
163
+ let t = {
164
+ ...n,
165
+ percent: e.percent
166
+ };
167
+ X(t, U.value.map((e) => e.uid === n.uid ? t : e));
168
+ },
169
+ onSuccess: (e) => {
170
+ let r = {
171
+ ...n,
172
+ status: t.Done,
173
+ percent: 100,
174
+ response: e
175
+ };
176
+ X(r, U.value.map((e) => e.uid === n.uid ? r : e));
177
+ },
178
+ onError: (e) => {
179
+ let r = {
180
+ ...n,
181
+ status: t.Error,
182
+ error: e
183
+ };
184
+ X(r, U.value.map((e) => e.uid === n.uid ? r : e));
185
+ }
186
+ });
187
+ });
188
+ }
189
+ function Q(e) {
190
+ if (!e || e.length === 0) return;
191
+ let t = Array.from(e), n;
192
+ if (l.maxCount === 1) n = t.slice(0, 1);
193
+ else if (l.maxCount !== void 0) {
194
+ let e = l.maxCount - U.value.length;
195
+ n = e > 0 ? t.slice(0, e) : [];
196
+ } else n = t;
197
+ n.forEach((e) => ae(e, t));
198
+ }
199
+ function oe() {
200
+ l.disabled || !l.openFileDialogOnClick || K.value || B.value?.click();
201
+ }
202
+ function $(e) {
203
+ l.disabled || K.value || (e.key === "Enter" || e.key === " ") && (e.preventDefault(), B.value?.click());
204
+ }
205
+ function se(e) {
206
+ let t = e.target;
207
+ Q(t.files), t.value = "";
208
+ }
209
+ function ce(e) {
210
+ e.preventDefault(), !l.disabled && (V.value = !0);
211
+ }
212
+ function le(e) {
213
+ e.preventDefault(), V.value = !1;
214
+ }
215
+ function ue(e) {
216
+ e.preventDefault(), V.value = !1, !l.disabled && (R("drop", e), Q(e.dataTransfer?.files ?? null));
217
+ }
218
+ function de(e) {
219
+ R("remove", e);
220
+ let n = U.value.filter((t) => t.uid !== e.uid);
221
+ X({
222
+ ...e,
223
+ status: t.Removed
224
+ }, n);
225
+ }
226
+ function fe(e) {
227
+ R("preview", e);
228
+ }
229
+ function pe(e) {
230
+ R("download", e);
231
+ }
232
+ return u({ openFileDialog: () => B.value?.click() }), (e, i) => (m(), o("div", { class: d(["b-upload", {
233
+ "b-upload--disabled": l.disabled,
234
+ "b-upload--drag-over": V.value,
235
+ [`b-upload--${l.listType}`]: !0
236
+ }]) }, [
237
+ !W.value || !K.value ? (m(), o("div", {
238
+ key: 0,
239
+ class: "b-upload__trigger",
240
+ role: "button",
241
+ tabindex: l.disabled ? -1 : 0,
242
+ "aria-disabled": l.disabled || void 0,
243
+ "aria-label": y(I)["aria-label"] || "Upload file",
244
+ onClick: oe,
245
+ onKeydown: $,
246
+ onDragover: ce,
247
+ onDragleave: le,
248
+ onDrop: ue
249
+ }, [_(e.$slots, "default", {}, () => [W.value ? (m(), o("div", w, [...i[0] ||= [c("<span class=\"b-upload__plus-icon\" aria-hidden=\"true\" data-v-36315fd9><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" data-v-36315fd9><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" data-v-36315fd9></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" data-v-36315fd9></line></svg></span><span class=\"b-upload__card-text\" data-v-36315fd9>Upload</span>", 2)]])) : (m(), o("span", T, "Click to Upload"))], !0)], 40, C)) : a("", !0),
250
+ s("input", {
251
+ ref_key: "inputRef",
252
+ ref: B,
253
+ class: "b-upload__input",
254
+ type: "file",
255
+ accept: l.accept || void 0,
256
+ multiple: l.multiple,
257
+ disabled: l.disabled,
258
+ webkitdirectory: l.directory || void 0,
259
+ "aria-hidden": "true",
260
+ tabindex: "-1",
261
+ onChange: se
262
+ }, null, 40, E),
263
+ G.value !== !1 && U.value.length > 0 ? (m(), o("div", {
264
+ key: 1,
265
+ class: d(["b-upload__list", `b-upload__list--${l.listType}`]),
266
+ role: "list",
267
+ "aria-label": "Uploaded files"
268
+ }, [(m(!0), o(r, null, g(U.value, (e) => (m(), o("div", {
269
+ key: e.uid,
270
+ class: d(["b-upload__item", {
271
+ "b-upload__item--error": e.status === y(t).Error,
272
+ "b-upload__item--done": e.status === y(t).Done,
273
+ "b-upload__item--uploading": e.status === y(t).Uploading
274
+ }]),
275
+ role: "listitem"
276
+ }, [
277
+ l.listType === y(n).Text ? a("", !0) : (m(), o("span", te, [e.thumbUrl || e.url ? (m(), o("img", {
278
+ key: 0,
279
+ src: e.thumbUrl || e.url,
280
+ alt: e.name,
281
+ class: "b-upload__item-image"
282
+ }, null, 8, ne)) : (m(), o("span", re, [...i[1] ||= [s("svg", {
283
+ viewBox: "0 0 24 24",
284
+ fill: "none",
285
+ stroke: "currentColor",
286
+ "stroke-width": "1.5"
287
+ }, [s("path", { d: "M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8l-6-6z" }), s("polyline", { points: "14,2 14,8 20,8" })], -1)]]))])),
288
+ s("span", D, [s("span", {
289
+ class: "b-upload__item-name",
290
+ title: e.name
291
+ }, v(e.name), 9, O)]),
292
+ s("span", k, [
293
+ G.value && G.value.showPreviewIcon && (e.url || e.thumbUrl) ? (m(), o("button", {
294
+ key: 0,
295
+ class: "b-upload__action-btn",
296
+ type: "button",
297
+ "aria-label": "Preview file",
298
+ onClick: S((t) => fe(e), ["stop"])
299
+ }, [...i[2] ||= [s("svg", {
300
+ viewBox: "0 0 24 24",
301
+ fill: "none",
302
+ stroke: "currentColor",
303
+ "stroke-width": "2",
304
+ "aria-hidden": "true"
305
+ }, [s("path", { d: "M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z" }), s("circle", {
306
+ cx: "12",
307
+ cy: "12",
308
+ r: "3"
309
+ })], -1)]], 8, A)) : a("", !0),
310
+ G.value && G.value.showDownloadIcon && e.status === y(t).Done ? (m(), o("button", {
311
+ key: 1,
312
+ class: "b-upload__action-btn",
313
+ type: "button",
314
+ "aria-label": "Download file",
315
+ onClick: S((t) => pe(e), ["stop"])
316
+ }, [...i[3] ||= [s("svg", {
317
+ viewBox: "0 0 24 24",
318
+ fill: "none",
319
+ stroke: "currentColor",
320
+ "stroke-width": "2",
321
+ "aria-hidden": "true"
322
+ }, [
323
+ s("path", { d: "M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4" }),
324
+ s("polyline", { points: "7,10 12,15 17,10" }),
325
+ s("line", {
326
+ x1: "12",
327
+ y1: "15",
328
+ x2: "12",
329
+ y2: "3"
330
+ })
331
+ ], -1)]], 8, j)) : a("", !0),
332
+ G.value && G.value.showRemoveIcon ? (m(), o("button", {
333
+ key: 2,
334
+ class: "b-upload__action-btn b-upload__action-btn--remove",
335
+ type: "button",
336
+ "aria-label": "Remove file",
337
+ disabled: l.disabled,
338
+ onClick: S((t) => de(e), ["stop"])
339
+ }, [...i[4] ||= [s("svg", {
340
+ viewBox: "0 0 24 24",
341
+ fill: "none",
342
+ stroke: "currentColor",
343
+ "stroke-width": "2",
344
+ "aria-hidden": "true"
345
+ }, [s("line", {
346
+ x1: "18",
347
+ y1: "6",
348
+ x2: "6",
349
+ y2: "18"
350
+ }), s("line", {
351
+ x1: "6",
352
+ y1: "6",
353
+ x2: "18",
354
+ y2: "18"
355
+ })], -1)]], 8, M)) : a("", !0)
356
+ ]),
357
+ e.status === y(t).Uploading ? (m(), o("div", {
358
+ key: 1,
359
+ class: "b-upload__progress",
360
+ role: "progressbar",
361
+ "aria-valuenow": e.percent ?? 0,
362
+ "aria-valuemin": "0",
363
+ "aria-valuemax": "100",
364
+ "aria-label": `Uploading ${e.name}`
365
+ }, [s("div", {
366
+ class: "b-upload__progress-bar",
367
+ style: f({ width: `${e.percent ?? 0}%` })
368
+ }, null, 4)], 8, N)) : a("", !0)
369
+ ], 2))), 128))], 2)) : a("", !0),
370
+ e.$slots.hint ? (m(), o("div", P, [_(e.$slots, "hint", {}, void 0, !0)])) : a("", !0)
371
+ ], 2));
372
+ }
373
+ });
374
+ //#endregion
375
+ export { F as default };
376
+
377
+ //# sourceMappingURL=design-system245.js.map