xmlui 0.10.14 → 0.10.16

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 (74) hide show
  1. package/dist/lib/{index-779mp2Bm.mjs → index-D4RYJasT.mjs} +2952 -937
  2. package/dist/lib/index.css +1 -1
  3. package/dist/lib/{initMock-CAXdczCj.mjs → initMock-qzTZlH-6.mjs} +1 -1
  4. package/dist/lib/language-server-web-worker.mjs +1 -1
  5. package/dist/lib/language-server.mjs +1 -1
  6. package/dist/lib/{metadata-utils-D90qqMGc.mjs → metadata-utils-CtY0QcvH.mjs} +2 -1
  7. package/dist/lib/{server-common-lmBDLpUh.mjs → server-common-Cine5nRR.mjs} +1 -1
  8. package/dist/lib/xmlui-parser.d.ts +1 -1
  9. package/dist/lib/xmlui.d.ts +87 -11
  10. package/dist/lib/xmlui.mjs +72 -37
  11. package/dist/metadata/{collectedComponentMetadata-7DFXlw-J.mjs → collectedComponentMetadata-BQaefK3f.mjs} +3189 -1242
  12. package/dist/metadata/{initMock-AFWEftc6.mjs → initMock-Cz6QssI3.mjs} +1 -1
  13. package/dist/metadata/style.css +1 -1
  14. package/dist/metadata/xmlui-metadata.mjs +1 -1
  15. package/dist/metadata/xmlui-metadata.umd.js +3 -3
  16. package/dist/scripts/package.json +2 -3
  17. package/dist/scripts/src/components/Animation/AnimationNative.js +5 -1
  18. package/dist/scripts/src/components/AppState/AppState.js +32 -2
  19. package/dist/scripts/src/components/AppState/AppStateNative.js +27 -3
  20. package/dist/scripts/src/components/AutoComplete/AutoComplete.js +1 -5
  21. package/dist/scripts/src/components/AutoComplete/AutoCompleteContext.js +2 -0
  22. package/dist/scripts/src/components/AutoComplete/AutoCompleteNative.js +263 -82
  23. package/dist/scripts/src/components/Button/Button.js +5 -1
  24. package/dist/scripts/src/components/Charts/PieChart/PieChartNative.js +41 -2
  25. package/dist/scripts/src/components/DropdownMenu/DropdownMenuNative.js +7 -9
  26. package/dist/scripts/src/components/Form/FormNative.js +33 -25
  27. package/dist/scripts/src/components/FormItem/ItemWithLabel.js +3 -3
  28. package/dist/scripts/src/components/Icon/IconNative.js +18 -15
  29. package/dist/scripts/src/components/NavGroup/NavGroup.spec.js +182 -123
  30. package/dist/scripts/src/components/NavGroup/NavGroupNative.js +14 -6
  31. package/dist/scripts/src/components/NestedApp/AppWithCodeViewNative.js +1 -1
  32. package/dist/scripts/src/components/NumberBox/NumberBox.js +4 -4
  33. package/dist/scripts/src/components/NumberBox/NumberBox.spec.js +112 -423
  34. package/dist/scripts/src/components/NumberBox/NumberBoxNative.js +18 -4
  35. package/dist/scripts/src/components/Option/Option.js +3 -1
  36. package/dist/scripts/src/components/Select/HiddenOption.js +1 -1
  37. package/dist/scripts/src/components/SelectionStore/SelectionStoreNative.js +3 -1
  38. package/dist/scripts/src/components/Slider/Slider.spec.js +46 -13
  39. package/dist/scripts/src/components/Slider/SliderNative.js +19 -9
  40. package/dist/scripts/src/components/Table/Table.js +7 -1
  41. package/dist/scripts/src/components/Table/TableNative.js +4 -1
  42. package/dist/scripts/src/components/Table/useRowSelection.js +215 -1
  43. package/dist/scripts/src/components/TextBox/TextBox.js +1 -5
  44. package/dist/scripts/src/components/TextBox/TextBox.spec.js +368 -324
  45. package/dist/scripts/src/components/TextBox/TextBoxNative.js +10 -15
  46. package/dist/scripts/src/components/Theme/ThemeNative.js +2 -6
  47. package/dist/scripts/src/components/TimeInput/TimeInput.js +1 -5
  48. package/dist/scripts/src/components/TimeInput/TimeInputNative.js +2 -9
  49. package/dist/scripts/src/components/Tree/Tree-dynamic.spec.js +2894 -0
  50. package/dist/scripts/src/components/Tree/Tree.spec.js +2932 -0
  51. package/dist/scripts/src/components/Tree/TreeComponent.js +266 -10
  52. package/dist/scripts/src/components/Tree/TreeNative.js +1048 -23
  53. package/dist/scripts/src/components/Tree/testData.js +272 -0
  54. package/dist/scripts/src/components-core/ApiBoundComponent.js +38 -24
  55. package/dist/scripts/src/components-core/RestApiProxy.js +0 -1
  56. package/dist/scripts/src/components-core/behaviors/BehaviorContext.js +54 -0
  57. package/dist/scripts/src/components-core/behaviors/CoreBehaviors.js +81 -0
  58. package/dist/scripts/src/components-core/descriptorHelper.js +1 -0
  59. package/dist/scripts/src/components-core/parts.js +4 -1
  60. package/dist/scripts/src/components-core/rendering/AppRoot.js +2 -1
  61. package/dist/scripts/src/components-core/rendering/ComponentAdapter.js +32 -48
  62. package/dist/scripts/src/components-core/rendering/nodeUtils.js +6 -0
  63. package/dist/scripts/src/components-core/theming/layout-resolver.js +2 -0
  64. package/dist/scripts/src/components-core/utils/treeUtils.js +187 -12
  65. package/dist/scripts/src/index.js +38 -1
  66. package/dist/scripts/src/testing/ComponentDrivers.js +77 -31
  67. package/dist/scripts/src/testing/drivers/NumberBoxDriver.js +44 -0
  68. package/dist/scripts/src/testing/drivers/TextBoxDriver.js +20 -0
  69. package/dist/scripts/src/testing/drivers/TreeDriver.js +13 -0
  70. package/dist/scripts/src/testing/fixtures.js +40 -9
  71. package/dist/standalone/xmlui-standalone.es.d.ts +158 -15
  72. package/dist/standalone/xmlui-standalone.umd.js +36 -36
  73. package/package.json +2 -3
  74. package/dist/scripts/src/components/Animation/Animation.js +0 -50
