@ryuzaki13/react-foundation-ui 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/dist/advanced-search/index.js +3 -3
  2. package/dist/chunks/{DateInput--tfofQ2x.js → DateInput-CaKGXluL.js} +2 -2
  3. package/dist/chunks/{DateInput--tfofQ2x.js.map → DateInput-CaKGXluL.js.map} +1 -1
  4. package/dist/chunks/{DropZone-kJfbZU5g.js → DropZone-DdFdnC9X.js} +2 -2
  5. package/dist/chunks/{DropZone-kJfbZU5g.js.map → DropZone-DdFdnC9X.js.map} +1 -1
  6. package/dist/chunks/{Input-BmjlpA09.js → Input-BYUl3UFn.js} +2 -4
  7. package/dist/chunks/{Input-BmjlpA09.js.map → Input-BYUl3UFn.js.map} +1 -1
  8. package/dist/chunks/{InputDateTime-CxfAFe2L.js → InputDateTime-DBkWb0lk.js} +2 -2
  9. package/dist/chunks/{InputDateTime-CxfAFe2L.js.map → InputDateTime-DBkWb0lk.js.map} +1 -1
  10. package/dist/chunks/{InputFile-CyZu__B_.js → InputFile-Bo3CN73O.js} +2 -2
  11. package/dist/chunks/{InputFile-CyZu__B_.js.map → InputFile-Bo3CN73O.js.map} +1 -1
  12. package/dist/chunks/{InputFiles-CrTJV27R.js → InputFiles-gIxOPv5y.js} +2 -2
  13. package/dist/chunks/{InputFiles-CrTJV27R.js.map → InputFiles-gIxOPv5y.js.map} +1 -1
  14. package/dist/chunks/{InputImage-Cw8rPYQu.js → InputImage-k4l1J_tm.js} +2 -2
  15. package/dist/chunks/{InputImage-Cw8rPYQu.js.map → InputImage-k4l1J_tm.js.map} +1 -1
  16. package/dist/chunks/{MultiSelect-D1XYuwH1.js → MultiSelect-B0nfMSpS.js} +2 -2
  17. package/dist/chunks/{MultiSelect-D1XYuwH1.js.map → MultiSelect-B0nfMSpS.js.map} +1 -1
  18. package/dist/chunks/{PresetRangeDateInput-CapirptQ.js → PresetRangeDateInput-C5HqkOCG.js} +2 -2
  19. package/dist/chunks/{PresetRangeDateInput-CapirptQ.js.map → PresetRangeDateInput-C5HqkOCG.js.map} +1 -1
  20. package/dist/chunks/{Select-BJ5OqTe7.js → Select-B6kxgxK2.js} +2 -2
  21. package/dist/chunks/{Select-BJ5OqTe7.js.map → Select-B6kxgxK2.js.map} +1 -1
  22. package/dist/chunks/{SerializableSelect-CNe728Qa.js → SerializableSelect-CVGFjCGK.js} +2 -2
  23. package/dist/chunks/{SerializableSelect-CNe728Qa.js.map → SerializableSelect-CVGFjCGK.js.map} +1 -1
  24. package/dist/chunks/{SingleDateTimeInput-BmeuVGQT.js → SingleDateTimeInput-D2fDMQnI.js} +2 -2
  25. package/dist/chunks/{SingleDateTimeInput-BmeuVGQT.js.map → SingleDateTimeInput-D2fDMQnI.js.map} +1 -1
  26. package/dist/chunks/{StateSelect-ujAre258.js → StateSelect-CEp7kGGg.js} +2 -2
  27. package/dist/chunks/{StateSelect-ujAre258.js.map → StateSelect-CEp7kGGg.js.map} +1 -1
  28. package/dist/chunks/{TextEditorLexicalClient-CovUSRag.js → TextEditorLexicalClient-uvFboXlh.js} +2 -2
  29. package/dist/chunks/{TextEditorLexicalClient-CovUSRag.js.map → TextEditorLexicalClient-uvFboXlh.js.map} +1 -1
  30. package/dist/chunks/{Textarea-C9UdUueF.js → Textarea-T8gXua35.js} +2 -2
  31. package/dist/chunks/{Textarea-C9UdUueF.js.map → Textarea-T8gXua35.js.map} +1 -1
  32. package/dist/chunks/{TreeMultiSelect-CfQhlfnC.js → TreeMultiSelect-BcPr2Phe.js} +2 -2
  33. package/dist/chunks/{TreeMultiSelect-CfQhlfnC.js.map → TreeMultiSelect-BcPr2Phe.js.map} +1 -1
  34. package/dist/chunks/{TreePickerBase-BBUOWsSu.js → TreePickerBase-ClXn2q3u.js} +3 -3
  35. package/dist/chunks/{TreePickerBase-BBUOWsSu.js.map → TreePickerBase-ClXn2q3u.js.map} +1 -1
  36. package/dist/chunks/{TreeSelect-2wUXs90E.js → TreeSelect-DYWkgryS.js} +2 -2
  37. package/dist/chunks/{TreeSelect-2wUXs90E.js.map → TreeSelect-DYWkgryS.js.map} +1 -1
  38. package/dist/chunks/{input-search-Dw4rnJBq.js → input-search-BR4LDmyb.js} +2 -2
  39. package/dist/chunks/{input-search-Dw4rnJBq.js.map → input-search-BR4LDmyb.js.map} +1 -1
  40. package/dist/chunks/{layout-picker-MWaImn3L.js → layout-picker-C1sizRYa.js} +2 -2
  41. package/dist/chunks/{layout-picker-MWaImn3L.js.map → layout-picker-C1sizRYa.js.map} +1 -1
  42. package/dist/chunks/{multi-select-BYsbh2ca.js → multi-select-DCY3fonG.js} +2 -2
  43. package/dist/chunks/{multi-select-BYsbh2ca.js.map → multi-select-DCY3fonG.js.map} +1 -1
  44. package/dist/chunks/{picker-Dg55Ss-B.js → picker-DGXq3ikg.js} +2 -2
  45. package/dist/chunks/{picker-Dg55Ss-B.js.map → picker-DGXq3ikg.js.map} +1 -1
  46. package/dist/chunks/{select-BkLc6dyx.js → select-Di99RAVO.js} +3 -3
  47. package/dist/chunks/{select-BkLc6dyx.js.map → select-Di99RAVO.js.map} +1 -1
  48. package/dist/chunks/{slider-CFKsfxFp.js → slider-BqeYbdrg.js} +3 -3
  49. package/dist/chunks/{slider-CFKsfxFp.js.map → slider-BqeYbdrg.js.map} +1 -1
  50. package/dist/date-input/index.js +1 -1
  51. package/dist/date-input/stories/DateInput.stories.js +1 -1
  52. package/dist/date-range-preset-select/stories/DateRangePresetSelect.stories.js +1 -1
  53. package/dist/date-time-input/index.js +1 -1
  54. package/dist/date-time-input/stories/SingleDateTimeInput.stories.js +1 -1
  55. package/dist/drop-zone/index.js +1 -1
  56. package/dist/drop-zone/stories/DropZone.stories.js +1 -1
  57. package/dist/expandable-action-panel/stories/ExpandableActionPanel.stories.js +2 -2
  58. package/dist/image/index.js +2 -2
  59. package/dist/input/InputErrorComponent.d.ts +6 -0
  60. package/dist/input/InputErrorComponent.d.ts.map +1 -0
  61. package/dist/input/index.d.ts +1 -0
  62. package/dist/input/index.d.ts.map +1 -1
  63. package/dist/input/index.js +14 -2
  64. package/dist/input/index.js.map +1 -0
  65. package/dist/input/stories/Input.stories.js +1 -1
  66. package/dist/input-date-time/index.js +1 -1
  67. package/dist/input-date-time/stories/InputDateTime.stories.js +1 -1
  68. package/dist/input-file/index.js +1 -1
  69. package/dist/input-file/stories/InputFile.stories.js +1 -1
  70. package/dist/input-files/index.js +1 -1
  71. package/dist/input-files/stories/InputFiles.stories.js +1 -1
  72. package/dist/input-image/index.js +1 -1
  73. package/dist/input-image/stories/InputImage.stories.js +1 -1
  74. package/dist/input-search/index.js +1 -1
  75. package/dist/layout-picker/index.js +1 -1
  76. package/dist/layout-picker/stories/LayoutPicker.stories.js +1 -1
  77. package/dist/modal/stories/Modal.stories.js +1 -1
  78. package/dist/multi-select/index.js +2 -2
  79. package/dist/multi-select/ui/stories/MultiSelect.stories.js +1 -1
  80. package/dist/period-select/stories/PeriodSelect.stories.js +1 -1
  81. package/dist/picker/index.js +1 -1
  82. package/dist/popover/stories/Popover.stories.js +1 -1
  83. package/dist/preset-range-date-input/index.js +1 -1
  84. package/dist/preset-range-date-input/ui/stories/PresetRangeDateInput.stories.js +1 -1
  85. package/dist/preset-select/index.js +1 -1
  86. package/dist/select/index.js +3 -3
  87. package/dist/select/stories/Select.stories.js +1 -1
  88. package/dist/select/stories/SerializableSelect.stories.js +1 -1
  89. package/dist/slider/index.js +1 -1
  90. package/dist/slider/stories/Slider.stories.js +1 -1
  91. package/dist/slider/stories/SliderInput.stories.js +1 -1
  92. package/dist/state-select/index.js +1 -1
  93. package/dist/state-select/stories/StateSelect.stories.js +1 -1
  94. package/dist/text-editor/index.js +1 -1
  95. package/dist/textarea/index.js +1 -1
  96. package/dist/textarea/stories/Textarea.stories.js +1 -1
  97. package/dist/tree-select/index.js +2 -2
  98. package/dist/tree-select/stories/TreeMultiSelect.stories.js +1 -1
  99. package/dist/tree-select/stories/TreeSelect.stories.js +1 -1
  100. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TreePickerBase-BBUOWsSu.js","names":[],"sources":["../../src/tree-select/model/treeUtils.ts","../../src/tree-select/TreeSelect.module.scss","../../src/tree-select/TreeNodeContent.tsx","../../src/tree-select/TreePickerBase.tsx"],"sourcesContent":["import { TreeMultiSelectValue, TreeSelectNode, TreeSelectValue } from \"../types\";\n\nexport type TreeNodeIndex = {\n\trootIds: string[];\n\tnodeById: Map<string, TreeSelectNode>;\n\tparentById: Map<string, string | undefined>;\n\tchildrenById: Map<string, string[]>;\n\tpreorderIndexById: Map<string, number>;\n\tnodeIdByCodeValue: Map<string, string>;\n};\n\nexport type TreeNodeSelectionState = {\n\tselectedIds: Set<string>;\n\tpartialIds: Set<string>;\n};\n\nexport type TreeVisibleEntry = {\n\tnode: TreeSelectNode;\n\tlevel: number;\n\tparentId?: string;\n\thasChildren: boolean;\n\tisExpanded: boolean;\n\tisLeaf: boolean;\n};\n\nfunction makeCodeValueKey(codeKey: string, value: string) {\n\treturn `${codeKey}::${value}`;\n}\n\nexport function createTreeNodeIndex(nodes: readonly TreeSelectNode[]): TreeNodeIndex {\n\tconst nodeById = new Map<string, TreeSelectNode>();\n\tconst parentById = new Map<string, string | undefined>();\n\tconst childrenById = new Map<string, string[]>();\n\tconst preorderIndexById = new Map<string, number>();\n\tconst nodeIdByCodeValue = new Map<string, string>();\n\tlet preorderIndex = 0;\n\n\tconst walk = (node: TreeSelectNode, parentId?: string) => {\n\t\tnodeById.set(node.id, node);\n\t\tparentById.set(node.id, parentId);\n\t\tpreorderIndexById.set(node.id, preorderIndex++);\n\t\tnodeIdByCodeValue.set(makeCodeValueKey(node.codeKey, node.value), node.id);\n\n\t\tconst childIds = (node.children ?? []).map((child) => child.id);\n\t\tchildrenById.set(node.id, childIds);\n\n\t\tfor (const child of node.children ?? []) {\n\t\t\twalk(child, node.id);\n\t\t}\n\t};\n\n\tfor (const node of nodes) {\n\t\twalk(node);\n\t}\n\n\treturn {\n\t\trootIds: nodes.map((node) => node.id),\n\t\tnodeById,\n\t\tparentById,\n\t\tchildrenById,\n\t\tpreorderIndexById,\n\t\tnodeIdByCodeValue\n\t};\n}\n\nexport function treeSelectValueToId(value: TreeSelectValue | undefined, index: TreeNodeIndex) {\n\tif (!value) return undefined;\n\treturn index.nodeIdByCodeValue.get(makeCodeValueKey(value.codeKey, value.value));\n}\n\nexport function treeMultiValueToSelectedIds(value: TreeMultiSelectValue | undefined, index: TreeNodeIndex) {\n\tconst selectedIds = new Set<string>();\n\n\tif (!value) {\n\t\treturn selectedIds;\n\t}\n\n\tfor (const [codeKey, values] of Object.entries(value)) {\n\t\tfor (const itemValue of values) {\n\t\t\tconst nodeId = index.nodeIdByCodeValue.get(makeCodeValueKey(codeKey, itemValue));\n\t\t\tif (nodeId) {\n\t\t\t\tselectedIds.add(nodeId);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn canonicalizeTreeSelection(selectedIds, index);\n}\n\nexport function treeSelectedIdsToMultiValue(selectedIds: Set<string>, index: TreeNodeIndex): TreeMultiSelectValue {\n\tconst orderedIds = [...selectedIds].sort(\n\t\t(leftId, rightId) =>\n\t\t\t(index.preorderIndexById.get(leftId) ?? Number.MAX_SAFE_INTEGER) -\n\t\t\t(index.preorderIndexById.get(rightId) ?? Number.MAX_SAFE_INTEGER)\n\t);\n\tconst result: TreeMultiSelectValue = {};\n\n\tfor (const nodeId of orderedIds) {\n\t\tconst node = index.nodeById.get(nodeId);\n\t\tif (!node) continue;\n\n\t\tresult[node.codeKey] = result[node.codeKey] ?? [];\n\t\tresult[node.codeKey].push(node.value);\n\t}\n\n\treturn result;\n}\n\nexport function treeSelectValueToMultiValue(value: TreeSelectValue | undefined): TreeMultiSelectValue {\n\tif (!value) {\n\t\treturn {};\n\t}\n\n\treturn {\n\t\t[value.codeKey]: [value.value]\n\t};\n}\n\nfunction getAncestorIds(nodeId: string, index: TreeNodeIndex) {\n\tconst ancestors: string[] = [];\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\tancestors.push(currentId);\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n\n\treturn ancestors;\n}\n\nfunction isDescendantOf(nodeId: string, ancestorId: string, index: TreeNodeIndex) {\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\tif (currentId === ancestorId) {\n\t\t\treturn true;\n\t\t}\n\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n\n\treturn false;\n}\n\nfunction removeDescendantSelections(selectedIds: Set<string>, nodeId: string, index: TreeNodeIndex) {\n\tfor (const selectedId of [...selectedIds]) {\n\t\tif (isDescendantOf(selectedId, nodeId, index)) {\n\t\t\tselectedIds.delete(selectedId);\n\t\t}\n\t}\n}\n\nfunction isNodeFullySelected(nodeId: string, selectedIds: Set<string>, index: TreeNodeIndex): boolean {\n\tif (selectedIds.has(nodeId)) {\n\t\treturn true;\n\t}\n\n\tconst children = index.childrenById.get(nodeId) ?? [];\n\tif (children.length === 0) {\n\t\treturn false;\n\t}\n\n\treturn children.every((childId) => isNodeFullySelected(childId, selectedIds, index));\n}\n\nexport function canonicalizeTreeSelection(selectedIds: Set<string>, index: TreeNodeIndex) {\n\tconst nextSelectedIds = new Set(selectedIds);\n\n\tfor (const selectedId of [...nextSelectedIds]) {\n\t\tif (getAncestorIds(selectedId, index).some((ancestorId) => nextSelectedIds.has(ancestorId))) {\n\t\t\tnextSelectedIds.delete(selectedId);\n\t\t}\n\t}\n\n\tconst orderedNodeIds = [...index.nodeById.keys()].sort(\n\t\t(leftId, rightId) => (index.preorderIndexById.get(rightId) ?? 0) - (index.preorderIndexById.get(leftId) ?? 0)\n\t);\n\n\tfor (const nodeId of orderedNodeIds) {\n\t\tconst children = index.childrenById.get(nodeId) ?? [];\n\n\t\tif (children.length === 0 || nextSelectedIds.has(nodeId)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (children.every((childId) => isNodeFullySelected(childId, nextSelectedIds, index))) {\n\t\t\tremoveDescendantSelections(nextSelectedIds, nodeId, index);\n\t\t\tnextSelectedIds.add(nodeId);\n\t\t}\n\t}\n\n\treturn nextSelectedIds;\n}\n\nfunction expandNearestSelectedAncestor(selectedIds: Set<string>, nodeId: string, index: TreeNodeIndex) {\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\tif (selectedIds.has(currentId)) {\n\t\t\tselectedIds.delete(currentId);\n\n\t\t\tfor (const childId of index.childrenById.get(currentId) ?? []) {\n\t\t\t\tselectedIds.add(childId);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n\n\treturn false;\n}\n\nexport function isTreeNodeSelected(nodeId: string, selectedIds: Set<string>, index: TreeNodeIndex): boolean {\n\tif (selectedIds.has(nodeId)) {\n\t\treturn true;\n\t}\n\n\treturn getAncestorIds(nodeId, index).some((ancestorId) => selectedIds.has(ancestorId));\n}\n\nfunction resolveTreeSelectionState(nodeId: string, selectedIds: Set<string>, index: TreeNodeIndex, state: TreeNodeSelectionState) {\n\tconst children = index.childrenById.get(nodeId) ?? [];\n\n\tif (selectedIds.has(nodeId)) {\n\t\tstate.selectedIds.add(nodeId);\n\t\treturn { selected: true, partial: false };\n\t}\n\n\tif (children.length === 0) {\n\t\treturn { selected: false, partial: false };\n\t}\n\n\tconst childStates = children.map((childId) => resolveTreeSelectionState(childId, selectedIds, index, state));\n\tconst allSelected = childStates.every((childState) => childState.selected && !childState.partial);\n\tconst hasAnySelected = childStates.some((childState) => childState.selected || childState.partial);\n\n\tif (allSelected) {\n\t\tstate.selectedIds.add(nodeId);\n\t\treturn { selected: true, partial: false };\n\t}\n\n\tif (hasAnySelected) {\n\t\tstate.partialIds.add(nodeId);\n\t\treturn { selected: false, partial: true };\n\t}\n\n\treturn { selected: false, partial: false };\n}\n\nexport function getTreeNodeSelectionState(selectedIds: Set<string>, index: TreeNodeIndex): TreeNodeSelectionState {\n\tconst state: TreeNodeSelectionState = {\n\t\tselectedIds: new Set(),\n\t\tpartialIds: new Set()\n\t};\n\n\tfor (const rootId of index.rootIds) {\n\t\tresolveTreeSelectionState(rootId, selectedIds, index, state);\n\t}\n\n\treturn state;\n}\n\nexport function toggleTreeMultiSelection(currentValue: TreeMultiSelectValue | undefined, targetNodeId: string, index: TreeNodeIndex) {\n\tconst selectedIds = treeMultiValueToSelectedIds(currentValue, index);\n\n\tconst toggle = (targetId: string) => {\n\t\tif (isTreeNodeSelected(targetId, selectedIds, index)) {\n\t\t\tif (selectedIds.has(targetId)) {\n\t\t\t\tselectedIds.delete(targetId);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (expandNearestSelectedAncestor(selectedIds, targetId, index)) {\n\t\t\t\ttoggle(targetId);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tremoveDescendantSelections(selectedIds, targetId, index);\n\t\tselectedIds.add(targetId);\n\t};\n\n\ttoggle(targetNodeId);\n\n\treturn treeSelectedIdsToMultiValue(canonicalizeTreeSelection(selectedIds, index), index);\n}\n\nfunction collectExpandedIds(nodeId: string, index: TreeNodeIndex, expandedIds: Set<string>) {\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\texpandedIds.add(currentId);\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n}\n\nexport function getSelectionExpandedIds(selectedIds: Set<string>, index: TreeNodeIndex) {\n\tconst expandedIds = new Set<string>();\n\n\tfor (const selectedId of selectedIds) {\n\t\tcollectExpandedIds(selectedId, index, expandedIds);\n\t}\n\n\treturn expandedIds;\n}\n\nfunction filterTreeNode(node: TreeSelectNode, normalizedQuery: string, expandedIds: Set<string>): TreeSelectNode | null {\n\tconst filteredChildren = (node.children ?? [])\n\t\t.map((childNode) => filterTreeNode(childNode, normalizedQuery, expandedIds))\n\t\t.filter((childNode): childNode is TreeSelectNode => Boolean(childNode));\n\tconst isMatched = node.searchText.toLowerCase().includes(normalizedQuery);\n\n\tif (!isMatched && filteredChildren.length === 0) {\n\t\treturn null;\n\t}\n\n\tif (filteredChildren.length > 0) {\n\t\texpandedIds.add(node.id);\n\t}\n\n\tif (filteredChildren.length === 0) {\n\t\treturn node;\n\t}\n\n\treturn {\n\t\t...node,\n\t\tchildren: filteredChildren\n\t};\n}\n\nexport function filterTreeNodes(nodes: readonly TreeSelectNode[], query: string) {\n\tconst normalizedQuery = query.trim().toLowerCase();\n\n\tif (!normalizedQuery) {\n\t\treturn {\n\t\t\tnodes: [...nodes],\n\t\t\texpandedIds: new Set<string>()\n\t\t};\n\t}\n\n\tconst expandedIds = new Set<string>();\n\tconst filteredNodes = nodes\n\t\t.map((node) => filterTreeNode(node, normalizedQuery, expandedIds))\n\t\t.filter((node): node is TreeSelectNode => Boolean(node));\n\n\treturn {\n\t\tnodes: filteredNodes,\n\t\texpandedIds\n\t};\n}\n\nexport function flattenVisibleTreeNodes(nodes: readonly TreeSelectNode[], expandedIds: Set<string>): TreeVisibleEntry[] {\n\tconst entries: TreeVisibleEntry[] = [];\n\n\tconst walk = (node: TreeSelectNode, level: number, parentId?: string) => {\n\t\tconst hasChildren = (node.children?.length ?? 0) > 0;\n\t\tconst isExpanded = hasChildren && expandedIds.has(node.id);\n\n\t\tentries.push({\n\t\t\tnode,\n\t\t\tlevel,\n\t\t\tparentId,\n\t\t\thasChildren,\n\t\t\tisExpanded,\n\t\t\tisLeaf: !hasChildren\n\t\t});\n\n\t\tif (!isExpanded) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const childNode of node.children ?? []) {\n\t\t\twalk(childNode, level + 1, node.id);\n\t\t}\n\t};\n\n\tfor (const node of nodes) {\n\t\twalk(node, 0);\n\t}\n\n\treturn entries;\n}\n","@use \"@/styles/mixins\" as *;\n\n// .uiOptionRow\n.treeRow {\n\tdisplay: flex;\n\talign-items: stretch;\n\tborder-radius: var(--radius-sm);\n\tcursor: pointer;\n\n\t&:focus {\n\t\t@include focusVisible;\n\n\t\tbackground-color: var(--surface-accent);\n\t\tborder-color: var(--border-1);\n\t\tcursor: pointer;\n\t}\n\n\t&:hover {\n\t\tbackground-color: var(--surface-accent);\n\t\tcursor: pointer;\n\t}\n}\n\n// .uiOptionRowSelected\n.treeRowSelected {\n\tbackground-color: var(--surface-2);\n\tcolor: var(--content-accent);\n\tcursor: default;\n}\n\n// .uiOptionRowActive\n.treeRowActive {\n\tbackground-color: var(--surface-1);\n}\n\n.treeNodeButton {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--space-xs);\n\twidth: 100%;\n\tpadding: var(--space-xs) var(--space-xs) var(--space-xs) 0;\n\tbackground: transparent;\n\ttext-align: left;\n\tborder-radius: var(--radius-sm);\n}\n\n.treeIndent {\n\tflex-shrink: 0;\n\twidth: calc(var(--tree-level) * 1em);\n}\n\n.treeExpander,\n.treeExpanderPlaceholder {\n\tflex-shrink: 0;\n\twidth: 1.5em;\n\theight: 1.5em;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.treeExpander {\n\tbackground: transparent;\n\tborder: none;\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-2);\n\n\t&:hover {\n\t\tcolor: var(--content-0);\n\t\tbackground-color: var(--surface-0);\n\t}\n}\n\n.treeExpanderIcon {\n\ttransition: transform var(--transition-fast) ease;\n}\n\n.treeExpanderIconExpanded {\n\ttransform: rotate(90deg);\n}\n\n.treeSelection {\n\tflex-shrink: 0;\n\twidth: 1em;\n\theight: 1em;\n\tborder: var(--border);\n\tborder-radius: var(--radius-xs);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground-color: var(--surface-0);\n\tcolor: transparent;\n}\n\n.treeSelectionChecked {\n\tbackground-color: var(--status-info-text);\n\tborder-color: var(--status-info-text);\n\tcolor: var(--white);\n\n\t// outline: 1px dashed rgb(255, 100, 141);\n\t// outline-offset: -1px;\n}\n\n.treeSelectionPartial {\n\tbackground-color: var(--surface-1);\n\tborder-color: var(--status-info-text);\n\tcolor: var(--status-info-text);\n}\n\n.treeSelectionIcon {\n\twidth: 0.75rem;\n\theight: 0.75rem;\n}\n\n.treeSummary {\n\tpadding-right: calc(var(--control-height) * 2);\n}\n\n.inputWithOverlay {\n\tcolor: transparent;\n\tcaret-color: transparent;\n}\n\n.valueOverlay {\n\tposition: absolute;\n\tinset: 0 calc(var(--control-height) * 2) 0 var(--space-md);\n\tdisplay: flex;\n\talign-items: center;\n\tpointer-events: none;\n\toverflow: hidden;\n}\n\n.treeActions {\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\theight: 100%;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.treeClearButton {\n\tcolor: var(--status-error-text);\n}\n","import { CSSProperties } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CheckIcon, ChevronRightIcon, MinusIcon } from \"lucide-react\";\n\nimport { SelectOptionContent } from \"../select/SelectOptionContent\";\n\nimport styles from \"./TreeSelect.module.scss\";\nimport { TreeSelectNode } from \"./types\";\n\ntype TreeNodeContentProps = {\n\tnode: TreeSelectNode;\n\tlevel: number;\n\thighlight?: string;\n\thasChildren: boolean;\n\tisExpanded: boolean;\n\tselected: boolean;\n\tpartial: boolean;\n\tselectionMode: \"single\" | \"multi\";\n\tonToggleExpand?: () => void;\n};\n\nexport function TreeNodeContent({\n\tnode,\n\tlevel,\n\thighlight,\n\thasChildren,\n\tisExpanded,\n\tselected,\n\tpartial,\n\tselectionMode,\n\tonToggleExpand\n}: TreeNodeContentProps) {\n\treturn (\n\t\t<>\n\t\t\t<span className={styles.treeIndent} style={{ \"--tree-level\": level } as CSSProperties} aria-hidden=\"true\" />\n\t\t\t{hasChildren ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.treeExpander}\n\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tonToggleExpand?.();\n\t\t\t\t\t}}\n\t\t\t\t\taria-label={isExpanded ? \"Свернуть ветку\" : \"Развернуть ветку\"}\n\t\t\t\t\tdata-ui=\"tree-select-expander\"\n\t\t\t\t\tdata-action={isExpanded ? \"collapse-tree-select-node\" : \"expand-tree-select-node\"}>\n\t\t\t\t\t<ChevronRightIcon className={cn(styles.treeExpanderIcon, isExpanded && styles.treeExpanderIconExpanded)} />\n\t\t\t\t</button>\n\t\t\t) : (\n\t\t\t\t<span className={styles.treeExpanderPlaceholder} aria-hidden=\"true\" />\n\t\t\t)}\n\n\t\t\t{selectionMode === \"multi\" && (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(styles.treeSelection, selected && styles.treeSelectionChecked, partial && styles.treeSelectionPartial)}\n\t\t\t\t\taria-hidden=\"true\">\n\t\t\t\t\t{selected ? (\n\t\t\t\t\t\t<CheckIcon className={styles.treeSelectionIcon} />\n\t\t\t\t\t) : partial ? (\n\t\t\t\t\t\t<MinusIcon className={styles.treeSelectionIcon} />\n\t\t\t\t\t) : null}\n\t\t\t\t</span>\n\t\t\t)}\n\n\t\t\t<SelectOptionContent label={node.label} code={node.code} highlight={highlight} />\n\t\t</>\n\t);\n}\n","import { ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { XIcon } from \"lucide-react\";\n\nimport { InputText } from \"../input\";\nimport {\n\tPickerField,\n\tPickerPopup,\n\tPickerStatus,\n\tPickerTriggerActions,\n\tPickerTriggerInput,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerTriggerController\n} from \"../picker\";\nimport { UiBaseProps } from \"../types\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport {\n\tcreateTreeNodeIndex,\n\tfilterTreeNodes,\n\tflattenVisibleTreeNodes,\n\tgetSelectionExpandedIds,\n\tTreeVisibleEntry\n} from \"./model/treeUtils\";\nimport { TreeNodeContent } from \"./TreeNodeContent\";\nimport styles from \"./TreeSelect.module.scss\";\nimport { TreeSelectNode } from \"./types\";\n\ntype TreePickerBaseProps = Omit<UiBaseProps<never>, \"value\" | \"onChange\"> & {\n\tnodes: readonly TreeSelectNode[];\n\tselectedIds: Set<string>;\n\tpartialIds: Set<string>;\n\tselectionMode: \"single\" | \"multi\";\n\ttriggerMode?: \"display\" | \"search\";\n\tselectedSummary?: ReactNode;\n\tselectedSummaryText?: string;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tonNodeActivate: (node: TreeSelectNode) => void;\n\tonClearSelection?: () => void;\n\tisLoading?: boolean;\n\terror?: string;\n};\n\nexport function TreePickerBase({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\tnodes,\n\tselectedIds,\n\tpartialIds,\n\tselectionMode,\n\ttriggerMode = \"display\",\n\tselectedSummary,\n\tselectedSummaryText,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\tonNodeActivate,\n\tonClearSelection,\n\tisLoading,\n\terror\n}: TreePickerBaseProps) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst previousOpenRef = useRef(false);\n\tconst [expandedIds, setExpandedIds] = useState<Set<string>>(() => new Set());\n\tconst resolvedTriggerMode = triggerMode === \"search\" ? \"search-single\" : \"display\";\n\tconst treeIndex = useMemo(() => createTreeNodeIndex(nodes), [nodes]);\n\tconst { query: currentQuery, setQuery } = usePickerQuery({\n\t\topen: true,\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQuery,\n\t\ttriggerMode: \"display\"\n\t});\n\tconst { nodes: filteredNodes, expandedIds: searchExpandedIds } = useMemo(\n\t\t() => filterTreeNodes(nodes, currentQuery),\n\t\t[nodes, currentQuery]\n\t);\n\tconst selectedExpandedIds = useMemo(() => getSelectionExpandedIds(selectedIds, treeIndex), [selectedIds, treeIndex]);\n\tconst resolvedExpandedIds = useMemo(\n\t\t() => new Set([...expandedIds, ...searchExpandedIds, ...selectedExpandedIds]),\n\t\t[expandedIds, searchExpandedIds, selectedExpandedIds]\n\t);\n\tconst visibleEntries = useMemo(() => flattenVisibleTreeNodes(filteredNodes, resolvedExpandedIds), [filteredNodes, resolvedExpandedIds]);\n\tconst selectedIndex = useMemo(() => visibleEntries.findIndex((entry) => selectedIds.has(entry.node.id)), [selectedIds, visibleEntries]);\n\tconst {\n\t\topen,\n\t\tactiveIndex,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference,\n\t\tsetFloating,\n\t\tsetOptionRef,\n\t\tclose,\n\t\topenList,\n\t\ttoggleOpen,\n\t\tselectOption,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t} = usePickerFloatingListbox({\n\t\toptions: visibleEntries,\n\t\tselectedIndex,\n\t\tonSelect: (entry) => onNodeActivate(entry.node),\n\t\tdisabled: disabled || isLoading,\n\t\tcloseOnSelect: selectionMode === \"single\",\n\t\tallowOpenWithoutOptions: true,\n\t\ttriggerMode: resolvedTriggerMode\n\t});\n\tconst hasSelection = selectedIds.size > 0;\n\tconst showTriggerQuery = triggerMode === \"search\" && (open || currentQuery.length > 0);\n\tconst triggerValue = showTriggerQuery ? currentQuery : (selectedSummaryText ?? \"\");\n\tconst showSummaryOverlay = triggerMode === \"display\" && Boolean(selectedSummary);\n\tconst triggerController = usePickerTriggerController({\n\t\tmode: resolvedTriggerMode,\n\t\topen,\n\t\tcurrentQuery,\n\t\thasDisplayValue: Boolean(selectedSummaryText),\n\t\tinputRef,\n\t\tsetQuery,\n\t\topenList,\n\t\tclose,\n\t\ttoggleOpen\n\t});\n\n\tuseEffect(() => {\n\t\tif (previousOpenRef.current && !open && triggerController.policy.resetQueryOnClose) {\n\t\t\tsetQuery(\"\");\n\t\t}\n\n\t\tpreviousOpenRef.current = open;\n\t}, [open, setQuery, triggerController.policy.resetQueryOnClose]);\n\n\tconst setInputNode = (node: HTMLInputElement | null) => {\n\t\tinputRef.current = node;\n\t};\n\tconst handleClearSelection = () => {\n\t\tonClearSelection?.();\n\t\tsetQuery(\"\");\n\t\tclose();\n\t};\n\n\tconst toggleExpand = (entry: TreeVisibleEntry) => {\n\t\tif (!entry.hasChildren) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetExpandedIds((currentExpandedIds) => {\n\t\t\tconst nextExpandedIds = new Set(currentExpandedIds);\n\n\t\t\tif (nextExpandedIds.has(entry.node.id)) {\n\t\t\t\tnextExpandedIds.delete(entry.node.id);\n\t\t\t} else {\n\t\t\t\tnextExpandedIds.add(entry.node.id);\n\t\t\t}\n\n\t\t\treturn nextExpandedIds;\n\t\t});\n\t};\n\n\treturn (\n\t\t<PickerField label={label} description={description} disabled={disabled} placeholder={placeholder} size={size}>\n\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\tconst listId = `${controlId}-listbox`;\n\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<PickerTriggerInput\n\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\tdisabled={disabled || isLoading}\n\t\t\t\t\t\t\treadOnly={triggerMode !== \"search\"}\n\t\t\t\t\t\t\tvalue={triggerMode === \"display\" && showSummaryOverlay ? \"\" : triggerValue}\n\t\t\t\t\t\t\tplaceholder={\n\t\t\t\t\t\t\t\ttriggerMode === \"search\"\n\t\t\t\t\t\t\t\t\t? !selectedSummaryText || showTriggerQuery\n\t\t\t\t\t\t\t\t\t\t? placeholder\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t: hasSelection\n\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t: placeholder\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\taria-autocomplete={triggerMode === \"search\" ? \"list\" : \"none\"}\n\t\t\t\t\t\t\taria-activedescendant={open && visibleEntries.length > 0 ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\tinputClassName={cn(hasSelection && styles.treeSummary, showSummaryOverlay && styles.inputWithOverlay)}\n\t\t\t\t\t\t\toverlay={showSummaryOverlay ? <div className={styles.valueOverlay}>{selectedSummary}</div> : undefined}\n\t\t\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t\t\t<PickerTriggerActions\n\t\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\t\tdisabled={disabled || isLoading}\n\t\t\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}>\n\t\t\t\t\t\t\t\t\t{hasSelection && onClearSelection ? (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={styles.treeClearButton}\n\t\t\t\t\t\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\thandleClearSelection();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Очистить выбор\">\n\t\t\t\t\t\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</PickerTriggerActions>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\tif (triggerMode !== \"search\") {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\tonActivateWhenOpen: () => {\n\t\t\t\t\t\t\t\t\t\tconst activeEntry = activeIndex >= 0 ? visibleEntries[activeIndex] : undefined;\n\t\t\t\t\t\t\t\t\t\tif (activeEntry) {\n\t\t\t\t\t\t\t\t\t\t\tselectOption(activeEntry);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tenableSpaceActivation: triggerMode === \"display\"\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\tactiveOptionId={visibleEntries.length > 0 ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\tclassName={cn(uiStyles.uiPopupOptions, \"scrollable\")}\n\t\t\t\t\t\t\theader={\n\t\t\t\t\t\t\t\ttriggerMode === \"display\" ? (\n\t\t\t\t\t\t\t\t\t<InputText\n\t\t\t\t\t\t\t\t\t\tvalue={currentQuery}\n\t\t\t\t\t\t\t\t\t\tonChange={setQuery}\n\t\t\t\t\t\t\t\t\t\tonClear={() => setQuery(\"\")}\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Поиск по дереву\"\n\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\tif (event.key !== \"Escape\" && event.key !== \"Tab\") {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t<div className=\"\">\n\t\t\t\t\t\t\t\t{visibleEntries.length === 0 ? (\n\t\t\t\t\t\t\t\t\t<PickerStatus\n\t\t\t\t\t\t\t\t\t\terrorState={error}\n\t\t\t\t\t\t\t\t\t\tloadingState={isLoading ? \"Загрузка...\" : undefined}\n\t\t\t\t\t\t\t\t\t\temptyState={!error && !isLoading ? \"Нет данных\" : undefined}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tvisibleEntries.map((entry, index) => {\n\t\t\t\t\t\t\t\t\t\tconst selected = selectedIds.has(entry.node.id);\n\t\t\t\t\t\t\t\t\t\tconst partial = !selected && partialIds.has(entry.node.id);\n\t\t\t\t\t\t\t\t\t\tconst active = index === activeIndex;\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={entry.node.id}\n\t\t\t\t\t\t\t\t\t\t\t\tid={getOptionId(listId, index)}\n\t\t\t\t\t\t\t\t\t\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\t\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-selected={selected}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.treeRow,\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive && styles.treeRowActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected && styles.treeRowSelected\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => selectOption(entry)}>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className={styles.treeNodeButton}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TreeNodeContent\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnode={entry.node}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlevel={entry.level}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thighlight={currentQuery}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thasChildren={entry.hasChildren}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisExpanded={entry.isExpanded}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselected={selected}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpartial={partial}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonToggleExpand={() => toggleExpand(entry)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}}\n\t\t</PickerField>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TreePickerBase-ClXn2q3u.js","names":[],"sources":["../../src/tree-select/model/treeUtils.ts","../../src/tree-select/TreeSelect.module.scss","../../src/tree-select/TreeNodeContent.tsx","../../src/tree-select/TreePickerBase.tsx"],"sourcesContent":["import { TreeMultiSelectValue, TreeSelectNode, TreeSelectValue } from \"../types\";\n\nexport type TreeNodeIndex = {\n\trootIds: string[];\n\tnodeById: Map<string, TreeSelectNode>;\n\tparentById: Map<string, string | undefined>;\n\tchildrenById: Map<string, string[]>;\n\tpreorderIndexById: Map<string, number>;\n\tnodeIdByCodeValue: Map<string, string>;\n};\n\nexport type TreeNodeSelectionState = {\n\tselectedIds: Set<string>;\n\tpartialIds: Set<string>;\n};\n\nexport type TreeVisibleEntry = {\n\tnode: TreeSelectNode;\n\tlevel: number;\n\tparentId?: string;\n\thasChildren: boolean;\n\tisExpanded: boolean;\n\tisLeaf: boolean;\n};\n\nfunction makeCodeValueKey(codeKey: string, value: string) {\n\treturn `${codeKey}::${value}`;\n}\n\nexport function createTreeNodeIndex(nodes: readonly TreeSelectNode[]): TreeNodeIndex {\n\tconst nodeById = new Map<string, TreeSelectNode>();\n\tconst parentById = new Map<string, string | undefined>();\n\tconst childrenById = new Map<string, string[]>();\n\tconst preorderIndexById = new Map<string, number>();\n\tconst nodeIdByCodeValue = new Map<string, string>();\n\tlet preorderIndex = 0;\n\n\tconst walk = (node: TreeSelectNode, parentId?: string) => {\n\t\tnodeById.set(node.id, node);\n\t\tparentById.set(node.id, parentId);\n\t\tpreorderIndexById.set(node.id, preorderIndex++);\n\t\tnodeIdByCodeValue.set(makeCodeValueKey(node.codeKey, node.value), node.id);\n\n\t\tconst childIds = (node.children ?? []).map((child) => child.id);\n\t\tchildrenById.set(node.id, childIds);\n\n\t\tfor (const child of node.children ?? []) {\n\t\t\twalk(child, node.id);\n\t\t}\n\t};\n\n\tfor (const node of nodes) {\n\t\twalk(node);\n\t}\n\n\treturn {\n\t\trootIds: nodes.map((node) => node.id),\n\t\tnodeById,\n\t\tparentById,\n\t\tchildrenById,\n\t\tpreorderIndexById,\n\t\tnodeIdByCodeValue\n\t};\n}\n\nexport function treeSelectValueToId(value: TreeSelectValue | undefined, index: TreeNodeIndex) {\n\tif (!value) return undefined;\n\treturn index.nodeIdByCodeValue.get(makeCodeValueKey(value.codeKey, value.value));\n}\n\nexport function treeMultiValueToSelectedIds(value: TreeMultiSelectValue | undefined, index: TreeNodeIndex) {\n\tconst selectedIds = new Set<string>();\n\n\tif (!value) {\n\t\treturn selectedIds;\n\t}\n\n\tfor (const [codeKey, values] of Object.entries(value)) {\n\t\tfor (const itemValue of values) {\n\t\t\tconst nodeId = index.nodeIdByCodeValue.get(makeCodeValueKey(codeKey, itemValue));\n\t\t\tif (nodeId) {\n\t\t\t\tselectedIds.add(nodeId);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn canonicalizeTreeSelection(selectedIds, index);\n}\n\nexport function treeSelectedIdsToMultiValue(selectedIds: Set<string>, index: TreeNodeIndex): TreeMultiSelectValue {\n\tconst orderedIds = [...selectedIds].sort(\n\t\t(leftId, rightId) =>\n\t\t\t(index.preorderIndexById.get(leftId) ?? Number.MAX_SAFE_INTEGER) -\n\t\t\t(index.preorderIndexById.get(rightId) ?? Number.MAX_SAFE_INTEGER)\n\t);\n\tconst result: TreeMultiSelectValue = {};\n\n\tfor (const nodeId of orderedIds) {\n\t\tconst node = index.nodeById.get(nodeId);\n\t\tif (!node) continue;\n\n\t\tresult[node.codeKey] = result[node.codeKey] ?? [];\n\t\tresult[node.codeKey].push(node.value);\n\t}\n\n\treturn result;\n}\n\nexport function treeSelectValueToMultiValue(value: TreeSelectValue | undefined): TreeMultiSelectValue {\n\tif (!value) {\n\t\treturn {};\n\t}\n\n\treturn {\n\t\t[value.codeKey]: [value.value]\n\t};\n}\n\nfunction getAncestorIds(nodeId: string, index: TreeNodeIndex) {\n\tconst ancestors: string[] = [];\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\tancestors.push(currentId);\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n\n\treturn ancestors;\n}\n\nfunction isDescendantOf(nodeId: string, ancestorId: string, index: TreeNodeIndex) {\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\tif (currentId === ancestorId) {\n\t\t\treturn true;\n\t\t}\n\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n\n\treturn false;\n}\n\nfunction removeDescendantSelections(selectedIds: Set<string>, nodeId: string, index: TreeNodeIndex) {\n\tfor (const selectedId of [...selectedIds]) {\n\t\tif (isDescendantOf(selectedId, nodeId, index)) {\n\t\t\tselectedIds.delete(selectedId);\n\t\t}\n\t}\n}\n\nfunction isNodeFullySelected(nodeId: string, selectedIds: Set<string>, index: TreeNodeIndex): boolean {\n\tif (selectedIds.has(nodeId)) {\n\t\treturn true;\n\t}\n\n\tconst children = index.childrenById.get(nodeId) ?? [];\n\tif (children.length === 0) {\n\t\treturn false;\n\t}\n\n\treturn children.every((childId) => isNodeFullySelected(childId, selectedIds, index));\n}\n\nexport function canonicalizeTreeSelection(selectedIds: Set<string>, index: TreeNodeIndex) {\n\tconst nextSelectedIds = new Set(selectedIds);\n\n\tfor (const selectedId of [...nextSelectedIds]) {\n\t\tif (getAncestorIds(selectedId, index).some((ancestorId) => nextSelectedIds.has(ancestorId))) {\n\t\t\tnextSelectedIds.delete(selectedId);\n\t\t}\n\t}\n\n\tconst orderedNodeIds = [...index.nodeById.keys()].sort(\n\t\t(leftId, rightId) => (index.preorderIndexById.get(rightId) ?? 0) - (index.preorderIndexById.get(leftId) ?? 0)\n\t);\n\n\tfor (const nodeId of orderedNodeIds) {\n\t\tconst children = index.childrenById.get(nodeId) ?? [];\n\n\t\tif (children.length === 0 || nextSelectedIds.has(nodeId)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (children.every((childId) => isNodeFullySelected(childId, nextSelectedIds, index))) {\n\t\t\tremoveDescendantSelections(nextSelectedIds, nodeId, index);\n\t\t\tnextSelectedIds.add(nodeId);\n\t\t}\n\t}\n\n\treturn nextSelectedIds;\n}\n\nfunction expandNearestSelectedAncestor(selectedIds: Set<string>, nodeId: string, index: TreeNodeIndex) {\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\tif (selectedIds.has(currentId)) {\n\t\t\tselectedIds.delete(currentId);\n\n\t\t\tfor (const childId of index.childrenById.get(currentId) ?? []) {\n\t\t\t\tselectedIds.add(childId);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n\n\treturn false;\n}\n\nexport function isTreeNodeSelected(nodeId: string, selectedIds: Set<string>, index: TreeNodeIndex): boolean {\n\tif (selectedIds.has(nodeId)) {\n\t\treturn true;\n\t}\n\n\treturn getAncestorIds(nodeId, index).some((ancestorId) => selectedIds.has(ancestorId));\n}\n\nfunction resolveTreeSelectionState(nodeId: string, selectedIds: Set<string>, index: TreeNodeIndex, state: TreeNodeSelectionState) {\n\tconst children = index.childrenById.get(nodeId) ?? [];\n\n\tif (selectedIds.has(nodeId)) {\n\t\tstate.selectedIds.add(nodeId);\n\t\treturn { selected: true, partial: false };\n\t}\n\n\tif (children.length === 0) {\n\t\treturn { selected: false, partial: false };\n\t}\n\n\tconst childStates = children.map((childId) => resolveTreeSelectionState(childId, selectedIds, index, state));\n\tconst allSelected = childStates.every((childState) => childState.selected && !childState.partial);\n\tconst hasAnySelected = childStates.some((childState) => childState.selected || childState.partial);\n\n\tif (allSelected) {\n\t\tstate.selectedIds.add(nodeId);\n\t\treturn { selected: true, partial: false };\n\t}\n\n\tif (hasAnySelected) {\n\t\tstate.partialIds.add(nodeId);\n\t\treturn { selected: false, partial: true };\n\t}\n\n\treturn { selected: false, partial: false };\n}\n\nexport function getTreeNodeSelectionState(selectedIds: Set<string>, index: TreeNodeIndex): TreeNodeSelectionState {\n\tconst state: TreeNodeSelectionState = {\n\t\tselectedIds: new Set(),\n\t\tpartialIds: new Set()\n\t};\n\n\tfor (const rootId of index.rootIds) {\n\t\tresolveTreeSelectionState(rootId, selectedIds, index, state);\n\t}\n\n\treturn state;\n}\n\nexport function toggleTreeMultiSelection(currentValue: TreeMultiSelectValue | undefined, targetNodeId: string, index: TreeNodeIndex) {\n\tconst selectedIds = treeMultiValueToSelectedIds(currentValue, index);\n\n\tconst toggle = (targetId: string) => {\n\t\tif (isTreeNodeSelected(targetId, selectedIds, index)) {\n\t\t\tif (selectedIds.has(targetId)) {\n\t\t\t\tselectedIds.delete(targetId);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (expandNearestSelectedAncestor(selectedIds, targetId, index)) {\n\t\t\t\ttoggle(targetId);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tremoveDescendantSelections(selectedIds, targetId, index);\n\t\tselectedIds.add(targetId);\n\t};\n\n\ttoggle(targetNodeId);\n\n\treturn treeSelectedIdsToMultiValue(canonicalizeTreeSelection(selectedIds, index), index);\n}\n\nfunction collectExpandedIds(nodeId: string, index: TreeNodeIndex, expandedIds: Set<string>) {\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\texpandedIds.add(currentId);\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n}\n\nexport function getSelectionExpandedIds(selectedIds: Set<string>, index: TreeNodeIndex) {\n\tconst expandedIds = new Set<string>();\n\n\tfor (const selectedId of selectedIds) {\n\t\tcollectExpandedIds(selectedId, index, expandedIds);\n\t}\n\n\treturn expandedIds;\n}\n\nfunction filterTreeNode(node: TreeSelectNode, normalizedQuery: string, expandedIds: Set<string>): TreeSelectNode | null {\n\tconst filteredChildren = (node.children ?? [])\n\t\t.map((childNode) => filterTreeNode(childNode, normalizedQuery, expandedIds))\n\t\t.filter((childNode): childNode is TreeSelectNode => Boolean(childNode));\n\tconst isMatched = node.searchText.toLowerCase().includes(normalizedQuery);\n\n\tif (!isMatched && filteredChildren.length === 0) {\n\t\treturn null;\n\t}\n\n\tif (filteredChildren.length > 0) {\n\t\texpandedIds.add(node.id);\n\t}\n\n\tif (filteredChildren.length === 0) {\n\t\treturn node;\n\t}\n\n\treturn {\n\t\t...node,\n\t\tchildren: filteredChildren\n\t};\n}\n\nexport function filterTreeNodes(nodes: readonly TreeSelectNode[], query: string) {\n\tconst normalizedQuery = query.trim().toLowerCase();\n\n\tif (!normalizedQuery) {\n\t\treturn {\n\t\t\tnodes: [...nodes],\n\t\t\texpandedIds: new Set<string>()\n\t\t};\n\t}\n\n\tconst expandedIds = new Set<string>();\n\tconst filteredNodes = nodes\n\t\t.map((node) => filterTreeNode(node, normalizedQuery, expandedIds))\n\t\t.filter((node): node is TreeSelectNode => Boolean(node));\n\n\treturn {\n\t\tnodes: filteredNodes,\n\t\texpandedIds\n\t};\n}\n\nexport function flattenVisibleTreeNodes(nodes: readonly TreeSelectNode[], expandedIds: Set<string>): TreeVisibleEntry[] {\n\tconst entries: TreeVisibleEntry[] = [];\n\n\tconst walk = (node: TreeSelectNode, level: number, parentId?: string) => {\n\t\tconst hasChildren = (node.children?.length ?? 0) > 0;\n\t\tconst isExpanded = hasChildren && expandedIds.has(node.id);\n\n\t\tentries.push({\n\t\t\tnode,\n\t\t\tlevel,\n\t\t\tparentId,\n\t\t\thasChildren,\n\t\t\tisExpanded,\n\t\t\tisLeaf: !hasChildren\n\t\t});\n\n\t\tif (!isExpanded) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const childNode of node.children ?? []) {\n\t\t\twalk(childNode, level + 1, node.id);\n\t\t}\n\t};\n\n\tfor (const node of nodes) {\n\t\twalk(node, 0);\n\t}\n\n\treturn entries;\n}\n","@use \"@/styles/mixins\" as *;\n\n// .uiOptionRow\n.treeRow {\n\tdisplay: flex;\n\talign-items: stretch;\n\tborder-radius: var(--radius-sm);\n\tcursor: pointer;\n\n\t&:focus {\n\t\t@include focusVisible;\n\n\t\tbackground-color: var(--surface-accent);\n\t\tborder-color: var(--border-1);\n\t\tcursor: pointer;\n\t}\n\n\t&:hover {\n\t\tbackground-color: var(--surface-accent);\n\t\tcursor: pointer;\n\t}\n}\n\n// .uiOptionRowSelected\n.treeRowSelected {\n\tbackground-color: var(--surface-2);\n\tcolor: var(--content-accent);\n\tcursor: default;\n}\n\n// .uiOptionRowActive\n.treeRowActive {\n\tbackground-color: var(--surface-1);\n}\n\n.treeNodeButton {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--space-xs);\n\twidth: 100%;\n\tpadding: var(--space-xs) var(--space-xs) var(--space-xs) 0;\n\tbackground: transparent;\n\ttext-align: left;\n\tborder-radius: var(--radius-sm);\n}\n\n.treeIndent {\n\tflex-shrink: 0;\n\twidth: calc(var(--tree-level) * 1em);\n}\n\n.treeExpander,\n.treeExpanderPlaceholder {\n\tflex-shrink: 0;\n\twidth: 1.5em;\n\theight: 1.5em;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.treeExpander {\n\tbackground: transparent;\n\tborder: none;\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-2);\n\n\t&:hover {\n\t\tcolor: var(--content-0);\n\t\tbackground-color: var(--surface-0);\n\t}\n}\n\n.treeExpanderIcon {\n\ttransition: transform var(--transition-fast) ease;\n}\n\n.treeExpanderIconExpanded {\n\ttransform: rotate(90deg);\n}\n\n.treeSelection {\n\tflex-shrink: 0;\n\twidth: 1em;\n\theight: 1em;\n\tborder: var(--border);\n\tborder-radius: var(--radius-xs);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground-color: var(--surface-0);\n\tcolor: transparent;\n}\n\n.treeSelectionChecked {\n\tbackground-color: var(--status-info-text);\n\tborder-color: var(--status-info-text);\n\tcolor: var(--white);\n\n\t// outline: 1px dashed rgb(255, 100, 141);\n\t// outline-offset: -1px;\n}\n\n.treeSelectionPartial {\n\tbackground-color: var(--surface-1);\n\tborder-color: var(--status-info-text);\n\tcolor: var(--status-info-text);\n}\n\n.treeSelectionIcon {\n\twidth: 0.75rem;\n\theight: 0.75rem;\n}\n\n.treeSummary {\n\tpadding-right: calc(var(--control-height) * 2);\n}\n\n.inputWithOverlay {\n\tcolor: transparent;\n\tcaret-color: transparent;\n}\n\n.valueOverlay {\n\tposition: absolute;\n\tinset: 0 calc(var(--control-height) * 2) 0 var(--space-md);\n\tdisplay: flex;\n\talign-items: center;\n\tpointer-events: none;\n\toverflow: hidden;\n}\n\n.treeActions {\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\theight: 100%;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.treeClearButton {\n\tcolor: var(--status-error-text);\n}\n","import { CSSProperties } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CheckIcon, ChevronRightIcon, MinusIcon } from \"lucide-react\";\n\nimport { SelectOptionContent } from \"../select/SelectOptionContent\";\n\nimport styles from \"./TreeSelect.module.scss\";\nimport { TreeSelectNode } from \"./types\";\n\ntype TreeNodeContentProps = {\n\tnode: TreeSelectNode;\n\tlevel: number;\n\thighlight?: string;\n\thasChildren: boolean;\n\tisExpanded: boolean;\n\tselected: boolean;\n\tpartial: boolean;\n\tselectionMode: \"single\" | \"multi\";\n\tonToggleExpand?: () => void;\n};\n\nexport function TreeNodeContent({\n\tnode,\n\tlevel,\n\thighlight,\n\thasChildren,\n\tisExpanded,\n\tselected,\n\tpartial,\n\tselectionMode,\n\tonToggleExpand\n}: TreeNodeContentProps) {\n\treturn (\n\t\t<>\n\t\t\t<span className={styles.treeIndent} style={{ \"--tree-level\": level } as CSSProperties} aria-hidden=\"true\" />\n\t\t\t{hasChildren ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.treeExpander}\n\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tonToggleExpand?.();\n\t\t\t\t\t}}\n\t\t\t\t\taria-label={isExpanded ? \"Свернуть ветку\" : \"Развернуть ветку\"}\n\t\t\t\t\tdata-ui=\"tree-select-expander\"\n\t\t\t\t\tdata-action={isExpanded ? \"collapse-tree-select-node\" : \"expand-tree-select-node\"}>\n\t\t\t\t\t<ChevronRightIcon className={cn(styles.treeExpanderIcon, isExpanded && styles.treeExpanderIconExpanded)} />\n\t\t\t\t</button>\n\t\t\t) : (\n\t\t\t\t<span className={styles.treeExpanderPlaceholder} aria-hidden=\"true\" />\n\t\t\t)}\n\n\t\t\t{selectionMode === \"multi\" && (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(styles.treeSelection, selected && styles.treeSelectionChecked, partial && styles.treeSelectionPartial)}\n\t\t\t\t\taria-hidden=\"true\">\n\t\t\t\t\t{selected ? (\n\t\t\t\t\t\t<CheckIcon className={styles.treeSelectionIcon} />\n\t\t\t\t\t) : partial ? (\n\t\t\t\t\t\t<MinusIcon className={styles.treeSelectionIcon} />\n\t\t\t\t\t) : null}\n\t\t\t\t</span>\n\t\t\t)}\n\n\t\t\t<SelectOptionContent label={node.label} code={node.code} highlight={highlight} />\n\t\t</>\n\t);\n}\n","import { ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { XIcon } from \"lucide-react\";\n\nimport { InputText } from \"../input\";\nimport {\n\tPickerField,\n\tPickerPopup,\n\tPickerStatus,\n\tPickerTriggerActions,\n\tPickerTriggerInput,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerTriggerController\n} from \"../picker\";\nimport { UiBaseProps } from \"../types\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport {\n\tcreateTreeNodeIndex,\n\tfilterTreeNodes,\n\tflattenVisibleTreeNodes,\n\tgetSelectionExpandedIds,\n\tTreeVisibleEntry\n} from \"./model/treeUtils\";\nimport { TreeNodeContent } from \"./TreeNodeContent\";\nimport styles from \"./TreeSelect.module.scss\";\nimport { TreeSelectNode } from \"./types\";\n\ntype TreePickerBaseProps = Omit<UiBaseProps<never>, \"value\" | \"onChange\"> & {\n\tnodes: readonly TreeSelectNode[];\n\tselectedIds: Set<string>;\n\tpartialIds: Set<string>;\n\tselectionMode: \"single\" | \"multi\";\n\ttriggerMode?: \"display\" | \"search\";\n\tselectedSummary?: ReactNode;\n\tselectedSummaryText?: string;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tonNodeActivate: (node: TreeSelectNode) => void;\n\tonClearSelection?: () => void;\n\tisLoading?: boolean;\n\terror?: string;\n};\n\nexport function TreePickerBase({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\tnodes,\n\tselectedIds,\n\tpartialIds,\n\tselectionMode,\n\ttriggerMode = \"display\",\n\tselectedSummary,\n\tselectedSummaryText,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\tonNodeActivate,\n\tonClearSelection,\n\tisLoading,\n\terror\n}: TreePickerBaseProps) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst previousOpenRef = useRef(false);\n\tconst [expandedIds, setExpandedIds] = useState<Set<string>>(() => new Set());\n\tconst resolvedTriggerMode = triggerMode === \"search\" ? \"search-single\" : \"display\";\n\tconst treeIndex = useMemo(() => createTreeNodeIndex(nodes), [nodes]);\n\tconst { query: currentQuery, setQuery } = usePickerQuery({\n\t\topen: true,\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQuery,\n\t\ttriggerMode: \"display\"\n\t});\n\tconst { nodes: filteredNodes, expandedIds: searchExpandedIds } = useMemo(\n\t\t() => filterTreeNodes(nodes, currentQuery),\n\t\t[nodes, currentQuery]\n\t);\n\tconst selectedExpandedIds = useMemo(() => getSelectionExpandedIds(selectedIds, treeIndex), [selectedIds, treeIndex]);\n\tconst resolvedExpandedIds = useMemo(\n\t\t() => new Set([...expandedIds, ...searchExpandedIds, ...selectedExpandedIds]),\n\t\t[expandedIds, searchExpandedIds, selectedExpandedIds]\n\t);\n\tconst visibleEntries = useMemo(() => flattenVisibleTreeNodes(filteredNodes, resolvedExpandedIds), [filteredNodes, resolvedExpandedIds]);\n\tconst selectedIndex = useMemo(() => visibleEntries.findIndex((entry) => selectedIds.has(entry.node.id)), [selectedIds, visibleEntries]);\n\tconst {\n\t\topen,\n\t\tactiveIndex,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference,\n\t\tsetFloating,\n\t\tsetOptionRef,\n\t\tclose,\n\t\topenList,\n\t\ttoggleOpen,\n\t\tselectOption,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t} = usePickerFloatingListbox({\n\t\toptions: visibleEntries,\n\t\tselectedIndex,\n\t\tonSelect: (entry) => onNodeActivate(entry.node),\n\t\tdisabled: disabled || isLoading,\n\t\tcloseOnSelect: selectionMode === \"single\",\n\t\tallowOpenWithoutOptions: true,\n\t\ttriggerMode: resolvedTriggerMode\n\t});\n\tconst hasSelection = selectedIds.size > 0;\n\tconst showTriggerQuery = triggerMode === \"search\" && (open || currentQuery.length > 0);\n\tconst triggerValue = showTriggerQuery ? currentQuery : (selectedSummaryText ?? \"\");\n\tconst showSummaryOverlay = triggerMode === \"display\" && Boolean(selectedSummary);\n\tconst triggerController = usePickerTriggerController({\n\t\tmode: resolvedTriggerMode,\n\t\topen,\n\t\tcurrentQuery,\n\t\thasDisplayValue: Boolean(selectedSummaryText),\n\t\tinputRef,\n\t\tsetQuery,\n\t\topenList,\n\t\tclose,\n\t\ttoggleOpen\n\t});\n\n\tuseEffect(() => {\n\t\tif (previousOpenRef.current && !open && triggerController.policy.resetQueryOnClose) {\n\t\t\tsetQuery(\"\");\n\t\t}\n\n\t\tpreviousOpenRef.current = open;\n\t}, [open, setQuery, triggerController.policy.resetQueryOnClose]);\n\n\tconst setInputNode = (node: HTMLInputElement | null) => {\n\t\tinputRef.current = node;\n\t};\n\tconst handleClearSelection = () => {\n\t\tonClearSelection?.();\n\t\tsetQuery(\"\");\n\t\tclose();\n\t};\n\n\tconst toggleExpand = (entry: TreeVisibleEntry) => {\n\t\tif (!entry.hasChildren) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetExpandedIds((currentExpandedIds) => {\n\t\t\tconst nextExpandedIds = new Set(currentExpandedIds);\n\n\t\t\tif (nextExpandedIds.has(entry.node.id)) {\n\t\t\t\tnextExpandedIds.delete(entry.node.id);\n\t\t\t} else {\n\t\t\t\tnextExpandedIds.add(entry.node.id);\n\t\t\t}\n\n\t\t\treturn nextExpandedIds;\n\t\t});\n\t};\n\n\treturn (\n\t\t<PickerField label={label} description={description} disabled={disabled} placeholder={placeholder} size={size}>\n\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\tconst listId = `${controlId}-listbox`;\n\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<PickerTriggerInput\n\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\tdisabled={disabled || isLoading}\n\t\t\t\t\t\t\treadOnly={triggerMode !== \"search\"}\n\t\t\t\t\t\t\tvalue={triggerMode === \"display\" && showSummaryOverlay ? \"\" : triggerValue}\n\t\t\t\t\t\t\tplaceholder={\n\t\t\t\t\t\t\t\ttriggerMode === \"search\"\n\t\t\t\t\t\t\t\t\t? !selectedSummaryText || showTriggerQuery\n\t\t\t\t\t\t\t\t\t\t? placeholder\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t: hasSelection\n\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t: placeholder\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\taria-autocomplete={triggerMode === \"search\" ? \"list\" : \"none\"}\n\t\t\t\t\t\t\taria-activedescendant={open && visibleEntries.length > 0 ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\tinputClassName={cn(hasSelection && styles.treeSummary, showSummaryOverlay && styles.inputWithOverlay)}\n\t\t\t\t\t\t\toverlay={showSummaryOverlay ? <div className={styles.valueOverlay}>{selectedSummary}</div> : undefined}\n\t\t\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t\t\t<PickerTriggerActions\n\t\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\t\tdisabled={disabled || isLoading}\n\t\t\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}>\n\t\t\t\t\t\t\t\t\t{hasSelection && onClearSelection ? (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={styles.treeClearButton}\n\t\t\t\t\t\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\thandleClearSelection();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Очистить выбор\">\n\t\t\t\t\t\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</PickerTriggerActions>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\tif (triggerMode !== \"search\") {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\tonActivateWhenOpen: () => {\n\t\t\t\t\t\t\t\t\t\tconst activeEntry = activeIndex >= 0 ? visibleEntries[activeIndex] : undefined;\n\t\t\t\t\t\t\t\t\t\tif (activeEntry) {\n\t\t\t\t\t\t\t\t\t\t\tselectOption(activeEntry);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tenableSpaceActivation: triggerMode === \"display\"\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\tactiveOptionId={visibleEntries.length > 0 ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\tclassName={cn(uiStyles.uiPopupOptions, \"scrollable\")}\n\t\t\t\t\t\t\theader={\n\t\t\t\t\t\t\t\ttriggerMode === \"display\" ? (\n\t\t\t\t\t\t\t\t\t<InputText\n\t\t\t\t\t\t\t\t\t\tvalue={currentQuery}\n\t\t\t\t\t\t\t\t\t\tonChange={setQuery}\n\t\t\t\t\t\t\t\t\t\tonClear={() => setQuery(\"\")}\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Поиск по дереву\"\n\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\tif (event.key !== \"Escape\" && event.key !== \"Tab\") {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t<div className=\"\">\n\t\t\t\t\t\t\t\t{visibleEntries.length === 0 ? (\n\t\t\t\t\t\t\t\t\t<PickerStatus\n\t\t\t\t\t\t\t\t\t\terrorState={error}\n\t\t\t\t\t\t\t\t\t\tloadingState={isLoading ? \"Загрузка...\" : undefined}\n\t\t\t\t\t\t\t\t\t\temptyState={!error && !isLoading ? \"Нет данных\" : undefined}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tvisibleEntries.map((entry, index) => {\n\t\t\t\t\t\t\t\t\t\tconst selected = selectedIds.has(entry.node.id);\n\t\t\t\t\t\t\t\t\t\tconst partial = !selected && partialIds.has(entry.node.id);\n\t\t\t\t\t\t\t\t\t\tconst active = index === activeIndex;\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={entry.node.id}\n\t\t\t\t\t\t\t\t\t\t\t\tid={getOptionId(listId, index)}\n\t\t\t\t\t\t\t\t\t\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\t\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-selected={selected}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.treeRow,\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive && styles.treeRowActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected && styles.treeRowSelected\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => selectOption(entry)}>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className={styles.treeNodeButton}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TreeNodeContent\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnode={entry.node}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlevel={entry.level}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thighlight={currentQuery}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thasChildren={entry.hasChildren}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisExpanded={entry.isExpanded}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselected={selected}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpartial={partial}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonToggleExpand={() => toggleExpand(entry)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}}\n\t\t</PickerField>\n\t);\n}\n"],"mappings":";;;;;;;;;AAyBA,SAAS,EAAiB,GAAiB,GAAe;CACzD,OAAO,GAAG,EAAQ,IAAI;AACvB;AAEA,SAAgB,EAAoB,GAAiD;CACpF,IAAM,oBAAW,IAAI,IAA4B,GAC3C,oBAAa,IAAI,IAAgC,GACjD,oBAAe,IAAI,IAAsB,GACzC,oBAAoB,IAAI,IAAoB,GAC5C,oBAAoB,IAAI,IAAoB,GAC9C,IAAgB,GAEd,KAAQ,GAAsB,MAAsB;EAIzD,AAHA,EAAS,IAAI,EAAK,IAAI,CAAI,GAC1B,EAAW,IAAI,EAAK,IAAI,CAAQ,GAChC,EAAkB,IAAI,EAAK,IAAI,GAAe,GAC9C,EAAkB,IAAI,EAAiB,EAAK,SAAS,EAAK,KAAK,GAAG,EAAK,EAAE;EAEzE,IAAM,KAAY,EAAK,YAAY,CAAC,EAAA,CAAG,KAAK,MAAU,EAAM,EAAE;EAC9D,EAAa,IAAI,EAAK,IAAI,CAAQ;EAElC,KAAK,IAAM,KAAS,EAAK,YAAY,CAAC,GACrC,EAAK,GAAO,EAAK,EAAE;CAErB;CAEA,KAAK,IAAM,KAAQ,GAClB,EAAK,CAAI;CAGV,OAAO;EACN,SAAS,EAAM,KAAK,MAAS,EAAK,EAAE;EACpC;EACA;EACA;EACA;EACA;CACD;AACD;AAEA,SAAgB,EAAoB,GAAoC,GAAsB;CACxF,OACL,OAAO,EAAM,kBAAkB,IAAI,EAAiB,EAAM,SAAS,EAAM,KAAK,CAAC;AAChF;AAEA,SAAgB,EAA4B,GAAyC,GAAsB;CAC1G,IAAM,oBAAc,IAAI,IAAY;CAEpC,IAAI,CAAC,GACJ,OAAO;CAGR,KAAK,IAAM,CAAC,GAAS,MAAW,OAAO,QAAQ,CAAK,GACnD,KAAK,IAAM,KAAa,GAAQ;EAC/B,IAAM,IAAS,EAAM,kBAAkB,IAAI,EAAiB,GAAS,CAAS,CAAC;EAC/E,AAAI,KACH,EAAY,IAAI,CAAM;CAExB;CAGD,OAAO,EAA0B,GAAa,CAAK;AACpD;AAEA,SAAgB,EAA4B,GAA0B,GAA4C;CACjH,IAAM,IAAa,CAAC,GAAG,CAAW,CAAC,CAAC,MAClC,GAAQ,OACP,EAAM,kBAAkB,IAAI,CAAM,qBAClC,EAAM,kBAAkB,IAAI,CAAO,iBACtC,GACM,IAA+B,CAAC;CAEtC,KAAK,IAAM,KAAU,GAAY;EAChC,IAAM,IAAO,EAAM,SAAS,IAAI,CAAM;EACjC,MAEL,EAAO,EAAK,WAAW,EAAO,EAAK,YAAY,CAAC,GAChD,EAAO,EAAK,QAAQ,CAAC,KAAK,EAAK,KAAK;CACrC;CAEA,OAAO;AACR;AAYA,SAAS,EAAe,GAAgB,GAAsB;CAC7D,IAAM,IAAsB,CAAC,GACzB,IAAY,EAAM,WAAW,IAAI,CAAM;CAE3C,OAAO,IAEN,AADA,EAAU,KAAK,CAAS,GACxB,IAAY,EAAM,WAAW,IAAI,CAAS;CAG3C,OAAO;AACR;AAEA,SAAS,EAAe,GAAgB,GAAoB,GAAsB;CACjF,IAAI,IAAY,EAAM,WAAW,IAAI,CAAM;CAE3C,OAAO,IAAW;EACjB,IAAI,MAAc,GACjB,OAAO;EAGR,IAAY,EAAM,WAAW,IAAI,CAAS;CAC3C;CAEA,OAAO;AACR;AAEA,SAAS,EAA2B,GAA0B,GAAgB,GAAsB;CACnG,KAAK,IAAM,KAAc,CAAC,GAAG,CAAW,GACvC,AAAI,EAAe,GAAY,GAAQ,CAAK,KAC3C,EAAY,OAAO,CAAU;AAGhC;AAEA,SAAS,EAAoB,GAAgB,GAA0B,GAA+B;CACrG,IAAI,EAAY,IAAI,CAAM,GACzB,OAAO;CAGR,IAAM,IAAW,EAAM,aAAa,IAAI,CAAM,KAAK,CAAC;CAKpD,OAJI,EAAS,WAAW,IAChB,KAGD,EAAS,OAAO,MAAY,EAAoB,GAAS,GAAa,CAAK,CAAC;AACpF;AAEA,SAAgB,EAA0B,GAA0B,GAAsB;CACzF,IAAM,IAAkB,IAAI,IAAI,CAAW;CAE3C,KAAK,IAAM,KAAc,CAAC,GAAG,CAAe,GAC3C,AAAI,EAAe,GAAY,CAAK,CAAC,CAAC,MAAM,MAAe,EAAgB,IAAI,CAAU,CAAC,KACzF,EAAgB,OAAO,CAAU;CAInC,IAAM,IAAiB,CAAC,GAAG,EAAM,SAAS,KAAK,CAAC,CAAC,CAAC,MAChD,GAAQ,OAAa,EAAM,kBAAkB,IAAI,CAAO,KAAK,MAAM,EAAM,kBAAkB,IAAI,CAAM,KAAK,EAC5G;CAEA,KAAK,IAAM,KAAU,GAAgB;EACpC,IAAM,IAAW,EAAM,aAAa,IAAI,CAAM,KAAK,CAAC;EAEhD,EAAS,WAAW,KAAK,EAAgB,IAAI,CAAM,KAInD,EAAS,OAAO,MAAY,EAAoB,GAAS,GAAiB,CAAK,CAAC,MACnF,EAA2B,GAAiB,GAAQ,CAAK,GACzD,EAAgB,IAAI,CAAM;CAE5B;CAEA,OAAO;AACR;AAEA,SAAS,GAA8B,GAA0B,GAAgB,GAAsB;CACtG,IAAI,IAAY,EAAM,WAAW,IAAI,CAAM;CAE3C,OAAO,IAAW;EACjB,IAAI,EAAY,IAAI,CAAS,GAAG;GAC/B,EAAY,OAAO,CAAS;GAE5B,KAAK,IAAM,KAAW,EAAM,aAAa,IAAI,CAAS,KAAK,CAAC,GAC3D,EAAY,IAAI,CAAO;GAGxB,OAAO;EACR;EAEA,IAAY,EAAM,WAAW,IAAI,CAAS;CAC3C;CAEA,OAAO;AACR;AAEA,SAAgB,GAAmB,GAAgB,GAA0B,GAA+B;CAK3G,OAJI,EAAY,IAAI,CAAM,IAClB,KAGD,EAAe,GAAQ,CAAK,CAAC,CAAC,MAAM,MAAe,EAAY,IAAI,CAAU,CAAC;AACtF;AAEA,SAAS,EAA0B,GAAgB,GAA0B,GAAsB,GAA+B;CACjI,IAAM,IAAW,EAAM,aAAa,IAAI,CAAM,KAAK,CAAC;CAEpD,IAAI,EAAY,IAAI,CAAM,GAEzB,OADA,EAAM,YAAY,IAAI,CAAM,GACrB;EAAE,UAAU;EAAM,SAAS;CAAM;CAGzC,IAAI,EAAS,WAAW,GACvB,OAAO;EAAE,UAAU;EAAO,SAAS;CAAM;CAG1C,IAAM,IAAc,EAAS,KAAK,MAAY,EAA0B,GAAS,GAAa,GAAO,CAAK,CAAC,GACrG,IAAc,EAAY,OAAO,MAAe,EAAW,YAAY,CAAC,EAAW,OAAO,GAC1F,IAAiB,EAAY,MAAM,MAAe,EAAW,YAAY,EAAW,OAAO;CAYjG,OAVI,KACH,EAAM,YAAY,IAAI,CAAM,GACrB;EAAE,UAAU;EAAM,SAAS;CAAM,KAGrC,KACH,EAAM,WAAW,IAAI,CAAM,GACpB;EAAE,UAAU;EAAO,SAAS;CAAK,KAGlC;EAAE,UAAU;EAAO,SAAS;CAAM;AAC1C;AAEA,SAAgB,EAA0B,GAA0B,GAA8C;CACjH,IAAM,IAAgC;EACrC,6BAAa,IAAI,IAAI;EACrB,4BAAY,IAAI,IAAI;CACrB;CAEA,KAAK,IAAM,KAAU,EAAM,SAC1B,EAA0B,GAAQ,GAAa,GAAO,CAAK;CAG5D,OAAO;AACR;AAEA,SAAgB,EAAyB,GAAgD,GAAsB,GAAsB;CACpI,IAAM,IAAc,EAA4B,GAAc,CAAK,GAE7D,KAAU,MAAqB;EACpC,IAAI,GAAmB,GAAU,GAAa,CAAK,GAAG;GACrD,IAAI,EAAY,IAAI,CAAQ,GAAG;IAC9B,EAAY,OAAO,CAAQ;IAC3B;GACD;GAEA,AAAI,GAA8B,GAAa,GAAU,CAAK,KAC7D,EAAO,CAAQ;GAGhB;EACD;EAGA,AADA,EAA2B,GAAa,GAAU,CAAK,GACvD,EAAY,IAAI,CAAQ;CACzB;CAIA,OAFA,EAAO,CAAY,GAEZ,EAA4B,EAA0B,GAAa,CAAK,GAAG,CAAK;AACxF;AAEA,SAAS,EAAmB,GAAgB,GAAsB,GAA0B;CAC3F,IAAI,IAAY,EAAM,WAAW,IAAI,CAAM;CAE3C,OAAO,IAEN,AADA,EAAY,IAAI,CAAS,GACzB,IAAY,EAAM,WAAW,IAAI,CAAS;AAE5C;AAEA,SAAgB,GAAwB,GAA0B,GAAsB;CACvF,IAAM,oBAAc,IAAI,IAAY;CAEpC,KAAK,IAAM,KAAc,GACxB,EAAmB,GAAY,GAAO,CAAW;CAGlD,OAAO;AACR;AAEA,SAAS,EAAe,GAAsB,GAAyB,GAAiD;CACvH,IAAM,KAAoB,EAAK,YAAY,CAAC,EAAA,CAC1C,KAAK,MAAc,EAAe,GAAW,GAAiB,CAAW,CAAC,CAAC,CAC3E,QAAQ,MAA2C,EAAQ,CAAU;CAevE,OAZI,CAFc,EAAK,WAAW,YAAY,CAAC,CAAC,SAAS,CAEpD,KAAa,EAAiB,WAAW,IACtC,QAGJ,EAAiB,SAAS,KAC7B,EAAY,IAAI,EAAK,EAAE,GAGpB,EAAiB,WAAW,IACxB,IAGD;EACN,GAAG;EACH,UAAU;CACX;AACD;AAEA,SAAgB,GAAgB,GAAkC,GAAe;CAChF,IAAM,IAAkB,EAAM,KAAK,CAAC,CAAC,YAAY;CAEjD,IAAI,CAAC,GACJ,OAAO;EACN,OAAO,CAAC,GAAG,CAAK;EAChB,6BAAa,IAAI,IAAY;CAC9B;CAGD,IAAM,oBAAc,IAAI,IAAY;CAKpC,OAAO;EACN,OALqB,EACpB,KAAK,MAAS,EAAe,GAAM,GAAiB,CAAW,CAAC,CAAC,CACjE,QAAQ,MAAiC,EAAQ,CAG3C;EACP;CACD;AACD;AAEA,SAAgB,GAAwB,GAAkC,GAA8C;CACvH,IAAM,IAA8B,CAAC,GAE/B,KAAQ,GAAsB,GAAe,MAAsB;EACxE,IAAM,KAAe,EAAK,UAAU,UAAU,KAAK,GAC7C,IAAa,KAAe,EAAY,IAAI,EAAK,EAAE;EAEzD,MAAQ,KAAK;GACZ;GACA;GACA;GACA;GACA;GACA,QAAQ,CAAC;EACV,CAAC,GAEI,GAIL,KAAK,IAAM,KAAa,EAAK,YAAY,CAAC,GACzC,EAAK,GAAW,IAAQ,GAAG,EAAK,EAAE;CAEpC;CAEA,KAAK,IAAM,KAAQ,GAClB,EAAK,GAAM,CAAC;CAGb,OAAO;AACR;;;;;;;;;;;;;;;;;;;;;;;AE1WA,SAAgB,GAAgB,EAC/B,SACA,UACA,cACA,gBACA,eACA,aACA,YACA,kBACA,qBACwB;CACxB,OACC,mBAAA,GAAA,EAAA,UAAA;EACC,kBAAC,QAAD;GAAM,WAAW,EAAO;GAAY,OAAO,EAAE,gBAAgB,EAAM;GAAoB,eAAY;EAAQ,CAAA;EAC1G,IACA,kBAAC,UAAD;GACC,MAAK;GACL,WAAW,EAAO;GAClB,UAAU,MAAU;IAEnB,AADA,EAAM,gBAAgB,GACtB,IAAiB;GAClB;GACA,cAAY,IAAa,mBAAmB;GAC5C,WAAQ;GACR,eAAa,IAAa,8BAA8B;aACxD,kBAAC,GAAD,EAAkB,WAAW,EAAG,EAAO,kBAAkB,KAAc,EAAO,wBAAwB,EAAI,CAAA;EACnG,CAAA,IAER,kBAAC,QAAD;GAAM,WAAW,EAAO;GAAyB,eAAY;EAAQ,CAAA;EAGrE,MAAkB,WAClB,kBAAC,QAAD;GACC,WAAW,EAAG,EAAO,eAAe,KAAY,EAAO,sBAAsB,KAAW,EAAO,oBAAoB;GACnH,eAAY;aACX,IACA,kBAAC,GAAD,EAAW,WAAW,EAAO,kBAAoB,CAAA,IAC9C,IACH,kBAAC,GAAD,EAAW,WAAW,EAAO,kBAAoB,CAAA,IAC9C;EACC,CAAA;EAGP,kBAAC,GAAD;GAAqB,OAAO,EAAK;GAAO,MAAM,EAAK;GAAiB;EAAY,CAAA;CAC/E,EAAA,CAAA;AAEJ;;;ACrBA,SAAgB,EAAe,EAC9B,UACA,gBACA,aACA,gBACA,SACA,UACA,gBACA,eACA,kBACA,iBAAc,WACd,oBACA,wBACA,UACA,kBACA,aACA,mBACA,qBACA,cACA,YACuB;CACvB,IAAM,IAAW,EAAgC,IAAI,GAC/C,IAAkB,EAAO,EAAK,GAC9B,CAAC,GAAa,MAAkB,yBAA4B,IAAI,IAAI,CAAC,GACrE,IAAsB,MAAgB,WAAW,kBAAkB,WACnE,IAAY,QAAc,EAAoB,CAAK,GAAG,CAAC,CAAK,CAAC,GAC7D,EAAE,OAAO,GAAc,gBAAa,EAAe;EACxD,MAAM;EACN;EACA;EACA;EACA,aAAa;CACd,CAAC,GACK,EAAE,OAAO,GAAe,aAAa,MAAsB,QAC1D,GAAgB,GAAO,CAAY,GACzC,CAAC,GAAO,CAAY,CACrB,GACM,IAAsB,QAAc,GAAwB,GAAa,CAAS,GAAG,CAAC,GAAa,CAAS,CAAC,GAC7G,IAAsB,wBACrB,IAAI,IAAI;EAAC,GAAG;EAAa,GAAG;EAAmB,GAAG;CAAmB,CAAC,GAC5E;EAAC;EAAa;EAAmB;CAAmB,CACrD,GACM,IAAiB,QAAc,GAAwB,GAAe,CAAmB,GAAG,CAAC,GAAe,CAAmB,CAAC,GAEhI,EACL,SACA,gBACA,aACA,oBACA,sBACA,kBACA,iBACA,kBACA,UACA,cACA,gBACA,iBACA,4BACA,2BACA,iBACA,0BACG,EAAyB;EAC5B,SAAS;EACT,eApBqB,QAAc,EAAe,WAAW,MAAU,EAAY,IAAI,EAAM,KAAK,EAAE,CAAC,GAAG,CAAC,GAAa,CAAc,CAoBpI;EACA,WAAW,MAAU,EAAe,EAAM,IAAI;EAC9C,UAAU,KAAY;EACtB,eAAe,MAAkB;EACjC,yBAAyB;EACzB,aAAa;CACd,CAAC,GACK,IAAe,EAAY,OAAO,GAClC,IAAmB,MAAgB,aAAa,KAAQ,EAAa,SAAS,IAC9E,KAAe,IAAmB,IAAgB,KAAuB,IACzE,IAAqB,MAAgB,aAAa,EAAQ,GAC1D,IAAoB,EAA2B;EACpD,MAAM;EACN;EACA;EACA,iBAAiB,EAAQ;EACzB;EACA;EACA;EACA;EACA;CACD,CAAC;CAED,SAAgB;EAKf,AAJI,EAAgB,WAAW,CAAC,KAAQ,EAAkB,OAAO,qBAChE,EAAS,EAAE,GAGZ,EAAgB,UAAU;CAC3B,GAAG;EAAC;EAAM;EAAU,EAAkB,OAAO;CAAiB,CAAC;CAE/D,IAAM,MAAgB,MAAkC;EACvD,EAAS,UAAU;CACpB,GACM,WAA6B;EAGlC,AAFA,IAAmB,GACnB,EAAS,EAAE,GACX,EAAM;CACP,GAEM,MAAgB,MAA4B;EAC5C,EAAM,eAIX,IAAgB,MAAuB;GACtC,IAAM,IAAkB,IAAI,IAAI,CAAkB;GAQlD,OANI,EAAgB,IAAI,EAAM,KAAK,EAAE,IACpC,EAAgB,OAAO,EAAM,KAAK,EAAE,IAEpC,EAAgB,IAAI,EAAM,KAAK,EAAE,GAG3B;EACR,CAAC;CACF;CAEA,OACC,kBAAC,GAAD;EAAoB;EAAoB;EAAuB;EAAuB;EAAmB;aACtG,EAAE,cAAW,YAAS,qBAAkB;GACzC,IAAM,IAAS,GAAG,EAAU;GAE5B,OACC,mBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,GAAD;IACC,KAAK;IACL,SAAS;IACT,IAAI;IACJ,MAAK;IACL,MAAK;IACL,cAAa;IACb,UAAU,KAAY;IACtB,UAAU,MAAgB;IAC1B,OAAO,MAAgB,aAAa,IAAqB,KAAK;IAC9D,aACC,MAAgB,WACb,CAAC,KAAuB,IACvB,IACA,KAAA,IACD,IACC,KAAA,IACA;IAEL,mBAAiB;IACjB,oBAAkB;IAClB,iBAAc;IACd,iBAAe;IACf,iBAAe,IAAO,IAAS,KAAA;IAC/B,qBAAmB,MAAgB,WAAW,SAAS;IACvD,yBAAuB,KAAQ,EAAe,SAAS,IAAI,GAAkB,CAAM,IAAI,KAAA;IACvF,gBAAgB,EAAG,KAAgB,EAAO,aAAa,KAAsB,EAAO,gBAAgB;IACpG,SAAS,IAAqB,kBAAC,OAAD;KAAK,WAAW,EAAO;eAAe;IAAqB,CAAA,IAAI,KAAA;IAC7F,cACC,kBAAC,GAAD;KACO;KACN,UAAU,KAAY;KACtB,mBAAmB,EAAkB;KACrC,eAAe,EAAkB;eAChC,KAAgB,IAChB,kBAAC,UAAD;MACC,MAAK;MACL,WAAW,EAAO;MAClB,cAAc,MAAU;OAEvB,AADA,EAAM,eAAe,GACrB,EAAM,gBAAgB;MACvB;MACA,UAAU,MAAU;OAGnB,AAFA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,GAAqB;MACtB;MACA,cAAW;gBACX,kBAAC,IAAD,CAAQ,CAAA;KACD,CAAA,IACL;IACiB,CAAA;IAEvB,WAAW,MAAU;KAChB,MAAgB,YAIpB,EAAkB,yBAAyB,EAAM,OAAO,KAAK;IAC9D;IACA,SAAS,EAAkB;IAC3B,UAAU,MAAU;KACnB,EAAkB,mBAAmB,EAAM,aAAa;IACzD;IACA,YAAY,MAAU;KACrB,GAAuB,CAAK,GAExB,GAAM,oBAIV,EAAkB,qBAAqB;MACtC;MACA,0BAA0B;OACzB,IAAM,IAAc,KAAe,IAAI,EAAe,KAAe,KAAA;OACrE,AAAI,KACH,EAAa,CAAW;MAE1B;MACA,uBAAuB,MAAgB;KACxC,CAAC;IACF;GACA,CAAA,GAED,kBAAC,GAAD;IACO;IACG;IACO;IACR;IACC;IACT,eAAe;IACf,gBAAgB,EAAe,SAAS,IAAI,GAAkB,CAAM,IAAI,KAAA;IAC3D;IACK;IAClB,WAAW;IACX,WAAW,EAAG,EAAS,gBAAgB,YAAY;IACnD,QACC,MAAgB,YACf,kBAAC,GAAD;KACC,OAAO;KACP,UAAU;KACV,eAAe,EAAS,EAAE;KAC1B,aAAY;KACZ,YAAY,MAAU;MACrB,AAAI,EAAM,QAAQ,YAAY,EAAM,QAAQ,SAC3C,EAAM,gBAAgB;KAExB;KACA,UAAU,MAAU;MACnB,EAAM,gBAAgB;KACvB;IACA,CAAA,IACE,KAAA;cAEL,kBAAC,OAAD;KAAK,WAAU;eACb,EAAe,WAAW,IAC1B,kBAAC,GAAD;MACC,YAAY;MACZ,cAAc,IAAY,gBAAgB,KAAA;MAC1C,YAAY,CAAC,KAAS,CAAC,IAAY,eAAe,KAAA;KAClD,CAAA,IAED,EAAe,KAAK,GAAO,MAAU;MACpC,IAAM,IAAW,EAAY,IAAI,EAAM,KAAK,EAAE,GACxC,IAAU,CAAC,KAAY,EAAW,IAAI,EAAM,KAAK,EAAE,GACnD,IAAS,MAAU;MAEzB,OACC,kBAAC,OAAD;OAEC,IAAI,GAAY,GAAQ,CAAK;OAC7B,MAAM,MAAS,GAAa,GAAO,CAAI;OACvC,MAAK;OACL,iBAAe;OACf,WAAW,EACV,EAAO,SACP,KAAU,EAAO,eACjB,KAAY,EAAO,eACpB;OACA,cAAc,MAAU;QACvB,EAAM,eAAe;OACtB;OACA,eAAe,EAAa,CAAK;iBACjC,kBAAC,OAAD;QAAK,WAAW,EAAO;kBACtB,kBAAC,IAAD;SACC,MAAM,EAAM;SACZ,OAAO,EAAM;SACb,WAAW;SACX,aAAa,EAAM;SACnB,YAAY,EAAM;SACR;SACD;SACM;SACf,sBAAsB,GAAa,CAAK;QACxC,CAAA;OACG,CAAA;MACD,GA3BC,EAAM,KAAK,EA2BZ;KAEP,CAAC;IAEE,CAAA;GACO,CAAA,CACZ,EAAA,CAAA;EAEJ;CACY,CAAA;AAEf"}
