fds-vue-core 1.4.3 → 1.4.5

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.
@@ -8,9 +8,12 @@ type __VLS_Props = WrapperProps<Record<string, unknown>>;
8
8
  declare const _default: import("vue").DefineComponent<__VLS_Props, {
9
9
  selectedNodeObjects: import("vue").ComputedRef<NodeShape[]>;
10
10
  selectedNodes: import("vue").Reactive<Set<string>>;
11
+ getSearchContainerHeight: () => number;
11
12
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
13
+ getSearchContainerHeight: (value: number) => any;
12
14
  "update:selectedNodes": (value: NodeShape[]) => any;
13
15
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
16
+ onGetSearchContainerHeight?: (value: number) => any;
14
17
  "onUpdate:selectedNodes"?: (value: NodeShape[]) => any;
15
18
  }>, {
16
19
  expandChildrenOnParentCheck: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"FdsTreeView.vue.d.ts","sourceRoot":"","sources":["../../src/components/FdsTreeView.vue"],"names":[],"mappings":"AAgKA,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGpF,KAAK,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC,CAAA;AAE7E,KAAK,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,CACnD,aAAa,CAAC,CAAC,CAAC,EAChB,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAChD,GAAG;IACF,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAA;IACrB,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAA;CACvB,CAAA;AAED,KAAK,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;AAsSzD,wBAKG"}
1
+ {"version":3,"file":"FdsTreeView.vue.d.ts","sourceRoot":"","sources":["../../src/components/FdsTreeView.vue"],"names":[],"mappings":"AA2KA,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAIpF,KAAK,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC,CAAA;AAE7E,KAAK,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,CACnD,aAAa,CAAC,CAAC,CAAC,EAChB,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAChD,GAAG;IACF,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAA;IACrB,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAA;CACvB,CAAA;AAED,KAAK,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;AAwTzD,wBAKG"}
@@ -98,6 +98,8 @@ export interface TreeViewProps<T = Record<string, unknown>> {
98
98
  * for example to display the title and nodeId in the node title
99
99
  */
100
100
  titleTemplate?: string;
101
+ /** Get the height of the search container */
102
+ getSearchContainerHeight?: () => number | undefined;
101
103
  }
102
104
  export interface TreeViewStyles {
103
105
  /** Styles for the outer container */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/fds-tree-view/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/fds-tree-view/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type Ref } from 'vue';
2
+ export declare function useElementFinalSize(elementRef: Ref<HTMLElement | null>, onFinalSize: (height: number) => void, delay?: number): void;
3
+ //# sourceMappingURL=useElementFinalSize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useElementFinalSize.d.ts","sourceRoot":"","sources":["../../src/composables/useElementFinalSize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAE3C,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,EACnC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EACrC,KAAK,SAAM,QAkBZ"}
@@ -414,7 +414,7 @@ const _hoisted_6$1 = {
414
414
  key: 0,
415
415
  type: "default"
416
416
  };
417
- const _hoisted_7$1 = ["innerHTML"];
417
+ const _hoisted_7 = ["innerHTML"];
418
418
  const _hoisted_8 = {
419
419
  key: 1,
420
420
  type: "default"
@@ -468,7 +468,8 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
468
468
  searchResultNoMatchesBody: {},
469
469
  searchCountTemplate: {},
470
470
  searchCountTemplateUnfiltered: {},
471
- titleTemplate: {}
471
+ titleTemplate: {},
472
+ getSearchContainerHeight: {}
472
473
  },
473
474
  setup(__props) {
474
475
  const props = __props;
@@ -578,7 +579,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
578
579
  }, [
579
580
  vue.createElementVNode("div", {
580
581
  style: vue.normalizeStyle(indent.value),
581
- class: vue.normalizeClass({ "pb-3": _ctx.depth >= 0 })
582
+ class: vue.normalizeClass({ "mb-3": _ctx.depth >= 0 })
582
583
  }, [
583
584
  vue.createElementVNode("div", _hoisted_1$1, [
584
585
  hasChildrenNodes.value ? (vue.openBlock(), vue.createElementBlock("fds-icon", {
@@ -611,7 +612,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
611
612
  _ctx.searchHighlighting && _ctx.searchEnabled && vue.unref(treeState)?.searchTerm?.value && String(vue.unref(treeState)?.searchTerm?.value || "").trim().length >= (vue.unref(treeState)?.triggerLength ?? 1) ? (vue.openBlock(), vue.createElementBlock("fds-text", _hoisted_6$1, [
612
613
  vue.createElementVNode("span", {
613
614
  innerHTML: vue.unref(treeState)?.highlightText(_ctx.title, vue.unref(treeState)?.searchTerm?.value)
614
- }, null, 8, _hoisted_7$1)
615
+ }, null, 8, _hoisted_7)
615
616
  ])) : (vue.openBlock(), vue.createElementBlock("fds-text", _hoisted_8, vue.toDisplayString(_ctx.title), 1))
616
617
  ], 64)) : vue.createCommentVNode("", true),
617
618
  _ctx.showChildrenCount && hasChildrenNodes.value ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_9, " (+" + vue.toDisplayString(_ctx.searchEnabled && vue.unref(treeState)?.searchTerm?.value && String(vue.unref(treeState)?.searchTerm?.value || "").trim().length >= (vue.unref(treeState)?.triggerLength ?? 1) ? filteredNodes.value?.length || 0 : props.nodes.length) + ") ", 1)) : vue.createCommentVNode("", true)
@@ -695,24 +696,35 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
695
696
  };
696
697
  }
697
698
  });