@@ -53,6 +53,7 @@ const lodash_es_1 = require("lodash-es");
53
53
  const react_compose_refs_1 = require("@radix-ui/react-compose-refs");
54
54
  const extractParam_1 = require("../utils/extractParam");
55
55
  const ThemeContext_1 = require("../theming/ThemeContext");
56
+ const StyleContext_1 = require("../theming/StyleContext");
56
57
  const mergeProps_1 = require("../utils/mergeProps");
57
58
  const ComponentDecorator_1 = __importDefault(require("../ComponentDecorator"));
58
59
  const valueExtractor_1 = require("../rendering/valueExtractor");
@@ -68,9 +69,7 @@ const event_handlers_1 = require("../event-handlers");
68
69
  const UnknownComponent_1 = __importDefault(require("./UnknownComponent"));
69
70
  const InvalidComponent_1 = __importDefault(require("./InvalidComponent"));
70
71
  const layout_resolver_1 = require("../theming/layout-resolver");
71
- const TooltipNative_1 = require("../../components/Tooltip/TooltipNative");
72
- const StyleContext_1 = require("../theming/StyleContext");
73
- const AnimationNative_1 = require("../../components/Animation/AnimationNative");
72
+ const BehaviorContext_1 = require("../behaviors/BehaviorContext");
74
73
  /**
75
74
  * This component's primary responsibility is to transform a particular component definition
76
75
  * into its React representation using the current rendering context.
@@ -176,39 +175,32 @@ const ComponentAdapter = (0, react_1.forwardRef)(function ComponentAdapter(_a, r
176
175
  // });
177
176
  }, [appContext.mediaSize, layoutContextRef, safeNode.props, valueExtractor]);
178
177
  // const className = useComponentStyle(cssProps);
179
- // --- Check if the component has a tooltip property
180
- const tooltipText = (0, react_1.useMemo)(() => { var _a; return valueExtractor((_a = safeNode.props) === null || _a === void 0 ? void 0 : _a.tooltip, true); }, [safeNode.props, valueExtractor]);
181
- // --- Check if the component has a tooltip property
182
- const tooltipMarkdown = (0, react_1.useMemo)(() => { var _a; return valueExtractor((_a = safeNode.props) === null || _a === void 0 ? void 0 : _a.tooltipMarkdown, true); }, [safeNode.props, valueExtractor]);
183
- const tooltipOptions = (0, react_1.useMemo)(() => { var _a; return valueExtractor((_a = safeNode.props) === null || _a === void 0 ? void 0 : _a.tooltipOptions, true); }, [safeNode.props, valueExtractor]);
184
- const animation = (0, react_1.useMemo)(() => { var _a; return valueExtractor((_a = safeNode.props) === null || _a === void 0 ? void 0 : _a.animation, true); }, [safeNode.props, valueExtractor]);
185
- const animationOptions = (0, react_1.useMemo)(() => { var _a; return valueExtractor((_a = safeNode.props) === null || _a === void 0 ? void 0 : _a.animationOptions, true); }, [safeNode.props, valueExtractor]);
186
178
  // --- As compileLayout generates new cssProps and nonCssProps objects every time, we need to
187
179
  // --- memoize them using shallow comparison to avoid unnecessary re-renders.
188
180
  const stableLayoutCss = (0, hooks_1.useShallowCompareMemoize)(cssProps);
189
181
  const className = (0, StyleContext_1.useComponentStyle)(stableLayoutCss);
190
182
  const { inspectId, refreshInspection } = (0, InspectorContext_1.useInspector)(safeNode, uid);
183
+ // --- Assemble the renderer context we pass down the rendering chain
184
+ const rendererContext = {
185
+ node: safeNode,
186
+ state: state[uid] || constants_1.EMPTY_OBJECT,
187
+ updateState: memoedUpdateState,
188
+ appContext,
189
+ extractValue: valueExtractor,
190
+ lookupEventHandler: memoedLookupEventHandler,
191
+ lookupAction: memoedLookupAction,
192
+ lookupSyncCallback: memoedLookupSyncCallback,
193
+ extractResourceUrl,
194
+ renderChild: memoedRenderChild,
195
+ registerComponentApi: memoedRegisterComponentApi,
196
+ className,
197
+ layoutContext: layoutContextRef === null || layoutContextRef === void 0 ? void 0 : layoutContextRef.current,
198
+ uid,
199
+ };
191
200
  // --- No special behavior, let's render the component according to its definition.
192
201
  let renderedNode = null;
193
202
  let renderingError = null;
194
203
  try {
195
- // --- Assemble the renderer context we pass down the rendering chain
196
- const rendererContext = {
197
- node: safeNode,
198
- state: state[uid] || constants_1.EMPTY_OBJECT,
199
- updateState: memoedUpdateState,
200
- appContext,
201
- extractValue: valueExtractor,
202
- lookupEventHandler: memoedLookupEventHandler,
203
- lookupAction: memoedLookupAction,
204
- lookupSyncCallback: memoedLookupSyncCallback,
205
- extractResourceUrl,
206
- renderChild: memoedRenderChild,
207
- registerComponentApi: memoedRegisterComponentApi,
208
- className,
209
- layoutContext: layoutContextRef === null || layoutContextRef === void 0 ? void 0 : layoutContextRef.current,
210
- uid,
211
- };
212
204
  if (safeNode.type === "Slot") {
213
205
  // --- Transpose the children from the parent component to the slot in
214
206
  // --- the compound component
@@ -245,6 +237,18 @@ const ComponentAdapter = (0, react_1.forwardRef)(function ComponentAdapter(_a, r
245
237
  if (isApiBound) {
246
238
  return ((0, jsx_runtime_1.jsx)(ApiBoundComponent_1.ApiBoundComponent, { uid: uid, renderChild: memoedRenderChild, node: safeNode, apiBoundEvents: apiBoundEvents, apiBoundProps: apiBoundProps, layoutContextRef: layoutContextRef, parentRendererContext: parentRenderContext }, safeNode.uid));
247
239
  }
240
+ /**
241
+ *
242
+ */
243
+ const { getBehaviors } = (0, BehaviorContext_1.useBehaviors)();
244
+ const behaviors = getBehaviors();
245
+ if (!isCompoundComponent) {
246
+ for (const behavior of behaviors) {
247
+ if (behavior.canAttach(rendererContext.node, descriptor)) {
248
+ renderedNode = behavior.attach(rendererContext, renderedNode);
249
+ }
250
+ }
251
+ }
248
252
  // --- The current layout context may suggest to wrap the rendered node.
