@itwin/imodel-components-react 5.20.0 → 5.21.1
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.
- package/CHANGELOG.md +16 -0
- package/lib/imodel-components-react/inputs/new-editors/QuantityEditor.js +3 -2
- package/lib/imodel-components-react/inputs/new-editors/QuantityEditor.js.map +1 -1
- package/lib/imodel-components-react/inputs/new-editors/UseQuantityInfo.d.ts +2 -1
- package/lib/imodel-components-react/inputs/new-editors/UseQuantityInfo.d.ts.map +1 -1
- package/lib/imodel-components-react/inputs/new-editors/UseQuantityInfo.js +31 -11
- package/lib/imodel-components-react/inputs/new-editors/UseQuantityInfo.js.map +1 -1
- package/package.json +9 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Change Log - @itwin/imodel-components-react
|
|
2
2
|
|
|
3
|
+
## 5.21.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- @itwin/components-react@5.21.1
|
|
8
|
+
- @itwin/core-react@5.21.1
|
|
9
|
+
|
|
10
|
+
## 5.21.0
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- 43acfb9: Quantity editor now displays values with precision of 12 when focused and reverts to consumer precision when unfocused.
|
|
15
|
+
- Updated dependencies [43acfb9]
|
|
16
|
+
- @itwin/components-react@5.21.0
|
|
17
|
+
- @itwin/core-react@5.21.0
|
|
18
|
+
|
|
3
19
|
## 5.20.0
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -22,13 +22,14 @@ export const QuantityEditorSpec = createEditorSpec({
|
|
|
22
22
|
Editor: QuantityEditor,
|
|
23
23
|
});
|
|
24
24
|
function QuantityEditor({ metadata, value, onChange, size, }) {
|
|
25
|
-
const {
|
|
25
|
+
const { defaultFormatter, highPrecisionFormatter, parser } = useQuantityInfo({
|
|
26
26
|
type: metadata.quantityType,
|
|
27
27
|
});
|
|
28
|
+
const [isEditing, setEditing] = React.useState(false);
|
|
28
29
|
const currentValue = value
|
|
29
30
|
? value
|
|
30
31
|
: { rawValue: undefined, displayValue: "" };
|
|
31
|
-
return (React.createElement(QuantityInput, { value: currentValue, onChange: onChange, size: size, formatter:
|
|
32
|
+
return (React.createElement(QuantityInput, { value: currentValue, onChange: onChange, size: size, formatter: isEditing ? highPrecisionFormatter : defaultFormatter, parser: parser, onBlur: () => setEditing(false), onFocus: () => setEditing(true) }));
|
|
32
33
|
}
|
|
33
34
|
/* v8 ignore stop */
|
|
34
35
|
//# sourceMappingURL=QuantityEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuantityEditor.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/inputs/new-editors/QuantityEditor.tsx"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACL,gBAAgB,EAKhB,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,qBAAqB;AAErB;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAe,gBAAgB,CAAC;IAC7D,mBAAmB,EAAE,CAAC,QAAQ,EAAqC,EAAE,CACnE,QAAQ,CAAC,IAAI,KAAK,QAAQ;QAC1B,cAAc,IAAI,QAAQ;QAC1B,QAAQ,CAAC,YAAY,KAAK,SAAS;IACrC,gBAAgB,EAAE,cAAc,CAAC,SAAS;IAC1C,MAAM,EAAE,cAAc;CACvB,CAAC,CAAC;AAWH,SAAS,cAAc,CAAC,EACtB,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,IAAI,GAC6C;IACjD,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"QuantityEditor.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/inputs/new-editors/QuantityEditor.tsx"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACL,gBAAgB,EAKhB,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,qBAAqB;AAErB;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAe,gBAAgB,CAAC;IAC7D,mBAAmB,EAAE,CAAC,QAAQ,EAAqC,EAAE,CACnE,QAAQ,CAAC,IAAI,KAAK,QAAQ;QAC1B,cAAc,IAAI,QAAQ;QAC1B,QAAQ,CAAC,YAAY,KAAK,SAAS;IACrC,gBAAgB,EAAE,cAAc,CAAC,SAAS;IAC1C,MAAM,EAAE,cAAc;CACvB,CAAC,CAAC;AAWH,SAAS,cAAc,CAAC,EACtB,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,IAAI,GAC6C;IACjD,MAAM,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC;QAC3E,IAAI,EAAE,QAAQ,CAAC,YAAY;KAC5B,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,KAAK;QACxB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAE9C,OAAO,CACL,oBAAC,aAAa,IACZ,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,EAChE,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAC/B,CACH,CAAC;AACJ,CAAC;AAED,oBAAoB","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module PropertyEditors\n */\n\nimport * as React from \"react\";\nimport { type QuantityTypeArg } from \"@itwin/core-frontend\";\nimport { useQuantityInfo } from \"./UseQuantityInfo.js\";\nimport {\n createEditorSpec,\n type EditorProps,\n type EditorSpec,\n type NumericValue,\n type ValueMetadata,\n ValueUtilities,\n} from \"@itwin/components-react\";\nimport { QuantityInput } from \"./QuantityInput.js\";\n\n/* v8 ignore start */\n\n/**\n * Editor specification for quantity values based on `IModelApp.quantityFormatter`.\n * @beta\n */\nexport const QuantityEditorSpec: EditorSpec = createEditorSpec({\n isMetadataSupported: (metadata): metadata is QuantityValueMetadata =>\n metadata.type === \"number\" &&\n \"quantityType\" in metadata &&\n metadata.quantityType !== undefined,\n isValueSupported: ValueUtilities.isNumeric,\n Editor: QuantityEditor,\n});\n\n/**\n * Metadata for quantity values.\n * @beta\n */\nexport interface QuantityValueMetadata extends ValueMetadata {\n type: \"number\";\n quantityType: QuantityTypeArg;\n}\n\nfunction QuantityEditor({\n metadata,\n value,\n onChange,\n size,\n}: EditorProps<QuantityValueMetadata, NumericValue>) {\n const { defaultFormatter, highPrecisionFormatter, parser } = useQuantityInfo({\n type: metadata.quantityType,\n });\n const [isEditing, setEditing] = React.useState(false);\n const currentValue = value\n ? value\n : { rawValue: undefined, displayValue: \"\" };\n\n return (\n <QuantityInput\n value={currentValue}\n onChange={onChange}\n size={size}\n formatter={isEditing ? highPrecisionFormatter : defaultFormatter}\n parser={parser}\n onBlur={() => setEditing(false)}\n onFocus={() => setEditing(true)}\n />\n );\n}\n\n/* v8 ignore stop */\n"]}
|
|
@@ -8,7 +8,8 @@ interface UseQuantityInfoProps {
|
|
|
8
8
|
* @internal
|
|
9
9
|
*/
|
|
10
10
|
export declare function useQuantityInfo({ type }: UseQuantityInfoProps): {
|
|
11
|
-
|
|
11
|
+
defaultFormatter: FormatterSpec | undefined;
|
|
12
|
+
highPrecisionFormatter: FormatterSpec | undefined;
|
|
12
13
|
parser: ParserSpec | undefined;
|
|
13
14
|
};
|
|
14
15
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UseQuantityInfo.d.ts","sourceRoot":"","sources":["../../../../src/imodel-components-react/inputs/new-editors/UseQuantityInfo.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE9E,OAAO,EACL,KAAK,aAAa,EAGlB,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAO9B,UAAU,oBAAoB;IAC5B,IAAI,EAAE,eAAe,GAAG,SAAS,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,oBAAoB
|
|
1
|
+
{"version":3,"file":"UseQuantityInfo.d.ts","sourceRoot":"","sources":["../../../../src/imodel-components-react/inputs/new-editors/UseQuantityInfo.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE9E,OAAO,EACL,KAAK,aAAa,EAGlB,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAO9B,UAAU,oBAAoB;IAC5B,IAAI,EAAE,eAAe,GAAG,SAAS,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,oBAAoB;;;;EAwE7D"}
|
|
@@ -11,27 +11,33 @@ import { useIModelConnection } from "../../IModelConnectionContext.js";
|
|
|
11
11
|
* @internal
|
|
12
12
|
*/
|
|
13
13
|
export function useQuantityInfo({ type }) {
|
|
14
|
-
const [{
|
|
15
|
-
|
|
14
|
+
const [{ defaultFormatter, highPrecisionFormatter, parser }, setState] = React.useState(() => ({
|
|
15
|
+
defaultFormatter: undefined,
|
|
16
|
+
highPrecisionFormatter: undefined,
|
|
16
17
|
parser: undefined,
|
|
17
18
|
}));
|
|
18
19
|
const imodel = useIModelConnection();
|
|
19
20
|
React.useEffect(() => {
|
|
20
21
|
if (type === undefined) {
|
|
21
22
|
setState({
|
|
22
|
-
|
|
23
|
+
defaultFormatter: undefined,
|
|
24
|
+
highPrecisionFormatter: undefined,
|
|
23
25
|
parser: undefined,
|
|
24
26
|
});
|
|
25
27
|
return;
|
|
26
28
|
}
|
|
27
29
|
let disposed = false;
|
|
28
30
|
const loadFormatterParser = async () => {
|
|
29
|
-
const {
|
|
31
|
+
const { defaultFormatterSpec, highPrecisionFormatterSpec, parserSpec } = await getFormatterParserSpec({
|
|
30
32
|
imodel,
|
|
31
33
|
type,
|
|
32
34
|
});
|
|
33
35
|
if (!disposed) {
|
|
34
|
-
setState({
|
|
36
|
+
setState({
|
|
37
|
+
defaultFormatter: defaultFormatterSpec,
|
|
38
|
+
highPrecisionFormatter: highPrecisionFormatterSpec,
|
|
39
|
+
parser: parserSpec,
|
|
40
|
+
});
|
|
35
41
|
}
|
|
36
42
|
};
|
|
37
43
|
void loadFormatterParser();
|
|
@@ -53,7 +59,7 @@ export function useQuantityInfo({ type }) {
|
|
|
53
59
|
});
|
|
54
60
|
};
|
|
55
61
|
}, [imodel, type]);
|
|
56
|
-
return {
|
|
62
|
+
return { defaultFormatter, highPrecisionFormatter, parser };
|
|
57
63
|
}
|
|
58
64
|
async function getFormatterParserSpec({ imodel, type, }) {
|
|
59
65
|
// fallback to IModelApp.quantityFormatter:
|
|
@@ -64,23 +70,32 @@ async function getFormatterParserSpec({ imodel, type, }) {
|
|
|
64
70
|
const quantityFormatterSpec = IModelApp.quantityFormatter.findFormatterSpecByQuantityType(type);
|
|
65
71
|
const quantityParserSpec = IModelApp.quantityFormatter.findParserSpecByQuantityType(type);
|
|
66
72
|
return {
|
|
67
|
-
|
|
73
|
+
highPrecisionFormatterSpec: quantityFormatterSpec,
|
|
74
|
+
defaultFormatterSpec: quantityFormatterSpec,
|
|
68
75
|
parserSpec: quantityParserSpec,
|
|
69
76
|
};
|
|
70
77
|
}
|
|
71
78
|
const koq = await imodel.schemaContext.getSchemaItem(type);
|
|
72
79
|
if (!koq) {
|
|
73
|
-
return {
|
|
80
|
+
return {
|
|
81
|
+
highPrecisionFormatterSpec: undefined,
|
|
82
|
+
defaultFormatterSpec: undefined,
|
|
83
|
+
parser: undefined,
|
|
84
|
+
};
|
|
74
85
|
}
|
|
75
86
|
// TODO: `KindOfQuantity` here is used only as a type because we don't have peerDep on `ecschema-metadata`
|
|
76
87
|
// It should be added when dropping `itwinjs-core` v4 support
|
|
77
88
|
const persistenceUnit = await koq.persistenceUnit;
|
|
78
89
|
const formatProps = await IModelApp.formatsProvider.getFormat(type);
|
|
79
90
|
if (!persistenceUnit || !formatProps) {
|
|
80
|
-
return {
|
|
91
|
+
return {
|
|
92
|
+
highPrecisionFormatterSpec: undefined,
|
|
93
|
+
defaultFormatterSpec: undefined,
|
|
94
|
+
parser: undefined,
|
|
95
|
+
};
|
|
81
96
|
}
|
|
82
97
|
const persistenceUnitName = persistenceUnit.fullName;
|
|
83
|
-
const
|
|
98
|
+
const highPrecisionFormatterSpec = await IModelApp.quantityFormatter.createFormatterSpec({
|
|
84
99
|
formatProps: {
|
|
85
100
|
...formatProps,
|
|
86
101
|
precision: parseFormatType(formatProps.type, "") === FormatType.Decimal
|
|
@@ -89,12 +104,17 @@ async function getFormatterParserSpec({ imodel, type, }) {
|
|
|
89
104
|
},
|
|
90
105
|
persistenceUnitName,
|
|
91
106
|
});
|
|
107
|
+
const defaultFormatterSpec = await IModelApp.quantityFormatter.createFormatterSpec({
|
|
108
|
+
formatProps,
|
|
109
|
+
persistenceUnitName,
|
|
110
|
+
});
|
|
92
111
|
const parserSpec = await IModelApp.quantityFormatter.createParserSpec({
|
|
93
112
|
formatProps,
|
|
94
113
|
persistenceUnitName,
|
|
95
114
|
});
|
|
96
115
|
return {
|
|
97
|
-
|
|
116
|
+
highPrecisionFormatterSpec,
|
|
117
|
+
defaultFormatterSpec,
|
|
98
118
|
parserSpec,
|
|
99
119
|
};
|
|
100
120
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UseQuantityInfo.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/inputs/new-editors/UseQuantityInfo.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAGhG,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAEL,UAAU,EACV,eAAe,GAEhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AASvE;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,IAAI,EAAwB;IAC5D,MAAM,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"UseQuantityInfo.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/inputs/new-editors/UseQuantityInfo.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport type { IModelConnection, QuantityTypeArg } from \"@itwin/core-frontend\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport {\n type FormatterSpec,\n FormatType,\n parseFormatType,\n type ParserSpec,\n} from \"@itwin/core-quantity\";\nimport * as React from \"react\";\nimport { useIModelConnection } from \"../../IModelConnectionContext.js\";\nimport type { KindOfQuantity } from \"@itwin/ecschema-metadata\";\n\n/* v8 ignore start */\n\ninterface UseQuantityInfoProps {\n type: QuantityTypeArg | undefined;\n}\n\n/**\n * Hook that finds the formatter and parser in `IModelApp.quantityFormatter` for a given quantity type.\n * @internal\n */\nexport function useQuantityInfo({ type }: UseQuantityInfoProps) {\n const [{ defaultFormatter, highPrecisionFormatter, parser }, setState] =\n React.useState<{\n defaultFormatter: FormatterSpec | undefined;\n highPrecisionFormatter: FormatterSpec | undefined;\n parser: ParserSpec | undefined;\n }>(() => ({\n defaultFormatter: undefined,\n highPrecisionFormatter: undefined,\n parser: undefined,\n }));\n\n const imodel = useIModelConnection();\n\n React.useEffect(() => {\n if (type === undefined) {\n setState({\n defaultFormatter: undefined,\n highPrecisionFormatter: undefined,\n parser: undefined,\n });\n return;\n }\n\n let disposed = false;\n const loadFormatterParser = async () => {\n const { defaultFormatterSpec, highPrecisionFormatterSpec, parserSpec } =\n await getFormatterParserSpec({\n imodel,\n type,\n });\n\n if (!disposed) {\n setState({\n defaultFormatter: defaultFormatterSpec,\n highPrecisionFormatter: highPrecisionFormatterSpec,\n parser: parserSpec,\n });\n }\n };\n\n void loadFormatterParser();\n\n const removeListeners = [\n IModelApp.quantityFormatter.onActiveFormattingUnitSystemChanged.addListener(\n loadFormatterParser\n ),\n IModelApp.quantityFormatter.onQuantityFormatsChanged.addListener(\n ({ quantityType }) => {\n if (quantityType === type) {\n void loadFormatterParser();\n }\n }\n ),\n ];\n if (IModelApp.formatsProvider) {\n removeListeners.push(\n IModelApp.formatsProvider.onFormatsChanged.addListener(async () =>\n loadFormatterParser()\n )\n );\n }\n\n return () => {\n disposed = true;\n removeListeners.forEach((remove) => {\n remove();\n });\n };\n }, [imodel, type]);\n\n return { defaultFormatter, highPrecisionFormatter, parser };\n}\n\nasync function getFormatterParserSpec({\n imodel,\n type,\n}: {\n imodel?: IModelConnection;\n type: QuantityTypeArg;\n}) {\n // fallback to IModelApp.quantityFormatter:\n // - if `itwinjs-core` v4 is used\n // - don't have an iModelConnection to look up KOQ\n // - old quantity type enum is used instead of KOQ name\n if (!IModelApp.formatsProvider || !imodel || typeof type !== \"string\") {\n const quantityFormatterSpec =\n IModelApp.quantityFormatter.findFormatterSpecByQuantityType(type);\n const quantityParserSpec =\n IModelApp.quantityFormatter.findParserSpecByQuantityType(type);\n\n return {\n highPrecisionFormatterSpec: quantityFormatterSpec,\n defaultFormatterSpec: quantityFormatterSpec,\n parserSpec: quantityParserSpec,\n };\n }\n\n const koq = await imodel.schemaContext.getSchemaItem(type);\n if (!koq) {\n return {\n highPrecisionFormatterSpec: undefined,\n defaultFormatterSpec: undefined,\n parser: undefined,\n };\n }\n\n // TODO: `KindOfQuantity` here is used only as a type because we don't have peerDep on `ecschema-metadata`\n // It should be added when dropping `itwinjs-core` v4 support\n const persistenceUnit = await (koq as KindOfQuantity).persistenceUnit;\n const formatProps = await IModelApp.formatsProvider.getFormat(type);\n if (!persistenceUnit || !formatProps) {\n return {\n highPrecisionFormatterSpec: undefined,\n defaultFormatterSpec: undefined,\n parser: undefined,\n };\n }\n\n const persistenceUnitName = persistenceUnit.fullName;\n const highPrecisionFormatterSpec =\n await IModelApp.quantityFormatter.createFormatterSpec({\n formatProps: {\n ...formatProps,\n precision:\n parseFormatType(formatProps.type, \"\") === FormatType.Decimal\n ? 12\n : formatProps.precision,\n },\n persistenceUnitName,\n });\n const defaultFormatterSpec =\n await IModelApp.quantityFormatter.createFormatterSpec({\n formatProps,\n\n persistenceUnitName,\n });\n const parserSpec = await IModelApp.quantityFormatter.createParserSpec({\n formatProps,\n persistenceUnitName,\n });\n return {\n highPrecisionFormatterSpec,\n defaultFormatterSpec,\n parserSpec,\n };\n}\n\n/* v8 ignore stop */\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/imodel-components-react",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.21.1",
|
|
4
4
|
"description": "A react component library of iTwin.js UI iModel components",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./lib/imodel-components-react.d.ts",
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
"@itwin/itwinui-react": "^3.15.0",
|
|
45
45
|
"react": "^18.0.0 || ^19.0.0",
|
|
46
46
|
"react-dom": "^18.0.0 || ^19.0.0",
|
|
47
|
-
"@itwin/components-react": "5.
|
|
48
|
-
"@itwin/core-react": "5.
|
|
47
|
+
"@itwin/components-react": "5.21.1",
|
|
48
|
+
"@itwin/core-react": "5.21.1"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@itwin/appui-abstract": "^5.1.0",
|
|
@@ -63,8 +63,8 @@
|
|
|
63
63
|
"@testing-library/dom": "^10.4.1",
|
|
64
64
|
"@testing-library/react": "^16.3.0",
|
|
65
65
|
"@testing-library/user-event": "^14.6.1",
|
|
66
|
-
"@types/react": "^19.2.
|
|
67
|
-
"@types/react-dom": "^19.2.
|
|
66
|
+
"@types/react": "^19.2.7",
|
|
67
|
+
"@types/react-dom": "^19.2.3",
|
|
68
68
|
"@vitest/coverage-v8": "^3.0.6",
|
|
69
69
|
"cpx2": "^3.0.0",
|
|
70
70
|
"cross-env": "^5.1.4",
|
|
@@ -75,8 +75,8 @@
|
|
|
75
75
|
"jsdom": "^24.0.0",
|
|
76
76
|
"npm-run-all": "^4.1.5",
|
|
77
77
|
"raf": "^3.4.0",
|
|
78
|
-
"react": "^19.2.
|
|
79
|
-
"react-dom": "^19.2.
|
|
78
|
+
"react": "^19.2.1",
|
|
79
|
+
"react-dom": "^19.2.1",
|
|
80
80
|
"reflect-metadata": "^0.1.13",
|
|
81
81
|
"rimraf": "^6.1.0",
|
|
82
82
|
"ts-node": "^10.8.2",
|
|
@@ -84,8 +84,8 @@
|
|
|
84
84
|
"typescript": "~5.6.2",
|
|
85
85
|
"upath": "^2.0.1",
|
|
86
86
|
"vitest": "^3.2.4",
|
|
87
|
-
"@itwin/components-react": "5.
|
|
88
|
-
"@itwin/core-react": "5.
|
|
87
|
+
"@itwin/components-react": "5.21.1",
|
|
88
|
+
"@itwin/core-react": "5.21.1"
|
|
89
89
|
},
|
|
90
90
|
"dependencies": {
|
|
91
91
|
"@itwin/itwinui-icons-react": "^2.8.0",
|