698
- const _hoisted_1 = {
699
- key: 0,
700
- class: "mb-4"
701
- };
702
- const _hoisted_2 = ["value", "label"];
703
- const _hoisted_3 = {
699
+ function useElementFinalSize(elementRef, onFinalSize, delay = 100) {
700
+ vue.watchEffect((onCleanup) => {
701
+ const element = elementRef.value;
702
+ if (!element) return;
703
+ const timeoutId = setTimeout(() => {
704
+ requestAnimationFrame(() => {
705
+ const height = element.getBoundingClientRect().height;
706
+ if (height > 0) {
707
+ onFinalSize(height);
708
+ }
709
+ });
710
+ }, delay);
711
+ onCleanup(() => clearTimeout(timeoutId));
712
+ });
713
+ }
714
+ const _hoisted_1 = ["value", "label"];
715
+ const _hoisted_2 = {
704
716
  key: 0,
705
717
  class: "mt-1"
706
718
  };
707
- const _hoisted_4 = { key: 0 };
708
- const _hoisted_5 = { key: 1 };
709
- const _hoisted_6 = {
719
+ const _hoisted_3 = { key: 0 };
720
+ const _hoisted_4 = { key: 1 };
721
+ const _hoisted_5 = {
710
722
  key: 1,
711
723
  variant: "secondary",
712
724
  icon: "information",
713
725
  class: "mt-4"
714
726
  };
715
- const _hoisted_7 = { slot: "header" };
727
+ const _hoisted_6 = { slot: "header" };
716
728
  const _sfc_main = /* @__PURE__ */ vue.defineComponent({
717
729
  __name: "FdsTreeView",
718
730
  props: {
@@ -740,10 +752,11 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
740
752
  searchCountTemplate: {},
741
753
  searchCountTemplateUnfiltered: {},
742
754
  titleTemplate: { default: "${title}" },
755
+ getSearchContainerHeight: {},
743
756
  data: {},
744
757
  selected: {}
745
758
  },
746
- emits: ["update:selectedNodes"],
759
+ emits: ["update:selectedNodes", "getSearchContainerHeight"],
747
760
  setup(__props, { expose: __expose, emit: __emit }) {
748
761
  const props = __props;
749
762
  const emit = __emit;
@@ -768,9 +781,16 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
768
781
  const selectedNodeObjects = vue.computed(
769
782
  () => treeState.selectedNodeObjects.map(pruneNode)
770
783
  );
784
+ const searchContainerRef = vue.ref(null);
785
+ useElementFinalSize(searchContainerRef, (height) => {
786
+ emit("getSearchContainerHeight", height);
787
+ });
771
788
  __expose({
772
789
  selectedNodeObjects,
773
- selectedNodes: treeState.selectedNodes
790
+ selectedNodes: treeState.selectedNodes,
791
+ getSearchContainerHeight: () => {
792
+ return searchContainerRef.value?.getBoundingClientRect().height;
793
+ }
774
794
  });
775
795
  vue.watch(
776
796
  () => treeState.selectedNodeObjects,
@@ -781,7 +801,12 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
781
801
  );
782
802
  return (_ctx, _cache) => {
783
803
  return vue.openBlock(), vue.createElementBlock("div", null, [
784
- props.searchEnabled ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
804
+ props.searchEnabled ? (vue.openBlock(), vue.createElementBlock("div", {
805
+ key: 0,
806
+ ref_key: "searchContainerRef",
807
+ ref: searchContainerRef,
808
+ class: "mb-4"
809
+ }, [
785
810
  vue.createElementVNode("fds-input", {
786
811
  value: vue.unref(treeState)?.searchTerm || "",
787
812
  onInput: _cache[0] || (_cache[0] = ($event) => vue.unref(treeState)?.setSearchTerm($event.target.value)),
@@ -791,20 +816,20 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
791
816
  "on:clearInput": _cache[1] || (_cache[1] = ($event) => vue.unref(treeState)?.clearSearch())
792
817
  }, [..._cache[2] || (_cache[2] = [
793
818
  vue.createElementVNode("input", { id: "tree-view-search-input" }, null, -1)
794
- ])], 40, _hoisted_2),
795
- props.searchCountTemplate || props.searchCountTemplateUnfiltered ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3, [
796
- props.searchCountTemplate && vue.unref(treeState)?.searchTerm?.value && String(vue.unref(treeState)?.searchTerm?.value || "").trim().length >= (vue.unref(treeState)?.triggerLength ?? 1) ? (vue.openBlock(), vue.createElementBlock("h3", _hoisted_4, vue.toDisplayString(props.searchCountTemplate.replace("${filteredNodes}", vue.unref(treeState)?.filteredMatchCount.value.toString()).replace("${totalNodes}", vue.unref(treeState)?.totalNodeCount.value.toString())), 1)) : (vue.openBlock(), vue.createElementBlock("h3", _hoisted_5, vue.toDisplayString(props.searchCountTemplateUnfiltered?.replace(
819
+ ])], 40, _hoisted_1),
820
+ props.searchCountTemplate || props.searchCountTemplateUnfiltered ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2, [
821
+ props.searchCountTemplate && vue.unref(treeState)?.searchTerm?.value && String(vue.unref(treeState)?.searchTerm?.value || "").trim().length >= (vue.unref(treeState)?.triggerLength ?? 1) ? (vue.openBlock(), vue.createElementBlock("h3", _hoisted_3, vue.toDisplayString(props.searchCountTemplate.replace("${filteredNodes}", vue.unref(treeState)?.filteredMatchCount.value.toString()).replace("${totalNodes}", vue.unref(treeState)?.totalNodeCount.value.toString())), 1)) : (vue.openBlock(), vue.createElementBlock("h3", _hoisted_4, vue.toDisplayString(props.searchCountTemplateUnfiltered?.replace(
797
822
  "${totalNodes}",
798
823
  vue.unref(treeState)?.totalNodeCount.value.toString()
799
824
  )), 1))
800
825
  ])) : vue.createCommentVNode("", true)
801
- ])) : vue.createCommentVNode("", true),
802
- vue.unref(treeState)?.isEmptySearchResult?.value ? (vue.openBlock(), vue.createElementBlock("fds-content-block", _hoisted_6, [
803
- vue.createElementVNode("div", _hoisted_7, vue.toDisplayString(props.searchResultNoMatchesTitle), 1),
826
+ ], 512)) : vue.createCommentVNode("", true),
827
+ vue.unref(treeState)?.isEmptySearchResult?.value ? (vue.openBlock(), vue.createElementBlock("fds-content-block", _hoisted_5, [
828
+ vue.createElementVNode("div", _hoisted_6, vue.toDisplayString(props.searchResultNoMatchesTitle), 1),
804
829
  vue.createElementVNode("fds-text", null, vue.toDisplayString(props.searchResultNoMatchesBody), 1)
805
830
  ])) : vue.createCommentVNode("", true),
806
831
  vue.createElementVNode("div", {
807
- class: vue.normalizeClass(props.horizontalScroll ? "overflow-x-auto bg-white-solid" : "")
832
+ class: vue.normalizeClass({ "overflow-x-auto bg-white-solid": props.horizontalScroll })
808
833
  }, [
809
834
  props.data && !vue.unref(treeState)?.isEmptySearchResult?.value ? (vue.openBlock(), vue.createBlock(_sfc_main$1, {
810
835
  key: 0,
@@ -1 +1 @@
1
- {"version":3,"file":"fds-vue-core.cjs.js","sources":["../src/components/fds-tree-view/utils.ts","../src/components/fds-tree-view/useTreeState.ts","../src/components/fds-tree-view/TreeNode.vue","../src/components/FdsTreeView.vue","../src/index.ts"],"sourcesContent":["import type { TreeNode } from './types'\n\nconst getTitleFromProperties = (node: TreeNode, titleTemplate?: string) => {\n if (!titleTemplate) {\n return node.title\n }\n\n // Extract all occurrences of content inside ${} in the template string\n const templateVariables = extractTemplateVariables(titleTemplate)\n\n // Replace template variables with actual values\n let result = titleTemplate\n templateVariables.forEach((variable) => {\n const value = getNodePropertyValue(node, variable)\n result = result.replace(`\\${${variable}}`, value)\n })\n\n return result\n}\n\n/**\n * Extract all occurrences of content inside ${} in a string\n * @param template - The template string containing ${} placeholders\n * @returns Array of variable names found in the template\n */\nconst extractTemplateVariables = (template: string): string[] => {\n const regex = /\\$\\{([^}]+)\\}/g\n const matches: string[] = []\n let match\n\n while ((match = regex.exec(template)) !== null) {\n matches.push(match[1])\n }\n\n return matches\n}\n\n/**\n * Get property value from node object\n * @param node - The tree node\n * @param property - The property name to extract\n * @returns The property value as string\n */\nconst getNodePropertyValue = (node: TreeNode, property: string): string => {\n // Handle direct properties\n if (property in node) {\n const value = node[property as keyof TreeNode]\n return value ? String(value) : ''\n }\n\n // Handle nested data properties\n if (node.data && typeof node.data === 'object') {\n const dataValue = (node.data as any)[property]\n if (dataValue !== undefined && dataValue !== null) {\n return String(dataValue)\n }\n }\n\n // Return empty string if property not found\n return ''\n}\n\nexport { getTitleFromProperties }\n","import { computed, reactive, ref, watch } from 'vue'\nimport type { TreeNode, NodeId, TreeNodeArray, TreeNodeItem } from './types'\nimport { getTitleFromProperties } from './utils'\n\ninterface TreeStateOptions {\n expandChildrenOnParentCheck?: boolean\n expandAllChildrenOnParentCheck?: boolean\n showIndeterminateOnlyOnChildrenSelection?: boolean\n searchExpandNodes?: boolean\n titleTemplate?: string\n searchInputTriggerLength?: number\n nodes?: TreeNodeArray\n}\n\nconst useTreeState = (options: TreeStateOptions = {}) => {\n /** Default the trigger length to 1 when not provided */\n const triggerLength = options?.searchInputTriggerLength ?? 1\n /**\n * The set of selected nodes\n */\n const selectedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The array of selected node objects\n */\n const selectedNodeObjects = reactive<TreeNode[]>([])\n /**\n * The set of expanded nodes\n */\n const expandedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The search term for filtering nodes\n */\n const searchTerm = ref<string>('')\n\n /**\n * If no results are found for the search term\n */\n const isEmptySearchResult = ref<boolean>(false)\n\n // Watch for search term changes to update empty result flag\n watch(searchTerm, (newTerm) => {\n if (!newTerm.trim() || newTerm.length < triggerLength) {\n isEmptySearchResult.value = false\n } else if (options.nodes && options.nodes.length > 0) {\n // Check if there are any results for the new search term\n // The tree structure has a root node with children, so we need to check the root's children\n const rootNode = options.nodes[0]\n const nodesToCheck = rootNode?.children || []\n const filtered = filterNodesRecursive(nodesToCheck, newTerm, ['title', 'nodeId'])\n isEmptySearchResult.value = filtered.length === 0\n }\n })\n\n /**\n * Clears all selected nodes. Can be used to reset the selections to the initial state.\n */\n const clearAllSelectedNodes = () => {\n selectedNodes.clear()\n selectedNodeObjects.length = 0\n }\n\n /**\n * Collapses all expanded nodes. Can be used to reset the tree to the initial state.\n */\n const collapseAllExpandedNodes = () => expandedNodes.clear()\n\n /**\n * Returns true if the node is selected\n */\n const isNodeSelected = (nodeId: NodeId) => selectedNodes.has(nodeId)\n\n /**\n * Returns true if the node is expanded\n */\n const isNodeExpanded = (nodeId: NodeId) => expandedNodes.has(nodeId)\n\n /**\n * Expands the specific node\n */\n const expandNode = (nodeId: NodeId) => expandedNodes.add(nodeId)\n\n /**\n * Collapses the specific node\n */\n const collapseNode = (nodeId: NodeId) => expandedNodes.delete(nodeId)\n\n /**\n * Selects the specific node and adds it to the selectedNodeObjects array.\n * Used to access the node object and it's underlying data\n */\n const injectNode = (nodeObject: TreeNode) => {\n // Prevent duplicates\n if (selectedNodes.has(nodeObject.nodeId)) return\n\n selectedNodes.add(nodeObject.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === nodeObject.nodeId)) {\n selectedNodeObjects.push(nodeObject)\n }\n }\n\n /**\n * Expands all children of the specific node\n */\n const expandAllChildren = (node: TreeNode) => {\n expandNode(node.nodeId)\n if (node.children && node.children.length > 0) {\n node.children.forEach(expandAllChildren)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectAllChildren = (node: TreeNode) => {\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n\n // Inject the current node\n injectNode(node)\n\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n\n // Only expand children if the option is enabled\n if (options.expandChildrenOnParentCheck) {\n expandAllChildren(node)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectNodeAndAllChildren = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Select the current node\n injectNode(node)\n\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n }\n\n /**\n * Deselects the specific node\n */\n const deselectNode = (nodeId: NodeId) => {\n selectedNodes.delete(nodeId)\n const index = selectedNodeObjects.findIndex((node) => node.nodeId === nodeId)\n\n if (index > -1) {\n selectedNodeObjects.splice(index, 1)\n }\n }\n\n /**\n * Deselects this node and recursively deselects all children nodes\n */\n const deselectNodeAndAllChildren = (node: TreeNode) => {\n // Remove the current node\n deselectNode(node.nodeId)\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Deselects only the children of the specific node\n */\n const deselectChildrenOnly = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Ensure parent remains selected\n selectedNodes.add(node.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === node.nodeId)) {\n selectedNodeObjects.push(node)\n }\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeById = (nodes: TreeNodeArray, nodeId: string): TreeNodeItem | null => {\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeObjectById = (nodeId: string): TreeNodeItem | null => {\n const nodes = Array.isArray(options.nodes) ? options.nodes : []\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Checks if a node has children\n */\n const hasChildrenNodes = (nodes: TreeNodeArray) => nodes.length > 0\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOrChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return selectedNodes.has(node.nodeId) || isAnyChildSelected(node.children || [])\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentAndAllChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return false\n // Parent must be selected and all children\n return selectedNodes.has(node.nodeId) && isEveryChildSelected(node)\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOnlySelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return !isAnyChildSelected(node.children || []) && selectedNodes.has(node.nodeId)\n }\n\n /**\n * Returns true if ALL children of a node are selected\n */\n const isEveryChildSelected = (node: TreeNode): boolean => {\n if (!node.children || node.children.length === 0) return true\n\n return node.children.every(\n (child) => selectedNodes.has(child.nodeId) && isEveryChildSelected(child),\n )\n }\n\n /**\n * Checks if any child of a node is selected\n */\n const isAnyChildSelected = (nodes: TreeNodeArray): boolean => {\n if (!nodes || nodes.length === 0) return false\n return nodes.some(\n (child) =>\n selectedNodes.has(child.nodeId) || (child.children && isAnyChildSelected(child.children)),\n )\n }\n\n /**\n * Checks if a node is indeterminate (partially selected)\n */\n const isNodeIndeterminate = (nodes: TreeNodeArray, parentNodeId?: string): boolean => {\n if (!hasChildrenNodes(nodes)) return false\n\n // Check each child's state\n const childStates = nodes.map((node) => ({\n isSelected: selectedNodes.has(node.nodeId),\n isIndeterminate:\n node.children && node.children.length > 0\n ? isNodeIndeterminate(node.children, node.nodeId)\n : false,\n }))\n\n const hasSelected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isSelected,\n )\n const hasUnselected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) =>\n !child.isSelected && !child.isIndeterminate,\n )\n const hasIndeterminate = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isIndeterminate,\n )\n\n // If parent is selected, never show indeterminate\n if (parentNodeId && selectedNodes.has(parentNodeId)) return false\n\n // Standard behavior: some selected + some unselected, OR any child is indeterminate\n if (!options.showIndeterminateOnlyOnChildrenSelection) {\n return (hasSelected && hasUnselected) || hasIndeterminate\n }\n\n // Special behavior: any child selected OR any child indeterminate\n return hasSelected || hasIndeterminate\n }\n\n const isNodeIndeterminateById = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n if (!node) return false\n return isNodeIndeterminate(node.children || [], nodeId)\n }\n\n /**\n * Toggles the selection state of the specific node\n */\n const toggleSelectNode = (nodeId: string, title?: string, data?: Record<string, unknown>) => {\n let node = findNodeObjectById(nodeId)\n\n if (!node && nodeId) {\n node = {\n nodeId: nodeId,\n title: title,\n children: [],\n data: data,\n }\n }\n\n if (!node) return\n\n if (selectedNodes.has(nodeId)) {\n deselectNodeAndAllChildren(node)\n } else {\n selectAllChildren(node)\n\n if (\n selectedNodes.has(nodeId) &&\n !expandedNodes.has(nodeId) &&\n options.expandChildrenOnParentCheck\n ) {\n expandNode(nodeId)\n }\n }\n }\n\n /**\n * Toggles the expansion state of the specific node\n */\n const toggleExpandNode = (nodeId: NodeId) => {\n if (isNodeExpanded(nodeId)) {\n collapseNode(nodeId)\n } else {\n expandNode(nodeId)\n }\n }\n\n /**\n * Gets the icons for expanded and collapsed nodes\n */\n const getNodeIcon = (nodeId: NodeId, expandIcon: string, collapseIcon: string) => {\n return isNodeExpanded(nodeId) ? collapseIcon : expandIcon\n }\n\n /**\n * Checks if a node matches the search term by searching through specified properties\n */\n const nodeMatchesSearch = (node: TreeNode, term: string, searchParams?: string[]): boolean => {\n if (!term.trim()) return true\n if (!searchParams || !Array.isArray(searchParams)) return false\n\n const normalizeForSearch = (value: unknown): string => {\n const s = String(value ?? '')\n return s\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n }\n\n const searchLower = normalizeForSearch(term)\n\n const getValueByPath = (obj: unknown, path: string): unknown => {\n if (!obj) return undefined\n // If data is an array, check each element\n if (Array.isArray(obj)) {\n for (const item of obj) {\n const v = getValueByPath(item as Record<string, unknown>, path)\n if (v !== undefined && v !== null) return v\n }\n return undefined\n }\n if (typeof obj !== 'object') return undefined\n const segments = path.split('.')\n let current: unknown = obj as Record<string, unknown>\n for (const seg of segments) {\n if (current && typeof current === 'object' && seg in (current as Record<string, unknown>)) {\n current = (current as Record<string, unknown>)[seg]\n } else {\n return undefined\n }\n }\n return current\n }\n\n for (const rawParam of searchParams) {\n const param = rawParam.startsWith('data.') ? rawParam.slice(5) : rawParam\n if (param === 'title') {\n const renderedTitle = getTitleFromProperties(node, options?.titleTemplate)\n const titleToMatch = normalizeForSearch(renderedTitle || node.title)\n if (titleToMatch.includes(searchLower)) return true\n }\n if (param === 'nodeId' && normalizeForSearch(node.nodeId).includes(searchLower)) return true\n\n const dataSource = node.data as unknown\n if (Array.isArray(dataSource)) {\n for (const item of dataSource) {\n const v = getValueByPath(item, param)\n if (v !== undefined && v !== null) {\n try {\n if (normalizeForSearch(v).includes(searchLower)) return true\n } catch {}\n }\n }\n } else {\n const value = getValueByPath(dataSource, param)\n if (value !== undefined && value !== null) {\n try {\n if (normalizeForSearch(value).includes(searchLower)) return true\n } catch {}\n }\n }\n }\n\n return false\n }\n\n /**\n * Internal recursive filtering function\n */\n const filterNodesRecursive = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): TreeNodeArray => {\n if (!term.trim()) return nodes\n\n const filtered: TreeNodeArray = []\n\n for (const node of nodes) {\n const nodeMatches = nodeMatchesSearch(node, term, searchParams)\n const filteredChildren = node.children\n ? filterNodesRecursive(node.children, term, searchParams)\n : []\n\n // Include node if it matches OR has matching children\n if (nodeMatches || filteredChildren.length > 0) {\n filtered.push({\n ...node,\n children: filteredChildren.length > 0 ? filteredChildren : node.children,\n })\n }\n }\n\n return filtered\n }\n\n /**\n * Counts how many nodes match the search term across the provided subtree.\n */\n const countMatchingNodesRecursive = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): number => {\n if (!Array.isArray(nodes) || nodes.length === 0) return 0\n if (!term.trim()) return nodes.length\n\n let count = 0\n for (const node of nodes) {\n if (nodeMatchesSearch(node, term, searchParams)) count += 1\n if (node.children && node.children.length > 0) {\n count += countMatchingNodesRecursive(node.children, term, searchParams)\n }\n }\n return count\n }\n\n /**\n * Counts all nodes in the provided subtree.\n */\n const countAllNodesRecursive = (nodes: TreeNodeArray): number => {\n if (!Array.isArray(nodes) || nodes.length === 0) return 0\n let count = 0\n for (const node of nodes) {\n count += 1\n if (node.children && node.children.length > 0) {\n count += countAllNodesRecursive(node.children)\n }\n }\n return count\n }\n\n /**\n * Filters nodes based on search term, including children that match\n */\n const filterNodes = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): TreeNodeArray => {\n if (!term.trim() || term.length < triggerLength) {\n return nodes\n }\n\n const filtered = filterNodesRecursive(nodes, term, searchParams)\n\n return filtered\n }\n\n /**\n * Sets the search term\n */\n const setSearchTerm = (term: string) => {\n searchTerm.value = term\n if (!term.trim() || term.length < triggerLength) {\n isEmptySearchResult.value = false\n }\n }\n\n /**\n * Clears the search term\n */\n const clearSearch = () => {\n searchTerm.value = ''\n isEmptySearchResult.value = false\n }\n\n /**\n * Reactive total count of nodes matching the current search term.\n * If there is no term, returns total nodes under the root's children.\n */\n const filteredMatchCount = computed<number>(() => {\n const t = String(searchTerm.value || '').trim()\n const rootNode =\n Array.isArray(options.nodes) && options.nodes.length > 0 ? options.nodes[0] : null\n const nodesToCheck = rootNode?.children || []\n if (!rootNode) return 0\n if (!t || t.length < triggerLength) {\n return countAllNodesRecursive(nodesToCheck)\n }\n return countMatchingNodesRecursive(nodesToCheck, t, ['title', 'nodeId'])\n })\n\n /**\n * Reactive total node count under the root's children.\n */\n const totalNodeCount = computed<number>(() => {\n const rootNode =\n Array.isArray(options.nodes) && options.nodes.length > 0 ? options.nodes[0] : null\n const nodesToCheck = rootNode?.children || []\n if (!rootNode) return 0\n return countAllNodesRecursive(nodesToCheck)\n })\n\n /**\n * Returns HTML string with hits from search term wrapped in <strong>.\n */\n const highlightText = (text: string | undefined, term: string | undefined): string => {\n const source = String(text ?? '')\n const t = String(term ?? '').trim()\n if (!t) return source\n try {\n const re = new RegExp(t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'ig')\n return source.replace(re, '<strong>$&</strong>')\n } catch {\n return source\n }\n }\n\n return {\n triggerLength,\n clearSearch,\n collapseAllExpandedNodes,\n collapseNode,\n deselectNodeAndAllChildren,\n deselectChildrenOnly,\n deselectNode,\n expandAllChildren,\n expandedNodes,\n expandNode,\n filterNodes,\n getNodeIcon,\n injectNode,\n isNodeExpanded,\n isNodeIndeterminate,\n isNodeIndeterminateById,\n isNodeSelected,\n isParentOrChildrenSelected,\n isParentAndAllChildrenSelected,\n highlightText,\n searchTerm,\n filteredMatchCount,\n totalNodeCount,\n selectAllChildren,\n selectedNodeObjects,\n selectedNodes,\n setSearchTerm,\n toggleExpandNode,\n toggleSelectNode,\n isParentOnlySelected,\n selectNodeAndAllChildren,\n clearAllSelectedNodes,\n isEmptySearchResult,\n }\n}\n\nexport default useTreeState\n","<script setup lang=\"ts\">\nimport { computed, inject, reactive, ref, watch } from 'vue'\nimport type { TreeViewProps } from './types'\nimport useTreeState from './useTreeState'\nimport { getTitleFromProperties } from './utils'\n\ntype Props<T = Record<string, unknown>> = TreeViewProps<T>\n\nconst props = withDefaults(defineProps<Props>(), {\n nodes: () => [],\n depth: 0,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n searchHighlighting: false,\n})\n\ndefineOptions({\n name: 'TreeNode',\n})\n\nconst injectedTreeState = inject<ReturnType<typeof useTreeState> | null>('treeState', null)\nconst treeState = injectedTreeState!\nconst expandedNodes = treeState?.expandedNodes ?? reactive(new Set())\n\nconst indentValue = props.depth * props.indentation\n\nconst indent = computed(() => ({\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n paddingLeft: `${indentValue}px`,\n}))\n\nconst hasChildrenNodes = computed(() => {\n const nodesToCheck =\n props.searchEnabled && treeState?.searchTerm?.value ? filteredNodes.value : props.nodes\n return Array.isArray(nodesToCheck) && nodesToCheck.length > 0\n})\n\nconst filteredNodes = computed(() => {\n const t = String(treeState?.searchTerm?.value || '').trim()\n if (!props.searchEnabled || !t || t.length < (treeState?.triggerLength ?? 1)) {\n return props.nodes\n }\n return treeState.filterNodes(props.nodes, t, props.searchMatchParams)\n})\n\n// Auto-expand current node if search is active and it has matching children\nwatch(\n () => ({\n enabled: props.searchEnabled,\n expandOnSearch: props.searchExpandNodes,\n term: treeState?.searchTerm?.value,\n count: (filteredNodes.value || []).length,\n }),\n ({ enabled, expandOnSearch, term, count }) => {\n if (!enabled || !expandOnSearch) return\n const t = String(term || '').trim()\n if (!t || t.length < (treeState?.triggerLength ?? 1)) return\n if (typeof count === 'number' && count > 0) {\n expandedNodes.add(props.nodeId)\n }\n },\n)\n\nconst isOpen = ref(false)\nconst triggerRef = ref<HTMLElement | null>(null)\nconst popoverPanelRef = ref<HTMLElement | null>(null)\nconst popoverCoords = reactive({ bottom: 0, right: 0, left: 0, top: 0 })\n\nconst popoverWidth = 327\nconst popoverHeight = 80\n\nconst computePopoverCoords = () => {\n const triggerEl = triggerRef.value\n if (!triggerEl) return\n const rect = triggerEl.getBoundingClientRect()\n popoverCoords.bottom = Math.round(rect.bottom)\n popoverCoords.right = Math.round(rect.right)\n popoverCoords.left = Math.round(rect.left)\n popoverCoords.top = Math.round(rect.top)\n}\n\nconst openPopover = () => {\n computePopoverCoords()\n isOpen.value = true\n window.addEventListener('scroll', computePopoverCoords, true)\n window.addEventListener('resize', computePopoverCoords)\n document.addEventListener('pointerdown', handleGlobalPointerDown, { passive: true })\n document.addEventListener('keydown', handleGlobalKeydown)\n}\n\nconst closePopover = () => {\n isOpen.value = false\n window.removeEventListener('scroll', computePopoverCoords, true)\n window.removeEventListener('resize', computePopoverCoords)\n document.removeEventListener('pointerdown', handleGlobalPointerDown)\n document.removeEventListener('keydown', handleGlobalKeydown)\n}\n\nconst togglePopover = () => {\n if (isOpen.value) closePopover()\n else openPopover()\n}\n\nconst handleGlobalPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return\n\n const hasComposedPath = (ev: Event): ev is Event & { composedPath: () => EventTarget[] } =>\n typeof (ev as { composedPath?: () => EventTarget[] }).composedPath === 'function'\n\n const clickedPath = hasComposedPath(event) ? event.composedPath() : ([] as EventTarget[])\n const contains = (el: HTMLElement | null) => (el ? clickedPath.includes(el) : false)\n if (!contains(triggerRef.value) && !contains(popoverPanelRef.value)) {\n closePopover()\n }\n}\n\nconst handleGlobalKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen.value) {\n closePopover()\n }\n}\n\nconst options = [\n { label: props.popoverLabels?.parentAndChildren, value: 'parent_and_children' },\n { label: props.popoverLabels?.parent, value: 'parent' },\n]\n\nconst currentOption = computed(() => {\n if (treeState?.isParentAndAllChildrenSelected(props.nodeId)) return 'parent_and_children'\n if (treeState?.isParentOnlySelected(props.nodeId)) return 'parent'\n return ''\n})\n\nconst handleOptionClick = (option: (typeof options)[number]['value']) => {\n if (option === 'parent_and_children') {\n treeState?.selectNodeAndAllChildren(props.nodeId)\n } else if (option === 'parent') {\n treeState?.deselectChildrenOnly(props.nodeId)\n }\n isOpen.value = false\n}\n</script>\n\n<template>\n <div :class=\"props?.style?.container\">\n <div :style=\"indent\" :class=\"{'pb-3': depth >= 0}\">\n <div class=\"flex\">\n <fds-icon\n v-if=\"hasChildrenNodes\"\n @click=\"treeState?.toggleExpandNode(props.nodeId)\"\n :name=\"\n treeState?.getNodeIcon(props.nodeId, props.nodeExpandIcon, props.nodeCollapseIcon) ??\n props.nodeExpandIcon\n \"\n size=\"24px\"\n class=\"text-blue-500 mr-3\"\n style=\"margin-top: 3px\"\n />\n <div v-if=\"!hasChildrenNodes\" :style=\"{ minWidth: `${indentation}px` }\" />\n\n <fds-checkbox class=\"pl-0 flex-1 flex items-center\">\n <input\n :id=\"`checkbox-${props.nodeId}`\"\n style=\"margin: 0px; margin-top: 3px\"\n type=\"checkbox\"\n :checked=\"treeState?.isNodeSelected(props.nodeId)\"\n :indeterminate=\"\n showIndeterminate && (treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n @change=\"treeState?.toggleSelectNode(props.nodeId, props.title, props.data)\"\n />\n <label :for=\"`checkbox-${props.nodeId}`\" class=\"flex flex-col pl-0\">\n <div>\n <template v-if=\"title\">\n <fds-text\n v-if=\"\n searchHighlighting &&\n searchEnabled &&\n treeState?.searchTerm?.value &&\n String(treeState?.searchTerm?.value || '').trim().length >=\n (treeState?.triggerLength ?? 1)\n \"\n type=\"default\"\n >\n <span v-html=\"treeState?.highlightText(title, treeState?.searchTerm?.value)\" />\n </fds-text>\n <fds-text v-else type=\"default\">{{ title }}</fds-text>\n </template>\n <span v-if=\"showChildrenCount && hasChildrenNodes\">\n (+{{\n searchEnabled &&\n treeState?.searchTerm?.value &&\n String(treeState?.searchTerm?.value || '').trim().length >=\n (treeState?.triggerLength ?? 1)\n ? filteredNodes?.length || 0\n : props.nodes.length\n }})\n </span>\n </div>\n </label>\n </fds-checkbox>\n <div\n style=\"max-height: 28px\"\n v-if=\"\n treeState?.isParentOrChildrenSelected(props.nodeId) &&\n !(treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n >\n <fds-icon-button\n ref=\"triggerRef\"\n icon=\"more\"\n size=\"24px\"\n color=\"blue\"\n @click=\"togglePopover\"\n />\n <teleport to=\"body\">\n <div\n v-if=\"isOpen\"\n class=\"fixed z-[9999]\"\n :style=\"{\n top: popoverCoords.top + 'px',\n left:\n popoverCoords.right -\n popoverWidth -\n (popoverCoords.right - popoverCoords.left) +\n 'px',\n }\"\n >\n <div\n ref=\"popoverPanelRef\"\n class=\"bg-white rounded-md p-6 shadow-lg flex flex-col gap-3\"\n :style=\"{\n width: popoverWidth + 'px',\n minHeight: popoverHeight + 'px',\n }\"\n @click.stop\n >\n <div\n v-for=\"option in options\"\n :key=\"option.value\"\n class=\"flex align-center gap-2 justify-between cursor-pointer\"\n @click=\"handleOptionClick(option.value)\"\n >\n <fds-text>{{ option.label }}</fds-text>\n <fds-icon\n name=\"checkmark\"\n size=\"24px\"\n class=\"text-blue-500\"\n v-if=\"currentOption === option.value\"\n />\n </div>\n </div>\n </div>\n </teleport>\n </div>\n </div>\n </div>\n\n <div v-if=\"expandedNodes.has(props.nodeId)\">\n <TreeNode\n v-for=\"child in filteredNodes\"\n :key=\"child.nodeId\"\n :nodes=\"child.children || []\"\n :title=\"getTitleFromProperties(child, props.titleTemplate)\"\n :nodeId=\"child.nodeId\"\n :data=\"child.data\"\n :depth=\"props.depth + 1\"\n :indentation=\"props.indentation\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :showNodeDescription=\"showNodeDescription\"\n :showChildrenCount=\"showChildrenCount\"\n :expandChildrenOnSelect=\"expandChildrenOnSelect\"\n :showIndeterminate=\"showIndeterminate\"\n :showIndeterminateOnlyOnChildrenSelection=\"showIndeterminateOnlyOnChildrenSelection\"\n :expandChildrenOnParentCheck=\"expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"expandAllChildrenOnParentCheck\"\n :searchEnabled=\"searchEnabled\"\n :searchExpandNodes=\"searchExpandNodes\"\n :searchMatchParams=\"searchMatchParams\"\n :searchHighlighting=\"searchHighlighting\"\n :titleTemplate=\"props.titleTemplate\"\n :popoverLabels=\"props.popoverLabels\"\n />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, provide, watch } from 'vue'\nimport useTreeState from './fds-tree-view/useTreeState'\nimport TreeNode from './fds-tree-view/TreeNode.vue'\nimport type { TreeNode as TreeNodeType, TreeViewProps } from './fds-tree-view/types'\nimport { getTitleFromProperties } from './fds-tree-view/utils'\n\ntype NodeShape = Pick<TreeNodeType, 'nodeId' | 'title' | 'data' | 'children'>\n\ntype WrapperProps<T = Record<string, unknown>> = Omit<\n TreeViewProps<T>,\n 'nodes' | 'depth' | 'data' | 'nodeId' | 'title'\n> & {\n data: TreeNodeType<T>\n selected?: NodeShape[]\n}\n\nconst props = withDefaults(defineProps<WrapperProps<Record<string, unknown>>>(), {\n indentation: 36,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n titleTemplate: '${title}',\n})\n\nconst emit = defineEmits<{\n (e: 'update:selectedNodes', value: NodeShape[]): void\n}>()\n\nconst rootNode = props.data\nconst nodesForState = rootNode ? [rootNode] : []\n\nconst treeState = useTreeState({\n expandChildrenOnParentCheck: props.expandChildrenOnParentCheck,\n expandAllChildrenOnParentCheck: props.expandAllChildrenOnParentCheck,\n showIndeterminateOnlyOnChildrenSelection: props.showIndeterminateOnlyOnChildrenSelection,\n searchExpandNodes: props.searchExpandNodes,\n titleTemplate: props.titleTemplate,\n nodes: nodesForState,\n searchInputTriggerLength: props.searchInputTriggerLength,\n})\nprovide('treeState', treeState)\n\nconst pruneNode = (node: TreeNodeType): NodeShape => ({\n nodeId: node.nodeId,\n title: node.title,\n data: node.data,\n children: Array.isArray(node.children) ? node.children.map(pruneNode) : undefined,\n})\n\nconst selectedNodeObjects = computed<NodeShape[]>(() =>\n treeState.selectedNodeObjects.map(pruneNode),\n)\n\ndefineExpose({\n selectedNodeObjects,\n selectedNodes: treeState.selectedNodes,\n})\n\nwatch(\n () => treeState.selectedNodeObjects,\n () => {\n emit('update:selectedNodes', selectedNodeObjects.value)\n },\n { deep: true },\n)\n</script>\n\n<template>\n <div>\n <div v-if=\"props.searchEnabled\" class=\"mb-4\">\n <fds-input\n :value=\"treeState?.searchTerm || ''\"\n @input=\"treeState?.setSearchTerm($event.target.value)\"\n class=\"w-full\"\n :label=\"props.searchLabel\"\n clear-button\n @clearInput=\"treeState?.clearSearch()\"\n >\n <input id=\"tree-view-search-input\" />\n </fds-input>\n <div v-if=\"props.searchCountTemplate || props.searchCountTemplateUnfiltered\" class=\"mt-1\">\n <h3\n v-if=\"\n props.searchCountTemplate &&\n treeState?.searchTerm?.value &&\n String(treeState?.searchTerm?.value || '').trim().length >=\n (treeState?.triggerLength ?? 1)\n \"\n >\n {{\n props.searchCountTemplate\n .replace('${filteredNodes}', treeState?.filteredMatchCount.value.toString())\n .replace('${totalNodes}', treeState?.totalNodeCount.value.toString())\n }}\n </h3>\n <h3 v-else>\n {{\n props.searchCountTemplateUnfiltered?.replace(\n '${totalNodes}',\n treeState?.totalNodeCount.value.toString(),\n )\n }}\n </h3>\n </div>\n </div>\n\n <fds-content-block\n v-if=\"treeState?.isEmptySearchResult?.value\"\n variant=\"secondary\"\n icon=\"information\"\n class=\"mt-4\"\n >\n <div slot=\"header\">{{ props.searchResultNoMatchesTitle }}</div>\n <fds-text>{{ props.searchResultNoMatchesBody }}</fds-text>\n </fds-content-block>\n\n <div :class=\"props.horizontalScroll ? 'overflow-x-auto bg-white-solid' : ''\">\n <TreeNode\n v-if=\"props.data && !treeState?.isEmptySearchResult?.value\"\n :style=\"{ container: 'bg-white-solid p-2 rounded-md' }\"\n :nodes=\"props.data.children || []\"\n :title=\"getTitleFromProperties(props.data, props.titleTemplate)\"\n :nodeId=\"props.data.nodeId\"\n :data=\"props.data.data\"\n :indentation=\"props.indentation\"\n :showNodeDescription=\"props.showNodeDescription\"\n :showChildrenCount=\"props.showChildrenCount\"\n :expandChildrenOnSelect=\"props.expandChildrenOnSelect\"\n :showIndeterminate=\"props.showIndeterminate\"\n :expandChildrenOnParentCheck=\"props.expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"props.expandAllChildrenOnParentCheck\"\n :showIndeterminateOnlyOnChildrenSelection=\"props.showIndeterminateOnlyOnChildrenSelection\"\n :searchEnabled=\"props.searchEnabled\"\n :searchLabel=\"props.searchLabel\"\n :searchExpandNodes=\"props.searchExpandNodes\"\n :searchMatchParams=\"props.searchMatchParams\"\n :horizontalScroll=\"props.horizontalScroll\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :searchHighlighting=\"props.searchHighlighting\"\n :titleTemplate=\"props.titleTemplate\"\n :popoverLabels=\"props.popoverLabels\"\n />\n </div>\n </div>\n</template>\n","import type { App } from 'vue'\n\n// Import styles\nimport './style.css'\n\n// Import all components\nimport FdsTreeView from './components/FdsTreeView.vue'\n\n// Import composables\nimport useTreeState from './components/fds-tree-view/useTreeState'\n\n// Export individual components\nexport { FdsTreeView }\n\n// Export composables\nexport { useTreeState }\n\n// Export component library plugin\nexport default {\n install(app: App) {\n // Register all components globally\n app.component('FdsTreeView', FdsTreeView)\n },\n}\n\nexport type {\n TreeNode,\n TreeNodeArray,\n TreeNodeItem,\n TreeViewProps,\n NodeId,\n} from './components/fds-tree-view/types'\n\nimport type { TreeViewProps } from './components/fds-tree-view/types'\nexport type FdsTreeViewProps<T = Record<string, unknown>> = TreeViewProps<T>\n"],"names":["reactive","ref","watch","index","computed","inject","_createElementBlock","_normalizeClass","_createElementVNode","depth","_hoisted_1","_unref","indentation","_hoisted_3","showIndeterminate","title","_Fragment","searchHighlighting","searchEnabled","_openBlock","_hoisted_6","_toDisplayString","showChildrenCount","_createBlock","_Teleport","_normalizeStyle","_renderList","showNodeDescription","expandChildrenOnSelect","showIndeterminateOnlyOnChildrenSelection","expandChildrenOnParentCheck","expandAllChildrenOnParentCheck","searchExpandNodes","searchMatchParams","provide","TreeNode","FdsTreeView"],"mappings":";;;AAEA,MAAM,yBAAyB,CAAC,MAAgB,kBAA2B;AACzE,MAAI,CAAC,eAAe;AAClB,WAAO,KAAK;AAAA,EACd;AAGA,QAAM,oBAAoB,yBAAyB,aAAa;AAGhE,MAAI,SAAS;AACb,oBAAkB,QAAQ,CAAC,aAAa;AACtC,UAAM,QAAQ,qBAAqB,MAAM,QAAQ;AACjD,aAAS,OAAO,QAAQ,MAAM,QAAQ,KAAK,KAAK;AAAA,EAClD,CAAC;AAED,SAAO;AACT;AAOA,MAAM,2BAA2B,CAAC,aAA+B;AAC/D,QAAM,QAAQ;AACd,QAAM,UAAoB,CAAA;AAC1B,MAAI;AAEJ,UAAQ,QAAQ,MAAM,KAAK,QAAQ,OAAO,MAAM;AAC9C,YAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,EACvB;AAEA,SAAO;AACT;AAQA,MAAM,uBAAuB,CAAC,MAAgB,aAA6B;AAEzE,MAAI,YAAY,MAAM;AACpB,UAAM,QAAQ,KAAK,QAA0B;AAC7C,WAAO,QAAQ,OAAO,KAAK,IAAI;AAAA,EACjC;AAGA,MAAI,KAAK,QAAQ,OAAO,KAAK,SAAS,UAAU;AAC9C,UAAM,YAAa,KAAK,KAAa,QAAQ;AAC7C,QAAI,cAAc,UAAa,cAAc,MAAM;AACjD,aAAO,OAAO,SAAS;AAAA,IACzB;AAAA,EACF;AAGA,SAAO;AACT;AC9CA,MAAM,eAAe,CAAC,UAA4B,OAAO;AAEvD,QAAM,gBAAgB,SAAS,4BAA4B;AAI3D,QAAM,gBAAgBA,IAAAA,SAAsB,oBAAI,KAAK;AAIrD,QAAM,sBAAsBA,IAAAA,SAAqB,EAAE;AAInD,QAAM,gBAAgBA,IAAAA,SAAsB,oBAAI,KAAK;AAIrD,QAAM,aAAaC,IAAAA,IAAY,EAAE;AAKjC,QAAM,sBAAsBA,IAAAA,IAAa,KAAK;AAG9CC,YAAM,YAAY,CAAC,YAAY;AAC7B,QAAI,CAAC,QAAQ,KAAA,KAAU,QAAQ,SAAS,eAAe;AACrD,0BAAoB,QAAQ;AAAA,IAC9B,WAAW,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG;AAGpD,YAAM,WAAW,QAAQ,MAAM,CAAC;AAChC,YAAM,eAAe,UAAU,YAAY,CAAA;AAC3C,YAAM,WAAW,qBAAqB,cAAc,SAAS,CAAC,SAAS,QAAQ,CAAC;AAChF,0BAAoB,QAAQ,SAAS,WAAW;AAAA,IAClD;AAAA,EACF,CAAC;AAKD,QAAM,wBAAwB,MAAM;AAClC,kBAAc,MAAA;AACd,wBAAoB,SAAS;AAAA,EAC/B;AAKA,QAAM,2BAA2B,MAAM,cAAc,MAAA;AAKrD,QAAM,iBAAiB,CAAC,WAAmB,cAAc,IAAI,MAAM;AAKnE,QAAM,iBAAiB,CAAC,WAAmB,cAAc,IAAI,MAAM;AAKnE,QAAM,aAAa,CAAC,WAAmB,cAAc,IAAI,MAAM;AAK/D,QAAM,eAAe,CAAC,WAAmB,cAAc,OAAO,MAAM;AAMpE,QAAM,aAAa,CAAC,eAAyB;AAE3C,QAAI,cAAc,IAAI,WAAW,MAAM,EAAG;AAE1C,kBAAc,IAAI,WAAW,MAAM;AACnC,QAAI,CAAC,oBAAoB,KAAK,CAAC,MAAM,EAAE,WAAW,WAAW,MAAM,GAAG;AACpE,0BAAoB,KAAK,UAAU;AAAA,IACrC;AAAA,EACF;AAKA,QAAM,oBAAoB,CAAC,SAAmB;AAC5C,eAAW,KAAK,MAAM;AACtB,QAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,WAAK,SAAS,QAAQ,iBAAiB;AAAA,IACzC;AAAA,EACF;AAKA,QAAM,oBAAoB,CAAC,SAAmB;AAE5C,QAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,WAAK,SAAS,QAAQ,0BAA0B;AAAA,IAClD;AAGA,eAAW,IAAI;AAEf,QAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,WAAK,SAAS,QAAQ,iBAAiB;AAAA,IACzC;AAGA,QAAI,QAAQ,6BAA6B;AACvC,wBAAkB,IAAI;AAAA,IACxB;AAAA,EACF;AAKA,QAAM,2BAA2B,CAAC,WAAmB;AACnD,UAAM,OAAO,mBAAmB,MAAM;AAEtC,QAAI,CAAC,KAAM;AAGX,eAAW,IAAI;AAGf,QAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,WAAK,SAAS,QAAQ,iBAAiB;AAAA,IACzC;AAAA,EACF;AAKA,QAAM,eAAe,CAAC,WAAmB;AACvC,kBAAc,OAAO,MAAM;AAC3B,UAAMC,SAAQ,oBAAoB,UAAU,CAAC,SAAS,KAAK,WAAW,MAAM;AAE5E,QAAIA,SAAQ,IAAI;AACd,0BAAoB,OAAOA,QAAO,CAAC;AAAA,IACrC;AAAA,EACF;AAKA,QAAM,6BAA6B,CAAC,SAAmB;AAErD,iBAAa,KAAK,MAAM;AAGxB,QAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,WAAK,SAAS,QAAQ,0BAA0B;AAAA,IAClD;AAAA,EACF;AAKA,QAAM,uBAAuB,CAAC,WAAmB;AAC/C,UAAM,OAAO,mBAAmB,MAAM;AAEtC,QAAI,CAAC,KAAM;AAGX,kBAAc,IAAI,KAAK,MAAM;AAC7B,QAAI,CAAC,oBAAoB,KAAK,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM,GAAG;AAC9D,0BAAoB,KAAK,IAAI;AAAA,IAC/B;AAGA,QAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,WAAK,SAAS,QAAQ,0BAA0B;AAAA,IAClD;AAAA,EACF;AAKA,QAAM,eAAe,CAAC,OAAsB,WAAwC;AAClF,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,WAAW,QAAQ;AAC1B,eAAO;AAAA,MACT;AACA,UAAI,KAAK,UAAU;AACjB,cAAM,QAAQ,aAAa,KAAK,UAAU,MAAM;AAChD,YAAI,MAAO,QAAO;AAAA,MACpB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAKA,QAAM,qBAAqB,CAAC,WAAwC;AAClE,UAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAA;AAC7D,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,WAAW,QAAQ;AAC1B,eAAO;AAAA,MACT;AACA,UAAI,KAAK,UAAU;AACjB,cAAM,QAAQ,aAAa,KAAK,UAAU,MAAM;AAChD,YAAI,MAAO,QAAO;AAAA,MACpB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAKA,QAAM,mBAAmB,CAAC,UAAyB,MAAM,SAAS;AAKlE,QAAM,6BAA6B,CAAC,WAA4B;AAC9D,UAAM,OAAO,mBAAmB,MAAM;AAEtC,QAAI,CAAC,QAAQ,CAAC,iBAAiB,KAAK,YAAY,CAAA,CAAE,EAAG,QAAO;AAE5D,WAAO,cAAc,IAAI,KAAK,MAAM,KAAK,mBAAmB,KAAK,YAAY,EAAE;AAAA,EACjF;AAKA,QAAM,iCAAiC,CAAC,WAA4B;AAClE,UAAM,OAAO,mBAAmB,MAAM;AAEtC,QAAI,CAAC,KAAM,QAAO;AAElB,WAAO,cAAc,IAAI,KAAK,MAAM,KAAK,qBAAqB,IAAI;AAAA,EACpE;AAKA,QAAM,uBAAuB,CAAC,WAA4B;AACxD,UAAM,OAAO,mBAAmB,MAAM;AAEtC,QAAI,CAAC,QAAQ,CAAC,iBAAiB,KAAK,YAAY,CAAA,CAAE,EAAG,QAAO;AAE5D,WAAO,CAAC,mBAAmB,KAAK,YAAY,CAAA,CAAE,KAAK,cAAc,IAAI,KAAK,MAAM;AAAA,EAClF;AAKA,QAAM,uBAAuB,CAAC,SAA4B;AACxD,QAAI,CAAC,KAAK,YAAY,KAAK,SAAS,WAAW,EAAG,QAAO;AAEzD,WAAO,KAAK,SAAS;AAAA,MACnB,CAAC,UAAU,cAAc,IAAI,MAAM,MAAM,KAAK,qBAAqB,KAAK;AAAA,IAAA;AAAA,EAE5E;AAKA,QAAM,qBAAqB,CAAC,UAAkC;AAC5D,QAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO;AACzC,WAAO,MAAM;AAAA,MACX,CAAC,UACC,cAAc,IAAI,MAAM,MAAM,KAAM,MAAM,YAAY,mBAAmB,MAAM,QAAQ;AAAA,IAAA;AAAA,EAE7F;AAKA,QAAM,sBAAsB,CAAC,OAAsB,iBAAmC;AACpF,QAAI,CAAC,iBAAiB,KAAK,EAAG,QAAO;AAGrC,UAAM,cAAc,MAAM,IAAI,CAAC,UAAU;AAAA,MACvC,YAAY,cAAc,IAAI,KAAK,MAAM;AAAA,MACzC,iBACE,KAAK,YAAY,KAAK,SAAS,SAAS,IACpC,oBAAoB,KAAK,UAAU,KAAK,MAAM,IAC9C;AAAA,IAAA,EACN;AAEF,UAAM,cAAc,YAAY;AAAA,MAC9B,CAAC,UAA6D,MAAM;AAAA,IAAA;AAEtE,UAAM,gBAAgB,YAAY;AAAA,MAChC,CAAC,UACC,CAAC,MAAM,cAAc,CAAC,MAAM;AAAA,IAAA;AAEhC,UAAM,mBAAmB,YAAY;AAAA,MACnC,CAAC,UAA6D,MAAM;AAAA,IAAA;AAItE,QAAI,gBAAgB,cAAc,IAAI,YAAY,EAAG,QAAO;AAG5D,QAAI,CAAC,QAAQ,0CAA0C;AACrD,aAAQ,eAAe,iBAAkB;AAAA,IAC3C;AAGA,WAAO,eAAe;AAAA,EACxB;AAEA,QAAM,0BAA0B,CAAC,WAA4B;AAC3D,UAAM,OAAO,mBAAmB,MAAM;AACtC,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,oBAAoB,KAAK,YAAY,CAAA,GAAI,MAAM;AAAA,EACxD;AAKA,QAAM,mBAAmB,CAAC,QAAgB,OAAgB,SAAmC;AAC3F,QAAI,OAAO,mBAAmB,MAAM;AAEpC,QAAI,CAAC,QAAQ,QAAQ;AACnB,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,UAAU,CAAA;AAAA,QACV;AAAA,MAAA;AAAA,IAEJ;AAEA,QAAI,CAAC,KAAM;AAEX,QAAI,cAAc,IAAI,MAAM,GAAG;AAC7B,iCAA2B,IAAI;AAAA,IACjC,OAAO;AACL,wBAAkB,IAAI;AAEtB,UACE,cAAc,IAAI,MAAM,KACxB,CAAC,cAAc,IAAI,MAAM,KACzB,QAAQ,6BACR;AACA,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAKA,QAAM,mBAAmB,CAAC,WAAmB;AAC3C,QAAI,eAAe,MAAM,GAAG;AAC1B,mBAAa,MAAM;AAAA,IACrB,OAAO;AACL,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAKA,QAAM,cAAc,CAAC,QAAgB,YAAoB,iBAAyB;AAChF,WAAO,eAAe,MAAM,IAAI,eAAe;AAAA,EACjD;AAKA,QAAM,oBAAoB,CAAC,MAAgB,MAAc,iBAAqC;AAC5F,QAAI,CAAC,KAAK,KAAA,EAAQ,QAAO;AACzB,QAAI,CAAC,gBAAgB,CAAC,MAAM,QAAQ,YAAY,EAAG,QAAO;AAE1D,UAAM,qBAAqB,CAAC,UAA2B;AACrD,YAAM,IAAI,OAAO,SAAS,EAAE;AAC5B,aAAO,EACJ,YAAA,EACA,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,QAAQ,GAAG,EACnB,KAAA;AAAA,IACL;AAEA,UAAM,cAAc,mBAAmB,IAAI;AAE3C,UAAM,iBAAiB,CAAC,KAAc,SAA0B;AAC9D,UAAI,CAAC,IAAK,QAAO;AAEjB,UAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,mBAAW,QAAQ,KAAK;AACtB,gBAAM,IAAI,eAAe,MAAiC,IAAI;AAC9D,cAAI,MAAM,UAAa,MAAM,KAAM,QAAO;AAAA,QAC5C;AACA,eAAO;AAAA,MACT;AACA,UAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,YAAM,WAAW,KAAK,MAAM,GAAG;AAC/B,UAAI,UAAmB;AACvB,iBAAW,OAAO,UAAU;AAC1B,YAAI,WAAW,OAAO,YAAY,YAAY,OAAQ,SAAqC;AACzF,oBAAW,QAAoC,GAAG;AAAA,QACpD,OAAO;AACL,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,eAAW,YAAY,cAAc;AACnC,YAAM,QAAQ,SAAS,WAAW,OAAO,IAAI,SAAS,MAAM,CAAC,IAAI;AACjE,UAAI,UAAU,SAAS;AACrB,cAAM,gBAAgB,uBAAuB,MAAM,SAAS,aAAa;AACzE,cAAM,eAAe,mBAAmB,iBAAiB,KAAK,KAAK;AACnE,YAAI,aAAa,SAAS,WAAW,EAAG,QAAO;AAAA,MACjD;AACA,UAAI,UAAU,YAAY,mBAAmB,KAAK,MAAM,EAAE,SAAS,WAAW,EAAG,QAAO;AAExF,YAAM,aAAa,KAAK;AACxB,UAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,mBAAW,QAAQ,YAAY;AAC7B,gBAAM,IAAI,eAAe,MAAM,KAAK;AACpC,cAAI,MAAM,UAAa,MAAM,MAAM;AACjC,gBAAI;AACF,kBAAI,mBAAmB,CAAC,EAAE,SAAS,WAAW,EAAG,QAAO;AAAA,YAC1D,QAAQ;AAAA,YAAC;AAAA,UACX;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,QAAQ,eAAe,YAAY,KAAK;AAC9C,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,cAAI;AACF,gBAAI,mBAAmB,KAAK,EAAE,SAAS,WAAW,EAAG,QAAO;AAAA,UAC9D,QAAQ;AAAA,UAAC;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAKA,QAAM,uBAAuB,CAC3B,OACA,MACA,iBACkB;AAClB,QAAI,CAAC,KAAK,KAAA,EAAQ,QAAO;AAEzB,UAAM,WAA0B,CAAA;AAEhC,eAAW,QAAQ,OAAO;AACxB,YAAM,cAAc,kBAAkB,MAAM,MAAM,YAAY;AAC9D,YAAM,mBAAmB,KAAK,WAC1B,qBAAqB,KAAK,UAAU,MAAM,YAAY,IACtD,CAAA;AAGJ,UAAI,eAAe,iBAAiB,SAAS,GAAG;AAC9C,iBAAS,KAAK;AAAA,UACZ,GAAG;AAAA,UACH,UAAU,iBAAiB,SAAS,IAAI,mBAAmB,KAAK;AAAA,QAAA,CACjE;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAKA,QAAM,8BAA8B,CAClC,OACA,MACA,iBACW;AACX,QAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,EAAG,QAAO;AACxD,QAAI,CAAC,KAAK,eAAe,MAAM;AAE/B,QAAI,QAAQ;AACZ,eAAW,QAAQ,OAAO;AACxB,UAAI,kBAAkB,MAAM,MAAM,YAAY,EAAG,UAAS;AAC1D,UAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,iBAAS,4BAA4B,KAAK,UAAU,MAAM,YAAY;AAAA,MACxE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAKA,QAAM,yBAAyB,CAAC,UAAiC;AAC/D,QAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,EAAG,QAAO;AACxD,QAAI,QAAQ;AACZ,eAAW,QAAQ,OAAO;AACxB,eAAS;AACT,UAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,iBAAS,uBAAuB,KAAK,QAAQ;AAAA,MAC/C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAKA,QAAM,cAAc,CAClB,OACA,MACA,iBACkB;AAClB,QAAI,CAAC,KAAK,KAAA,KAAU,KAAK,SAAS,eAAe;AAC/C,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,qBAAqB,OAAO,MAAM,YAAY;AAE/D,WAAO;AAAA,EACT;AAKA,QAAM,gBAAgB,CAAC,SAAiB;AACtC,eAAW,QAAQ;AACnB,QAAI,CAAC,KAAK,KAAA,KAAU,KAAK,SAAS,eAAe;AAC/C,0BAAoB,QAAQ;AAAA,IAC9B;AAAA,EACF;AAKA,QAAM,cAAc,MAAM;AACxB,eAAW,QAAQ;AACnB,wBAAoB,QAAQ;AAAA,EAC9B;AAMA,QAAM,qBAAqBC,IAAAA,SAAiB,MAAM;AAChD,UAAM,IAAI,OAAO,WAAW,SAAS,EAAE,EAAE,KAAA;AACzC,UAAM,WACJ,MAAM,QAAQ,QAAQ,KAAK,KAAK,QAAQ,MAAM,SAAS,IAAI,QAAQ,MAAM,CAAC,IAAI;AAChF,UAAM,eAAe,UAAU,YAAY,CAAA;AAC3C,QAAI,CAAC,SAAU,QAAO;AACtB,QAAI,CAAC,KAAK,EAAE,SAAS,eAAe;AAClC,aAAO,uBAAuB,YAAY;AAAA,IAC5C;AACA,WAAO,4BAA4B,cAAc,GAAG,CAAC,SAAS,QAAQ,CAAC;AAAA,EACzE,CAAC;AAKD,QAAM,iBAAiBA,IAAAA,SAAiB,MAAM;AAC5C,UAAM,WACJ,MAAM,QAAQ,QAAQ,KAAK,KAAK,QAAQ,MAAM,SAAS,IAAI,QAAQ,MAAM,CAAC,IAAI;AAChF,UAAM,eAAe,UAAU,YAAY,CAAA;AAC3C,QAAI,CAAC,SAAU,QAAO;AACtB,WAAO,uBAAuB,YAAY;AAAA,EAC5C,CAAC;AAKD,QAAM,gBAAgB,CAAC,MAA0B,SAAqC;AACpF,UAAM,SAAS,OAAO,QAAQ,EAAE;AAChC,UAAM,IAAI,OAAO,QAAQ,EAAE,EAAE,KAAA;AAC7B,QAAI,CAAC,EAAG,QAAO;AACf,QAAI;AACF,YAAM,KAAK,IAAI,OAAO,EAAE,QAAQ,uBAAuB,MAAM,GAAG,IAAI;AACpE,aAAO,OAAO,QAAQ,IAAI,qBAAqB;AAAA,IACjD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3iBA,MAAM,eAAe;AACrB,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAvEtB,UAAM,QAAQ;AAqBd,UAAM,oBAAoBC,IAAAA,OAA+C,aAAa,IAAI;AAC1F,UAAM,YAAY;AAClB,UAAM,gBAAgB,WAAW,iBAAiBL,IAAAA,SAAS,oBAAI,KAAK;AAEpE,UAAM,cAAc,MAAM,QAAQ,MAAM;AAExC,UAAM,SAASI,IAAAA,SAAS,OAAO;AAAA,MAC7B,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,aAAa,GAAG,WAAW;AAAA,IAAA,EAC3B;AAEF,UAAM,mBAAmBA,IAAAA,SAAS,MAAM;AACtC,YAAM,eACJ,MAAM,iBAAiB,WAAW,YAAY,QAAQ,cAAc,QAAQ,MAAM;AACpF,aAAO,MAAM,QAAQ,YAAY,KAAK,aAAa,SAAS;AAAA,IAC9D,CAAC;AAED,UAAM,gBAAgBA,IAAAA,SAAS,MAAM;AACnC,YAAM,IAAI,OAAO,WAAW,YAAY,SAAS,EAAE,EAAE,KAAA;AACrD,UAAI,CAAC,MAAM,iBAAiB,CAAC,KAAK,EAAE,UAAU,WAAW,iBAAiB,IAAI;AAC5E,eAAO,MAAM;AAAA,MACf;AACA,aAAO,UAAU,YAAY,MAAM,OAAO,GAAG,MAAM,iBAAiB;AAAA,IACtE,CAAC;AAGDF,QAAAA;AAAAA,MACE,OAAO;AAAA,QACL,SAAS,MAAM;AAAA,QACf,gBAAgB,MAAM;AAAA,QACtB,MAAM,WAAW,YAAY;AAAA,QAC7B,QAAQ,cAAc,SAAS,IAAI;AAAA,MAAA;AAAA,MAErC,CAAC,EAAE,SAAS,gBAAgB,MAAM,YAAY;AAC5C,YAAI,CAAC,WAAW,CAAC,eAAgB;AACjC,cAAM,IAAI,OAAO,QAAQ,EAAE,EAAE,KAAA;AAC7B,YAAI,CAAC,KAAK,EAAE,UAAU,WAAW,iBAAiB,GAAI;AACtD,YAAI,OAAO,UAAU,YAAY,QAAQ,GAAG;AAC1C,wBAAc,IAAI,MAAM,MAAM;AAAA,QAChC;AAAA,MACF;AAAA,IAAA;AAGF,UAAM,SAASD,IAAAA,IAAI,KAAK;AACxB,UAAM,aAAaA,IAAAA,IAAwB,IAAI;AAC/C,UAAM,kBAAkBA,IAAAA,IAAwB,IAAI;AACpD,UAAM,gBAAgBD,IAAAA,SAAS,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,EAAA,CAAG;AAKvE,UAAM,uBAAuB,MAAM;AACjC,YAAM,YAAY,WAAW;AAC7B,UAAI,CAAC,UAAW;AAChB,YAAM,OAAO,UAAU,sBAAA;AACvB,oBAAc,SAAS,KAAK,MAAM,KAAK,MAAM;AAC7C,oBAAc,QAAQ,KAAK,MAAM,KAAK,KAAK;AAC3C,oBAAc,OAAO,KAAK,MAAM,KAAK,IAAI;AACzC,oBAAc,MAAM,KAAK,MAAM,KAAK,GAAG;AAAA,IACzC;AAEA,UAAM,cAAc,MAAM;AACxB,2BAAA;AACA,aAAO,QAAQ;AACf,aAAO,iBAAiB,UAAU,sBAAsB,IAAI;AAC5D,aAAO,iBAAiB,UAAU,oBAAoB;AACtD,eAAS,iBAAiB,eAAe,yBAAyB,EAAE,SAAS,MAAM;AACnF,eAAS,iBAAiB,WAAW,mBAAmB;AAAA,IAC1D;AAEA,UAAM,eAAe,MAAM;AACzB,aAAO,QAAQ;AACf,aAAO,oBAAoB,UAAU,sBAAsB,IAAI;AAC/D,aAAO,oBAAoB,UAAU,oBAAoB;AACzD,eAAS,oBAAoB,eAAe,uBAAuB;AACnE,eAAS,oBAAoB,WAAW,mBAAmB;AAAA,IAC7D;AAEA,UAAM,gBAAgB,MAAM;AAC1B,UAAI,OAAO,MAAO,cAAA;AAAA,UACb,aAAA;AAAA,IACP;AAEA,UAAM,0BAA0B,CAAC,UAAwB;AACvD,UAAI,CAAC,OAAO,MAAO;AAEnB,YAAM,kBAAkB,CAAC,OACvB,OAAQ,GAA8C,iBAAiB;AAEzE,YAAM,cAAc,gBAAgB,KAAK,IAAI,MAAM,aAAA,IAAkB,CAAA;AACrE,YAAM,WAAW,CAAC,OAA4B,KAAK,YAAY,SAAS,EAAE,IAAI;AAC9E,UAAI,CAAC,SAAS,WAAW,KAAK,KAAK,CAAC,SAAS,gBAAgB,KAAK,GAAG;AACnE,qBAAA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,sBAAsB,CAAC,UAAyB;AACpD,UAAI,MAAM,QAAQ,YAAY,OAAO,OAAO;AAC1C,qBAAA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU;AAAA,MACd,EAAE,OAAO,MAAM,eAAe,mBAAmB,OAAO,sBAAA;AAAA,MACxD,EAAE,OAAO,MAAM,eAAe,QAAQ,OAAO,SAAA;AAAA,IAAS;AAGxD,UAAM,gBAAgBI,IAAAA,SAAS,MAAM;AACnC,UAAI,WAAW,+BAA+B,MAAM,MAAM,EAAG,QAAO;AACpE,UAAI,WAAW,qBAAqB,MAAM,MAAM,EAAG,QAAO;AAC1D,aAAO;AAAA,IACT,CAAC;AAED,UAAM,oBAAoB,CAAC,WAA8C;AACvE,UAAI,WAAW,uBAAuB;AACpC,mBAAW,yBAAyB,MAAM,MAAM;AAAA,MAClD,WAAW,WAAW,UAAU;AAC9B,mBAAW,qBAAqB,MAAM,MAAM;AAAA,MAC9C;AACA,aAAO,QAAQ;AAAA,IACjB;;;8BAIEE,IAAAA,mBA6IM,OAAA;AAAA,QA7IA,OAAKC,IAAAA,eAAE,OAAO,OAAO,SAAS;AAAA,MAAA;QAClCC,IAAAA,mBA+GM,OAAA;AAAA,UA/GA,0BAAO,OAAA,KAAM;AAAA,UAAG,oCAAgBC,KAAAA,SAAK,GAAA;AAAA,QAAA;UACzCD,IAAAA,mBA6GM,OA7GNE,cA6GM;AAAA,YA3GI,iBAAA,0BADRJ,IAAAA,mBAUE,YAAA;AAAA;cARC,+CAAOK,IAAAA,MAAA,SAAA,GAAW,iBAAiB,MAAM,MAAM;AAAA,cAC/C,MAAmBA,IAAAA,MAAA,SAAA,GAAW,YAAY,MAAM,QAAQ,MAAM,gBAAgB,MAAM,gBAAgB,KAAiB,MAAM;AAAA,cAI5H,MAAK;AAAA,cACL,OAAM;AAAA,cACN,OAAA,EAAA,cAAA,MAAA;AAAA,YAAA;aAEU,iBAAA,0BAAZL,IAAAA,mBAA0E,OAAA;AAAA;cAA3C,yCAAsBM,KAAAA,WAAW,MAAA;AAAA,YAAA;YAEhEJ,IAAAA,mBAwCe,gBAxCfK,cAwCe;AAAA,cAvCbL,IAAAA,mBASE,SAAA;AAAA,gBARC,IAAE,YAAc,MAAM,MAAM;AAAA,gBAC7B,OAAA,EAAA,UAAA,OAAA,cAAA,MAAA;AAAA,gBACA,MAAK;AAAA,gBACJ,SAASG,IAAAA,MAAA,SAAA,GAAW,eAAe,MAAM,MAAM;AAAA,gBAC/C,eAA8BG,KAAAA,sBAAsBH,UAAA,SAAA,GAAW,wBAAwB,MAAM,MAAM,KAAA;AAAA,gBAGnG,UAAM,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEA,IAAAA,MAAA,SAAA,GAAW,iBAAiB,MAAM,QAAQ,MAAM,OAAO,MAAM,IAAI;AAAA,cAAA;cAE5EH,IAAAA,mBA4BQ,SAAA;AAAA,gBA5BA,KAAG,YAAc,MAAM,MAAM;AAAA,gBAAI,OAAM;AAAA,cAAA;gBAC7CA,IAAAA,mBA0BM,OAAA,MAAA;AAAA,kBAzBYO,KAAAA,0BAAhBT,IAAAA,mBAcWU,IAAAA,UAAA,EAAA,KAAA,KAAA;AAAA,oBAZoBC,KAAAA,sBAA0CC,KAAAA,iBAAqCP,IAAAA,MAAA,SAAA,GAAW,YAAY,SAA6B,OAAOA,IAAAA,kBAAW,YAAY,SAAK,EAAA,EAAQ,KAAA,EAAO,WAAiCA,IAAAA,MAAA,SAAA,GAAW,iBAAa,MAD3QQ,IAAAA,UAAA,GAAAb,IAAAA,mBAWW,YAXXc,cAWW;AAAA,sBADTZ,IAAAA,mBAA+E,QAAA;AAAA,wBAAzE,WAAQG,IAAAA,MAAA,SAAA,GAAW,cAAcI,KAAAA,OAAOJ,UAAA,SAAA,GAAW,YAAY,KAAK;AAAA,sBAAA;4CAE5EL,IAAAA,mBAAsD,YAAtD,YAAsDe,IAAAA,gBAAnBN,KAAAA,KAAK,GAAA,CAAA;AAAA,kBAAA;kBAE9BO,KAAAA,qBAAqB,iBAAA,0BAAjChB,uBASO,QAAA,YAT4C,QAC/Ce,IAAAA,gBACAH,KAAAA,iBAAmCP,UAAA,SAAA,GAAW,YAAY,SAA2B,OAAOA,IAAAA,kBAAW,YAAY,SAAK,EAAA,EAAQ,OAAO,WAA+BA,IAAAA,MAAA,SAAA,GAAW,iBAAa,KAA6B,cAAA,OAAe,UAAM,IAA4B,MAAM,MAAM,MAAM,IAM9R,MACJ,CAAA;;;;YAMeA,UAAA,SAAA,GAAW,2BAA2B,MAAM,MAAM,KAAmB,EAAAA,IAAAA,MAAA,SAAA,GAAW,wBAAwB,MAAM,MAAM,KAAA,UAFzIQ,IAAAA,aAAAb,IAAAA,mBAqDM,OArDN,aAqDM;AAAA,cA9CJE,IAAAA,mBAME,mBAAA;AAAA,yBALI;AAAA,gBAAJ,KAAI;AAAA,gBACJ,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,OAAM;AAAA,gBACL,SAAO;AAAA,cAAA;gCAEVe,IAAAA,YAsCWC,IAAAA,UAAA,EAtCD,IAAG,UAAM;AAAA,gBAET,OAAA,0BADRlB,IAAAA,mBAoCM,OAAA;AAAA;kBAlCJ,OAAM;AAAA,kBACL,OAAKmB,IAAAA,eAAA;AAAA,oBAAyB,KAAA,cAAc,MAAG;AAAA,0BAAiD,cAAc,QAA0B,gBAAkC,cAAc,QAAQ,cAAc;;;kBAS/MjB,IAAAA,mBAuBM,OAAA;AAAA,6BAtBA;AAAA,oBAAJ,KAAI;AAAA,oBACJ,OAAM;AAAA,oBACL,OAAKiB,IAAAA,eAAA;AAAA,6BAA6B,eAAY;AAAA,iCAAsC,gBAAa;AAAA,oBAAA;oBAIjG,qDAAD,MAAA;AAAA,oBAAA,GAAW,CAAA,MAAA,CAAA;AAAA,kBAAA;sCAEXnB,IAAAA,mBAaMU,IAAAA,UAAA,MAAAU,eAZa,SAAO,CAAjB,WAAM;6BADflB,IAAAA,mBAaM,OAAA;AAAA,wBAXH,KAAK,OAAO;AAAA,wBACb,OAAM;AAAA,wBACL,SAAK,CAAA,WAAE,kBAAkB,OAAO,KAAK;AAAA,sBAAA;wBAEtCA,IAAAA,mBAAuC,YAAA,MAAAa,IAAAA,gBAA1B,OAAO,KAAK,GAAA,CAAA;AAAA,wBAKjB,cAAA,UAAkB,OAAO,SAJjCF,IAAAA,UAAA,GAAAb,uBAKE,YALF,WAKE;;;;;;;;;QASLK,IAAAA,MAAA,aAAA,EAAc,IAAI,MAAM,MAAM,sBAAzCL,IAAAA,mBA0BM,OAAA,aAAA;AAAA,gCAzBJA,IAAAA,mBAwBEU,IAAAA,UAAA,MAAAU,IAAAA,WAvBgB,cAAA,OAAa,CAAtB,UAAK;oCADdH,IAAAA,YAwBE,qBAAA;AAAA,cAtBC,KAAK,MAAM;AAAA,cACX,OAAO,MAAM,YAAQ,CAAA;AAAA,cACrB,OAAOZ,IAAAA,MAAA,sBAAA,EAAuB,OAAO,MAAM,aAAa;AAAA,cACxD,QAAQ,MAAM;AAAA,cACd,MAAM,MAAM;AAAA,cACZ,OAAO,MAAM,QAAK;AAAA,cAClB,aAAa,MAAM;AAAA,cACnB,gBAAgB,MAAM;AAAA,cACtB,kBAAkB,MAAM;AAAA,cACxB,qBAAqBgB,KAAAA;AAAAA,cACrB,mBAAmBL,KAAAA;AAAAA,cACnB,wBAAwBM,KAAAA;AAAAA,cACxB,mBAAmBd,KAAAA;AAAAA,cACnB,0CAA0Ce,KAAAA;AAAAA,cAC1C,6BAA6BC,KAAAA;AAAAA,cAC7B,gCAAgCC,KAAAA;AAAAA,cAChC,eAAeb,KAAAA;AAAAA,cACf,mBAAmBc,KAAAA;AAAAA,cACnB,mBAAmBC,KAAAA;AAAAA,cACnB,oBAAoBhB,KAAAA;AAAAA,cACpB,eAAe,MAAM;AAAA,cACrB,eAAe,MAAM;AAAA,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnR9B,UAAM,QAAQ;AAgBd,UAAM,OAAO;AAIb,UAAM,WAAW,MAAM;AACvB,UAAM,gBAAgB,WAAW,CAAC,QAAQ,IAAI,CAAA;AAE9C,UAAM,YAAY,aAAa;AAAA,MAC7B,6BAA6B,MAAM;AAAA,MACnC,gCAAgC,MAAM;AAAA,MACtC,0CAA0C,MAAM;AAAA,MAChD,mBAAmB,MAAM;AAAA,MACzB,eAAe,MAAM;AAAA,MACrB,OAAO;AAAA,MACP,0BAA0B,MAAM;AAAA,IAAA,CACjC;AACDiB,QAAAA,QAAQ,aAAa,SAAS;AAE9B,UAAM,YAAY,CAAC,UAAmC;AAAA,MACpD,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,UAAU,MAAM,QAAQ,KAAK,QAAQ,IAAI,KAAK,SAAS,IAAI,SAAS,IAAI;AAAA,IAAA;AAG1E,UAAM,sBAAsB9B,IAAAA;AAAAA,MAAsB,MAChD,UAAU,oBAAoB,IAAI,SAAS;AAAA,IAAA;AAG7C,aAAa;AAAA,MACX;AAAA,MACA,eAAe,UAAU;AAAA,IAAA,CAC1B;AAEDF,QAAAA;AAAAA,MACE,MAAM,UAAU;AAAA,MAChB,MAAM;AACJ,aAAK,wBAAwB,oBAAoB,KAAK;AAAA,MACxD;AAAA,MACA,EAAE,MAAM,KAAA;AAAA,IAAK;;8BAKbI,uBA4EM,OAAA,MAAA;AAAA,QA3EO,MAAM,iBAAjBa,IAAAA,UAAA,GAAAb,IAAAA,mBAmCM,OAnCN,YAmCM;AAAA,UAlCJE,IAAAA,mBASY,aAAA;AAAA,YART,OAAOG,IAAAA,MAAA,SAAA,GAAW,cAAU;AAAA,YAC5B,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEA,IAAAA,kBAAW,cAAc,OAAO,OAAO,KAAK;AAAA,YACpD,OAAM;AAAA,YACL,OAAO,MAAM;AAAA,YACd,gBAAA;AAAA,YACC,iBAAU,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEA,IAAAA,MAAA,SAAA,GAAW,YAAA;AAAA,UAAW;YAEnCH,IAAAA,mBAAqC,SAAA,EAA9B,IAAG,yBAAA,GAAwB,MAAA,EAAA;AAAA,UAAA;UAEzB,MAAM,uBAAuB,MAAM,iCAA9CW,IAAAA,aAAAb,IAAAA,mBAuBM,OAvBN,YAuBM;AAAA,YArBiB,MAAM,uBAAmCK,IAAAA,MAAA,SAAA,GAAW,YAAY,SAAqB,OAAOA,IAAAA,kBAAW,YAAY,SAAK,EAAA,EAAQ,KAAA,EAAO,WAAyBA,IAAAA,MAAA,SAAA,GAAW,iBAAa,uBAD7ML,IAAAA,mBAaK,MAAA,YAAAe,IAAAA,gBAJD,MAAM,oBAAmC,4BAA4BV,IAAAA,MAAA,SAAA,GAAW,mBAAmB,MAAM,SAAA,CAAQ,EAAmB,yBAAyBA,IAAAA,MAAA,SAAA,GAAW,eAAe,MAAM,SAAA,CAAQ,CAAA,GAAA,CAAA,MAKzMQ,IAAAA,UAAA,GAAAb,IAAAA,mBAOK,MAAA,YAAAe,IAAAA,gBALD,MAAM,+BAA+B;AAAA;cAAsDV,IAAAA,MAAA,SAAA,GAAW,eAAe,MAAM,SAAA;AAAA,YAAQ;;;QAUnIA,UAAA,SAAA,GAAW,qBAAqB,SADxCQ,IAAAA,aAAAb,IAAAA,mBAQoB,qBARpB,YAQoB;AAAA,UAFlBE,IAAAA,mBAA+D,OAA/D,YAA+Da,IAAAA,gBAAzC,MAAM,0BAA0B,GAAA,CAAA;AAAA,UACtDb,IAAAA,mBAA0D,YAAA,MAAAa,IAAAA,gBAA7C,MAAM,yBAAyB,GAAA,CAAA;AAAA,QAAA;QAG9Cb,IAAAA,mBA2BM,OAAA;AAAA,UA3BA,OAAKD,IAAAA,eAAE,MAAM,mBAAgB,mCAAA,EAAA;AAAA,QAAA;UAEzB,MAAM,QAAI,CAAKI,IAAAA,kBAAW,qBAAqB,0BADvDY,IAAAA,YAyBEY,aAAA;AAAA;YAvBC,OAAO,EAAA,WAAA,gCAAA;AAAA,YACP,OAAO,MAAM,KAAK,YAAQ,CAAA;AAAA,YAC1B,OAAOxB,IAAAA,8BAAuB,MAAM,MAAM,MAAM,aAAa;AAAA,YAC7D,QAAQ,MAAM,KAAK;AAAA,YACnB,MAAM,MAAM,KAAK;AAAA,YACjB,aAAa,MAAM;AAAA,YACnB,qBAAqB,MAAM;AAAA,YAC3B,mBAAmB,MAAM;AAAA,YACzB,wBAAwB,MAAM;AAAA,YAC9B,mBAAmB,MAAM;AAAA,YACzB,6BAA6B,MAAM;AAAA,YACnC,gCAAgC,MAAM;AAAA,YACtC,0CAA0C,MAAM;AAAA,YAChD,eAAe,MAAM;AAAA,YACrB,aAAa,MAAM;AAAA,YACnB,mBAAmB,MAAM;AAAA,YACzB,mBAAmB,MAAM;AAAA,YACzB,kBAAkB,MAAM;AAAA,YACxB,gBAAgB,MAAM;AAAA,YACtB,kBAAkB,MAAM;AAAA,YACxB,oBAAoB,MAAM;AAAA,YAC1B,eAAe,MAAM;AAAA,YACrB,eAAe,MAAM;AAAA,UAAA;;;;;;ACpI9B,MAAA,QAAe;AAAA,EACb,QAAQ,KAAU;AAEhB,QAAI,UAAU,eAAeyB,SAAW;AAAA,EAC1C;AACF;;;;"}
1
+ {"version":3,"file":"fds-vue-core.cjs.js","sources":["../src/components/fds-tree-view/utils.ts","../src/components/fds-tree-view/useTreeState.ts","../src/components/fds-tree-view/TreeNode.vue","../src/composables/useElementFinalSize.ts","../src/components/FdsTreeView.vue","../src/index.ts"],"sourcesContent":["import type { TreeNode } from './types'\n\nconst getTitleFromProperties = (node: TreeNode, titleTemplate?: string) => {\n if (!titleTemplate) {\n return node.title\n }\n\n // Extract all occurrences of content inside ${} in the template string\n const templateVariables = extractTemplateVariables(titleTemplate)\n\n // Replace template variables with actual values\n let result = titleTemplate\n templateVariables.forEach((variable) => {\n const value = getNodePropertyValue(node, variable)\n result = result.replace(`\\${${variable}}`, value)\n })\n\n return result\n}\n\n/**\n * Extract all occurrences of content inside ${} in a string\n * @param template - The template string containing ${} placeholders\n * @returns Array of variable names found in the template\n */\nconst extractTemplateVariables = (template: string): string[] => {\n const regex = /\\$\\{([^}]+)\\}/g\n const matches: string[] = []\n let match\n\n while ((match = regex.exec(template)) !== null) {\n matches.push(match[1])\n }\n\n return matches\n}\n\n/**\n * Get property value from node object\n * @param node - The tree node\n * @param property - The property name to extract\n * @returns The property value as string\n */\nconst getNodePropertyValue = (node: TreeNode, property: string): string => {\n // Handle direct properties\n if (property in node) {\n const value = node[property as keyof TreeNode]\n return value ? String(value) : ''\n }\n\n // Handle nested data properties\n if (node.data && typeof node.data === 'object') {\n const dataValue = (node.data as any)[property]\n if (dataValue !== undefined && dataValue !== null) {\n return String(dataValue)\n }\n }\n\n // Return empty string if property not found\n return ''\n}\n\nexport { getTitleFromProperties }\n","import { computed, reactive, ref, watch } from 'vue'\nimport type { TreeNode, NodeId, TreeNodeArray, TreeNodeItem } from './types'\nimport { getTitleFromProperties } from './utils'\n\ninterface TreeStateOptions {\n expandChildrenOnParentCheck?: boolean\n expandAllChildrenOnParentCheck?: boolean\n showIndeterminateOnlyOnChildrenSelection?: boolean\n searchExpandNodes?: boolean\n titleTemplate?: string\n searchInputTriggerLength?: number\n nodes?: TreeNodeArray\n}\n\nconst useTreeState = (options: TreeStateOptions = {}) => {\n /** Default the trigger length to 1 when not provided */\n const triggerLength = options?.searchInputTriggerLength ?? 1\n /**\n * The set of selected nodes\n */\n const selectedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The array of selected node objects\n */\n const selectedNodeObjects = reactive<TreeNode[]>([])\n /**\n * The set of expanded nodes\n */\n const expandedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The search term for filtering nodes\n */\n const searchTerm = ref<string>('')\n\n /**\n * If no results are found for the search term\n */\n const isEmptySearchResult = ref<boolean>(false)\n\n // Watch for search term changes to update empty result flag\n watch(searchTerm, (newTerm) => {\n if (!newTerm.trim() || newTerm.length < triggerLength) {\n isEmptySearchResult.value = false\n } else if (options.nodes && options.nodes.length > 0) {\n // Check if there are any results for the new search term\n // The tree structure has a root node with children, so we need to check the root's children\n const rootNode = options.nodes[0]\n const nodesToCheck = rootNode?.children || []\n const filtered = filterNodesRecursive(nodesToCheck, newTerm, ['title', 'nodeId'])\n isEmptySearchResult.value = filtered.length === 0\n }\n })\n\n /**\n * Clears all selected nodes. Can be used to reset the selections to the initial state.\n */\n const clearAllSelectedNodes = () => {\n selectedNodes.clear()\n selectedNodeObjects.length = 0\n }\n\n /**\n * Collapses all expanded nodes. Can be used to reset the tree to the initial state.\n */\n const collapseAllExpandedNodes = () => expandedNodes.clear()\n\n /**\n * Returns true if the node is selected\n */\n const isNodeSelected = (nodeId: NodeId) => selectedNodes.has(nodeId)\n\n /**\n * Returns true if the node is expanded\n */\n const isNodeExpanded = (nodeId: NodeId) => expandedNodes.has(nodeId)\n\n /**\n * Expands the specific node\n */\n const expandNode = (nodeId: NodeId) => expandedNodes.add(nodeId)\n\n /**\n * Collapses the specific node\n */\n const collapseNode = (nodeId: NodeId) => expandedNodes.delete(nodeId)\n\n /**\n * Selects the specific node and adds it to the selectedNodeObjects array.\n * Used to access the node object and it's underlying data\n */\n const injectNode = (nodeObject: TreeNode) => {\n // Prevent duplicates\n if (selectedNodes.has(nodeObject.nodeId)) return\n\n selectedNodes.add(nodeObject.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === nodeObject.nodeId)) {\n selectedNodeObjects.push(nodeObject)\n }\n }\n\n /**\n * Expands all children of the specific node\n */\n const expandAllChildren = (node: TreeNode) => {\n expandNode(node.nodeId)\n if (node.children && node.children.length > 0) {\n node.children.forEach(expandAllChildren)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectAllChildren = (node: TreeNode) => {\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n\n // Inject the current node\n injectNode(node)\n\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n\n // Only expand children if the option is enabled\n if (options.expandChildrenOnParentCheck) {\n expandAllChildren(node)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectNodeAndAllChildren = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Select the current node\n injectNode(node)\n\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n }\n\n /**\n * Deselects the specific node\n */\n const deselectNode = (nodeId: NodeId) => {\n selectedNodes.delete(nodeId)\n const index = selectedNodeObjects.findIndex((node) => node.nodeId === nodeId)\n\n if (index > -1) {\n selectedNodeObjects.splice(index, 1)\n }\n }\n\n /**\n * Deselects this node and recursively deselects all children nodes\n */\n const deselectNodeAndAllChildren = (node: TreeNode) => {\n // Remove the current node\n deselectNode(node.nodeId)\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Deselects only the children of the specific node\n */\n const deselectChildrenOnly = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Ensure parent remains selected\n selectedNodes.add(node.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === node.nodeId)) {\n selectedNodeObjects.push(node)\n }\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeById = (nodes: TreeNodeArray, nodeId: string): TreeNodeItem | null => {\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeObjectById = (nodeId: string): TreeNodeItem | null => {\n const nodes = Array.isArray(options.nodes) ? options.nodes : []\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Checks if a node has children\n */\n const hasChildrenNodes = (nodes: TreeNodeArray) => nodes.length > 0\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOrChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return selectedNodes.has(node.nodeId) || isAnyChildSelected(node.children || [])\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentAndAllChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return false\n // Parent must be selected and all children\n return selectedNodes.has(node.nodeId) && isEveryChildSelected(node)\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOnlySelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return !isAnyChildSelected(node.children || []) && selectedNodes.has(node.nodeId)\n }\n\n /**\n * Returns true if ALL children of a node are selected\n */\n const isEveryChildSelected = (node: TreeNode): boolean => {\n if (!node.children || node.children.length === 0) return true\n\n return node.children.every(\n (child) => selectedNodes.has(child.nodeId) && isEveryChildSelected(child),\n )\n }\n\n /**\n * Checks if any child of a node is selected\n */\n const isAnyChildSelected = (nodes: TreeNodeArray): boolean => {\n if (!nodes || nodes.length === 0) return false\n return nodes.some(\n (child) =>\n selectedNodes.has(child.nodeId) || (child.children && isAnyChildSelected(child.children)),\n )\n }\n\n /**\n * Checks if a node is indeterminate (partially selected)\n */\n const isNodeIndeterminate = (nodes: TreeNodeArray, parentNodeId?: string): boolean => {\n if (!hasChildrenNodes(nodes)) return false\n\n // Check each child's state\n const childStates = nodes.map((node) => ({\n isSelected: selectedNodes.has(node.nodeId),\n isIndeterminate:\n node.children && node.children.length > 0\n ? isNodeIndeterminate(node.children, node.nodeId)\n : false,\n }))\n\n const hasSelected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isSelected,\n )\n const hasUnselected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) =>\n !child.isSelected && !child.isIndeterminate,\n )\n const hasIndeterminate = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isIndeterminate,\n )\n\n // If parent is selected, never show indeterminate\n if (parentNodeId && selectedNodes.has(parentNodeId)) return false\n\n // Standard behavior: some selected + some unselected, OR any child is indeterminate\n if (!options.showIndeterminateOnlyOnChildrenSelection) {\n return (hasSelected && hasUnselected) || hasIndeterminate\n }\n\n // Special behavior: any child selected OR any child indeterminate\n return hasSelected || hasIndeterminate\n }\n\n const isNodeIndeterminateById = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n if (!node) return false\n return isNodeIndeterminate(node.children || [], nodeId)\n }\n\n /**\n * Toggles the selection state of the specific node\n */\n const toggleSelectNode = (nodeId: string, title?: string, data?: Record<string, unknown>) => {\n let node = findNodeObjectById(nodeId)\n\n if (!node && nodeId) {\n node = {\n nodeId: nodeId,\n title: title,\n children: [],\n data: data,\n }\n }\n\n if (!node) return\n\n if (selectedNodes.has(nodeId)) {\n deselectNodeAndAllChildren(node)\n } else {\n selectAllChildren(node)\n\n if (\n selectedNodes.has(nodeId) &&\n !expandedNodes.has(nodeId) &&\n options.expandChildrenOnParentCheck\n ) {\n expandNode(nodeId)\n }\n }\n }\n\n /**\n * Toggles the expansion state of the specific node\n */\n const toggleExpandNode = (nodeId: NodeId) => {\n if (isNodeExpanded(nodeId)) {\n collapseNode(nodeId)\n } else {\n expandNode(nodeId)\n }\n }\n\n /**\n * Gets the icons for expanded and collapsed nodes\n */\n const getNodeIcon = (nodeId: NodeId, expandIcon: string, collapseIcon: string) => {\n return isNodeExpanded(nodeId) ? collapseIcon : expandIcon\n }\n\n /**\n * Checks if a node matches the search term by searching through specified properties\n */\n const nodeMatchesSearch = (node: TreeNode, term: string, searchParams?: string[]): boolean => {\n if (!term.trim()) return true\n if (!searchParams || !Array.isArray(searchParams)) return false\n\n const normalizeForSearch = (value: unknown): string => {\n const s = String(value ?? '')\n return s\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n }\n\n const searchLower = normalizeForSearch(term)\n\n const getValueByPath = (obj: unknown, path: string): unknown => {\n if (!obj) return undefined\n // If data is an array, check each element\n if (Array.isArray(obj)) {\n for (const item of obj) {\n const v = getValueByPath(item as Record<string, unknown>, path)\n if (v !== undefined && v !== null) return v\n }\n return undefined\n }\n if (typeof obj !== 'object') return undefined\n const segments = path.split('.')\n let current: unknown = obj as Record<string, unknown>\n for (const seg of segments) {\n if (current && typeof current === 'object' && seg in (current as Record<string, unknown>)) {\n current = (current as Record<string, unknown>)[seg]\n } else {\n return undefined\n }\n }\n return current\n }\n\n for (const rawParam of searchParams) {\n const param = rawParam.startsWith('data.') ? rawParam.slice(5) : rawParam\n if (param === 'title') {\n const renderedTitle = getTitleFromProperties(node, options?.titleTemplate)\n const titleToMatch = normalizeForSearch(renderedTitle || node.title)\n if (titleToMatch.includes(searchLower)) return true\n }\n if (param === 'nodeId' && normalizeForSearch(node.nodeId).includes(searchLower)) return true\n\n const dataSource = node.data as unknown\n if (Array.isArray(dataSource)) {\n for (const item of dataSource) {\n const v = getValueByPath(item, param)\n if (v !== undefined && v !== null) {\n try {\n if (normalizeForSearch(v).includes(searchLower)) return true\n } catch {}\n }\n }\n } else {\n const value = getValueByPath(dataSource, param)\n if (value !== undefined && value !== null) {\n try {\n if (normalizeForSearch(value).includes(searchLower)) return true\n } catch {}\n }\n }\n }\n\n return false\n }\n\n /**\n * Internal recursive filtering function\n */\n const filterNodesRecursive = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): TreeNodeArray => {\n if (!term.trim()) return nodes\n\n const filtered: TreeNodeArray = []\n\n for (const node of nodes) {\n const nodeMatches = nodeMatchesSearch(node, term, searchParams)\n const filteredChildren = node.children\n ? filterNodesRecursive(node.children, term, searchParams)\n : []\n\n // Include node if it matches OR has matching children\n if (nodeMatches || filteredChildren.length > 0) {\n filtered.push({\n ...node,\n children: filteredChildren.length > 0 ? filteredChildren : node.children,\n })\n }\n }\n\n return filtered\n }\n\n /**\n * Counts how many nodes match the search term across the provided subtree.\n */\n const countMatchingNodesRecursive = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): number => {\n if (!Array.isArray(nodes) || nodes.length === 0) return 0\n if (!term.trim()) return nodes.length\n\n let count = 0\n for (const node of nodes) {\n if (nodeMatchesSearch(node, term, searchParams)) count += 1\n if (node.children && node.children.length > 0) {\n count += countMatchingNodesRecursive(node.children, term, searchParams)\n }\n }\n return count\n }\n\n /**\n * Counts all nodes in the provided subtree.\n */\n const countAllNodesRecursive = (nodes: TreeNodeArray): number => {\n if (!Array.isArray(nodes) || nodes.length === 0) return 0\n let count = 0\n for (const node of nodes) {\n count += 1\n if (node.children && node.children.length > 0) {\n count += countAllNodesRecursive(node.children)\n }\n }\n return count\n }\n\n /**\n * Filters nodes based on search term, including children that match\n */\n const filterNodes = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): TreeNodeArray => {\n if (!term.trim() || term.length < triggerLength) {\n return nodes\n }\n\n const filtered = filterNodesRecursive(nodes, term, searchParams)\n\n return filtered\n }\n\n /**\n * Sets the search term\n */\n const setSearchTerm = (term: string) => {\n searchTerm.value = term\n if (!term.trim() || term.length < triggerLength) {\n isEmptySearchResult.value = false\n }\n }\n\n /**\n * Clears the search term\n */\n const clearSearch = () => {\n searchTerm.value = ''\n isEmptySearchResult.value = false\n }\n\n /**\n * Reactive total count of nodes matching the current search term.\n * If there is no term, returns total nodes under the root's children.\n */\n const filteredMatchCount = computed<number>(() => {\n const t = String(searchTerm.value || '').trim()\n const rootNode =\n Array.isArray(options.nodes) && options.nodes.length > 0 ? options.nodes[0] : null\n const nodesToCheck = rootNode?.children || []\n if (!rootNode) return 0\n if (!t || t.length < triggerLength) {\n return countAllNodesRecursive(nodesToCheck)\n }\n return countMatchingNodesRecursive(nodesToCheck, t, ['title', 'nodeId'])\n })\n\n /**\n * Reactive total node count under the root's children.\n */\n const totalNodeCount = computed<number>(() => {\n const rootNode =\n Array.isArray(options.nodes) && options.nodes.length > 0 ? options.nodes[0] : null\n const nodesToCheck = rootNode?.children || []\n if (!rootNode) return 0\n return countAllNodesRecursive(nodesToCheck)\n })\n\n /**\n * Returns HTML string with hits from search term wrapped in <strong>.\n */\n const highlightText = (text: string | undefined, term: string | undefined): string => {\n const source = String(text ?? '')\n const t = String(term ?? '').trim()\n if (!t) return source\n try {\n const re = new RegExp(t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'ig')\n return source.replace(re, '<strong>$&</strong>')\n } catch {\n return source\n }\n }\n\n return {\n triggerLength,\n clearSearch,\n collapseAllExpandedNodes,\n collapseNode,\n deselectNodeAndAllChildren,\n deselectChildrenOnly,\n deselectNode,\n expandAllChildren,\n expandedNodes,\n expandNode,\n filterNodes,\n getNodeIcon,\n injectNode,\n isNodeExpanded,\n isNodeIndeterminate,\n isNodeIndeterminateById,\n isNodeSelected,\n isParentOrChildrenSelected,\n isParentAndAllChildrenSelected,\n highlightText,\n searchTerm,\n filteredMatchCount,\n totalNodeCount,\n selectAllChildren,\n selectedNodeObjects,\n selectedNodes,\n setSearchTerm,\n toggleExpandNode,\n toggleSelectNode,\n isParentOnlySelected,\n selectNodeAndAllChildren,\n clearAllSelectedNodes,\n isEmptySearchResult,\n }\n}\n\nexport default useTreeState\n","<script setup lang=\"ts\">\nimport { computed, inject, reactive, ref, watch } from 'vue'\nimport type { TreeViewProps } from './types'\nimport useTreeState from './useTreeState'\nimport { getTitleFromProperties } from './utils'\n\ntype Props<T = Record<string, unknown>> = TreeViewProps<T>\n\nconst props = withDefaults(defineProps<Props>(), {\n nodes: () => [],\n depth: 0,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n searchHighlighting: false,\n})\n\ndefineOptions({\n name: 'TreeNode',\n})\n\nconst injectedTreeState = inject<ReturnType<typeof useTreeState> | null>('treeState', null)\nconst treeState = injectedTreeState!\nconst expandedNodes = treeState?.expandedNodes ?? reactive(new Set())\n\nconst indentValue = props.depth * props.indentation\n\nconst indent = computed(() => ({\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n paddingLeft: `${indentValue}px`,\n}))\n\nconst hasChildrenNodes = computed(() => {\n const nodesToCheck =\n props.searchEnabled && treeState?.searchTerm?.value ? filteredNodes.value : props.nodes\n return Array.isArray(nodesToCheck) && nodesToCheck.length > 0\n})\n\nconst filteredNodes = computed(() => {\n const t = String(treeState?.searchTerm?.value || '').trim()\n if (!props.searchEnabled || !t || t.length < (treeState?.triggerLength ?? 1)) {\n return props.nodes\n }\n return treeState.filterNodes(props.nodes, t, props.searchMatchParams)\n})\n\n// Auto-expand current node if search is active and it has matching children\nwatch(\n () => ({\n enabled: props.searchEnabled,\n expandOnSearch: props.searchExpandNodes,\n term: treeState?.searchTerm?.value,\n count: (filteredNodes.value || []).length,\n }),\n ({ enabled, expandOnSearch, term, count }) => {\n if (!enabled || !expandOnSearch) return\n const t = String(term || '').trim()\n if (!t || t.length < (treeState?.triggerLength ?? 1)) return\n if (typeof count === 'number' && count > 0) {\n expandedNodes.add(props.nodeId)\n }\n },\n)\n\nconst isOpen = ref(false)\nconst triggerRef = ref<HTMLElement | null>(null)\nconst popoverPanelRef = ref<HTMLElement | null>(null)\nconst popoverCoords = reactive({ bottom: 0, right: 0, left: 0, top: 0 })\n\nconst popoverWidth = 327\nconst popoverHeight = 80\n\nconst computePopoverCoords = () => {\n const triggerEl = triggerRef.value\n if (!triggerEl) return\n const rect = triggerEl.getBoundingClientRect()\n popoverCoords.bottom = Math.round(rect.bottom)\n popoverCoords.right = Math.round(rect.right)\n popoverCoords.left = Math.round(rect.left)\n popoverCoords.top = Math.round(rect.top)\n}\n\nconst openPopover = () => {\n computePopoverCoords()\n isOpen.value = true\n window.addEventListener('scroll', computePopoverCoords, true)\n window.addEventListener('resize', computePopoverCoords)\n document.addEventListener('pointerdown', handleGlobalPointerDown, { passive: true })\n document.addEventListener('keydown', handleGlobalKeydown)\n}\n\nconst closePopover = () => {\n isOpen.value = false\n window.removeEventListener('scroll', computePopoverCoords, true)\n window.removeEventListener('resize', computePopoverCoords)\n document.removeEventListener('pointerdown', handleGlobalPointerDown)\n document.removeEventListener('keydown', handleGlobalKeydown)\n}\n\nconst togglePopover = () => {\n if (isOpen.value) closePopover()\n else openPopover()\n}\n\nconst handleGlobalPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return\n\n const hasComposedPath = (ev: Event): ev is Event & { composedPath: () => EventTarget[] } =>\n typeof (ev as { composedPath?: () => EventTarget[] }).composedPath === 'function'\n\n const clickedPath = hasComposedPath(event) ? event.composedPath() : ([] as EventTarget[])\n const contains = (el: HTMLElement | null) => (el ? clickedPath.includes(el) : false)\n if (!contains(triggerRef.value) && !contains(popoverPanelRef.value)) {\n closePopover()\n }\n}\n\nconst handleGlobalKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen.value) {\n closePopover()\n }\n}\n\nconst options = [\n { label: props.popoverLabels?.parentAndChildren, value: 'parent_and_children' },\n { label: props.popoverLabels?.parent, value: 'parent' },\n]\n\nconst currentOption = computed(() => {\n if (treeState?.isParentAndAllChildrenSelected(props.nodeId)) return 'parent_and_children'\n if (treeState?.isParentOnlySelected(props.nodeId)) return 'parent'\n return ''\n})\n\nconst handleOptionClick = (option: (typeof options)[number]['value']) => {\n if (option === 'parent_and_children') {\n treeState?.selectNodeAndAllChildren(props.nodeId)\n } else if (option === 'parent') {\n treeState?.deselectChildrenOnly(props.nodeId)\n }\n isOpen.value = false\n}\n</script>\n\n<template>\n <div :class=\"props?.style?.container\">\n <div :style=\"indent\" :class=\"{'mb-3': depth >= 0}\">\n <div class=\"flex\">\n <fds-icon\n v-if=\"hasChildrenNodes\"\n @click=\"treeState?.toggleExpandNode(props.nodeId)\"\n :name=\"\n treeState?.getNodeIcon(props.nodeId, props.nodeExpandIcon, props.nodeCollapseIcon) ??\n props.nodeExpandIcon\n \"\n size=\"24px\"\n class=\"text-blue-500 mr-3\"\n style=\"margin-top: 3px\"\n />\n <div v-if=\"!hasChildrenNodes\" :style=\"{ minWidth: `${indentation}px` }\" />\n\n <fds-checkbox class=\"pl-0 flex-1 flex items-center\">\n <input\n :id=\"`checkbox-${props.nodeId}`\"\n style=\"margin: 0px; margin-top: 3px\"\n type=\"checkbox\"\n :checked=\"treeState?.isNodeSelected(props.nodeId)\"\n :indeterminate=\"\n showIndeterminate && (treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n @change=\"treeState?.toggleSelectNode(props.nodeId, props.title, props.data)\"\n />\n <label :for=\"`checkbox-${props.nodeId}`\" class=\"flex flex-col pl-0\">\n <div>\n <template v-if=\"title\">\n <fds-text\n v-if=\"\n searchHighlighting &&\n searchEnabled &&\n treeState?.searchTerm?.value &&\n String(treeState?.searchTerm?.value || '').trim().length >=\n (treeState?.triggerLength ?? 1)\n \"\n type=\"default\"\n >\n <span v-html=\"treeState?.highlightText(title, treeState?.searchTerm?.value)\" />\n </fds-text>\n <fds-text v-else type=\"default\">{{ title }}</fds-text>\n </template>\n <span v-if=\"showChildrenCount && hasChildrenNodes\">\n (+{{\n searchEnabled &&\n treeState?.searchTerm?.value &&\n String(treeState?.searchTerm?.value || '').trim().length >=\n (treeState?.triggerLength ?? 1)\n ? filteredNodes?.length || 0\n : props.nodes.length\n }})\n </span>\n </div>\n </label>\n </fds-checkbox>\n <div\n style=\"max-height: 28px\"\n v-if=\"\n treeState?.isParentOrChildrenSelected(props.nodeId) &&\n !(treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n >\n <fds-icon-button\n ref=\"triggerRef\"\n icon=\"more\"\n size=\"24px\"\n color=\"blue\"\n @click=\"togglePopover\"\n />\n <teleport to=\"body\">\n <div\n v-if=\"isOpen\"\n class=\"fixed z-[9999]\"\n :style=\"{\n top: popoverCoords.top + 'px',\n left:\n popoverCoords.right -\n popoverWidth -\n (popoverCoords.right - popoverCoords.left) +\n 'px',\n }\"\n >\n <div\n ref=\"popoverPanelRef\"\n class=\"bg-white rounded-md p-6 shadow-lg flex flex-col gap-3\"\n :style=\"{\n width: popoverWidth + 'px',\n minHeight: popoverHeight + 'px',\n }\"\n @click.stop\n >\n <div\n v-for=\"option in options\"\n :key=\"option.value\"\n class=\"flex align-center gap-2 justify-between cursor-pointer\"\n @click=\"handleOptionClick(option.value)\"\n >\n <fds-text>{{ option.label }}</fds-text>\n <fds-icon\n name=\"checkmark\"\n size=\"24px\"\n class=\"text-blue-500\"\n v-if=\"currentOption === option.value\"\n />\n </div>\n </div>\n </div>\n </teleport>\n </div>\n </div>\n </div>\n\n <div v-if=\"expandedNodes.has(props.nodeId)\">\n <TreeNode\n v-for=\"child in filteredNodes\"\n :key=\"child.nodeId\"\n :nodes=\"child.children || []\"\n :title=\"getTitleFromProperties(child, props.titleTemplate)\"\n :nodeId=\"child.nodeId\"\n :data=\"child.data\"\n :depth=\"props.depth + 1\"\n :indentation=\"props.indentation\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :showNodeDescription=\"showNodeDescription\"\n :showChildrenCount=\"showChildrenCount\"\n :expandChildrenOnSelect=\"expandChildrenOnSelect\"\n :showIndeterminate=\"showIndeterminate\"\n :showIndeterminateOnlyOnChildrenSelection=\"showIndeterminateOnlyOnChildrenSelection\"\n :expandChildrenOnParentCheck=\"expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"expandAllChildrenOnParentCheck\"\n :searchEnabled=\"searchEnabled\"\n :searchExpandNodes=\"searchExpandNodes\"\n :searchMatchParams=\"searchMatchParams\"\n :searchHighlighting=\"searchHighlighting\"\n :titleTemplate=\"props.titleTemplate\"\n :popoverLabels=\"props.popoverLabels\"\n />\n </div>\n </div>\n</template>\n","import { watchEffect, type Ref } from 'vue'\n\nexport function useElementFinalSize(\n elementRef: Ref<HTMLElement | null>,\n onFinalSize: (height: number) => void,\n delay = 100\n) {\n watchEffect((onCleanup) => {\n const element = elementRef.value\n if (!element) return\n\n // Wait for next frame after a short delay, then measure\n const timeoutId = setTimeout(() => {\n requestAnimationFrame(() => {\n const height = element.getBoundingClientRect().height\n if (height > 0) {\n onFinalSize(height)\n }\n })\n }, delay)\n\n onCleanup(() => clearTimeout(timeoutId))\n })\n}\n","<script setup lang=\"ts\">\nimport { computed, provide, ref, watch } from 'vue'\nimport useTreeState from './fds-tree-view/useTreeState'\nimport TreeNode from './fds-tree-view/TreeNode.vue'\nimport type { TreeNode as TreeNodeType, TreeViewProps } from './fds-tree-view/types'\nimport { getTitleFromProperties } from './fds-tree-view/utils'\nimport { useElementFinalSize } from '../composables/useElementFinalSize'\n\ntype NodeShape = Pick<TreeNodeType, 'nodeId' | 'title' | 'data' | 'children'>\n\ntype WrapperProps<T = Record<string, unknown>> = Omit<\n TreeViewProps<T>,\n 'nodes' | 'depth' | 'data' | 'nodeId' | 'title'\n> & {\n data: TreeNodeType<T>\n selected?: NodeShape[]\n}\n\nconst props = withDefaults(defineProps<WrapperProps<Record<string, unknown>>>(), {\n indentation: 36,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n titleTemplate: '${title}',\n})\n\nconst emit = defineEmits<{\n (e: 'update:selectedNodes', value: NodeShape[]): void\n (e: 'getSearchContainerHeight', value: number): void\n}>()\n\nconst rootNode = props.data\nconst nodesForState = rootNode ? [rootNode] : []\n\nconst treeState = useTreeState({\n expandChildrenOnParentCheck: props.expandChildrenOnParentCheck,\n expandAllChildrenOnParentCheck: props.expandAllChildrenOnParentCheck,\n showIndeterminateOnlyOnChildrenSelection: props.showIndeterminateOnlyOnChildrenSelection,\n searchExpandNodes: props.searchExpandNodes,\n titleTemplate: props.titleTemplate,\n nodes: nodesForState,\n searchInputTriggerLength: props.searchInputTriggerLength,\n})\nprovide('treeState', treeState)\n\nconst pruneNode = (node: TreeNodeType): NodeShape => ({\n nodeId: node.nodeId,\n title: node.title,\n data: node.data,\n children: Array.isArray(node.children) ? node.children.map(pruneNode) : undefined,\n})\n\nconst selectedNodeObjects = computed<NodeShape[]>(() =>\n treeState.selectedNodeObjects.map(pruneNode),\n)\n\nconst searchContainerRef = ref<HTMLElement | null>(null)\n\nuseElementFinalSize(searchContainerRef, (height) => {\n emit('getSearchContainerHeight', height)\n})\n\ndefineExpose({\n selectedNodeObjects,\n selectedNodes: treeState.selectedNodes,\n getSearchContainerHeight: () => {\n return searchContainerRef.value?.getBoundingClientRect().height\n },\n})\n\nwatch(\n () => treeState.selectedNodeObjects,\n () => {\n emit('update:selectedNodes', selectedNodeObjects.value)\n },\n { deep: true },\n)\n</script>\n\n<template>\n <div>\n <div v-if=\"props.searchEnabled\" ref=\"searchContainerRef\" class=\"mb-4\">\n <fds-input\n :value=\"treeState?.searchTerm || ''\"\n @input=\"treeState?.setSearchTerm($event.target.value)\"\n class=\"w-full\"\n :label=\"props.searchLabel\"\n clear-button\n @clearInput=\"treeState?.clearSearch()\"\n >\n <input id=\"tree-view-search-input\" />\n </fds-input>\n <div v-if=\"props.searchCountTemplate || props.searchCountTemplateUnfiltered\" class=\"mt-1\">\n <h3\n v-if=\"\n props.searchCountTemplate &&\n treeState?.searchTerm?.value &&\n String(treeState?.searchTerm?.value || '').trim().length >=\n (treeState?.triggerLength ?? 1)\n \"\n >\n {{\n props.searchCountTemplate\n .replace('${filteredNodes}', treeState?.filteredMatchCount.value.toString())\n .replace('${totalNodes}', treeState?.totalNodeCount.value.toString())\n }}\n </h3>\n <h3 v-else>\n {{\n props.searchCountTemplateUnfiltered?.replace(\n '${totalNodes}',\n treeState?.totalNodeCount.value.toString(),\n )\n }}\n </h3>\n </div>\n </div>\n\n <fds-content-block\n v-if=\"treeState?.isEmptySearchResult?.value\"\n variant=\"secondary\"\n icon=\"information\"\n class=\"mt-4\"\n >\n <div slot=\"header\">{{ props.searchResultNoMatchesTitle }}</div>\n <fds-text>{{ props.searchResultNoMatchesBody }}</fds-text>\n </fds-content-block>\n\n <div :class=\"{ 'overflow-x-auto bg-white-solid': props.horizontalScroll }\">\n <TreeNode\n v-if=\"props.data && !treeState?.isEmptySearchResult?.value\"\n :style=\"{ container: 'bg-white-solid p-2 rounded-md' }\"\n :nodes=\"props.data.children || []\"\n :title=\"getTitleFromProperties(props.data, props.titleTemplate)\"\n :nodeId=\"props.data.nodeId\"\n :data=\"props.data.data\"\n :indentation=\"props.indentation\"\n :showNodeDescription=\"props.showNodeDescription\"\n :showChildrenCount=\"props.showChildrenCount\"\n :expandChildrenOnSelect=\"props.expandChildrenOnSelect\"\n :showIndeterminate=\"props.showIndeterminate\"\n :expandChildrenOnParentCheck=\"props.expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"props.expandAllChildrenOnParentCheck\"\n :showIndeterminateOnlyOnChildrenSelection=\"props.showIndeterminateOnlyOnChildrenSelection\"\n :searchEnabled=\"props.searchEnabled\"\n :searchLabel=\"props.searchLabel\"\n :searchExpandNodes=\"props.searchExpandNodes\"\n :searchMatchParams=\"props.searchMatchParams\"\n :horizontalScroll=\"props.horizontalScroll\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :searchHighlighting=\"props.searchHighlighting\"\n :titleTemplate=\"props.titleTemplate\"\n :popoverLabels=\"props.popoverLabels\"\n />\n </div>\n </div>\n</template>\n","import type { App } from 'vue'\n\n// Import styles\nimport './style.css'\n\n// Import all components\nimport FdsTreeView from './components/FdsTreeView.vue'\n\n// Import composables\nimport useTreeState from './components/fds-tree-view/useTreeState'\n\n// Export individual components\nexport { FdsTreeView }\n\n// Export composables\nexport { useTreeState }\n\n// Export component library plugin\nexport default {\n install(app: App) {\n // Register all components globally\n app.component('FdsTreeView', FdsTreeView)\n },\n}\n\nexport type {\n TreeNode,\n TreeNodeArray,\n TreeNodeItem,\n TreeViewProps,\n NodeId,\n} from './components/fds-tree-view/types'\n\nimport type { TreeViewProps } from './components/fds-tree-view/types'\nexport type FdsTreeViewProps<T = Record<string, unknown>> = TreeViewProps<T>\n"],"names":["reactive","ref","watch","index","computed","inject","_createElementBlock","_normalizeClass","_createElementVNode","depth","_hoisted_1","_unref","indentation","_hoisted_3","showIndeterminate","title","_Fragment","searchHighlighting","searchEnabled","_openBlock","_hoisted_6","_toDisplayString","showChildrenCount","_createBlock","_Teleport","_normalizeStyle","_renderList","showNodeDescription","expandChildrenOnSelect","showIndeterminateOnlyOnChildrenSelection","expandChildrenOnParentCheck","expandAllChildrenOnParentCheck","searchExpandNodes","searchMatchParams","watchEffect","provide","TreeNode","FdsTreeView"],"mappings":"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"}
@@ -536,6 +536,10 @@
536
536
  margin-right: calc(var(--spacing) * 3);
537
537
  }
538
538
 
539
+ .mb-3 {
540
+ margin-bottom: calc(var(--spacing) * 3);
541
+ }
542
+
539
543
  .mb-4 {
540
544
  margin-bottom: calc(var(--spacing) * 4);
541
545
  }
@@ -633,10 +637,6 @@
633
637
  padding: calc(var(--spacing) * 8);
634
638
  }
635
639
 
636
- .pb-3 {
637
- padding-bottom: calc(var(--spacing) * 3);
638
- }
639
-
640
640
  .pl-0 {
641
641
  padding-left: calc(var(--spacing) * 0);
642
642
  }
@@ -1,4 +1,4 @@
1
- import { reactive, ref, watch, computed, defineComponent, inject, resolveComponent, createElementBlock, openBlock, normalizeClass, createElementVNode, createCommentVNode, normalizeStyle, unref, Fragment, toDisplayString, createBlock, Teleport, withModifiers, renderList, provide } from "vue";
1
+ import { reactive, ref, watch, computed, defineComponent, inject, resolveComponent, createElementBlock, openBlock, normalizeClass, createElementVNode, createCommentVNode, normalizeStyle, unref, Fragment, toDisplayString, createBlock, Teleport, withModifiers, renderList, watchEffect, provide } from "vue";
2
2
  const getTitleFromProperties = (node, titleTemplate) => {
3
3
  if (!titleTemplate) {
4
4
  return node.title;
@@ -412,7 +412,7 @@ const _hoisted_6$1 = {
412
412
  key: 0,
413
413
  type: "default"
414
414
  };
415
- const _hoisted_7$1 = ["innerHTML"];
415
+ const _hoisted_7 = ["innerHTML"];
416
416
  const _hoisted_8 = {
417
417
  key: 1,
418
418
  type: "default"
@@ -466,7 +466,8 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
466
466
  searchResultNoMatchesBody: {},
467
467
  searchCountTemplate: {},
468
468
  searchCountTemplateUnfiltered: {},
469
- titleTemplate: {}
469
+ titleTemplate: {},
470
+ getSearchContainerHeight: {}
470
471
  },
471
472
  setup(__props) {
472
473
  const props = __props;
@@ -576,7 +577,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
576
577
  }, [
577
578
  createElementVNode("div", {
578
579
  style: normalizeStyle(indent.value),
579
- class: normalizeClass({ "pb-3": _ctx.depth >= 0 })
580
+ class: normalizeClass({ "mb-3": _ctx.depth >= 0 })
580
581
  }, [
581
582
  createElementVNode("div", _hoisted_1$1, [
582
583
  hasChildrenNodes.value ? (openBlock(), createElementBlock("fds-icon", {
@@ -609,7 +610,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
609
610
  _ctx.searchHighlighting && _ctx.searchEnabled && unref(treeState)?.searchTerm?.value && String(unref(treeState)?.searchTerm?.value || "").trim().length >= (unref(treeState)?.triggerLength ?? 1) ? (openBlock(), createElementBlock("fds-text", _hoisted_6$1, [
610
611
  createElementVNode("span", {
611
612
  innerHTML: unref(treeState)?.highlightText(_ctx.title, unref(treeState)?.searchTerm?.value)
612
- }, null, 8, _hoisted_7$1)
613
+ }, null, 8, _hoisted_7)
613
614
  ])) : (openBlock(), createElementBlock("fds-text", _hoisted_8, toDisplayString(_ctx.title), 1))
614
615
  ], 64)) : createCommentVNode("", true),
615
616
  _ctx.showChildrenCount && hasChildrenNodes.value ? (openBlock(), createElementBlock("span", _hoisted_9, " (+" + toDisplayString(_ctx.searchEnabled && unref(treeState)?.searchTerm?.value && String(unref(treeState)?.searchTerm?.value || "").trim().length >= (unref(treeState)?.triggerLength ?? 1) ? filteredNodes.value?.length || 0 : props.nodes.length) + ") ", 1)) : createCommentVNode("", true)
@@ -693,24 +694,35 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
693
694
  };
694
695
  }
695
696
  });
696
- const _hoisted_1 = {
697
- key: 0,
698
- class: "mb-4"
699
- };
700
- const _hoisted_2 = ["value", "label"];
701
- const _hoisted_3 = {
697
+ function useElementFinalSize(elementRef, onFinalSize, delay = 100) {
698
+ watchEffect((onCleanup) => {
699
+ const element = elementRef.value;
700
+ if (!element) return;
701
+ const timeoutId = setTimeout(() => {
702
+ requestAnimationFrame(() => {
703
+ const height = element.getBoundingClientRect().height;
704
+ if (height > 0) {
705
+ onFinalSize(height);
706
+ }
707
+ });
708
+ }, delay);
709
+ onCleanup(() => clearTimeout(timeoutId));
710
+ });
711
+ }
712
+ const _hoisted_1 = ["value", "label"];
713
+ const _hoisted_2 = {
702
714
  key: 0,
703
715
  class: "mt-1"
704
716
  };
705
- const _hoisted_4 = { key: 0 };
706
- const _hoisted_5 = { key: 1 };
707
- const _hoisted_6 = {
717
+ const _hoisted_3 = { key: 0 };
718
+ const _hoisted_4 = { key: 1 };
719
+ const _hoisted_5 = {
708
720
  key: 1,
709
721
  variant: "secondary",
710
722
  icon: "information",
711
723
  class: "mt-4"
712
724
  };
713
- const _hoisted_7 = { slot: "header" };
725
+ const _hoisted_6 = { slot: "header" };
714
726
  const _sfc_main = /* @__PURE__ */ defineComponent({
715
727
  __name: "FdsTreeView",
716
728
  props: {
@@ -738,10 +750,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
738
750
  searchCountTemplate: {},
739
751
  searchCountTemplateUnfiltered: {},
740
752
  titleTemplate: { default: "${title}" },
753
+ getSearchContainerHeight: {},
741
754
  data: {},
742
755
  selected: {}
743
756
  },
744
- emits: ["update:selectedNodes"],
757
+ emits: ["update:selectedNodes", "getSearchContainerHeight"],
745
758
  setup(__props, { expose: __expose, emit: __emit }) {
746
759
  const props = __props;
747
760
  const emit = __emit;
@@ -766,9 +779,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
766
779
  const selectedNodeObjects = computed(
767
780
  () => treeState.selectedNodeObjects.map(pruneNode)
768
781
  );
782
+ const searchContainerRef = ref(null);
783
+ useElementFinalSize(searchContainerRef, (height) => {
784
+ emit("getSearchContainerHeight", height);
785
+ });
769
786
  __expose({
770
787
  selectedNodeObjects,
771
- selectedNodes: treeState.selectedNodes
788
+ selectedNodes: treeState.selectedNodes,
789
+ getSearchContainerHeight: () => {
790
+ return searchContainerRef.value?.getBoundingClientRect().height;
791
+ }
772
792
  });
773
793
  watch(
774
794
  () => treeState.selectedNodeObjects,
@@ -779,7 +799,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
779
799
  );
780
800
  return (_ctx, _cache) => {
781
801
  return openBlock(), createElementBlock("div", null, [
782
- props.searchEnabled ? (openBlock(), createElementBlock("div", _hoisted_1, [
802
+ props.searchEnabled ? (openBlock(), createElementBlock("div", {
803
+ key: 0,
804
+ ref_key: "searchContainerRef",
805
+ ref: searchContainerRef,
806
+ class: "mb-4"
807
+ }, [
783
808
  createElementVNode("fds-input", {
784
809
  value: unref(treeState)?.searchTerm || "",
785
810
  onInput: _cache[0] || (_cache[0] = ($event) => unref(treeState)?.setSearchTerm($event.target.value)),
@@ -789,20 +814,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
789
814
  "on:clearInput": _cache[1] || (_cache[1] = ($event) => unref(treeState)?.clearSearch())
790
815
  }, [..._cache[2] || (_cache[2] = [
791
816
  createElementVNode("input", { id: "tree-view-search-input" }, null, -1)
792
- ])], 40, _hoisted_2),
793
- props.searchCountTemplate || props.searchCountTemplateUnfiltered ? (openBlock(), createElementBlock("div", _hoisted_3, [
794
- props.searchCountTemplate && unref(treeState)?.searchTerm?.value && String(unref(treeState)?.searchTerm?.value || "").trim().length >= (unref(treeState)?.triggerLength ?? 1) ? (openBlock(), createElementBlock("h3", _hoisted_4, toDisplayString(props.searchCountTemplate.replace("${filteredNodes}", unref(treeState)?.filteredMatchCount.value.toString()).replace("${totalNodes}", unref(treeState)?.totalNodeCount.value.toString())), 1)) : (openBlock(), createElementBlock("h3", _hoisted_5, toDisplayString(props.searchCountTemplateUnfiltered?.replace(
817
+ ])], 40, _hoisted_1),
818
+ props.searchCountTemplate || props.searchCountTemplateUnfiltered ? (openBlock(), createElementBlock("div", _hoisted_2, [
819
+ props.searchCountTemplate && unref(treeState)?.searchTerm?.value && String(unref(treeState)?.searchTerm?.value || "").trim().length >= (unref(treeState)?.triggerLength ?? 1) ? (openBlock(), createElementBlock("h3", _hoisted_3, toDisplayString(props.searchCountTemplate.replace("${filteredNodes}", unref(treeState)?.filteredMatchCount.value.toString()).replace("${totalNodes}", unref(treeState)?.totalNodeCount.value.toString())), 1)) : (openBlock(), createElementBlock("h3", _hoisted_4, toDisplayString(props.searchCountTemplateUnfiltered?.replace(
795
820
  "${totalNodes}",
796
821
  unref(treeState)?.totalNodeCount.value.toString()
797
822
  )), 1))
798
823
  ])) : createCommentVNode("", true)
799
- ])) : createCommentVNode("", true),
800
- unref(treeState)?.isEmptySearchResult?.value ? (openBlock(), createElementBlock("fds-content-block", _hoisted_6, [
801
- createElementVNode("div", _hoisted_7, toDisplayString(props.searchResultNoMatchesTitle), 1),
824
+ ], 512)) : createCommentVNode("", true),
825
+ unref(treeState)?.isEmptySearchResult?.value ? (openBlock(), createElementBlock("fds-content-block", _hoisted_5, [
826
+ createElementVNode("div", _hoisted_6, toDisplayString(props.searchResultNoMatchesTitle), 1),
802
827
  createElementVNode("fds-text", null, toDisplayString(props.searchResultNoMatchesBody), 1)
803
828
  ])) : createCommentVNode("", true),
804
829
  createElementVNode("div", {
805
- class: normalizeClass(props.horizontalScroll ? "overflow-x-auto bg-white-solid" : "")
830
+ class: normalizeClass({ "overflow-x-auto bg-white-solid": props.horizontalScroll })
806
831
  }, [
807
832
  props.data && !unref(treeState)?.isEmptySearchResult?.value ? (openBlock(), createBlock(_sfc_main$1, {
808
833
  key: 0,
@@ -1 +1 @@
1
- {"version":3,"file":"fds-vue-core.es.js","sources":["../src/components/fds-tree-view/utils.ts","../src/components/fds-tree-view/useTreeState.ts","../src/components/fds-tree-view/TreeNode.vue","../src/components/FdsTreeView.vue","../src/index.ts"],"sourcesContent":["import type { TreeNode } from './types'\n\nconst getTitleFromProperties = (node: TreeNode, titleTemplate?: string) => {\n if (!titleTemplate) {\n return node.title\n }\n\n // Extract all occurrences of content inside ${} in the template string\n const templateVariables = extractTemplateVariables(titleTemplate)\n\n // Replace template variables with actual values\n let result = titleTemplate\n templateVariables.forEach((variable) => {\n const value = getNodePropertyValue(node, variable)\n result = result.replace(`\\${${variable}}`, value)\n })\n\n return result\n}\n\n/**\n * Extract all occurrences of content inside ${} in a string\n * @param template - The template string containing ${} placeholders\n * @returns Array of variable names found in the template\n */\nconst extractTemplateVariables = (template: string): string[] => {\n const regex = /\\$\\{([^}]+)\\}/g\n const matches: string[] = []\n let match\n\n while ((match = regex.exec(template)) !== null) {\n matches.push(match[1])\n }\n\n return matches\n}\n\n/**\n * Get property value from node object\n * @param node - The tree node\n * @param property - The property name to extract\n * @returns The property value as string\n */\nconst getNodePropertyValue = (node: TreeNode, property: string): string => {\n // Handle direct properties\n if (property in node) {\n const value = node[property as keyof TreeNode]\n return value ? String(value) : ''\n }\n\n // Handle nested data properties\n if (node.data && typeof node.data === 'object') {\n const dataValue = (node.data as any)[property]\n if (dataValue !== undefined && dataValue !== null) {\n return String(dataValue)\n }\n }\n\n // Return empty string if property not found\n return ''\n}\n\nexport { getTitleFromProperties }\n","import { computed, reactive, ref, watch } from 'vue'\nimport type { TreeNode, NodeId, TreeNodeArray, TreeNodeItem } from './types'\nimport { getTitleFromProperties } from './utils'\n\ninterface TreeStateOptions {\n expandChildrenOnParentCheck?: boolean\n expandAllChildrenOnParentCheck?: boolean\n showIndeterminateOnlyOnChildrenSelection?: boolean\n searchExpandNodes?: boolean\n titleTemplate?: string\n searchInputTriggerLength?: number\n nodes?: TreeNodeArray\n}\n\nconst useTreeState = (options: TreeStateOptions = {}) => {\n /** Default the trigger length to 1 when not provided */\n const triggerLength = options?.searchInputTriggerLength ?? 1\n /**\n * The set of selected nodes\n */\n const selectedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The array of selected node objects\n */\n const selectedNodeObjects = reactive<TreeNode[]>([])\n /**\n * The set of expanded nodes\n */\n const expandedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The search term for filtering nodes\n */\n const searchTerm = ref<string>('')\n\n /**\n * If no results are found for the search term\n */\n const isEmptySearchResult = ref<boolean>(false)\n\n // Watch for search term changes to update empty result flag\n watch(searchTerm, (newTerm) => {\n if (!newTerm.trim() || newTerm.length < triggerLength) {\n isEmptySearchResult.value = false\n } else if (options.nodes && options.nodes.length > 0) {\n // Check if there are any results for the new search term\n // The tree structure has a root node with children, so we need to check the root's children\n const rootNode = options.nodes[0]\n const nodesToCheck = rootNode?.children || []\n const filtered = filterNodesRecursive(nodesToCheck, newTerm, ['title', 'nodeId'])\n isEmptySearchResult.value = filtered.length === 0\n }\n })\n\n /**\n * Clears all selected nodes. Can be used to reset the selections to the initial state.\n */\n const clearAllSelectedNodes = () => {\n selectedNodes.clear()\n selectedNodeObjects.length = 0\n }\n\n /**\n * Collapses all expanded nodes. Can be used to reset the tree to the initial state.\n */\n const collapseAllExpandedNodes = () => expandedNodes.clear()\n\n /**\n * Returns true if the node is selected\n */\n const isNodeSelected = (nodeId: NodeId) => selectedNodes.has(nodeId)\n\n /**\n * Returns true if the node is expanded\n */\n const isNodeExpanded = (nodeId: NodeId) => expandedNodes.has(nodeId)\n\n /**\n * Expands the specific node\n */\n const expandNode = (nodeId: NodeId) => expandedNodes.add(nodeId)\n\n /**\n * Collapses the specific node\n */\n const collapseNode = (nodeId: NodeId) => expandedNodes.delete(nodeId)\n\n /**\n * Selects the specific node and adds it to the selectedNodeObjects array.\n * Used to access the node object and it's underlying data\n */\n const injectNode = (nodeObject: TreeNode) => {\n // Prevent duplicates\n if (selectedNodes.has(nodeObject.nodeId)) return\n\n selectedNodes.add(nodeObject.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === nodeObject.nodeId)) {\n selectedNodeObjects.push(nodeObject)\n }\n }\n\n /**\n * Expands all children of the specific node\n */\n const expandAllChildren = (node: TreeNode) => {\n expandNode(node.nodeId)\n if (node.children && node.children.length > 0) {\n node.children.forEach(expandAllChildren)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectAllChildren = (node: TreeNode) => {\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n\n // Inject the current node\n injectNode(node)\n\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n\n // Only expand children if the option is enabled\n if (options.expandChildrenOnParentCheck) {\n expandAllChildren(node)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectNodeAndAllChildren = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Select the current node\n injectNode(node)\n\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n }\n\n /**\n * Deselects the specific node\n */\n const deselectNode = (nodeId: NodeId) => {\n selectedNodes.delete(nodeId)\n const index = selectedNodeObjects.findIndex((node) => node.nodeId === nodeId)\n\n if (index > -1) {\n selectedNodeObjects.splice(index, 1)\n }\n }\n\n /**\n * Deselects this node and recursively deselects all children nodes\n */\n const deselectNodeAndAllChildren = (node: TreeNode) => {\n // Remove the current node\n deselectNode(node.nodeId)\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Deselects only the children of the specific node\n */\n const deselectChildrenOnly = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Ensure parent remains selected\n selectedNodes.add(node.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === node.nodeId)) {\n selectedNodeObjects.push(node)\n }\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeById = (nodes: TreeNodeArray, nodeId: string): TreeNodeItem | null => {\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeObjectById = (nodeId: string): TreeNodeItem | null => {\n const nodes = Array.isArray(options.nodes) ? options.nodes : []\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Checks if a node has children\n */\n const hasChildrenNodes = (nodes: TreeNodeArray) => nodes.length > 0\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOrChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return selectedNodes.has(node.nodeId) || isAnyChildSelected(node.children || [])\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentAndAllChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return false\n // Parent must be selected and all children\n return selectedNodes.has(node.nodeId) && isEveryChildSelected(node)\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOnlySelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return !isAnyChildSelected(node.children || []) && selectedNodes.has(node.nodeId)\n }\n\n /**\n * Returns true if ALL children of a node are selected\n */\n const isEveryChildSelected = (node: TreeNode): boolean => {\n if (!node.children || node.children.length === 0) return true\n\n return node.children.every(\n (child) => selectedNodes.has(child.nodeId) && isEveryChildSelected(child),\n )\n }\n\n /**\n * Checks if any child of a node is selected\n */\n const isAnyChildSelected = (nodes: TreeNodeArray): boolean => {\n if (!nodes || nodes.length === 0) return false\n return nodes.some(\n (child) =>\n selectedNodes.has(child.nodeId) || (child.children && isAnyChildSelected(child.children)),\n )\n }\n\n /**\n * Checks if a node is indeterminate (partially selected)\n */\n const isNodeIndeterminate = (nodes: TreeNodeArray, parentNodeId?: string): boolean => {\n if (!hasChildrenNodes(nodes)) return false\n\n // Check each child's state\n const childStates = nodes.map((node) => ({\n isSelected: selectedNodes.has(node.nodeId),\n isIndeterminate:\n node.children && node.children.length > 0\n ? isNodeIndeterminate(node.children, node.nodeId)\n : false,\n }))\n\n const hasSelected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isSelected,\n )\n const hasUnselected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) =>\n !child.isSelected && !child.isIndeterminate,\n )\n const hasIndeterminate = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isIndeterminate,\n )\n\n // If parent is selected, never show indeterminate\n if (parentNodeId && selectedNodes.has(parentNodeId)) return false\n\n // Standard behavior: some selected + some unselected, OR any child is indeterminate\n if (!options.showIndeterminateOnlyOnChildrenSelection) {\n return (hasSelected && hasUnselected) || hasIndeterminate\n }\n\n // Special behavior: any child selected OR any child indeterminate\n return hasSelected || hasIndeterminate\n }\n\n const isNodeIndeterminateById = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n if (!node) return false\n return isNodeIndeterminate(node.children || [], nodeId)\n }\n\n /**\n * Toggles the selection state of the specific node\n */\n const toggleSelectNode = (nodeId: string, title?: string, data?: Record<string, unknown>) => {\n let node = findNodeObjectById(nodeId)\n\n if (!node && nodeId) {\n node = {\n nodeId: nodeId,\n title: title,\n children: [],\n data: data,\n }\n }\n\n if (!node) return\n\n if (selectedNodes.has(nodeId)) {\n deselectNodeAndAllChildren(node)\n } else {\n selectAllChildren(node)\n\n if (\n selectedNodes.has(nodeId) &&\n !expandedNodes.has(nodeId) &&\n options.expandChildrenOnParentCheck\n ) {\n expandNode(nodeId)\n }\n }\n }\n\n /**\n * Toggles the expansion state of the specific node\n */\n const toggleExpandNode = (nodeId: NodeId) => {\n if (isNodeExpanded(nodeId)) {\n collapseNode(nodeId)\n } else {\n expandNode(nodeId)\n }\n }\n\n /**\n * Gets the icons for expanded and collapsed nodes\n */\n const getNodeIcon = (nodeId: NodeId, expandIcon: string, collapseIcon: string) => {\n return isNodeExpanded(nodeId) ? collapseIcon : expandIcon\n }\n\n /**\n * Checks if a node matches the search term by searching through specified properties\n */\n const nodeMatchesSearch = (node: TreeNode, term: string, searchParams?: string[]): boolean => {\n if (!term.trim()) return true\n if (!searchParams || !Array.isArray(searchParams)) return false\n\n const normalizeForSearch = (value: unknown): string => {\n const s = String(value ?? '')\n return s\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n }\n\n const searchLower = normalizeForSearch(term)\n\n const getValueByPath = (obj: unknown, path: string): unknown => {\n if (!obj) return undefined\n // If data is an array, check each element\n if (Array.isArray(obj)) {\n for (const item of obj) {\n const v = getValueByPath(item as Record<string, unknown>, path)\n if (v !== undefined && v !== null) return v\n }\n return undefined\n }\n if (typeof obj !== 'object') return undefined\n const segments = path.split('.')\n let current: unknown = obj as Record<string, unknown>\n for (const seg of segments) {\n if (current && typeof current === 'object' && seg in (current as Record<string, unknown>)) {\n current = (current as Record<string, unknown>)[seg]\n } else {\n return undefined\n }\n }\n return current\n }\n\n for (const rawParam of searchParams) {\n const param = rawParam.startsWith('data.') ? rawParam.slice(5) : rawParam\n if (param === 'title') {\n const renderedTitle = getTitleFromProperties(node, options?.titleTemplate)\n const titleToMatch = normalizeForSearch(renderedTitle || node.title)\n if (titleToMatch.includes(searchLower)) return true\n }\n if (param === 'nodeId' && normalizeForSearch(node.nodeId).includes(searchLower)) return true\n\n const dataSource = node.data as unknown\n if (Array.isArray(dataSource)) {\n for (const item of dataSource) {\n const v = getValueByPath(item, param)\n if (v !== undefined && v !== null) {\n try {\n if (normalizeForSearch(v).includes(searchLower)) return true\n } catch {}\n }\n }\n } else {\n const value = getValueByPath(dataSource, param)\n if (value !== undefined && value !== null) {\n try {\n if (normalizeForSearch(value).includes(searchLower)) return true\n } catch {}\n }\n }\n }\n\n return false\n }\n\n /**\n * Internal recursive filtering function\n */\n const filterNodesRecursive = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): TreeNodeArray => {\n if (!term.trim()) return nodes\n\n const filtered: TreeNodeArray = []\n\n for (const node of nodes) {\n const nodeMatches = nodeMatchesSearch(node, term, searchParams)\n const filteredChildren = node.children\n ? filterNodesRecursive(node.children, term, searchParams)\n : []\n\n // Include node if it matches OR has matching children\n if (nodeMatches || filteredChildren.length > 0) {\n filtered.push({\n ...node,\n children: filteredChildren.length > 0 ? filteredChildren : node.children,\n })\n }\n }\n\n return filtered\n }\n\n /**\n * Counts how many nodes match the search term across the provided subtree.\n */\n const countMatchingNodesRecursive = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): number => {\n if (!Array.isArray(nodes) || nodes.length === 0) return 0\n if (!term.trim()) return nodes.length\n\n let count = 0\n for (const node of nodes) {\n if (nodeMatchesSearch(node, term, searchParams)) count += 1\n if (node.children && node.children.length > 0) {\n count += countMatchingNodesRecursive(node.children, term, searchParams)\n }\n }\n return count\n }\n\n /**\n * Counts all nodes in the provided subtree.\n */\n const countAllNodesRecursive = (nodes: TreeNodeArray): number => {\n if (!Array.isArray(nodes) || nodes.length === 0) return 0\n let count = 0\n for (const node of nodes) {\n count += 1\n if (node.children && node.children.length > 0) {\n count += countAllNodesRecursive(node.children)\n }\n }\n return count\n }\n\n /**\n * Filters nodes based on search term, including children that match\n */\n const filterNodes = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): TreeNodeArray => {\n if (!term.trim() || term.length < triggerLength) {\n return nodes\n }\n\n const filtered = filterNodesRecursive(nodes, term, searchParams)\n\n return filtered\n }\n\n /**\n * Sets the search term\n */\n const setSearchTerm = (term: string) => {\n searchTerm.value = term\n if (!term.trim() || term.length < triggerLength) {\n isEmptySearchResult.value = false\n }\n }\n\n /**\n * Clears the search term\n */\n const clearSearch = () => {\n searchTerm.value = ''\n isEmptySearchResult.value = false\n }\n\n /**\n * Reactive total count of nodes matching the current search term.\n * If there is no term, returns total nodes under the root's children.\n */\n const filteredMatchCount = computed<number>(() => {\n const t = String(searchTerm.value || '').trim()\n const rootNode =\n Array.isArray(options.nodes) && options.nodes.length > 0 ? options.nodes[0] : null\n const nodesToCheck = rootNode?.children || []\n if (!rootNode) return 0\n if (!t || t.length < triggerLength) {\n return countAllNodesRecursive(nodesToCheck)\n }\n return countMatchingNodesRecursive(nodesToCheck, t, ['title', 'nodeId'])\n })\n\n /**\n * Reactive total node count under the root's children.\n */\n const totalNodeCount = computed<number>(() => {\n const rootNode =\n Array.isArray(options.nodes) && options.nodes.length > 0 ? options.nodes[0] : null\n const nodesToCheck = rootNode?.children || []\n if (!rootNode) return 0\n return countAllNodesRecursive(nodesToCheck)\n })\n\n /**\n * Returns HTML string with hits from search term wrapped in <strong>.\n */\n const highlightText = (text: string | undefined, term: string | undefined): string => {\n const source = String(text ?? '')\n const t = String(term ?? '').trim()\n if (!t) return source\n try {\n const re = new RegExp(t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'ig')\n return source.replace(re, '<strong>$&</strong>')\n } catch {\n return source\n }\n }\n\n return {\n triggerLength,\n clearSearch,\n collapseAllExpandedNodes,\n collapseNode,\n deselectNodeAndAllChildren,\n deselectChildrenOnly,\n deselectNode,\n expandAllChildren,\n expandedNodes,\n expandNode,\n filterNodes,\n getNodeIcon,\n injectNode,\n isNodeExpanded,\n isNodeIndeterminate,\n isNodeIndeterminateById,\n isNodeSelected,\n isParentOrChildrenSelected,\n isParentAndAllChildrenSelected,\n highlightText,\n searchTerm,\n filteredMatchCount,\n totalNodeCount,\n selectAllChildren,\n selectedNodeObjects,\n selectedNodes,\n setSearchTerm,\n toggleExpandNode,\n toggleSelectNode,\n isParentOnlySelected,\n selectNodeAndAllChildren,\n clearAllSelectedNodes,\n isEmptySearchResult,\n }\n}\n\nexport default useTreeState\n","<script setup lang=\"ts\">\nimport { computed, inject, reactive, ref, watch } from 'vue'\nimport type { TreeViewProps } from './types'\nimport useTreeState from './useTreeState'\nimport { getTitleFromProperties } from './utils'\n\ntype Props<T = Record<string, unknown>> = TreeViewProps<T>\n\nconst props = withDefaults(defineProps<Props>(), {\n nodes: () => [],\n depth: 0,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n searchHighlighting: false,\n})\n\ndefineOptions({\n name: 'TreeNode',\n})\n\nconst injectedTreeState = inject<ReturnType<typeof useTreeState> | null>('treeState', null)\nconst treeState = injectedTreeState!\nconst expandedNodes = treeState?.expandedNodes ?? reactive(new Set())\n\nconst indentValue = props.depth * props.indentation\n\nconst indent = computed(() => ({\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n paddingLeft: `${indentValue}px`,\n}))\n\nconst hasChildrenNodes = computed(() => {\n const nodesToCheck =\n props.searchEnabled && treeState?.searchTerm?.value ? filteredNodes.value : props.nodes\n return Array.isArray(nodesToCheck) && nodesToCheck.length > 0\n})\n\nconst filteredNodes = computed(() => {\n const t = String(treeState?.searchTerm?.value || '').trim()\n if (!props.searchEnabled || !t || t.length < (treeState?.triggerLength ?? 1)) {\n return props.nodes\n }\n return treeState.filterNodes(props.nodes, t, props.searchMatchParams)\n})\n\n// Auto-expand current node if search is active and it has matching children\nwatch(\n () => ({\n enabled: props.searchEnabled,\n expandOnSearch: props.searchExpandNodes,\n term: treeState?.searchTerm?.value,\n count: (filteredNodes.value || []).length,\n }),\n ({ enabled, expandOnSearch, term, count }) => {\n if (!enabled || !expandOnSearch) return\n const t = String(term || '').trim()\n if (!t || t.length < (treeState?.triggerLength ?? 1)) return\n if (typeof count === 'number' && count > 0) {\n expandedNodes.add(props.nodeId)\n }\n },\n)\n\nconst isOpen = ref(false)\nconst triggerRef = ref<HTMLElement | null>(null)\nconst popoverPanelRef = ref<HTMLElement | null>(null)\nconst popoverCoords = reactive({ bottom: 0, right: 0, left: 0, top: 0 })\n\nconst popoverWidth = 327\nconst popoverHeight = 80\n\nconst computePopoverCoords = () => {\n const triggerEl = triggerRef.value\n if (!triggerEl) return\n const rect = triggerEl.getBoundingClientRect()\n popoverCoords.bottom = Math.round(rect.bottom)\n popoverCoords.right = Math.round(rect.right)\n popoverCoords.left = Math.round(rect.left)\n popoverCoords.top = Math.round(rect.top)\n}\n\nconst openPopover = () => {\n computePopoverCoords()\n isOpen.value = true\n window.addEventListener('scroll', computePopoverCoords, true)\n window.addEventListener('resize', computePopoverCoords)\n document.addEventListener('pointerdown', handleGlobalPointerDown, { passive: true })\n document.addEventListener('keydown', handleGlobalKeydown)\n}\n\nconst closePopover = () => {\n isOpen.value = false\n window.removeEventListener('scroll', computePopoverCoords, true)\n window.removeEventListener('resize', computePopoverCoords)\n document.removeEventListener('pointerdown', handleGlobalPointerDown)\n document.removeEventListener('keydown', handleGlobalKeydown)\n}\n\nconst togglePopover = () => {\n if (isOpen.value) closePopover()\n else openPopover()\n}\n\nconst handleGlobalPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return\n\n const hasComposedPath = (ev: Event): ev is Event & { composedPath: () => EventTarget[] } =>\n typeof (ev as { composedPath?: () => EventTarget[] }).composedPath === 'function'\n\n const clickedPath = hasComposedPath(event) ? event.composedPath() : ([] as EventTarget[])\n const contains = (el: HTMLElement | null) => (el ? clickedPath.includes(el) : false)\n if (!contains(triggerRef.value) && !contains(popoverPanelRef.value)) {\n closePopover()\n }\n}\n\nconst handleGlobalKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen.value) {\n closePopover()\n }\n}\n\nconst options = [\n { label: props.popoverLabels?.parentAndChildren, value: 'parent_and_children' },\n { label: props.popoverLabels?.parent, value: 'parent' },\n]\n\nconst currentOption = computed(() => {\n if (treeState?.isParentAndAllChildrenSelected(props.nodeId)) return 'parent_and_children'\n if (treeState?.isParentOnlySelected(props.nodeId)) return 'parent'\n return ''\n})\n\nconst handleOptionClick = (option: (typeof options)[number]['value']) => {\n if (option === 'parent_and_children') {\n treeState?.selectNodeAndAllChildren(props.nodeId)\n } else if (option === 'parent') {\n treeState?.deselectChildrenOnly(props.nodeId)\n }\n isOpen.value = false\n}\n</script>\n\n<template>\n <div :class=\"props?.style?.container\">\n <div :style=\"indent\" :class=\"{'pb-3': depth >= 0}\">\n <div class=\"flex\">\n <fds-icon\n v-if=\"hasChildrenNodes\"\n @click=\"treeState?.toggleExpandNode(props.nodeId)\"\n :name=\"\n treeState?.getNodeIcon(props.nodeId, props.nodeExpandIcon, props.nodeCollapseIcon) ??\n props.nodeExpandIcon\n \"\n size=\"24px\"\n class=\"text-blue-500 mr-3\"\n style=\"margin-top: 3px\"\n />\n <div v-if=\"!hasChildrenNodes\" :style=\"{ minWidth: `${indentation}px` }\" />\n\n <fds-checkbox class=\"pl-0 flex-1 flex items-center\">\n <input\n :id=\"`checkbox-${props.nodeId}`\"\n style=\"margin: 0px; margin-top: 3px\"\n type=\"checkbox\"\n :checked=\"treeState?.isNodeSelected(props.nodeId)\"\n :indeterminate=\"\n showIndeterminate && (treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n @change=\"treeState?.toggleSelectNode(props.nodeId, props.title, props.data)\"\n />\n <label :for=\"`checkbox-${props.nodeId}`\" class=\"flex flex-col pl-0\">\n <div>\n <template v-if=\"title\">\n <fds-text\n v-if=\"\n searchHighlighting &&\n searchEnabled &&\n treeState?.searchTerm?.value &&\n String(treeState?.searchTerm?.value || '').trim().length >=\n (treeState?.triggerLength ?? 1)\n \"\n type=\"default\"\n >\n <span v-html=\"treeState?.highlightText(title, treeState?.searchTerm?.value)\" />\n </fds-text>\n <fds-text v-else type=\"default\">{{ title }}</fds-text>\n </template>\n <span v-if=\"showChildrenCount && hasChildrenNodes\">\n (+{{\n searchEnabled &&\n treeState?.searchTerm?.value &&\n String(treeState?.searchTerm?.value || '').trim().length >=\n (treeState?.triggerLength ?? 1)\n ? filteredNodes?.length || 0\n : props.nodes.length\n }})\n </span>\n </div>\n </label>\n </fds-checkbox>\n <div\n style=\"max-height: 28px\"\n v-if=\"\n treeState?.isParentOrChildrenSelected(props.nodeId) &&\n !(treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n >\n <fds-icon-button\n ref=\"triggerRef\"\n icon=\"more\"\n size=\"24px\"\n color=\"blue\"\n @click=\"togglePopover\"\n />\n <teleport to=\"body\">\n <div\n v-if=\"isOpen\"\n class=\"fixed z-[9999]\"\n :style=\"{\n top: popoverCoords.top + 'px',\n left:\n popoverCoords.right -\n popoverWidth -\n (popoverCoords.right - popoverCoords.left) +\n 'px',\n }\"\n >\n <div\n ref=\"popoverPanelRef\"\n class=\"bg-white rounded-md p-6 shadow-lg flex flex-col gap-3\"\n :style=\"{\n width: popoverWidth + 'px',\n minHeight: popoverHeight + 'px',\n }\"\n @click.stop\n >\n <div\n v-for=\"option in options\"\n :key=\"option.value\"\n class=\"flex align-center gap-2 justify-between cursor-pointer\"\n @click=\"handleOptionClick(option.value)\"\n >\n <fds-text>{{ option.label }}</fds-text>\n <fds-icon\n name=\"checkmark\"\n size=\"24px\"\n class=\"text-blue-500\"\n v-if=\"currentOption === option.value\"\n />\n </div>\n </div>\n </div>\n </teleport>\n </div>\n </div>\n </div>\n\n <div v-if=\"expandedNodes.has(props.nodeId)\">\n <TreeNode\n v-for=\"child in filteredNodes\"\n :key=\"child.nodeId\"\n :nodes=\"child.children || []\"\n :title=\"getTitleFromProperties(child, props.titleTemplate)\"\n :nodeId=\"child.nodeId\"\n :data=\"child.data\"\n :depth=\"props.depth + 1\"\n :indentation=\"props.indentation\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :showNodeDescription=\"showNodeDescription\"\n :showChildrenCount=\"showChildrenCount\"\n :expandChildrenOnSelect=\"expandChildrenOnSelect\"\n :showIndeterminate=\"showIndeterminate\"\n :showIndeterminateOnlyOnChildrenSelection=\"showIndeterminateOnlyOnChildrenSelection\"\n :expandChildrenOnParentCheck=\"expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"expandAllChildrenOnParentCheck\"\n :searchEnabled=\"searchEnabled\"\n :searchExpandNodes=\"searchExpandNodes\"\n :searchMatchParams=\"searchMatchParams\"\n :searchHighlighting=\"searchHighlighting\"\n :titleTemplate=\"props.titleTemplate\"\n :popoverLabels=\"props.popoverLabels\"\n />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, provide, watch } from 'vue'\nimport useTreeState from './fds-tree-view/useTreeState'\nimport TreeNode from './fds-tree-view/TreeNode.vue'\nimport type { TreeNode as TreeNodeType, TreeViewProps } from './fds-tree-view/types'\nimport { getTitleFromProperties } from './fds-tree-view/utils'\n\ntype NodeShape = Pick<TreeNodeType, 'nodeId' | 'title' | 'data' | 'children'>\n\ntype WrapperProps<T = Record<string, unknown>> = Omit<\n TreeViewProps<T>,\n 'nodes' | 'depth' | 'data' | 'nodeId' | 'title'\n> & {\n data: TreeNodeType<T>\n selected?: NodeShape[]\n}\n\nconst props = withDefaults(defineProps<WrapperProps<Record<string, unknown>>>(), {\n indentation: 36,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n titleTemplate: '${title}',\n})\n\nconst emit = defineEmits<{\n (e: 'update:selectedNodes', value: NodeShape[]): void\n}>()\n\nconst rootNode = props.data\nconst nodesForState = rootNode ? [rootNode] : []\n\nconst treeState = useTreeState({\n expandChildrenOnParentCheck: props.expandChildrenOnParentCheck,\n expandAllChildrenOnParentCheck: props.expandAllChildrenOnParentCheck,\n showIndeterminateOnlyOnChildrenSelection: props.showIndeterminateOnlyOnChildrenSelection,\n searchExpandNodes: props.searchExpandNodes,\n titleTemplate: props.titleTemplate,\n nodes: nodesForState,\n searchInputTriggerLength: props.searchInputTriggerLength,\n})\nprovide('treeState', treeState)\n\nconst pruneNode = (node: TreeNodeType): NodeShape => ({\n nodeId: node.nodeId,\n title: node.title,\n data: node.data,\n children: Array.isArray(node.children) ? node.children.map(pruneNode) : undefined,\n})\n\nconst selectedNodeObjects = computed<NodeShape[]>(() =>\n treeState.selectedNodeObjects.map(pruneNode),\n)\n\ndefineExpose({\n selectedNodeObjects,\n selectedNodes: treeState.selectedNodes,\n})\n\nwatch(\n () => treeState.selectedNodeObjects,\n () => {\n emit('update:selectedNodes', selectedNodeObjects.value)\n },\n { deep: true },\n)\n</script>\n\n<template>\n <div>\n <div v-if=\"props.searchEnabled\" class=\"mb-4\">\n <fds-input\n :value=\"treeState?.searchTerm || ''\"\n @input=\"treeState?.setSearchTerm($event.target.value)\"\n class=\"w-full\"\n :label=\"props.searchLabel\"\n clear-button\n @clearInput=\"treeState?.clearSearch()\"\n >\n <input id=\"tree-view-search-input\" />\n </fds-input>\n <div v-if=\"props.searchCountTemplate || props.searchCountTemplateUnfiltered\" class=\"mt-1\">\n <h3\n v-if=\"\n props.searchCountTemplate &&\n treeState?.searchTerm?.value &&\n String(treeState?.searchTerm?.value || '').trim().length >=\n (treeState?.triggerLength ?? 1)\n \"\n >\n {{\n props.searchCountTemplate\n .replace('${filteredNodes}', treeState?.filteredMatchCount.value.toString())\n .replace('${totalNodes}', treeState?.totalNodeCount.value.toString())\n }}\n </h3>\n <h3 v-else>\n {{\n props.searchCountTemplateUnfiltered?.replace(\n '${totalNodes}',\n treeState?.totalNodeCount.value.toString(),\n )\n }}\n </h3>\n </div>\n </div>\n\n <fds-content-block\n v-if=\"treeState?.isEmptySearchResult?.value\"\n variant=\"secondary\"\n icon=\"information\"\n class=\"mt-4\"\n >\n <div slot=\"header\">{{ props.searchResultNoMatchesTitle }}</div>\n <fds-text>{{ props.searchResultNoMatchesBody }}</fds-text>\n </fds-content-block>\n\n <div :class=\"props.horizontalScroll ? 'overflow-x-auto bg-white-solid' : ''\">\n <TreeNode\n v-if=\"props.data && !treeState?.isEmptySearchResult?.value\"\n :style=\"{ container: 'bg-white-solid p-2 rounded-md' }\"\n :nodes=\"props.data.children || []\"\n :title=\"getTitleFromProperties(props.data, props.titleTemplate)\"\n :nodeId=\"props.data.nodeId\"\n :data=\"props.data.data\"\n :indentation=\"props.indentation\"\n :showNodeDescription=\"props.showNodeDescription\"\n :showChildrenCount=\"props.showChildrenCount\"\n :expandChildrenOnSelect=\"props.expandChildrenOnSelect\"\n :showIndeterminate=\"props.showIndeterminate\"\n :expandChildrenOnParentCheck=\"props.expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"props.expandAllChildrenOnParentCheck\"\n :showIndeterminateOnlyOnChildrenSelection=\"props.showIndeterminateOnlyOnChildrenSelection\"\n :searchEnabled=\"props.searchEnabled\"\n :searchLabel=\"props.searchLabel\"\n :searchExpandNodes=\"props.searchExpandNodes\"\n :searchMatchParams=\"props.searchMatchParams\"\n :horizontalScroll=\"props.horizontalScroll\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :searchHighlighting=\"props.searchHighlighting\"\n :titleTemplate=\"props.titleTemplate\"\n :popoverLabels=\"props.popoverLabels\"\n />\n </div>\n </div>\n</template>\n","import type { App } from 'vue'\n\n// Import styles\nimport './style.css'\n\n// Import all components\nimport FdsTreeView from './components/FdsTreeView.vue'\n\n// Import composables\nimport useTreeState from './components/fds-tree-view/useTreeState'\n\n// Export individual components\nexport { FdsTreeView }\n\n// Export composables\nexport { useTreeState }\n\n// Export component library plugin\nexport default {\n install(app: App) {\n // Register all components globally\n app.component('FdsTreeView', FdsTreeView)\n },\n}\n\nexport type {\n TreeNode,\n TreeNodeArray,\n TreeNodeItem,\n TreeViewProps,\n NodeId,\n} from './components/fds-tree-view/types'\n\nimport type { TreeViewProps } from './components/fds-tree-view/types'\nexport type FdsTreeViewProps<T = Record<string, unknown>> = TreeViewProps<T>\n"],"names":["index","_createElementBlock","_normalizeClass","_createElementVNode","depth","_hoisted_1","_unref","indentation","_hoisted_3","showIndeterminate","title","_Fragment","searchHighlighting","searchEnabled","_openBlock","_hoisted_6","_toDisplayString","showChildrenCount","_createBlock","_Teleport","_normalizeStyle","_renderList","showNodeDescription","expandChildrenOnSelect","showIndeterminateOnlyOnChildrenSelection","expandChildrenOnParentCheck","expandAllChildrenOnParentCheck","searchExpandNodes","searchMatchParams","TreeNode","FdsTreeView"],"mappings":"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"}
1
+ {"version":3,"file":"fds-vue-core.es.js","sources":["../src/components/fds-tree-view/utils.ts","../src/components/fds-tree-view/useTreeState.ts","../src/components/fds-tree-view/TreeNode.vue","../src/composables/useElementFinalSize.ts","../src/components/FdsTreeView.vue","../src/index.ts"],"sourcesContent":["import type { TreeNode } from './types'\n\nconst getTitleFromProperties = (node: TreeNode, titleTemplate?: string) => {\n if (!titleTemplate) {\n return node.title\n }\n\n // Extract all occurrences of content inside ${} in the template string\n const templateVariables = extractTemplateVariables(titleTemplate)\n\n // Replace template variables with actual values\n let result = titleTemplate\n templateVariables.forEach((variable) => {\n const value = getNodePropertyValue(node, variable)\n result = result.replace(`\\${${variable}}`, value)\n })\n\n return result\n}\n\n/**\n * Extract all occurrences of content inside ${} in a string\n * @param template - The template string containing ${} placeholders\n * @returns Array of variable names found in the template\n */\nconst extractTemplateVariables = (template: string): string[] => {\n const regex = /\\$\\{([^}]+)\\}/g\n const matches: string[] = []\n let match\n\n while ((match = regex.exec(template)) !== null) {\n matches.push(match[1])\n }\n\n return matches\n}\n\n/**\n * Get property value from node object\n * @param node - The tree node\n * @param property - The property name to extract\n * @returns The property value as string\n */\nconst getNodePropertyValue = (node: TreeNode, property: string): string => {\n // Handle direct properties\n if (property in node) {\n const value = node[property as keyof TreeNode]\n return value ? String(value) : ''\n }\n\n // Handle nested data properties\n if (node.data && typeof node.data === 'object') {\n const dataValue = (node.data as any)[property]\n if (dataValue !== undefined && dataValue !== null) {\n return String(dataValue)\n }\n }\n\n // Return empty string if property not found\n return ''\n}\n\nexport { getTitleFromProperties }\n","import { computed, reactive, ref, watch } from 'vue'\nimport type { TreeNode, NodeId, TreeNodeArray, TreeNodeItem } from './types'\nimport { getTitleFromProperties } from './utils'\n\ninterface TreeStateOptions {\n expandChildrenOnParentCheck?: boolean\n expandAllChildrenOnParentCheck?: boolean\n showIndeterminateOnlyOnChildrenSelection?: boolean\n searchExpandNodes?: boolean\n titleTemplate?: string\n searchInputTriggerLength?: number\n nodes?: TreeNodeArray\n}\n\nconst useTreeState = (options: TreeStateOptions = {}) => {\n /** Default the trigger length to 1 when not provided */\n const triggerLength = options?.searchInputTriggerLength ?? 1\n /**\n * The set of selected nodes\n */\n const selectedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The array of selected node objects\n */\n const selectedNodeObjects = reactive<TreeNode[]>([])\n /**\n * The set of expanded nodes\n */\n const expandedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The search term for filtering nodes\n */\n const searchTerm = ref<string>('')\n\n /**\n * If no results are found for the search term\n */\n const isEmptySearchResult = ref<boolean>(false)\n\n // Watch for search term changes to update empty result flag\n watch(searchTerm, (newTerm) => {\n if (!newTerm.trim() || newTerm.length < triggerLength) {\n isEmptySearchResult.value = false\n } else if (options.nodes && options.nodes.length > 0) {\n // Check if there are any results for the new search term\n // The tree structure has a root node with children, so we need to check the root's children\n const rootNode = options.nodes[0]\n const nodesToCheck = rootNode?.children || []\n const filtered = filterNodesRecursive(nodesToCheck, newTerm, ['title', 'nodeId'])\n isEmptySearchResult.value = filtered.length === 0\n }\n })\n\n /**\n * Clears all selected nodes. Can be used to reset the selections to the initial state.\n */\n const clearAllSelectedNodes = () => {\n selectedNodes.clear()\n selectedNodeObjects.length = 0\n }\n\n /**\n * Collapses all expanded nodes. Can be used to reset the tree to the initial state.\n */\n const collapseAllExpandedNodes = () => expandedNodes.clear()\n\n /**\n * Returns true if the node is selected\n */\n const isNodeSelected = (nodeId: NodeId) => selectedNodes.has(nodeId)\n\n /**\n * Returns true if the node is expanded\n */\n const isNodeExpanded = (nodeId: NodeId) => expandedNodes.has(nodeId)\n\n /**\n * Expands the specific node\n */\n const expandNode = (nodeId: NodeId) => expandedNodes.add(nodeId)\n\n /**\n * Collapses the specific node\n */\n const collapseNode = (nodeId: NodeId) => expandedNodes.delete(nodeId)\n\n /**\n * Selects the specific node and adds it to the selectedNodeObjects array.\n * Used to access the node object and it's underlying data\n */\n const injectNode = (nodeObject: TreeNode) => {\n // Prevent duplicates\n if (selectedNodes.has(nodeObject.nodeId)) return\n\n selectedNodes.add(nodeObject.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === nodeObject.nodeId)) {\n selectedNodeObjects.push(nodeObject)\n }\n }\n\n /**\n * Expands all children of the specific node\n */\n const expandAllChildren = (node: TreeNode) => {\n expandNode(node.nodeId)\n if (node.children && node.children.length > 0) {\n node.children.forEach(expandAllChildren)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectAllChildren = (node: TreeNode) => {\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n\n // Inject the current node\n injectNode(node)\n\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n\n // Only expand children if the option is enabled\n if (options.expandChildrenOnParentCheck) {\n expandAllChildren(node)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectNodeAndAllChildren = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Select the current node\n injectNode(node)\n\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n }\n\n /**\n * Deselects the specific node\n */\n const deselectNode = (nodeId: NodeId) => {\n selectedNodes.delete(nodeId)\n const index = selectedNodeObjects.findIndex((node) => node.nodeId === nodeId)\n\n if (index > -1) {\n selectedNodeObjects.splice(index, 1)\n }\n }\n\n /**\n * Deselects this node and recursively deselects all children nodes\n */\n const deselectNodeAndAllChildren = (node: TreeNode) => {\n // Remove the current node\n deselectNode(node.nodeId)\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Deselects only the children of the specific node\n */\n const deselectChildrenOnly = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Ensure parent remains selected\n selectedNodes.add(node.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === node.nodeId)) {\n selectedNodeObjects.push(node)\n }\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeById = (nodes: TreeNodeArray, nodeId: string): TreeNodeItem | null => {\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeObjectById = (nodeId: string): TreeNodeItem | null => {\n const nodes = Array.isArray(options.nodes) ? options.nodes : []\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Checks if a node has children\n */\n const hasChildrenNodes = (nodes: TreeNodeArray) => nodes.length > 0\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOrChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return selectedNodes.has(node.nodeId) || isAnyChildSelected(node.children || [])\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentAndAllChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return false\n // Parent must be selected and all children\n return selectedNodes.has(node.nodeId) && isEveryChildSelected(node)\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOnlySelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return !isAnyChildSelected(node.children || []) && selectedNodes.has(node.nodeId)\n }\n\n /**\n * Returns true if ALL children of a node are selected\n */\n const isEveryChildSelected = (node: TreeNode): boolean => {\n if (!node.children || node.children.length === 0) return true\n\n return node.children.every(\n (child) => selectedNodes.has(child.nodeId) && isEveryChildSelected(child),\n )\n }\n\n /**\n * Checks if any child of a node is selected\n */\n const isAnyChildSelected = (nodes: TreeNodeArray): boolean => {\n if (!nodes || nodes.length === 0) return false\n return nodes.some(\n (child) =>\n selectedNodes.has(child.nodeId) || (child.children && isAnyChildSelected(child.children)),\n )\n }\n\n /**\n * Checks if a node is indeterminate (partially selected)\n */\n const isNodeIndeterminate = (nodes: TreeNodeArray, parentNodeId?: string): boolean => {\n if (!hasChildrenNodes(nodes)) return false\n\n // Check each child's state\n const childStates = nodes.map((node) => ({\n isSelected: selectedNodes.has(node.nodeId),\n isIndeterminate:\n node.children && node.children.length > 0\n ? isNodeIndeterminate(node.children, node.nodeId)\n : false,\n }))\n\n const hasSelected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isSelected,\n )\n const hasUnselected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) =>\n !child.isSelected && !child.isIndeterminate,\n )\n const hasIndeterminate = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isIndeterminate,\n )\n\n // If parent is selected, never show indeterminate\n if (parentNodeId && selectedNodes.has(parentNodeId)) return false\n\n // Standard behavior: some selected + some unselected, OR any child is indeterminate\n if (!options.showIndeterminateOnlyOnChildrenSelection) {\n return (hasSelected && hasUnselected) || hasIndeterminate\n }\n\n // Special behavior: any child selected OR any child indeterminate\n return hasSelected || hasIndeterminate\n }\n\n const isNodeIndeterminateById = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n if (!node) return false\n return isNodeIndeterminate(node.children || [], nodeId)\n }\n\n /**\n * Toggles the selection state of the specific node\n */\n const toggleSelectNode = (nodeId: string, title?: string, data?: Record<string, unknown>) => {\n let node = findNodeObjectById(nodeId)\n\n if (!node && nodeId) {\n node = {\n nodeId: nodeId,\n title: title,\n children: [],\n data: data,\n }\n }\n\n if (!node) return\n\n if (selectedNodes.has(nodeId)) {\n deselectNodeAndAllChildren(node)\n } else {\n selectAllChildren(node)\n\n if (\n selectedNodes.has(nodeId) &&\n !expandedNodes.has(nodeId) &&\n options.expandChildrenOnParentCheck\n ) {\n expandNode(nodeId)\n }\n }\n }\n\n /**\n * Toggles the expansion state of the specific node\n */\n const toggleExpandNode = (nodeId: NodeId) => {\n if (isNodeExpanded(nodeId)) {\n collapseNode(nodeId)\n } else {\n expandNode(nodeId)\n }\n }\n\n /**\n * Gets the icons for expanded and collapsed nodes\n */\n const getNodeIcon = (nodeId: NodeId, expandIcon: string, collapseIcon: string) => {\n return isNodeExpanded(nodeId) ? collapseIcon : expandIcon\n }\n\n /**\n * Checks if a node matches the search term by searching through specified properties\n */\n const nodeMatchesSearch = (node: TreeNode, term: string, searchParams?: string[]): boolean => {\n if (!term.trim()) return true\n if (!searchParams || !Array.isArray(searchParams)) return false\n\n const normalizeForSearch = (value: unknown): string => {\n const s = String(value ?? '')\n return s\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n }\n\n const searchLower = normalizeForSearch(term)\n\n const getValueByPath = (obj: unknown, path: string): unknown => {\n if (!obj) return undefined\n // If data is an array, check each element\n if (Array.isArray(obj)) {\n for (const item of obj) {\n const v = getValueByPath(item as Record<string, unknown>, path)\n if (v !== undefined && v !== null) return v\n }\n return undefined\n }\n if (typeof obj !== 'object') return undefined\n const segments = path.split('.')\n let current: unknown = obj as Record<string, unknown>\n for (const seg of segments) {\n if (current && typeof current === 'object' && seg in (current as Record<string, unknown>)) {\n current = (current as Record<string, unknown>)[seg]\n } else {\n return undefined\n }\n }\n return current\n }\n\n for (const rawParam of searchParams) {\n const param = rawParam.startsWith('data.') ? rawParam.slice(5) : rawParam\n if (param === 'title') {\n const renderedTitle = getTitleFromProperties(node, options?.titleTemplate)\n const titleToMatch = normalizeForSearch(renderedTitle || node.title)\n if (titleToMatch.includes(searchLower)) return true\n }\n if (param === 'nodeId' && normalizeForSearch(node.nodeId).includes(searchLower)) return true\n\n const dataSource = node.data as unknown\n if (Array.isArray(dataSource)) {\n for (const item of dataSource) {\n const v = getValueByPath(item, param)\n if (v !== undefined && v !== null) {\n try {\n if (normalizeForSearch(v).includes(searchLower)) return true\n } catch {}\n }\n }\n } else {\n const value = getValueByPath(dataSource, param)\n if (value !== undefined && value !== null) {\n try {\n if (normalizeForSearch(value).includes(searchLower)) return true\n } catch {}\n }\n }\n }\n\n return false\n }\n\n /**\n * Internal recursive filtering function\n */\n const filterNodesRecursive = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): TreeNodeArray => {\n if (!term.trim()) return nodes\n\n const filtered: TreeNodeArray = []\n\n for (const node of nodes) {\n const nodeMatches = nodeMatchesSearch(node, term, searchParams)\n const filteredChildren = node.children\n ? filterNodesRecursive(node.children, term, searchParams)\n : []\n\n // Include node if it matches OR has matching children\n if (nodeMatches || filteredChildren.length > 0) {\n filtered.push({\n ...node,\n children: filteredChildren.length > 0 ? filteredChildren : node.children,\n })\n }\n }\n\n return filtered\n }\n\n /**\n * Counts how many nodes match the search term across the provided subtree.\n */\n const countMatchingNodesRecursive = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): number => {\n if (!Array.isArray(nodes) || nodes.length === 0) return 0\n if (!term.trim()) return nodes.length\n\n let count = 0\n for (const node of nodes) {\n if (nodeMatchesSearch(node, term, searchParams)) count += 1\n if (node.children && node.children.length > 0) {\n count += countMatchingNodesRecursive(node.children, term, searchParams)\n }\n }\n return count\n }\n\n /**\n * Counts all nodes in the provided subtree.\n */\n const countAllNodesRecursive = (nodes: TreeNodeArray): number => {\n if (!Array.isArray(nodes) || nodes.length === 0) return 0\n let count = 0\n for (const node of nodes) {\n count += 1\n if (node.children && node.children.length > 0) {\n count += countAllNodesRecursive(node.children)\n }\n }\n return count\n }\n\n /**\n * Filters nodes based on search term, including children that match\n */\n const filterNodes = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): TreeNodeArray => {\n if (!term.trim() || term.length < triggerLength) {\n return nodes\n }\n\n const filtered = filterNodesRecursive(nodes, term, searchParams)\n\n return filtered\n }\n\n /**\n * Sets the search term\n */\n const setSearchTerm = (term: string) => {\n searchTerm.value = term\n if (!term.trim() || term.length < triggerLength) {\n isEmptySearchResult.value = false\n }\n }\n\n /**\n * Clears the search term\n */\n const clearSearch = () => {\n searchTerm.value = ''\n isEmptySearchResult.value = false\n }\n\n /**\n * Reactive total count of nodes matching the current search term.\n * If there is no term, returns total nodes under the root's children.\n */\n const filteredMatchCount = computed<number>(() => {\n const t = String(searchTerm.value || '').trim()\n const rootNode =\n Array.isArray(options.nodes) && options.nodes.length > 0 ? options.nodes[0] : null\n const nodesToCheck = rootNode?.children || []\n if (!rootNode) return 0\n if (!t || t.length < triggerLength) {\n return countAllNodesRecursive(nodesToCheck)\n }\n return countMatchingNodesRecursive(nodesToCheck, t, ['title', 'nodeId'])\n })\n\n /**\n * Reactive total node count under the root's children.\n */\n const totalNodeCount = computed<number>(() => {\n const rootNode =\n Array.isArray(options.nodes) && options.nodes.length > 0 ? options.nodes[0] : null\n const nodesToCheck = rootNode?.children || []\n if (!rootNode) return 0\n return countAllNodesRecursive(nodesToCheck)\n })\n\n /**\n * Returns HTML string with hits from search term wrapped in <strong>.\n */\n const highlightText = (text: string | undefined, term: string | undefined): string => {\n const source = String(text ?? '')\n const t = String(term ?? '').trim()\n if (!t) return source\n try {\n const re = new RegExp(t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'ig')\n return source.replace(re, '<strong>$&</strong>')\n } catch {\n return source\n }\n }\n\n return {\n triggerLength,\n clearSearch,\n collapseAllExpandedNodes,\n collapseNode,\n deselectNodeAndAllChildren,\n deselectChildrenOnly,\n deselectNode,\n expandAllChildren,\n expandedNodes,\n expandNode,\n filterNodes,\n getNodeIcon,\n injectNode,\n isNodeExpanded,\n isNodeIndeterminate,\n isNodeIndeterminateById,\n isNodeSelected,\n isParentOrChildrenSelected,\n isParentAndAllChildrenSelected,\n highlightText,\n searchTerm,\n filteredMatchCount,\n totalNodeCount,\n selectAllChildren,\n selectedNodeObjects,\n selectedNodes,\n setSearchTerm,\n toggleExpandNode,\n toggleSelectNode,\n isParentOnlySelected,\n selectNodeAndAllChildren,\n clearAllSelectedNodes,\n isEmptySearchResult,\n }\n}\n\nexport default useTreeState\n","<script setup lang=\"ts\">\nimport { computed, inject, reactive, ref, watch } from 'vue'\nimport type { TreeViewProps } from './types'\nimport useTreeState from './useTreeState'\nimport { getTitleFromProperties } from './utils'\n\ntype Props<T = Record<string, unknown>> = TreeViewProps<T>\n\nconst props = withDefaults(defineProps<Props>(), {\n nodes: () => [],\n depth: 0,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n searchHighlighting: false,\n})\n\ndefineOptions({\n name: 'TreeNode',\n})\n\nconst injectedTreeState = inject<ReturnType<typeof useTreeState> | null>('treeState', null)\nconst treeState = injectedTreeState!\nconst expandedNodes = treeState?.expandedNodes ?? reactive(new Set())\n\nconst indentValue = props.depth * props.indentation\n\nconst indent = computed(() => ({\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n paddingLeft: `${indentValue}px`,\n}))\n\nconst hasChildrenNodes = computed(() => {\n const nodesToCheck =\n props.searchEnabled && treeState?.searchTerm?.value ? filteredNodes.value : props.nodes\n return Array.isArray(nodesToCheck) && nodesToCheck.length > 0\n})\n\nconst filteredNodes = computed(() => {\n const t = String(treeState?.searchTerm?.value || '').trim()\n if (!props.searchEnabled || !t || t.length < (treeState?.triggerLength ?? 1)) {\n return props.nodes\n }\n return treeState.filterNodes(props.nodes, t, props.searchMatchParams)\n})\n\n// Auto-expand current node if search is active and it has matching children\nwatch(\n () => ({\n enabled: props.searchEnabled,\n expandOnSearch: props.searchExpandNodes,\n term: treeState?.searchTerm?.value,\n count: (filteredNodes.value || []).length,\n }),\n ({ enabled, expandOnSearch, term, count }) => {\n if (!enabled || !expandOnSearch) return\n const t = String(term || '').trim()\n if (!t || t.length < (treeState?.triggerLength ?? 1)) return\n if (typeof count === 'number' && count > 0) {\n expandedNodes.add(props.nodeId)\n }\n },\n)\n\nconst isOpen = ref(false)\nconst triggerRef = ref<HTMLElement | null>(null)\nconst popoverPanelRef = ref<HTMLElement | null>(null)\nconst popoverCoords = reactive({ bottom: 0, right: 0, left: 0, top: 0 })\n\nconst popoverWidth = 327\nconst popoverHeight = 80\n\nconst computePopoverCoords = () => {\n const triggerEl = triggerRef.value\n if (!triggerEl) return\n const rect = triggerEl.getBoundingClientRect()\n popoverCoords.bottom = Math.round(rect.bottom)\n popoverCoords.right = Math.round(rect.right)\n popoverCoords.left = Math.round(rect.left)\n popoverCoords.top = Math.round(rect.top)\n}\n\nconst openPopover = () => {\n computePopoverCoords()\n isOpen.value = true\n window.addEventListener('scroll', computePopoverCoords, true)\n window.addEventListener('resize', computePopoverCoords)\n document.addEventListener('pointerdown', handleGlobalPointerDown, { passive: true })\n document.addEventListener('keydown', handleGlobalKeydown)\n}\n\nconst closePopover = () => {\n isOpen.value = false\n window.removeEventListener('scroll', computePopoverCoords, true)\n window.removeEventListener('resize', computePopoverCoords)\n document.removeEventListener('pointerdown', handleGlobalPointerDown)\n document.removeEventListener('keydown', handleGlobalKeydown)\n}\n\nconst togglePopover = () => {\n if (isOpen.value) closePopover()\n else openPopover()\n}\n\nconst handleGlobalPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return\n\n const hasComposedPath = (ev: Event): ev is Event & { composedPath: () => EventTarget[] } =>\n typeof (ev as { composedPath?: () => EventTarget[] }).composedPath === 'function'\n\n const clickedPath = hasComposedPath(event) ? event.composedPath() : ([] as EventTarget[])\n const contains = (el: HTMLElement | null) => (el ? clickedPath.includes(el) : false)\n if (!contains(triggerRef.value) && !contains(popoverPanelRef.value)) {\n closePopover()\n }\n}\n\nconst handleGlobalKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen.value) {\n closePopover()\n }\n}\n\nconst options = [\n { label: props.popoverLabels?.parentAndChildren, value: 'parent_and_children' },\n { label: props.popoverLabels?.parent, value: 'parent' },\n]\n\nconst currentOption = computed(() => {\n if (treeState?.isParentAndAllChildrenSelected(props.nodeId)) return 'parent_and_children'\n if (treeState?.isParentOnlySelected(props.nodeId)) return 'parent'\n return ''\n})\n\nconst handleOptionClick = (option: (typeof options)[number]['value']) => {\n if (option === 'parent_and_children') {\n treeState?.selectNodeAndAllChildren(props.nodeId)\n } else if (option === 'parent') {\n treeState?.deselectChildrenOnly(props.nodeId)\n }\n isOpen.value = false\n}\n</script>\n\n<template>\n <div :class=\"props?.style?.container\">\n <div :style=\"indent\" :class=\"{'mb-3': depth >= 0}\">\n <div class=\"flex\">\n <fds-icon\n v-if=\"hasChildrenNodes\"\n @click=\"treeState?.toggleExpandNode(props.nodeId)\"\n :name=\"\n treeState?.getNodeIcon(props.nodeId, props.nodeExpandIcon, props.nodeCollapseIcon) ??\n props.nodeExpandIcon\n \"\n size=\"24px\"\n class=\"text-blue-500 mr-3\"\n style=\"margin-top: 3px\"\n />\n <div v-if=\"!hasChildrenNodes\" :style=\"{ minWidth: `${indentation}px` }\" />\n\n <fds-checkbox class=\"pl-0 flex-1 flex items-center\">\n <input\n :id=\"`checkbox-${props.nodeId}`\"\n style=\"margin: 0px; margin-top: 3px\"\n type=\"checkbox\"\n :checked=\"treeState?.isNodeSelected(props.nodeId)\"\n :indeterminate=\"\n showIndeterminate && (treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n @change=\"treeState?.toggleSelectNode(props.nodeId, props.title, props.data)\"\n />\n <label :for=\"`checkbox-${props.nodeId}`\" class=\"flex flex-col pl-0\">\n <div>\n <template v-if=\"title\">\n <fds-text\n v-if=\"\n searchHighlighting &&\n searchEnabled &&\n treeState?.searchTerm?.value &&\n String(treeState?.searchTerm?.value || '').trim().length >=\n (treeState?.triggerLength ?? 1)\n \"\n type=\"default\"\n >\n <span v-html=\"treeState?.highlightText(title, treeState?.searchTerm?.value)\" />\n </fds-text>\n <fds-text v-else type=\"default\">{{ title }}</fds-text>\n </template>\n <span v-if=\"showChildrenCount && hasChildrenNodes\">\n (+{{\n searchEnabled &&\n treeState?.searchTerm?.value &&\n String(treeState?.searchTerm?.value || '').trim().length >=\n (treeState?.triggerLength ?? 1)\n ? filteredNodes?.length || 0\n : props.nodes.length\n }})\n </span>\n </div>\n </label>\n </fds-checkbox>\n <div\n style=\"max-height: 28px\"\n v-if=\"\n treeState?.isParentOrChildrenSelected(props.nodeId) &&\n !(treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n >\n <fds-icon-button\n ref=\"triggerRef\"\n icon=\"more\"\n size=\"24px\"\n color=\"blue\"\n @click=\"togglePopover\"\n />\n <teleport to=\"body\">\n <div\n v-if=\"isOpen\"\n class=\"fixed z-[9999]\"\n :style=\"{\n top: popoverCoords.top + 'px',\n left:\n popoverCoords.right -\n popoverWidth -\n (popoverCoords.right - popoverCoords.left) +\n 'px',\n }\"\n >\n <div\n ref=\"popoverPanelRef\"\n class=\"bg-white rounded-md p-6 shadow-lg flex flex-col gap-3\"\n :style=\"{\n width: popoverWidth + 'px',\n minHeight: popoverHeight + 'px',\n }\"\n @click.stop\n >\n <div\n v-for=\"option in options\"\n :key=\"option.value\"\n class=\"flex align-center gap-2 justify-between cursor-pointer\"\n @click=\"handleOptionClick(option.value)\"\n >\n <fds-text>{{ option.label }}</fds-text>\n <fds-icon\n name=\"checkmark\"\n size=\"24px\"\n class=\"text-blue-500\"\n v-if=\"currentOption === option.value\"\n />\n </div>\n </div>\n </div>\n </teleport>\n </div>\n </div>\n </div>\n\n <div v-if=\"expandedNodes.has(props.nodeId)\">\n <TreeNode\n v-for=\"child in filteredNodes\"\n :key=\"child.nodeId\"\n :nodes=\"child.children || []\"\n :title=\"getTitleFromProperties(child, props.titleTemplate)\"\n :nodeId=\"child.nodeId\"\n :data=\"child.data\"\n :depth=\"props.depth + 1\"\n :indentation=\"props.indentation\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :showNodeDescription=\"showNodeDescription\"\n :showChildrenCount=\"showChildrenCount\"\n :expandChildrenOnSelect=\"expandChildrenOnSelect\"\n :showIndeterminate=\"showIndeterminate\"\n :showIndeterminateOnlyOnChildrenSelection=\"showIndeterminateOnlyOnChildrenSelection\"\n :expandChildrenOnParentCheck=\"expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"expandAllChildrenOnParentCheck\"\n :searchEnabled=\"searchEnabled\"\n :searchExpandNodes=\"searchExpandNodes\"\n :searchMatchParams=\"searchMatchParams\"\n :searchHighlighting=\"searchHighlighting\"\n :titleTemplate=\"props.titleTemplate\"\n :popoverLabels=\"props.popoverLabels\"\n />\n </div>\n </div>\n</template>\n","import { watchEffect, type Ref } from 'vue'\n\nexport function useElementFinalSize(\n elementRef: Ref<HTMLElement | null>,\n onFinalSize: (height: number) => void,\n delay = 100\n) {\n watchEffect((onCleanup) => {\n const element = elementRef.value\n if (!element) return\n\n // Wait for next frame after a short delay, then measure\n const timeoutId = setTimeout(() => {\n requestAnimationFrame(() => {\n const height = element.getBoundingClientRect().height\n if (height > 0) {\n onFinalSize(height)\n }\n })\n }, delay)\n\n onCleanup(() => clearTimeout(timeoutId))\n })\n}\n","<script setup lang=\"ts\">\nimport { computed, provide, ref, watch } from 'vue'\nimport useTreeState from './fds-tree-view/useTreeState'\nimport TreeNode from './fds-tree-view/TreeNode.vue'\nimport type { TreeNode as TreeNodeType, TreeViewProps } from './fds-tree-view/types'\nimport { getTitleFromProperties } from './fds-tree-view/utils'\nimport { useElementFinalSize } from '../composables/useElementFinalSize'\n\ntype NodeShape = Pick<TreeNodeType, 'nodeId' | 'title' | 'data' | 'children'>\n\ntype WrapperProps<T = Record<string, unknown>> = Omit<\n TreeViewProps<T>,\n 'nodes' | 'depth' | 'data' | 'nodeId' | 'title'\n> & {\n data: TreeNodeType<T>\n selected?: NodeShape[]\n}\n\nconst props = withDefaults(defineProps<WrapperProps<Record<string, unknown>>>(), {\n indentation: 36,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n titleTemplate: '${title}',\n})\n\nconst emit = defineEmits<{\n (e: 'update:selectedNodes', value: NodeShape[]): void\n (e: 'getSearchContainerHeight', value: number): void\n}>()\n\nconst rootNode = props.data\nconst nodesForState = rootNode ? [rootNode] : []\n\nconst treeState = useTreeState({\n expandChildrenOnParentCheck: props.expandChildrenOnParentCheck,\n expandAllChildrenOnParentCheck: props.expandAllChildrenOnParentCheck,\n showIndeterminateOnlyOnChildrenSelection: props.showIndeterminateOnlyOnChildrenSelection,\n searchExpandNodes: props.searchExpandNodes,\n titleTemplate: props.titleTemplate,\n nodes: nodesForState,\n searchInputTriggerLength: props.searchInputTriggerLength,\n})\nprovide('treeState', treeState)\n\nconst pruneNode = (node: TreeNodeType): NodeShape => ({\n nodeId: node.nodeId,\n title: node.title,\n data: node.data,\n children: Array.isArray(node.children) ? node.children.map(pruneNode) : undefined,\n})\n\nconst selectedNodeObjects = computed<NodeShape[]>(() =>\n treeState.selectedNodeObjects.map(pruneNode),\n)\n\nconst searchContainerRef = ref<HTMLElement | null>(null)\n\nuseElementFinalSize(searchContainerRef, (height) => {\n emit('getSearchContainerHeight', height)\n})\n\ndefineExpose({\n selectedNodeObjects,\n selectedNodes: treeState.selectedNodes,\n getSearchContainerHeight: () => {\n return searchContainerRef.value?.getBoundingClientRect().height\n },\n})\n\nwatch(\n () => treeState.selectedNodeObjects,\n () => {\n emit('update:selectedNodes', selectedNodeObjects.value)\n },\n { deep: true },\n)\n</script>\n\n<template>\n <div>\n <div v-if=\"props.searchEnabled\" ref=\"searchContainerRef\" class=\"mb-4\">\n <fds-input\n :value=\"treeState?.searchTerm || ''\"\n @input=\"treeState?.setSearchTerm($event.target.value)\"\n class=\"w-full\"\n :label=\"props.searchLabel\"\n clear-button\n @clearInput=\"treeState?.clearSearch()\"\n >\n <input id=\"tree-view-search-input\" />\n </fds-input>\n <div v-if=\"props.searchCountTemplate || props.searchCountTemplateUnfiltered\" class=\"mt-1\">\n <h3\n v-if=\"\n props.searchCountTemplate &&\n treeState?.searchTerm?.value &&\n String(treeState?.searchTerm?.value || '').trim().length >=\n (treeState?.triggerLength ?? 1)\n \"\n >\n {{\n props.searchCountTemplate\n .replace('${filteredNodes}', treeState?.filteredMatchCount.value.toString())\n .replace('${totalNodes}', treeState?.totalNodeCount.value.toString())\n }}\n </h3>\n <h3 v-else>\n {{\n props.searchCountTemplateUnfiltered?.replace(\n '${totalNodes}',\n treeState?.totalNodeCount.value.toString(),\n )\n }}\n </h3>\n </div>\n </div>\n\n <fds-content-block\n v-if=\"treeState?.isEmptySearchResult?.value\"\n variant=\"secondary\"\n icon=\"information\"\n class=\"mt-4\"\n >\n <div slot=\"header\">{{ props.searchResultNoMatchesTitle }}</div>\n <fds-text>{{ props.searchResultNoMatchesBody }}</fds-text>\n </fds-content-block>\n\n <div :class=\"{ 'overflow-x-auto bg-white-solid': props.horizontalScroll }\">\n <TreeNode\n v-if=\"props.data && !treeState?.isEmptySearchResult?.value\"\n :style=\"{ container: 'bg-white-solid p-2 rounded-md' }\"\n :nodes=\"props.data.children || []\"\n :title=\"getTitleFromProperties(props.data, props.titleTemplate)\"\n :nodeId=\"props.data.nodeId\"\n :data=\"props.data.data\"\n :indentation=\"props.indentation\"\n :showNodeDescription=\"props.showNodeDescription\"\n :showChildrenCount=\"props.showChildrenCount\"\n :expandChildrenOnSelect=\"props.expandChildrenOnSelect\"\n :showIndeterminate=\"props.showIndeterminate\"\n :expandChildrenOnParentCheck=\"props.expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"props.expandAllChildrenOnParentCheck\"\n :showIndeterminateOnlyOnChildrenSelection=\"props.showIndeterminateOnlyOnChildrenSelection\"\n :searchEnabled=\"props.searchEnabled\"\n :searchLabel=\"props.searchLabel\"\n :searchExpandNodes=\"props.searchExpandNodes\"\n :searchMatchParams=\"props.searchMatchParams\"\n :horizontalScroll=\"props.horizontalScroll\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :searchHighlighting=\"props.searchHighlighting\"\n :titleTemplate=\"props.titleTemplate\"\n :popoverLabels=\"props.popoverLabels\"\n />\n </div>\n </div>\n</template>\n","import type { App } from 'vue'\n\n// Import styles\nimport './style.css'\n\n// Import all components\nimport FdsTreeView from './components/FdsTreeView.vue'\n\n// Import composables\nimport useTreeState from './components/fds-tree-view/useTreeState'\n\n// Export individual components\nexport { FdsTreeView }\n\n// Export composables\nexport { useTreeState }\n\n// Export component library plugin\nexport default {\n install(app: App) {\n // Register all components globally\n app.component('FdsTreeView', FdsTreeView)\n },\n}\n\nexport type {\n TreeNode,\n TreeNodeArray,\n TreeNodeItem,\n TreeViewProps,\n NodeId,\n} from './components/fds-tree-view/types'\n\nimport type { TreeViewProps } from './components/fds-tree-view/types'\nexport type FdsTreeViewProps<T = Record<string, unknown>> = TreeViewProps<T>\n"],"names":["index","_createElementBlock","_normalizeClass","_createElementVNode","depth","_hoisted_1","_unref","indentation","_hoisted_3","showIndeterminate","title","_Fragment","searchHighlighting","searchEnabled","_openBlock","_hoisted_6","_toDisplayString","showChildrenCount","_createBlock","_Teleport","_normalizeStyle","_renderList","showNodeDescription","expandChildrenOnSelect","showIndeterminateOnlyOnChildrenSelection","expandChildrenOnParentCheck","expandAllChildrenOnParentCheck","searchExpandNodes","searchMatchParams","TreeNode","FdsTreeView"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fds-vue-core",
3
- "version": "1.4.3",
3
+ "version": "1.4.5",
4
4
  "description": "FDS Vue Core Component Library",
5
5
  "type": "module",
6
6
  "main": "./dist/fds-vue-core.cjs.js",