249
253
  if ((_b = layoutContextRef.current) === null || _b === void 0 ? void 0 : _b.wrapChild) {
250
254
  renderedNode = layoutContextRef.current.wrapChild(rendererContext, renderedNode, descriptor);
@@ -280,27 +284,7 @@ const ComponentAdapter = (0, react_1.forwardRef)(function ComponentAdapter(_a, r
280
284
  ? (0, react_1.cloneElement)(renderedNode, null, children)
281
285
  : renderedNode;
282
286
  }
283
- const applyWrappers = (node) => {
284
- // --- Handle animations and tooltips together
285
- if (animation && (tooltipMarkdown || tooltipText)) {
286
- const parsedOptions = (0, TooltipNative_1.parseTooltipOptions)(tooltipOptions);
287
- const parsedAnimationOptions = (0, AnimationNative_1.parseAnimationOptions)(animationOptions);
288
- return ((0, jsx_runtime_1.jsx)(TooltipNative_1.Tooltip, Object.assign({ text: tooltipText, markdown: tooltipMarkdown }, parsedOptions, { children: (0, jsx_runtime_1.jsx)(AnimationNative_1.Animation, Object.assign({ animation: (0, AnimationNative_1.parseAnimation)(animation) }, parsedAnimationOptions, { children: node })) })));
289
- }
290
- // --- Handle animation
291
- if (animation) {
292
- const parsedAnimationOptions = (0, AnimationNative_1.parseAnimationOptions)(animationOptions);
293
- return ((0, jsx_runtime_1.jsx)(AnimationNative_1.Animation, Object.assign({ animation: (0, AnimationNative_1.parseAnimation)(animation) }, parsedAnimationOptions, { children: node })));
294
- }
295
- // --- Handle tooltip
296
- if (tooltipMarkdown || tooltipText) {
297
- const parsedOptions = (0, TooltipNative_1.parseTooltipOptions)(tooltipOptions);
298
- return ((0, jsx_runtime_1.jsx)(TooltipNative_1.Tooltip, Object.assign({ text: tooltipText, markdown: tooltipMarkdown }, parsedOptions, { children: node })));
299
- }
300
- // --- No wrappers needed
301
- return node;
302
- };
303
- return applyWrappers(nodeToRender);
287
+ return nodeToRender;
304
288
  });
