@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.
Files changed (134) hide show
  1. package/a2ui/README.md +777 -100
  2. package/a2ui/dist/catalog/Button/{index.js → index.jsx} +12 -8
  3. package/a2ui/dist/catalog/Button/index.jsx.map +1 -0
  4. package/a2ui/dist/catalog/Card/{index.js → index.jsx} +5 -4
  5. package/a2ui/dist/catalog/Card/index.jsx.map +1 -0
  6. package/a2ui/dist/catalog/CheckBox/{index.js → index.jsx} +11 -6
  7. package/a2ui/dist/catalog/CheckBox/index.jsx.map +1 -0
  8. package/a2ui/dist/catalog/ChoicePicker/catalog.json +265 -0
  9. package/a2ui/dist/catalog/ChoicePicker/index.d.ts +56 -0
  10. package/a2ui/dist/catalog/ChoicePicker/index.jsx +98 -0
  11. package/a2ui/dist/catalog/ChoicePicker/index.jsx.map +1 -0
  12. package/a2ui/dist/catalog/ChoicePicker/utils.d.ts +13 -0
  13. package/a2ui/dist/catalog/ChoicePicker/utils.js +80 -0
  14. package/a2ui/dist/catalog/ChoicePicker/utils.js.map +1 -0
  15. package/a2ui/dist/catalog/Column/{index.js → index.jsx} +13 -14
  16. package/a2ui/dist/catalog/Column/index.jsx.map +1 -0
  17. package/a2ui/dist/catalog/DateTimeInput/catalog.json +165 -0
  18. package/a2ui/dist/catalog/DateTimeInput/index.d.ts +43 -0
  19. package/a2ui/dist/catalog/DateTimeInput/index.jsx +258 -0
  20. package/a2ui/dist/catalog/DateTimeInput/index.jsx.map +1 -0
  21. package/a2ui/dist/catalog/DateTimeInput/utils.d.ts +53 -0
  22. package/a2ui/dist/catalog/DateTimeInput/utils.js +248 -0
  23. package/a2ui/dist/catalog/DateTimeInput/utils.js.map +1 -0
  24. package/a2ui/dist/catalog/Divider/index.jsx +7 -0
  25. package/a2ui/dist/catalog/Divider/index.jsx.map +1 -0
  26. package/a2ui/dist/catalog/Icon/catalog.json +173 -2
  27. package/a2ui/dist/catalog/Icon/index.d.ts +2 -2
  28. package/a2ui/dist/catalog/Icon/{index.js → index.jsx} +4 -3
  29. package/a2ui/dist/catalog/Icon/index.jsx.map +1 -0
  30. package/a2ui/dist/catalog/Image/catalog.json +1 -17
  31. package/a2ui/dist/catalog/Image/index.d.ts +1 -3
  32. package/a2ui/dist/catalog/Image/index.jsx +21 -0
  33. package/a2ui/dist/catalog/Image/index.jsx.map +1 -0
  34. package/a2ui/dist/catalog/LineChart/{index.js → index.jsx} +53 -16
  35. package/a2ui/dist/catalog/LineChart/{index.js.map → index.jsx.map} +1 -1
  36. package/a2ui/dist/catalog/List/{index.js → index.jsx} +9 -6
  37. package/a2ui/dist/catalog/List/{index.js.map → index.jsx.map} +1 -1
  38. package/a2ui/dist/catalog/Modal/{index.js → index.jsx} +18 -9
  39. package/a2ui/dist/catalog/Modal/index.jsx.map +1 -0
  40. package/a2ui/dist/catalog/PieChart/{index.js → index.jsx} +41 -15
  41. package/a2ui/dist/catalog/PieChart/{index.js.map → index.jsx.map} +1 -1
  42. package/a2ui/dist/catalog/RadioGroup/{index.js → index.jsx} +18 -5
  43. package/a2ui/dist/catalog/RadioGroup/index.jsx.map +1 -0
  44. package/a2ui/dist/catalog/Row/{index.js → index.jsx} +10 -7
  45. package/a2ui/dist/catalog/Row/index.jsx.map +1 -0
  46. package/a2ui/dist/catalog/Slider/{index.js → index.jsx} +22 -7
  47. package/a2ui/dist/catalog/Slider/{index.js.map → index.jsx.map} +1 -1
  48. package/a2ui/dist/catalog/Tabs/index.jsx +40 -0
  49. package/a2ui/dist/catalog/Tabs/index.jsx.map +1 -0
  50. package/a2ui/dist/catalog/Text/catalog.json +6 -2
  51. package/a2ui/dist/catalog/Text/index.d.ts +1 -1
  52. package/a2ui/dist/catalog/Text/index.jsx +16 -0
  53. package/a2ui/dist/catalog/Text/index.jsx.map +1 -0
  54. package/a2ui/dist/catalog/TextField/{index.js → index.jsx} +8 -5
  55. package/a2ui/dist/catalog/TextField/{index.js.map → index.jsx.map} +1 -1
  56. package/a2ui/dist/catalog/index.d.ts +21 -17
  57. package/a2ui/dist/catalog/index.js +2067 -20
  58. package/a2ui/dist/catalog/index.js.map +1 -1
  59. package/a2ui/dist/index.d.ts +1 -1
  60. package/a2ui/dist/index.js +1 -1
  61. package/a2ui/dist/index.js.map +1 -1
  62. package/a2ui/dist/react/A2UI.d.ts +1 -1
  63. package/a2ui/dist/react/{A2UI.js → A2UI.jsx} +6 -5
  64. package/a2ui/dist/react/{A2UI.js.map → A2UI.jsx.map} +1 -1
  65. package/a2ui/dist/react/{A2UIProvider.js → A2UIProvider.jsx} +2 -3
  66. package/a2ui/dist/react/{A2UIProvider.js.map → A2UIProvider.jsx.map} +1 -1
  67. package/a2ui/dist/react/A2UIRenderer.d.ts +1 -0
  68. package/a2ui/dist/react/{A2UIRenderer.js → A2UIRenderer.jsx} +36 -24
  69. package/a2ui/dist/react/A2UIRenderer.jsx.map +1 -0
  70. package/a2ui/dist/react/index.d.ts +3 -3
  71. package/a2ui/dist/react/index.js +2 -2
  72. package/a2ui/dist/react/index.js.map +1 -1
  73. package/a2ui/dist/react/useA2UIContext.d.ts +1 -1
  74. package/a2ui/dist/react/useA2UIContext.js +1 -1
  75. package/a2ui/dist/react/useA2UIContext.js.map +1 -1
  76. package/a2ui/dist/react/useAction.js +2 -1
  77. package/a2ui/dist/react/useAction.js.map +1 -1
  78. package/a2ui/dist/react/useChecks.js +7 -2
  79. package/a2ui/dist/react/useChecks.js.map +1 -1
  80. package/a2ui/dist/react/useDataBinding.d.ts +1 -1
  81. package/a2ui/dist/react/useDataBinding.js +24 -48
  82. package/a2ui/dist/react/useDataBinding.js.map +1 -1
  83. package/a2ui/dist/store/MessageProcessor.js +7 -19
  84. package/a2ui/dist/store/MessageProcessor.js.map +1 -1
  85. package/a2ui/dist/store/SignalStore.d.ts +2 -0
  86. package/a2ui/dist/store/SignalStore.js +5 -0
  87. package/a2ui/dist/store/SignalStore.js.map +1 -1
  88. package/a2ui/dist/store/index.d.ts +3 -1
  89. package/a2ui/dist/store/index.js +3 -1
  90. package/a2ui/dist/store/index.js.map +1 -1
  91. package/a2ui/dist/store/resolveDynamic.d.ts +9 -0
  92. package/a2ui/dist/store/resolveDynamic.js +88 -0
  93. package/a2ui/dist/store/resolveDynamic.js.map +1 -0
  94. package/a2ui/dist/store/resolveFunctionCall.d.ts +2 -4
  95. package/a2ui/dist/store/resolveFunctionCall.js +24 -82
  96. package/a2ui/dist/store/resolveFunctionCall.js.map +1 -1
  97. package/a2ui/dist/store/signalResolution.d.ts +4 -0
  98. package/a2ui/dist/store/signalResolution.js +25 -0
  99. package/a2ui/dist/store/signalResolution.js.map +1 -0
  100. package/a2ui/dist/store/utils.d.ts +7 -0
  101. package/a2ui/dist/store/utils.js +24 -0
  102. package/a2ui/dist/store/utils.js.map +1 -0
  103. package/a2ui/dist/tsconfig.build.tsbuildinfo +1 -1
  104. package/a2ui/styles/catalog/ChoicePicker.css +157 -0
  105. package/a2ui/styles/catalog/DateTimeInput.css +375 -0
  106. package/a2ui/styles/catalog/Icon.css +1 -1
  107. package/a2ui/styles/catalog/Modal.css +1 -0
  108. package/a2ui/styles/catalog/Text.css +13 -17
  109. package/a2ui/styles/theme.css +2 -1
  110. package/a2ui-catalog-extractor/README.md +23 -15
  111. package/a2ui-catalog-extractor/bin/a2ui-catalog-extractor.js +0 -1
  112. package/a2ui-catalog-extractor/dist/tsconfig.build.tsbuildinfo +1 -1
  113. package/a2ui-prompt/README.md +1 -2
  114. package/a2ui-prompt/dist/index.js +138 -104
  115. package/cli/bin/cli.js +5 -2
  116. package/dist/tsconfig.build.tsbuildinfo +1 -1
  117. package/package.json +8 -1
  118. package/a2ui/dist/catalog/Button/index.js.map +0 -1
  119. package/a2ui/dist/catalog/Card/index.js.map +0 -1
  120. package/a2ui/dist/catalog/CheckBox/index.js.map +0 -1
  121. package/a2ui/dist/catalog/Column/index.js.map +0 -1
  122. package/a2ui/dist/catalog/Divider/index.js +0 -8
  123. package/a2ui/dist/catalog/Divider/index.js.map +0 -1
  124. package/a2ui/dist/catalog/Icon/index.js.map +0 -1
  125. package/a2ui/dist/catalog/Image/index.js +0 -30
  126. package/a2ui/dist/catalog/Image/index.js.map +0 -1
  127. package/a2ui/dist/catalog/Modal/index.js.map +0 -1
  128. package/a2ui/dist/catalog/RadioGroup/index.js.map +0 -1
  129. package/a2ui/dist/catalog/Row/index.js.map +0 -1
  130. package/a2ui/dist/catalog/Tabs/index.js +0 -32
  131. package/a2ui/dist/catalog/Tabs/index.js.map +0 -1
  132. package/a2ui/dist/catalog/Text/index.js +0 -27
  133. package/a2ui/dist/catalog/Text/index.js.map +0 -1
  134. 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.js';
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 (_jsxs(_Fragment, { children: [_jsx("view", { className: `button button-${variant}${isValid ? '' : ' button-disabled'}${ok ? '' : ' button-invalid'}`, bindtap: enabled ? handleClick : undefined, children: childResource
30
- ? _jsx(A2UIRenderer, { resource: childResource })
31
- : _jsx("text", { className: 'button-fallback', children: "Button" }) }), !ok && firstFailureMessage
32
- ? _jsx("text", { className: 'button-error', children: firstFailureMessage })
33
- : null] }));
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.js.map
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.js';
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 (_jsx("view", { className: `card card-${variant} ${weightClass}`.trim(), children: childWithContext && (_jsx(NodeRenderer, { component: childWithContext, surface: surface })) }));
16
+ return (<view className={`card card-${variant} ${weightClass}`.trim()}>
17
+ {childWithContext && (<NodeRenderer component={childWithContext} surface={surface}/>)}
18
+ </view>);
18
19
  }
19
- //# sourceMappingURL=index.js.map
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 (_jsxs("view", { className: `checkbox-row${ok ? '' : ' checkbox-row-invalid'}`, bindtap: handleChange, children: [_jsx("view", { className: `checkbox-input ${value ? 'checkbox-input-checked' : ''}`
20
- .trim(), children: !!value && _jsx("text", { children: "\u2713" }) }), _jsx("text", { className: 'checkbox-label', children: label }), !ok && firstFailureMessage
21
- ? _jsx("text", { className: 'checkbox-error', children: firstFailureMessage })
22
- : null] }, id));
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.js.map
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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"}