@lynx-js/genui 0.0.1-rc.0 → 0.0.2
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/a2ui/README.md +777 -100
- package/a2ui/dist/catalog/Button/{index.js → index.jsx} +12 -8
- package/a2ui/dist/catalog/Button/index.jsx.map +1 -0
- package/a2ui/dist/catalog/Card/{index.js → index.jsx} +5 -4
- package/a2ui/dist/catalog/Card/index.jsx.map +1 -0
- package/a2ui/dist/catalog/CheckBox/{index.js → index.jsx} +11 -6
- package/a2ui/dist/catalog/CheckBox/index.jsx.map +1 -0
- package/a2ui/dist/catalog/ChoicePicker/catalog.json +265 -0
- package/a2ui/dist/catalog/ChoicePicker/index.d.ts +56 -0
- package/a2ui/dist/catalog/ChoicePicker/index.jsx +98 -0
- package/a2ui/dist/catalog/ChoicePicker/index.jsx.map +1 -0
- package/a2ui/dist/catalog/ChoicePicker/utils.d.ts +13 -0
- package/a2ui/dist/catalog/ChoicePicker/utils.js +80 -0
- package/a2ui/dist/catalog/ChoicePicker/utils.js.map +1 -0
- package/a2ui/dist/catalog/Column/{index.js → index.jsx} +13 -14
- package/a2ui/dist/catalog/Column/index.jsx.map +1 -0
- package/a2ui/dist/catalog/DateTimeInput/catalog.json +165 -0
- package/a2ui/dist/catalog/DateTimeInput/index.d.ts +43 -0
- package/a2ui/dist/catalog/DateTimeInput/index.jsx +258 -0
- package/a2ui/dist/catalog/DateTimeInput/index.jsx.map +1 -0
- package/a2ui/dist/catalog/DateTimeInput/utils.d.ts +53 -0
- package/a2ui/dist/catalog/DateTimeInput/utils.js +248 -0
- package/a2ui/dist/catalog/DateTimeInput/utils.js.map +1 -0
- package/a2ui/dist/catalog/Divider/index.jsx +7 -0
- package/a2ui/dist/catalog/Divider/index.jsx.map +1 -0
- package/a2ui/dist/catalog/Icon/catalog.json +173 -2
- package/a2ui/dist/catalog/Icon/index.d.ts +2 -2
- package/a2ui/dist/catalog/Icon/{index.js → index.jsx} +4 -3
- package/a2ui/dist/catalog/Icon/index.jsx.map +1 -0
- package/a2ui/dist/catalog/Image/catalog.json +1 -17
- package/a2ui/dist/catalog/Image/index.d.ts +1 -3
- package/a2ui/dist/catalog/Image/index.jsx +21 -0
- package/a2ui/dist/catalog/Image/index.jsx.map +1 -0
- package/a2ui/dist/catalog/LineChart/{index.js → index.jsx} +53 -16
- package/a2ui/dist/catalog/LineChart/{index.js.map → index.jsx.map} +1 -1
- package/a2ui/dist/catalog/List/{index.js → index.jsx} +9 -6
- package/a2ui/dist/catalog/List/{index.js.map → index.jsx.map} +1 -1
- package/a2ui/dist/catalog/Modal/{index.js → index.jsx} +18 -9
- package/a2ui/dist/catalog/Modal/index.jsx.map +1 -0
- package/a2ui/dist/catalog/PieChart/{index.js → index.jsx} +41 -15
- package/a2ui/dist/catalog/PieChart/{index.js.map → index.jsx.map} +1 -1
- package/a2ui/dist/catalog/RadioGroup/{index.js → index.jsx} +18 -5
- package/a2ui/dist/catalog/RadioGroup/index.jsx.map +1 -0
- package/a2ui/dist/catalog/Row/{index.js → index.jsx} +10 -7
- package/a2ui/dist/catalog/Row/index.jsx.map +1 -0
- package/a2ui/dist/catalog/Slider/{index.js → index.jsx} +22 -7
- package/a2ui/dist/catalog/Slider/{index.js.map → index.jsx.map} +1 -1
- package/a2ui/dist/catalog/Tabs/index.jsx +40 -0
- package/a2ui/dist/catalog/Tabs/index.jsx.map +1 -0
- package/a2ui/dist/catalog/Text/catalog.json +6 -2
- package/a2ui/dist/catalog/Text/index.d.ts +1 -1
- package/a2ui/dist/catalog/Text/index.jsx +16 -0
- package/a2ui/dist/catalog/Text/index.jsx.map +1 -0
- package/a2ui/dist/catalog/TextField/{index.js → index.jsx} +8 -5
- package/a2ui/dist/catalog/TextField/{index.js.map → index.jsx.map} +1 -1
- package/a2ui/dist/catalog/index.d.ts +21 -17
- package/a2ui/dist/catalog/index.js +2067 -20
- package/a2ui/dist/catalog/index.js.map +1 -1
- package/a2ui/dist/index.d.ts +1 -1
- package/a2ui/dist/index.js +1 -1
- package/a2ui/dist/index.js.map +1 -1
- package/a2ui/dist/react/A2UI.d.ts +1 -1
- package/a2ui/dist/react/{A2UI.js → A2UI.jsx} +6 -5
- package/a2ui/dist/react/{A2UI.js.map → A2UI.jsx.map} +1 -1
- package/a2ui/dist/react/{A2UIProvider.js → A2UIProvider.jsx} +2 -3
- package/a2ui/dist/react/{A2UIProvider.js.map → A2UIProvider.jsx.map} +1 -1
- package/a2ui/dist/react/A2UIRenderer.d.ts +1 -0
- package/a2ui/dist/react/{A2UIRenderer.js → A2UIRenderer.jsx} +36 -24
- package/a2ui/dist/react/A2UIRenderer.jsx.map +1 -0
- package/a2ui/dist/react/index.d.ts +3 -3
- package/a2ui/dist/react/index.js +2 -2
- package/a2ui/dist/react/index.js.map +1 -1
- package/a2ui/dist/react/useA2UIContext.d.ts +1 -1
- package/a2ui/dist/react/useA2UIContext.js +1 -1
- package/a2ui/dist/react/useA2UIContext.js.map +1 -1
- package/a2ui/dist/react/useAction.js +2 -1
- package/a2ui/dist/react/useAction.js.map +1 -1
- package/a2ui/dist/react/useChecks.js +7 -2
- package/a2ui/dist/react/useChecks.js.map +1 -1
- package/a2ui/dist/react/useDataBinding.d.ts +1 -1
- package/a2ui/dist/react/useDataBinding.js +24 -48
- package/a2ui/dist/react/useDataBinding.js.map +1 -1
- package/a2ui/dist/store/MessageProcessor.js +7 -19
- package/a2ui/dist/store/MessageProcessor.js.map +1 -1
- package/a2ui/dist/store/SignalStore.d.ts +2 -0
- package/a2ui/dist/store/SignalStore.js +5 -0
- package/a2ui/dist/store/SignalStore.js.map +1 -1
- package/a2ui/dist/store/index.d.ts +3 -1
- package/a2ui/dist/store/index.js +3 -1
- package/a2ui/dist/store/index.js.map +1 -1
- package/a2ui/dist/store/resolveDynamic.d.ts +9 -0
- package/a2ui/dist/store/resolveDynamic.js +88 -0
- package/a2ui/dist/store/resolveDynamic.js.map +1 -0
- package/a2ui/dist/store/resolveFunctionCall.d.ts +2 -4
- package/a2ui/dist/store/resolveFunctionCall.js +24 -82
- package/a2ui/dist/store/resolveFunctionCall.js.map +1 -1
- package/a2ui/dist/store/signalResolution.d.ts +4 -0
- package/a2ui/dist/store/signalResolution.js +25 -0
- package/a2ui/dist/store/signalResolution.js.map +1 -0
- package/a2ui/dist/store/utils.d.ts +7 -0
- package/a2ui/dist/store/utils.js +24 -0
- package/a2ui/dist/store/utils.js.map +1 -0
- package/a2ui/dist/tsconfig.build.tsbuildinfo +1 -1
- package/a2ui/styles/catalog/ChoicePicker.css +157 -0
- package/a2ui/styles/catalog/DateTimeInput.css +375 -0
- package/a2ui/styles/catalog/Icon.css +1 -1
- package/a2ui/styles/catalog/Modal.css +1 -0
- package/a2ui/styles/catalog/Text.css +13 -17
- package/a2ui/styles/theme.css +2 -1
- package/a2ui-catalog-extractor/README.md +23 -15
- package/a2ui-catalog-extractor/bin/a2ui-catalog-extractor.js +0 -1
- package/a2ui-catalog-extractor/dist/tsconfig.build.tsbuildinfo +1 -1
- package/a2ui-prompt/README.md +1 -2
- package/a2ui-prompt/dist/index.js +138 -104
- package/cli/bin/cli.js +5 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +8 -1
- package/a2ui/dist/catalog/Button/index.js.map +0 -1
- package/a2ui/dist/catalog/Card/index.js.map +0 -1
- package/a2ui/dist/catalog/CheckBox/index.js.map +0 -1
- package/a2ui/dist/catalog/Column/index.js.map +0 -1
- package/a2ui/dist/catalog/Divider/index.js +0 -8
- package/a2ui/dist/catalog/Divider/index.js.map +0 -1
- package/a2ui/dist/catalog/Icon/index.js.map +0 -1
- package/a2ui/dist/catalog/Image/index.js +0 -30
- package/a2ui/dist/catalog/Image/index.js.map +0 -1
- package/a2ui/dist/catalog/Modal/index.js.map +0 -1
- package/a2ui/dist/catalog/RadioGroup/index.js.map +0 -1
- package/a2ui/dist/catalog/Row/index.js.map +0 -1
- package/a2ui/dist/catalog/Tabs/index.js +0 -32
- package/a2ui/dist/catalog/Tabs/index.js.map +0 -1
- package/a2ui/dist/catalog/Text/index.js +0 -27
- package/a2ui/dist/catalog/Text/index.js.map +0 -1
- package/a2ui/dist/react/A2UIRenderer.js.map +0 -1
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "@lynx-js/react/jsx-runtime";
|
|
2
1
|
// Copyright 2026 The Lynx Authors. All rights reserved.
|
|
3
2
|
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
4
3
|
// LICENSE file in the root directory of this source tree.
|
|
5
|
-
import { A2UIRenderer } from '../../react/A2UIRenderer.
|
|
4
|
+
import { A2UIRenderer } from '../../react/A2UIRenderer.jsx';
|
|
6
5
|
import { useChecks } from '../../react/useChecks.js';
|
|
7
6
|
import '../../../styles/catalog/Button.css';
|
|
8
7
|
export function Button(props) {
|
|
@@ -26,10 +25,15 @@ export function Button(props) {
|
|
|
26
25
|
const childResource = child
|
|
27
26
|
? surface.resources.get(child)
|
|
28
27
|
: undefined;
|
|
29
|
-
return (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
return (<>
|
|
29
|
+
<view className={`button button-${variant}${isValid ? '' : ' button-disabled'}${ok ? '' : ' button-invalid'}`} bindtap={enabled ? handleClick : undefined}>
|
|
30
|
+
{childResource
|
|
31
|
+
? <A2UIRenderer resource={childResource}/>
|
|
32
|
+
: <text className='button-fallback'>Button</text>}
|
|
33
|
+
</view>
|
|
34
|
+
{!ok && firstFailureMessage
|
|
35
|
+
? <text className='button-error'>{firstFailureMessage}</text>
|
|
36
|
+
: null}
|
|
37
|
+
</>);
|
|
34
38
|
}
|
|
35
|
-
//# sourceMappingURL=index.
|
|
39
|
+
//# sourceMappingURL=index.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../../src/catalog/Button/index.tsx"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAIrD,OAAO,oCAAoC,CAAC;AA+C5C,MAAM,UAAU,MAAM,CACpB,KAAkB;IAElB,MAAM,EACJ,MAAM,EACN,KAAK,EACL,EAAE,EACF,OAAO,GAAG,IAAI,EACd,OAAO,EACP,UAAU,EACV,OAAO,GAAG,SAAS,EACnB,eAAe,GAChB,GAAG,KAAK,CAAC;IACV,MAAM,MAAM,GAAG,KAAK,CAAC,MAAiC,CAAC;IACvD,MAAM,EAAE,EAAE,EAAE,mBAAmB,EAAE,GAAG,SAAS,CAAC;QAC5C,MAAM;QACN,WAAW,EAAE,EAAE,IAAI,EAAE;QACrB,OAAO;QACP,eAAe;KAChB,CAAC,CAAC;IAEH,sEAAsE;IACtE,yEAAyE;IACzE,qCAAqC;IACrC,MAAM,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IAE9B,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACtB,KAAK,UAAU,EAAE,CAAC,MAAiC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK;QACzB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC9B,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,CACL,EACE;MAAA,CAAC,IAAI,CACH,SAAS,CAAC,CAAC,iBAAiB,OAAO,GACjC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBACjB,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CACjC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAE3C;QAAA,CAAC,aAAa;YACZ,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,EAAG;YAC3C,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CACrD;MAAA,EAAE,IAAI,CACN;MAAA,CAAC,CAAC,EAAE,IAAI,mBAAmB;YACzB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC;YAC7D,CAAC,CAAC,IAAI,CACV;IAAA,GAAG,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { jsx as _jsx } from "@lynx-js/react/jsx-runtime";
|
|
2
1
|
// Copyright 2026 The Lynx Authors. All rights reserved.
|
|
3
2
|
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
4
3
|
// LICENSE file in the root directory of this source tree.
|
|
5
|
-
import { NodeRenderer } from '../../react/A2UIRenderer.
|
|
4
|
+
import { NodeRenderer } from '../../react/A2UIRenderer.jsx';
|
|
6
5
|
import '../../../styles/catalog/Card.css';
|
|
7
6
|
export function Card(props) {
|
|
8
7
|
const { child: childId, surface, dataContextPath } = props;
|
|
@@ -14,6 +13,8 @@ export function Card(props) {
|
|
|
14
13
|
const weightClass = typeof props.weight === 'number'
|
|
15
14
|
? 'card-weighted'
|
|
16
15
|
: '';
|
|
17
|
-
return (
|
|
16
|
+
return (<view className={`card card-${variant} ${weightClass}`.trim()}>
|
|
17
|
+
{childWithContext && (<NodeRenderer component={childWithContext} surface={surface}/>)}
|
|
18
|
+
</view>);
|
|
18
19
|
}
|
|
19
|
-
//# sourceMappingURL=index.
|
|
20
|
+
//# sourceMappingURL=index.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../../src/catalog/Card/index.tsx"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,OAAO,kCAAkC,CAAC;AAW1C,MAAM,UAAU,IAAI,CAAC,KAAgB;IACnC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IAC3D,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,gBAAgB,GAAG,cAAc,IAAI,eAAe;QACxD,CAAC,CAAC,EAAE,GAAG,cAAc,EAAE,eAAe,EAAE;QACxC,CAAC,CAAC,cAAc,CAAC;IACnB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,UAAU,CAAC;IAC5C,MAAM,WAAW,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAClD,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,CACL,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,OAAO,IAAI,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAC5D;MAAA,CAAC,gBAAgB,IAAI,CACnB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAG,CAChE,CACH;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "@lynx-js/react/jsx-runtime";
|
|
2
1
|
// Copyright 2026 The Lynx Authors. All rights reserved.
|
|
3
2
|
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
4
3
|
// LICENSE file in the root directory of this source tree.
|
|
@@ -16,9 +15,15 @@ export function CheckBox(props) {
|
|
|
16
15
|
const handleChange = () => {
|
|
17
16
|
setValue?.('value', !value);
|
|
18
17
|
};
|
|
19
|
-
return (
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
return (<view key={id} className={`checkbox-row${ok ? '' : ' checkbox-row-invalid'}`} bindtap={handleChange}>
|
|
19
|
+
<view className={`checkbox-input ${value ? 'checkbox-input-checked' : ''}`
|
|
20
|
+
.trim()}>
|
|
21
|
+
{!!value && <text>✓</text>}
|
|
22
|
+
</view>
|
|
23
|
+
<text className='checkbox-label'>{label}</text>
|
|
24
|
+
{!ok && firstFailureMessage
|
|
25
|
+
? <text className='checkbox-error'>{firstFailureMessage}</text>
|
|
26
|
+
: null}
|
|
27
|
+
</view>);
|
|
23
28
|
}
|
|
24
|
-
//# sourceMappingURL=index.
|
|
29
|
+
//# sourceMappingURL=index.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../../src/catalog/CheckBox/index.tsx"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAIrD,OAAO,sCAAsC,CAAC;AA+C9C,MAAM,UAAU,QAAQ,CACtB,KAAoB;IAEpB,MAAM,EACJ,EAAE,EACF,KAAK,GAAG,UAAU,EAClB,KAAK,EACL,QAAQ,EACR,OAAO,EACP,eAAe,GAChB,GAAG,KAAK,CAAC;IACV,MAAM,MAAM,GAAG,KAAK,CAAC,MAAiC,CAAC;IAEvD,MAAM,EAAE,EAAE,EAAE,mBAAmB,EAAE,GAAG,SAAS,CAAC;QAC5C,MAAM;QACN,WAAW,EAAE,EAAE,IAAI,EAAE;QACrB,OAAO;QACP,eAAe;KAChB,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,OAAO,CACL,CAAC,IAAI,CACH,GAAG,CAAC,CAAC,EAAE,CAAC,CACR,SAAS,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,EAAE,CAAC,CAC9D,OAAO,CAAC,CAAC,YAAY,CAAC,CAEtB;MAAA,CAAC,IAAI,CACH,SAAS,CAAC,CAAC,kBAAkB,KAAK,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,EAAE;aACjE,IAAI,EAAE,CAAC,CAEV;QAAA,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAC5B;MAAA,EAAE,IAAI,CACN;MAAA,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,KAAe,CAAC,EAAE,IAAI,CACxD;MAAA,CAAC,CAAC,EAAE,IAAI,mBAAmB;YACzB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC;YAC/D,CAAC,CAAC,IAAI,CACV;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
{
|
|
2
|
+
"ChoicePicker": {
|
|
3
|
+
"properties": {
|
|
4
|
+
"label": {
|
|
5
|
+
"oneOf": [
|
|
6
|
+
{
|
|
7
|
+
"type": "string"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"type": "object",
|
|
11
|
+
"properties": {
|
|
12
|
+
"path": {
|
|
13
|
+
"type": "string"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"required": [
|
|
17
|
+
"path"
|
|
18
|
+
],
|
|
19
|
+
"additionalProperties": false
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"type": "object",
|
|
23
|
+
"properties": {
|
|
24
|
+
"call": {
|
|
25
|
+
"type": "string"
|
|
26
|
+
},
|
|
27
|
+
"args": {
|
|
28
|
+
"type": "object",
|
|
29
|
+
"additionalProperties": true
|
|
30
|
+
},
|
|
31
|
+
"returnType": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"enum": [
|
|
34
|
+
"string",
|
|
35
|
+
"number",
|
|
36
|
+
"boolean",
|
|
37
|
+
"object",
|
|
38
|
+
"array",
|
|
39
|
+
"any",
|
|
40
|
+
"void"
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"required": [
|
|
45
|
+
"call",
|
|
46
|
+
"args"
|
|
47
|
+
],
|
|
48
|
+
"additionalProperties": false
|
|
49
|
+
}
|
|
50
|
+
],
|
|
51
|
+
"description": "The label for the group of options."
|
|
52
|
+
},
|
|
53
|
+
"variant": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"enum": [
|
|
56
|
+
"multipleSelection",
|
|
57
|
+
"mutuallyExclusive"
|
|
58
|
+
],
|
|
59
|
+
"description": "A hint for how the choice picker should be displayed and behave."
|
|
60
|
+
},
|
|
61
|
+
"options": {
|
|
62
|
+
"type": "array",
|
|
63
|
+
"items": {
|
|
64
|
+
"type": "object",
|
|
65
|
+
"properties": {
|
|
66
|
+
"label": {
|
|
67
|
+
"oneOf": [
|
|
68
|
+
{
|
|
69
|
+
"type": "string"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"type": "object",
|
|
73
|
+
"properties": {
|
|
74
|
+
"path": {
|
|
75
|
+
"type": "string"
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"required": [
|
|
79
|
+
"path"
|
|
80
|
+
],
|
|
81
|
+
"additionalProperties": false
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"type": "object",
|
|
85
|
+
"properties": {
|
|
86
|
+
"call": {
|
|
87
|
+
"type": "string"
|
|
88
|
+
},
|
|
89
|
+
"args": {
|
|
90
|
+
"type": "object",
|
|
91
|
+
"additionalProperties": true
|
|
92
|
+
},
|
|
93
|
+
"returnType": {
|
|
94
|
+
"type": "string",
|
|
95
|
+
"enum": [
|
|
96
|
+
"string",
|
|
97
|
+
"number",
|
|
98
|
+
"boolean",
|
|
99
|
+
"object",
|
|
100
|
+
"array",
|
|
101
|
+
"any",
|
|
102
|
+
"void"
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
"required": [
|
|
107
|
+
"call",
|
|
108
|
+
"args"
|
|
109
|
+
],
|
|
110
|
+
"additionalProperties": false
|
|
111
|
+
}
|
|
112
|
+
],
|
|
113
|
+
"description": "The text to display for this option."
|
|
114
|
+
},
|
|
115
|
+
"value": {
|
|
116
|
+
"type": "string",
|
|
117
|
+
"description": "The stable value associated with this option."
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
"required": [
|
|
121
|
+
"label",
|
|
122
|
+
"value"
|
|
123
|
+
],
|
|
124
|
+
"additionalProperties": false
|
|
125
|
+
},
|
|
126
|
+
"description": "The list of available options to choose from."
|
|
127
|
+
},
|
|
128
|
+
"value": {
|
|
129
|
+
"oneOf": [
|
|
130
|
+
{
|
|
131
|
+
"type": "array",
|
|
132
|
+
"items": {
|
|
133
|
+
"type": "string"
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"type": "object",
|
|
138
|
+
"properties": {
|
|
139
|
+
"path": {
|
|
140
|
+
"type": "string"
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
"required": [
|
|
144
|
+
"path"
|
|
145
|
+
],
|
|
146
|
+
"additionalProperties": false
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"type": "object",
|
|
150
|
+
"properties": {
|
|
151
|
+
"call": {
|
|
152
|
+
"type": "string"
|
|
153
|
+
},
|
|
154
|
+
"args": {
|
|
155
|
+
"type": "object",
|
|
156
|
+
"additionalProperties": true
|
|
157
|
+
},
|
|
158
|
+
"returnType": {
|
|
159
|
+
"type": "string",
|
|
160
|
+
"enum": [
|
|
161
|
+
"string",
|
|
162
|
+
"number",
|
|
163
|
+
"boolean",
|
|
164
|
+
"object",
|
|
165
|
+
"array",
|
|
166
|
+
"any",
|
|
167
|
+
"void"
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
"required": [
|
|
172
|
+
"call",
|
|
173
|
+
"args"
|
|
174
|
+
],
|
|
175
|
+
"additionalProperties": false
|
|
176
|
+
}
|
|
177
|
+
],
|
|
178
|
+
"description": "The list of currently selected values."
|
|
179
|
+
},
|
|
180
|
+
"displayStyle": {
|
|
181
|
+
"type": "string",
|
|
182
|
+
"enum": [
|
|
183
|
+
"checkbox",
|
|
184
|
+
"chips"
|
|
185
|
+
],
|
|
186
|
+
"description": "The display style of the component."
|
|
187
|
+
},
|
|
188
|
+
"filterable": {
|
|
189
|
+
"type": "boolean",
|
|
190
|
+
"description": "If true, displays a search input to filter the options."
|
|
191
|
+
},
|
|
192
|
+
"checks": {
|
|
193
|
+
"type": "array",
|
|
194
|
+
"items": {
|
|
195
|
+
"type": "object",
|
|
196
|
+
"properties": {
|
|
197
|
+
"condition": {
|
|
198
|
+
"oneOf": [
|
|
199
|
+
{
|
|
200
|
+
"type": "boolean"
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"type": "object",
|
|
204
|
+
"properties": {
|
|
205
|
+
"path": {
|
|
206
|
+
"type": "string"
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
"required": [
|
|
210
|
+
"path"
|
|
211
|
+
],
|
|
212
|
+
"additionalProperties": false
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"type": "object",
|
|
216
|
+
"properties": {
|
|
217
|
+
"call": {
|
|
218
|
+
"type": "string"
|
|
219
|
+
},
|
|
220
|
+
"args": {
|
|
221
|
+
"type": "object",
|
|
222
|
+
"additionalProperties": true
|
|
223
|
+
},
|
|
224
|
+
"returnType": {
|
|
225
|
+
"type": "string",
|
|
226
|
+
"enum": [
|
|
227
|
+
"string",
|
|
228
|
+
"number",
|
|
229
|
+
"boolean",
|
|
230
|
+
"object",
|
|
231
|
+
"array",
|
|
232
|
+
"any",
|
|
233
|
+
"void"
|
|
234
|
+
]
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
"required": [
|
|
238
|
+
"call",
|
|
239
|
+
"args"
|
|
240
|
+
],
|
|
241
|
+
"additionalProperties": false
|
|
242
|
+
}
|
|
243
|
+
],
|
|
244
|
+
"description": "The condition that indicates whether the check passes."
|
|
245
|
+
},
|
|
246
|
+
"message": {
|
|
247
|
+
"type": "string",
|
|
248
|
+
"description": "The error message to display if the check fails."
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
"required": [
|
|
252
|
+
"condition",
|
|
253
|
+
"message"
|
|
254
|
+
],
|
|
255
|
+
"additionalProperties": false
|
|
256
|
+
},
|
|
257
|
+
"description": "A list of checks to perform."
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
"required": [
|
|
261
|
+
"options",
|
|
262
|
+
"value"
|
|
263
|
+
]
|
|
264
|
+
}
|
|
265
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { GenericComponentProps } from '../../store/types.js';
|
|
2
|
+
import '../../../styles/catalog/ChoicePicker.css';
|
|
3
|
+
/**
|
|
4
|
+
* @a2uiCatalog ChoicePicker
|
|
5
|
+
*/
|
|
6
|
+
export interface ChoicePickerProps extends GenericComponentProps {
|
|
7
|
+
/** The label for the group of options. */
|
|
8
|
+
label?: string | {
|
|
9
|
+
path: string;
|
|
10
|
+
} | {
|
|
11
|
+
call: string;
|
|
12
|
+
args: Record<string, unknown>;
|
|
13
|
+
returnType?: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'any' | 'void';
|
|
14
|
+
};
|
|
15
|
+
/** A hint for how the choice picker should be displayed and behave. */
|
|
16
|
+
variant?: 'multipleSelection' | 'mutuallyExclusive';
|
|
17
|
+
/** The list of available options to choose from. */
|
|
18
|
+
options: Array<{
|
|
19
|
+
/** The text to display for this option. */
|
|
20
|
+
label: string | {
|
|
21
|
+
path: string;
|
|
22
|
+
} | {
|
|
23
|
+
call: string;
|
|
24
|
+
args: Record<string, unknown>;
|
|
25
|
+
returnType?: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'any' | 'void';
|
|
26
|
+
};
|
|
27
|
+
/** The stable value associated with this option. */
|
|
28
|
+
value: string;
|
|
29
|
+
}>;
|
|
30
|
+
/** The list of currently selected values. */
|
|
31
|
+
value: string[] | {
|
|
32
|
+
path: string;
|
|
33
|
+
} | {
|
|
34
|
+
call: string;
|
|
35
|
+
args: Record<string, unknown>;
|
|
36
|
+
returnType?: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'any' | 'void';
|
|
37
|
+
};
|
|
38
|
+
/** The display style of the component. */
|
|
39
|
+
displayStyle?: 'checkbox' | 'chips';
|
|
40
|
+
/** If true, displays a search input to filter the options. */
|
|
41
|
+
filterable?: boolean;
|
|
42
|
+
/** A list of checks to perform. */
|
|
43
|
+
checks?: Array<{
|
|
44
|
+
/** The condition that indicates whether the check passes. */
|
|
45
|
+
condition: boolean | {
|
|
46
|
+
path: string;
|
|
47
|
+
} | {
|
|
48
|
+
call: string;
|
|
49
|
+
args: Record<string, unknown>;
|
|
50
|
+
returnType?: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'any' | 'void';
|
|
51
|
+
};
|
|
52
|
+
/** The error message to display if the check fails. */
|
|
53
|
+
message: string;
|
|
54
|
+
}>;
|
|
55
|
+
}
|
|
56
|
+
export declare function ChoicePicker(props: ChoicePickerProps): import('@lynx-js/react').ReactNode;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// Copyright 2026 The Lynx Authors. All rights reserved.
|
|
2
|
+
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
|
+
// LICENSE file in the root directory of this source tree.
|
|
4
|
+
import { Checkbox, CheckboxIndicator, Input, Radio, RadioGroupRoot, RadioIndicator, } from '@lynx-js/lynx-ui';
|
|
5
|
+
import { useState } from '@lynx-js/react';
|
|
6
|
+
import { filterChoicePickerOptions, normalizeChoicePickerDisplayStyle, normalizeChoicePickerLabel, normalizeChoicePickerOptions, normalizeChoicePickerValue, normalizeChoicePickerVariant, toggleChoicePickerValue, } from './utils.js';
|
|
7
|
+
import { useChecks } from '../../react/useChecks.js';
|
|
8
|
+
import '../../../styles/catalog/ChoicePicker.css';
|
|
9
|
+
const HitSlop = {
|
|
10
|
+
'hit-slop': {
|
|
11
|
+
top: '8px',
|
|
12
|
+
left: '8px',
|
|
13
|
+
right: '8px',
|
|
14
|
+
bottom: '8px',
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
export function ChoicePicker(props) {
|
|
18
|
+
const { dataContextPath, filterable = false, id, label, setValue, surface, } = props;
|
|
19
|
+
const [query, setQuery] = useState('');
|
|
20
|
+
const options = normalizeChoicePickerOptions(props.options);
|
|
21
|
+
const variant = normalizeChoicePickerVariant(props.variant);
|
|
22
|
+
const displayStyle = normalizeChoicePickerDisplayStyle(props.displayStyle);
|
|
23
|
+
const selectedValues = normalizeChoicePickerValue(props.value, options);
|
|
24
|
+
const selectedValue = selectedValues[0] ?? '';
|
|
25
|
+
const visibleOptions = filterChoicePickerOptions(options, query);
|
|
26
|
+
const checks = props.checks;
|
|
27
|
+
const { ok, firstFailureMessage } = useChecks({
|
|
28
|
+
checks,
|
|
29
|
+
componentId: id ?? '',
|
|
30
|
+
surface,
|
|
31
|
+
dataContextPath,
|
|
32
|
+
});
|
|
33
|
+
const handleExclusiveChange = (nextValue) => {
|
|
34
|
+
if (!nextValue || selectedValue === nextValue)
|
|
35
|
+
return;
|
|
36
|
+
setValue?.('value', [nextValue]);
|
|
37
|
+
};
|
|
38
|
+
const handleMultipleChange = (optionValue) => {
|
|
39
|
+
setValue?.('value', toggleChoicePickerValue(selectedValues, optionValue, variant));
|
|
40
|
+
};
|
|
41
|
+
const rootClassName = [
|
|
42
|
+
'choice-picker',
|
|
43
|
+
`choice-picker-${displayStyle}`,
|
|
44
|
+
`choice-picker-${variant}`,
|
|
45
|
+
ok ? '' : 'choice-picker-invalid',
|
|
46
|
+
].filter(Boolean).join(' ');
|
|
47
|
+
const labelText = normalizeChoicePickerLabel(label);
|
|
48
|
+
return (<view key={id} className={rootClassName}>
|
|
49
|
+
{labelText
|
|
50
|
+
? <text className='choice-picker-label'>{labelText}</text>
|
|
51
|
+
: null}
|
|
52
|
+
{filterable
|
|
53
|
+
? (<Input className='choice-picker-filter' value={query} type='text' confirmType='done' onInput={setQuery}/>)
|
|
54
|
+
: null}
|
|
55
|
+
{variant === 'mutuallyExclusive'
|
|
56
|
+
? (<RadioGroupRoot value={selectedValue} onValueChange={handleExclusiveChange}>
|
|
57
|
+
<view className='choice-picker-options'>
|
|
58
|
+
{visibleOptions.map((option) => displayStyle === 'chips'
|
|
59
|
+
? (<Radio key={option.value} className='choice-picker-chip' value={option.value} radioProps={HitSlop}>
|
|
60
|
+
<text className='choice-picker-chip-text'>
|
|
61
|
+
{option.label}
|
|
62
|
+
</text>
|
|
63
|
+
</Radio>)
|
|
64
|
+
: (<Radio key={option.value} className='choice-picker-option' value={option.value} radioProps={HitSlop}>
|
|
65
|
+
<RadioIndicator forceMount className='choice-picker-radio-indicator'>
|
|
66
|
+
<view className='choice-picker-radio-dot'/>
|
|
67
|
+
</RadioIndicator>
|
|
68
|
+
<text className='choice-picker-option-text'>
|
|
69
|
+
{option.label}
|
|
70
|
+
</text>
|
|
71
|
+
</Radio>))}
|
|
72
|
+
</view>
|
|
73
|
+
</RadioGroupRoot>)
|
|
74
|
+
: (<view className='choice-picker-options'>
|
|
75
|
+
{visibleOptions.map((option) => {
|
|
76
|
+
const checked = selectedValues.includes(option.value);
|
|
77
|
+
return displayStyle === 'chips'
|
|
78
|
+
? (<Checkbox key={option.value} className='choice-picker-chip' checked={checked} onChange={() => handleMultipleChange(option.value)} checkboxProps={HitSlop}>
|
|
79
|
+
<text className='choice-picker-chip-text'>
|
|
80
|
+
{option.label}
|
|
81
|
+
</text>
|
|
82
|
+
</Checkbox>)
|
|
83
|
+
: (<Checkbox key={option.value} className='choice-picker-option' checked={checked} onChange={() => handleMultipleChange(option.value)} checkboxProps={HitSlop}>
|
|
84
|
+
<CheckboxIndicator forceMount className='choice-picker-checkbox-indicator'>
|
|
85
|
+
<text className='choice-picker-checkmark'>✓</text>
|
|
86
|
+
</CheckboxIndicator>
|
|
87
|
+
<text className='choice-picker-option-text'>
|
|
88
|
+
{option.label}
|
|
89
|
+
</text>
|
|
90
|
+
</Checkbox>);
|
|
91
|
+
})}
|
|
92
|
+
</view>)}
|
|
93
|
+
{!ok && firstFailureMessage
|
|
94
|
+
? <text className='choice-picker-error'>{firstFailureMessage}</text>
|
|
95
|
+
: null}
|
|
96
|
+
</view>);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=index.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../../src/catalog/ChoicePicker/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ChoicePickerOption {
|
|
2
|
+
label: string;
|
|
3
|
+
value: string;
|
|
4
|
+
}
|
|
5
|
+
export type ChoicePickerVariant = 'multipleSelection' | 'mutuallyExclusive';
|
|
6
|
+
export type ChoicePickerDisplayStyle = 'checkbox' | 'chips';
|
|
7
|
+
export declare function normalizeChoicePickerLabel(value: unknown): string;
|
|
8
|
+
export declare function normalizeChoicePickerVariant(value: unknown): ChoicePickerVariant;
|
|
9
|
+
export declare function normalizeChoicePickerDisplayStyle(value: unknown): ChoicePickerDisplayStyle;
|
|
10
|
+
export declare function normalizeChoicePickerOptions(value: unknown): ChoicePickerOption[];
|
|
11
|
+
export declare function normalizeChoicePickerValue(value: unknown, options?: readonly ChoicePickerOption[]): string[];
|
|
12
|
+
export declare function toggleChoicePickerValue(currentValue: readonly string[], optionValue: string, variant: ChoicePickerVariant): string[];
|
|
13
|
+
export declare function filterChoicePickerOptions(options: readonly ChoicePickerOption[], query: string): ChoicePickerOption[];
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// Copyright 2026 The Lynx Authors. All rights reserved.
|
|
2
|
+
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
|
+
// LICENSE file in the root directory of this source tree.
|
|
4
|
+
export function normalizeChoicePickerLabel(value) {
|
|
5
|
+
if (typeof value === 'string'
|
|
6
|
+
|| typeof value === 'number'
|
|
7
|
+
|| typeof value === 'boolean') {
|
|
8
|
+
return String(value);
|
|
9
|
+
}
|
|
10
|
+
return '';
|
|
11
|
+
}
|
|
12
|
+
export function normalizeChoicePickerVariant(value) {
|
|
13
|
+
return value === 'multipleSelection' || value === 'multiSelect'
|
|
14
|
+
? 'multipleSelection'
|
|
15
|
+
: 'mutuallyExclusive';
|
|
16
|
+
}
|
|
17
|
+
export function normalizeChoicePickerDisplayStyle(value) {
|
|
18
|
+
return value === 'chips' ? 'chips' : 'checkbox';
|
|
19
|
+
}
|
|
20
|
+
export function normalizeChoicePickerOptions(value) {
|
|
21
|
+
if (!Array.isArray(value))
|
|
22
|
+
return [];
|
|
23
|
+
const seen = new Set();
|
|
24
|
+
const options = [];
|
|
25
|
+
for (const item of value) {
|
|
26
|
+
if (item === null || typeof item !== 'object')
|
|
27
|
+
continue;
|
|
28
|
+
const record = item;
|
|
29
|
+
const optionValue = record['value'];
|
|
30
|
+
if (typeof optionValue !== 'string' || seen.has(optionValue))
|
|
31
|
+
continue;
|
|
32
|
+
seen.add(optionValue);
|
|
33
|
+
options.push({
|
|
34
|
+
label: normalizeChoicePickerLabel(record['label']) || optionValue,
|
|
35
|
+
value: optionValue,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return options;
|
|
39
|
+
}
|
|
40
|
+
export function normalizeChoicePickerValue(value, options) {
|
|
41
|
+
const allowed = options
|
|
42
|
+
? new Set(options.map((option) => option.value))
|
|
43
|
+
: null;
|
|
44
|
+
let rawValues = [];
|
|
45
|
+
if (Array.isArray(value)) {
|
|
46
|
+
rawValues = value;
|
|
47
|
+
}
|
|
48
|
+
else if (typeof value === 'string') {
|
|
49
|
+
rawValues = [value];
|
|
50
|
+
}
|
|
51
|
+
const seen = new Set();
|
|
52
|
+
const selected = [];
|
|
53
|
+
for (const item of rawValues) {
|
|
54
|
+
if (typeof item !== 'string')
|
|
55
|
+
continue;
|
|
56
|
+
if (allowed && !allowed.has(item))
|
|
57
|
+
continue;
|
|
58
|
+
if (seen.has(item))
|
|
59
|
+
continue;
|
|
60
|
+
seen.add(item);
|
|
61
|
+
selected.push(item);
|
|
62
|
+
}
|
|
63
|
+
return selected;
|
|
64
|
+
}
|
|
65
|
+
export function toggleChoicePickerValue(currentValue, optionValue, variant) {
|
|
66
|
+
if (variant === 'mutuallyExclusive') {
|
|
67
|
+
return [optionValue];
|
|
68
|
+
}
|
|
69
|
+
return currentValue.includes(optionValue)
|
|
70
|
+
? currentValue.filter((value) => value !== optionValue)
|
|
71
|
+
: [...currentValue, optionValue];
|
|
72
|
+
}
|
|
73
|
+
export function filterChoicePickerOptions(options, query) {
|
|
74
|
+
const normalizedQuery = query.trim().toLowerCase();
|
|
75
|
+
if (!normalizedQuery)
|
|
76
|
+
return [...options];
|
|
77
|
+
return options.filter((option) => option.label.toLowerCase().includes(normalizedQuery)
|
|
78
|
+
|| option.value.toLowerCase().includes(normalizedQuery));
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/catalog/ChoicePicker/utils.ts"],"names":[],"mappings":"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"}
|