305
289
  /**
306
290
  * This function renders the content of a slot. If the slot is named, it looks for a template
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasRenderableChildren = hasRenderableChildren;
4
+ function hasRenderableChildren(children) {
5
+ return !!(children === null || children === void 0 ? void 0 : children.some((child) => (child === null || child === void 0 ? void 0 : child.type) !== "Slot"));
6
+ }
@@ -144,6 +144,7 @@ function resolveLayoutProps(layoutProps = constants_1.EMPTY_OBJECT, layoutContex
144
144
  collectCss("zoom");
145
145
  collectCss("cursor");
146
146
  collectCss("whiteSpace");
147
+ collectCss("transform");
147
148
  // --- Outline
148
149
  collectCss("outline");
149
150
  collectCss("outlineWidth");
@@ -375,6 +376,7 @@ const layoutPatterns = {
375
376
  textDecorationStyle: [],
376
377
  textDecorationThickness: [],
377
378
  textUnderlineOffset: [],
379
+ transform: [],
378
380
  // --- Outline
379
381
  outline: [],
380
382
  outlineWidth: [],
@@ -4,21 +4,34 @@ exports.flattenNode = flattenNode;
4
4
  exports.toFlatTree = toFlatTree;
5
5
  exports.walkTree = walkTree;
6
6
  exports.unPackTree = unPackTree;
7
- function flattenNode(node, depth, result, openedIds) {
8
- const { children, uid } = node;
9
- const isExpanded = openedIds.includes(uid);
10
- result.push(Object.assign(Object.assign({}, node), { hasChildren: !!children && children.length > 0, depth,
11
- isExpanded }));
7
+ exports.flatToNative = flatToNative;
8
+ exports.hierarchyToNative = hierarchyToNative;
9
+ function flattenNode(node, depth, result, openedIds, dynamicField, nodeStates) {
10
+ const { children, key } = node;
11
+ const isExpanded = openedIds.includes(key);
12
+ // Check if node has actual children OR is a dynamic node that can load children
13
+ const hasActualChildren = !!children && children.length > 0;
14
+ const isDynamic = dynamicField && node[dynamicField];
15
+ const hasChildren = hasActualChildren || isDynamic;
16
+ // Get loading state for this node
17
+ const loadingState = (nodeStates === null || nodeStates === void 0 ? void 0 : nodeStates.get(key)) || 'unloaded';
18
+ const flatNode = Object.assign(Object.assign({}, node), { hasChildren,
19
+ depth,
20
+ isExpanded,
21
+ loadingState,
22
+ // Ensure key is preserved (in case it was overwritten by ...node spread)
23
+ key: key || node.key || node.id });
24
+ result.push(flatNode);
12
25
  if (isExpanded && children) {
13
26
  for (let child of children) {
14
- flattenNode(child, depth + 1, result, openedIds);
27
+ flattenNode(child, depth + 1, result, openedIds, dynamicField, nodeStates);
15
28
  }
16
29
  }
17
30
  }
18
- function toFlatTree(treeData, openedIds) {
31
+ function toFlatTree(treeData, openedIds, dynamicField, nodeStates) {
19
32
  const ret = [];
20
33
  treeData.forEach((node) => {
21
- flattenNode(node, 0, ret, openedIds);
34
+ flattenNode(node, 0, ret, openedIds, dynamicField, nodeStates);
22
35
  });
23
36
  return ret;
24
37
  }
@@ -33,12 +46,12 @@ function unPackTree(items = [], parentIds = [], parentPath = []) {
33
46
  let treeItemsById = {};
34
47
  items.forEach((item, index) => {
35
48
  const path = [...parentPath, index];
36
- const uid = item.uid || item.cid;
37
- const childTree = unPackTree(item.children, [...parentIds, uid], path);
38
- const treeItem = Object.assign(Object.assign({}, item), { uid: uid, key: uid, parentIds,
49
+ const id = item.id || item.cid;
50
+ const childTree = unPackTree(item.children, [...parentIds, id], path);
51
+ const treeItem = Object.assign(Object.assign({}, item), { id: id, key: id, parentIds,
39
52
  path, children: childTree.treeData, selectable: item.selectable });
40
53
  treeData.push(treeItem);
41
- treeItemsById[uid] = treeItem;
54
+ treeItemsById[id] = treeItem;
42
55
  treeItemsById = Object.assign(Object.assign({}, treeItemsById), childTree.treeItemsById);
43
56
  });
44
57
  return {
@@ -46,3 +59,165 @@ function unPackTree(items = [], parentIds = [], parentPath = []) {
46
59
  treeItemsById,
47
60
  };
48
61
  }
62
+ /**
63
+ * Transforms flat array data with parent-child relationships into UnPackedTreeData format
64
+ * @param flatData Array of flat objects with id and parentId relationships
65
+ * @param fieldConfig Configuration for mapping object fields to tree properties
66
+ * @returns UnPackedTreeData structure suitable for Tree component
67
+ */
68
+ function flatToNative(flatData, fieldConfig) {
69
+ if (!flatData || flatData.length === 0) {
70
+ return { treeData: [], treeItemsById: {} };
71
+ }
72
+ // Build parent-to-children map for efficient lookup
73
+ const childrenMap = new Map();
74
+ const itemsById = new Map();
75
+ const rootItems = [];
76
+ // First pass: organize items and build relationships
77
+ flatData.forEach(item => {
78
+ const id = item[fieldConfig.idField];
79
+ const parentId = item[fieldConfig.parentField || 'parentId'];
80
+ // Store item for lookup
81
+ itemsById.set(id, item);
82
+ if (parentId && parentId !== '') {
83
+ // Has parent - add to children map
84
+ if (!childrenMap.has(parentId)) {
85
+ childrenMap.set(parentId, []);
86
+ }
87
+ childrenMap.get(parentId).push(item);
88
+ }
89
+ else {
90
+ // Root item
91
+ rootItems.push(item);
92
+ }
93
+ });
94
+ // Generate unique IDs for internal tree structure
95
+ let idCounter = 1;
96
+ const sourceIdToId = new Map();
97
+ const getOrCreateId = (sourceId) => {
98
+ if (!sourceIdToId.has(sourceId)) {
99
+ sourceIdToId.set(sourceId, `flat_${idCounter++}`);
100
+ }
101
+ return sourceIdToId.get(sourceId);
102
+ };
103
+ // Recursive function to build TreeNode structure
104
+ const buildTreeNode = (item, parentIds = [], pathSegments = []) => {
105
+ var _a;
106
+ const sourceId = item[fieldConfig.idField];
107
+ const id = getOrCreateId(sourceId);
108
+ const displayName = item[fieldConfig.labelField] || sourceId;
109
+ const currentPath = [...pathSegments, displayName];
110
+ // Get children for this item
111
+ const childItems = childrenMap.get(sourceId) || [];
112
+ const children = childItems.map(childItem => buildTreeNode(childItem, [...parentIds, sourceId], currentPath));
113
+ // Build the TreeNode
114
+ const treeNode = Object.assign(Object.assign(Object.assign(Object.assign({ id, key: sourceId, path: currentPath, displayName,
115
+ parentIds, selectable: fieldConfig.selectableField ? ((_a = item[fieldConfig.selectableField]) !== null && _a !== void 0 ? _a : true) : true, children }, item), (fieldConfig.iconField && item[fieldConfig.iconField] && {
116
+ icon: item[fieldConfig.iconField]
117
+ })), (fieldConfig.iconExpandedField && item[fieldConfig.iconExpandedField] && {
118
+ iconExpanded: item[fieldConfig.iconExpandedField]
119
+ })), (fieldConfig.iconCollapsedField && item[fieldConfig.iconCollapsedField] && {
120
+ iconCollapsed: item[fieldConfig.iconCollapsedField]
121
+ }));
122
+ return treeNode;
123
+ };
124
+ // Build tree structure from root items
125
+ const treeData = rootItems.map(rootItem => buildTreeNode(rootItem));
126
+ // Build lookup map by ID
127
+ const treeItemsById = {};
128
+ const collectNodes = (nodes) => {
129
+ nodes.forEach(node => {
130
+ treeItemsById[node.id] = node;
131
+ if (node.children) {
132
+ collectNodes(node.children);
133
+ }
134
+ });
135
+ };
136
+ collectNodes(treeData);
137
+ return {
138
+ treeData,
139
+ treeItemsById,
140
+ };
141
+ }
142
+ /**
143
+ * Transforms hierarchical nested object data into UnPackedTreeData format
144
+ * @param hierarchyData Single object or array of objects with nested children structure
145
+ * @param fieldConfig Configuration for mapping object fields to tree properties
146
+ * @returns UnPackedTreeData structure suitable for Tree component
147
+ */
148
+ function hierarchyToNative(hierarchyData, fieldConfig) {
149
+ if (!hierarchyData) {
150
+ return { treeData: [], treeItemsById: {} };
151
+ }
152
+ // Ensure we're working with an array
153
+ const rootItems = Array.isArray(hierarchyData) ? hierarchyData : [hierarchyData];
154
+ if (rootItems.length === 0) {
155
+ return { treeData: [], treeItemsById: {} };
156
+ }
157
+ // Generate unique IDs for internal tree structure
158
+ let idCounter = 1;
159
+ const sourceIdToId = new Map();
160
+ const getOrCreateId = (sourceId) => {
161
+ if (!sourceIdToId.has(sourceId)) {
162
+ sourceIdToId.set(sourceId, `hierarchy_${idCounter++}`);
163
+ }
164
+ return sourceIdToId.get(sourceId);
165
+ };
166
+ // Set to track visited nodes for circular reference detection
167
+ const visitedIds = new Set();
168
+ // Recursive function to build TreeNode structure from hierarchical data
169
+ const buildTreeNode = (item, parentIds = [], pathSegments = []) => {
170
+ var _a, _b;
171
+ const sourceId = item[fieldConfig.idField];
172
+ const displayName = item[fieldConfig.labelField] || sourceId;
173
+ // Circular reference detection
174
+ if (visitedIds.has(sourceId)) {
175
+ // Return a simple node without children to break the cycle
176
+ const id = getOrCreateId(sourceId);
177
+ return Object.assign(Object.assign({ id, key: sourceId, path: [...pathSegments, displayName], displayName,
178
+ parentIds, selectable: fieldConfig.selectableField ? ((_a = item[fieldConfig.selectableField]) !== null && _a !== void 0 ? _a : true) : true, children: [] }, item), (fieldConfig.iconField && item[fieldConfig.iconField] && {
179
+ icon: item[fieldConfig.iconField]
180
+ }));
181
+ }
182
+ // Mark as visited
183
+ visitedIds.add(sourceId);
184
+ const id = getOrCreateId(sourceId);
185
+ const currentPath = [...pathSegments, displayName];
186
+ // Get children from the specified children field
187
+ const childrenField = fieldConfig.childrenField || 'children';
188
+ const childItems = item[childrenField] || [];
189
+ // Recursively build children
190
+ const children = childItems.map((childItem) => buildTreeNode(childItem, [...parentIds, sourceId], currentPath));
191
+ // Unmark as visited after processing (for depth-first traversal)
192
+ visitedIds.delete(sourceId);
193
+ // Build the TreeNode
194
+ const treeNode = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ id, path: currentPath, displayName,
195
+ parentIds, selectable: fieldConfig.selectableField ? ((_b = item[fieldConfig.selectableField]) !== null && _b !== void 0 ? _b : true) : true }, item), (fieldConfig.iconField && item[fieldConfig.iconField] && {
196
+ icon: item[fieldConfig.iconField]
197
+ })), (fieldConfig.iconExpandedField && item[fieldConfig.iconExpandedField] && {
198
+ iconExpanded: item[fieldConfig.iconExpandedField]
199
+ })), (fieldConfig.iconCollapsedField && item[fieldConfig.iconCollapsedField] && {
200
+ iconCollapsed: item[fieldConfig.iconCollapsedField]
201
+ })), {
202
+ // Set TreeNode-specific properties AFTER spreading item to ensure they're not overwritten
203
+ children, key: sourceId });
204
+ return treeNode;
205
+ };
206
+ // Build tree structure from root items
207
+ const treeData = rootItems.map(rootItem => buildTreeNode(rootItem));
208
+ // Build lookup map by ID
209
+ const treeItemsById = {};
210
+ const collectNodes = (nodes) => {
211
+ nodes.forEach(node => {
212
+ treeItemsById[node.id] = node;
213
+ if (node.children) {
214
+ collectNodes(node.children);
215
+ }
216
+ });
217
+ };
218
+ collectNodes(treeData);
219
+ return {
220
+ treeData,
221
+ treeItemsById,
222
+ };
223
+ }
@@ -36,7 +36,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.StandaloneComponent = exports.useEvent = exports.StyleRegistry = exports.StyleProvider = exports.useAppLayoutContext = exports.useSearchContextContent = exports.Breakout = exports.Logo = exports.ToneChangerButton = exports.LinkNative = exports.VisuallyHidden = exports.NestedApp = exports.TextBox = exports.Text = exports.XmlUiHelper = exports.builtInThemes = exports.useThemes = exports.Spinner = exports.ApiInterceptorProvider = exports.xmlUiMarkupToComponent = exports.errReportComponent = exports.useLogger = exports.useDevTools = exports.toCssVar = exports.useColors = exports.Tabs = exports.TabItem = exports.getColor = exports.Splitter = exports.Button = exports.Stack = exports.Icon = exports.ErrorBoundary = exports.AppRoot = exports.useTheme = exports.startApp = exports.parseScssVar = exports.dComponent = exports.d = exports.createMetadata = exports.createUserDefinedComponentRenderer = exports.createComponentRenderer = exports.StandaloneExtensionManager = exports.StandaloneApp = void 0;
39
+ exports.Splitter = exports.Button = exports.Stack = exports.Icon = exports.ErrorBoundary = exports.AppRoot = exports.useTheme = exports.startApp = exports.parseScssVar = exports.dValueApi = exports.dValue = exports.dValidationStatus = exports.dTriggerTemplate = exports.dSetValueApi = exports.dStartText = exports.dStartIcon = exports.dRequired = exports.dReadonly = exports.dPlaceholder = exports.dOrientation = exports.dMulti = exports.dMaxLength = exports.dLostFocus = exports.dLabelWidth = exports.dLabelPosition = exports.dLabelBreak = exports.dLabel = exports.dInternal = exports.dInitialValue = exports.dIndeterminate = exports.dGotFocus = exports.dExpand = exports.dExpanded = exports.dEndText = exports.dEndIcon = exports.dFocus = exports.dEnabled = exports.dDidOpen = exports.dDidClose = exports.dDidChange = exports.dCollapse = exports.dClick = exports.dAutoFocus = exports.dComponent = exports.d = exports.createMetadata = exports.createUserDefinedComponentRenderer = exports.createComponentRenderer = exports.StandaloneExtensionManager = exports.StandaloneApp = void 0;
40
+ exports.Theme = exports.StandaloneComponent = exports.useEvent = exports.StyleRegistry = exports.StyleProvider = exports.useAppLayoutContext = exports.useSearchContextContent = exports.Breakout = exports.Logo = exports.ToneChangerButton = exports.LinkNative = exports.VisuallyHidden = exports.NestedApp = exports.TextBox = exports.Text = exports.XmlUiHelper = exports.builtInThemes = exports.useThemes = exports.Spinner = exports.ApiInterceptorProvider = exports.xmlUiMarkupToComponent = exports.errReportComponent = exports.useLogger = exports.useDevTools = exports.toCssVar = exports.useColors = exports.Tabs = exports.TabItem = exports.getColor = void 0;
40
41
  const StandaloneApp_1 = __importStar(require("./components-core/StandaloneApp"));
