@tmorrow/cre8-wc 2.0.7 → 2.1.0
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/catalog +5 -5
- package/a2ui/catalog-kg.json +156 -20
- package/a2ui/catalog.compact.json +2466 -0
- package/a2ui/catalog.json +1636 -139
- package/a2ui/catalog.svg +2445 -2445
- package/a2ui/check-layer-parity.mjs +277 -0
- package/a2ui/examples/compound-families.json +298 -0
- package/a2ui/examples/llm-observability.json +678 -650
- package/a2ui/generate-catalog.mjs +256 -5
- package/a2ui/inert-props.json +32 -0
- package/a2ui/registry.js +28 -0
- package/a2ui/registry.ts +31 -0
- package/a2ui/render-audit.mjs +294 -0
- package/a2ui/renderer.d.ts +2 -1
- package/a2ui/renderer.js +1 -1
- package/a2ui/renderer.ts +1 -1
- package/a2ui/smoke-test.mjs +39 -5
- package/a2ui/stream/diff-test.mjs +299 -0
- package/a2ui/stream/diff.d.ts +28 -0
- package/a2ui/stream/diff.js +130 -0
- package/a2ui/stream/diff.ts +145 -0
- package/a2ui/stream/index.d.ts +11 -0
- package/a2ui/stream/index.js +11 -0
- package/a2ui/stream/index.ts +43 -0
- package/a2ui/stream/model.d.ts +66 -0
- package/a2ui/stream/model.js +429 -0
- package/a2ui/stream/model.ts +472 -0
- package/a2ui/stream/pointer.d.ts +34 -0
- package/a2ui/stream/pointer.js +146 -0
- package/a2ui/stream/pointer.ts +147 -0
- package/a2ui/stream/renderer.d.ts +51 -0
- package/a2ui/stream/renderer.js +282 -0
- package/a2ui/stream/renderer.ts +291 -0
- package/a2ui/stream/stream-test.mjs +592 -0
- package/a2ui/stream/types.d.ts +173 -0
- package/a2ui/stream/types.js +17 -0
- package/a2ui/stream/types.ts +127 -0
- package/a2ui/types.d.ts +5 -0
- package/a2ui/types.ts +5 -0
- package/cdn/cre8-wc.esm.js +3527 -3226
- package/cdn/cre8-wc.esm.js.map +1 -1
- package/cdn/cre8-wc.min.js +289 -289
- package/cdn/cre8-wc.min.js.map +1 -1
- package/dist/assets/{Changelog-Documentation-BguNswiM.js → Changelog-Documentation-CeOetLxK.js} +1 -1
- package/dist/assets/{Code-Guidelines-BM3dZyzL.js → Code-Guidelines-BjdezAjj.js} +1 -1
- package/dist/assets/{Color-6AOWCN3U-C4AEGNk3.js → Color-6AOWCN3U-DPFGZitI.js} +1 -1
- package/dist/assets/{Contributing-Guidelines-DZURVehh.js → Contributing-Guidelines-B1M2V1hW.js} +1 -1
- package/dist/assets/{DocsRenderer-JROSPFPF-DeZmCI9u.js → DocsRenderer-JROSPFPF-BBy8KWNl.js} +1 -1
- package/dist/assets/{Tokens-Documentation-ZecGbtQg.js → Tokens-Documentation-CdTxFDLe.js} +1 -1
- package/dist/assets/{WithTooltip-7X4HQR7L-2Hfrkir-.js → WithTooltip-7X4HQR7L-DZzTNMQ7.js} +1 -1
- package/dist/assets/{accordion-item.stories-D-MjrX5G.js → accordion-item.stories-Bl26JlHp.js} +1 -9
- package/dist/assets/{accordion.stories-icgNa1dl.js → accordion.stories-DjoLApQw.js} +3 -11
- package/dist/assets/{alert.stories-BzDaXtj-.js → alert.stories-pO1y3YCQ.js} +15 -31
- package/dist/assets/{badge-C5wOWgyg.js → badge-BTxW3bN2.js} +3 -11
- package/dist/assets/{badge.stories-5GfB4jVI.js → badge.stories-vqh63RJ2.js} +1 -1
- package/dist/assets/{band.stories-DhXaP_kL.js → band.stories-CjKRppSb.js} +1 -9
- package/dist/assets/{blocks-DhUVut8Z.js → blocks-1be_-L6v.js} +5 -5
- package/dist/assets/{breadcrumbs.stories-CrPUBVk1.js → breadcrumbs.stories-Doyfy3V9.js} +2 -18
- package/dist/assets/{button-CJL8yzAT.js → button-CgaWukz0.js} +1 -9
- package/dist/assets/{button-group-BgwgtSFC.js → button-group-G7qN4MwM.js} +1 -9
- package/dist/assets/{button-group.stories-W-07gO63.js → button-group.stories-cL3Kay6M.js} +1 -1
- package/dist/assets/{button.stories-BPzJ-sCv.js → button.stories-C9HSpxWb.js} +6 -6
- package/dist/assets/{card.stories-mlFGY2Xn.js → card.stories-BbU8YymD.js} +3 -11
- package/dist/assets/{chart.stories-C8yuHHeK.js → chart.stories-BL4FxIA_.js} +1 -1
- package/dist/assets/{checkbox-field-item-iHcdmTNw.js → checkbox-field-item-DIMHcWM0.js} +1 -9
- package/dist/assets/{checkbox-field-item.stories-D1aVLDXn.js → checkbox-field-item.stories-XbB4x_lO.js} +1 -1
- package/dist/assets/{checkbox-field.stories-BoVB2jCx.js → checkbox-field.stories-YnqFUI4K.js} +2 -10
- package/dist/assets/{cre8-element-DfmMtHJO.js → cre8-element-B35i4Lyg.js} +1 -1
- package/dist/assets/{cre8-form-element-bQpK8UYN.js → cre8-form-element-Cfc5VeYV.js} +1 -1
- package/dist/assets/{danger-button.stories-Cb4ljnhQ.js → danger-button.stories-xh25hmfd.js} +1 -9
- package/dist/assets/{date-picker.stories-Cje3qk8D.js → date-picker.stories-DD_ctzEF.js} +1 -49
- package/dist/assets/{divider-B_PXBGWD.js → divider-xZ2KARHf.js} +2 -10
- package/dist/assets/{divider.stories-CtfeBqVV.js → divider.stories-Bk9oF-OV.js} +1 -1
- package/dist/assets/{dropdown-Cgwne34I.js → dropdown-BEP5x3CW.js} +6 -22
- package/dist/assets/{dropdown-item.stories-pXkDLRuv.js → dropdown-item.stories-Iaw_UrEP.js} +1 -1
- package/dist/assets/{dropdown.stories-DZnmHieY.js → dropdown.stories-B0OlKD7h.js} +1 -1
- package/dist/assets/{example-drug-card.stories-DTzLXTFx.js → example-drug-card.stories-Bp5JIeE_.js} +1 -1
- package/dist/assets/{f-po-C2WpbOFJ.js → f-po-BdPzDRD-.js} +1 -1
- package/dist/assets/{feature.stories-DffXdJch.js → feature.stories-DYE1Js70.js} +1 -9
- package/dist/assets/{field-DzYRqQb2.js → field-BpUYyRW1.js} +1 -9
- package/dist/assets/{field-note-DKXZiXLU.js → field-note-fccBckVl.js} +3 -11
- package/dist/assets/{field-note.stories-DS_0bQul.js → field-note.stories-BH9AZMbF.js} +1 -1
- package/dist/assets/{field.stories-BvXn0oG6.js → field.stories-BQPtmziK.js} +1 -1
- package/dist/assets/{footer.stories-C3ZibisU.js → footer.stories-DCWEciqD.js} +1 -9
- package/dist/assets/{form-example.stories-C-TuOeF2.js → form-example.stories-9IDC0AgX.js} +1 -1
- package/dist/assets/{formatter-L2YTDE3Q-CJVnxOUW.js → formatter-L2YTDE3Q-B9u1AOWn.js} +1 -1
- package/dist/assets/{global-nav-item-xQL7wVjY.js → global-nav-item-T4htN-yO.js} +6 -14
- package/dist/assets/{global-nav-item.stories-Dp9TE3aR.js → global-nav-item.stories-2dWRfCXv.js} +1 -1
- package/dist/assets/{global-nav.stories-B5Nk8JZ0.js → global-nav.stories-Fh1gScqg.js} +2 -10
- package/dist/assets/{grid-DYgnZBsd.js → grid-C5CKMXNe.js} +3 -19
- package/dist/assets/{grid.stories-BFiXTq2C.js → grid.stories-BLmCNdeA.js} +1 -1
- package/dist/assets/{header.stories-D1f7xhjV.js → header.stories-BkDrjJtj.js} +1 -9
- package/dist/assets/{heading-485Jz7JZ.js → heading-Dbka33DK.js} +2 -10
- package/dist/assets/{heading.stories-gPF_SmTc.js → heading.stories-Be40_bmG.js} +1 -1
- package/dist/assets/{hero.stories-BHlFNdvF.js → hero.stories-vRu7PZG9.js} +1 -9
- package/dist/assets/{icon-DeTLDzTS.js → icon-ChfRWXWy.js} +2 -10
- package/dist/assets/{icon-description-o-YaiEjK.js → icon-description-BBSwDykJ.js} +1 -1
- package/dist/assets/{icon-description.stories-BdPRvEwe.js → icon-description.stories-Cg6ekOme.js} +1 -1
- package/dist/assets/{icon.stories-BxWpqxT5.js → icon.stories-Cj4U7L5G.js} +1 -1
- package/dist/assets/if-defined-Bxnzk64Q.js +1 -0
- package/dist/assets/{iframe-dHvya7sk.js → iframe-BNJP6ovU.js} +35 -35
- package/dist/assets/{inline-alert.stories-FH0bQ0jh.js → inline-alert.stories-CygBYI02.js} +1 -9
- package/dist/assets/{layout-container.stories-D6Z6Kx78.js → layout-container.stories-TMyIJteJ.js} +2 -10
- package/dist/assets/{layout.stories-CNYuwC_r.js → layout.stories-ylRM-ANL.js} +7 -23
- package/dist/assets/{linelength-container.stories-pCRXZvxS.js → linelength-container.stories-Br2v8jXE.js} +1 -9
- package/dist/assets/{link-BpCiLxNW.js → link-CRE0Eqdo.js} +1 -9
- package/dist/assets/{link-list.stories-12vsAa1P.js → link-list.stories--y-urrVo.js} +7 -23
- package/dist/assets/{link.stories-DAoQtY4_.js → link.stories-C3WQOgkY.js} +2 -2
- package/dist/assets/{list.stories-D0N3yBIf.js → list.stories-Bd2bxkxn.js} +7 -23
- package/dist/assets/{loading-spinner-g6iJajXH.js → loading-spinner-C52KNq6y.js} +4 -12
- package/dist/assets/{loading-spinner.stories-B6_mgPxB.js → loading-spinner.stories-DPRGEeHT.js} +1 -1
- package/dist/assets/{logo.stories-BvMwN2qg.js → logo.stories-2LBqqraT.js} +1 -9
- package/dist/assets/{main.stories-pL4zefbs.js → main.stories-BQzD7iWD.js} +2 -10
- package/dist/assets/{medication-card.stories-DK1XGJic.js → medication-card.stories-Wc-hA0-s.js} +5 -5
- package/dist/assets/{medication-form.stories-Bj5dLp5S.js → medication-form.stories-DfFOCDaU.js} +1 -1
- package/dist/assets/{modal-CO0M4e_8.js → modal-CCfbY4fF.js} +1 -9
- package/dist/assets/{modal-BNu8xy08.js → modal-GglWRNJp.js} +1 -1
- package/dist/assets/{modal.stories-CHYBrq_E.js → modal.stories-CpybCs79.js} +1 -1
- package/dist/assets/{multi-select.stories-C9XXsWio.js → multi-select.stories-BhzEKRui.js} +1 -9
- package/dist/assets/{nav-container.stories-DU9fhvDu.js → nav-container.stories-Be1YlegP.js} +3 -11
- package/dist/assets/{page-header.stories-BrstKiEY.js → page-header.stories-BOVLQ0YF.js} +1 -9
- package/dist/assets/{pagination.stories-Bw2M2iOn.js → pagination.stories-D62sa_1K.js} +9 -25
- package/dist/assets/{percent-bar.stories-UQRXYUqd.js → percent-bar.stories-CYi4El7T.js} +1 -9
- package/dist/assets/{popover.stories-ZkwrRFpR.js → popover.stories-B9O8F4yv.js} +1 -9
- package/dist/assets/{primary-nav.stories-wqOKwgQn.js → primary-nav.stories-Bt-o7h45.js} +1 -17
- package/dist/assets/{progress-meter-TzASasu0.js → progress-meter-Dit59091.js} +1 -9
- package/dist/assets/{progress-meter.stories-qfJALZf8.js → progress-meter.stories-CYnOCmjo.js} +1 -1
- package/dist/assets/{progress-steps-item-KvW1d_7L.js → progress-steps-item-CWJsad0s.js} +1 -9
- package/dist/assets/{progress-steps-item.stories-uOn6tJ1W.js → progress-steps-item.stories-ePn_6bPn.js} +1 -1
- package/dist/assets/{progress-steps.stories-CKFPx8D0.js → progress-steps.stories-CblrEcXF.js} +1 -9
- package/dist/assets/{radio-field-item-CTaR50XR.js → radio-field-item-Bm-0RWPe.js} +5 -21
- package/dist/assets/{radio-field-item.stories-DQSLj8W1.js → radio-field-item.stories-y_TrTRIW.js} +1 -1
- package/dist/assets/{radio-field.stories-Btmc_Iep.js → radio-field.stories-CSWrbUrn.js} +1 -1
- package/dist/assets/{remove-tag-BSEZ7VT8.js → remove-tag-lCr57c5r.js} +1 -9
- package/dist/assets/{remove-tag.stories-diRKi7Ua.js → remove-tag.stories-CDfwCdvZ.js} +1 -1
- package/dist/assets/{request-prescription.stories-DQvra7ia.js → request-prescription.stories-O4zqokfb.js} +1 -1
- package/dist/assets/{sample-modal.stories-deE1EBfZ.js → sample-modal.stories-BZ4N2R2Z.js} +1 -1
- package/dist/assets/{section.stories-DF4mcy2O.js → section.stories-D_1InThX.js} +1 -9
- package/dist/assets/{select-tile-D-C8oSrm.js → select-tile-BqqB3ZtE.js} +2 -10
- package/dist/assets/{select-tile-list.stories-vsBQUIcl.js → select-tile-list.stories-Di4ILgV8.js} +1 -9
- package/dist/assets/{select-tile.stories-CqHzN5fc.js → select-tile.stories-D3h_6zlV.js} +6 -6
- package/dist/assets/{select.stories-8aOGxTtr.js → select.stories-BB2phP9A.js} +1 -9
- package/dist/assets/{skeleton-loader.stories-CwR2-aC5.js → skeleton-loader.stories-y4uml_kV.js} +5 -13
- package/dist/assets/{split-button.stories-CyfdrK4u.js → split-button.stories-C_82I4ME.js} +2 -10
- package/dist/assets/{spread-BPiNgQQF.js → spread-CnPic3C2.js} +1 -1
- package/dist/assets/state-DkQhleoO.js +1 -0
- package/dist/assets/{submenu.stories-CDhNzZzh.js → submenu.stories-UDtaREr1.js} +2 -18
- package/dist/assets/{syntaxhighlighter-T5IQBZDB-BzI6WxUR.js → syntaxhighlighter-T5IQBZDB-D-I_s_yD.js} +1 -1
- package/dist/assets/{table-header-CfcchoYz.js → table-header-2837i43H.js} +3 -51
- package/dist/assets/{table-object.stories-Bd5qdfMU.js → table-object.stories-D4KoI-wA.js} +1 -9
- package/dist/assets/{table.stories-DxuBe9dJ.js → table.stories-DUJDibEp.js} +1 -1
- package/dist/assets/{tabs.stories-Cpc3OHJx.js → tabs.stories-C06SngOF.js} +5 -29
- package/dist/assets/{tag-list.stories-BmyCmrTF.js → tag-list.stories-Du-IoYzu.js} +2 -10
- package/dist/assets/{tag-vQFuZneb.js → tag-oHGdclJl.js} +1 -9
- package/dist/assets/{tag.stories-DGzrNUbb.js → tag.stories-C5D5IbuK.js} +1 -1
- package/dist/assets/{tertiary-nav.stories-D4q5K-am.js → tertiary-nav.stories-B1GU8Zi4.js} +3 -19
- package/dist/assets/{text-link-4qLRIeJB.js → text-link-B3m3KEqY.js} +1 -9
- package/dist/assets/{text-link.stories-D6BRm2I5.js → text-link.stories-4O6qn82H.js} +1 -1
- package/dist/assets/{text-passage-DGaI5i2I.js → text-passage-xQVosjOr.js} +3 -19
- package/dist/assets/{text-passage.stories-DkmXVUhH.js → text-passage.stories-Da1nspwG.js} +1 -1
- package/dist/assets/{tooltip.stories-B7ADDq7o.js → tooltip.stories-DLKyyeKn.js} +6 -14
- package/dist/assets/{utility-nav.stories-ffXVvyLp.js → utility-nav.stories-B6xBFe7z.js} +5 -21
- package/dist/design-tokens/brands/cre8/css/tokens_brand.css +1 -1
- package/dist/design-tokens/core/scss/theming/component.css +1 -1
- package/dist/design-tokens/core/scss/theming/variables.css +1 -7
- package/dist/design-tokens/core/scss/theming/variables.scss +0 -11
- package/dist/icons/cre8-icons.svg +1 -1
- package/dist/iframe.html +1 -24
- package/dist/index.html +25 -77
- package/dist/project.json +1 -1
- package/lib/a2ui/registry.d.ts.map +1 -1
- package/lib/a2ui/registry.js +28 -0
- package/lib/a2ui/registry.js.map +1 -1
- package/lib/a2ui/renderer.d.ts +2 -1
- package/lib/a2ui/renderer.d.ts.map +1 -1
- package/lib/a2ui/renderer.js +1 -1
- package/lib/a2ui/renderer.js.map +1 -1
- package/lib/a2ui/stream/diff.d.ts +29 -0
- package/lib/a2ui/stream/diff.d.ts.map +1 -0
- package/lib/a2ui/stream/diff.js +131 -0
- package/lib/a2ui/stream/diff.js.map +1 -0
- package/lib/a2ui/stream/index.d.ts +12 -0
- package/lib/a2ui/stream/index.d.ts.map +1 -0
- package/lib/a2ui/stream/index.js +12 -0
- package/lib/a2ui/stream/index.js.map +1 -0
- package/lib/a2ui/stream/model.d.ts +67 -0
- package/lib/a2ui/stream/model.d.ts.map +1 -0
- package/lib/a2ui/stream/model.js +423 -0
- package/lib/a2ui/stream/model.js.map +1 -0
- package/lib/a2ui/stream/pointer.d.ts +35 -0
- package/lib/a2ui/stream/pointer.d.ts.map +1 -0
- package/lib/a2ui/stream/pointer.js +147 -0
- package/lib/a2ui/stream/pointer.js.map +1 -0
- package/lib/a2ui/stream/renderer.d.ts +52 -0
- package/lib/a2ui/stream/renderer.d.ts.map +1 -0
- package/lib/a2ui/stream/renderer.js +279 -0
- package/lib/a2ui/stream/renderer.js.map +1 -0
- package/lib/a2ui/stream/types.d.ts +174 -0
- package/lib/a2ui/stream/types.d.ts.map +1 -0
- package/lib/a2ui/stream/types.js +18 -0
- package/lib/a2ui/stream/types.js.map +1 -0
- package/lib/a2ui/types.d.ts +5 -0
- package/lib/a2ui/types.d.ts.map +1 -1
- package/lib/a2ui/types.js.map +1 -1
- package/lib/components/accordion/accordion.d.ts +15 -0
- package/lib/components/accordion/accordion.d.ts.map +1 -1
- package/lib/components/accordion/accordion.js +23 -0
- package/lib/components/accordion/accordion.js.map +1 -1
- package/lib/components/badge/badge.d.ts +4 -17
- package/lib/components/badge/badge.d.ts.map +1 -1
- package/lib/components/badge/badge.js +0 -15
- package/lib/components/badge/badge.js.map +1 -1
- package/lib/components/breadcrumbs/breadcrumbs.d.ts +14 -0
- package/lib/components/breadcrumbs/breadcrumbs.d.ts.map +1 -1
- package/lib/components/breadcrumbs/breadcrumbs.js +21 -0
- package/lib/components/breadcrumbs/breadcrumbs.js.map +1 -1
- package/lib/components/chart/chart.d.ts +3 -3
- package/lib/components/chart/chart.js +6 -6
- package/lib/components/chart/chart.js.map +1 -1
- package/lib/components/checkbox-field/checkbox-field.d.ts +19 -0
- package/lib/components/checkbox-field/checkbox-field.d.ts.map +1 -1
- package/lib/components/checkbox-field/checkbox-field.js +28 -0
- package/lib/components/checkbox-field/checkbox-field.js.map +1 -1
- package/lib/components/cre8-element.d.ts +19 -0
- package/lib/components/cre8-element.d.ts.map +1 -1
- package/lib/components/cre8-element.js +51 -2
- package/lib/components/cre8-element.js.map +1 -1
- package/lib/components/divider/divider.d.ts +1 -1
- package/lib/components/divider/divider.d.ts.map +1 -1
- package/lib/components/divider/divider.js.map +1 -1
- package/lib/components/dropdown/dropdown.d.ts +13 -0
- package/lib/components/dropdown/dropdown.d.ts.map +1 -1
- package/lib/components/dropdown/dropdown.js +19 -0
- package/lib/components/dropdown/dropdown.js.map +1 -1
- package/lib/components/dropdown-item/dropdown-item.d.ts +1 -1
- package/lib/components/dropdown-item/dropdown-item.js +2 -2
- package/lib/components/dropdown-item/dropdown-item.js.map +1 -1
- package/lib/components/heading/heading.d.ts +3 -5
- package/lib/components/heading/heading.d.ts.map +1 -1
- package/lib/components/heading/heading.js +2 -4
- package/lib/components/heading/heading.js.map +1 -1
- package/lib/components/link-list/link-list.d.ts +19 -0
- package/lib/components/link-list/link-list.d.ts.map +1 -1
- package/lib/components/link-list/link-list.js +19 -0
- package/lib/components/link-list/link-list.js.map +1 -1
- package/lib/components/list/list.d.ts +13 -0
- package/lib/components/list/list.d.ts.map +1 -1
- package/lib/components/list/list.js +15 -0
- package/lib/components/list/list.js.map +1 -1
- package/lib/components/modal/modal.d.ts +2 -2
- package/lib/components/modal/modal.js +2 -2
- package/lib/components/modal/modal.js.map +1 -1
- package/lib/components/multi-select/multi-select.d.ts +2 -2
- package/lib/components/multi-select/multi-select.js +5 -5
- package/lib/components/multi-select/multi-select.js.map +1 -1
- package/lib/components/pagination/pagination.d.ts +1 -1
- package/lib/components/pagination/pagination.js +2 -2
- package/lib/components/pagination/pagination.js.map +1 -1
- package/lib/components/percent-bar/percent-bar.d.ts +2 -0
- package/lib/components/percent-bar/percent-bar.d.ts.map +1 -1
- package/lib/components/percent-bar/percent-bar.js +3 -1
- package/lib/components/percent-bar/percent-bar.js.map +1 -1
- package/lib/components/popover/popover.d.ts +6 -7
- package/lib/components/popover/popover.d.ts.map +1 -1
- package/lib/components/popover/popover.js +4 -4
- package/lib/components/popover/popover.js.map +1 -1
- package/lib/components/progress-meter/progress-meter.d.ts +0 -8
- package/lib/components/progress-meter/progress-meter.d.ts.map +1 -1
- package/lib/components/progress-meter/progress-meter.js +0 -7
- package/lib/components/progress-meter/progress-meter.js.map +1 -1
- package/lib/components/progress-steps/progress-steps.d.ts +16 -0
- package/lib/components/progress-steps/progress-steps.d.ts.map +1 -1
- package/lib/components/progress-steps/progress-steps.js +25 -0
- package/lib/components/progress-steps/progress-steps.js.map +1 -1
- package/lib/components/progress-steps-item/progress-steps-item.d.ts +1 -3
- package/lib/components/progress-steps-item/progress-steps-item.d.ts.map +1 -1
- package/lib/components/progress-steps-item/progress-steps-item.js +0 -1
- package/lib/components/progress-steps-item/progress-steps-item.js.map +1 -1
- package/lib/components/radio-field/radio-field.d.ts +33 -0
- package/lib/components/radio-field/radio-field.d.ts.map +1 -1
- package/lib/components/radio-field/radio-field.js +62 -0
- package/lib/components/radio-field/radio-field.js.map +1 -1
- package/lib/components/remove-tag/remove-tag.d.ts +1 -1
- package/lib/components/remove-tag/remove-tag.js +3 -3
- package/lib/components/remove-tag/remove-tag.js.map +1 -1
- package/lib/components/split-button/split-button.d.ts +3 -0
- package/lib/components/split-button/split-button.d.ts.map +1 -1
- package/lib/components/split-button/split-button.js +5 -2
- package/lib/components/split-button/split-button.js.map +1 -1
- package/lib/components/tab/tab.d.ts +1 -1
- package/lib/components/tab/tab.js +3 -3
- package/lib/components/tab/tab.js.map +1 -1
- package/lib/components/table/table.d.ts +36 -0
- package/lib/components/table/table.d.ts.map +1 -1
- package/lib/components/table/table.js +55 -0
- package/lib/components/table/table.js.map +1 -1
- package/lib/components/tabs/tabs.d.ts +20 -3
- package/lib/components/tabs/tabs.d.ts.map +1 -1
- package/lib/components/tabs/tabs.js +33 -5
- package/lib/components/tabs/tabs.js.map +1 -1
- package/lib/components/tag-list/tag-list.d.ts +17 -0
- package/lib/components/tag-list/tag-list.d.ts.map +1 -1
- package/lib/components/tag-list/tag-list.js +25 -0
- package/lib/components/tag-list/tag-list.js.map +1 -1
- package/lib/components/tooltip/tooltip.d.ts +2 -2
- package/lib/components/tooltip/tooltip.js +4 -4
- package/lib/components/tooltip/tooltip.js.map +1 -1
- package/lib/components/utils/light-children.d.ts +40 -0
- package/lib/components/utils/light-children.d.ts.map +1 -0
- package/lib/components/utils/light-children.js +100 -0
- package/lib/components/utils/light-children.js.map +1 -0
- package/lib/directives/if-truthy.d.ts +1 -1
- package/lib/light-children-TlEXev5S.js +39 -0
- package/lib/scripts/generate-mcp-manifest.js +38 -0
- package/lib/scripts/generate-mcp-manifest.js.map +1 -1
- package/lib/scripts/generate-react-wrappers.d.ts +8 -1
- package/lib/scripts/generate-react-wrappers.d.ts.map +1 -1
- package/lib/scripts/generate-react-wrappers.js +45 -1
- package/lib/scripts/generate-react-wrappers.js.map +1 -1
- package/mcp-manifest.json +169 -52
- package/package.json +14 -5
- package/react-manifest.json +153 -47
- package/dist/assets/if-defined-HKKhGupN.js +0 -1
- package/dist/assets/iframe-CWwoGI65.css +0 -1
- package/dist/assets/state-CfuknrX8.js +0 -1
- package/dist/fonts/PlusJakartaSans-Bold.woff2 +0 -0
- package/dist/fonts/PlusJakartaSans-Medium.woff2 +0 -0
- package/dist/fonts/PlusJakartaSans-Regular.woff2 +0 -0
- package/dist/fonts/PlusJakartaSans-SemiBold.woff2 +0 -0
- package/dist/logo.svg +0 -1
- package/dist/sb-addons/storybook-4/manager-bundle.js +0 -8
- /package/dist/icons/{express-scripts copy.svg → pharmacy copy.svg} +0 -0
- /package/dist/icons/{express-scripts.svg → pharmacy.svg} +0 -0
package/dist/iframe.html
CHANGED
|
@@ -551,28 +551,6 @@
|
|
|
551
551
|
console.warn('unable to connect to top frame for connecting dev tools');
|
|
552
552
|
}
|
|
553
553
|
</script>
|
|
554
|
-
<script>
|
|
555
|
-
/*
|
|
556
|
-
* Minimal `process` shim.
|
|
557
|
-
*
|
|
558
|
-
* `@wc-toolkit/storybook-helpers` imports `path`, which Vite resolves to the
|
|
559
|
-
* userland `path@0.12.7` package present transitively via
|
|
560
|
-
* `@bundled-es-modules/glob` and `@bundled-es-modules/memfs`. That package is
|
|
561
|
-
* a Node polyfill and dereferences `process` at module scope, so pre-bundling
|
|
562
|
-
* it for the browser threw `ReferenceError: process is not defined` before any
|
|
563
|
-
* story could mount — every story sat on the "preparing story" loader.
|
|
564
|
-
*
|
|
565
|
-
* This runs before the preview's module graph, which a Vite `define` cannot do
|
|
566
|
-
* safely here: defining bare `process` would also rewrite the `process.env.*`
|
|
567
|
-
* reads that Storybook and Vite rely on.
|
|
568
|
-
*/
|
|
569
|
-
window.process = window.process || {
|
|
570
|
-
env: {},
|
|
571
|
-
platform: 'browser',
|
|
572
|
-
argv: [],
|
|
573
|
-
cwd: function () { return '/'; },
|
|
574
|
-
};
|
|
575
|
-
</script>
|
|
576
554
|
<style>
|
|
577
555
|
@font-face {
|
|
578
556
|
font-family: 'Aeonik';
|
|
@@ -637,9 +615,8 @@
|
|
|
637
615
|
}
|
|
638
616
|
|
|
639
617
|
</style>
|
|
640
|
-
<script type="module" crossorigin src="./assets/iframe-
|
|
618
|
+
<script type="module" crossorigin src="./assets/iframe-BNJP6ovU.js"></script>
|
|
641
619
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-PPVm8Dsz.js">
|
|
642
|
-
<link rel="stylesheet" crossorigin href="./assets/iframe-CWwoGI65.css">
|
|
643
620
|
</head>
|
|
644
621
|
|
|
645
622
|
<body>
|
package/dist/index.html
CHANGED
|
@@ -53,87 +53,37 @@
|
|
|
53
53
|
<link href="./sb-addons/themes-2/manager-bundle.js" rel="modulepreload" />
|
|
54
54
|
|
|
55
55
|
<link href="./sb-addons/a11y-3/manager-bundle.js" rel="modulepreload" />
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
font-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
font-family: 'Plus Jakarta Sans';
|
|
77
|
-
font-style: normal;
|
|
78
|
-
font-weight: 600;
|
|
79
|
-
src: url('./fonts/PlusJakartaSans-SemiBold.woff2') format('woff2');
|
|
80
|
-
font-display: swap;
|
|
81
|
-
}
|
|
82
|
-
@font-face {
|
|
83
|
-
font-family: 'Plus Jakarta Sans';
|
|
84
|
-
font-style: normal;
|
|
85
|
-
font-weight: 700;
|
|
86
|
-
src: url('./fonts/PlusJakartaSans-Bold.woff2') format('woff2');
|
|
87
|
-
font-display: swap;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/* Cre8-branded sidebar header */
|
|
91
|
-
.cre8-brand {
|
|
92
|
-
display: flex;
|
|
56
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
57
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
58
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@500&display=swap" rel="stylesheet" />
|
|
59
|
+
|
|
60
|
+
<style>
|
|
61
|
+
.header-title {
|
|
62
|
+
align-content: center !important;
|
|
63
|
+
border-radius: 0.1875rem;
|
|
64
|
+
bottom: -5px;
|
|
65
|
+
color: #061376 !important;
|
|
66
|
+
display: flex !important;
|
|
67
|
+
flex-direction: column;
|
|
68
|
+
font-family: 'Open Sans', 'Liberation Mono', Menlo, Courier, monospace;
|
|
69
|
+
font-size: 0.7rem;
|
|
70
|
+
left: 10px;
|
|
71
|
+
letter-spacing: 0px;
|
|
72
|
+
line-height: inherit;
|
|
73
|
+
padding: 3px;
|
|
74
|
+
position: relative !important;
|
|
75
|
+
text-align: center;
|
|
93
76
|
align-items: center;
|
|
94
|
-
gap: 8px;
|
|
95
|
-
font-family: 'Plus Jakarta Sans', sans-serif;
|
|
96
|
-
line-height: 1;
|
|
97
77
|
white-space: nowrap;
|
|
78
|
+
width: fit-content;
|
|
98
79
|
}
|
|
99
|
-
.cre8-brand .cre8-logo {
|
|
100
|
-
width: auto;
|
|
101
|
-
height: 22px;
|
|
102
|
-
display: block;
|
|
103
|
-
}
|
|
104
|
-
.cre8-brand .cre8-name {
|
|
105
|
-
font-size: 1.15rem;
|
|
106
|
-
font-weight: 800;
|
|
107
|
-
letter-spacing: -0.02em;
|
|
108
|
-
color: #0F172A;
|
|
109
|
-
}
|
|
110
|
-
.cre8-brand .cre8-sub {
|
|
111
|
-
font-size: 0.8rem;
|
|
112
|
-
font-weight: 500;
|
|
113
|
-
color: #64748B;
|
|
114
|
-
}
|
|
115
|
-
.cre8-brand .cre8-ver {
|
|
116
|
-
margin-left: 4px;
|
|
117
|
-
padding: 2px 8px;
|
|
118
|
-
font-size: 0.68rem;
|
|
119
|
-
font-weight: 600;
|
|
120
|
-
color: #3B82F6;
|
|
121
|
-
background: rgba(59, 130, 246, 0.1);
|
|
122
|
-
border: 1px solid rgba(59, 130, 246, 0.22);
|
|
123
|
-
border-radius: 999px;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
80
|
.sidebar-header img {
|
|
127
|
-
height:
|
|
128
|
-
max-width:
|
|
81
|
+
height: auto;
|
|
82
|
+
max-width: 175px;
|
|
83
|
+
min-width: 100px;
|
|
129
84
|
width: auto;
|
|
130
85
|
}
|
|
131
|
-
|
|
132
|
-
/* Brand gradient accent under the sidebar header */
|
|
133
|
-
.sidebar-header {
|
|
134
|
-
border-bottom: 2px solid transparent;
|
|
135
|
-
border-image: linear-gradient(90deg, #3B82F6, #EC4899) 1;
|
|
136
|
-
}
|
|
86
|
+
|
|
137
87
|
</style>
|
|
138
88
|
|
|
139
89
|
|
|
@@ -231,8 +181,6 @@
|
|
|
231
181
|
|
|
232
182
|
import './sb-addons/a11y-3/manager-bundle.js';
|
|
233
183
|
|
|
234
|
-
import './sb-addons/storybook-4/manager-bundle.js';
|
|
235
|
-
|
|
236
184
|
|
|
237
185
|
import './sb-manager/runtime.js';
|
|
238
186
|
</script>
|
package/dist/project.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"generatedAt":
|
|
1
|
+
{"generatedAt":1785074537125,"userSince":1748105051138,"hasCustomBabel":false,"hasCustomWebpack":false,"hasStaticDirs":true,"hasStorybookEslint":false,"refCount":0,"knownPackages":{"testPackages":{"@testing-library/jest-dom":"6.9.1","@testing-library/user-event":"^14.6.1","jest":"30.3.0"},"stylingPackages":{"postcss":"^8.5.6","sass":"^1.97.2"}},"hasRouterPackage":false,"packageManager":{"type":"pnpm","version":"8.11.0","agent":"pnpm","nodeLinker":""},"typescriptOptions":{"check":false},"preview":{"usesGlobals":true},"framework":{"name":"@storybook/web-components-vite","options":{}},"builder":"@storybook/builder-vite","renderer":"@storybook/web-components","portableStoriesFileCount":1,"applicationFileCount":7,"storybookVersion":"10.5.4","storybookVersionSpecifier":"^10.0.6","language":"typescript","storybookPackages":{"@storybook/addon-mcp":{},"@storybook/builder-vite":{"version":"10.5.4"},"@storybook/react":{"version":"10.5.4"},"@storybook/react-vite":{"version":"10.5.4"},"@storybook/web-components":{"version":"10.5.4"},"@storybook/web-components-vite":{"version":"10.5.4"},"@wc-toolkit/storybook-helpers":{"version":"10.5.1"},"storybook":{}},"addons":{"@storybook/addon-docs":{"version":"10.5.4"},"@storybook/addon-themes":{"version":"10.5.4"},"@storybook/addon-a11y":{"version":"10.5.4"}},"packageJsonType":"module"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../a2ui/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAc,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE9F,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,CAKxE;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../a2ui/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAc,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE9F,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,CAKxE;AA2GD,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,SAAM,GAAG,OAAO,CAAC,IAAI,IAAI,aAAa,CAkGjH"}
|
package/lib/a2ui/registry.js
CHANGED
|
@@ -87,6 +87,17 @@ function describeType(v) {
|
|
|
87
87
|
return 'array';
|
|
88
88
|
return typeof v;
|
|
89
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Native DOM events, bindable on any component.
|
|
92
|
+
*
|
|
93
|
+
* Read from the catalog's `x-native-events` rather than kept here, so there is
|
|
94
|
+
* one list rather than two that must be held equal. A component's `@fires` tags
|
|
95
|
+
* describe only what it dispatches itself, so these can never be derived from
|
|
96
|
+
* source — `click` on a button is legitimate and undocumentable.
|
|
97
|
+
*/
|
|
98
|
+
function nativeEvents(catalog) {
|
|
99
|
+
return new Set(catalog.schema['x-native-events'] ?? []);
|
|
100
|
+
}
|
|
90
101
|
export function validateSpec(spec, catalog, path = '$') {
|
|
91
102
|
if (!spec || typeof spec !== 'object') {
|
|
92
103
|
throw new Error(`${path}: spec must be an object`);
|
|
@@ -131,7 +142,24 @@ export function validateSpec(spec, catalog, path = '$') {
|
|
|
131
142
|
if (!s.events || typeof s.events !== 'object' || Array.isArray(s.events)) {
|
|
132
143
|
throw new Error(`${path}.events: must be an object`);
|
|
133
144
|
}
|
|
145
|
+
// Custom event *names* are checked against the catalog, the same way props
|
|
146
|
+
// and slots are. Previously only the binding shape was validated, so an
|
|
147
|
+
// invented event bound cleanly and then silently never fired — the worst
|
|
148
|
+
// failure mode available, since the UI renders and simply does nothing.
|
|
149
|
+
//
|
|
150
|
+
// Native DOM events are always allowed: `addEventListener` handles them on
|
|
151
|
+
// any element, and `@fires` documents only what a component dispatches
|
|
152
|
+
// itself. `click` on a button is legitimate and undocumented by design.
|
|
153
|
+
const declaredEvents = new Set(Object.keys(def['x-events'] ?? {}));
|
|
154
|
+
const native = nativeEvents(catalog);
|
|
134
155
|
for (const [evtName, binding] of Object.entries(s.events)) {
|
|
156
|
+
if (!native.has(evtName) && !declaredEvents.has(evtName)) {
|
|
157
|
+
const available = [...declaredEvents].sort().join(', ');
|
|
158
|
+
throw new Error(`${path}.events.${evtName}: not a declared event on ${s.component}. ` +
|
|
159
|
+
(available
|
|
160
|
+
? `Custom events available: ${available}`
|
|
161
|
+
: `${s.component} declares no custom events`));
|
|
162
|
+
}
|
|
135
163
|
if (typeof binding === 'string')
|
|
136
164
|
continue;
|
|
137
165
|
if (!binding || typeof binding !== 'object') {
|
package/lib/a2ui/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../a2ui/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CatalogSchema, ComponentSpec, PropSchema, RegisteredCatalog } from './types.js';\n\nexport function registerCatalog(schema: CatalogSchema): RegisteredCatalog {\n const defs = schema.$defs?.components ?? {};\n const components = new Map(Object.entries(defs));\n const id = schema['x-a2ui']?.catalogId ?? schema.$id ?? 'unknown';\n return { id, schema, components };\n}\n\nfunction validatePropValue(value: unknown, schema: PropSchema | undefined, path: string): void {\n if (value === undefined || value === null) return;\n if (!schema) return;\n\n if (schema.const !== undefined && value !== schema.const) {\n throw new Error(\n `${path}: expected const ${JSON.stringify(schema.const)}, got ${JSON.stringify(value)}`\n );\n }\n\n if (schema.enum && !schema.enum.includes(value as string)) {\n const allowed = schema.enum.map((v) => JSON.stringify(v)).join(', ');\n throw new Error(`${path}: value ${JSON.stringify(value)} not in enum [${allowed}]`);\n }\n\n if (schema.oneOf && schema.oneOf.length) {\n const errors: string[] = [];\n for (const branch of schema.oneOf) {\n try {\n validatePropValue(value, branch, path);\n return;\n } catch (e) {\n errors.push((e as Error).message);\n }\n }\n throw new Error(\n `${path}: value ${JSON.stringify(value)} matched none of oneOf branches: ${errors.join(' | ')}`\n );\n }\n\n const types = Array.isArray(schema.type) ? schema.type : schema.type ? [schema.type] : [];\n if (types.length && !types.some((t) => matchesType(t, value))) {\n throw new Error(`${path}: expected type ${types.join('|')}, got ${describeType(value)}`);\n }\n\n if (Array.isArray(value) && schema.items) {\n value.forEach((item, i) => validatePropValue(item, schema.items, `${path}[${i}]`));\n }\n\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n schema.properties\n ) {\n const obj = value as Record<string, unknown>;\n if (schema.required) {\n for (const req of schema.required) {\n if (!(req in obj)) {\n throw new Error(`${path}.${req}: required property missing`);\n }\n }\n }\n for (const [key, childVal] of Object.entries(obj)) {\n const childSchema = schema.properties[key];\n if (!childSchema) {\n if (schema.additionalProperties === false) {\n throw new Error(`${path}.${key}: unexpected property`);\n }\n continue;\n }\n validatePropValue(childVal, childSchema, `${path}.${key}`);\n }\n }\n}\n\nfunction matchesType(t: string, v: unknown): boolean {\n switch (t) {\n case 'string':\n return typeof v === 'string';\n case 'number':\n return typeof v === 'number' && Number.isFinite(v);\n case 'integer':\n return typeof v === 'number' && Number.isInteger(v);\n case 'boolean':\n return typeof v === 'boolean';\n case 'array':\n return Array.isArray(v);\n case 'object':\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n case 'null':\n return v === null;\n default:\n return true;\n }\n}\n\nfunction describeType(v: unknown): string {\n if (v === null) return 'null';\n if (Array.isArray(v)) return 'array';\n return typeof v;\n}\n\nexport function validateSpec(spec: unknown, catalog: RegisteredCatalog, path = '$'): asserts spec is ComponentSpec {\n if (!spec || typeof spec !== 'object') {\n throw new Error(`${path}: spec must be an object`);\n }\n const s = spec as Record<string, unknown>;\n if (typeof s.component !== 'string') {\n throw new Error(`${path}: spec.component must be a string`);\n }\n if (!catalog.components.has(s.component)) {\n throw new Error(\n `${path}: component \"${s.component}\" is not registered in catalog \"${catalog.id}\"`\n );\n }\n\n const def = catalog.components.get(s.component)!;\n const allowedProps = new Set(Object.keys(def.properties?.props?.properties ?? {}));\n const hasChildren = def.properties?.children !== undefined;\n const allowedSlots = def.properties?.slots\n ? new Set(Object.keys(def.properties.slots.properties ?? {}))\n : null;\n\n if (s.props) {\n if (typeof s.props !== 'object') throw new Error(`${path}.props: must be an object`);\n const propDefs = def.properties?.props?.properties ?? {};\n for (const [prop, value] of Object.entries(s.props as Record<string, unknown>)) {\n if (!allowedProps.has(prop)) {\n throw new Error(`${path}.props.${prop}: not a declared prop on ${s.component}`);\n }\n validatePropValue(value, propDefs[prop], `${path}.props.${prop}`);\n }\n }\n\n if (s.children !== undefined) {\n if (!hasChildren) {\n throw new Error(`${path}.children: ${s.component} does not accept default children`);\n }\n if (!Array.isArray(s.children)) throw new Error(`${path}.children: must be an array`);\n s.children.forEach((c, i) => {\n if (typeof c === 'string') return;\n validateSpec(c, catalog, `${path}.children[${i}]`);\n });\n }\n\n if (s.events !== undefined) {\n if (!s.events || typeof s.events !== 'object' || Array.isArray(s.events)) {\n throw new Error(`${path}.events: must be an object`);\n }\n for (const [evtName, binding] of Object.entries(s.events as Record<string, unknown>)) {\n if (typeof binding === 'string') continue;\n if (!binding || typeof binding !== 'object') {\n throw new Error(`${path}.events.${evtName}: must be a string or { handler } object`);\n }\n const b = binding as Record<string, unknown>;\n if (typeof b.handler !== 'string' || b.handler.length === 0) {\n throw new Error(`${path}.events.${evtName}.handler: must be a non-empty string`);\n }\n }\n }\n\n if (s.slots !== undefined) {\n if (!allowedSlots) {\n throw new Error(`${path}.slots: ${s.component} does not accept named slots`);\n }\n if (typeof s.slots !== 'object') throw new Error(`${path}.slots: must be an object`);\n for (const [slotName, arr] of Object.entries(s.slots as Record<string, unknown>)) {\n if (!allowedSlots.has(slotName)) {\n throw new Error(\n `${path}.slots.${slotName}: not a declared slot on ${s.component}`\n );\n }\n if (!Array.isArray(arr)) {\n throw new Error(`${path}.slots.${slotName}: must be an array`);\n }\n arr.forEach((c, i) => {\n if (typeof c === 'string') return;\n validateSpec(c, catalog, `${path}.slots.${slotName}[${i}]`);\n });\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../a2ui/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CatalogSchema, ComponentSpec, PropSchema, RegisteredCatalog } from './types.js';\n\nexport function registerCatalog(schema: CatalogSchema): RegisteredCatalog {\n const defs = schema.$defs?.components ?? {};\n const components = new Map(Object.entries(defs));\n const id = schema['x-a2ui']?.catalogId ?? schema.$id ?? 'unknown';\n return { id, schema, components };\n}\n\nfunction validatePropValue(value: unknown, schema: PropSchema | undefined, path: string): void {\n if (value === undefined || value === null) return;\n if (!schema) return;\n\n if (schema.const !== undefined && value !== schema.const) {\n throw new Error(\n `${path}: expected const ${JSON.stringify(schema.const)}, got ${JSON.stringify(value)}`\n );\n }\n\n if (schema.enum && !schema.enum.includes(value as string)) {\n const allowed = schema.enum.map((v) => JSON.stringify(v)).join(', ');\n throw new Error(`${path}: value ${JSON.stringify(value)} not in enum [${allowed}]`);\n }\n\n if (schema.oneOf && schema.oneOf.length) {\n const errors: string[] = [];\n for (const branch of schema.oneOf) {\n try {\n validatePropValue(value, branch, path);\n return;\n } catch (e) {\n errors.push((e as Error).message);\n }\n }\n throw new Error(\n `${path}: value ${JSON.stringify(value)} matched none of oneOf branches: ${errors.join(' | ')}`\n );\n }\n\n const types = Array.isArray(schema.type) ? schema.type : schema.type ? [schema.type] : [];\n if (types.length && !types.some((t) => matchesType(t, value))) {\n throw new Error(`${path}: expected type ${types.join('|')}, got ${describeType(value)}`);\n }\n\n if (Array.isArray(value) && schema.items) {\n value.forEach((item, i) => validatePropValue(item, schema.items, `${path}[${i}]`));\n }\n\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n schema.properties\n ) {\n const obj = value as Record<string, unknown>;\n if (schema.required) {\n for (const req of schema.required) {\n if (!(req in obj)) {\n throw new Error(`${path}.${req}: required property missing`);\n }\n }\n }\n for (const [key, childVal] of Object.entries(obj)) {\n const childSchema = schema.properties[key];\n if (!childSchema) {\n if (schema.additionalProperties === false) {\n throw new Error(`${path}.${key}: unexpected property`);\n }\n continue;\n }\n validatePropValue(childVal, childSchema, `${path}.${key}`);\n }\n }\n}\n\nfunction matchesType(t: string, v: unknown): boolean {\n switch (t) {\n case 'string':\n return typeof v === 'string';\n case 'number':\n return typeof v === 'number' && Number.isFinite(v);\n case 'integer':\n return typeof v === 'number' && Number.isInteger(v);\n case 'boolean':\n return typeof v === 'boolean';\n case 'array':\n return Array.isArray(v);\n case 'object':\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n case 'null':\n return v === null;\n default:\n return true;\n }\n}\n\nfunction describeType(v: unknown): string {\n if (v === null) return 'null';\n if (Array.isArray(v)) return 'array';\n return typeof v;\n}\n\n/**\n * Native DOM events, bindable on any component.\n *\n * Read from the catalog's `x-native-events` rather than kept here, so there is\n * one list rather than two that must be held equal. A component's `@fires` tags\n * describe only what it dispatches itself, so these can never be derived from\n * source — `click` on a button is legitimate and undocumentable.\n */\nfunction nativeEvents(catalog: RegisteredCatalog): Set<string> {\n return new Set(catalog.schema['x-native-events'] ?? []);\n}\n\nexport function validateSpec(spec: unknown, catalog: RegisteredCatalog, path = '$'): asserts spec is ComponentSpec {\n if (!spec || typeof spec !== 'object') {\n throw new Error(`${path}: spec must be an object`);\n }\n const s = spec as Record<string, unknown>;\n if (typeof s.component !== 'string') {\n throw new Error(`${path}: spec.component must be a string`);\n }\n if (!catalog.components.has(s.component)) {\n throw new Error(\n `${path}: component \"${s.component}\" is not registered in catalog \"${catalog.id}\"`\n );\n }\n\n const def = catalog.components.get(s.component)!;\n const allowedProps = new Set(Object.keys(def.properties?.props?.properties ?? {}));\n const hasChildren = def.properties?.children !== undefined;\n const allowedSlots = def.properties?.slots\n ? new Set(Object.keys(def.properties.slots.properties ?? {}))\n : null;\n\n if (s.props) {\n if (typeof s.props !== 'object') throw new Error(`${path}.props: must be an object`);\n const propDefs = def.properties?.props?.properties ?? {};\n for (const [prop, value] of Object.entries(s.props as Record<string, unknown>)) {\n if (!allowedProps.has(prop)) {\n throw new Error(`${path}.props.${prop}: not a declared prop on ${s.component}`);\n }\n validatePropValue(value, propDefs[prop], `${path}.props.${prop}`);\n }\n }\n\n if (s.children !== undefined) {\n if (!hasChildren) {\n throw new Error(`${path}.children: ${s.component} does not accept default children`);\n }\n if (!Array.isArray(s.children)) throw new Error(`${path}.children: must be an array`);\n s.children.forEach((c, i) => {\n if (typeof c === 'string') return;\n validateSpec(c, catalog, `${path}.children[${i}]`);\n });\n }\n\n if (s.events !== undefined) {\n if (!s.events || typeof s.events !== 'object' || Array.isArray(s.events)) {\n throw new Error(`${path}.events: must be an object`);\n }\n // Custom event *names* are checked against the catalog, the same way props\n // and slots are. Previously only the binding shape was validated, so an\n // invented event bound cleanly and then silently never fired — the worst\n // failure mode available, since the UI renders and simply does nothing.\n //\n // Native DOM events are always allowed: `addEventListener` handles them on\n // any element, and `@fires` documents only what a component dispatches\n // itself. `click` on a button is legitimate and undocumented by design.\n const declaredEvents = new Set(Object.keys(def['x-events'] ?? {}));\n const native = nativeEvents(catalog);\n for (const [evtName, binding] of Object.entries(s.events as Record<string, unknown>)) {\n if (!native.has(evtName) && !declaredEvents.has(evtName)) {\n const available = [...declaredEvents].sort().join(', ');\n throw new Error(\n `${path}.events.${evtName}: not a declared event on ${s.component}. ` +\n (available\n ? `Custom events available: ${available}`\n : `${s.component} declares no custom events`)\n );\n }\n if (typeof binding === 'string') continue;\n if (!binding || typeof binding !== 'object') {\n throw new Error(`${path}.events.${evtName}: must be a string or { handler } object`);\n }\n const b = binding as Record<string, unknown>;\n if (typeof b.handler !== 'string' || b.handler.length === 0) {\n throw new Error(`${path}.events.${evtName}.handler: must be a non-empty string`);\n }\n }\n }\n\n if (s.slots !== undefined) {\n if (!allowedSlots) {\n throw new Error(`${path}.slots: ${s.component} does not accept named slots`);\n }\n if (typeof s.slots !== 'object') throw new Error(`${path}.slots: must be an object`);\n for (const [slotName, arr] of Object.entries(s.slots as Record<string, unknown>)) {\n if (!allowedSlots.has(slotName)) {\n throw new Error(\n `${path}.slots.${slotName}: not a declared slot on ${s.component}`\n );\n }\n if (!Array.isArray(arr)) {\n throw new Error(`${path}.slots.${slotName}: must be an array`);\n }\n arr.forEach((c, i) => {\n if (typeof c === 'string') return;\n validateSpec(c, catalog, `${path}.slots.${slotName}[${i}]`);\n });\n }\n }\n}\n"]}
|
package/lib/a2ui/renderer.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import type { ComponentSpec, EmittedEvent, RegisteredCatalog } from './types.js';
|
|
1
|
+
import type { ComponentSpec, EmittedEvent, PropSchema, RegisteredCatalog } from './types.js';
|
|
2
2
|
export interface RenderOptions {
|
|
3
3
|
root?: HTMLElement;
|
|
4
4
|
doc?: Document;
|
|
5
5
|
onEvent?: (evt: EmittedEvent) => void;
|
|
6
6
|
}
|
|
7
7
|
export declare function render(spec: ComponentSpec, catalog: RegisteredCatalog, options?: RenderOptions): HTMLElement;
|
|
8
|
+
export declare function applyProp(el: HTMLElement, key: string, value: unknown, schema: PropSchema | undefined): void;
|
|
8
9
|
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../a2ui/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../a2ui/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EAEZ,UAAU,EACV,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,CAAC;CACvC;AAED,wBAAgB,MAAM,CACpB,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,aAAkB,GAC1B,WAAW,CAMb;AA8FD,wBAAgB,SAAS,CACvB,EAAE,EAAE,WAAW,EACf,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,UAAU,GAAG,SAAS,GAC7B,IAAI,CAyBN"}
|
package/lib/a2ui/renderer.js
CHANGED
|
@@ -76,7 +76,7 @@ function attachEvent(el, component, path, eventName, binding, onEvent) {
|
|
|
76
76
|
});
|
|
77
77
|
});
|
|
78
78
|
}
|
|
79
|
-
function applyProp(el, key, value, schema) {
|
|
79
|
+
export function applyProp(el, key, value, schema) {
|
|
80
80
|
if (value === undefined || value === null)
|
|
81
81
|
return;
|
|
82
82
|
if (schema?.['x-kind'] === 'property') {
|
package/lib/a2ui/renderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../a2ui/renderer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../a2ui/renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ComponentSpec,\n EmittedEvent,\n EventBinding,\n PropSchema,\n RegisteredCatalog,\n} from './types.js';\nimport { validateSpec } from './registry.js';\n\nexport interface RenderOptions {\n root?: HTMLElement;\n doc?: Document;\n onEvent?: (evt: EmittedEvent) => void;\n}\n\nexport function render(\n spec: ComponentSpec,\n catalog: RegisteredCatalog,\n options: RenderOptions = {}\n): HTMLElement {\n validateSpec(spec, catalog);\n const doc = options.doc ?? document;\n const el = buildElement(spec, catalog, doc, '$', options.onEvent);\n if (options.root) options.root.replaceChildren(el);\n return el;\n}\n\nfunction buildElement(\n spec: ComponentSpec,\n catalog: RegisteredCatalog,\n doc: Document,\n path: string,\n onEvent?: (evt: EmittedEvent) => void\n): HTMLElement {\n const def = catalog.components.get(spec.component)!;\n const propDefs = def.properties?.props?.properties ?? {};\n const el = doc.createElement(spec.component);\n\n if (spec.props) {\n for (const [key, value] of Object.entries(spec.props)) {\n applyProp(el, key, value, propDefs[key]);\n }\n }\n\n if (spec.events && onEvent) {\n for (const [evtName, binding] of Object.entries(spec.events)) {\n attachEvent(el, spec.component, path, evtName, binding, onEvent);\n }\n }\n\n if (spec.children) {\n spec.children.forEach((child, i) => {\n if (typeof child === 'string') {\n el.appendChild(doc.createTextNode(child));\n return;\n }\n el.appendChild(buildElement(child, catalog, doc, `${path}.children[${i}]`, onEvent));\n });\n }\n\n if (spec.slots) {\n for (const [slotName, children] of Object.entries(spec.slots)) {\n children.forEach((child, i) => {\n if (typeof child === 'string') {\n if (slotName === 'default') {\n el.appendChild(doc.createTextNode(child));\n } else {\n const wrap = doc.createElement('span');\n wrap.setAttribute('slot', slotName);\n wrap.textContent = child;\n el.appendChild(wrap);\n }\n return;\n }\n const childEl = buildElement(\n child,\n catalog,\n doc,\n `${path}.slots.${slotName}[${i}]`,\n onEvent\n );\n if (slotName !== 'default') childEl.setAttribute('slot', slotName);\n el.appendChild(childEl);\n });\n }\n }\n\n return el;\n}\n\nfunction attachEvent(\n el: HTMLElement,\n component: string,\n path: string,\n eventName: string,\n binding: EventBinding,\n onEvent: (evt: EmittedEvent) => void\n): void {\n const handler = typeof binding === 'string' ? binding : binding.handler;\n const stop = typeof binding === 'object' && binding.stopPropagation === true;\n const prevent = typeof binding === 'object' && binding.preventDefault === true;\n\n el.addEventListener(eventName, (nativeEvent) => {\n if (stop) nativeEvent.stopPropagation();\n if (prevent) nativeEvent.preventDefault();\n const detail = 'detail' in nativeEvent\n ? (nativeEvent as CustomEvent).detail\n : undefined;\n onEvent({\n component,\n path,\n event: eventName,\n handler,\n detail,\n nativeEvent,\n });\n });\n}\n\nexport function applyProp(\n el: HTMLElement,\n key: string,\n value: unknown,\n schema: PropSchema | undefined\n): void {\n if (value === undefined || value === null) return;\n\n if (schema?.['x-kind'] === 'property') {\n (el as unknown as Record<string, unknown>)[key] = value;\n return;\n }\n\n if (typeof value === 'boolean') {\n if (value) el.setAttribute(key, '');\n else el.removeAttribute(key);\n return;\n }\n\n if (Array.isArray(value) || (typeof value === 'object' && value !== null)) {\n (el as unknown as Record<string, unknown>)[key] = value;\n return;\n }\n\n if (schema && isComplexSchema(schema)) {\n (el as unknown as Record<string, unknown>)[key] = value;\n return;\n }\n\n el.setAttribute(key, String(value));\n}\n\nfunction isComplexSchema(schema: PropSchema): boolean {\n const t = schema.type;\n if (Array.isArray(t)) return t.some((x) => x === 'object' || x === 'array');\n return t === 'object' || t === 'array';\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn "here is the new tree" into the smallest set of patch ops that gets
|
|
3
|
+
* there.
|
|
4
|
+
*
|
|
5
|
+
* The op vocabulary is the right primitive, and it is the wrong interface for
|
|
6
|
+
* how models actually work: asked to change one label, a model regenerates the
|
|
7
|
+
* whole document. Without a diff, that costs a full remount — every element
|
|
8
|
+
* recreated, focus lost, scroll reset, animations restarted — which is exactly
|
|
9
|
+
* what streaming exists to avoid. With one, an agent gets incremental rendering
|
|
10
|
+
* without ever learning what `appendText` is.
|
|
11
|
+
*
|
|
12
|
+
* Node identity here is positional, matching the rest of the streaming layer.
|
|
13
|
+
* That means the diff is deliberately *not* a minimal edit script: it compares
|
|
14
|
+
* position by position and only appends or removes at the tail. Inserting at the
|
|
15
|
+
* head of a long list therefore rewrites the list rather than shifting it. A
|
|
16
|
+
* keyed diff would do better, but keys would have to come from somewhere, and
|
|
17
|
+
* the whole reason this dialect has no ids is that nothing has to invent them.
|
|
18
|
+
*/
|
|
19
|
+
import type { ComponentSpec } from '../types.js';
|
|
20
|
+
import type { PatchOp } from './types.js';
|
|
21
|
+
/**
|
|
22
|
+
* Ops that turn `prev` into `next`. Returns an empty array when they already
|
|
23
|
+
* match, so an agent can resend an unchanged tree for free.
|
|
24
|
+
*
|
|
25
|
+
* `null` for either side means "no surface root": the result is a single
|
|
26
|
+
* `replace`/`remove` at `$`, which the model handles as a root swap.
|
|
27
|
+
*/
|
|
28
|
+
export declare function diffSpecs(prev: ComponentSpec | null, next: ComponentSpec | null): PatchOp[];
|
|
29
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../a2ui/stream/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,YAAY,CAAC;AA6GzD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,EAAE,CAQ3F"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn "here is the new tree" into the smallest set of patch ops that gets
|
|
3
|
+
* there.
|
|
4
|
+
*
|
|
5
|
+
* The op vocabulary is the right primitive, and it is the wrong interface for
|
|
6
|
+
* how models actually work: asked to change one label, a model regenerates the
|
|
7
|
+
* whole document. Without a diff, that costs a full remount — every element
|
|
8
|
+
* recreated, focus lost, scroll reset, animations restarted — which is exactly
|
|
9
|
+
* what streaming exists to avoid. With one, an agent gets incremental rendering
|
|
10
|
+
* without ever learning what `appendText` is.
|
|
11
|
+
*
|
|
12
|
+
* Node identity here is positional, matching the rest of the streaming layer.
|
|
13
|
+
* That means the diff is deliberately *not* a minimal edit script: it compares
|
|
14
|
+
* position by position and only appends or removes at the tail. Inserting at the
|
|
15
|
+
* head of a long list therefore rewrites the list rather than shifting it. A
|
|
16
|
+
* keyed diff would do better, but keys would have to come from somewhere, and
|
|
17
|
+
* the whole reason this dialect has no ids is that nothing has to invent them.
|
|
18
|
+
*/
|
|
19
|
+
import { childPath } from './pointer.js';
|
|
20
|
+
function isSpec(node) {
|
|
21
|
+
return typeof node === 'object' && node !== null;
|
|
22
|
+
}
|
|
23
|
+
function sameShape(a, b) {
|
|
24
|
+
if (typeof a === 'string' || typeof b === 'string')
|
|
25
|
+
return typeof a === typeof b;
|
|
26
|
+
return isSpec(a) && isSpec(b) && a.component === b.component;
|
|
27
|
+
}
|
|
28
|
+
function equal(a, b) {
|
|
29
|
+
return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Props that changed, plus `null` for props that went away — the shape
|
|
33
|
+
* `setProps` already understands.
|
|
34
|
+
*/
|
|
35
|
+
function propDelta(prev = {}, next = {}) {
|
|
36
|
+
const delta = {};
|
|
37
|
+
for (const [key, value] of Object.entries(next)) {
|
|
38
|
+
if (!equal(prev[key], value))
|
|
39
|
+
delta[key] = value;
|
|
40
|
+
}
|
|
41
|
+
for (const key of Object.keys(prev)) {
|
|
42
|
+
if (!(key in next))
|
|
43
|
+
delta[key] = null;
|
|
44
|
+
}
|
|
45
|
+
return Object.keys(delta).length ? delta : null;
|
|
46
|
+
}
|
|
47
|
+
function contentLists(spec) {
|
|
48
|
+
const lists = new Map();
|
|
49
|
+
if (spec.children)
|
|
50
|
+
lists.set(null, spec.children);
|
|
51
|
+
for (const [slot, list] of Object.entries(spec.slots ?? {}))
|
|
52
|
+
lists.set(slot, list);
|
|
53
|
+
return lists;
|
|
54
|
+
}
|
|
55
|
+
function diffList(path, slot, prev, next, ops) {
|
|
56
|
+
const shared = Math.min(prev.length, next.length);
|
|
57
|
+
for (let i = 0; i < shared; i++) {
|
|
58
|
+
const before = prev[i];
|
|
59
|
+
const after = next[i];
|
|
60
|
+
const childAt = childPath(path, slot, i);
|
|
61
|
+
if (typeof after === 'string') {
|
|
62
|
+
// A text child that changed. setText replaces the whole list, so it is
|
|
63
|
+
// only safe when the text is the entire content.
|
|
64
|
+
if (before !== after) {
|
|
65
|
+
if (prev.length === 1 && next.length === 1) {
|
|
66
|
+
ops.push({ op: 'setText', path, slot, text: after });
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
ops.push({ op: 'replace', path: childAt, node: after });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (!sameShape(before, after)) {
|
|
75
|
+
ops.push({ op: 'replace', path: childAt, node: after });
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
diffNode(childAt, before, after, ops);
|
|
79
|
+
}
|
|
80
|
+
// Tail only: positional identity means anything else would renumber the
|
|
81
|
+
// siblings the caller is about to address.
|
|
82
|
+
if (next.length > prev.length) {
|
|
83
|
+
ops.push({ op: 'append', path, slot, nodes: next.slice(prev.length) });
|
|
84
|
+
}
|
|
85
|
+
else if (prev.length > next.length) {
|
|
86
|
+
for (let i = prev.length - 1; i >= next.length; i--) {
|
|
87
|
+
ops.push({ op: 'remove', path: childPath(path, slot, i) });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function diffNode(path, prev, next, ops) {
|
|
92
|
+
const props = propDelta(prev.props, next.props);
|
|
93
|
+
if (props)
|
|
94
|
+
ops.push({ op: 'setProps', path, props });
|
|
95
|
+
if (!equal(prev.events, next.events)) {
|
|
96
|
+
const events = { ...(next.events ?? {}) };
|
|
97
|
+
for (const name of Object.keys(prev.events ?? {})) {
|
|
98
|
+
if (!(name in (next.events ?? {})))
|
|
99
|
+
events[name] = null;
|
|
100
|
+
}
|
|
101
|
+
if (Object.keys(events).length)
|
|
102
|
+
ops.push({ op: 'setEvents', path, events });
|
|
103
|
+
}
|
|
104
|
+
const prevLists = contentLists(prev);
|
|
105
|
+
const nextLists = contentLists(next);
|
|
106
|
+
for (const [slot, nextList] of nextLists) {
|
|
107
|
+
diffList(path, slot, prevLists.get(slot) ?? [], nextList, ops);
|
|
108
|
+
}
|
|
109
|
+
for (const [slot] of prevLists) {
|
|
110
|
+
if (!nextLists.has(slot))
|
|
111
|
+
ops.push({ op: 'clear', path, slot });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Ops that turn `prev` into `next`. Returns an empty array when they already
|
|
116
|
+
* match, so an agent can resend an unchanged tree for free.
|
|
117
|
+
*
|
|
118
|
+
* `null` for either side means "no surface root": the result is a single
|
|
119
|
+
* `replace`/`remove` at `$`, which the model handles as a root swap.
|
|
120
|
+
*/
|
|
121
|
+
export function diffSpecs(prev, next) {
|
|
122
|
+
if (!next)
|
|
123
|
+
return prev ? [{ op: 'remove', path: '$' }] : [];
|
|
124
|
+
if (!prev || prev.component !== next.component) {
|
|
125
|
+
return [{ op: 'replace', path: '$', node: next }];
|
|
126
|
+
}
|
|
127
|
+
const ops = [];
|
|
128
|
+
diffNode('$', prev, next, ops);
|
|
129
|
+
return ops;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../a2ui/stream/diff.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Turn \"here is the new tree\" into the smallest set of patch ops that gets\n * there.\n *\n * The op vocabulary is the right primitive, and it is the wrong interface for\n * how models actually work: asked to change one label, a model regenerates the\n * whole document. Without a diff, that costs a full remount — every element\n * recreated, focus lost, scroll reset, animations restarted — which is exactly\n * what streaming exists to avoid. With one, an agent gets incremental rendering\n * without ever learning what `appendText` is.\n *\n * Node identity here is positional, matching the rest of the streaming layer.\n * That means the diff is deliberately *not* a minimal edit script: it compares\n * position by position and only appends or removes at the tail. Inserting at the\n * head of a long list therefore rewrites the list rather than shifting it. A\n * keyed diff would do better, but keys would have to come from somewhere, and\n * the whole reason this dialect has no ids is that nothing has to invent them.\n */\n\nimport type { ComponentSpec, SpecChild } from '../types.js';\nimport type { ContentTarget, PatchOp } from './types.js';\nimport { childPath } from './pointer.js';\n\nfunction isSpec(node: SpecChild | undefined): node is ComponentSpec {\n return typeof node === 'object' && node !== null;\n}\n\nfunction sameShape(a: SpecChild | undefined, b: SpecChild | undefined): boolean {\n if (typeof a === 'string' || typeof b === 'string') return typeof a === typeof b;\n return isSpec(a) && isSpec(b) && a.component === b.component;\n}\n\nfunction equal(a: unknown, b: unknown): boolean {\n return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);\n}\n\n/**\n * Props that changed, plus `null` for props that went away — the shape\n * `setProps` already understands.\n */\nfunction propDelta(\n prev: Record<string, unknown> = {},\n next: Record<string, unknown> = {}\n): Record<string, unknown> | null {\n const delta: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(next)) {\n if (!equal(prev[key], value)) delta[key] = value;\n }\n for (const key of Object.keys(prev)) {\n if (!(key in next)) delta[key] = null;\n }\n return Object.keys(delta).length ? delta : null;\n}\n\nfunction contentLists(spec: ComponentSpec): Map<ContentTarget, SpecChild[]> {\n const lists = new Map<ContentTarget, SpecChild[]>();\n if (spec.children) lists.set(null, spec.children);\n for (const [slot, list] of Object.entries(spec.slots ?? {})) lists.set(slot, list);\n return lists;\n}\n\nfunction diffList(\n path: string,\n slot: ContentTarget,\n prev: SpecChild[],\n next: SpecChild[],\n ops: PatchOp[]\n): void {\n const shared = Math.min(prev.length, next.length);\n\n for (let i = 0; i < shared; i++) {\n const before = prev[i];\n const after = next[i];\n const childAt = childPath(path, slot, i);\n\n if (typeof after === 'string') {\n // A text child that changed. setText replaces the whole list, so it is\n // only safe when the text is the entire content.\n if (before !== after) {\n if (prev.length === 1 && next.length === 1) {\n ops.push({ op: 'setText', path, slot, text: after });\n } else {\n ops.push({ op: 'replace', path: childAt, node: after });\n }\n }\n continue;\n }\n\n if (!sameShape(before, after)) {\n ops.push({ op: 'replace', path: childAt, node: after });\n continue;\n }\n diffNode(childAt, before as ComponentSpec, after, ops);\n }\n\n // Tail only: positional identity means anything else would renumber the\n // siblings the caller is about to address.\n if (next.length > prev.length) {\n ops.push({ op: 'append', path, slot, nodes: next.slice(prev.length) });\n } else if (prev.length > next.length) {\n for (let i = prev.length - 1; i >= next.length; i--) {\n ops.push({ op: 'remove', path: childPath(path, slot, i) });\n }\n }\n}\n\nfunction diffNode(path: string, prev: ComponentSpec, next: ComponentSpec, ops: PatchOp[]): void {\n const props = propDelta(prev.props, next.props);\n if (props) ops.push({ op: 'setProps', path, props });\n\n if (!equal(prev.events, next.events)) {\n const events: Record<string, unknown> = { ...(next.events ?? {}) };\n for (const name of Object.keys(prev.events ?? {})) {\n if (!(name in (next.events ?? {}))) events[name] = null;\n }\n if (Object.keys(events).length) ops.push({ op: 'setEvents', path, events });\n }\n\n const prevLists = contentLists(prev);\n const nextLists = contentLists(next);\n\n for (const [slot, nextList] of nextLists) {\n diffList(path, slot, prevLists.get(slot) ?? [], nextList, ops);\n }\n for (const [slot] of prevLists) {\n if (!nextLists.has(slot)) ops.push({ op: 'clear', path, slot });\n }\n}\n\n/**\n * Ops that turn `prev` into `next`. Returns an empty array when they already\n * match, so an agent can resend an unchanged tree for free.\n *\n * `null` for either side means \"no surface root\": the result is a single\n * `replace`/`remove` at `$`, which the model handles as a root swap.\n */\nexport function diffSpecs(prev: ComponentSpec | null, next: ComponentSpec | null): PatchOp[] {\n if (!next) return prev ? [{ op: 'remove', path: '$' }] : [];\n if (!prev || prev.component !== next.component) {\n return [{ op: 'replace', path: '$', node: next }];\n }\n const ops: PatchOp[] = [];\n diffNode('$', prev, next, ops);\n return ops;\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2UI streaming surfaces for cre8.
|
|
3
|
+
*
|
|
4
|
+
* `SurfaceModel` is DOM-free and runs anywhere; `SurfaceRenderer` mirrors it
|
|
5
|
+
* into the browser. See `docs/kb/08-streaming-ui.md`.
|
|
6
|
+
*/
|
|
7
|
+
export { A2UI_STREAM_VERSION, isBindingRef, type BindingRef, type ContentTarget, type DataPatch, type JsonPointer, type PatchOp, type SurfaceChange, type SurfaceEventMessage, type SurfaceMessage, type SurfaceState, } from './types.js';
|
|
8
|
+
export { SurfaceModel, SurfaceSeqGapError, resolveNode, type ApplyResult, type SurfaceModelOptions, } from './model.js';
|
|
9
|
+
export { SurfaceRenderer, findPath, type SurfaceRendererOptions } from './renderer.js';
|
|
10
|
+
export { diffSpecs } from './diff.js';
|
|
11
|
+
export { childPath, formatPath, parsePath, parsePointer, pointerGet, pointerRemove, pointerSet, type PathSegment, } from './pointer.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../a2ui/stream/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAEvF,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACV,aAAa,EACb,UAAU,EACV,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2UI streaming surfaces for cre8.
|
|
3
|
+
*
|
|
4
|
+
* `SurfaceModel` is DOM-free and runs anywhere; `SurfaceRenderer` mirrors it
|
|
5
|
+
* into the browser. See `docs/kb/08-streaming-ui.md`.
|
|
6
|
+
*/
|
|
7
|
+
export { A2UI_STREAM_VERSION, isBindingRef, } from './types.js';
|
|
8
|
+
export { SurfaceModel, SurfaceSeqGapError, resolveNode, } from './model.js';
|
|
9
|
+
export { SurfaceRenderer, findPath } from './renderer.js';
|
|
10
|
+
export { diffSpecs } from './diff.js';
|
|
11
|
+
export { childPath, formatPath, parsePath, parsePointer, pointerGet, pointerRemove, pointerSet, } from './pointer.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../a2ui/stream/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,mBAAmB,EACnB,YAAY,GAUb,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,WAAW,GAGZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,QAAQ,EAA+B,MAAM,eAAe,CAAC;AAEvF,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACV,aAAa,EACb,UAAU,GAEX,MAAM,cAAc,CAAC","sourcesContent":["/**\n * A2UI streaming surfaces for cre8.\n *\n * `SurfaceModel` is DOM-free and runs anywhere; `SurfaceRenderer` mirrors it\n * into the browser. See `docs/kb/08-streaming-ui.md`.\n */\n\nexport {\n A2UI_STREAM_VERSION,\n isBindingRef,\n type BindingRef,\n type ContentTarget,\n type DataPatch,\n type JsonPointer,\n type PatchOp,\n type SurfaceChange,\n type SurfaceEventMessage,\n type SurfaceMessage,\n type SurfaceState,\n} from './types.js';\n\nexport {\n SurfaceModel,\n SurfaceSeqGapError,\n resolveNode,\n type ApplyResult,\n type SurfaceModelOptions,\n} from './model.js';\n\nexport { SurfaceRenderer, findPath, type SurfaceRendererOptions } from './renderer.js';\n\nexport { diffSpecs } from './diff.js';\n\nexport {\n childPath,\n formatPath,\n parsePath,\n parsePointer,\n pointerGet,\n pointerRemove,\n pointerSet,\n type PathSegment,\n} from './pointer.js';\n"]}
|