@@ -1,4 +1,4 @@
1
- import { n as e, o as t, t as n } from "./TreePickerBase-BBUOWsSu.js";
1
+ import { n as e, o as t, t as n } from "./TreePickerBase-ClXn2q3u.js";
2
2
  import { useMemo as r } from "react";
3
3
  import { jsx as i } from "react/jsx-runtime";
4
4
  //#region src/tree-select/TreeSelect.tsx
@@ -34,4 +34,4 @@ function o({ label: o, description: s, disabled: c, placeholder: l = "Выбер
34
34
  //#endregion
35
35
  export { o as t };
36
36
 
37
- //# sourceMappingURL=TreeSelect-2wUXs90E.js.map
37
+ //# sourceMappingURL=TreeSelect-DYWkgryS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TreeSelect-2wUXs90E.js","names":[],"sources":["../../src/tree-select/TreeSelect.tsx"],"sourcesContent":["import { useMemo } from \"react\";\n\nimport { UiBaseProps } from \"../types\";\n\nimport { createTreeNodeIndex, treeSelectValueToId } from \"./model/treeUtils\";\nimport { TreePickerBase } from \"./TreePickerBase\";\nimport { TreeSelectNode, TreeSelectValue } from \"./types\";\n\nexport interface TreeSelectProps extends Omit<UiBaseProps<TreeSelectValue | undefined>, \"placeholder\"> {\n\tnodes: readonly TreeSelectNode[];\n\tplaceholder?: string;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tisLoading?: boolean;\n\terror?: string;\n\tclearable?: boolean;\n}\n\nfunction formatTreeNodeSummary(node: TreeSelectNode | undefined) {\n\tif (!node) {\n\t\treturn undefined;\n\t}\n\n\tif (node.code && node.code !== node.label) {\n\t\treturn `${node.label} · ${node.code}`;\n\t}\n\n\treturn node.label;\n}\n\nexport function TreeSelect({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder = \"Выберите значение\",\n\tsize,\n\tnodes,\n\tvalue,\n\tonChange,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\tisLoading,\n\terror,\n\tclearable = false\n}: TreeSelectProps) {\n\tconst treeIndex = useMemo(() => createTreeNodeIndex(nodes), [nodes]);\n\tconst selectedId = treeSelectValueToId(value, treeIndex);\n\tconst selectedNode = selectedId ? treeIndex.nodeById.get(selectedId) : undefined;\n\n\treturn (\n\t\t<TreePickerBase\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\tnodes={nodes}\n\t\t\tselectedIds={selectedId ? new Set([selectedId]) : new Set()}\n\t\t\tpartialIds={new Set()}\n\t\t\tselectionMode=\"single\"\n\t\t\ttriggerMode=\"search\"\n\t\t\tselectedSummaryText={formatTreeNodeSummary(selectedNode)}\n\t\t\tquery={query}\n\t\t\tdefaultQuery={defaultQuery}\n\t\t\tonQuery={onQuery}\n\t\t\tonNodeActivate={(node) => onChange({ codeKey: node.codeKey, value: node.value })}\n\t\t\tonClearSelection={clearable ? () => onChange(undefined) : undefined}\n\t\t\tisLoading={isLoading}\n\t\t\terror={error}\n\t\t/>\n\t);\n}\n"],"mappings":";;;;AAmBA,SAAS,EAAsB,GAAkC;CAC3D,OAQL,OAJI,EAAK,QAAQ,EAAK,SAAS,EAAK,QAC5B,GAAG,EAAK,MAAM,KAAK,EAAK,SAGzB,EAAK;AACb;AAEA,SAAgB,EAAW,EAC1B,UACA,gBACA,aACA,iBAAc,qBACd,SACA,UACA,UACA,aACA,UACA,iBACA,YACA,cACA,UACA,eAAY,MACO;CACnB,IAAM,IAAY,QAAc,EAAoB,CAAK,GAAG,CAAC,CAAK,CAAC,GAC7D,IAAa,EAAoB,GAAO,CAAS,GACjD,IAAe,IAAa,EAAU,SAAS,IAAI,CAAU,IAAI,KAAA;CAEvE,OACC,kBAAC,GAAD;EACQ;EACM;EACH;EACG;EACP;EACC;EACP,aAAa,oBAAa,IAAI,IAAI,CAAC,CAAU,CAAC,oBAAI,IAAI,IAAI;EAC1D,4BAAY,IAAI,IAAI;EACpB,eAAc;EACd,aAAY;EACZ,qBAAqB,EAAsB,CAAY;EAChD;EACO;EACL;EACT,iBAAiB,MAAS,EAAS;GAAE,SAAS,EAAK;GAAS,OAAO,EAAK;EAAM,CAAC;EAC/E,kBAAkB,UAAkB,EAAS,KAAA,CAAS,IAAI,KAAA;EAC/C;EACJ;CACP,CAAA;AAEH"}
1
+ {"version":3,"file":"TreeSelect-DYWkgryS.js","names":[],"sources":["../../src/tree-select/TreeSelect.tsx"],"sourcesContent":["import { useMemo } from \"react\";\n\nimport { UiBaseProps } from \"../types\";\n\nimport { createTreeNodeIndex, treeSelectValueToId } from \"./model/treeUtils\";\nimport { TreePickerBase } from \"./TreePickerBase\";\nimport { TreeSelectNode, TreeSelectValue } from \"./types\";\n\nexport interface TreeSelectProps extends Omit<UiBaseProps<TreeSelectValue | undefined>, \"placeholder\"> {\n\tnodes: readonly TreeSelectNode[];\n\tplaceholder?: string;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tisLoading?: boolean;\n\terror?: string;\n\tclearable?: boolean;\n}\n\nfunction formatTreeNodeSummary(node: TreeSelectNode | undefined) {\n\tif (!node) {\n\t\treturn undefined;\n\t}\n\n\tif (node.code && node.code !== node.label) {\n\t\treturn `${node.label} · ${node.code}`;\n\t}\n\n\treturn node.label;\n}\n\nexport function TreeSelect({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder = \"Выберите значение\",\n\tsize,\n\tnodes,\n\tvalue,\n\tonChange,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\tisLoading,\n\terror,\n\tclearable = false\n}: TreeSelectProps) {\n\tconst treeIndex = useMemo(() => createTreeNodeIndex(nodes), [nodes]);\n\tconst selectedId = treeSelectValueToId(value, treeIndex);\n\tconst selectedNode = selectedId ? treeIndex.nodeById.get(selectedId) : undefined;\n\n\treturn (\n\t\t<TreePickerBase\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\tnodes={nodes}\n\t\t\tselectedIds={selectedId ? new Set([selectedId]) : new Set()}\n\t\t\tpartialIds={new Set()}\n\t\t\tselectionMode=\"single\"\n\t\t\ttriggerMode=\"search\"\n\t\t\tselectedSummaryText={formatTreeNodeSummary(selectedNode)}\n\t\t\tquery={query}\n\t\t\tdefaultQuery={defaultQuery}\n\t\t\tonQuery={onQuery}\n\t\t\tonNodeActivate={(node) => onChange({ codeKey: node.codeKey, value: node.value })}\n\t\t\tonClearSelection={clearable ? () => onChange(undefined) : undefined}\n\t\t\tisLoading={isLoading}\n\t\t\terror={error}\n\t\t/>\n\t);\n}\n"],"mappings":";;;;AAmBA,SAAS,EAAsB,GAAkC;CAC3D,OAQL,OAJI,EAAK,QAAQ,EAAK,SAAS,EAAK,QAC5B,GAAG,EAAK,MAAM,KAAK,EAAK,SAGzB,EAAK;AACb;AAEA,SAAgB,EAAW,EAC1B,UACA,gBACA,aACA,iBAAc,qBACd,SACA,UACA,UACA,aACA,UACA,iBACA,YACA,cACA,UACA,eAAY,MACO;CACnB,IAAM,IAAY,QAAc,EAAoB,CAAK,GAAG,CAAC,CAAK,CAAC,GAC7D,IAAa,EAAoB,GAAO,CAAS,GACjD,IAAe,IAAa,EAAU,SAAS,IAAI,CAAU,IAAI,KAAA;CAEvE,OACC,kBAAC,GAAD;EACQ;EACM;EACH;EACG;EACP;EACC;EACP,aAAa,oBAAa,IAAI,IAAI,CAAC,CAAU,CAAC,oBAAI,IAAI,IAAI;EAC1D,4BAAY,IAAI,IAAI;EACpB,eAAc;EACd,aAAY;EACZ,qBAAqB,EAAsB,CAAY;EAChD;EACO;EACL;EACT,iBAAiB,MAAS,EAAS;GAAE,SAAS,EAAK;GAAS,OAAO,EAAK;EAAM,CAAC;EAC/E,kBAAkB,UAAkB,EAAS,KAAA,CAAS,IAAI,KAAA;EAC/C;EACJ;CACP,CAAA;AAEH"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "./Input-BmjlpA09.js";
1
+ import { t as e } from "./Input-BYUl3UFn.js";
2
2
  import { useState as t } from "react";
3
3
  import { jsx as n } from "react/jsx-runtime";
4
4
  //#region src/input-search/InputSearch.tsx
@@ -27,4 +27,4 @@ function r({ onChange: r, ...i }) {
27
27
  //#endregion
28
28
  export { r as t };
29
29
 
30
- //# sourceMappingURL=input-search-Dw4rnJBq.js.map
30
+ //# sourceMappingURL=input-search-BR4LDmyb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"input-search-Dw4rnJBq.js","names":[],"sources":["../../src/input-search/InputSearch.tsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nimport { BaseInputProps, Input } from \"../input\";\n\ninterface SearchInputProps extends BaseInputProps<string> {\n\tonChange: (value: string) => void;\n}\n\nexport function InputSearch({ onChange, ...props }: SearchInputProps) {\n\tconst [searchTerm, setSearchTerm] = useState(() => props.defaultValue ?? props.value ?? \"\");\n\tconst [previousSearch, setPreviousSearch] = useState(() => props.defaultValue ?? props.value ?? \"\");\n\n\tconst handleSearch = (term: string) => {\n\t\tconst changedTerm = term.trim();\n\n\t\t// Проверяем, изменилось ли значение с предыдущего поиска\n\t\tif (changedTerm === previousSearch) return;\n\n\t\tsetPreviousSearch(changedTerm);\n\t\tonChange(changedTerm);\n\t};\n\n\tconst handleClear = () => {\n\t\tsetSearchTerm(\"\");\n\t\tsetPreviousSearch(\"\");\n\t\tonChange(\"\");\n\t};\n\n\tconst handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\tif (event.key === \"Enter\") {\n\t\t\tevent.preventDefault();\n\t\t\thandleSearch(searchTerm);\n\t\t}\n\t};\n\n\tconst handleBlur = () => {\n\t\thandleSearch(searchTerm);\n\t};\n\n\tconst handleChange = (value: string) => {\n\t\tsetSearchTerm(value);\n\t\t// Не вызываем onSearch здесь - только по Enter/blur\n\t};\n\n\treturn (\n\t\t<Input {...props} value={searchTerm} onChange={handleChange} onKeyDown={handleKeyDown} onBlur={handleBlur} onClear={handleClear} />\n\t);\n}\n"],"mappings":";;;;AAQA,SAAgB,EAAY,EAAE,aAAU,GAAG,KAA2B;CACrE,IAAM,CAAC,GAAY,KAAiB,QAAe,EAAM,gBAAgB,EAAM,SAAS,EAAE,GACpF,CAAC,GAAgB,KAAqB,QAAe,EAAM,gBAAgB,EAAM,SAAS,EAAE,GAE5F,KAAgB,MAAiB;EACtC,IAAM,IAAc,EAAK,KAAK;EAG1B,MAAgB,MAEpB,EAAkB,CAAW,GAC7B,EAAS,CAAW;CACrB,GAEM,UAAoB;EAGzB,AAFA,EAAc,EAAE,GAChB,EAAkB,EAAE,GACpB,EAAS,EAAE;CACZ,GAEM,KAAiB,MAAiD;EACvE,AAAI,EAAM,QAAQ,YACjB,EAAM,eAAe,GACrB,EAAa,CAAU;CAEzB,GAEM,UAAmB;EACxB,EAAa,CAAU;CACxB,GAEM,KAAgB,MAAkB;EACvC,EAAc,CAAK;CAEpB;CAEA,OACC,kBAAC,GAAD;EAAO,GAAI;EAAO,OAAO;EAAY,UAAU;EAAc,WAAW;EAAe,QAAQ;EAAY,SAAS;CAAc,CAAA;AAEpI"}
1
+ {"version":3,"file":"input-search-BR4LDmyb.js","names":[],"sources":["../../src/input-search/InputSearch.tsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nimport { BaseInputProps, Input } from \"../input\";\n\ninterface SearchInputProps extends BaseInputProps<string> {\n\tonChange: (value: string) => void;\n}\n\nexport function InputSearch({ onChange, ...props }: SearchInputProps) {\n\tconst [searchTerm, setSearchTerm] = useState(() => props.defaultValue ?? props.value ?? \"\");\n\tconst [previousSearch, setPreviousSearch] = useState(() => props.defaultValue ?? props.value ?? \"\");\n\n\tconst handleSearch = (term: string) => {\n\t\tconst changedTerm = term.trim();\n\n\t\t// Проверяем, изменилось ли значение с предыдущего поиска\n\t\tif (changedTerm === previousSearch) return;\n\n\t\tsetPreviousSearch(changedTerm);\n\t\tonChange(changedTerm);\n\t};\n\n\tconst handleClear = () => {\n\t\tsetSearchTerm(\"\");\n\t\tsetPreviousSearch(\"\");\n\t\tonChange(\"\");\n\t};\n\n\tconst handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\tif (event.key === \"Enter\") {\n\t\t\tevent.preventDefault();\n\t\t\thandleSearch(searchTerm);\n\t\t}\n\t};\n\n\tconst handleBlur = () => {\n\t\thandleSearch(searchTerm);\n\t};\n\n\tconst handleChange = (value: string) => {\n\t\tsetSearchTerm(value);\n\t\t// Не вызываем onSearch здесь - только по Enter/blur\n\t};\n\n\treturn (\n\t\t<Input {...props} value={searchTerm} onChange={handleChange} onKeyDown={handleKeyDown} onBlur={handleBlur} onClear={handleClear} />\n\t);\n}\n"],"mappings":";;;;AAQA,SAAgB,EAAY,EAAE,aAAU,GAAG,KAA2B;CACrE,IAAM,CAAC,GAAY,KAAiB,QAAe,EAAM,gBAAgB,EAAM,SAAS,EAAE,GACpF,CAAC,GAAgB,KAAqB,QAAe,EAAM,gBAAgB,EAAM,SAAS,EAAE,GAE5F,KAAgB,MAAiB;EACtC,IAAM,IAAc,EAAK,KAAK;EAG1B,MAAgB,MAEpB,EAAkB,CAAW,GAC7B,EAAS,CAAW;CACrB,GAEM,UAAoB;EAGzB,AAFA,EAAc,EAAE,GAChB,EAAkB,EAAE,GACpB,EAAS,EAAE;CACZ,GAEM,KAAiB,MAAiD;EACvE,AAAI,EAAM,QAAQ,YACjB,EAAM,eAAe,GACrB,EAAa,CAAU;CAEzB,GAEM,UAAmB;EACxB,EAAa,CAAU;CACxB,GAEM,KAAgB,MAAkB;EACvC,EAAc,CAAK;CAEpB;CAEA,OACC,kBAAC,GAAD;EAAO,GAAI;EAAO,OAAO;EAAY,UAAU;EAAc,WAAW;EAAe,QAAQ;EAAY,SAAS;CAAc,CAAA;AAEpI"}
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./ui.module-BisoTevy.js";
2
- import { c as t, d as n, f as r, i, l as a, t as o } from "./picker-Dg55Ss-B.js";
2
+ import { c as t, d as n, f as r, i, l as a, t as o } from "./picker-DGXq3ikg.js";
3
3
  import { useRef as s, useState as c } from "react";
4
4
  import { cn as l } from "@ryuzaki13/react-foundation-lib/utils";
5
5
  import { CheckIcon as u } from "lucide-react";
@@ -1168,4 +1168,4 @@ function C({ id: m, label: h, description: _, value: v, onChange: y, presets: C
1168
1168
  //#endregion
1169
1169
  export { v as a, y as i, g as n, h as o, _ as r, m as s, C as t };
1170
1170
 
1171
- //# sourceMappingURL=layout-picker-MWaImn3L.js.map
1171
+ //# sourceMappingURL=layout-picker-C1sizRYa.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout-picker-MWaImn3L.js","names":[],"sources":["../../src/layout-picker/lib/layout.ts","../../src/layout-picker/lib/presets.ts","../../src/layout-picker/ui/LayoutPicker.module.scss","../../src/layout-picker/ui/LayoutPicker.tsx"],"sourcesContent":["import { type CSSProperties } from \"react\";\n\nimport { type LayoutPickerPreset, type LayoutPickerPresetCell } from \"./types\";\n\n/**\n * Возвращает CSS Grid-стиль для схематичного layout-пресета.\n */\nexport function getLayoutStyle(preset: LayoutPickerPreset, rowMinHeightInEm?: number): CSSProperties {\n\treturn {\n\t\tgridTemplateColumns: `repeat(${preset.columns}, minmax(0, 1fr))`,\n\t\tgridTemplateRows: `repeat(${preset.rows}, minmax(${rowMinHeightInEm ?? 0}em, 1fr))`\n\t};\n}\n\n/**\n * Возвращает позиционирование ячейки внутри CSS Grid.\n */\nexport function getLayoutCellStyle(cell: LayoutPickerPresetCell): CSSProperties {\n\treturn {\n\t\tgridColumn: `${cell.column} / span ${cell.columnSpan ?? 1}`,\n\t\tgridRow: `${cell.row} / span ${cell.rowSpan ?? 1}`\n\t};\n}\n","import { type LayoutPickerPreset } from \"./types\";\n\n/**\n * Базовый набор layout-пресетов для первого среза выбора схемы.\n *\n * id формата:\n * - \"2x3\" — 2 строки, 3 колонки\n * - \"2x2-l\" — 2x2 с большой ячейкой слева\n * - \"3x2-b\" — 3x2 с широкой нижней ячейкой\n */\nexport const DEFAULT_LAYOUT_PICKER_PRESETS = [\n\t{\n\t\tid: \"1x1\",\n\t\tlabel: \"1x1\",\n\t\tcolumns: 1,\n\t\trows: 1,\n\t\tcells: [{ id: \"c11\", row: 1, column: 1 }]\n\t},\n\t{\n\t\tid: \"1x2\",\n\t\tlabel: \"1x2\",\n\t\tcolumns: 2,\n\t\trows: 1,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"1x3\",\n\t\tlabel: \"1x3\",\n\t\tcolumns: 3,\n\t\trows: 1,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c13\", row: 1, column: 3 }\n\t\t]\n\t},\n\t{\n\t\tid: \"2x1\",\n\t\tlabel: \"2x1\",\n\t\tcolumns: 1,\n\t\trows: 2,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 }\n\t\t]\n\t},\n\t{\n\t\tid: \"2x2\",\n\t\tlabel: \"2x2\",\n\t\tcolumns: 2,\n\t\trows: 2,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"2x3\",\n\t\tlabel: \"2x3\",\n\t\tcolumns: 3,\n\t\trows: 2,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c13\", row: 1, column: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x1\",\n\t\tlabel: \"3x1\",\n\t\tcolumns: 1,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x2\",\n\t\tlabel: \"3x2\",\n\t\tcolumns: 2,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x3\",\n\t\tlabel: \"3x3\",\n\t\tcolumns: 3,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c13\", row: 1, column: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c33\", row: 3, column: 3 }\n\t\t]\n\t},\n\t{\n\t\tid: \"4x1\",\n\t\tlabel: \"4x1\",\n\t\tcolumns: 1,\n\t\trows: 4,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c41\", row: 4, column: 1 }\n\t\t]\n\t},\n\t{\n\t\tid: \"4x2\",\n\t\tlabel: \"4x2\",\n\t\tcolumns: 2,\n\t\trows: 4,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c41\", row: 4, column: 1 },\n\t\t\t{ id: \"c42\", row: 4, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"4x3\",\n\t\tlabel: \"4x3\",\n\t\tcolumns: 3,\n\t\trows: 4,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c13\", row: 1, column: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c33\", row: 3, column: 3 },\n\t\t\t{ id: \"c41\", row: 4, column: 1 },\n\t\t\t{ id: \"c42\", row: 4, column: 2 },\n\t\t\t{ id: \"c43\", row: 4, column: 3 }\n\t\t]\n\t},\n\n\t{\n\t\tid: \"2x2-l\",\n\t\tlabel: \"Большая слева + две справа\",\n\t\tcolumns: 2,\n\t\trows: 2,\n\t\tcells: [\n\t\t\t{ id: \"left\", row: 1, column: 1, rowSpan: 2 },\n\t\t\t{ id: \"rt\", row: 1, column: 2 },\n\t\t\t{ id: \"rb\", row: 2, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"2x2-r\",\n\t\tlabel: \"Две слева + большая справа\",\n\t\tcolumns: 2,\n\t\trows: 2,\n\t\tcells: [\n\t\t\t{ id: \"lt\", row: 1, column: 1 },\n\t\t\t{ id: \"lb\", row: 2, column: 1 },\n\t\t\t{ id: \"right\", row: 1, column: 2, rowSpan: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"2x2-t\",\n\t\tlabel: \"Широкая сверху + две снизу\",\n\t\tcolumns: 2,\n\t\trows: 2,\n\t\tcells: [\n\t\t\t{ id: \"top\", row: 1, column: 1, columnSpan: 2 },\n\t\t\t{ id: \"bl\", row: 2, column: 1 },\n\t\t\t{ id: \"br\", row: 2, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"2x2-b\",\n\t\tlabel: \"Две сверху + широкая снизу\",\n\t\tcolumns: 2,\n\t\trows: 2,\n\t\tcells: [\n\t\t\t{ id: \"tl\", row: 1, column: 1 },\n\t\t\t{ id: \"tr\", row: 1, column: 2 },\n\t\t\t{ id: \"bottom\", row: 2, column: 1, columnSpan: 2 }\n\t\t]\n\t},\n\n\t{\n\t\tid: \"3x2-t\",\n\t\tlabel: \"Широкая сверху + 2x2\",\n\t\tcolumns: 2,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"top\", row: 1, column: 1, columnSpan: 2 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x2-b\",\n\t\tlabel: \"2x2 + широкая снизу\",\n\t\tcolumns: 2,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"bottom\", row: 3, column: 1, columnSpan: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x2-m\",\n\t\tlabel: \"Широкая по центру\",\n\t\tcolumns: 2,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"tl\", row: 1, column: 1 },\n\t\t\t{ id: \"tr\", row: 1, column: 2 },\n\t\t\t{ id: \"middle\", row: 2, column: 1, columnSpan: 2 },\n\t\t\t{ id: \"bl\", row: 3, column: 1 },\n\t\t\t{ id: \"br\", row: 3, column: 2 }\n\t\t]\n\t},\n\n\t{\n\t\tid: \"3x3-l\",\n\t\tlabel: \"Большая слева + 2x3 справа\",\n\t\tcolumns: 3,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"left\", row: 1, column: 1, rowSpan: 3 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c13\", row: 1, column: 3 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c33\", row: 3, column: 3 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x3-r\",\n\t\tlabel: \"2x3 слева + большая справа\",\n\t\tcolumns: 3,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"right\", row: 1, column: 3, rowSpan: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x3-t\",\n\t\tlabel: \"Широкая сверху + 2x3\",\n\t\tcolumns: 3,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"top\", row: 1, column: 1, columnSpan: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c33\", row: 3, column: 3 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x3-b\",\n\t\tlabel: \"2x3 + широкая снизу\",\n\t\tcolumns: 3,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c13\", row: 1, column: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 },\n\t\t\t{ id: \"bottom\", row: 3, column: 1, columnSpan: 3 }\n\t\t]\n\t},\n\n\t{\n\t\tid: \"4x2-t\",\n\t\tlabel: \"Широкая сверху + 3x2\",\n\t\tcolumns: 2,\n\t\trows: 4,\n\t\tcells: [\n\t\t\t{ id: \"top\", row: 1, column: 1, columnSpan: 2 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c41\", row: 4, column: 1 },\n\t\t\t{ id: \"c42\", row: 4, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"4x2-b\",\n\t\tlabel: \"3x2 + широкая снизу\",\n\t\tcolumns: 2,\n\t\trows: 4,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"bottom\", row: 4, column: 1, columnSpan: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"4x3-t\",\n\t\tlabel: \"Широкая сверху + 3x3\",\n\t\tcolumns: 3,\n\t\trows: 4,\n\t\tcells: [\n\t\t\t{ id: \"top\", row: 1, column: 1, columnSpan: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c33\", row: 3, column: 3 },\n\t\t\t{ id: \"c41\", row: 4, column: 1 },\n\t\t\t{ id: \"c42\", row: 4, column: 2 },\n\t\t\t{ id: \"c43\", row: 4, column: 3 }\n\t\t]\n\t},\n\t{\n\t\tid: \"4x3-b\",\n\t\tlabel: \"3x3 + широкая снизу\",\n\t\tcolumns: 3,\n\t\trows: 4,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c13\", row: 1, column: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c33\", row: 3, column: 3 },\n\t\t\t{ id: \"bottom\", row: 4, column: 1, columnSpan: 3 }\n\t\t]\n\t}\n] as const satisfies readonly LayoutPickerPreset[];\n\nexport type DefaultLayoutPickerPresetId = (typeof DEFAULT_LAYOUT_PICKER_PRESETS)[number][\"id\"];\n\nexport function getDefaultLayoutPickerPresetId(): DefaultLayoutPickerPresetId {\n\treturn DEFAULT_LAYOUT_PICKER_PRESETS[0].id;\n}\n\n/** Возвращает layout-пресет по id с fallback на дефолт chart-ракурса. */\nexport function resolveLayoutPreset(layoutId: string | undefined): LayoutPickerPreset {\n\treturn DEFAULT_LAYOUT_PICKER_PRESETS.find((preset) => preset.id === layoutId) ?? DEFAULT_LAYOUT_PICKER_PRESETS[0];\n}\n\nexport function resolveLayoutCellCount(layoutId: string): number {\n\treturn DEFAULT_LAYOUT_PICKER_PRESETS.find((preset) => preset.id === layoutId)?.cells.length ?? 1;\n}\n","@use \"@/styles/mixins\" as *;\n\n.valueOverlay {\n\tposition: absolute;\n\tinset: 0 calc(var(--control-height) + var(--space-xs)) 0 var(--space-sm);\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--space-sm);\n\tmin-width: 0;\n\tpointer-events: none;\n\toverflow: hidden;\n}\n\n.triggerInput {\n\t--ui-color: transparent;\n\t--ui-color-hover: transparent;\n\t--ui-color-active: transparent;\n\n\tcolor: transparent;\n\tcaret-color: transparent;\n}\n\n.triggerText {\n\tmin-width: 0;\n\tflex: 1 1 auto;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.popup {\n\twidth: min(calc(100vw - var(--space-lg) * 2), 44em);\n\tmax-height: min(75vh, 34em);\n}\n\n.popupLayout {\n\tmax-height: inherit;\n}\n\n.popupBody {\n\toverflow: auto;\n\tpadding: var(--space-xs);\n}\n\n.options {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fit, minmax(min(100%, 12em), 1fr));\n\tgap: var(--space-sm);\n}\n\n.option {\n\tposition: relative;\n\tdisplay: grid;\n\tgrid-template-columns: auto minmax(0, 1fr) auto;\n\talign-items: center;\n\tgap: var(--space-sm);\n\tmin-height: 3.5em;\n\tpadding: var(--space-sm);\n\tborder: var(--border);\n\tborder-radius: var(--radius-sm);\n\tbackground-color: var(--surface-0);\n\tcolor: var(--content-0);\n\ttext-align: left;\n\tcursor: pointer;\n\ttransition:\n\t\tbackground-color var(--transition-fast) ease,\n\t\tborder-color var(--transition-fast) ease,\n\t\tcolor var(--transition-fast) ease;\n\n\t@include hover(true) {\n\t\tbackground-color: var(--surface-1);\n\t\tborder-color: var(--border-1);\n\t}\n\n\t&:disabled {\n\t\tcursor: default;\n\t\topacity: var(--disabled-opacity);\n\t}\n}\n\n.optionActive {\n\tbackground-color: var(--surface-1);\n\tborder-color: var(--border-1);\n}\n\n.optionSelected {\n\t// border-color: var(--border-accent);\n\t// background-color: var(--surface-accent);\n\tcolor: var(--content-accent);\n}\n\n.optionPreviewWrap {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tmin-width: 3.5rem;\n}\n\n// .optionText {\n// \tmin-width: 0;\n// \tdisplay: grid;\n// \tgap: var(--space-xs);\n// }\n\n// .optionLabel {\n// overflow: hidden;\n// text-overflow: ellipsis;\n// white-space: nowrap;\n// }\n\n// .optionDescription {\n// \toverflow: hidden;\n// \tdisplay: -webkit-box;\n// \t-webkit-line-clamp: 2;\n// \t-webkit-box-orient: vertical;\n// \tcolor: var(--content-2);\n// \tfont-size: var(--font-size-sm);\n// }\n\n.optionCheck {\n\twidth: 1em;\n\theight: 1em;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tcolor: var(--content-accent);\n\n\tsvg {\n\t\twidth: 1em;\n\t\theight: 1em;\n\t}\n}\n\n.preview,\n.previewPlaceholder {\n\t--layout-picker-preview-size: 3.5em;\n\n\twidth: var(--layout-picker-preview-size);\n\theight: calc(var(--layout-picker-preview-size) * 0.72);\n\tflex: 0 0 auto;\n\t// background-color: var(--surface-0);\n\t// border: var(--border);\n\t// border-radius: var(--radius-xs);\n\t// padding: calc(var(--border-width) * 2);\n}\n\n.preview {\n\tdisplay: grid;\n\tgap: calc(var(--border-width) * 2);\n}\n\n.previewCompact,\n.previewPlaceholder {\n\t--layout-picker-preview-size: 1.5rem;\n}\n\n.previewCell {\n\tmin-width: 0;\n\tmin-height: 0;\n\tborder-radius: calc(var(--radius-xs) / 2);\n\tbackground-color: var(--surface-accent);\n\tborder: var(--border-width) solid var(--border-accent);\n}\n","import { useRef, useState } from \"react\";\n\nimport { type Placement } from \"@floating-ui/react\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CheckIcon } from \"lucide-react\";\n\nimport {\n\tPickerField,\n\tPickerPopup,\n\tPickerTriggerActions,\n\tPickerTriggerInput,\n\tusePickerFloatingListbox,\n\tusePickerTriggerController\n} from \"../../picker\";\nimport { type UiBaseProps } from \"../../types\";\nimport uiStyles from \"../../ui.module.scss\";\nimport { DEFAULT_LAYOUT_PICKER_PRESETS, getLayoutCellStyle, getLayoutStyle, type LayoutPickerPreset } from \"../lib\";\n\nimport styles from \"./LayoutPicker.module.scss\";\n\nexport interface LayoutPickerProps extends UiBaseProps<string> {\n\tid?: string;\n\tpresets?: readonly LayoutPickerPreset[];\n\tgetPresetDisabled?: (preset: LayoutPickerPreset) => boolean;\n\tariaLabel?: string;\n\tclassName?: string;\n\ttriggerClassName?: string;\n\tpopupClassName?: string;\n\tplacement?: Placement;\n}\n\nconst DEFAULT_PLACEHOLDER = \"Выберите раскладку\";\n\nfunction LayoutPresetPreview({ preset, compact = false }: { preset: LayoutPickerPreset; compact?: boolean }) {\n\treturn (\n\t\t<span className={cn(styles.preview, compact && styles.previewCompact)} style={getLayoutStyle(preset)} aria-hidden=\"true\">\n\t\t\t{preset.cells.map((cell) => (\n\t\t\t\t<span key={`${preset.id}:${cell.id}`} className={styles.previewCell} style={getLayoutCellStyle(cell)} />\n\t\t\t))}\n\t\t</span>\n\t);\n}\n\n/**\n * Контрол выбора layout-пресета. Не хранит бизнес-логику содержимого ячеек.\n */\nexport function LayoutPicker({\n\tid,\n\tlabel,\n\tdescription,\n\tvalue,\n\tonChange,\n\tpresets = DEFAULT_LAYOUT_PICKER_PRESETS,\n\tdisabled,\n\tgetPresetDisabled,\n\tplaceholder = DEFAULT_PLACEHOLDER,\n\tsize,\n\tariaLabel,\n\tclassName,\n\ttriggerClassName,\n\tpopupClassName,\n\tplacement = \"bottom-start\"\n}: LayoutPickerProps) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst [open, setOpen] = useState(false);\n\tconst selectedIndex = presets.findIndex((preset) => preset.id === value);\n\tconst selectedPreset = selectedIndex >= 0 ? presets[selectedIndex] : undefined;\n\tconst previewPreset = selectedPreset ?? presets[0];\n\tconst triggerLabel = selectedPreset?.label ?? placeholder;\n\tconst {\n\t\tactiveIndex,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference,\n\t\tsetFloating,\n\t\tsetOptionRef,\n\t\tclose,\n\t\topenList,\n\t\ttoggleOpen,\n\t\tselectOption,\n\t\tselectActiveOption,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t} = usePickerFloatingListbox({\n\t\toptions: presets,\n\t\tselectedIndex,\n\t\topen,\n\t\tonOpenChange: setOpen,\n\t\tgetOptionDisabled: getPresetDisabled,\n\t\tonSelect: (preset) => onChange(preset.id),\n\t\tdisabled,\n\t\tplacement,\n\t\ttriggerMode: \"display\"\n\t});\n\tconst triggerController = usePickerTriggerController({\n\t\tmode: \"display\",\n\t\topen,\n\t\tcurrentQuery: \"\",\n\t\thasDisplayValue: selectedPreset !== undefined,\n\t\tinputRef,\n\t\topenList,\n\t\tclose,\n\t\ttoggleOpen\n\t});\n\tconst setInputNode = (node: HTMLInputElement | null) => {\n\t\tinputRef.current = node;\n\t};\n\n\treturn (\n\t\t<PickerField\n\t\t\tid={id}\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\tclassName={className}>\n\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\tconst listId = `${controlId}-listbox`;\n\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<PickerTriggerInput\n\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\treadOnly\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\tvalue={triggerLabel}\n\t\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\taria-autocomplete=\"none\"\n\t\t\t\t\t\t\taria-activedescendant={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\taria-label={!labelId ? (ariaLabel ?? `Выбрать layout. Текущее значение: ${triggerLabel}`) : undefined}\n\t\t\t\t\t\t\tdata-ui=\"layout-picker-trigger\"\n\t\t\t\t\t\t\trootClassName={triggerClassName}\n\t\t\t\t\t\t\tinputClassName={styles.triggerInput}\n\t\t\t\t\t\t\toverlay={\n\t\t\t\t\t\t\t\t<div className={styles.valueOverlay}>\n\t\t\t\t\t\t\t\t\t{previewPreset ? (\n\t\t\t\t\t\t\t\t\t\t<LayoutPresetPreview preset={previewPreset} compact />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span className={styles.previewPlaceholder} />\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<span className={cn(styles.triggerText, !selectedPreset && uiStyles.uiPlaceholder)}>\n\t\t\t\t\t\t\t\t\t\t{triggerLabel}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t\t\t<PickerTriggerActions\n\t\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}\n\t\t\t\t\t\t\t\t\topenAriaLabel=\"Открыть список layout\"\n\t\t\t\t\t\t\t\t\tcloseAriaLabel=\"Закрыть список layout\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\tonActivateWhenOpen: selectActiveOption,\n\t\t\t\t\t\t\t\t\tenableSpaceActivation: true\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\tactiveOptionId={getActiveOptionId(listId)}\n\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\tclassName={cn(uiStyles.uiPopupOptions, styles.popup, popupClassName)}\n\t\t\t\t\t\t\tlayoutClassName={styles.popupLayout}\n\t\t\t\t\t\t\tbodyClassName={styles.popupBody}>\n\t\t\t\t\t\t\t<div className={styles.options}>\n\t\t\t\t\t\t\t\t{presets.map((preset, index) => {\n\t\t\t\t\t\t\t\t\tconst selected = index === selectedIndex;\n\t\t\t\t\t\t\t\t\tconst active = index === activeIndex;\n\t\t\t\t\t\t\t\t\tconst presetDisabled = getPresetDisabled?.(preset) ?? false;\n\t\t\t\t\t\t\t\t\tconst optionId = getOptionId(listId, index);\n\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tkey={preset.id}\n\t\t\t\t\t\t\t\t\t\t\tid={optionId}\n\t\t\t\t\t\t\t\t\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={presetDisabled}\n\t\t\t\t\t\t\t\t\t\t\taria-selected={selected}\n\t\t\t\t\t\t\t\t\t\t\taria-disabled={presetDisabled || undefined}\n\t\t\t\t\t\t\t\t\t\t\taria-label={preset.description ? `${preset.label}. ${preset.description}` : preset.label}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(styles.option, selected && styles.optionSelected, active && styles.optionActive)}\n\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"layout-picker-option\"\n\t\t\t\t\t\t\t\t\t\t\tdata-selected={selected || undefined}\n\t\t\t\t\t\t\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => selectOption(preset)}>\n\t\t\t\t\t\t\t\t\t\t\t<span className={styles.optionPreviewWrap}>\n\t\t\t\t\t\t\t\t\t\t\t\t<LayoutPresetPreview preset={preset} />\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"fontSizeSm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{preset.label}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t{preset.description ? <span>{preset.description}</span> : null}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<span className={styles.optionCheck} aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t{selected ? <CheckIcon /> : null}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}}\n\t\t</PickerField>\n\t);\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,EAAe,GAA4B,GAA0C;CACpG,OAAO;EACN,qBAAqB,UAAU,EAAO,QAAQ;EAC9C,kBAAkB,UAAU,EAAO,KAAK,WAAW,KAAoB,EAAE;CAC1E;AACD;AAKA,SAAgB,EAAmB,GAA6C;CAC/E,OAAO;EACN,YAAY,GAAG,EAAK,OAAO,UAAU,EAAK,cAAc;EACxD,SAAS,GAAG,EAAK,IAAI,UAAU,EAAK,WAAW;CAChD;AACD;;;ACZA,IAAa,IAAgC;CAC5C;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO,CAAC;GAAE,IAAI;GAAO,KAAK;GAAG,QAAQ;EAAE,CAAC;CACzC;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO,CACN;GAAE,IAAI;GAAO,KAAK;GAAG,QAAQ;EAAE,GAC/B;GAAE,IAAI;GAAO,KAAK;GAAG,QAAQ;EAAE,CAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO,CACN;GAAE,IAAI;GAAO,KAAK;GAAG,QAAQ;EAAE,GAC/B;GAAE,IAAI;GAAO,KAAK;GAAG,QAAQ;EAAE,CAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CAEA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAQ,KAAK;IAAG,QAAQ;IAAG,SAAS;GAAE;GAC5C;IAAE,IAAI;IAAM,KAAK;IAAG,QAAQ;GAAE;GAC9B;IAAE,IAAI;IAAM,KAAK;IAAG,QAAQ;GAAE;EAC/B;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAM,KAAK;IAAG,QAAQ;GAAE;GAC9B;IAAE,IAAI;IAAM,KAAK;IAAG,QAAQ;GAAE;GAC9B;IAAE,IAAI;IAAS,KAAK;IAAG,QAAQ;IAAG,SAAS;GAAE;EAC9C;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;IAAG,YAAY;GAAE;GAC9C;IAAE,IAAI;IAAM,KAAK;IAAG,QAAQ;GAAE;GAC9B;IAAE,IAAI;IAAM,KAAK;IAAG,QAAQ;GAAE;EAC/B;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAM,KAAK;IAAG,QAAQ;GAAE;GAC9B;IAAE,IAAI;IAAM,KAAK;IAAG,QAAQ;GAAE;GAC9B;IAAE,IAAI;IAAU,KAAK;IAAG,QAAQ;IAAG,YAAY;GAAE;EAClD;CACD;CAEA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;IAAG,YAAY;GAAE;GAC9C;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAU,KAAK;IAAG,QAAQ;IAAG,YAAY;GAAE;EAClD;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAM,KAAK;IAAG,QAAQ;GAAE;GAC9B;IAAE,IAAI;IAAM,KAAK;IAAG,QAAQ;GAAE;GAC9B;IAAE,IAAI;IAAU,KAAK;IAAG,QAAQ;IAAG,YAAY;GAAE;GACjD;IAAE,IAAI;IAAM,KAAK;IAAG,QAAQ;GAAE;GAC9B;IAAE,IAAI;IAAM,KAAK;IAAG,QAAQ;GAAE;EAC/B;CACD;CAEA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAQ,KAAK;IAAG,QAAQ;IAAG,SAAS;GAAE;GAC5C;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAS,KAAK;IAAG,QAAQ;IAAG,SAAS;GAAE;GAC7C;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;IAAG,YAAY;GAAE;GAC9C;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAU,KAAK;IAAG,QAAQ;IAAG,YAAY;GAAE;EAClD;CACD;CAEA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;IAAG,YAAY;GAAE;GAC9C;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAU,KAAK;IAAG,QAAQ;IAAG,YAAY;GAAE;EAClD;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;IAAG,YAAY;GAAE;GAC9C;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;EAChC;CACD;CACA;EACC,IAAI;EACJ,OAAO;EACP,SAAS;EACT,MAAM;EACN,OAAO;GACN;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAO,KAAK;IAAG,QAAQ;GAAE;GAC/B;IAAE,IAAI;IAAU,KAAK;IAAG,QAAQ;IAAG,YAAY;GAAE;EAClD;CACD;AACD;AAIA,SAAgB,IAA8D;CAC7E,OAAO,EAA8B,EAAE,CAAC;AACzC;AAGA,SAAgB,EAAoB,GAAkD;CACrF,OAAO,EAA8B,MAAM,MAAW,EAAO,OAAO,CAAQ,KAAK,EAA8B;AAChH;AAEA,SAAgB,EAAuB,GAA0B;CAChE,OAAO,EAA8B,MAAM,MAAW,EAAO,OAAO,CAAQ,CAAC,EAAE,MAAM,UAAU;AAChG;;;;;;;;;;;;;;;;;;GE1WM,IAAsB;AAE5B,SAAS,EAAoB,EAAE,WAAQ,aAAU,MAA4D;CAC5G,OACC,kBAAC,QAAD;EAAM,WAAW,EAAG,EAAO,SAAS,KAAW,EAAO,cAAc;EAAG,OAAO,EAAe,CAAM;EAAG,eAAY;YAChH,EAAO,MAAM,KAAK,MAClB,kBAAC,QAAD;GAAsC,WAAW,EAAO;GAAa,OAAO,EAAmB,CAAI;EAAI,GAA5F,GAAG,EAAO,GAAG,GAAG,EAAK,IAAuE,CACvG;CACI,CAAA;AAER;AAKA,SAAgB,EAAa,EAC5B,OACA,UACA,gBACA,UACA,aACA,aAAU,GACV,aACA,sBACA,iBAAc,GACd,SACA,cACA,eACA,sBACA,mBACA,eAAY,kBACS;CACrB,IAAM,IAAW,EAAgC,IAAI,GAC/C,CAAC,GAAM,KAAW,EAAS,EAAK,GAChC,IAAgB,EAAQ,WAAW,MAAW,EAAO,OAAO,CAAK,GACjE,IAAiB,KAAiB,IAAI,EAAQ,KAAiB,KAAA,GAC/D,IAAgB,KAAkB,EAAQ,IAC1C,IAAe,GAAgB,SAAS,GACxC,EACL,gBACA,YACA,mBACA,qBACA,iBACA,gBACA,iBACA,UACA,aACA,eACA,iBACA,uBACA,2BACA,0BACA,iBACA,yBACG,EAAyB;EAC5B,SAAS;EACT;EACA;EACA,cAAc;EACd,mBAAmB;EACnB,WAAW,MAAW,EAAS,EAAO,EAAE;EACxC;EACA;EACA,aAAa;CACd,CAAC,GACK,IAAoB,EAA2B;EACpD,MAAM;EACN;EACA,cAAc;EACd,iBAAiB,MAAmB,KAAA;EACpC;EACA;EACA;EACA;CACD,CAAC,GACK,MAAgB,MAAkC;EACvD,EAAS,UAAU;CACpB;CAEA,OACC,kBAAC,GAAD;EACK;EACG;EACM;EACH;EACG;EACP;EACK;aACT,EAAE,cAAW,YAAS,qBAAkB;GACzC,IAAM,IAAS,GAAG,EAAU;GAE5B,OACC,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,GAAD;IACC,KAAK;IACL,SAAS;IACT,IAAI;IACJ,MAAK;IACK;IACV,UAAA;IACA,cAAa;IACb,MAAK;IACL,OAAO;IACP,iBAAc;IACd,iBAAe;IACf,iBAAe,IAAO,IAAS,KAAA;IAC/B,mBAAiB;IACjB,oBAAkB;IAClB,qBAAkB;IAClB,yBAAuB,IAAO,EAAkB,CAAM,IAAI,KAAA;IAC1D,cAAa,IAA+E,KAAA,IAApE,KAAa,qCAAqC;IAC1E,WAAQ;IACR,eAAe;IACf,gBAAgB,EAAO;IACvB,SACC,kBAAC,OAAD;KAAK,WAAW,EAAO;eAAvB,CACE,IACA,kBAAC,GAAD;MAAqB,QAAQ;MAAe,SAAA;KAAS,CAAA,IAErD,kBAAC,QAAD,EAAM,WAAW,EAAO,mBAAqB,CAAA,GAE9C,kBAAC,QAAD;MAAM,WAAW,EAAG,EAAO,aAAa,CAAC,KAAkB,EAAS,aAAa;gBAC/E;KACI,CAAA,CACF;;IAEN,cACC,kBAAC,GAAD;KACO;KACI;KACV,mBAAmB,EAAkB;KACrC,eAAe,EAAkB;KACjC,eAAc;KACd,gBAAe;IACf,CAAA;IAEF,SAAS,EAAkB;IAC3B,UAAU,MAAU;KACnB,EAAkB,mBAAmB,EAAM,aAAa;IACzD;IACA,YAAY,MAAU;KACrB,EAAuB,CAAK,GAExB,GAAM,oBAIV,EAAkB,qBAAqB;MACtC;MACA,oBAAoB;MACpB,uBAAuB;KACxB,CAAC;IACF;GACA,CAAA,GAED,kBAAC,GAAD;IACO;IACG;IACO;IACR;IACC;IACT,eAAe;IACf,gBAAgB,EAAkB,CAAM;IAC3B;IACK;IAClB,WAAW;IACX,WAAW,EAAG,EAAS,gBAAgB,EAAO,OAAO,CAAc;IACnE,iBAAiB,EAAO;IACxB,eAAe,EAAO;cACtB,kBAAC,OAAD;KAAK,WAAW,EAAO;eACrB,EAAQ,KAAK,GAAQ,MAAU;MAC/B,IAAM,IAAW,MAAU,GACrB,IAAS,MAAU,GACnB,IAAiB,IAAoB,CAAM,KAAK;MAGtD,OACC,kBAAC,UAAD;OAEC,IALe,GAAY,GAAQ,CAK/B;OACJ,MAAM,MAAS,EAAa,GAAO,CAAI;OACvC,MAAK;OACL,MAAK;OACL,UAAU;OACV,UAAU;OACV,iBAAe;OACf,iBAAe,KAAkB,KAAA;OACjC,cAAY,EAAO,cAAc,GAAG,EAAO,MAAM,IAAI,EAAO,gBAAgB,EAAO;OACnF,WAAW,EAAG,EAAO,QAAQ,KAAY,EAAO,gBAAgB,KAAU,EAAO,YAAY;OAC7F,WAAQ;OACR,iBAAe,KAAY,KAAA;OAC3B,cAAc,MAAU,EAAM,eAAe;OAC7C,eAAe,EAAa,CAAM;iBAfnC;QAgBC,kBAAC,QAAD;SAAM,WAAW,EAAO;mBACvB,kBAAC,GAAD,EAA6B,UAAS,CAAA;QACjC,CAAA;QACN,kBAAC,QAAD;SAAM,WAAU;mBAAhB,CACC,kBAAC,QAAD,EAAA,UAAO,EAAO,MAAY,CAAA,GACzB,EAAO,cAAc,kBAAC,QAAD,EAAA,UAAO,EAAO,YAAkB,CAAA,IAAI,IACrD;;QACN,kBAAC,QAAD;SAAM,WAAW,EAAO;SAAa,eAAY;mBAC/C,IAAW,kBAAC,GAAD,CAAY,CAAA,IAAI;QACvB,CAAA;OACC;SAzBF,EAAO,EAyBL;KAEV,CAAC;IACG,CAAA;GACO,CAAA,CACZ,EAAA,CAAA;EAEJ;CACY,CAAA;AAEf"}
1
+ {"version":3,"file":"layout-picker-C1sizRYa.js","names":[],"sources":["../../src/layout-picker/lib/layout.ts","../../src/layout-picker/lib/presets.ts","../../src/layout-picker/ui/LayoutPicker.module.scss","../../src/layout-picker/ui/LayoutPicker.tsx"],"sourcesContent":["import { type CSSProperties } from \"react\";\n\nimport { type LayoutPickerPreset, type LayoutPickerPresetCell } from \"./types\";\n\n/**\n * Возвращает CSS Grid-стиль для схематичного layout-пресета.\n */\nexport function getLayoutStyle(preset: LayoutPickerPreset, rowMinHeightInEm?: number): CSSProperties {\n\treturn {\n\t\tgridTemplateColumns: `repeat(${preset.columns}, minmax(0, 1fr))`,\n\t\tgridTemplateRows: `repeat(${preset.rows}, minmax(${rowMinHeightInEm ?? 0}em, 1fr))`\n\t};\n}\n\n/**\n * Возвращает позиционирование ячейки внутри CSS Grid.\n */\nexport function getLayoutCellStyle(cell: LayoutPickerPresetCell): CSSProperties {\n\treturn {\n\t\tgridColumn: `${cell.column} / span ${cell.columnSpan ?? 1}`,\n\t\tgridRow: `${cell.row} / span ${cell.rowSpan ?? 1}`\n\t};\n}\n","import { type LayoutPickerPreset } from \"./types\";\n\n/**\n * Базовый набор layout-пресетов для первого среза выбора схемы.\n *\n * id формата:\n * - \"2x3\" — 2 строки, 3 колонки\n * - \"2x2-l\" — 2x2 с большой ячейкой слева\n * - \"3x2-b\" — 3x2 с широкой нижней ячейкой\n */\nexport const DEFAULT_LAYOUT_PICKER_PRESETS = [\n\t{\n\t\tid: \"1x1\",\n\t\tlabel: \"1x1\",\n\t\tcolumns: 1,\n\t\trows: 1,\n\t\tcells: [{ id: \"c11\", row: 1, column: 1 }]\n\t},\n\t{\n\t\tid: \"1x2\",\n\t\tlabel: \"1x2\",\n\t\tcolumns: 2,\n\t\trows: 1,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"1x3\",\n\t\tlabel: \"1x3\",\n\t\tcolumns: 3,\n\t\trows: 1,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c13\", row: 1, column: 3 }\n\t\t]\n\t},\n\t{\n\t\tid: \"2x1\",\n\t\tlabel: \"2x1\",\n\t\tcolumns: 1,\n\t\trows: 2,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 }\n\t\t]\n\t},\n\t{\n\t\tid: \"2x2\",\n\t\tlabel: \"2x2\",\n\t\tcolumns: 2,\n\t\trows: 2,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"2x3\",\n\t\tlabel: \"2x3\",\n\t\tcolumns: 3,\n\t\trows: 2,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c13\", row: 1, column: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x1\",\n\t\tlabel: \"3x1\",\n\t\tcolumns: 1,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x2\",\n\t\tlabel: \"3x2\",\n\t\tcolumns: 2,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x3\",\n\t\tlabel: \"3x3\",\n\t\tcolumns: 3,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c13\", row: 1, column: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c33\", row: 3, column: 3 }\n\t\t]\n\t},\n\t{\n\t\tid: \"4x1\",\n\t\tlabel: \"4x1\",\n\t\tcolumns: 1,\n\t\trows: 4,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c41\", row: 4, column: 1 }\n\t\t]\n\t},\n\t{\n\t\tid: \"4x2\",\n\t\tlabel: \"4x2\",\n\t\tcolumns: 2,\n\t\trows: 4,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c41\", row: 4, column: 1 },\n\t\t\t{ id: \"c42\", row: 4, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"4x3\",\n\t\tlabel: \"4x3\",\n\t\tcolumns: 3,\n\t\trows: 4,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c13\", row: 1, column: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c33\", row: 3, column: 3 },\n\t\t\t{ id: \"c41\", row: 4, column: 1 },\n\t\t\t{ id: \"c42\", row: 4, column: 2 },\n\t\t\t{ id: \"c43\", row: 4, column: 3 }\n\t\t]\n\t},\n\n\t{\n\t\tid: \"2x2-l\",\n\t\tlabel: \"Большая слева + две справа\",\n\t\tcolumns: 2,\n\t\trows: 2,\n\t\tcells: [\n\t\t\t{ id: \"left\", row: 1, column: 1, rowSpan: 2 },\n\t\t\t{ id: \"rt\", row: 1, column: 2 },\n\t\t\t{ id: \"rb\", row: 2, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"2x2-r\",\n\t\tlabel: \"Две слева + большая справа\",\n\t\tcolumns: 2,\n\t\trows: 2,\n\t\tcells: [\n\t\t\t{ id: \"lt\", row: 1, column: 1 },\n\t\t\t{ id: \"lb\", row: 2, column: 1 },\n\t\t\t{ id: \"right\", row: 1, column: 2, rowSpan: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"2x2-t\",\n\t\tlabel: \"Широкая сверху + две снизу\",\n\t\tcolumns: 2,\n\t\trows: 2,\n\t\tcells: [\n\t\t\t{ id: \"top\", row: 1, column: 1, columnSpan: 2 },\n\t\t\t{ id: \"bl\", row: 2, column: 1 },\n\t\t\t{ id: \"br\", row: 2, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"2x2-b\",\n\t\tlabel: \"Две сверху + широкая снизу\",\n\t\tcolumns: 2,\n\t\trows: 2,\n\t\tcells: [\n\t\t\t{ id: \"tl\", row: 1, column: 1 },\n\t\t\t{ id: \"tr\", row: 1, column: 2 },\n\t\t\t{ id: \"bottom\", row: 2, column: 1, columnSpan: 2 }\n\t\t]\n\t},\n\n\t{\n\t\tid: \"3x2-t\",\n\t\tlabel: \"Широкая сверху + 2x2\",\n\t\tcolumns: 2,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"top\", row: 1, column: 1, columnSpan: 2 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x2-b\",\n\t\tlabel: \"2x2 + широкая снизу\",\n\t\tcolumns: 2,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"bottom\", row: 3, column: 1, columnSpan: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x2-m\",\n\t\tlabel: \"Широкая по центру\",\n\t\tcolumns: 2,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"tl\", row: 1, column: 1 },\n\t\t\t{ id: \"tr\", row: 1, column: 2 },\n\t\t\t{ id: \"middle\", row: 2, column: 1, columnSpan: 2 },\n\t\t\t{ id: \"bl\", row: 3, column: 1 },\n\t\t\t{ id: \"br\", row: 3, column: 2 }\n\t\t]\n\t},\n\n\t{\n\t\tid: \"3x3-l\",\n\t\tlabel: \"Большая слева + 2x3 справа\",\n\t\tcolumns: 3,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"left\", row: 1, column: 1, rowSpan: 3 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c13\", row: 1, column: 3 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c33\", row: 3, column: 3 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x3-r\",\n\t\tlabel: \"2x3 слева + большая справа\",\n\t\tcolumns: 3,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"right\", row: 1, column: 3, rowSpan: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x3-t\",\n\t\tlabel: \"Широкая сверху + 2x3\",\n\t\tcolumns: 3,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"top\", row: 1, column: 1, columnSpan: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c33\", row: 3, column: 3 }\n\t\t]\n\t},\n\t{\n\t\tid: \"3x3-b\",\n\t\tlabel: \"2x3 + широкая снизу\",\n\t\tcolumns: 3,\n\t\trows: 3,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c13\", row: 1, column: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 },\n\t\t\t{ id: \"bottom\", row: 3, column: 1, columnSpan: 3 }\n\t\t]\n\t},\n\n\t{\n\t\tid: \"4x2-t\",\n\t\tlabel: \"Широкая сверху + 3x2\",\n\t\tcolumns: 2,\n\t\trows: 4,\n\t\tcells: [\n\t\t\t{ id: \"top\", row: 1, column: 1, columnSpan: 2 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c41\", row: 4, column: 1 },\n\t\t\t{ id: \"c42\", row: 4, column: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"4x2-b\",\n\t\tlabel: \"3x2 + широкая снизу\",\n\t\tcolumns: 2,\n\t\trows: 4,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"bottom\", row: 4, column: 1, columnSpan: 2 }\n\t\t]\n\t},\n\t{\n\t\tid: \"4x3-t\",\n\t\tlabel: \"Широкая сверху + 3x3\",\n\t\tcolumns: 3,\n\t\trows: 4,\n\t\tcells: [\n\t\t\t{ id: \"top\", row: 1, column: 1, columnSpan: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c33\", row: 3, column: 3 },\n\t\t\t{ id: \"c41\", row: 4, column: 1 },\n\t\t\t{ id: \"c42\", row: 4, column: 2 },\n\t\t\t{ id: \"c43\", row: 4, column: 3 }\n\t\t]\n\t},\n\t{\n\t\tid: \"4x3-b\",\n\t\tlabel: \"3x3 + широкая снизу\",\n\t\tcolumns: 3,\n\t\trows: 4,\n\t\tcells: [\n\t\t\t{ id: \"c11\", row: 1, column: 1 },\n\t\t\t{ id: \"c12\", row: 1, column: 2 },\n\t\t\t{ id: \"c13\", row: 1, column: 3 },\n\t\t\t{ id: \"c21\", row: 2, column: 1 },\n\t\t\t{ id: \"c22\", row: 2, column: 2 },\n\t\t\t{ id: \"c23\", row: 2, column: 3 },\n\t\t\t{ id: \"c31\", row: 3, column: 1 },\n\t\t\t{ id: \"c32\", row: 3, column: 2 },\n\t\t\t{ id: \"c33\", row: 3, column: 3 },\n\t\t\t{ id: \"bottom\", row: 4, column: 1, columnSpan: 3 }\n\t\t]\n\t}\n] as const satisfies readonly LayoutPickerPreset[];\n\nexport type DefaultLayoutPickerPresetId = (typeof DEFAULT_LAYOUT_PICKER_PRESETS)[number][\"id\"];\n\nexport function getDefaultLayoutPickerPresetId(): DefaultLayoutPickerPresetId {\n\treturn DEFAULT_LAYOUT_PICKER_PRESETS[0].id;\n}\n\n/** Возвращает layout-пресет по id с fallback на дефолт chart-ракурса. */\nexport function resolveLayoutPreset(layoutId: string | undefined): LayoutPickerPreset {\n\treturn DEFAULT_LAYOUT_PICKER_PRESETS.find((preset) => preset.id === layoutId) ?? DEFAULT_LAYOUT_PICKER_PRESETS[0];\n}\n\nexport function resolveLayoutCellCount(layoutId: string): number {\n\treturn DEFAULT_LAYOUT_PICKER_PRESETS.find((preset) => preset.id === layoutId)?.cells.length ?? 1;\n}\n","@use \"@/styles/mixins\" as *;\n\n.valueOverlay {\n\tposition: absolute;\n\tinset: 0 calc(var(--control-height) + var(--space-xs)) 0 var(--space-sm);\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--space-sm);\n\tmin-width: 0;\n\tpointer-events: none;\n\toverflow: hidden;\n}\n\n.triggerInput {\n\t--ui-color: transparent;\n\t--ui-color-hover: transparent;\n\t--ui-color-active: transparent;\n\n\tcolor: transparent;\n\tcaret-color: transparent;\n}\n\n.triggerText {\n\tmin-width: 0;\n\tflex: 1 1 auto;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.popup {\n\twidth: min(calc(100vw - var(--space-lg) * 2), 44em);\n\tmax-height: min(75vh, 34em);\n}\n\n.popupLayout {\n\tmax-height: inherit;\n}\n\n.popupBody {\n\toverflow: auto;\n\tpadding: var(--space-xs);\n}\n\n.options {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fit, minmax(min(100%, 12em), 1fr));\n\tgap: var(--space-sm);\n}\n\n.option {\n\tposition: relative;\n\tdisplay: grid;\n\tgrid-template-columns: auto minmax(0, 1fr) auto;\n\talign-items: center;\n\tgap: var(--space-sm);\n\tmin-height: 3.5em;\n\tpadding: var(--space-sm);\n\tborder: var(--border);\n\tborder-radius: var(--radius-sm);\n\tbackground-color: var(--surface-0);\n\tcolor: var(--content-0);\n\ttext-align: left;\n\tcursor: pointer;\n\ttransition:\n\t\tbackground-color var(--transition-fast) ease,\n\t\tborder-color var(--transition-fast) ease,\n\t\tcolor var(--transition-fast) ease;\n\n\t@include hover(true) {\n\t\tbackground-color: var(--surface-1);\n\t\tborder-color: var(--border-1);\n\t}\n\n\t&:disabled {\n\t\tcursor: default;\n\t\topacity: var(--disabled-opacity);\n\t}\n}\n\n.optionActive {\n\tbackground-color: var(--surface-1);\n\tborder-color: var(--border-1);\n}\n\n.optionSelected {\n\t// border-color: var(--border-accent);\n\t// background-color: var(--surface-accent);\n\tcolor: var(--content-accent);\n}\n\n.optionPreviewWrap {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tmin-width: 3.5rem;\n}\n\n// .optionText {\n// \tmin-width: 0;\n// \tdisplay: grid;\n// \tgap: var(--space-xs);\n// }\n\n// .optionLabel {\n// overflow: hidden;\n// text-overflow: ellipsis;\n// white-space: nowrap;\n// }\n\n// .optionDescription {\n// \toverflow: hidden;\n// \tdisplay: -webkit-box;\n// \t-webkit-line-clamp: 2;\n// \t-webkit-box-orient: vertical;\n// \tcolor: var(--content-2);\n// \tfont-size: var(--font-size-sm);\n// }\n\n.optionCheck {\n\twidth: 1em;\n\theight: 1em;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tcolor: var(--content-accent);\n\n\tsvg {\n\t\twidth: 1em;\n\t\theight: 1em;\n\t}\n}\n\n.preview,\n.previewPlaceholder {\n\t--layout-picker-preview-size: 3.5em;\n\n\twidth: var(--layout-picker-preview-size);\n\theight: calc(var(--layout-picker-preview-size) * 0.72);\n\tflex: 0 0 auto;\n\t// background-color: var(--surface-0);\n\t// border: var(--border);\n\t// border-radius: var(--radius-xs);\n\t// padding: calc(var(--border-width) * 2);\n}\n\n.preview {\n\tdisplay: grid;\n\tgap: calc(var(--border-width) * 2);\n}\n\n.previewCompact,\n.previewPlaceholder {\n\t--layout-picker-preview-size: 1.5rem;\n}\n\n.previewCell {\n\tmin-width: 0;\n\tmin-height: 0;\n\tborder-radius: calc(var(--radius-xs) / 2);\n\tbackground-color: var(--surface-accent);\n\tborder: var(--border-width) solid var(--border-accent);\n}\n","import { useRef, useState } from \"react\";\n\nimport { type Placement } from \"@floating-ui/react\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CheckIcon } from \"lucide-react\";\n\nimport {\n\tPickerField,\n\tPickerPopup,\n\tPickerTriggerActions,\n\tPickerTriggerInput,\n\tusePickerFloatingListbox,\n\tusePickerTriggerController\n} from \"../../picker\";\nimport { type UiBaseProps } from \"../../types\";\nimport uiStyles from \"../../ui.module.scss\";\nimport { DEFAULT_LAYOUT_PICKER_PRESETS, getLayoutCellStyle, getLayoutStyle, type LayoutPickerPreset } from \"../lib\";\n\nimport styles from \"./LayoutPicker.module.scss\";\n\nexport interface LayoutPickerProps extends UiBaseProps<string> {\n\tid?: string;\n\tpresets?: readonly LayoutPickerPreset[];\n\tgetPresetDisabled?: (preset: LayoutPickerPreset) => boolean;\n\tariaLabel?: string;\n\tclassName?: string;\n\ttriggerClassName?: string;\n\tpopupClassName?: string;\n\tplacement?: Placement;\n}\n\nconst DEFAULT_PLACEHOLDER = \"Выберите раскладку\";\n\nfunction LayoutPresetPreview({ preset, compact = false }: { preset: LayoutPickerPreset; compact?: boolean }) {\n\treturn (\n\t\t<span className={cn(styles.preview, compact && styles.previewCompact)} style={getLayoutStyle(preset)} aria-hidden=\"true\">\n\t\t\t{preset.cells.map((cell) => (\n\t\t\t\t<span key={`${preset.id}:${cell.id}`} className={styles.previewCell} style={getLayoutCellStyle(cell)} />\n\t\t\t))}\n\t\t</span>\n\t);\n}\n\n/**\n * Контрол выбора layout-пресета. Не хранит бизнес-логику содержимого ячеек.\n */\nexport function LayoutPicker({\n\tid,\n\tlabel,\n\tdescription,\n\tvalue,\n\tonChange,\n\tpresets = DEFAULT_LAYOUT_PICKER_PRESETS,\n\tdisabled,\n\tgetPresetDisabled,\n\tplaceholder = DEFAULT_PLACEHOLDER,\n\tsize,\n\tariaLabel,\n\tclassName,\n\ttriggerClassName,\n\tpopupClassName,\n\tplacement = \"bottom-start\"\n}: LayoutPickerProps) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst [open, setOpen] = useState(false);\n\tconst selectedIndex = presets.findIndex((preset) => preset.id === value);\n\tconst selectedPreset = selectedIndex >= 0 ? presets[selectedIndex] : undefined;\n\tconst previewPreset = selectedPreset ?? presets[0];\n\tconst triggerLabel = selectedPreset?.label ?? placeholder;\n\tconst {\n\t\tactiveIndex,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference,\n\t\tsetFloating,\n\t\tsetOptionRef,\n\t\tclose,\n\t\topenList,\n\t\ttoggleOpen,\n\t\tselectOption,\n\t\tselectActiveOption,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t} = usePickerFloatingListbox({\n\t\toptions: presets,\n\t\tselectedIndex,\n\t\topen,\n\t\tonOpenChange: setOpen,\n\t\tgetOptionDisabled: getPresetDisabled,\n\t\tonSelect: (preset) => onChange(preset.id),\n\t\tdisabled,\n\t\tplacement,\n\t\ttriggerMode: \"display\"\n\t});\n\tconst triggerController = usePickerTriggerController({\n\t\tmode: \"display\",\n\t\topen,\n\t\tcurrentQuery: \"\",\n\t\thasDisplayValue: selectedPreset !== undefined,\n\t\tinputRef,\n\t\topenList,\n\t\tclose,\n\t\ttoggleOpen\n\t});\n\tconst setInputNode = (node: HTMLInputElement | null) => {\n\t\tinputRef.current = node;\n\t};\n\n\treturn (\n\t\t<PickerField\n\t\t\tid={id}\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\tclassName={className}>\n\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\tconst listId = `${controlId}-listbox`;\n\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<PickerTriggerInput\n\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\treadOnly\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\tvalue={triggerLabel}\n\t\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\taria-autocomplete=\"none\"\n\t\t\t\t\t\t\taria-activedescendant={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\taria-label={!labelId ? (ariaLabel ?? `Выбрать layout. Текущее значение: ${triggerLabel}`) : undefined}\n\t\t\t\t\t\t\tdata-ui=\"layout-picker-trigger\"\n\t\t\t\t\t\t\trootClassName={triggerClassName}\n\t\t\t\t\t\t\tinputClassName={styles.triggerInput}\n\t\t\t\t\t\t\toverlay={\n\t\t\t\t\t\t\t\t<div className={styles.valueOverlay}>\n\t\t\t\t\t\t\t\t\t{previewPreset ? (\n\t\t\t\t\t\t\t\t\t\t<LayoutPresetPreview preset={previewPreset} compact />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span className={styles.previewPlaceholder} />\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<span className={cn(styles.triggerText, !selectedPreset && uiStyles.uiPlaceholder)}>\n\t\t\t\t\t\t\t\t\t\t{triggerLabel}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t\t\t<PickerTriggerActions\n\t\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}\n\t\t\t\t\t\t\t\t\topenAriaLabel=\"Открыть список layout\"\n\t\t\t\t\t\t\t\t\tcloseAriaLabel=\"Закрыть список layout\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\tonActivateWhenOpen: selectActiveOption,\n\t\t\t\t\t\t\t\t\tenableSpaceActivation: true\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\tactiveOptionId={getActiveOptionId(listId)}\n\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\tclassName={cn(uiStyles.uiPopupOptions, styles.popup, popupClassName)}\n\t\t\t\t\t\t\tlayoutClassName={styles.popupLayout}\n\t\t\t\t\t\t\tbodyClassName={styles.popupBody}>\n\t\t\t\t\t\t\t<div className={styles.options}>\n\t\t\t\t\t\t\t\t{presets.map((preset, index) => {\n\t\t\t\t\t\t\t\t\tconst selected = index === selectedIndex;\n\t\t\t\t\t\t\t\t\tconst active = index === activeIndex;\n\t\t\t\t\t\t\t\t\tconst presetDisabled = getPresetDisabled?.(preset) ?? false;\n\t\t\t\t\t\t\t\t\tconst optionId = getOptionId(listId, index);\n\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tkey={preset.id}\n\t\t\t\t\t\t\t\t\t\t\tid={optionId}\n\t\t\t\t\t\t\t\t\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={presetDisabled}\n\t\t\t\t\t\t\t\t\t\t\taria-selected={selected}\n\t\t\t\t\t\t\t\t\t\t\taria-disabled={presetDisabled || undefined}\n\t\t\t\t\t\t\t\t\t\t\taria-label={preset.description ? `${preset.label}. ${preset.description}` : preset.label}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(styles.option, selected && styles.optionSelected, active && styles.optionActive)}\n\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"layout-picker-option\"\n\t\t\t\t\t\t\t\t\t\t\tdata-selected={selected || undefined}\n\t\t\t\t\t\t\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => selectOption(preset)}>\n\t\t\t\t\t\t\t\t\t\t\t<span className={styles.optionPreviewWrap}>\n\t\t\t\t\t\t\t\t\t\t\t\t<LayoutPresetPreview preset={preset} />\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"fontSizeSm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{preset.label}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t{preset.description ? <span>{preset.description}</span> : null}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<span className={styles.optionCheck} aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t{selected ? <CheckIcon /> : null}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}}\n\t\t</PickerField>\n\t);\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { a as e, r as t } from "./odata-DSW7z3nh.js";
2
- import { t as n } from "./MultiSelect-D1XYuwH1.js";
2
+ import { t as n } from "./MultiSelect-B0nfMSpS.js";
3
3
  import { n as r, t as i } from "./useODataSelectBase-BbeKdq6x.js";
4
4
  import { useCallback as a, useState as o } from "react";
5
5
  import { jsx as s } from "react/jsx-runtime";
@@ -123,4 +123,4 @@ function m({ label: e, description: t, disabled: r, placeholder: i, size: a, opt
123
123
  //#endregion
124
124
  export { l as i, d as n, u as r, m as t };
125
125
 
126
- //# sourceMappingURL=multi-select-BYsbh2ca.js.map
126
+ //# sourceMappingURL=multi-select-DCY3fonG.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"multi-select-BYsbh2ca.js","names":[],"sources":["../../src/multi-select/model/useODataMultiSelect.ts","../../src/multi-select/ui/ODataMultiSelect.tsx","../../src/multi-select/ui/ODataDependentSegmentMultiSelect.tsx","../../src/multi-select/ui/ODataDependentMultiSelect.tsx","../../src/multi-select/ui/SerializableMultiSelect.tsx"],"sourcesContent":["import { ODataCollectionModel, ODataSelectBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { mapSelectedItemsToValues, useODataSelectBase } from \"../../select/model/useODataSelectBase\";\n\ninterface UseODataMultiSelectOptions extends Omit<ODataSelectBaseProps, \"model\"> {\n\tmodel: Required<ODataCollectionModel>;\n\tonChange: (keys: string[]) => void;\n}\n\nexport function useODataMultiSelect({ odata, segment, model, value, dependencies, onChange }: UseODataMultiSelectOptions) {\n\tconst odataModel = useODataSelectBase({\n\t\todata,\n\t\tsegment,\n\t\tmodel,\n\t\tvalue,\n\t\tdependencies\n\t});\n\n\tconst handleChange = (items: CollectionItem[]) => {\n\t\tonChange(mapSelectedItemsToValues(items, odataModel.selectionKey));\n\t};\n\n\treturn {\n\t\t...odataModel,\n\t\thandleChange\n\t};\n}\n","import React from \"react\";\n\nimport { ODataSelectBaseProps, useODataCollectionModel } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { UiBaseProps } from \"../../types\";\nimport { useODataMultiSelect } from \"../model/useODataMultiSelect\";\n\nimport { MultiSelect } from \"./MultiSelect\";\n\ntype ODataMultiSelectProps = ODataSelectBaseProps & Omit<UiBaseProps<string[]>, \"placeholder\"> & {};\n\nexport const ODataMultiSelect: React.FC<ODataMultiSelectProps> = ({\n\todata,\n\tsegment,\n\tmodel: initialModel,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tvalue,\n\tdependencies,\n\tonChange,\n\tsize\n}) => {\n\tconst model = useODataCollectionModel(initialModel);\n\tconst odataModel = useODataMultiSelect({\n\t\todata,\n\t\tsegment,\n\t\tmodel,\n\t\tvalue,\n\t\tdependencies,\n\t\tonChange\n\t});\n\n\treturn (\n\t\t<MultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tsize={size}\n\t\t\tcodeKey={odataModel.codeKey}\n\t\t\ttextKey={odataModel.textKey}\n\t\t\thideCode={segment.hideCode ?? odata.hideCode}\n\t\t\titems={odataModel.filteredItems}\n\t\t\tvalue={odataModel.selectedItems}\n\t\t\tonChange={odataModel.handleChange}\n\t\t\tonQuery={odataModel.setQuery}\n\t\t\tquery={odataModel.query}\n\t\t\tdefaultFilter={false}\n\t\t\thighlightQuery={odataModel.debouncedQuery}\n\t\t\tdisabled={disabled || odataModel.isLoading}\n\t\t\tplaceholder={odataModel.placeholder}\n\t\t\terror={odataModel.isError ? \"Ошибка загрузки\" : undefined}\n\t\t/>\n\t);\n};\n","import { useCallback, useState } from \"react\";\n\nimport { ODataMultiSelect } from \"./ODataMultiSelect\";\n\nimport type { ODataDependentSegmentItem } from \"@ryuzaki13/react-foundation-api/odata\";\n\ninterface ODataDependentSegmentMultiSelectProps {\n\titem: ODataDependentSegmentItem;\n\t/**\n\t * Выбранные значения (управляемый компонент)\n\t */\n\tvalues?: Record<string, string[]>;\n\t/**\n\t * Обработчик изменения выбранных значений\n\t */\n\tonChange?: (selected: Record<string, string[]>) => void;\n\t/**\n\t * Ширина одного элемента в `em` единицах.\n\t *\n\t * @default 15\n\t */\n\twidth?: number;\n}\n\nexport const ODataDependentSegmentMultiSelect: React.FC<ODataDependentSegmentMultiSelectProps> = ({\n\titem,\n\tvalues,\n\tonChange,\n\twidth = 15\n}) => {\n\tconst [internalSelectedValues, setInternalSelectedValues] = useState<Record<string, string[]>>({});\n\tconst selectedValues = values ?? internalSelectedValues;\n\tconst widthStyle = `calc(${width}em + var(--width-add))`;\n\n\tconst handleSelectionChange = useCallback(\n\t\t(keys: string[]) => {\n\t\t\tconst nextSelectedValues = {\n\t\t\t\t...selectedValues,\n\t\t\t\t[item.id]: keys\n\t\t\t};\n\n\t\t\tif (!values) {\n\t\t\t\tsetInternalSelectedValues(nextSelectedValues);\n\t\t\t}\n\n\t\t\tonChange?.(nextSelectedValues);\n\t\t},\n\t\t[item.id, onChange, selectedValues, values]\n\t);\n\n\treturn (\n\t\t<div style={{ maxWidth: widthStyle, minWidth: widthStyle }}>\n\t\t\t<ODataMultiSelect\n\t\t\t\todata={item.odata}\n\t\t\t\tsegment={item.segment}\n\t\t\t\tmodel={item.model}\n\t\t\t\tdependencies={selectedValues}\n\t\t\t\tvalue={selectedValues[item.id]}\n\t\t\t\tonChange={handleSelectionChange}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { useState } from \"react\";\n\nimport { flattenODataDependentServices, ODataDependentBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { ODataDependentSegmentMultiSelect } from \"./ODataDependentSegmentMultiSelect\";\n\ninterface ODataDependentMultiSelectProps extends ODataDependentBaseProps {\n\t/**\n\t * Выбранные значения (управляемый компонент)\n\t */\n\tvalues?: Record<string, string[]>;\n\n\t/**\n\t * Обработчик изменения выбранных значений\n\t */\n\tonChange?: (selected: Record<string, string[]>) => void;\n\n\t/**\n\t * Ширина одного элемента в `em` единицах.\n\t *\n\t * @default 15\n\t */\n\twidth?: number;\n}\n\nexport const ODataDependentMultiSelect: React.FC<ODataDependentMultiSelectProps> = ({\n\twidth = 15,\n\todata,\n\tsegments,\n\tmodel,\n\tvalues,\n\tonChange\n}) => {\n\tconst [internalSelectedValues, setInternalSelectedValues] = useState<Record<string, string[]>>({});\n\tconst selectedValues = values ?? internalSelectedValues;\n\tconst items = flattenODataDependentServices([\n\t\t{\n\t\t\todata,\n\t\t\tsegments,\n\t\t\tmodel\n\t\t}\n\t]);\n\n\treturn items.map((item) => (\n\t\t<ODataDependentSegmentMultiSelect\n\t\t\tkey={item.id}\n\t\t\titem={item}\n\t\t\tvalues={selectedValues}\n\t\t\tonChange={(nextSelectedValues) => {\n\t\t\t\tif (!values) {\n\t\t\t\t\tsetInternalSelectedValues(nextSelectedValues);\n\t\t\t\t}\n\n\t\t\t\tonChange?.(nextSelectedValues);\n\t\t\t}}\n\t\t\twidth={width}\n\t\t/>\n\t));\n};\n","import { MultiSelect } from \"./MultiSelect\";\n\nimport type { UiBaseProps } from \"../../types\";\nimport type { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\ntype SerializableOptionRecord = Record<string, unknown>;\n\ntype SerializableOptionKeyField<TOption extends SerializableOptionRecord> = {\n\t[K in keyof TOption]: Extract<TOption[K], string> extends never ? never : K;\n}[keyof TOption];\n\nexport interface SerializableMultiSelectProps<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n> extends UiBaseProps<Extract<TOption[TOptionKey], string>[]> {\n\toptions: readonly TOption[];\n\toptionKey: TOptionKey;\n\toptionLabel: TOptionLabel;\n\trenderCode?: true;\n}\n\nfunction getSerializableOptionKey<TOption extends SerializableOptionRecord, TOptionKey extends SerializableOptionKeyField<TOption>>(\n\toption: TOption,\n\toptionKey: TOptionKey\n): Extract<TOption[TOptionKey], string> {\n\treturn option[optionKey] as Extract<TOption[TOptionKey], string>;\n}\n\nfunction getSerializableOptionLabel<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>(option: TOption, optionLabel: TOptionLabel, optionKey: TOptionKey): string {\n\tconst label = option[optionLabel];\n\n\tif (typeof label === \"string\") {\n\t\treturn label;\n\t}\n\n\tconst key = getSerializableOptionKey(option, optionKey);\n\treturn typeof key === \"string\" ? key : String(key);\n}\n\nexport function SerializableMultiSelect<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\toptions,\n\tvalue,\n\tonChange,\n\toptionKey,\n\toptionLabel,\n\trenderCode\n}: SerializableMultiSelectProps<TOption, TOptionKey, TOptionLabel>) {\n\t// Как будто можно не мемоизировать, нет смысла\n\tconst items = options.map<CollectionItem>((option) => ({\n\t\tkey: String(getSerializableOptionKey(option, optionKey)),\n\t\ttext: getSerializableOptionLabel(option, optionLabel, optionKey)\n\t}));\n\tconst selectedKeys = new Set((value ?? []).map((item) => String(item)));\n\tconst selectedItems = items.filter((item) => selectedKeys.has(item.key));\n\n\treturn (\n\t\t<MultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\titems={items}\n\t\t\tcodeKey=\"key\"\n\t\t\ttextKey=\"text\"\n\t\t\thideCode={renderCode ? undefined : true}\n\t\t\tvalue={selectedItems}\n\t\t\tonChange={(nextItems) => onChange(nextItems.map((item) => item.key) as Extract<TOption[TOptionKey], string>[])}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"multi-select-DCY3fonG.js","names":[],"sources":["../../src/multi-select/model/useODataMultiSelect.ts","../../src/multi-select/ui/ODataMultiSelect.tsx","../../src/multi-select/ui/ODataDependentSegmentMultiSelect.tsx","../../src/multi-select/ui/ODataDependentMultiSelect.tsx","../../src/multi-select/ui/SerializableMultiSelect.tsx"],"sourcesContent":["import { ODataCollectionModel, ODataSelectBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { mapSelectedItemsToValues, useODataSelectBase } from \"../../select/model/useODataSelectBase\";\n\ninterface UseODataMultiSelectOptions extends Omit<ODataSelectBaseProps, \"model\"> {\n\tmodel: Required<ODataCollectionModel>;\n\tonChange: (keys: string[]) => void;\n}\n\nexport function useODataMultiSelect({ odata, segment, model, value, dependencies, onChange }: UseODataMultiSelectOptions) {\n\tconst odataModel = useODataSelectBase({\n\t\todata,\n\t\tsegment,\n\t\tmodel,\n\t\tvalue,\n\t\tdependencies\n\t});\n\n\tconst handleChange = (items: CollectionItem[]) => {\n\t\tonChange(mapSelectedItemsToValues(items, odataModel.selectionKey));\n\t};\n\n\treturn {\n\t\t...odataModel,\n\t\thandleChange\n\t};\n}\n","import React from \"react\";\n\nimport { ODataSelectBaseProps, useODataCollectionModel } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { UiBaseProps } from \"../../types\";\nimport { useODataMultiSelect } from \"../model/useODataMultiSelect\";\n\nimport { MultiSelect } from \"./MultiSelect\";\n\ntype ODataMultiSelectProps = ODataSelectBaseProps & Omit<UiBaseProps<string[]>, \"placeholder\"> & {};\n\nexport const ODataMultiSelect: React.FC<ODataMultiSelectProps> = ({\n\todata,\n\tsegment,\n\tmodel: initialModel,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tvalue,\n\tdependencies,\n\tonChange,\n\tsize\n}) => {\n\tconst model = useODataCollectionModel(initialModel);\n\tconst odataModel = useODataMultiSelect({\n\t\todata,\n\t\tsegment,\n\t\tmodel,\n\t\tvalue,\n\t\tdependencies,\n\t\tonChange\n\t});\n\n\treturn (\n\t\t<MultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tsize={size}\n\t\t\tcodeKey={odataModel.codeKey}\n\t\t\ttextKey={odataModel.textKey}\n\t\t\thideCode={segment.hideCode ?? odata.hideCode}\n\t\t\titems={odataModel.filteredItems}\n\t\t\tvalue={odataModel.selectedItems}\n\t\t\tonChange={odataModel.handleChange}\n\t\t\tonQuery={odataModel.setQuery}\n\t\t\tquery={odataModel.query}\n\t\t\tdefaultFilter={false}\n\t\t\thighlightQuery={odataModel.debouncedQuery}\n\t\t\tdisabled={disabled || odataModel.isLoading}\n\t\t\tplaceholder={odataModel.placeholder}\n\t\t\terror={odataModel.isError ? \"Ошибка загрузки\" : undefined}\n\t\t/>\n\t);\n};\n","import { useCallback, useState } from \"react\";\n\nimport { ODataMultiSelect } from \"./ODataMultiSelect\";\n\nimport type { ODataDependentSegmentItem } from \"@ryuzaki13/react-foundation-api/odata\";\n\ninterface ODataDependentSegmentMultiSelectProps {\n\titem: ODataDependentSegmentItem;\n\t/**\n\t * Выбранные значения (управляемый компонент)\n\t */\n\tvalues?: Record<string, string[]>;\n\t/**\n\t * Обработчик изменения выбранных значений\n\t */\n\tonChange?: (selected: Record<string, string[]>) => void;\n\t/**\n\t * Ширина одного элемента в `em` единицах.\n\t *\n\t * @default 15\n\t */\n\twidth?: number;\n}\n\nexport const ODataDependentSegmentMultiSelect: React.FC<ODataDependentSegmentMultiSelectProps> = ({\n\titem,\n\tvalues,\n\tonChange,\n\twidth = 15\n}) => {\n\tconst [internalSelectedValues, setInternalSelectedValues] = useState<Record<string, string[]>>({});\n\tconst selectedValues = values ?? internalSelectedValues;\n\tconst widthStyle = `calc(${width}em + var(--width-add))`;\n\n\tconst handleSelectionChange = useCallback(\n\t\t(keys: string[]) => {\n\t\t\tconst nextSelectedValues = {\n\t\t\t\t...selectedValues,\n\t\t\t\t[item.id]: keys\n\t\t\t};\n\n\t\t\tif (!values) {\n\t\t\t\tsetInternalSelectedValues(nextSelectedValues);\n\t\t\t}\n\n\t\t\tonChange?.(nextSelectedValues);\n\t\t},\n\t\t[item.id, onChange, selectedValues, values]\n\t);\n\n\treturn (\n\t\t<div style={{ maxWidth: widthStyle, minWidth: widthStyle }}>\n\t\t\t<ODataMultiSelect\n\t\t\t\todata={item.odata}\n\t\t\t\tsegment={item.segment}\n\t\t\t\tmodel={item.model}\n\t\t\t\tdependencies={selectedValues}\n\t\t\t\tvalue={selectedValues[item.id]}\n\t\t\t\tonChange={handleSelectionChange}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { useState } from \"react\";\n\nimport { flattenODataDependentServices, ODataDependentBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { ODataDependentSegmentMultiSelect } from \"./ODataDependentSegmentMultiSelect\";\n\ninterface ODataDependentMultiSelectProps extends ODataDependentBaseProps {\n\t/**\n\t * Выбранные значения (управляемый компонент)\n\t */\n\tvalues?: Record<string, string[]>;\n\n\t/**\n\t * Обработчик изменения выбранных значений\n\t */\n\tonChange?: (selected: Record<string, string[]>) => void;\n\n\t/**\n\t * Ширина одного элемента в `em` единицах.\n\t *\n\t * @default 15\n\t */\n\twidth?: number;\n}\n\nexport const ODataDependentMultiSelect: React.FC<ODataDependentMultiSelectProps> = ({\n\twidth = 15,\n\todata,\n\tsegments,\n\tmodel,\n\tvalues,\n\tonChange\n}) => {\n\tconst [internalSelectedValues, setInternalSelectedValues] = useState<Record<string, string[]>>({});\n\tconst selectedValues = values ?? internalSelectedValues;\n\tconst items = flattenODataDependentServices([\n\t\t{\n\t\t\todata,\n\t\t\tsegments,\n\t\t\tmodel\n\t\t}\n\t]);\n\n\treturn items.map((item) => (\n\t\t<ODataDependentSegmentMultiSelect\n\t\t\tkey={item.id}\n\t\t\titem={item}\n\t\t\tvalues={selectedValues}\n\t\t\tonChange={(nextSelectedValues) => {\n\t\t\t\tif (!values) {\n\t\t\t\t\tsetInternalSelectedValues(nextSelectedValues);\n\t\t\t\t}\n\n\t\t\t\tonChange?.(nextSelectedValues);\n\t\t\t}}\n\t\t\twidth={width}\n\t\t/>\n\t));\n};\n","import { MultiSelect } from \"./MultiSelect\";\n\nimport type { UiBaseProps } from \"../../types\";\nimport type { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\ntype SerializableOptionRecord = Record<string, unknown>;\n\ntype SerializableOptionKeyField<TOption extends SerializableOptionRecord> = {\n\t[K in keyof TOption]: Extract<TOption[K], string> extends never ? never : K;\n}[keyof TOption];\n\nexport interface SerializableMultiSelectProps<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n> extends UiBaseProps<Extract<TOption[TOptionKey], string>[]> {\n\toptions: readonly TOption[];\n\toptionKey: TOptionKey;\n\toptionLabel: TOptionLabel;\n\trenderCode?: true;\n}\n\nfunction getSerializableOptionKey<TOption extends SerializableOptionRecord, TOptionKey extends SerializableOptionKeyField<TOption>>(\n\toption: TOption,\n\toptionKey: TOptionKey\n): Extract<TOption[TOptionKey], string> {\n\treturn option[optionKey] as Extract<TOption[TOptionKey], string>;\n}\n\nfunction getSerializableOptionLabel<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>(option: TOption, optionLabel: TOptionLabel, optionKey: TOptionKey): string {\n\tconst label = option[optionLabel];\n\n\tif (typeof label === \"string\") {\n\t\treturn label;\n\t}\n\n\tconst key = getSerializableOptionKey(option, optionKey);\n\treturn typeof key === \"string\" ? key : String(key);\n}\n\nexport function SerializableMultiSelect<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\toptions,\n\tvalue,\n\tonChange,\n\toptionKey,\n\toptionLabel,\n\trenderCode\n}: SerializableMultiSelectProps<TOption, TOptionKey, TOptionLabel>) {\n\t// Как будто можно не мемоизировать, нет смысла\n\tconst items = options.map<CollectionItem>((option) => ({\n\t\tkey: String(getSerializableOptionKey(option, optionKey)),\n\t\ttext: getSerializableOptionLabel(option, optionLabel, optionKey)\n\t}));\n\tconst selectedKeys = new Set((value ?? []).map((item) => String(item)));\n\tconst selectedItems = items.filter((item) => selectedKeys.has(item.key));\n\n\treturn (\n\t\t<MultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\titems={items}\n\t\t\tcodeKey=\"key\"\n\t\t\ttextKey=\"text\"\n\t\t\thideCode={renderCode ? undefined : true}\n\t\t\tvalue={selectedItems}\n\t\t\tonChange={(nextItems) => onChange(nextItems.map((item) => item.key) as Extract<TOption[TOptionKey], string>[])}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./ui.module-BisoTevy.js";
2
- import { c as t, o as n, r } from "./Input-BmjlpA09.js";
2
+ import { c as t, o as n, r } from "./Input-BYUl3UFn.js";
3
3
  import { t as i } from "./separator-B72Aq-6a.js";
4
4
  import { forwardRef as a, useEffect as o, useEffectEvent as s, useMemo as c, useRef as l, useState as u } from "react";
5
5
  import { cn as d } from "@ryuzaki13/react-foundation-lib/utils";
@@ -315,4 +315,4 @@ function I({ mode: e, open: t, currentQuery: n, hasDisplayValue: r, inputRef: i,
315
315
  //#endregion
316
316
  export { j as a, D as c, w as d, x as f, M as i, E as l, P as n, k as o, N as r, O as s, I as t, T as u };
317
317
 
318
- //# sourceMappingURL=picker-Dg55Ss-B.js.map
318
+ //# sourceMappingURL=picker-DGXq3ikg.js.map