41
42
  exports.StandaloneApp = StandaloneApp_1.default;
42
43
  Object.defineProperty(exports, "startApp", { enumerable: true, get: function () { return StandaloneApp_1.startApp; } });
@@ -103,6 +104,8 @@ const ToneChangerButton_1 = require("./components/ToneChangerButton/ToneChangerB
103
104
  Object.defineProperty(exports, "ToneChangerButton", { enumerable: true, get: function () { return ToneChangerButton_1.ToneChangerButton; } });
104
105
  const LogoNative_1 = require("./components/Logo/LogoNative");
105
106
  Object.defineProperty(exports, "Logo", { enumerable: true, get: function () { return LogoNative_1.Logo; } });
107
+ const ThemeNative_1 = require("./components/Theme/ThemeNative");
108
+ Object.defineProperty(exports, "Theme", { enumerable: true, get: function () { return ThemeNative_1.Theme; } });
106
109
  const SearchContext_1 = require("./components/App/SearchContext");
107
110
  Object.defineProperty(exports, "useSearchContextContent", { enumerable: true, get: function () { return SearchContext_1.useSearchContextContent; } });
108
111
  const AppLayoutContext_1 = require("./components/App/AppLayoutContext");
@@ -117,5 +120,39 @@ const metadata_helpers_1 = require("./components/metadata-helpers");
117
120
  Object.defineProperty(exports, "createMetadata", { enumerable: true, get: function () { return metadata_helpers_1.createMetadata; } });
118
121
  Object.defineProperty(exports, "d", { enumerable: true, get: function () { return metadata_helpers_1.d; } });
119
122
  Object.defineProperty(exports, "dComponent", { enumerable: true, get: function () { return metadata_helpers_1.dComponent; } });
123
+ Object.defineProperty(exports, "dAutoFocus", { enumerable: true, get: function () { return metadata_helpers_1.dAutoFocus; } });
124
+ Object.defineProperty(exports, "dClick", { enumerable: true, get: function () { return metadata_helpers_1.dClick; } });
125
+ Object.defineProperty(exports, "dCollapse", { enumerable: true, get: function () { return metadata_helpers_1.dCollapse; } });
126
+ Object.defineProperty(exports, "dDidChange", { enumerable: true, get: function () { return metadata_helpers_1.dDidChange; } });
127
+ Object.defineProperty(exports, "dDidClose", { enumerable: true, get: function () { return metadata_helpers_1.dDidClose; } });
128
+ Object.defineProperty(exports, "dDidOpen", { enumerable: true, get: function () { return metadata_helpers_1.dDidOpen; } });
129
+ Object.defineProperty(exports, "dEnabled", { enumerable: true, get: function () { return metadata_helpers_1.dEnabled; } });
130
+ Object.defineProperty(exports, "dFocus", { enumerable: true, get: function () { return metadata_helpers_1.dFocus; } });
131
+ Object.defineProperty(exports, "dEndIcon", { enumerable: true, get: function () { return metadata_helpers_1.dEndIcon; } });
132
+ Object.defineProperty(exports, "dEndText", { enumerable: true, get: function () { return metadata_helpers_1.dEndText; } });
133
+ Object.defineProperty(exports, "dExpanded", { enumerable: true, get: function () { return metadata_helpers_1.dExpanded; } });
134
+ Object.defineProperty(exports, "dExpand", { enumerable: true, get: function () { return metadata_helpers_1.dExpand; } });
135
+ Object.defineProperty(exports, "dGotFocus", { enumerable: true, get: function () { return metadata_helpers_1.dGotFocus; } });
136
+ Object.defineProperty(exports, "dIndeterminate", { enumerable: true, get: function () { return metadata_helpers_1.dIndeterminate; } });
137
+ Object.defineProperty(exports, "dInitialValue", { enumerable: true, get: function () { return metadata_helpers_1.dInitialValue; } });
138
+ Object.defineProperty(exports, "dInternal", { enumerable: true, get: function () { return metadata_helpers_1.dInternal; } });
139
+ Object.defineProperty(exports, "dLabel", { enumerable: true, get: function () { return metadata_helpers_1.dLabel; } });
140
+ Object.defineProperty(exports, "dLabelBreak", { enumerable: true, get: function () { return metadata_helpers_1.dLabelBreak; } });
141
+ Object.defineProperty(exports, "dLabelPosition", { enumerable: true, get: function () { return metadata_helpers_1.dLabelPosition; } });
142
+ Object.defineProperty(exports, "dLabelWidth", { enumerable: true, get: function () { return metadata_helpers_1.dLabelWidth; } });
143
+ Object.defineProperty(exports, "dLostFocus", { enumerable: true, get: function () { return metadata_helpers_1.dLostFocus; } });
144
+ Object.defineProperty(exports, "dMaxLength", { enumerable: true, get: function () { return metadata_helpers_1.dMaxLength; } });
145
+ Object.defineProperty(exports, "dMulti", { enumerable: true, get: function () { return metadata_helpers_1.dMulti; } });
146
+ Object.defineProperty(exports, "dOrientation", { enumerable: true, get: function () { return metadata_helpers_1.dOrientation; } });
147
+ Object.defineProperty(exports, "dPlaceholder", { enumerable: true, get: function () { return metadata_helpers_1.dPlaceholder; } });
148
+ Object.defineProperty(exports, "dReadonly", { enumerable: true, get: function () { return metadata_helpers_1.dReadonly; } });
149
+ Object.defineProperty(exports, "dRequired", { enumerable: true, get: function () { return metadata_helpers_1.dRequired; } });
150
+ Object.defineProperty(exports, "dStartIcon", { enumerable: true, get: function () { return metadata_helpers_1.dStartIcon; } });
151
+ Object.defineProperty(exports, "dStartText", { enumerable: true, get: function () { return metadata_helpers_1.dStartText; } });
152
+ Object.defineProperty(exports, "dSetValueApi", { enumerable: true, get: function () { return metadata_helpers_1.dSetValueApi; } });
153
+ Object.defineProperty(exports, "dTriggerTemplate", { enumerable: true, get: function () { return metadata_helpers_1.dTriggerTemplate; } });
154
+ Object.defineProperty(exports, "dValidationStatus", { enumerable: true, get: function () { return metadata_helpers_1.dValidationStatus; } });
155
+ Object.defineProperty(exports, "dValue", { enumerable: true, get: function () { return metadata_helpers_1.dValue; } });
156
+ Object.defineProperty(exports, "dValueApi", { enumerable: true, get: function () { return metadata_helpers_1.dValueApi; } });
120
157
  const StandaloneComponent_1 = __importDefault(require("./components-core/rendering/StandaloneComponent"));
121
158
  exports.StandaloneComponent = StandaloneComponent_1.default;
@@ -9,8 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.SpinnerDriver = exports.LabelDriver = exports.CheckboxDriver = exports.CodeBlockDriver = exports.HtmlTagDriver = exports.FormItemDriver = exports.OptionDriver = exports.NoResultDriver = exports.BadgeDriver = exports.AppFooterDriver = exports.AppHeaderDriver = exports.AccordionDriver = exports.CardDriver = exports.NavPanelDriver = exports.NavGroupDriver = exports.NavLinkDriver = exports.LinkDriver = exports.VStackDriver = exports.HStackDriver = exports.StackDriver = exports.IconDriver = exports.HeadingDriver = exports.TextDriver = exports.ListDriver = exports.ProgressBarDriver = exports.TextAreaDriver = exports.TextBoxDriver = exports.NumberBoxDriver = exports.RadioGroupDriver = exports.SelectDriver = exports.AutoCompleteDriver = exports.DatePickerDriver = exports.RangeDriver = exports.SliderDriver = exports.ItemsDriver = exports.MarkdownDriver = exports.ValidationDisplayDriver = exports.ValidationSummaryDriver = exports.FormDriver = exports.BackdropDriver = exports.FileUploadDropZoneDriver = exports.FileInputDriver = exports.ExpandableItemDriver = exports.SplitterDriver = exports.AvatarDriver = exports.ContentSeparatorDriver = exports.ButtonDriver = exports.TestStateDriver = exports.InputComponentDriver = exports.ComponentDriver = void 0;
13
- exports.DropdownMenuDriver = void 0;
12
+ exports.SliderDriver = exports.DropdownMenuDriver = exports.SpinnerDriver = exports.LabelDriver = exports.CheckboxDriver = exports.CodeBlockDriver = exports.HtmlTagDriver = exports.FormItemDriver = exports.OptionDriver = exports.NoResultDriver = exports.BadgeDriver = exports.AppFooterDriver = exports.AppHeaderDriver = exports.AccordionDriver = exports.CardDriver = exports.NavPanelDriver = exports.NavGroupDriver = exports.NavLinkDriver = exports.LinkDriver = exports.VStackDriver = exports.HStackDriver = exports.StackDriver = exports.IconDriver = exports.HeadingDriver = exports.TextDriver = exports.ListDriver = exports.ProgressBarDriver = exports.TextAreaDriver = exports.RadioGroupDriver = exports.SelectDriver = exports.AutoCompleteDriver = exports.DatePickerDriver = exports.RangeDriver = exports.ItemsDriver = exports.MarkdownDriver = exports.ValidationDisplayDriver = exports.ValidationSummaryDriver = exports.FormDriver = exports.BackdropDriver = exports.FileUploadDropZoneDriver = exports.FileInputDriver = exports.ExpandableItemDriver = exports.SplitterDriver = exports.AvatarDriver = exports.ContentSeparatorDriver = exports.ButtonDriver = exports.TestStateDriver = exports.InputComponentDriver = exports.ComponentDriver = void 0;
14
13
  const component_test_helpers_1 = require("./component-test-helpers");
15
14
  class ComponentDriver {
16
15
  constructor({ locator, page }) {
@@ -37,9 +36,21 @@ class ComponentDriver {
37
36
  get component() {
38
37
  return this.locator;
39
38
  }
39
+ getByTestId(testId) {
40
+ return this.component.getByTestId(testId).first();
41
+ }
40
42
  getByPartName(part) {
41
43
  return this.component.locator(`[data-part-id="${part}"]`).first();
42
44
  }
45
+ getIcons() {
46
+ return this.component.locator('[data-icon-name="*"]');
47
+ }
48
+ getIconsByName(name) {
49
+ return this.component.locator(`[data-icon-name="${name}"]`);
50
+ }
51
+ getIconByName(name) {
52
+ return this.component.locator(`[data-icon-name="${name}"]`).first();
53
+ }
43
54
  /**
44
55
  * Gets the html tag name of the final rendered component
45
56
  */
@@ -440,7 +451,7 @@ class FileUploadDropZoneDriver extends ComponentDriver {
440
451
  return {
441
452
  name,
442
453
  mimeType: "text/plain",
443
- buffer: Buffer.from("test content")
454
+ buffer: Buffer.from("test content"),
444
455
  };
445
456
  });
446
457
  // Set files on the hidden input
@@ -451,7 +462,7 @@ class FileUploadDropZoneDriver extends ComponentDriver {
451
462
  const event = new DragEvent("drop", {
452
463
  bubbles: true,
453
464
  cancelable: true,
454
- dataTransfer: new DataTransfer()
465
+ dataTransfer: new DataTransfer(),
455
466
  });
456
467
  // Add files to dataTransfer if needed for component logic
457
468
  fileNames.forEach((fileName) => {
@@ -623,10 +634,6 @@ exports.MarkdownDriver = MarkdownDriver;
623
634
  class ItemsDriver extends ComponentDriver {
624
635
  }
625
636
  exports.ItemsDriver = ItemsDriver;
626
- // --- Slider
627
- class SliderDriver extends ComponentDriver {
628
- }
629
- exports.SliderDriver = SliderDriver;
630
637
  // --- Range
631
638
  class RangeDriver extends ComponentDriver {
632
639
  }
@@ -736,29 +743,6 @@ exports.SelectDriver = SelectDriver;
736
743
  class RadioGroupDriver extends ComponentDriver {
737
744
  }
738
745
  exports.RadioGroupDriver = RadioGroupDriver;
739
- // --- NumberBox
740
- class NumberBoxDriver extends ComponentDriver {
741
- get field() {
742
- return this.component.locator("input");
743
- }
744
- get label() {
745
- return this.component.locator("label");
746
- }
747
- get placeholder() {
748
- return this.field.getAttribute("placeholder");
749
- }
750
- get spinnerUpButton() {
751
- return this.component.locator("button").and(this.component.locator("[data-spinner='up']"));
752
- }
753
- get spinnerDownButton() {
754
- return this.component.locator("button").and(this.component.locator("[data-spinner='down']"));
755
- }
756
- }
757
- exports.NumberBoxDriver = NumberBoxDriver;
758
- // --- TextBox
759
- class TextBoxDriver extends InputComponentDriver {
760
- }
761
- exports.TextBoxDriver = TextBoxDriver;
762
746
  // --- TextArea
763
747
  class TextAreaDriver extends InputComponentDriver {
764
748
  }
@@ -1353,3 +1337,65 @@ class DropdownMenuDriver extends ComponentDriver {
1353
1337
  }
1354
1338
  }
1355
1339
  exports.DropdownMenuDriver = DropdownMenuDriver;
1340
+ // --- Slider
1341
+ class SliderDriver extends ComponentDriver {
1342
+ getActiveThumb() {
1343
+ return __awaiter(this, arguments, void 0, function* (thumbNumber = 0) {
1344
+ const thumbs = this.page.getByRole("slider");
1345
+ const thumbCount = yield thumbs.count();
1346
+ if (thumbCount === 0) {
1347
+ throw new Error("No slider thumb found to drag");
1348
+ }
1349
+ if (thumbNumber < 0) {
1350
+ thumbNumber = 0;
1351
+ }
1352
+ else if (thumbNumber >= thumbCount) {
1353
+ thumbNumber = thumbCount - 1;
1354
+ }
1355
+ return thumbs.nth(thumbNumber);
1356
+ });
1357
+ }
1358
+ dragThumbByMouse(location_1) {
1359
+ return __awaiter(this, arguments, void 0, function* (location, thumbNumber = 0) {
1360
+ const track = this.page.locator("[data-track]");
1361
+ yield track.waitFor({ state: "visible" });
1362
+ const activeThumb = yield this.getActiveThumb(thumbNumber);
1363
+ yield activeThumb.waitFor({ state: "visible" });
1364
+ // Get the thumb's current position for relative movement
1365
+ const thumbBox = yield activeThumb.boundingBox();
1366
+ if (!thumbBox) {
1367
+ throw new Error("Could not get thumb bounding box");
1368
+ }
1369
+ const trackBox = yield track.boundingBox();
1370
+ if (!trackBox) {
1371
+ throw new Error("Could not get track bounding box");
1372
+ }
1373
+ // Calculate target position relative to track
1374
+ let targetX;
1375
+ if (location === "start") {
1376
+ targetX = trackBox.x;
1377
+ }
1378
+ else if (location === "end") {
1379
+ targetX = trackBox.x + trackBox.width;
1380
+ }
1381
+ else { // middle
1382
+ targetX = trackBox.x + trackBox.width / 2;
1383
+ }
1384
+ const targetY = trackBox.y + trackBox.height / 2;
1385
+ yield activeThumb.hover();
1386
+ yield this.page.mouse.down({ button: "left" });
1387
+ yield this.page.mouse.move(targetX, targetY);
1388
+ yield this.page.mouse.up();
1389
+ });
1390
+ }
1391
+ stepThumbByKeyboard(key_1) {
1392
+ return __awaiter(this, arguments, void 0, function* (key, thumbNumber = 0, repeat = 1) {
1393
+ const activeThumb = yield this.getActiveThumb(thumbNumber);
1394
+ yield activeThumb.focus();
1395
+ for (let i = 0; i < repeat; i++) {
1396
+ yield this.page.keyboard.press(key);
1397
+ }
1398
+ });
1399
+ }
1400
+ }
1401
+ exports.SliderDriver = SliderDriver;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.NumberBoxDriver = void 0;
13
+ const parts_1 = require("../../components-core/parts");
14
+ const ComponentDrivers_1 = require("../ComponentDrivers");
15
+ const PART_SPINNER_UP = "spinnerUp";
16
+ const PART_SPINNER_DOWN = "spinnerDown";
17
+ class NumberBoxDriver extends ComponentDrivers_1.InputComponentDriver {
18
+ get input() {
19
+ return this.getByPartName(parts_1.PART_INPUT);
20
+ }
21
+ get startAdornment() {
22
+ return this.getByPartName(parts_1.PART_START_ADORNMENT);
23
+ }
24
+ get endAdornment() {
25
+ return this.getByPartName(parts_1.PART_END_ADORNMENT);
26
+ }
27
+ get spinnerUp() {
28
+ return this.getByPartName(PART_SPINNER_UP);
29
+ }
30
+ get spinnerDown() {
31
+ return this.getByPartName(PART_SPINNER_DOWN);
32
+ }
33
+ increment() {
34
+ return __awaiter(this, void 0, void 0, function* () {
35
+ yield this.spinnerUp.click({ force: true });
36
+ });
37
+ }
38
+ decrement() {
39
+ return __awaiter(this, void 0, void 0, function* () {
40
+ yield this.spinnerDown.click({ force: true });
41
+ });
42
+ }
43
+ }
44
+ exports.NumberBoxDriver = NumberBoxDriver;