@apollion-dsi/core 4.1.0 → 4.3.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/CHANGELOG.md +1357 -0
- package/README.md +1 -24
- package/lib/chunks/{chunk-V2FPYZTP.esm.js → chunk-2KJKXHNI.esm.js} +1 -1
- package/lib/chunks/chunk-2SHYFDQJ.esm.js +1 -0
- package/lib/chunks/{chunk-TOYBV66A.esm.js → chunk-2SPVSCZD.esm.js} +1 -1
- package/lib/chunks/chunk-2UZJN6MC.esm.js +1 -0
- package/lib/chunks/chunk-2XDK6NU7.esm.js +1 -0
- package/lib/chunks/{chunk-Q44UHGO6.esm.js → chunk-2YY7A36W.esm.js} +1 -1
- package/lib/chunks/chunk-36DSWGPF.esm.js +1 -0
- package/lib/chunks/{chunk-4HE643OX.esm.js → chunk-3DBECAG6.esm.js} +1 -1
- package/lib/chunks/chunk-3EOSES4S.esm.js +1 -0
- package/lib/chunks/chunk-3GNAZ6RE.esm.js +1 -0
- package/lib/chunks/{chunk-U4ODIBWG.esm.js → chunk-3MTWHDSL.esm.js} +1 -1
- package/lib/chunks/{chunk-A4BXGJYW.esm.js → chunk-3ODQCN3J.esm.js} +1 -1
- package/lib/chunks/chunk-3XA4AMQO.esm.js +1 -0
- package/lib/chunks/chunk-3XYKHZQ7.esm.js +1 -0
- package/lib/chunks/chunk-45A4O6KJ.esm.js +1 -0
- package/lib/chunks/chunk-4CULNDXB.esm.js +1 -0
- package/lib/chunks/chunk-4KIBOLH7.esm.js +1 -0
- package/lib/chunks/{chunk-W663AGNE.esm.js → chunk-4MBWRDIJ.esm.js} +1 -1
- package/lib/chunks/chunk-4QTXOCPV.esm.js +1 -0
- package/lib/chunks/chunk-4U3WQPBJ.esm.js +1 -0
- package/lib/chunks/chunk-4YCPDIRM.esm.js +1 -0
- package/lib/chunks/chunk-54QUAVTF.esm.js +1 -0
- package/lib/chunks/chunk-54SSYOYD.esm.js +3 -0
- package/lib/chunks/{chunk-4HGSFSHL.esm.js → chunk-5JVXGQDO.esm.js} +1 -1
- package/lib/chunks/chunk-5LDDQB4W.esm.js +39 -0
- package/lib/chunks/chunk-5MYNYSMN.esm.js +1 -0
- package/lib/chunks/chunk-5NJB5W4I.esm.js +5 -0
- package/lib/chunks/{chunk-VVZ6FCG7.esm.js → chunk-5Q45UZUL.esm.js} +1 -1
- package/lib/chunks/chunk-5REIPBPG.esm.js +1 -0
- package/lib/chunks/chunk-64KQOQC4.esm.js +1 -0
- package/lib/chunks/chunk-6G72BOTI.esm.js +1 -0
- package/lib/chunks/chunk-6JRXJ7MG.esm.js +1 -0
- package/lib/chunks/chunk-6NL46PCZ.esm.js +1 -0
- package/lib/chunks/chunk-6R7YWF2Z.esm.js +1 -0
- package/lib/chunks/{chunk-H4CYNDAM.esm.js → chunk-6RBZVDRP.esm.js} +1 -1
- package/lib/chunks/chunk-6RPTXDUB.esm.js +1 -0
- package/lib/chunks/chunk-6SZWWC4Q.esm.js +1 -0
- package/lib/chunks/chunk-6TWTLAW6.esm.js +1 -0
- package/lib/chunks/chunk-7LP5XKKC.esm.js +1 -0
- package/lib/chunks/chunk-7OVK4XCS.esm.js +1 -0
- package/lib/chunks/{chunk-H6RGCTRX.esm.js → chunk-7UIH7PNC.esm.js} +1 -1
- package/lib/chunks/chunk-7UZDT7GB.esm.js +1 -0
- package/lib/chunks/{chunk-HSNUZR7V.esm.js → chunk-7XEMCDIL.esm.js} +1 -1
- package/lib/chunks/{chunk-OFLB4VL6.esm.js → chunk-A2YKZFIC.esm.js} +1 -1
- package/lib/chunks/chunk-A7O6RO5P.esm.js +1 -0
- package/lib/chunks/chunk-AAZAZG7P.esm.js +1 -0
- package/lib/chunks/{chunk-NYWQDBFO.esm.js → chunk-AEQRNR7W.esm.js} +1 -1
- package/lib/chunks/chunk-AN3NCXEO.esm.js +1 -0
- package/lib/chunks/{chunk-ZRIEVBTB.esm.js → chunk-AUYB77M7.esm.js} +1 -1
- package/lib/chunks/chunk-AVZENFPL.esm.js +1 -0
- package/lib/chunks/chunk-AZBWA3B4.esm.js +1 -0
- package/lib/chunks/chunk-B7OYYZKE.esm.js +1 -0
- package/lib/chunks/chunk-BHNSYSNP.esm.js +1 -0
- package/lib/chunks/chunk-BMUHQ5OQ.esm.js +1 -0
- package/lib/chunks/chunk-BRASYKXY.esm.js +1 -0
- package/lib/chunks/chunk-BT6SPTZZ.esm.js +1 -0
- package/lib/chunks/chunk-BVDH4EAW.esm.js +1 -0
- package/lib/chunks/chunk-C3Q2NI5Y.esm.js +1 -0
- package/lib/chunks/chunk-CI3LQ5Z4.esm.js +1 -0
- package/lib/chunks/chunk-CK44WPHP.esm.js +1 -0
- package/lib/chunks/chunk-COECHEDM.esm.js +1 -0
- package/lib/chunks/chunk-CVGYBYMT.esm.js +1 -0
- package/lib/chunks/chunk-CYURSPLT.esm.js +1 -0
- package/lib/chunks/chunk-DHT35FQI.esm.js +1 -0
- package/lib/chunks/chunk-DLSSYVEF.esm.js +1 -0
- package/lib/chunks/chunk-DNHRB3DD.esm.js +1 -0
- package/lib/chunks/chunk-DOTMXDHA.esm.js +1 -0
- package/lib/chunks/chunk-DX5SUG7X.esm.js +1 -0
- package/lib/chunks/chunk-E7BQGRVC.esm.js +1 -0
- package/lib/chunks/chunk-ECG53OTX.esm.js +1 -0
- package/lib/chunks/chunk-EET35TCO.esm.js +1 -0
- package/lib/chunks/chunk-F4EQMQVX.esm.js +1 -0
- package/lib/chunks/{chunk-JD7UXJES.esm.js → chunk-F4W6VVDR.esm.js} +1 -1
- package/lib/chunks/chunk-F6G4T4BC.esm.js +1 -0
- package/lib/chunks/chunk-FJYSLGUG.esm.js +1 -0
- package/lib/chunks/chunk-FU2BNX4H.esm.js +1 -0
- package/lib/chunks/chunk-G5Z7USXC.esm.js +1 -0
- package/lib/chunks/chunk-GFWFGNY2.esm.js +1 -0
- package/lib/chunks/chunk-GHDTMBCC.esm.js +1 -0
- package/lib/chunks/{chunk-FPQOBUTR.esm.js → chunk-GK6CPN6F.esm.js} +1 -1
- package/lib/chunks/chunk-GU2BMTY3.esm.js +1 -0
- package/lib/chunks/chunk-H3I27KWU.esm.js +1 -0
- package/lib/chunks/chunk-H6SPQGDR.esm.js +1 -0
- package/lib/chunks/chunk-H7A2HNAK.esm.js +1 -0
- package/lib/chunks/chunk-HALV3U5Q.esm.js +1 -0
- package/lib/chunks/chunk-HBNFXZF6.esm.js +1 -0
- package/lib/chunks/chunk-HGISQ7M2.esm.js +1 -0
- package/lib/chunks/chunk-HMF62LQQ.esm.js +34 -0
- package/lib/chunks/chunk-HVWC77NL.esm.js +1 -0
- package/lib/chunks/chunk-HYYPCRHW.esm.js +1 -0
- package/lib/chunks/chunk-HZN744T5.esm.js +11 -0
- package/lib/chunks/chunk-I3GVQWLB.esm.js +1 -0
- package/lib/chunks/chunk-I4U5XMHR.esm.js +34 -0
- package/lib/chunks/chunk-I7ZFKBFU.esm.js +1 -0
- package/lib/chunks/chunk-IKTV35RB.esm.js +1 -0
- package/lib/chunks/chunk-IWA4TZOX.esm.js +1 -0
- package/lib/chunks/chunk-JA3DGZX4.esm.js +1 -0
- package/lib/chunks/chunk-JCTTBIBO.esm.js +3 -0
- package/lib/chunks/chunk-JFUYVECK.esm.js +1 -0
- package/lib/chunks/chunk-JH5RXKZ2.esm.js +1 -0
- package/lib/chunks/chunk-JHHNSZJ4.esm.js +1 -0
- package/lib/chunks/chunk-JI7MAUMF.esm.js +1 -0
- package/lib/chunks/chunk-JQBQ6X4L.esm.js +1 -0
- package/lib/chunks/chunk-JR7YIS3H.esm.js +1 -0
- package/lib/chunks/chunk-JSUB6SAI.esm.js +1 -0
- package/lib/chunks/chunk-JXUDEW5J.esm.js +1 -0
- package/lib/chunks/chunk-JYC747DK.esm.js +1 -0
- package/lib/chunks/chunk-JYJB3XFZ.esm.js +1 -0
- package/lib/chunks/chunk-JZ2GRYKU.esm.js +1 -0
- package/lib/chunks/chunk-K4OTLUX6.esm.js +1 -0
- package/lib/chunks/chunk-K7LQ6B4H.esm.js +1 -0
- package/lib/chunks/chunk-KBGPPCMN.esm.js +1 -0
- package/lib/chunks/chunk-KFZOV7RP.esm.js +1 -0
- package/lib/chunks/chunk-KLZX757F.esm.js +1 -0
- package/lib/chunks/chunk-KRF3FMDH.esm.js +1 -0
- package/lib/chunks/chunk-KUDPW647.esm.js +1 -0
- package/lib/chunks/chunk-KVDN4KYZ.esm.js +1 -0
- package/lib/chunks/chunk-KVKG7TA6.esm.js +1 -0
- package/lib/chunks/{chunk-C7NZ4MPY.esm.js → chunk-KWNMOR3V.esm.js} +1 -1
- package/lib/chunks/chunk-KY47BE3L.esm.js +11 -0
- package/lib/chunks/chunk-L5HTMWK3.esm.js +34 -0
- package/lib/chunks/chunk-LBA2JW7I.esm.js +1 -0
- package/lib/chunks/chunk-LF7E7QNQ.esm.js +39 -0
- package/lib/chunks/chunk-LJB6XGSJ.esm.js +1 -0
- package/lib/chunks/chunk-LJBLVEW3.esm.js +1 -0
- package/lib/chunks/chunk-LL6B4Q4R.esm.js +1 -0
- package/lib/chunks/chunk-LNZUAANS.esm.js +1 -0
- package/lib/chunks/chunk-LQLFJFW5.esm.js +1 -0
- package/lib/chunks/chunk-LVZPZN7J.esm.js +1 -0
- package/lib/chunks/chunk-M3FW2CUQ.esm.js +1 -0
- package/lib/chunks/chunk-M42E74U7.esm.js +7 -0
- package/lib/chunks/chunk-M4RSCRNV.esm.js +1 -0
- package/lib/chunks/chunk-MELVMDJS.esm.js +1 -0
- package/lib/chunks/chunk-MOVHB5R6.esm.js +1 -0
- package/lib/chunks/chunk-MQ6O5OZV.esm.js +1 -0
- package/lib/chunks/chunk-MRYAZXVW.esm.js +1 -0
- package/lib/chunks/chunk-MSYUZESJ.esm.js +1 -0
- package/lib/chunks/chunk-MWA2LY4C.esm.js +1 -0
- package/lib/chunks/chunk-NCDS76KS.esm.js +34 -0
- package/lib/chunks/{chunk-EKTJ3A6R.esm.js → chunk-NDIYF5SX.esm.js} +1 -1
- package/lib/chunks/chunk-NEZEK6DI.esm.js +1 -0
- package/lib/chunks/chunk-NFH2KYS6.esm.js +39 -0
- package/lib/chunks/chunk-NKAD33SH.esm.js +7 -0
- package/lib/chunks/chunk-NNMANTYE.esm.js +1 -0
- package/lib/chunks/chunk-NRVKDR2H.esm.js +1 -0
- package/lib/chunks/chunk-NVFKTKHY.esm.js +1 -0
- package/lib/chunks/chunk-NWFODMOU.esm.js +1 -0
- package/lib/chunks/chunk-NZ7IRFNC.esm.js +3 -0
- package/lib/chunks/chunk-NZXX3OP5.esm.js +1 -0
- package/lib/chunks/chunk-O4SSOOVR.esm.js +1 -0
- package/lib/chunks/chunk-ODLNO4ZY.esm.js +1 -0
- package/lib/chunks/chunk-OFRYNRTE.esm.js +1 -0
- package/lib/chunks/chunk-OJ57H6MJ.esm.js +1 -0
- package/lib/chunks/chunk-OLURMBK7.esm.js +1 -0
- package/lib/chunks/chunk-ON4INUFW.esm.js +7 -0
- package/lib/chunks/chunk-OT6DKXSK.esm.js +1 -0
- package/lib/chunks/chunk-OURRSDSK.esm.js +1 -0
- package/lib/chunks/chunk-P2GR72UO.esm.js +3 -0
- package/lib/chunks/chunk-PBY237H5.esm.js +1 -0
- package/lib/chunks/chunk-PDLC7ADP.esm.js +1 -0
- package/lib/chunks/chunk-PLD34GGH.esm.js +1 -0
- package/lib/chunks/chunk-PLNB3X4T.esm.js +1 -0
- package/lib/chunks/chunk-PU64MH2S.esm.js +1 -0
- package/lib/chunks/chunk-QERJQEN4.esm.js +1 -0
- package/lib/chunks/chunk-QHTVTYNN.esm.js +1 -0
- package/lib/chunks/chunk-QNM5SXM3.esm.js +1 -0
- package/lib/chunks/chunk-QNPYZUVO.esm.js +1 -0
- package/lib/chunks/chunk-QS6Q6GHV.esm.js +11 -0
- package/lib/chunks/chunk-R2GYRTGM.esm.js +1 -0
- package/lib/chunks/{chunk-FKAOGMRM.esm.js → chunk-R4QAAHWP.esm.js} +1 -1
- package/lib/chunks/chunk-R5SPL4S3.esm.js +1 -0
- package/lib/chunks/chunk-RHUIIG22.esm.js +1 -0
- package/lib/chunks/chunk-RKDE2LI7.esm.js +1 -0
- package/lib/chunks/chunk-RPBY7HBP.esm.js +1 -0
- package/lib/chunks/chunk-RY7RJOZL.esm.js +1 -0
- package/lib/chunks/chunk-S2U4FRYY.esm.js +1 -0
- package/lib/chunks/chunk-SB25H273.esm.js +1 -0
- package/lib/chunks/chunk-SBYW6WBS.esm.js +1 -0
- package/lib/chunks/chunk-SK2A2ORL.esm.js +1 -0
- package/lib/chunks/chunk-SKGADW2H.esm.js +1 -0
- package/lib/chunks/chunk-SWQTC4EJ.esm.js +1 -0
- package/lib/chunks/chunk-T3WYK7NJ.esm.js +1 -0
- package/lib/chunks/chunk-T5V5Q4OQ.esm.js +1 -0
- package/lib/chunks/chunk-T72PRHJO.esm.js +5 -0
- package/lib/chunks/chunk-TLVEHSRT.esm.js +1 -0
- package/lib/chunks/chunk-TXM2WOJQ.esm.js +11 -0
- package/lib/chunks/chunk-U5ZZXNQW.esm.js +1 -0
- package/lib/chunks/chunk-UCG2YEOT.esm.js +1 -0
- package/lib/chunks/{chunk-KFFUMDHD.esm.js → chunk-UI6CJPP3.esm.js} +1 -1
- package/lib/chunks/chunk-UZ7XKTKF.esm.js +26 -0
- package/lib/chunks/chunk-V3ULKCWJ.esm.js +1 -0
- package/lib/chunks/chunk-VASGJ75E.esm.js +5 -0
- package/lib/chunks/chunk-VCZTIJKQ.esm.js +1 -0
- package/lib/chunks/chunk-VM7X3PSR.esm.js +1 -0
- package/lib/chunks/chunk-VU67Q7IC.esm.js +1 -0
- package/lib/chunks/chunk-VUNN4DHK.esm.js +1 -0
- package/lib/chunks/chunk-VV4MXKUA.esm.js +1 -0
- package/lib/chunks/chunk-W7YMNIET.esm.js +1 -0
- package/lib/chunks/chunk-WAQEMQ3B.esm.js +1 -0
- package/lib/chunks/chunk-WBATNNAP.esm.js +26 -0
- package/lib/chunks/chunk-WHBPGXIC.esm.js +1 -0
- package/lib/chunks/chunk-WM2CMDXP.esm.js +1 -0
- package/lib/chunks/chunk-WOALLU3S.esm.js +39 -0
- package/lib/chunks/chunk-WOU7QPMN.esm.js +1 -0
- package/lib/chunks/chunk-WOZVCKNG.esm.js +1 -0
- package/lib/chunks/chunk-WU7I2JQ5.esm.js +1 -0
- package/lib/chunks/chunk-WWQY2YDB.esm.js +1 -0
- package/lib/chunks/chunk-WWZ35IZM.esm.js +1 -0
- package/lib/chunks/{chunk-OEH5ARPF.esm.js → chunk-WXS2V6GM.esm.js} +1 -1
- package/lib/chunks/chunk-X2LHYMPI.esm.js +1 -0
- package/lib/chunks/chunk-X3NMNOPQ.esm.js +1 -0
- package/lib/chunks/chunk-XEUQ2ZZ7.esm.js +1 -0
- package/lib/chunks/{chunk-44EW3LMK.esm.js → chunk-XJ7EBVG3.esm.js} +1 -1
- package/lib/chunks/chunk-XMBJFIWC.esm.js +1 -0
- package/lib/chunks/chunk-XNGGM6D6.esm.js +1 -0
- package/lib/chunks/chunk-XQFKZ32H.esm.js +5 -0
- package/lib/chunks/chunk-XSVOUWBC.esm.js +1 -0
- package/lib/chunks/chunk-Y23HEGMY.esm.js +1 -0
- package/lib/chunks/chunk-Y36YHL7V.esm.js +1 -0
- package/lib/chunks/chunk-YD3Z2NRS.esm.js +1 -0
- package/lib/chunks/chunk-YHC57GR4.esm.js +1 -0
- package/lib/chunks/chunk-YHU6QYT4.esm.js +1 -0
- package/lib/chunks/chunk-YLANWXT5.esm.js +1 -0
- package/lib/chunks/chunk-YRGWNW2J.esm.js +1 -0
- package/lib/chunks/chunk-YYXB4LM2.esm.js +1 -0
- package/lib/chunks/{chunk-4RPR6CZT.esm.js → chunk-ZLZK7X6F.esm.js} +1 -1
- package/lib/chunks/chunk-ZMINZ3YX.esm.js +1 -0
- package/lib/chunks/chunk-ZOKGGTX5.esm.js +1 -0
- package/lib/chunks/chunk-ZQDA6U5L.esm.js +1 -0
- package/lib/chunks/chunk-ZWHJNG4B.esm.js +26 -0
- package/lib/containers/Base/Base.style.d.ts +2 -2
- package/lib/containers/Base/index.esm.js +1 -1
- package/lib/containers/Card/index.esm.js +1 -1
- package/lib/containers/Content/index.esm.js +1 -1
- package/lib/containers/Flex/Flex.style.d.ts +2 -2
- package/lib/containers/Flex/index.esm.js +1 -1
- package/lib/containers/Grid/index.esm.js +1 -1
- package/lib/containers/Notification/Notification.style.d.ts +16 -16
- package/lib/containers/Notification/index.esm.js +1 -1
- package/lib/containers/Paper/index.esm.js +1 -1
- package/lib/containers/Scroll/Scroll.interface.d.ts +11 -1
- package/lib/containers/Scroll/index.esm.js +1 -1
- package/lib/containers/index.esm.js +1 -1
- package/lib/dataDisplay/DataTable/DataTable.filters.d.ts +1 -1
- package/lib/dataDisplay/DataTable/DataTable.helpers.d.ts +11 -4
- package/lib/dataDisplay/DataTable/index.esm.js +1 -1
- package/lib/dataDisplay/DescriptionList/index.esm.js +1 -1
- package/lib/dataDisplay/Table/Table/index.esm.js +1 -1
- package/lib/dataDisplay/Table/TableBody/index.esm.js +1 -1
- package/lib/dataDisplay/Table/TableCell/index.esm.js +1 -1
- package/lib/dataDisplay/Table/TableCheckboxCell/index.esm.js +1 -1
- package/lib/dataDisplay/Table/TableEmpty/index.esm.js +1 -1
- package/lib/dataDisplay/Table/TableFooter/index.esm.js +1 -1
- package/lib/dataDisplay/Table/TableHeader/index.esm.js +1 -1
- package/lib/dataDisplay/Table/TableHeaderCell/index.esm.js +1 -1
- package/lib/dataDisplay/Table/TableHeaderCheckboxCell/index.esm.js +1 -1
- package/lib/dataDisplay/Table/TablePagination/index.esm.js +1 -1
- package/lib/dataDisplay/Table/TableRow/index.esm.js +1 -1
- package/lib/dataDisplay/Table/index.esm.js +1 -1
- package/lib/dataDisplay/Tabs/index.esm.js +1 -1
- package/lib/dataDisplay/index.esm.js +1 -1
- package/lib/elements/Avatar/index.esm.js +1 -1
- package/lib/elements/Button/index.esm.js +1 -1
- package/lib/elements/Calendar/index.esm.js +1 -1
- package/lib/elements/Dropdown/index.esm.js +1 -1
- package/lib/elements/Icon/index.esm.js +1 -1
- package/lib/elements/IconButton/index.esm.js +1 -1
- package/lib/elements/Image/index.esm.js +1 -1
- package/lib/elements/Label/index.esm.js +1 -1
- package/lib/elements/Link/index.esm.js +1 -1
- package/lib/elements/List/index.esm.js +1 -1
- package/lib/elements/Modal/Modal.style.d.ts +60 -60
- package/lib/elements/Modal/index.esm.js +1 -1
- package/lib/elements/Popover/index.esm.js +1 -1
- package/lib/elements/ProgressBar/index.esm.js +1 -1
- package/lib/elements/Spinner/index.esm.js +1 -1
- package/lib/elements/Svg/index.esm.js +1 -1
- package/lib/elements/Text/index.esm.js +1 -1
- package/lib/elements/Tooltip/index.esm.js +1 -1
- package/lib/elements/index.esm.js +1 -1
- package/lib/factory/DeepFactory/index.esm.js +1 -1
- package/lib/factory/FlexFactory/index.esm.js +1 -1
- package/lib/factory/ResponsiveFactory/index.esm.js +1 -1
- package/lib/factory/SpacingFactory/index.esm.js +1 -1
- package/lib/factory/System/index.esm.js +1 -1
- package/lib/factory/index.esm.js +1 -1
- package/lib/form/Checkbox/Checkbox.d.ts +1 -1
- package/lib/form/Checkbox/Checkbox.interface.d.ts +12 -0
- package/lib/form/Checkbox/index.esm.js +1 -1
- package/lib/form/Field/index.esm.js +1 -1
- package/lib/form/FieldGroup/index.esm.js +1 -1
- package/lib/form/Form/Form.helpers.d.ts +11 -0
- package/lib/form/Form/Form.interface.d.ts +6 -11
- package/lib/form/Form/index.esm.js +1 -1
- package/lib/form/Input/Input.style.d.ts +6 -6
- package/lib/form/Input/index.esm.js +1 -1
- package/lib/form/InputCurrency/index.esm.js +1 -1
- package/lib/form/InputDate/index.esm.js +1 -1
- package/lib/form/InputMask/index.esm.js +1 -1
- package/lib/form/InputRange/index.esm.js +1 -1
- package/lib/form/InputSelect/index.esm.js +1 -1
- package/lib/form/Radio/Radio.d.ts +1 -1
- package/lib/form/Radio/Radio.interface.d.ts +21 -4
- package/lib/form/Radio/index.esm.js +1 -1
- package/lib/form/TextArea/index.esm.js +1 -1
- package/lib/form/UploadCard/index.esm.js +1 -1
- package/lib/form/index.esm.js +1 -1
- package/lib/hooks/index.esm.js +1 -1
- package/lib/hooks/useClipboard/index.esm.js +1 -1
- package/lib/hooks/useIntersect/index.esm.js +1 -1
- package/lib/hooks/useMediaQuery/index.esm.js +1 -1
- package/lib/layouts/DefaultLayout/index.esm.js +1 -1
- package/lib/layouts/SideBarLayout/index.esm.js +1 -1
- package/lib/layouts/index.esm.js +1 -1
- package/lib/scenario/CircleComponent/index.esm.js +1 -1
- package/lib/scenario/RectComponent/index.esm.js +1 -1
- package/lib/scenario/index.esm.js +1 -1
- package/lib/skeleton/ComposedSkeleton/index.esm.js +1 -1
- package/lib/skeleton/TextPreset/index.esm.js +1 -1
- package/lib/skeleton/index.esm.js +1 -1
- package/lib/themes/Colors/Colors.helpers.d.ts +25 -0
- package/lib/themes/Colors/index.esm.js +1 -1
- package/lib/themes/Deep/index.esm.js +1 -1
- package/lib/themes/Foundation/Foundation.interface.d.ts +9 -2
- package/lib/themes/Foundation/index.esm.js +1 -1
- package/lib/themes/GlobalStyle/index.esm.js +1 -1
- package/lib/themes/Semantic/Semantic.helpers.d.ts +3 -2
- package/lib/themes/Semantic/index.esm.js +1 -1
- package/lib/themes/Surface/index.esm.js +1 -1
- package/lib/themes/ThemeProvider/ThemeProvider.d.ts +14 -1
- package/lib/themes/ThemeProvider/ThemeProvider.interface.d.ts +40 -0
- package/lib/themes/ThemeProvider/index.d.ts +1 -1
- package/lib/themes/ThemeProvider/index.esm.js +1 -1
- package/lib/themes/index.esm.js +1 -1
- package/lib/utils/components/Breakpoints/index.esm.js +1 -1
- package/lib/utils/components/index.esm.js +1 -1
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.esm.js +1 -1
- package/lib/vendors/TanstackReactTable/interface.d.ts +3 -2
- package/package.json +10 -6
- package/lib/chunks/chunk-2UQUA5JQ.esm.js +0 -14
- package/lib/chunks/chunk-34F43UAI.esm.js +0 -4
- package/lib/chunks/chunk-4WWVMB7R.esm.js +0 -67
- package/lib/chunks/chunk-53R7OVXP.esm.js +0 -1
- package/lib/chunks/chunk-5BR6JTC5.esm.js +0 -5
- package/lib/chunks/chunk-5NIX5AK7.esm.js +0 -30
- package/lib/chunks/chunk-777HH5XE.esm.js +0 -9
- package/lib/chunks/chunk-7LG563DZ.esm.js +0 -1
- package/lib/chunks/chunk-BFZUNHO5.esm.js +0 -4
- package/lib/chunks/chunk-BJFSNET7.esm.js +0 -31
- package/lib/chunks/chunk-BXLZT77M.esm.js +0 -5
- package/lib/chunks/chunk-BYRL7X5M.esm.js +0 -126
- package/lib/chunks/chunk-C2HYRKZ5.esm.js +0 -72
- package/lib/chunks/chunk-CPOKPPFV.esm.js +0 -7
- package/lib/chunks/chunk-DEAQAH6B.esm.js +0 -171
- package/lib/chunks/chunk-E2S4LJNF.esm.js +0 -40
- package/lib/chunks/chunk-EC3O6B7O.esm.js +0 -1
- package/lib/chunks/chunk-EEBGH4FW.esm.js +0 -23
- package/lib/chunks/chunk-EWU2RG4F.esm.js +0 -38
- package/lib/chunks/chunk-J73BJCFK.esm.js +0 -5
- package/lib/chunks/chunk-KB2USQJE.esm.js +0 -1
- package/lib/chunks/chunk-LP4ND77J.esm.js +0 -15
- package/lib/chunks/chunk-M3BBRFF2.esm.js +0 -1
- package/lib/chunks/chunk-MJ7ZMPLR.esm.js +0 -6
- package/lib/chunks/chunk-N7OQM7C7.esm.js +0 -1
- package/lib/chunks/chunk-O4NT6MN7.esm.js +0 -15
- package/lib/chunks/chunk-O7P2XALT.esm.js +0 -104
- package/lib/chunks/chunk-OTJ32SHO.esm.js +0 -94
- package/lib/chunks/chunk-P4JVQK7V.esm.js +0 -81
- package/lib/chunks/chunk-PP2U26DD.esm.js +0 -6
- package/lib/chunks/chunk-Q6KSPMLW.esm.js +0 -1
- package/lib/chunks/chunk-RF5E2C7X.esm.js +0 -6
- package/lib/chunks/chunk-THOEVSMN.esm.js +0 -3
- package/lib/chunks/chunk-UUVZW6VR.esm.js +0 -85
- package/lib/chunks/chunk-UZFVIKSU.esm.js +0 -142
- package/lib/chunks/chunk-V2CHFCNJ.esm.js +0 -4
- package/lib/chunks/chunk-V2DSTTQA.esm.js +0 -1
- package/lib/chunks/chunk-V5AWVNU6.esm.js +0 -1
- package/lib/chunks/chunk-XD7WY5I4.esm.js +0 -7
- package/lib/chunks/chunk-Y2T3ENA4.esm.js +0 -1
- package/lib/chunks/chunk-Y4VB4DRM.esm.js +0 -1
- package/lib/chunks/chunk-Y7EHFKPF.esm.js +0 -61
- package/lib/chunks/chunk-ZX7OP4LN.esm.js +0 -130
- package/lib/entities/debounce.d.ts +0 -18
- package/lib/entities/index.d.ts +0 -11
- package/lib/entities/index.esm.js +0 -1
- package/lib/entities/timer.d.ts +0 -34
- /package/lib/{entities → utils}/window.d.ts +0 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,1357 @@
|
|
|
1
|
+
# @apollion-dsi/core
|
|
2
|
+
|
|
3
|
+
## 4.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- ADR-010: `txtOn` por contraste de luminância (`getContrastColor`) — on-color **dark-mode-stable** para superfícies sólidas (marca + feedback/action + interface.function). Corrige o "escuro-no-escuro" em fundos de marca fixos (`main`) no dark mode: o texto agora deriva da luminância do próprio fundo, não do par `baseLight`/`baseDark` que o dark mode troca.
|
|
8
|
+
|
|
9
|
+
Novos tokens Foundation (aditivos): `bg.brand`, `text.onMain`, `text.onOpposite`, `text.onComplementary`.
|
|
10
|
+
|
|
11
|
+
Novo helper `readableColor(color, background, minRatio?)` (export de `themes/colors`) — ajusta a luminância OKLch de uma cor de acento até passar o piso WCAG contra um fundo, **preservando hue/croma** (diferente de `getContrastColor`). Aplicado no elemento `Link`: links de marca agora ficam legíveis sobre fundos escuros (dark mode) sem perder a cor.
|
|
12
|
+
|
|
13
|
+
## 4.2.0
|
|
14
|
+
|
|
15
|
+
### Minor Changes
|
|
16
|
+
|
|
17
|
+
- feat(form): `Checkbox`/`Radio` string labels render with DS typography; new `labelProps`
|
|
18
|
+
|
|
19
|
+
String labels now render through the DS `BaseText` styles instead of raw text,
|
|
20
|
+
and the new optional `labelProps` lets consumers override the label typography
|
|
21
|
+
(`fontSize`, `color`, `fontWeight`, …). `ReactNode` labels are rendered as-is,
|
|
22
|
+
unchanged.
|
|
23
|
+
|
|
24
|
+
- feat(themes): native dark mode in `ApollionProvider` + `useApollionTheme`
|
|
25
|
+
- `ApollionProvider` now implements the mode API its types already advertised:
|
|
26
|
+
the `lightTheme`/`darkTheme` pair, controlled `themeMode` +
|
|
27
|
+
`onThemeModeChange`, `useSystemPreference` (watches `prefers-color-scheme`,
|
|
28
|
+
SSR-safe) and `toggleTheme` via the new `useApollionTheme()` hook. The single
|
|
29
|
+
`theme` prop keeps working unchanged.
|
|
30
|
+
- Dark-mode contrast fixes: the `Tabs` header divider now uses a mode-symmetric
|
|
31
|
+
gray (`grayscale.30`), and `InputSelect` no longer hardcodes white — the
|
|
32
|
+
control and menu follow the same surface tokens as the other inputs
|
|
33
|
+
(`grayscale.0`/`baseLight`).
|
|
34
|
+
- Vendor isolation now also blocks `import type` of vendored libs, enforced
|
|
35
|
+
via `@typescript-eslint/no-restricted-imports` in the package lint config.
|
|
36
|
+
- Internal: the `entities/` folder was dissolved — the SSR-safe window helpers
|
|
37
|
+
(`$window`, `$documentBody`, `canuseDom`) moved into `utils` (still exported
|
|
38
|
+
via `@apollion-dsi/core/utils`); the unused `debounce`/`timer` entities were
|
|
39
|
+
removed (never part of the public API).
|
|
40
|
+
- Storybook: stories renamed to `<Component>.story.tsx` and new `Flex`/`Grid`
|
|
41
|
+
stories (not part of the published bundle).
|
|
42
|
+
|
|
43
|
+
### Patch Changes
|
|
44
|
+
|
|
45
|
+
- 3321f56: fix(core): correct three DataTable/Calendar visual bugs
|
|
46
|
+
- **DataTable EmptyState** now centers horizontally. The 80%-wide empty block
|
|
47
|
+
was pinned to the left because the flex container (a `BaseContainer`, which
|
|
48
|
+
defaults to `flex-direction: column`) lacked `align-items: center` on its
|
|
49
|
+
cross axis.
|
|
50
|
+
- **DataTable pagination** no longer renders an empty scroll region when the
|
|
51
|
+
page size grows. The virtualizer now targets the element that actually
|
|
52
|
+
scrolls — `CustomScroll`'s inner node, exposed via a new optional
|
|
53
|
+
`scrollableRef` prop — instead of the non-scrolling outer container, so
|
|
54
|
+
`getScrollElement` reads the correct `scrollTop`/`clientHeight` and receives
|
|
55
|
+
scroll events.
|
|
56
|
+
- **Calendar** renders the day number on a day that is simultaneously today and
|
|
57
|
+
selected. A CSS specificity collision painted the number in `primary.base`
|
|
58
|
+
over the selected `primary.base` background (invisible); the today rule now
|
|
59
|
+
excludes selected days so the selected contrast color wins.
|
|
60
|
+
|
|
61
|
+
- b3cf796: fix(core): seed type-aware empty defaults in `Form` so fields mount controlled
|
|
62
|
+
|
|
63
|
+
`Form` passed `defaultValues: { ...initialValues }` to `useForm`, so a field
|
|
64
|
+
without an `initialValues` entry mounted with `value={undefined}` (uncontrolled)
|
|
65
|
+
and flipped to controlled on the first change — triggering React's
|
|
66
|
+
"changing an uncontrolled input to be controlled" warning. The new
|
|
67
|
+
`buildDefaultValues` helper seeds every field with a type-aware empty value
|
|
68
|
+
(`false` for checkbox/radio, `''` otherwise — same convention as `Field` reset),
|
|
69
|
+
with `initialValues` taking precedence. No public API change.
|
|
70
|
+
|
|
71
|
+
## 4.1.0
|
|
72
|
+
|
|
73
|
+
### Minor Changes
|
|
74
|
+
|
|
75
|
+
- d18737c: Add `DescriptionList` + widen `Field` hint props to `ReactNode` — closes two open "Gaps Apollion" tracked by DEX-Aggregator.
|
|
76
|
+
- **`DescriptionList`** (`@apollion-dsi/core/data-display/description-list`) — new `data-display` component: semantic key/value list (`<dl>`/`<dt>`/`<dd>`) under an optional title, `direction="row" | "column"`. Both `key` and `value` accept `ReactNode`. Absorbs the recurring "key/value card under a title" pattern that clients reimplemented locally (DEX-Aggregator `InfoCard`, ~210 LOC duplicated across 7 screens). Full doc surface (TSDoc + Storybook + README.mdx + README.AI.md) + unit tests.
|
|
77
|
+
- **`Field` hint props accept `ReactNode`.** `hintText`, `hintSuccessText` and `hintErrorText` widen from `string` to `React.ReactNode` (backward-compatible — `string ⊂ ReactNode`). Unblocks inline hint affordances — an action button ("use max"), a daily-limit `Text` — that previously had to render as a sibling outside `Field`, blocking deletion of the consumer wrapper (DEX-Aggregator `InputTextAdapter`).
|
|
78
|
+
|
|
79
|
+
No breaking change. `@apollion-dsi/tokens` bumps in lockstep (`.changeset/config.json#fixed`).
|
|
80
|
+
|
|
81
|
+
- 063e0e9: Align `@apollion-dsi/tokens` DTCG output with the Design Tokens Format Module 2025.10.
|
|
82
|
+
- **Structured values:** `color` `$value` is now an OKLch object `{ colorSpace, components, hex, alpha? }` and `dimension` is `{ value, unit }` (was bare hex / length strings).
|
|
83
|
+
- **Typed IR:** a single intermediate representation (`src/ir.ts`) drives the JSON/CSS/TS renderers as pure projections.
|
|
84
|
+
- **Reference graph:** JSON emits a `color` primitives layer (structural SSOT) and foundation `bg`/`text` colours reference it via DTCG aliases (`{color.primary.base}`), with inline fallback when a resolved value diverges (e.g. surface inversion).
|
|
85
|
+
- **Composite tokens:** `border` (dimension / strokeStyle), `typography` (fontFamily / fontWeight / number + dimension) and `shadow` (DTCG shadow composite) now ship; values DTCG cannot model (em `letterSpacing`, `textTransform`, `fontStyle`, `100%` radius) travel in `$extensions` under `com.apollion.*`.
|
|
86
|
+
|
|
87
|
+
`@apollion-dsi/core` now exports the `themes/{border,depth,font}` subpaths so tokens consumes them as the single source of truth.
|
|
88
|
+
|
|
89
|
+
CSS/TS outputs for the existing `bg`/`text`/`spacing` layers are byte-identical; JSON is the spec-interop surface.
|
|
90
|
+
|
|
91
|
+
## 4.0.0
|
|
92
|
+
|
|
93
|
+
### Major Changes
|
|
94
|
+
|
|
95
|
+
- bd7d6cb: # v4.0.0 — OKLch + Dimension + Token Split
|
|
96
|
+
|
|
97
|
+
The v4 epic per [ADR-006](../packages/core/docs/adr/ADR-006-v4-oklch-dimension-token-split.md) + [PRD-002](../packages/core/docs/prd/PRD-002-v4-epic-execution.md). DS-from-scratch (Q-G grilling 2026-05-24); no consumer migration. Greenfield adoption via [MIGRATION-v4.md](../packages/core/docs/migration/MIGRATION-v4.md).
|
|
98
|
+
|
|
99
|
+
## Breaking — `@apollion-dsi/core@4.0.0`
|
|
100
|
+
- **Root barrel removed.** `import { Button } from '@apollion-dsi/core'` no longer works. Use granular subpaths (`@apollion-dsi/core/elements/button`). ESLint rule flips warn → error. ADR-001 Slice 6 finalized here. ADR-006 §3.7 E7.
|
|
101
|
+
- **OKLch palette derivation.** All `mount*Colors` helpers + `getOppositeColor` migrated from `color@5` RGB lerp to `culori@4` OKLch lerp. Validated by `spike/culori-oklch-lerp-parity` (0 unexpected regressions; greyscale 19× more uniform in OKLAB L). ADR-006 §2 B1 + §6 S2.
|
|
102
|
+
- **`defaultInputColors.opposite` token value changed.** OKLch hue rotation differs from HSL rotation (the OKLch is the perceptually correct opposite). Audit `theme.colors.opposite.*` consumers.
|
|
103
|
+
- **Dimension axis added.** `<ApollionProvider dimension="compact|normal|spacious">` is a new prop; default `normal` preserves v3.x spacing byte-exact. ADR-006 §6 S3.
|
|
104
|
+
- **`vendors/Color` eliminated.** Internal `color@5` vendor deleted (zero call-sites after S6 migration). `color` + `@types/color` removed from `package.json#dependencies`. WCAG functions migrated to `culori.wcagContrast` + `culori.wcagLuminance` (100% bit-exact parity per `spike/culori-wcag-parity`).
|
|
105
|
+
- **`invertForSurface(theme, surface, mode)` 3-arg signature.** `mode` is additive optional — existing 2-arg calls continue to work; `mode` is a placeholder for future PRD-003 mode-aware inversion. ADR-006 §6 S6.
|
|
106
|
+
|
|
107
|
+
## Minor — `@apollion-dsi/eslint-config`
|
|
108
|
+
- `culori` + `zod` added to `VENDORED_V4_LIBS` — must import via `vendors/Culori|Zod`.
|
|
109
|
+
- `color` removed from `VENDORED_T2_LIBS` (eliminated).
|
|
110
|
+
- `no-restricted-imports` for `'@apollion-dsi/core'` root: `warn` → `error` (per v4 barrel removal above).
|
|
111
|
+
|
|
112
|
+
## Major — `@apollion-dsi/tokens@4.0.0` (first release)
|
|
113
|
+
|
|
114
|
+
New package — framework-agnostic design tokens consumed via `runtime/v1` versioned API + `apollion-tokens build` CLI.
|
|
115
|
+
- **Strangler Fig builders** duplicated from core (`colors.ts`, `spacing.ts`); Foundation + Surface re-exported. Parity enforced by `__tests__/parity.test.ts`. ADR-006 §3.1 + §6 S4.
|
|
116
|
+
- **Atomic + idempotent build CLI.** `apollion-tokens build [--check] [--verbose] --config <path> [--out <dir>]`. Emits `dist/{css,json,ts}/*` + `dist/manifest.json` with sha256 audit trail. Rerun byte-identical. `--check` mode for CI gate. ADR-006 §3.5 + §6 S5.
|
|
117
|
+
- **DTCG-compliant JSON output** (tech-radar R1).
|
|
118
|
+
- **`as const` TypeScript output** (tech-radar R4).
|
|
119
|
+
- **CSS `@property` declarations** (tech-radar R3) + custom properties `--apollion-{layer}-{role}-{variant}`.
|
|
120
|
+
- **Sandboxed `apollion.config.mjs` loader** (`node:vm` + zod schema) — threat-model T2+E1 mitigation. ADR-006 §3.8 B3 + §6 S6.
|
|
121
|
+
- **Lockstep version** with `@apollion-dsi/core` via `.changeset/config.json#fixed`.
|
|
122
|
+
|
|
123
|
+
## Minor — `@apollion-dsi/scripts`
|
|
124
|
+
- `codemods/v4-migrate.mjs` — one-way codemod (Q-G10: no `--revert`; DEX/Jovian/Fanaticofc don't consume v3.x, no legacy to revert). Transforms `invertForSurface` to 3-arg, flags `createTheme` for manual hoist to `apollion.config.mjs`. Transcript JSONL audit log.
|
|
125
|
+
- `verify-no-install-scripts.js` — supply-chain hardening; blocks `preinstall`/`install`/`postinstall` in `@apollion-dsi/*` workspaces (threat-model E2 mitigation).
|
|
126
|
+
|
|
127
|
+
## Spike validation (preserved local, NOT merged to main)
|
|
128
|
+
- `spike/culori-wcag-parity` — 100.0000% bit-exact culori vs color@5 (262 measurements / 10 palettes). `vendors/Color` elimination LOCKED.
|
|
129
|
+
- `spike/culori-oklch-lerp-parity` — 0 unexpected regressions in 68 deltas; greyscale ramp 19× more uniform in OKLAB L. DECISION ✅ PROCEED.
|
|
130
|
+
|
|
131
|
+
- 879eedd: feat(core)!: ADR-007 S6 — hard cut Formik+Yup vendors (v4.0.0)
|
|
132
|
+
|
|
133
|
+
Completa a migração ADR-007 com a remoção definitiva do legacy stack
|
|
134
|
+
Formik+Yup. Vendors removidos, deps dropped, ESLint VENDORED_LIBS limpo.
|
|
135
|
+
|
|
136
|
+
**Removidos:**
|
|
137
|
+
- `packages/core/src/vendors/Formik/` — 4 arquivos (component.ts, interface.ts, index.ts, README.md).
|
|
138
|
+
- `packages/core/src/vendors/Yup/` — 4 arquivos (mesmo padrão).
|
|
139
|
+
- `formik@2.4.9` removido de `packages/core/package.json#dependencies`.
|
|
140
|
+
- `yup@1.7.1` removido de `packages/core/package.json#dependencies`.
|
|
141
|
+
- `formik` + `yup` removidos de `packages/eslint-config/index.js` `VENDORED_T1_FORM_LIBS`.
|
|
142
|
+
- `yarn.lock` shrunk em ~932 KiB (-9 transitive packages).
|
|
143
|
+
|
|
144
|
+
**Estado pós-S6:**
|
|
145
|
+
- 0 imports diretos de `formik`/`yup` em `packages/core/src/**` e `website/src/**`.
|
|
146
|
+
- `corepack yarn workspace @apollion-dsi/core run check-types`: ✅
|
|
147
|
+
- `corepack yarn workspace @apollion-dsi/core run lint`: ✅
|
|
148
|
+
- `corepack yarn workspace @apollion-dsi/core run validate:tests`: ✅ 317 passed (1 skipped pre-existente), 59 snapshots OK.
|
|
149
|
+
- `corepack yarn workspace @apollion-dsi/website run build`: ✅
|
|
150
|
+
- Bundle form-basic/form-form/form-dynamic: 422 kB First Load JS (unchanged vs S3 — Formik/Yup já eram dead code desde S3).
|
|
151
|
+
|
|
152
|
+
**Status ADR-007:** ✅ Implemented. Todos S0-S6 mergeados.
|
|
153
|
+
|
|
154
|
+
**Achado de sessão:** ADR-006 v4 epic já estava ✅ Implemented (2026-05-25,
|
|
155
|
+
commit `4188501`). O "gate v4.0.0" para S6 era apenas pendência de
|
|
156
|
+
execução, não bloqueio externo. S6 executado imediatamente.
|
|
157
|
+
|
|
158
|
+
**Trabalho restante (fora do escopo ADR-007):**
|
|
159
|
+
1. `corepack yarn version` — consolida changesets queued, bumpa
|
|
160
|
+
`@apollion-dsi/core@3.0.0 → 4.0.0` (lockstep com `@apollion-dsi/tokens`).
|
|
161
|
+
2. `corepack yarn release` — npm publish com `--provenance` (ADR-006 §AI-7).
|
|
162
|
+
3. Visual regression 3-browser full pass na CI antes do release.
|
|
163
|
+
|
|
164
|
+
**Breaking changes consumer-facing (já documentados em MIGRATION-v4.md §1-§8):**
|
|
165
|
+
- `validation` prop em `<Form fields>` agora aceita `ZodTypeAny` (era Yup).
|
|
166
|
+
- `validateOnChange`/`validateOnBlur` booleans → `mode?: Mode` enum.
|
|
167
|
+
- `onError(errors)` recebe `FieldErrors` (era `FormikErrors`).
|
|
168
|
+
- `handleSubmit(values, methods)` recebe `UseFormReturn` no 2º arg (era `FormikHelpers`).
|
|
169
|
+
- `FormRef` type aponta para `UseFormReturn<any>` (era `FormikProps<any>`).
|
|
170
|
+
- `formik` + `yup` removidos de transitive deps — consumers que importavam diretamente do core via barrel devem trocar para `import { z } from 'zod'` / `import { useForm } from 'react-hook-form'` direto.
|
|
171
|
+
|
|
172
|
+
Ver `packages/core/docs/adr/ADR-007-form-stack-rhf-zod.md` §6 Slice 6 +
|
|
173
|
+
`packages/core/MIGRATION-v4.md` para guia consumer-side completo.
|
|
174
|
+
|
|
175
|
+
- e2abc9c: feat(core)!: ADR-008 — router-agnostic polymorphic Link (v4.0.0)
|
|
176
|
+
|
|
177
|
+
`<Link>` deixa de depender de `react-router-dom`. Refactor para polymorphic
|
|
178
|
+
component via prop `as` — default `<a>` nativo; consumer passa
|
|
179
|
+
`as={NextLink}`/`as={RouterLink}`/`as={RemixLink}` para SPA navigation.
|
|
180
|
+
|
|
181
|
+
**Removidos:**
|
|
182
|
+
- `packages/core/src/vendors/ReactRouterDom/` (4 files).
|
|
183
|
+
- `react-router-dom@7.15.0` de `packages/core/package.json#dependencies`.
|
|
184
|
+
- `react-router-dom` de `packages/eslint-config/index.js` `VENDORED_T1_DATA_LIBS`.
|
|
185
|
+
- `<MemoryRouter>` wrapper de `website/pages/_app.jsx` (era só para satisfazer Link RRD-based).
|
|
186
|
+
- Yarn lockfile shrunk **−4.17 MiB** (−4 packages: `react-router-dom`, `react-router`, `cookie`, `set-cookie-parser`).
|
|
187
|
+
|
|
188
|
+
**Refatorados:**
|
|
189
|
+
- `elements/Link/Link.tsx` — single render path; `effectiveAs = isExternal ? 'a' : as`; dropped `getRoute()` helper.
|
|
190
|
+
- `elements/Link/Link.style.ts` — `LinkStyle` + `LinkButtonStyle` base em `baseStyled.a`; styled-components forward `as` prop. Eliminados styles redundantes (`ExternalLinkStyle`, `ExternalLinkButtonStyle`).
|
|
191
|
+
- `elements/Link/Link.interface.ts` — drop `Partial<LinkProps>`; add `as?: React.ElementType` + `to?: any`.
|
|
192
|
+
- `elements/Link/Link.test.tsx` — drop `<Router>` wrapper + `jest.mock('react-router-dom')`.
|
|
193
|
+
- `elements/Link/story.tsx` — drop `MemoryRouter` decorator.
|
|
194
|
+
- `elements/List/story.tsx` — drop `MemoryRouter` decorator (era scaffolding-only).
|
|
195
|
+
- `elements/List/List.tsx` — `<Link to={item.to}>` → `<Link href={item.to}>`.
|
|
196
|
+
- `elements/Link/README.mdx` + `README.AI.md` — rewrite com pattern `as={NextLink}` / `as={RouterLink}`.
|
|
197
|
+
- `hooks/useUnload/README.mdx` — remove exemplo legacy com `<Prompt>` (Prompt nem existe em react-router v6+).
|
|
198
|
+
|
|
199
|
+
**Bundle delta (Next.js First Load JS, website pós-build):**
|
|
200
|
+
|
|
201
|
+
| Page | Pre | Post | Δ |
|
|
202
|
+
| ------------------- | -----: | -----: | -------------: |
|
|
203
|
+
| `form-basic` | 422 kB | 410 kB | −12 kB / −2.8% |
|
|
204
|
+
| `form-form` | 422 kB | 410 kB | −12 kB / −2.8% |
|
|
205
|
+
| `form-input-select` | 411 kB | 399 kB | −12 kB / −2.9% |
|
|
206
|
+
| Shared chunks | 211 kB | 199 kB | −12 kB / −5.7% |
|
|
207
|
+
|
|
208
|
+
**12 kB real savings** em todas pages do website — `react-router-dom` saía amortizado em shared chunks. Aplica também a consumers externos que não usavam RRD (Next.js, Remix). Contraste com ADR-007 (Form migration) que ficou em +1.2%.
|
|
209
|
+
|
|
210
|
+
**Breaking change consumer-facing** (documentado em MIGRATION-v4.md §ADR-008):
|
|
211
|
+
- `<Link to="/x">` sem `as` vira no-op silencioso. Migrar para `<Link as={RouterLink} to="/x">` ou `<Link href="/x">`.
|
|
212
|
+
- `<MemoryRouter>` wrappers que só existiam para satisfazer DS Link podem ser removidos.
|
|
213
|
+
|
|
214
|
+
**Validation:**
|
|
215
|
+
- check-types ✅ / lint ✅ / 317 tests ✅ / 59 snapshots ✅ / core build ✅ / website build ✅
|
|
216
|
+
- 0 imports de `react-router-dom` em `packages/core/src/**` e `website/src/**` (only docs/JSDoc examples remain — legítimos).
|
|
217
|
+
|
|
218
|
+
ROADMAP entry "Router-agnostic Link" → ✅ COMPLETE. ADR-008 Status → ✅ Implemented.
|
|
219
|
+
|
|
220
|
+
Ver `packages/core/docs/adr/ADR-008-router-agnostic-link.md` para análise completa + `packages/core/MIGRATION-v4.md` §ADR-008 para guia consumer-side.
|
|
221
|
+
|
|
222
|
+
### Minor Changes
|
|
223
|
+
|
|
224
|
+
- 32f7a1d: feat(themes): ADR-002 Slice 2 — Semantic alias layer
|
|
225
|
+
|
|
226
|
+
Adds `theme.semantic` — the intent-named token layer that mirrors Aplica DS
|
|
227
|
+
taxonomy (`semantic.<category>.<group>.<state>.<property>`) and derives
|
|
228
|
+
from the existing structural theme without breaking it.
|
|
229
|
+
|
|
230
|
+
Public API:
|
|
231
|
+
- `theme.semantic.color.feedback.{success|danger|warning|information}.{bg|txtOn|border}`
|
|
232
|
+
- `theme.semantic.color.interface.function.{primary|secondary|tertiary}.normal.{bg|txtOn}`
|
|
233
|
+
- `theme.semantic.color.brand.{first|second|third}.default.{surface|txtOn}`
|
|
234
|
+
- `theme.semantic.dimension.spacing.{zero..giant}` (pre-resolved CSS strings)
|
|
235
|
+
- `createSemantic(input)` helper — pure, idempotent, no side-effects
|
|
236
|
+
- Granular subpath import: `@apollion-dsi/core/themes/semantic`
|
|
237
|
+
|
|
238
|
+
Backward-compatible: `theme.colors.*`, `theme.spacing(...)` and all other
|
|
239
|
+
structural tokens remain untouched. Components migrate at their own pace.
|
|
240
|
+
|
|
241
|
+
Also fixes a latent regression in `scripts/generate-exports.js` that would
|
|
242
|
+
overwrite `package.json#sideEffects` (currently `false` since the v3.0.0
|
|
243
|
+
side-effects-free refactor) back to the legacy allow-list.
|
|
244
|
+
|
|
245
|
+
See `packages/core/docs/adr/ADR-002-layered-theme-aliases-and-surface.md`
|
|
246
|
+
§3, §6 (Slice 2), §9 (grill-with-docs validations).
|
|
247
|
+
|
|
248
|
+
- 2dadba5: feat(themes): ADR-002 Slice 3 — Foundation alias layer
|
|
249
|
+
|
|
250
|
+
Adds `theme.foundation` — ergonomic short aliases over Semantic, designed
|
|
251
|
+
as the **default layer for product code** (DEX, Jovian, Fanaticofc).
|
|
252
|
+
|
|
253
|
+
Public API:
|
|
254
|
+
- `theme.foundation.bg.{primary, secondary, tertiary, success, danger, warning, info}`
|
|
255
|
+
- `theme.foundation.text.{onPrimary, onSecondary, onTertiary, onSuccess, onDanger, onWarning, onInfo}`
|
|
256
|
+
- `theme.foundation.spacing.{xs, sm, md, lg, xl, xxl}` (pre-resolved CSS strings)
|
|
257
|
+
- `createFoundation(semantic)` helper — pure, idempotent (ADR-002 §9 contract)
|
|
258
|
+
- Subpath import: `@apollion-dsi/core/themes/foundation`
|
|
259
|
+
- Cheatsheet: `packages/core/src/themes/Foundation/README.md`
|
|
260
|
+
|
|
261
|
+
Layer-of-choice rule (CONCEPTS.md §3):
|
|
262
|
+
- Product code → Foundation
|
|
263
|
+
- Core components → Semantic
|
|
264
|
+
- Engine internals → Structural (unchanged)
|
|
265
|
+
|
|
266
|
+
Backward-compatible: no breaking change. Existing `theme.colors.*`,
|
|
267
|
+
`theme.spacing(...)`, `theme.semantic.*` remain intact.
|
|
268
|
+
|
|
269
|
+
Storybook MDX cheatsheet deferred (themes folder has no story precedent
|
|
270
|
+
in repo) — replaced by Markdown cheatsheet co-located with the layer.
|
|
271
|
+
|
|
272
|
+
See `packages/core/docs/adr/ADR-002-layered-theme-aliases-and-surface.md`
|
|
273
|
+
§3, §6 (Slice 3).
|
|
274
|
+
|
|
275
|
+
- 820a612: feat(themes): ADR-002 Slice 4 — Surface inversion (positive / negative)
|
|
276
|
+
|
|
277
|
+
Adds contextual surface inversion for Semantic + Foundation **without
|
|
278
|
+
touching Structural**, resolving the "dark card on light page" hack
|
|
279
|
+
documented in ADR-002 §2.
|
|
280
|
+
|
|
281
|
+
Public API:
|
|
282
|
+
- `<SurfaceProvider surface="positive" | "negative">` — lightweight wrapper
|
|
283
|
+
for subtree inversion (preferred). Uses styled-components theme function
|
|
284
|
+
pattern (ADR-002 §9 grill-with-docs §1).
|
|
285
|
+
- `invertForSurface(theme, surface)` — pure, idempotent helper (ADR-002 §9).
|
|
286
|
+
- `ApollionProvider` now accepts `surface` prop for app-wide inversion.
|
|
287
|
+
- New type: `SurfaceMode = 'positive' | 'negative'`.
|
|
288
|
+
- Subpath import: `@apollion-dsi/core/themes/surface`.
|
|
289
|
+
- Quick docs: `packages/core/src/themes/Surface/README.md`.
|
|
290
|
+
|
|
291
|
+
Semantics of inversion (v1):
|
|
292
|
+
- Structural (`theme.colors.*`, `theme.spacing(...)`) untouched.
|
|
293
|
+
- `foundation.bg.{primary,secondary,tertiary}` → `colors.baseDark`.
|
|
294
|
+
- `foundation.bg.<feedback>` → `colors.<feedback>.dark` (hue preserved).
|
|
295
|
+
- `foundation.text.*` → `colors.baseLight` (always).
|
|
296
|
+
- `semantic.color.brand.{n}.default.surface` → `colors.<brand>.dark`.
|
|
297
|
+
- `semantic.color.feedback.<state>.border` → `colors.<state>.base`.
|
|
298
|
+
|
|
299
|
+
Tests: 17 new cases including WCAG contrast sanity checks and subtree
|
|
300
|
+
isolation (negative does not leak to siblings).
|
|
301
|
+
|
|
302
|
+
Limitations (v1, deferred to ADR-003 / v4 epic):
|
|
303
|
+
- Inversion is deterministic and ignores `themeMode` — Apollion v3.x has
|
|
304
|
+
no algorithmic mode resolution yet. v4 will introduce "negative within
|
|
305
|
+
the current mode" semantics per Aplica DS Mode × Surface matrix.
|
|
306
|
+
|
|
307
|
+
Refs:
|
|
308
|
+
- packages/core/docs/adr/ADR-002-layered-theme-aliases-and-surface.md §3.2, §6, §9
|
|
309
|
+
- packages/core/src/themes/Surface/README.md (full cheatsheet)
|
|
310
|
+
|
|
311
|
+
🎉 ADR-002 epic complete (Slices 1-4 shipped, 3.0.0 → 3.3.0).
|
|
312
|
+
|
|
313
|
+
- 75961a1: feat: novo `Calendar` primitive + `InputDate` reescrito com popover Apollion-styled
|
|
314
|
+
|
|
315
|
+
Substitui o antigo wrapper de `<input type="date">` nativo por um popover
|
|
316
|
+
Apollion-styled. Resolve dois problemas distintos:
|
|
317
|
+
1. **Bug crítico no `form/Input`**: o default `value = ''` em
|
|
318
|
+
`Input.tsx:27` forçava todos os Inputs ao modo controlled mesmo quando
|
|
319
|
+
o consumer passava apenas `defaultValue`. Afetava `InputDate`,
|
|
320
|
+
`InputCurrency`, `InputMask`, etc. — sintoma reportado era "valor não
|
|
321
|
+
atualiza ao selecionar". Fix cirúrgico + regressão em `Input.test.tsx`.
|
|
322
|
+
2. **Visual inconsistente cross-browser do `InputDate`**: o picker nativo
|
|
323
|
+
variava de UA pra UA e Safari Desktop não tinha picker nenhum.
|
|
324
|
+
|
|
325
|
+
Mudanças:
|
|
326
|
+
- **Novo:** `elements/Calendar` — primitive de grid headless sobre
|
|
327
|
+
`react-day-picker@9`. Modos `single`/`multiple`/`range`, locale via
|
|
328
|
+
`date-fns` (default `ptBR`), `disabled`/`hidden` via `Matcher`. Não
|
|
329
|
+
cuida de posicionamento — é grid puro. Stories Default/Range/Locale/MinMax.
|
|
330
|
+
- **Refatorado:** `form/InputDate` — `Input[type=text readOnly]` + popover
|
|
331
|
+
com `@floating-ui/react` + `Paper` + `Calendar`. API **drop-in**:
|
|
332
|
+
`onChange: (e: ChangeEvent<HTMLInputElement>) => void` preservado via
|
|
333
|
+
synthetic event (`target.value` em ISO `yyyy-MM-dd`). Adicional
|
|
334
|
+
`onValueChange: (iso) => void` para código novo. Novas props: `locale`,
|
|
335
|
+
`displayFormat`, `minDate`, `maxDate`, `disabledDates`.
|
|
336
|
+
- **Fix:** `form/Input` deixa de forçar `value=""` quando consumer omite
|
|
337
|
+
`value`. Permite `defaultValue` funcionar.
|
|
338
|
+
- **Novo ícone:** `calendar` em `icons/Icons/categoryInterface.tsx`.
|
|
339
|
+
- **Deps:** `react-day-picker@9.5.0`, `date-fns@4.1.0`. ~25 KB gzip.
|
|
340
|
+
- **Subpath export:** `@apollion-dsi/core/elements/calendar` registrado em
|
|
341
|
+
`package.json#exports`.
|
|
342
|
+
|
|
343
|
+
Sem breaking change. Consumers existentes do `InputDate` (zero hoje em
|
|
344
|
+
DEX/Jovian/Fanaticofc) continuam funcionando — `onValueChange` é o caminho
|
|
345
|
+
novo recomendado.
|
|
346
|
+
|
|
347
|
+
Ver `docs/ROADMAP.md` §🟡 Next ("Calendar primitive + InputDate refactor"
|
|
348
|
+
✅ COMPLETE 2026-05-27).
|
|
349
|
+
|
|
350
|
+
- fba9a41: feat(core): DataTable absorbs faceted filters (per-column drill-down)
|
|
351
|
+
|
|
352
|
+
ROADMAP §🟡 Next "DataTable absorption gaps" — 3rd sub-feature
|
|
353
|
+
shipped (after pagination + tree expansion). Remaining: column
|
|
354
|
+
reordering + detail-panel expansion (deferred — conflicts with
|
|
355
|
+
fixed-row-height virtualizer).
|
|
356
|
+
|
|
357
|
+
Shipped across 4 vertical slices (+ 2 visual baseline commits):
|
|
358
|
+
- **S1** (`552e1ca`) — Vendor extension: added `getFacetedRowModel`,
|
|
359
|
+
`getFacetedUniqueValues`, `getFacetedMinMaxValues` runtime exports
|
|
360
|
+
and `ColumnFiltersState`, `FilterFn` type re-exports to
|
|
361
|
+
`vendors/TanstackReactTable/`. Wrapper test grew from 15 to 21
|
|
362
|
+
invariant cases (`TanstackReactTable.test.ts`).
|
|
363
|
+
- **S2** (`865525c` + baseline `90ce176`) — DataTable wiring + filter
|
|
364
|
+
UI + bonus dead-code fix. New `DataTable.filters.tsx` houses three
|
|
365
|
+
pure sub-components anchored in `<Dropdown>` popovers off the
|
|
366
|
+
header filter icon: - `SelectFilter` — multi-select checkboxes with counts (uses
|
|
367
|
+
`getFacetedUniqueValues()`). - `RangeFilter` — 2 number inputs (uses
|
|
368
|
+
`getFacetedMinMaxValues()` for placeholders). Apply debounced
|
|
369
|
+
200ms. - `TextFilter` — single input. Case-insensitive contains. Apply
|
|
370
|
+
debounced 200ms. - `VARIANT_FILTER_FN` resolver maps
|
|
371
|
+
`'select' → 'arrIncludesSome'`, `'range' → 'inNumberRange'`,
|
|
372
|
+
`'text' → 'includesString'`. Consumer overrides via
|
|
373
|
+
`Column.filterFn`.
|
|
374
|
+
|
|
375
|
+
New styled `HeaderControls` grouper centralizes the filter + sort
|
|
376
|
+
icon alignment in the header cell. Filter icon click stops
|
|
377
|
+
propagation so it does NOT toggle sort. `useReactTable` spreads
|
|
378
|
+
faceted helpers + columnFilters state conditionally on
|
|
379
|
+
`hasAnyFilter` (derived from `columns.some(c =>
|
|
380
|
+
|
|
381
|
+
c.filterVariant && !c.disableFilters)`) — zero overhead when no
|
|
382
|
+
column opts in.
|
|
383
|
+
|
|
384
|
+
**Bonus fix:** activates `Column.disableFilters` (was no-op for
|
|
385
|
+
multiple cycles). Now hides the filter icon AND sets
|
|
386
|
+
`enableColumnFilter: false` on the corresponding ColumnDef.
|
|
387
|
+
|
|
388
|
+
Filter icon: `ellipsisH` (3-dot more-options) — DS icon registry
|
|
389
|
+
has no `filter`/`funnel` icon; `ellipsisH` reads as "open options".
|
|
390
|
+
A dedicated SVG can land later without changing the public API.
|
|
391
|
+
|
|
392
|
+
Existing 5 DataTable visual baselines regen'd: the `<HeaderControls>`
|
|
393
|
+
wrapper shifts the sort icon's spacing by `theme.spacing('xs')` on
|
|
394
|
+
any sortable column, even when no filter chrome is rendered. The
|
|
395
|
+
functional behavior is unchanged — click on the header still
|
|
396
|
+
toggles sort.
|
|
397
|
+
|
|
398
|
+
- **S3** (`2ce44ef` + baseline `b9fa130`) — New `FacetedFiltering`
|
|
399
|
+
story with 4 columns showcasing all three variants + a
|
|
400
|
+
`disableFilters` override. 9 new jsdom-observable smoke tests
|
|
401
|
+
(mounts per variant, header text co-exists with chrome,
|
|
402
|
+
`disableFilters` honored, controlled / initialColumnFilters,
|
|
403
|
+
consumer filterFn override, default-off path).
|
|
404
|
+
- **S4** (this commit) — README.mdx adds "Filtros por coluna
|
|
405
|
+
(faceted)" section with variant table, controlled + uncontrolled
|
|
406
|
+
examples, `filterFn` override pattern, and the i18n / pipeline /
|
|
407
|
+
drill-down notes. README.AI.md grows by 5 rows (Column-level
|
|
408
|
+
`filterVariant` + `filterFn` + DataTable-level
|
|
409
|
+
`initialColumnFilters`, `columnFilters`, `onColumnFiltersChange`).
|
|
410
|
+
`disableFilters` description corrected (was "exclude from global
|
|
411
|
+
filter" — actually it opts the column out of the per-column filter
|
|
412
|
+
pipeline AND hides the filter icon).
|
|
413
|
+
|
|
414
|
+
New props on `DataTableProps` (all optional, default-off):
|
|
415
|
+
- `initialColumnFilters?: ColumnFiltersState` — uncontrolled init.
|
|
416
|
+
- `columnFilters?: ColumnFiltersState` — controlled state.
|
|
417
|
+
- `onColumnFiltersChange?: OnChangeFn<ColumnFiltersState>` — controlled
|
|
418
|
+
callback; also fires in uncontrolled mode as observer (via reused
|
|
419
|
+
`useHybridState` helper from S2/S3 #8).
|
|
420
|
+
|
|
421
|
+
New props on `Column<T>`:
|
|
422
|
+
- `filterVariant?: 'select' | 'range' | 'text'` — opt-in switch +
|
|
423
|
+
drives UI choice.
|
|
424
|
+
- `filterFn?: FilterFn<T> | string` — custom filter logic override.
|
|
425
|
+
|
|
426
|
+
Non-breaking for existing consumers — all new props default-off. The
|
|
427
|
+
`Column.disableFilters` activation is technically observable but the
|
|
428
|
+
declared semantics were already what the docs said; the no-op was the
|
|
429
|
+
bug.
|
|
430
|
+
|
|
431
|
+
40 suites · 318 tests passing. Coverage 69.72 / 50.57 / 56.65 / 69.42
|
|
432
|
+
(vs floors 68/48/53/67).
|
|
433
|
+
|
|
434
|
+
- 3a90653: feat(core): DataTable absorbs pagination + expandable tree rows
|
|
435
|
+
|
|
436
|
+
ROADMAP §🟡 Next "DataTable absorption gaps" — 2 of 4 sub-features
|
|
437
|
+
shipped this cycle. The remaining 2 (column reordering, faceted
|
|
438
|
+
filters) stay open for future cycles; detail-panel expansion is
|
|
439
|
+
documented as a separate gap (conflicts with the fixed-row-height
|
|
440
|
+
virtualizer).
|
|
441
|
+
|
|
442
|
+
Shipped across 4 vertical slices:
|
|
443
|
+
- **S1** (`e53fec6`) — Vendor extension: added `getPaginationRowModel`
|
|
444
|
+
- `getExpandedRowModel` runtime exports and `PaginationState`,
|
|
445
|
+
`ExpandedState`, `OnChangeFn` type re-exports to
|
|
446
|
+
`vendors/TanstackReactTable/`. Closed the pre-existing wrapper-test
|
|
447
|
+
gap (15 invariant cases mirror FloatingUI / TanstackReactVirtual S1
|
|
448
|
+
pattern).
|
|
449
|
+
- **S2** (`ac54bd8` + baseline `3d3a45e`) — Pagination: opt-in via
|
|
450
|
+
`paginated: true`. New `PaginationRow` styled + `PaginationControls`
|
|
451
|
+
pure component (`"Mostrando X-Y de Z"` + Anterior / page indicator /
|
|
452
|
+
Próximo + page-size dropdown). Hybrid state pattern via new
|
|
453
|
+
`useHybridState<T>` helper that unifies controlled/uncontrolled in a
|
|
454
|
+
single `[value, setValue]` callsite. New `Paginated` story + 1
|
|
455
|
+
visual baseline. 8 new tests.
|
|
456
|
+
- **S3** (`808d162` + baseline `763bbe6`) — Expandable tree: opt-in
|
|
457
|
+
via `getSubRows` callback. New `buildExpandColumnDef` helper mirrors
|
|
458
|
+
`buildSelectableColumnDef`; expand toggle column injected leftmost
|
|
459
|
+
(read order: "control the tree → select what you see → consume
|
|
460
|
+
data"). Chevron indented by `row.depth * 16px`. `useHybridState`
|
|
461
|
+
reused for `ExpandedState`. New `Expandable` story + 1 baseline. 5
|
|
462
|
+
new tests.
|
|
463
|
+
- **S4** (this commit) — README.mdx adds "Paginação client-side" +
|
|
464
|
+
"Linhas expansíveis (modo tree)" sections with controlled +
|
|
465
|
+
uncontrolled examples. README.AI.md props table extended with the
|
|
466
|
+
10 new props. ROADMAP entry stays in `🟡 Next` annotated with the
|
|
467
|
+
shipped sub-features.
|
|
468
|
+
|
|
469
|
+
New props on `DataTableProps` (all optional, default-off):
|
|
470
|
+
|
|
471
|
+
Pagination:
|
|
472
|
+
- `paginated?: boolean` — opt-in flag.
|
|
473
|
+
- `initialPagination?: Partial<PaginationState>` — uncontrolled init.
|
|
474
|
+
- `pagination?: PaginationState` — controlled state.
|
|
475
|
+
- `onPaginationChange?: OnChangeFn<PaginationState>` — controlled
|
|
476
|
+
callback; also fires in uncontrolled mode as observer.
|
|
477
|
+
- `pageSizeOptions?: number[]` — default `[10, 25, 50, 100]`. Empty
|
|
478
|
+
or single-element hides the page-size selector.
|
|
479
|
+
|
|
480
|
+
Expandable (tree mode):
|
|
481
|
+
- `getSubRows?: (row: T, index: number) => T[] | undefined` — opt-in.
|
|
482
|
+
- `expandedColumnWidth?: number` — defaults to
|
|
483
|
+
`selectableColumnWidth`.
|
|
484
|
+
- `initialExpanded?: ExpandedState` — uncontrolled init (use `true`
|
|
485
|
+
to expand all).
|
|
486
|
+
- `expanded?: ExpandedState` — controlled state.
|
|
487
|
+
- `onExpandedChange?: OnChangeFn<ExpandedState>` — controlled callback.
|
|
488
|
+
|
|
489
|
+
Non-breaking for existing consumers — all new props default-off, none
|
|
490
|
+
of the 21 existing DataTable visual baselines drift, public API of
|
|
491
|
+
`DataTableProps` is purely additive.
|
|
492
|
+
|
|
493
|
+
Strings (`"Mostrando X-Y de Z"`, `"Anterior"`, `"Próximo"`,
|
|
494
|
+
`"{N} / página"`) hardcoded PT-BR — consistent with `EmptyTable`'s
|
|
495
|
+
default `"Nada foi encontrado"`. Apollion has no i18n layer today;
|
|
496
|
+
documented gap.
|
|
497
|
+
|
|
498
|
+
40 suites · 302 tests passing. Coverage `70.46 / 50.95 / 57.73 /
|
|
499
|
+
70.17` (vs floors `68 / 48 / 53 / 67`).
|
|
500
|
+
|
|
501
|
+
- 5fca933: feat(core): swap `react-window` for `@tanstack/react-virtual` in DataTable
|
|
502
|
+
|
|
503
|
+
ROADMAP §🟡 Next "Migrate ReactWindow → @tanstack/react-virtual" closes
|
|
504
|
+
across 4 vertical slices:
|
|
505
|
+
- **S1** (`456b13e`) — Scaffolded `vendors/TanstackReactVirtual/`
|
|
506
|
+
re-exporting `useVirtualizer` + `Virtualizer` + `VirtualItem` from
|
|
507
|
+
`@tanstack/react-virtual@^3.13.26`. 3 wrapper-invariant unit tests
|
|
508
|
+
modeled on ADR-005 S2.
|
|
509
|
+
- **S2** (`e04e6c4`) — Refactored `DataTable.tsx` virtualization block
|
|
510
|
+
to use the hook via a small internal `VirtualizedRows` wrapper. The
|
|
511
|
+
public `renderRow({ index, style })` callsite contract stayed
|
|
512
|
+
stable. Dropped the file-level `@ts-ignore` and the inline
|
|
513
|
+
`@ts-ignore TS2786` over the JSX block. Replaced
|
|
514
|
+
`outerElementType={VitualScrollbar}` with direct
|
|
515
|
+
`<VitualScrollbar ref={parentRef}>`. Added 4 jsdom-observable
|
|
516
|
+
characterization tests (mount / headers / empty state). Refreshed
|
|
517
|
+
one visual-regression baseline (`components-datatable--bordered`,
|
|
518
|
+
0.19% pixel drift on transform-vs-absolute border rendering).
|
|
519
|
+
- **S3** (`04d9f7e`) — Added 8 wide-scope smoke tests: header chrome
|
|
520
|
+
(title / hasHeader gating / search placeholder), header checkbox
|
|
521
|
+
select-all + deselect cycles via `onRowSelect`, spacing-menu
|
|
522
|
+
rendering, sortable-header click cycle.
|
|
523
|
+
- **S4** (this commit) — Removed `vendors/ReactWindow/` and the
|
|
524
|
+
`react-window` + `@types/react-window` deps. Flipped the
|
|
525
|
+
`VENDORED_T1_UI_LIBS` allow-list in `@apollion-dsi/eslint-config`
|
|
526
|
+
to replace `'react-window'` with `'@tanstack/react-virtual'` so the
|
|
527
|
+
vendor-isolation rule keeps catching future direct imports outside
|
|
528
|
+
`src/vendors/**`.
|
|
529
|
+
|
|
530
|
+
Why the swap (driver):
|
|
531
|
+
1. **Same family as `@tanstack/react-table`** (already vendored). One
|
|
532
|
+
fewer mental model, one fewer audit surface.
|
|
533
|
+
2. **React 19 + TS 6 compatibility.** `react-window` is class-component
|
|
534
|
+
with an incompatible type shape — required `@ts-ignore TS2786` at
|
|
535
|
+
the JSX site. Hook surface removes that debt.
|
|
536
|
+
3. **Variable-row-height unlocked.** `useVirtualizer` exposes
|
|
537
|
+
`estimateSize: (i) => number` + opt-in `measureElement`. Future
|
|
538
|
+
DataTable variable-row work (ROADMAP §🟡 "DataTable absorption
|
|
539
|
+
gaps") needs no further vendor swap.
|
|
540
|
+
|
|
541
|
+
Non-breaking for consumers — `DataTable<T>` public API
|
|
542
|
+
(`data` / `columns` / `height` / `striped` / `bordered` / `hasHeader` /
|
|
543
|
+
`onRowSelect` / `renderRow`-like callbacks via `Column.Cell`) stays
|
|
544
|
+
identical. Bundle delta: react-window 1.8.11 + @types/react-window
|
|
545
|
+
1.8.8 (~7 KB shipped + types) out, @tanstack/react-virtual 3.13.26 +
|
|
546
|
+
@tanstack/virtual-core 3.16.0 (~12 KB shipped) in. Net node_modules
|
|
547
|
+
freed: 929 KiB.
|
|
548
|
+
|
|
549
|
+
Coverage at the end of the swap: statements 69.95 / branches 49.69 /
|
|
550
|
+
functions 56.08 / lines 69.63 — comfortably above the ratchet floors
|
|
551
|
+
(68 / 48 / 53 / 67). +1 vendor test suite + 1 DataTable test suite (12
|
|
552
|
+
cases total).
|
|
553
|
+
|
|
554
|
+
- ea3dc3a: feat(core): swap `@tippyjs/react/headless` for `@floating-ui/react` in Tooltip + Dropdown
|
|
555
|
+
|
|
556
|
+
ROADMAP §🟡 Next "Migrate TippyHeadless → @floating-ui/react" closes
|
|
557
|
+
across 4 vertical slices, all landed in the same day:
|
|
558
|
+
- **S1** (`f75e428`) — Scaffolded `vendors/FloatingUI/` re-exporting
|
|
559
|
+
the runtime surface from `@floating-ui/react@^0.27.19`: 10 hooks
|
|
560
|
+
(`useFloating`, `useInteractions`, `useClick`, `useHover`,
|
|
561
|
+
`useFocus`, `useDismiss`, `useRole`), 2 components
|
|
562
|
+
(`FloatingPortal`, `FloatingFocusManager`), 5 middleware (`arrow`,
|
|
563
|
+
`offset`, `flip`, `shift`, `autoUpdate`), 4 types (`Placement`,
|
|
564
|
+
`Strategy`, `MiddlewareData`, `OpenChangeReason`). 29 wrapper-
|
|
565
|
+
invariant unit tests (singleton + runtime shape + type re-exports).
|
|
566
|
+
- **S2** (`d61a111`) — Refactored `Tooltip.tsx` from `<Tippy
|
|
567
|
+
render={…}>` to `useFloating + useInteractions([useHover(restMs: 40),
|
|
568
|
+
useFocus(), useDismiss(), useRole({ role: 'tooltip' })])`. Added
|
|
569
|
+
`useFocus` per Q2 of the grill so the tooltip also opens on Tab
|
|
570
|
+
focus (a11y AAA). Arrow positioning is now inline at the callsite,
|
|
571
|
+
reading `middlewareData.arrow.{x, y}` (Q3 option a). Tooltip gained
|
|
572
|
+
its first `.test.tsx` (6 cases on the controlled `visible` path —
|
|
573
|
+
jsdom can't observe uncontrolled hover/focus). Dropped the
|
|
574
|
+
`@ts-ignore TS2786`.
|
|
575
|
+
- **S3** (`681f73b`) — Refactored `Dropdown.tsx` to `useFloating +
|
|
576
|
+
useInteractions([useClick({ enabled: !function-children }),
|
|
577
|
+
useHover({ enabled: hoverable }), useDismiss(), useRole({ role })])`.
|
|
578
|
+
Per Q1.a: `role: 'menu'` when `options` prop is passed, `role:
|
|
579
|
+
'dialog'` when arbitrary `content` — `useRole(context, { role })`
|
|
580
|
+
injects the correct `aria-haspopup` and the floating-element role.
|
|
581
|
+
Wraps the floating element in `<FloatingPortal>` +
|
|
582
|
+
`<FloatingFocusManager modal={false} initialFocus={-1}>` (no trap,
|
|
583
|
+
no auto-focus jump — preserves the legacy click-and-pick UX).
|
|
584
|
+
Existing 5 tests in `Dropdown.test.tsx` pass unchanged. Dropped
|
|
585
|
+
the `@ts-ignore TS2786`.
|
|
586
|
+
- **S4** (this commit) — Removed `vendors/TippyHeadless/` and the
|
|
587
|
+
`@tippyjs/react` dep. Flipped the `VENDORED_T1_UI_LIBS` allow-list
|
|
588
|
+
in `@apollion-dsi/eslint-config` to replace
|
|
589
|
+
`'@tippyjs/react/headless'` with `'@floating-ui/react'` so the
|
|
590
|
+
vendor-isolation rule keeps catching future direct imports outside
|
|
591
|
+
`src/vendors/**`. Removed the corresponding ROADMAP entry per the
|
|
592
|
+
new convention (drop completed items instead of striking them
|
|
593
|
+
through — see `7c2d253`).
|
|
594
|
+
|
|
595
|
+
Why the swap (driver):
|
|
596
|
+
1. **`tippy.js` sem release ≥ 18 meses.** `floating-ui` is the de
|
|
597
|
+
facto successor, maintained by the original Popper author whose
|
|
598
|
+
library `tippy.js` already wrapped internally. Same family, zero
|
|
599
|
+
functional regression in the consumer-facing surface.
|
|
600
|
+
2. **Explicit a11y.** Tippy didn't dictate ARIA. `useRole(context, {
|
|
601
|
+
role })` injects `role="tooltip" | "menu" | "dialog"` plus the
|
|
602
|
+
matching `aria-haspopup` / `aria-describedby` linkage via prop
|
|
603
|
+
getters. A11y is now code, not hope.
|
|
604
|
+
3. **Composição visível.** `<Tippy interactive onClickOutside={…}>`
|
|
605
|
+
packaged hover/click/focus/dismiss into a single opaque boolean.
|
|
606
|
+
floating-ui demands `useInteractions([useClick, useHover, useFocus,
|
|
607
|
+
useDismiss, useRole])` — the reader knows exactly which behaviors
|
|
608
|
+
are wired. Tested invariants per `enabled` flag.
|
|
609
|
+
4. **Type ergonomics.** Pure hooks — no `@ts-ignore TS2786` (which
|
|
610
|
+
was required in 2 sites with React 19 + TS 6).
|
|
611
|
+
|
|
612
|
+
Non-breaking for consumers — `TooltipProps` and `DropdownProps`
|
|
613
|
+
public surface unchanged. `interactive?: boolean` on `Tooltip` is
|
|
614
|
+
kept as a `@deprecated` legacy no-op because floating-ui's tooltip is
|
|
615
|
+
inherently interactive (hover/focus on the floating element doesn't
|
|
616
|
+
trigger dismiss). `position` props now type as `Placement` from
|
|
617
|
+
`@floating-ui/react` — same 12 string-literal values as Tippy.
|
|
618
|
+
|
|
619
|
+
Bundle delta:
|
|
620
|
+
- Out: `@tippyjs/react@4.2.6` + transitive `tippy.js@6.3.7` (~2.23 MiB
|
|
621
|
+
on disk, ~16 KB shipped).
|
|
622
|
+
- In: `@floating-ui/react@0.27.19` + transitive `@floating-ui/react-
|
|
623
|
+
dom`, `@floating-ui/utils`, `tabbable` (~911 KiB on disk, ~11 KB
|
|
624
|
+
shipped).
|
|
625
|
+
- Net: ~5 KB shipped reduction; ~1.32 MiB node_modules freed.
|
|
626
|
+
|
|
627
|
+
Coverage at the end of the swap: statements 70.25 / branches 49.97 /
|
|
628
|
+
functions 57.37 / lines 70.01 — comfortably above the ratchet floors
|
|
629
|
+
(68 / 48 / 53 / 67). +1 vendor test suite (29 cases) + 1 Tooltip test
|
|
630
|
+
suite (6 cases).
|
|
631
|
+
|
|
632
|
+
### Patch Changes
|
|
633
|
+
|
|
634
|
+
- 032f81c: docs: ADR-002 Slice 1 — CONCEPTS.md + README lineage
|
|
635
|
+
|
|
636
|
+
Adds conceptual reference document covering the Layer Cake (Structural →
|
|
637
|
+
Semantic → Foundation), 3-group communication model (Abstraction / Intent /
|
|
638
|
+
Consumer), Learning Spiral with three personas, bilingual glossary (PT-BR /
|
|
639
|
+
EN-US), and the Apollion ⇄ Aplica DS vocabulary map.
|
|
640
|
+
|
|
641
|
+
Credits Fernando Poe (co-author of Apollion 2020, author of
|
|
642
|
+
[Aplica DS](https://aplica.me/en/)) in a new Lineage & Acknowledgements
|
|
643
|
+
section of the README.
|
|
644
|
+
|
|
645
|
+
Doc-only. Zero API change.
|
|
646
|
+
|
|
647
|
+
See `packages/core/docs/adr/ADR-002-layered-theme-aliases-and-surface.md` §6
|
|
648
|
+
(Migration Plan, Slice 1).
|
|
649
|
+
|
|
650
|
+
- c056ee3: chore(core,eslint-config): ADR-004 backfill — vendor `react-day-picker` + `date-fns` + InputDate hardening
|
|
651
|
+
|
|
652
|
+
Pattern-guardian audit do commit `75961a1 Input Date` (Calendar primitive +
|
|
653
|
+
InputDate refactor) flagueou 4 desvios vs Apollion gold standard. Backfill
|
|
654
|
+
consolidado neste PR:
|
|
655
|
+
|
|
656
|
+
**V1 — ADR-004 backfill (2 novos vendors, vendor count 16 → 18):**
|
|
657
|
+
- **ReactDayPicker** (T1 UI, 4 files)
|
|
658
|
+
- Absorbed runtime: `DayPicker`
|
|
659
|
+
- Absorbed types: `DayPickerProps`, `Mode`, `DateRange`, `Matcher`,
|
|
660
|
+
`PropsSingle`, `PropsSingleRequired`, `PropsRange`, `PropsRangeRequired`
|
|
661
|
+
- Gap intencional: `useDayPicker` hook, `Modifier` API, plugins `addons`
|
|
662
|
+
— reabsorver quando `InputDateTime`/`TimePicker` (ROADMAP) precisar.
|
|
663
|
+
- **DateFns** (util tier, 4 files, novo `VENDORED_DATE_LIBS` na eslint-config)
|
|
664
|
+
- Absorbed runtime: `format`, `parse`, `parseISO`, `isValid`
|
|
665
|
+
- Absorbed locales: `ptBR`, `enUS`
|
|
666
|
+
- Absorbed types: `Locale`
|
|
667
|
+
- Gap intencional: `addDays`/`subDays`/aritmética, `formatDistance`/
|
|
668
|
+
formatação relativa, locales adicionais — adicionar conforme demanda.
|
|
669
|
+
|
|
670
|
+
Sites migrados (8 files): Calendar.tsx, Calendar.interface, Calendar.test,
|
|
671
|
+
Calendar/story, InputDate.tsx, InputDate.interface, InputDate.test,
|
|
672
|
+
InputDate/story.
|
|
673
|
+
|
|
674
|
+
**V2 — `parseInputDate` removido** do barrel `form/InputDate/index.ts`:
|
|
675
|
+
re-export vazava `date-fns` na public surface do DS (anti-pattern
|
|
676
|
+
ADR-004). Sem consumers conhecidos. Consumers que precisem importam
|
|
677
|
+
direto de `date-fns` no próprio package.
|
|
678
|
+
|
|
679
|
+
**V3 — `InputDate.handleKeyDown` a11y**: rewrite blocklist → allowlist.
|
|
680
|
+
Antes: `preventDefault` em tudo exceto Tab/Enter/Space — Esc, ArrowUp/Down/
|
|
681
|
+
Left/Right, Home, End, PageUp/Down ficavam swallowed, quebrando
|
|
682
|
+
`useDismiss({ escapeKey: true })`. Agora: `preventDefault` só em printable
|
|
683
|
+
chars (`key.length === 1 && key !== ' '`); named keys bubblam livremente.
|
|
684
|
+
WCAG 2.1.1 ok.
|
|
685
|
+
|
|
686
|
+
**V4 — `buildSyntheticEvent` extraído** para `form/InputDate/buildSyntheticEvent.ts`:
|
|
687
|
+
helper com cast-chain `as unknown as ChangeEvent` é fragile sob mudança
|
|
688
|
+
de shape em majors do React. Novo arquivo dedicado + 6 testes de contrato
|
|
689
|
+
runtime detectam drift cedo.
|
|
690
|
+
|
|
691
|
+
**Determinismo visual**: `Calendar/story.tsx` agora pin `FIXED_TODAY`
|
|
692
|
+
constant + `today`/`month` props nas 4 stories — baseline não drifta
|
|
693
|
+
diariamente conforme `new Date()` muda (era 0.5%+ por dia, acima do
|
|
694
|
+
threshold 0.1%).
|
|
695
|
+
|
|
696
|
+
Backward-compatible runtime API. Validate verde
|
|
697
|
+
(54 visual tests, 352+ unit tests, lint, typecheck, build).
|
|
698
|
+
|
|
699
|
+
Refs:
|
|
700
|
+
- `packages/core/docs/adr/ADR-004-vendor-isolation-policy.md` (status
|
|
701
|
+
atualizado: 18 vendors após backfill)
|
|
702
|
+
- `docs/ROADMAP.md` §"Calendar primitive + InputDate refactor" (hardening
|
|
703
|
+
block adicionado)
|
|
704
|
+
- `packages/core/src/vendors/ReactDayPicker/README.md` + DateFns/README.md
|
|
705
|
+
|
|
706
|
+
- d032437: docs(core): ADR-004 / PRD-001 S0 — vendor isolation scaffold
|
|
707
|
+
|
|
708
|
+
Approves ADR-004 (Vendor Isolation Policy) and PRD-001 (Vendor Isolation
|
|
709
|
+
Execution). Adds the infrastructure that makes `packages/core/src/vendors/`
|
|
710
|
+
internal-only:
|
|
711
|
+
- `esbuild.js` skips `vendors/` in `findEntryPoints` so wrappers never
|
|
712
|
+
become bundle entry points.
|
|
713
|
+
- `scripts/check-vendors-not-published.js` (new) asserts the invariant
|
|
714
|
+
post-build: no `lib/vendors/**` and no `./vendors/*` keys in
|
|
715
|
+
`package.json#exports`. Wired into `validate.sh`.
|
|
716
|
+
- `docs/CONCEPTS.md` gets a new §8 Vendor Isolation covering the canonical
|
|
717
|
+
shape (`component.ts` / `interface.ts` / `index.ts` / `README.md`), hard
|
|
718
|
+
rules, and rationale.
|
|
719
|
+
- `ROADMAP.md` moves vendor isolation to 🔴 Now.
|
|
720
|
+
|
|
721
|
+
`generate-exports.js` needed no change: its allow-list (`LEAF_CATEGORIES`,
|
|
722
|
+
`UTIL_CATEGORIES`) already excludes `vendors/` by construction.
|
|
723
|
+
|
|
724
|
+
No vendor wrappers in this slice. No API surface change. Doc + infra only.
|
|
725
|
+
|
|
726
|
+
See `packages/core/docs/adr/ADR-004-vendor-isolation-policy.md` §6 (Migration
|
|
727
|
+
Plan, Slice 0) and `packages/core/docs/prd/PRD-001-vendor-isolation-execution.md`.
|
|
728
|
+
|
|
729
|
+
- 00e0525: feat(core,eslint-config): ADR-004 Slice 1 — T2 utils vendoring
|
|
730
|
+
|
|
731
|
+
Vendor 8 T2 utility libs (re-export wrappers only) into
|
|
732
|
+
`packages/core/src/vendors/<Lib>/`, migrating all direct imports across
|
|
733
|
+
the core, and add a `no-restricted-imports` ESLint rule (severity `warn`)
|
|
734
|
+
that enforces the policy in `@apollion-dsi/eslint-config`.
|
|
735
|
+
|
|
736
|
+
**Vendored libs (T2 utils, 8 wrappers × 4 files):**
|
|
737
|
+
- Nanoid (4 sites)
|
|
738
|
+
- LodashDebounce (2)
|
|
739
|
+
- ObjectHash (1)
|
|
740
|
+
- Deepmerge (1)
|
|
741
|
+
- Color (3 — incl. Surface.test.tsx)
|
|
742
|
+
- FastDeepEqual (1)
|
|
743
|
+
- EmotionIsPropValid (2)
|
|
744
|
+
- StyledNormalize (1)
|
|
745
|
+
|
|
746
|
+
**Each vendor ships with:**
|
|
747
|
+
- `component.ts` — typed re-export of the absorbed surface
|
|
748
|
+
- `interface.ts` — DS-owned contract (skeleton for S1; full opinionated
|
|
749
|
+
shape will land per-lib in S2-S4 where DS opinion matters more)
|
|
750
|
+
- `index.ts` — barrel
|
|
751
|
+
- `README.md` — skeleton with `## What this vendor wraps` etc. — full
|
|
752
|
+
pass in S5
|
|
753
|
+
|
|
754
|
+
**ESLint rule (`@apollion-dsi/eslint-config`):**
|
|
755
|
+
- Path-scoped to `packages/core/src/**/*.{ts,tsx}`
|
|
756
|
+
- Allows direct upstream imports inside `packages/core/src/vendors/**`
|
|
757
|
+
- Severity `warn` in S1-S5 (grace period); flips to `error` in S6
|
|
758
|
+
- Other workspaces unaffected (paths don't match)
|
|
759
|
+
|
|
760
|
+
**Backward-compatible:** vendors are internal (esbuild skips the folder,
|
|
761
|
+
generate-exports.js doesn't list them, validate.sh's
|
|
762
|
+
`check-vendors-not-published.js` keeps the invariant). Consumer-side import
|
|
763
|
+
surface (`@apollion-dsi/core/elements/button` etc.) unchanged.
|
|
764
|
+
|
|
765
|
+
Bundle delta target: ≤ 0 KB gzip (re-exports are inlined by esbuild).
|
|
766
|
+
|
|
767
|
+
Refs:
|
|
768
|
+
- `packages/core/docs/adr/ADR-004-vendor-isolation-policy.md` §6 Slice 1
|
|
769
|
+
- `packages/core/docs/prd/PRD-001-vendor-isolation-execution.md` §S1
|
|
770
|
+
|
|
771
|
+
- 1c87be8: feat(core,eslint-config): ADR-004 S2 — T1 UI primitives vendoring
|
|
772
|
+
|
|
773
|
+
Vendor 4 T1 UI primitive libs into `packages/core/src/vendors/<Lib>/`
|
|
774
|
+
and migrate 12 direct import sites. Extends the ESLint
|
|
775
|
+
`no-restricted-imports` rule (warn) to cover the new vendors.
|
|
776
|
+
|
|
777
|
+
**Vendored libs (T1 UI, 4 × 4 files):**
|
|
778
|
+
- FramerMotion (6 sites: Modal, Notification × 3, Flex.style, Base.style)
|
|
779
|
+
- Absorbed: `motion`, `AnimatePresence`, `MotionConfig`, `useReducedMotion`, `MotionProps`
|
|
780
|
+
- Gap: gestures, drag, useAnimate, useScroll, layoutGroup (intentional — DS doesn't expose full expressiveness)
|
|
781
|
+
- TippyHeadless (3 sites: Dropdown, Tooltip × 2)
|
|
782
|
+
- Absorbed: `Tippy` default + `TippyProps`
|
|
783
|
+
- Uses headless entry only (no embedded CSS)
|
|
784
|
+
- ReactContentLoader (2 sites: ComposedSkeleton × 2)
|
|
785
|
+
- Absorbed: `ContentLoader`, `BulletList`, `Code`, `Facebook`, `List`, `IContentLoaderProps`
|
|
786
|
+
- ReactWindow (1 site: DataTable)
|
|
787
|
+
- Absorbed: `FixedSizeList` only
|
|
788
|
+
|
|
789
|
+
Backward-compatible. Bundle delta target ≤ +0.1 KB gzip per ADR-004 §6.
|
|
790
|
+
Snapshot tests Modal/Notification (framer consumers) inalterados.
|
|
791
|
+
|
|
792
|
+
Refs:
|
|
793
|
+
- `packages/core/docs/adr/ADR-004-vendor-isolation-policy.md` §6 Slice 2
|
|
794
|
+
- `packages/core/docs/prd/PRD-001-vendor-isolation-execution.md` §S2
|
|
795
|
+
|
|
796
|
+
- d1192da: feat(core,eslint-config): ADR-004 S3 — T1 form/validation vendoring
|
|
797
|
+
|
|
798
|
+
Vendor 3 T1 form/validation libs into `packages/core/src/vendors/<Lib>/`
|
|
799
|
+
and migrate 13 direct import sites. Slice mais opinativo do épico
|
|
800
|
+
ADR-004 — `interface.ts` faz o exercício real de "contrato ideal do DS,
|
|
801
|
+
não espelho da lib" (ADR-004 §6 S3).
|
|
802
|
+
|
|
803
|
+
**Vendored libs (T1 form/validation, 3 × 4 files):**
|
|
804
|
+
- **Formik** (4 sites: Form.{interface,tsx,helpers}, Field.interface)
|
|
805
|
+
- Absorbed runtime: `useFormik` apenas (DS expõe `Form`/`Field`/`FieldGroup` próprios)
|
|
806
|
+
- Absorbed types: `FormikErrors`, `FormikHelpers`, `FormikProps`, `FormikSharedConfig`
|
|
807
|
+
- Gap intencional: `<Field>`, `<FieldArray>`, `<ErrorMessage>`, `Formik`, `FormikProvider`, `useFormikContext`, `useField`, `withFormik`, wizards
|
|
808
|
+
- **Yup** (4 sites: Form.{interface,tsx,helpers}, story.tsx)
|
|
809
|
+
- Absorbed: namespace inteiro via `export *` — preserva padrão `import * as Yup`
|
|
810
|
+
- Justificativa: Yup é DSL; restringir builders quebra expressividade
|
|
811
|
+
- **ReactSelect** (5 sites: InputSelect.{tsx,interface}, DropdownIndicator)
|
|
812
|
+
- Sync + `/async` consolidados em 1 wrapper
|
|
813
|
+
- Absorbed runtime: `DefaultSelect`, `AsyncSelect`, `components`
|
|
814
|
+
- Absorbed types: `DropdownIndicatorProps`, `ReactSelectProps` (re-export renomeado de `Props`)
|
|
815
|
+
- Gap: `Creatable`, `formatGroupLabel`, `MenuListProps`, `MultiValue`, sortable
|
|
816
|
+
|
|
817
|
+
ESLint rule estendida para cobrir `formik`, `react-select`,
|
|
818
|
+
`react-select/async`, `yup` com severidade `warn` (flips em S6).
|
|
819
|
+
|
|
820
|
+
Backward-compatible. Bundle delta target ≤ +0.1 KB gzip em `lib/form/form/`.
|
|
821
|
+
|
|
822
|
+
Refs:
|
|
823
|
+
- `packages/core/docs/adr/ADR-004-vendor-isolation-policy.md` §6 Slice 3
|
|
824
|
+
- `packages/core/docs/prd/PRD-001-vendor-isolation-execution.md` §S3
|
|
825
|
+
|
|
826
|
+
- 3194fba: feat(core,eslint-config): ADR-004 S4 — T1 data/routing vendoring
|
|
827
|
+
|
|
828
|
+
Vendor 2 T1 data/routing libs into `packages/core/src/vendors/<Lib>/`
|
|
829
|
+
and migrate 7 direct import sites.
|
|
830
|
+
|
|
831
|
+
**Vendored libs (T1 data/routing, 2 × 4 files):**
|
|
832
|
+
- **ReactRouterDom** (5 sites: Link.style, Link.interface, Link.test,
|
|
833
|
+
List/story, Link/story)
|
|
834
|
+
- Absorbed runtime: `Link`, `MemoryRouter` (stories + tests apenas)
|
|
835
|
+
- Absorbed types: `LinkProps`
|
|
836
|
+
- Gap intencional: tudo o mais. Decisão consciente (ADR-004 §9 Q3):
|
|
837
|
+
DS não deve ditar router. Reabsorver é diff por símbolo + entrada
|
|
838
|
+
de roadmap. `BrowserRouter`, `Route`, `Routes`, `Outlet`,
|
|
839
|
+
`useNavigate`, `useLocation`, `useParams`, `NavLink`, `Navigate`
|
|
840
|
+
não absorvidos.
|
|
841
|
+
- **TanstackReactTable** (2 sites: DataTable.tsx multi-import + DataTable.interface)
|
|
842
|
+
- Absorbed runtime: `useReactTable`, `flexRender`, `getCoreRowModel`,
|
|
843
|
+
`getSortedRowModel`, `getFilteredRowModel`
|
|
844
|
+
- Absorbed types: `ColumnDef`, `Row`, `RowSelectionState`,
|
|
845
|
+
`SortingState`
|
|
846
|
+
- Gap: `getExpandedRowModel`, `getGroupedRowModel`,
|
|
847
|
+
`getPaginationRowModel`, `getFacetedRowModel` + types `Cell`,
|
|
848
|
+
`Header`, `Table`, `RowModel`, `Column`, etc. — features que
|
|
849
|
+
DataTable do core não suporta hoje.
|
|
850
|
+
|
|
851
|
+
ESLint rule estendida (warn) cobrindo `@tanstack/react-table` e
|
|
852
|
+
`react-router-dom`.
|
|
853
|
+
|
|
854
|
+
Backward-compatible. Validate target verde (180+ tests, snapshots
|
|
855
|
+
inalterados em DataTable/Link).
|
|
856
|
+
|
|
857
|
+
Refs:
|
|
858
|
+
- `packages/core/docs/adr/ADR-004-vendor-isolation-policy.md` §6 Slice 4
|
|
859
|
+
- `packages/core/docs/prd/PRD-001-vendor-isolation-execution.md` §S4
|
|
860
|
+
|
|
861
|
+
- f359982: docs(core): ADR-004 S5 — Vendor README full pass
|
|
862
|
+
|
|
863
|
+
Preenche os 17 vendor READMEs (skeleton → completo) com 3 seções
|
|
864
|
+
padronizadas + atualiza ROADMAP com 6 entradas derivadas de gaps:
|
|
865
|
+
|
|
866
|
+
**Cada vendor README agora tem:**
|
|
867
|
+
- `## What this vendor wraps` — npm link + versão exata + tabela
|
|
868
|
+
símbolo → tipo → uso no core
|
|
869
|
+
- `## DS Absorption Gap` — bullet do que ficou fora + rationale + link
|
|
870
|
+
ROADMAP quando candidato
|
|
871
|
+
- `## Replacement candidates` — libs concorrentes com trade-off explícito
|
|
872
|
+
- "When to consider" + triggers de troca quantificados
|
|
873
|
+
|
|
874
|
+
**Novas entradas em ROADMAP.md (🟡 Next):**
|
|
875
|
+
1. Migrate ReactWindow → @tanstack/react-virtual (Low burn, consolida ecosystem)
|
|
876
|
+
2. Migrate TippyHeadless → @floating-ui/react (Medium burn, sucessor natural)
|
|
877
|
+
3. Router-agnostic Link — remove react-router-dom dep (Medium, candidato ADR-006)
|
|
878
|
+
4. DataTable absorption gaps (expandable rows, pagination, etc.)
|
|
879
|
+
5. FormWizard absorption + Combobox replacement evaluation
|
|
880
|
+
6. Zod/Valibot evaluation paired with form library refactor
|
|
881
|
+
|
|
882
|
+
**Resolve numbering conflict:**
|
|
883
|
+
- ADR-003 (file) = Visual regression (não "v4 epic")
|
|
884
|
+
- ADR-005 = styled-components facade (placeholder)
|
|
885
|
+
- ADR-006 = v4 epic (OKLch + Dimension + token-only) — renomeado de "ADR-003"
|
|
886
|
+
|
|
887
|
+
Remove entrada duplicada "Visual regression suite (Chromatic)" de 🟡 Next
|
|
888
|
+
(agora coberta por ADR-003).
|
|
889
|
+
|
|
890
|
+
Doc-only. Sem mudança de código/API. Patch bump.
|
|
891
|
+
|
|
892
|
+
Refs:
|
|
893
|
+
- packages/core/docs/adr/ADR-004-vendor-isolation-policy.md §6 Slice 5
|
|
894
|
+
- packages/core/docs/prd/PRD-001-vendor-isolation-execution.md §S5
|
|
895
|
+
|
|
896
|
+
- 5d17ebc: feat(core, eslint-config): ADR-005 — styled-components vendor facade
|
|
897
|
+
|
|
898
|
+
Closes the Vendor Isolation epic (ADR-004 §5 leftover). styled-components
|
|
899
|
+
becomes vendor #18 under `packages/core/src/vendors/StyledComponents/`,
|
|
900
|
+
following the same canonical 4-file shape used by the other vendors.
|
|
901
|
+
|
|
902
|
+
**Core (`@apollion-dsi/core`):**
|
|
903
|
+
- New `vendors/StyledComponents/{component.ts, interface.ts, index.ts,
|
|
904
|
+
README.md, StyledComponents.test.ts}`. Wrapper re-exports the surface
|
|
905
|
+
consumed by the core (runtime: `styled`, `css`, `keyframes`,
|
|
906
|
+
`ThemeProvider`, `StyleSheetManager`, `createGlobalStyle`, `useTheme`;
|
|
907
|
+
types: `CSSObject`, `DefaultTheme`, `Interpolation`, `IStyledComponent`,
|
|
908
|
+
`RuleSet`, `Styled`).
|
|
909
|
+
- `DefaultTheme extends Theme` augmentation moved out of
|
|
910
|
+
`src/typings/index.d.ts` into the co-located `vendors/StyledComponents/
|
|
911
|
+
interface.ts`. `typings/index.d.ts` reduced to `@testing-library/jest-dom` - the legacy `react-table` module declaration.
|
|
912
|
+
- 62 sites under `src/**/*.{ts,tsx}` codemoded from `import ... from
|
|
913
|
+
'styled-components'` to the vendor wrapper via the new
|
|
914
|
+
`scripts/migrate-styled-components-imports.js` helper. READMEs in
|
|
915
|
+
`containers/Base/README.{mdx,AI.md}` preserved — consumer-facing examples
|
|
916
|
+
must keep showing `from 'styled-components'`.
|
|
917
|
+
- `@types/styled-components@5.1.36` removed from `devDependencies` — dead
|
|
918
|
+
for `styled-components@6.x`, which ships its own `dist/index.d.ts`.
|
|
919
|
+
- Vendor test verifies (a) singleton — wrapper re-exports identical
|
|
920
|
+
upstream runtime references, (b) `Theme` `satisfies DefaultTheme` at
|
|
921
|
+
compile time, (c) `useTheme()` returns the `Theme`-shaped object injected
|
|
922
|
+
by `<ApollionProvider>`.
|
|
923
|
+
|
|
924
|
+
**ESLint config (`@apollion-dsi/eslint-config`):**
|
|
925
|
+
- New `VENDORED_STYLED_LIBS = ['styled-components']` group folded into
|
|
926
|
+
`VENDORED_LIBS`. The existing `no-restricted-imports` rule now blocks
|
|
927
|
+
direct `from 'styled-components'` in `packages/core/src/**` (vendor
|
|
928
|
+
directory remains exempt). Severity `error` from day one — the codemod
|
|
929
|
+
guarantees zero violations before the rule activates, so the
|
|
930
|
+
warn-intermediate phase originally proposed in ADR-005 §6 S3 was
|
|
931
|
+
skipped (documented in ADR-005 §11.2).
|
|
932
|
+
|
|
933
|
+
Non-breaking: consumer-facing API and `ApollionProvider` behavior
|
|
934
|
+
unchanged. See `packages/core/docs/adr/ADR-005-styled-components-vendor-facade.md`
|
|
935
|
+
§11 for the full set of deviations between the planned and executed slices.
|
|
936
|
+
|
|
937
|
+
- 6545751: docs(core): ADR-007 — Zod v4 idiomatic corrections + shadow-PoC S1 wording
|
|
938
|
+
|
|
939
|
+
Atualiza ADR-007 (Form stack migration) com correções pós grill-with-docs
|
|
940
|
+
(2026-05-27) sobre as APIs externas reais:
|
|
941
|
+
- **§S1 wording:** clarifica que S1 é **shadow-PoC em arquivo novo**
|
|
942
|
+
(`poc-rhf-zod.tsx`), NÃO migração do example atual. Examples atuais usam
|
|
943
|
+
`<Form>` do DS que ainda é Formik-backed em S0/S1 — migrar example exige
|
|
944
|
+
S2 (DS Form refactor) primeiro. Shadow-PoC destrava sem reverter ordem.
|
|
945
|
+
- **§S2 + §7 PoC code:** validation API muda de `validateOnChange`/
|
|
946
|
+
`validateOnBlur` booleans → `mode?: Mode` direto (breaking aceito em
|
|
947
|
+
v4.0.0). Mode type vendored em S0 follow-up.
|
|
948
|
+
- **§7 Yup→Zod mapping:** atualizado para Zod v4 idiomatic:
|
|
949
|
+
- `z.string().email()` → `z.email()` (top-level)
|
|
950
|
+
- `Yup.string().required()` → `z.string().min(1, 'msg')`
|
|
951
|
+
- `Yup.boolean().required()` → `z.boolean().refine((v) => v === true, ...)`
|
|
952
|
+
- `z.ZodIssueCode.custom` → `'custom'` string literal
|
|
953
|
+
- Nota sobre `z.unknown()` não ser optional por default em v4.
|
|
954
|
+
- **§7 BasicFormExample concrete mapping** adicionado — fonte de verdade
|
|
955
|
+
do S1 PoC schema.
|
|
956
|
+
- **§7 Zod v4 breaking changes table** adicionada com 10 entries cobrindo
|
|
957
|
+
todas as APIs usadas no PoC.
|
|
958
|
+
- **§8 Risks #6 atualizado:** validation API direct mode (não mais
|
|
959
|
+
mapping interno boolean→enum).
|
|
960
|
+
- **§8 Risks #9 + #10 adicionados:** Zod v4 `z.unknown()` não-optional
|
|
961
|
+
por default; `.refine()` removeu type narrowing via predicate.
|
|
962
|
+
- **§S0 marcado MERGED** com commits + 3 changesets gerados.
|
|
963
|
+
- **Status do ADR:** 📝 Proposed → 🚧 In Progress.
|
|
964
|
+
|
|
965
|
+
Doc-lock cross-checked contra `.d.ts` locais de `react-hook-form@7.76.1`,
|
|
966
|
+
`@hookform/resolvers@5.4.0` e `zod@4.4.3`, suplementado com WebFetch de
|
|
967
|
+
zod.dev/v4/changelog.
|
|
968
|
+
|
|
969
|
+
- 36eaf4a: feat(core): ADR-007 S0 follow-up — expose `Mode` type in ReactHookForm vendor
|
|
970
|
+
|
|
971
|
+
Adiciona `Mode` (`'onSubmit' | 'onBlur' | 'onChange' | 'onTouched' | 'all'`)
|
|
972
|
+
ao surface re-exportado de `vendors/ReactHookForm/interface.ts`. Necessário
|
|
973
|
+
para `Form.interface.ts#FormCommonInterface['mode']` em S2 — substitui o par
|
|
974
|
+
booleano legado `validateOnChange?`/`validateOnBlur?` do Formik (decisão
|
|
975
|
+
fixada via tech-radar pass 2026-05-27).
|
|
976
|
+
|
|
977
|
+
Surface change pequena, isolada à interface do vendor. Zero impacto
|
|
978
|
+
runtime — só types.
|
|
979
|
+
|
|
980
|
+
Ver `packages/core/src/vendors/ReactHookForm/README.md` para tabela
|
|
981
|
+
atualizada.
|
|
982
|
+
|
|
983
|
+
- 802828f: feat(core): ADR-007 S0 — react-hook-form vendor scaffold
|
|
984
|
+
|
|
985
|
+
Adds `packages/core/src/vendors/ReactHookForm/` (4 arquivos no padrão
|
|
986
|
+
ADR-004): re-export tipado de `useForm`, `Controller`, `useFormContext`,
|
|
987
|
+
`useFieldArray` + bridge adapter `zodResolver` (de `@hookform/resolvers/zod`)
|
|
988
|
+
co-localizado para evitar dois call-sites distintos.
|
|
989
|
+
|
|
990
|
+
Deps adicionadas (exact pin, latest stable):
|
|
991
|
+
- `react-hook-form@7.76.1`
|
|
992
|
+
- `@hookform/resolvers@5.4.0`
|
|
993
|
+
|
|
994
|
+
Vendor wrapper isolado — ainda não consumido pelo core (S2 migra
|
|
995
|
+
`form/Form/Form.tsx`). Zero impacto runtime nesta slice. `vendors/Zod/`
|
|
996
|
+
já existe desde ADR-006 S6 e cobre a surface de schema requerida — sem
|
|
997
|
+
duplicação.
|
|
998
|
+
|
|
999
|
+
Pre-flight verificado: lint, check-types e prettier verdes; sem violações
|
|
1000
|
+
da regra `no-restricted-imports` (codemod do core acontece em S2).
|
|
1001
|
+
|
|
1002
|
+
Ver `packages/core/docs/adr/ADR-007-form-stack-rhf-zod.md` §6 Slice 0
|
|
1003
|
+
e `docs/ROADMAP.md` §🟡 Next "Form stack migration — Formik+Yup → RHF+Zod".
|
|
1004
|
+
|
|
1005
|
+
- e14469c: feat(core): ADR-007 S2 — DS Form internals migrated Formik+Yup → RHF+Zod
|
|
1006
|
+
|
|
1007
|
+
Migra os 4 arquivos core do `form/` do stack Formik+Yup para React Hook
|
|
1008
|
+
Form + Zod, dentro do escopo de [vendors/ReactHookForm](src/vendors/ReactHookForm)
|
|
1009
|
+
e [vendors/Zod](src/vendors/Zod) (ADR-004 vendor isolation). Single
|
|
1010
|
+
commit no padrão "vertical-slice":
|
|
1011
|
+
|
|
1012
|
+
**Arquivos migrados:**
|
|
1013
|
+
- **`form/Form/Form.tsx`** — `useFormik({...})` → `useForm<any>({ resolver: zodResolver(schema), mode: mode ?? 'onSubmit', defaultValues })`. `useImperativeHandle(ref, () => methods)` agora expõe `UseFormReturn<any>` no lugar de `FormikProps<any>`. `Field` continua recebendo `value`/`errors`/`setFieldValue` via prop (paradigma controlled preservado via `methods.watch()` e `methods.setValue`).
|
|
1014
|
+
- **`form/Form/Form.helpers.ts`** — `getValidationSchema` agora constrói `z.object(shape)`. Default fallback p/ fields sem `validation`: `z.unknown().optional()` (Zod v4 requer `.optional()` explícito — `z.unknown()` não é optional por default em object schemas, mudança vs v3). `prepareSubmit` assinatura aceita `UseFormReturn<any>` no lugar de `FormikHelpers`.
|
|
1015
|
+
- **`form/Form/Form.interface.ts`** — types swap inteiro:
|
|
1016
|
+
- `FormRef = FormikProps<any>` → `FormRef = UseFormReturn<any>` (breaking API ref — major bump em v4)
|
|
1017
|
+
- `validateOnChange?: boolean` + `validateOnBlur?: boolean` → **REMOVIDOS**. Substituídos por `mode?: Mode` enum (`'onSubmit' | 'onBlur' | 'onChange' | 'onTouched' | 'all'`), default `'onSubmit'`. Mapping legacy em MIGRATION-v4.md (ADR-007 §S5).
|
|
1018
|
+
- `validation?: any | (() => any)` → `validation?: ZodTypeAny`
|
|
1019
|
+
- `onError?: (errors: FormikErrors<...>) => void` → `onError?: (errors: FieldErrors<...>) => void`
|
|
1020
|
+
- Workaround `const a = Yup.string().required()` (tree-shake legacy) removido.
|
|
1021
|
+
- **`form/Field/Field.interface.ts`** — `setFieldValue?: FormikHelpers<any>['setFieldValue']` → `setFieldValue?: UseFormSetValue<any>`. Nome da prop preservado para minimizar blast-radius nos primitives (`InputDate`, `InputSelect`, etc. continuam chamando `setFieldValue(name, value)` — assinatura compat). Renome `FormikBaseInterface` → `FormBaseInterface`.
|
|
1022
|
+
- **`form/Form/story.tsx`** (Storybook) — `Yup.string().required('Required')` → `z.string().min(1, 'Required')`; `Yup.string().email()` → `z.email()`. Import de `vendors/Yup` removido.
|
|
1023
|
+
|
|
1024
|
+
**Estado pós-S2:**
|
|
1025
|
+
- `yarn workspace @apollion-dsi/core run validate:tests`: ✅ 317 passed (1 skipped pre-existente), 59 snapshots OK.
|
|
1026
|
+
- `yarn workspace @apollion-dsi/core run check-types`: ✅ verde.
|
|
1027
|
+
- `yarn workspace @apollion-dsi/core run lint`: ✅ zero violations.
|
|
1028
|
+
- `yarn workspace @apollion-dsi/core run build` (esbuild + tsc + Storybook): ✅ verde.
|
|
1029
|
+
- `yarn workspace @apollion-dsi/website run build` (Next.js): ✅ verde.
|
|
1030
|
+
|
|
1031
|
+
**Website examples (`BasicFormExample`, `FormExample`, `DynamicFormExample`) ainda usam Yup schemas:**
|
|
1032
|
+
|
|
1033
|
+
Type check passa via casting permissivo (`validation as ZodSchema`), mas runtime de submit no website QUEBRA (Yup schema sem `.parse()` → `zodResolver` throws). Render OK; submit broken until S3 migra os examples. Esperado per ADR-007 §S2 critério.
|
|
1034
|
+
|
|
1035
|
+
**Bundle delta:** ainda não visível (Yup permanece importado pelos examples website até S3). Re-measure em S3 com examples + smoke pages atualizadas.
|
|
1036
|
+
|
|
1037
|
+
Storybook stories (`Form/story.tsx`) já migradas — Storybook submit funciona end-to-end.
|
|
1038
|
+
|
|
1039
|
+
**Vendors antigos `vendors/Formik/` + `vendors/Yup/`:** preservados sem uso interno até S6 (hard cut em v4.0.0). 0 imports de `formik`/`yup` em `packages/core/src/**` fora dos próprios vendor dirs.
|
|
1040
|
+
|
|
1041
|
+
Ver `packages/core/docs/adr/ADR-007-form-stack-rhf-zod.md` §6 Slice 2.
|
|
1042
|
+
|
|
1043
|
+
- 81cd55b: feat(website): ADR-007 S3 — migrate 8 form examples Yup → Zod + cleanup PoC/smoke
|
|
1044
|
+
|
|
1045
|
+
Completa a migração end-to-end Formik+Yup → RHF+Zod no website:
|
|
1046
|
+
|
|
1047
|
+
**6 example files migrados:**
|
|
1048
|
+
- `website/src/examples/Components/Form/Form/index.tsx` — `BasicFormExample`, `FormExample` (15 fields), `DynamicFormExample` (8 fields + conditional).
|
|
1049
|
+
- `website/src/examples/Components/Form/Field/index.tsx` — `FieldFormExample` (UploadCard).
|
|
1050
|
+
- `website/src/examples/Components/Form/Inputs/Input/index.tsx` — `InputFormExample`.
|
|
1051
|
+
- `website/src/examples/Components/Form/Inputs/InputDate/index.tsx` — `InputDateFormExample`.
|
|
1052
|
+
- `website/src/examples/Components/Form/Inputs/InputMask/index.tsx` — `InputMaskDateExample`.
|
|
1053
|
+
- `website/src/examples/Components/Form/Inputs/InputSelect/index.tsx` — `InputSelectExampleButton`.
|
|
1054
|
+
|
|
1055
|
+
**Mapping aplicado** (consistente com MIGRATION-v4.md ADR-007 §S5):
|
|
1056
|
+
|
|
1057
|
+
| Yup pattern | Zod v4 equivalent |
|
|
1058
|
+
| ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
1059
|
+
| `Yup.string().required('msg')` | `z.string().min(1, 'msg')` |
|
|
1060
|
+
| `Yup.string().email('m1').required('m2')` | `z.email('m1')` (top-level v4) |
|
|
1061
|
+
| `Yup.boolean().required('msg')` | `z.boolean()` (matches Yup loose `.required` semantics) |
|
|
1062
|
+
| `Yup.number().required('msg')` | `z.coerce.number()` (HTML inputs return string) |
|
|
1063
|
+
| `Yup.mixed().test('hasFile', 'm', fn)` | `z.unknown().refine(fn, { message: 'm' })` |
|
|
1064
|
+
| `Yup.mixed().test(date).required()` | `z.string().min(1, 'Required').refine(dateValid, { message: 'm' })` |
|
|
1065
|
+
| `Yup.string().required()` on InputSelect/FieldGroup (object/array stores) | `z.unknown().refine((v) => !!v, { message: 'Required' })` (preserve Yup permissive coercion) |
|
|
1066
|
+
|
|
1067
|
+
**Cleanup:**
|
|
1068
|
+
- ❌ `website/src/examples/Components/Form/Form/poc-rhf-zod.tsx` — deletado (shadow-PoC obsoleto; `BasicFormExample` agora cobre o mesmo pattern via DS `<Form>` migrado).
|
|
1069
|
+
- ❌ `website/pages/docs/smoke-form-poc-rhf-zod.mdx` — deletado (instrumentação S1).
|
|
1070
|
+
- ❌ `website/pages/docs/smoke-form-basic-formik.mdx` — deletado (instrumentação S1).
|
|
1071
|
+
|
|
1072
|
+
**Bundle re-measurement (Next.js First Load JS):**
|
|
1073
|
+
|
|
1074
|
+
| Page | Pre-S0 (Formik+Yup) | Post-S3 (RHF+Zod) | Δ |
|
|
1075
|
+
| -------------- | ------------------: | ----------------: | ------------: |
|
|
1076
|
+
| `form-basic` | 417 kB | 422 kB | +5 kB / +1.2% |
|
|
1077
|
+
| `form-dynamic` | 417 kB | 422 kB | +5 kB / +1.2% |
|
|
1078
|
+
| `form-form` | 417 kB | 422 kB | +5 kB / +1.2% |
|
|
1079
|
+
|
|
1080
|
+
**Δ NEGATIVO vs ADR-007 target** (≥15% redução; alvo 21%). Análise honesta:
|
|
1081
|
+
- Zod v4 com features atuais (`z.email`, `z.coerce`, `z.refine`, `z.string().min`) ship mais bytes que o subset de Yup usado previamente.
|
|
1082
|
+
- Formik (~13kB) → RHF (~10kB) shrink ~3kB.
|
|
1083
|
+
- Yup (~15kB) → Zod (~15-18kB) wash or slight growth.
|
|
1084
|
+
- Net: bundle parity, com leve growth devido a Zod ser mais "feature-rich" em runtime.
|
|
1085
|
+
|
|
1086
|
+
**Benefícios do migration (realizados, independente do bundle):**
|
|
1087
|
+
- ✅ Ecosystem alignment 2024-2026+: RHF + Zod dominantes em TS-first stacks.
|
|
1088
|
+
- ✅ TypeScript SSOT via `z.infer<typeof schema>` (Yup exigia tipo manual `Values<T>`).
|
|
1089
|
+
- ✅ Future-proofing: Formik+Yup com manutenção decrescente, React 19/20 risk.
|
|
1090
|
+
- ✅ Vendor isolation paga: refactor cirúrgico em 4 arquivos core + 6 examples.
|
|
1091
|
+
- ✅ Apollion como gold-standard do ecosystem mantém alinhamento com mercado.
|
|
1092
|
+
|
|
1093
|
+
**Acceptance Criteria ADR-007:**
|
|
1094
|
+
- ✅ 0 imports diretos de `formik`/`yup` em `packages/core/src/**` e `website/src/**` (fora dos vendors).
|
|
1095
|
+
- ✅ 0 imports diretos de `react-hook-form`/`zod`/`@hookform/resolvers/zod` em core fora de `vendors/`.
|
|
1096
|
+
- ⚠️ Bundle delta target ≥15%: **NÃO atingido** (medição real: +1.2% growth). Documentado como finding honesto. Justificativa do migration permanece válida (ecosystem + maintenance + TS).
|
|
1097
|
+
- ✅ `yarn validate` verde nos 4 workspaces.
|
|
1098
|
+
- ✅ 317 tests passed (1 skipped pre-existente), 59 snapshots OK.
|
|
1099
|
+
|
|
1100
|
+
Vendors `vendors/Formik/` + `vendors/Yup/` permanecem sem uso interno até S6 hard cut em v4.0.0.
|
|
1101
|
+
|
|
1102
|
+
Ver `packages/core/docs/adr/ADR-007-form-stack-rhf-zod.md` §6 Slice 3.
|
|
1103
|
+
|
|
1104
|
+
- c57c548: docs(core): ADR-007 S4+S5 — README sweep + MIGRATION-v4.md draft
|
|
1105
|
+
|
|
1106
|
+
**S4 — README + AI docs sweep (12 arquivos):**
|
|
1107
|
+
|
|
1108
|
+
MDX docs (4):
|
|
1109
|
+
- `form/Form/README.mdx` — exemplos Yup → Zod v4 idiomatic.
|
|
1110
|
+
- `form/Field/README.mdx` — exemplos Yup → Zod; "(Formik)" → "(RHF + Zod)".
|
|
1111
|
+
- `form/InputDate/README.mdx` — `Yup.mixed().test(date)` → `z.string().min(1).refine(date)`.
|
|
1112
|
+
- `form/InputMask/README.mdx` — mesma migration de date validator.
|
|
1113
|
+
|
|
1114
|
+
AI docs (8):
|
|
1115
|
+
- `form/Form/README.AI.md` — reescrita full (purpose, props table com `mode`,
|
|
1116
|
+
examples Zod, do-not section atualizada).
|
|
1117
|
+
- `form/Field/README.AI.md` — referências "Formik" → "RHF + Zod"; exemplo
|
|
1118
|
+
inside-form com Zod.
|
|
1119
|
+
- `form/Checkbox/README.AI.md`, `form/InputCurrency/README.AI.md`,
|
|
1120
|
+
`form/InputDate/README.AI.md`, `form/InputMask/README.AI.md`,
|
|
1121
|
+
`form/InputRange/README.AI.md`, `form/InputSelect/README.AI.md`,
|
|
1122
|
+
`form/TextArea/README.AI.md` — `<related>` section "Form orquestra
|
|
1123
|
+
validação Yup" → "Zod"; exemplos Yup migrados onde presentes.
|
|
1124
|
+
|
|
1125
|
+
**DEPRECATED headers nos vendors antigos:**
|
|
1126
|
+
- `vendors/Formik/README.md` — ⚠️ DEPRECATED header apontando ReactHookForm
|
|
1127
|
+
- ADR-007 §S6.
|
|
1128
|
+
- `vendors/Yup/README.md` — ⚠️ DEPRECATED header apontando Zod + ADR-007 §S6.
|
|
1129
|
+
|
|
1130
|
+
**S5 — MIGRATION-v4.md draft:**
|
|
1131
|
+
|
|
1132
|
+
Cria `packages/core/MIGRATION-v4.md` com seção "Form stack migration"
|
|
1133
|
+
cobrindo:
|
|
1134
|
+
- §1 Resumo do impacto (7 surfaces com migration cost por linha).
|
|
1135
|
+
- §2 Mapping Yup → Zod v4 (cheat sheet com 20+ patterns).
|
|
1136
|
+
- §3 `validateOnChange`/`validateOnBlur` → `mode` (com diff blocks).
|
|
1137
|
+
- §4 `onError` callback shape (FormikErrors → FieldErrors).
|
|
1138
|
+
- §5 `handleSubmit` second arg (FormikHelpers → UseFormReturn method map).
|
|
1139
|
+
- §6 Ref imperativa (FormikProps → UseFormReturn).
|
|
1140
|
+
- §7 Type inference (`z.infer<typeof schema>` SSOT vs `Values<T>` manual).
|
|
1141
|
+
- §8 Migration steps consumer-side (7 passos).
|
|
1142
|
+
- §9 Bundle delta esperado (medição real + análise honesta).
|
|
1143
|
+
- §10 Refs (ADR-007, ADR-004, Zod v4 changelog, RHF docs).
|
|
1144
|
+
|
|
1145
|
+
Status DRAFT — finalizado no merge final do épico v4.0.0.
|
|
1146
|
+
|
|
1147
|
+
**ADR-007 status atualizado:** S0-S5 marcados ✅; S6 (hard cut) ⏳ gated pelo
|
|
1148
|
+
épico v4.0.0 (ADR-006). Acceptance criteria atualizado com checkboxes
|
|
1149
|
+
reais; finding de bundle delta documentado honestamente (NÃO atingido
|
|
1150
|
+
target; justificativa migration permanece válida).
|
|
1151
|
+
|
|
1152
|
+
Vendors `Formik`/`Yup` permanecem (sem uso interno) até S6 hard cut.
|
|
1153
|
+
|
|
1154
|
+
Ver `packages/core/docs/adr/ADR-007-form-stack-rhf-zod.md` §6 Slice 4 + 5
|
|
1155
|
+
- §10 Acceptance Criteria atualizado.
|
|
1156
|
+
|
|
1157
|
+
- e55019a: chore(security): bump Storybook 8.6.9 → 8.6.18 + force `uuid` to 11.1.1
|
|
1158
|
+
|
|
1159
|
+
DevDeps-only — no consumer-facing API change. Closes three security
|
|
1160
|
+
advisories surfaced by `yarn audit-dependencies` (after the audit pipeline
|
|
1161
|
+
itself was migrated off the broken `audit-ci@7.1.0` Yarn Berry handler in
|
|
1162
|
+
the same cycle):
|
|
1163
|
+
- **High** — Storybook manager bundle env-var exposure during build
|
|
1164
|
+
(GHSA-8452-54wp-rmv6, fixed in `storybook >=8.6.15`).
|
|
1165
|
+
- **High** — Storybook Dev Server WebSocket Hijacking
|
|
1166
|
+
(GHSA-mjf5-7g4m-gx5w, fixed in `storybook >=8.6.17`).
|
|
1167
|
+
- **Moderate** — `uuid` missing buffer bounds check in v3/v5/v6
|
|
1168
|
+
(GHSA-w5hq-g745-h8pq, fixed in `uuid >=11.1.1`). Forced via root
|
|
1169
|
+
`resolutions` since `@storybook/addon-actions` + `jest-junit` would
|
|
1170
|
+
otherwise keep transitive `uuid@8.3.2` / `uuid@9.0.1`.
|
|
1171
|
+
|
|
1172
|
+
Verified:
|
|
1173
|
+
- `yarn install` clean.
|
|
1174
|
+
- `yarn workspace @apollion-dsi/core build-storybook` succeeds.
|
|
1175
|
+
- Visual regression suite (chromium, 133/133) idempotent — matches the
|
|
1176
|
+
pre-push hook default.
|
|
1177
|
+
- `yarn audit-dependencies` no longer reports any of the three
|
|
1178
|
+
advisories above.
|
|
1179
|
+
|
|
1180
|
+
- 51f71f6: fix(core): emit `.d.ts` for every subpath entry (v4 build follow-up)
|
|
1181
|
+
|
|
1182
|
+
`packages/core/tsconfig.json` used `files: ["src/index.ts"]` as its only
|
|
1183
|
+
entry point. After ADR-006 §3.7 E7 emptied the root barrel in v4.0.0,
|
|
1184
|
+
that entry walks to nothing — `tsc --emitDeclarationOnly` produced a
|
|
1185
|
+
single `lib/index.d.ts` while `esbuild` emitted 217 `.esm.js` files for
|
|
1186
|
+
every subpath barrel discovered via `findEntryPoints`. Consumers
|
|
1187
|
+
importing `@apollion-dsi/core/themes/colors`, `@apollion-dsi/core/elements/
|
|
1188
|
+
button`, etc. got runtime JS but `any`-typed modules — which only became
|
|
1189
|
+
visible when `@apollion-dsi/tokens` validate started failing with TS7016
|
|
1190
|
+
"Could not find a declaration file" against the published subpaths.
|
|
1191
|
+
|
|
1192
|
+
The same bug also reduced `yarn check-types` to a near no-op: since
|
|
1193
|
+
`src/index.ts` no longer imported anything, `tsc --noEmit` only checked
|
|
1194
|
+
that one file and silently ignored real type errors in the remaining 200+
|
|
1195
|
+
modules of the source tree.
|
|
1196
|
+
|
|
1197
|
+
Switches the config to `include: ["src/**/*"]` with explicit excludes for
|
|
1198
|
+
test files (`*.test.{ts,tsx}`, `__tests__/**`) and Storybook stories
|
|
1199
|
+
(`story.{ts,tsx}`, `__stories__/**`) — neither of which should ship type
|
|
1200
|
+
declarations. Post-fix:
|
|
1201
|
+
- `lib/` carries 430 `.d.ts` files (covering all 217 ESM entries plus
|
|
1202
|
+
pure-type interface files), matching the surface declared in
|
|
1203
|
+
`package.json#exports`.
|
|
1204
|
+
- `lib/vendors/StyledComponents/` ships `.d.ts` only (`component.d.ts`,
|
|
1205
|
+
`interface.d.ts`, `index.d.ts`) — `scripts/check-vendors-not-published.js`
|
|
1206
|
+
remains green (the script only forbids `.js` under `lib/vendors/`).
|
|
1207
|
+
- `yarn check-types` now type-checks the entire `src/**` tree.
|
|
1208
|
+
- No new TypeScript errors surfaced — the existing source tree was
|
|
1209
|
+
internally consistent; it just wasn't being checked.
|
|
1210
|
+
|
|
1211
|
+
Pure build-config fix. No runtime change, no public API change. Patch
|
|
1212
|
+
bump.
|
|
1213
|
+
|
|
1214
|
+
- 0a1baeb: chore(core): coverage re-baseline — exclude boilerplate, honest floors
|
|
1215
|
+
|
|
1216
|
+
Apply coverage exclusions em `packages/core/jest.config.js` +
|
|
1217
|
+
`packages/relay/jest.config.js` para boilerplate sem business logic
|
|
1218
|
+
testável:
|
|
1219
|
+
- `/vendors/` — wrappers re-export-only (re-exports a 100% statements
|
|
1220
|
+
- 0-50% functions noise via IIFE wrappers ts-jest).
|
|
1221
|
+
- `*.story.tsx` — Storybook stories (visual coverage via visual-gate).
|
|
1222
|
+
- `*.interface.ts` — type-only files (compile a empty JS = 100% padding).
|
|
1223
|
+
- `*.style.ts` — styled-components (testados via component renders).
|
|
1224
|
+
- `/index.ts` (barrels) — re-exports puros.
|
|
1225
|
+
|
|
1226
|
+
**Impact:** revela coverage real do código com lógica testável.
|
|
1227
|
+
|
|
1228
|
+
| Métrica core | Pre-exclusões | Post-exclusões | Δ |
|
|
1229
|
+
| ------------ | ------------: | -------------: | ------: |
|
|
1230
|
+
| Statements | 69.8% | 61.75% | -8.05pp |
|
|
1231
|
+
| Branches | 50.63% | 50.74% | +0.11pp |
|
|
1232
|
+
| Functions | 56.2% | 48.25% | -7.95pp |
|
|
1233
|
+
| Lines | 69.41% | 62.3% | -7.11pp |
|
|
1234
|
+
|
|
1235
|
+
Drop em statements/functions/lines reflete REMOÇÃO de files inflados
|
|
1236
|
+
(re-exports a 100%, types a 100%) — não regressão real. Branches estável
|
|
1237
|
+
porque excluídos não tinham branches significativos.
|
|
1238
|
+
|
|
1239
|
+
**Thresholds rebaselined** (core/jest.config.js):
|
|
1240
|
+
- `branches`: 48 → 50 (sobe acompanhando actuals)
|
|
1241
|
+
- `functions`: 53 → 47 (cai — honest baseline)
|
|
1242
|
+
- `lines`: 67 → 61
|
|
1243
|
+
- `statements`: 68 → 60
|
|
1244
|
+
|
|
1245
|
+
Buffer ~1-2pp do actuals real. Relay thresholds unchanged (actuals
|
|
1246
|
+
post-exclusion ainda passam).
|
|
1247
|
+
|
|
1248
|
+
**Path para 80% goal** (adoption-readiness, decisão @fedbalves 2026-05-27):
|
|
1249
|
+
|
|
1250
|
+
Top gaps onde testes reais teriam impacto:
|
|
1251
|
+
- `hooks/*` — useDrag/useClipboard/useScript/useProgress/useIntersect/
|
|
1252
|
+
useFileDialog todos <30% statements.
|
|
1253
|
+
- `form/UploadCard` (21%), `form/InputSelect` (51%), `form/InputRange` (55%).
|
|
1254
|
+
- `entities/*` (32%).
|
|
1255
|
+
- `containers/Scroll` (63%).
|
|
1256
|
+
- `elements/Svg` (38%), `elements/Label` (52%).
|
|
1257
|
+
|
|
1258
|
+
Ratchet path: +5pp incremental atrás de feature work TDD-vertical (per
|
|
1259
|
+
strategy original do ROADMAP).
|
|
1260
|
+
|
|
1261
|
+
Ver `docs/ROADMAP.md` §🟡 Next "Coverage ratchet to 80%" — entrada
|
|
1262
|
+
atualizada com baseline honesta + path detalhado.
|
|
1263
|
+
|
|
1264
|
+
- 6d1371e: docs: factual drift sweep + AI-friendly doc surface
|
|
1265
|
+
|
|
1266
|
+
Sincroniza documentação com estado de `main` pós-v3.x (ADR-002 +
|
|
1267
|
+
ADR-004 shipped, ADR-005 escrito) e introduz camada AI-readable
|
|
1268
|
+
(`README.AI.md`, `AGENTS.md`, `llms.txt` por sub-package).
|
|
1269
|
+
|
|
1270
|
+
**Drift corrigido (BLOCKER):**
|
|
1271
|
+
- Root README + core README: Storybook `9` → `8.x` (real: 8.6.9).
|
|
1272
|
+
- ROADMAP: ADR-005 "placeholder/não escrita" → "Proposed" linkando ao
|
|
1273
|
+
arquivo já existente.
|
|
1274
|
+
- `website/README.md`: era boilerplate de Docusaurus 2 — substituído
|
|
1275
|
+
por descrição real (Next 15 + Nextra 2 + copyStorybook).
|
|
1276
|
+
- `website/pages/index.mdx`: remove `npm install` (yarn-only) e
|
|
1277
|
+
amplia scope para citar 3-layer theme + vendor isolation.
|
|
1278
|
+
- `packages/scripts/README.MD`: rebrand de `@captalys-platform/scripts`
|
|
1279
|
+
→ `@apollion-dsi/scripts`; atualiza stack (webpack 5, Babel 7,
|
|
1280
|
+
Jest 30, TS 6); remove `.editorconfig.js`.
|
|
1281
|
+
|
|
1282
|
+
**Novas concept pages no website (IMPORTANT):**
|
|
1283
|
+
- `concept-semantic-tokens.mdx` — explica Foundation/Semantic/Structural
|
|
1284
|
+
(ADR-002).
|
|
1285
|
+
- `concept-surface-inversion.mdx` — `surface="negative"` + limitação
|
|
1286
|
+
mode-agnostic (ADR-002 S4 / refinada em ADR-006).
|
|
1287
|
+
- `concept-vendor-policy.mdx` — política de vendor isolation pública
|
|
1288
|
+
(ADR-004).
|
|
1289
|
+
|
|
1290
|
+
Source canônica em `packages/core/concept/`; thin re-exports em
|
|
1291
|
+
`website/pages/docs/`; entradas em `_meta.json`.
|
|
1292
|
+
|
|
1293
|
+
**AI-friendly doc layer:**
|
|
1294
|
+
- Raiz `README.AI.md` — navegação + decision tree + ADR matrix.
|
|
1295
|
+
- Raiz `AGENTS.md` — contrato operacional p/ agentes (hard rules,
|
|
1296
|
+
per-component checklist, skill triggers).
|
|
1297
|
+
- `packages/eslint-config/llms.txt`, `packages/relay/llms.txt`,
|
|
1298
|
+
`packages/scripts/llms.txt` — indexação token-otimizada por package
|
|
1299
|
+
(espelhando o padrão já em `packages/core/llms.txt`).
|
|
1300
|
+
|
|
1301
|
+
Doc-only. Sem mudança de API/código. Patch bump em todos os
|
|
1302
|
+
publishable packages para sincronizar versões.
|
|
1303
|
+
|
|
1304
|
+
- e55019a: chore(security): close 7 pre-existing CVEs revealed by audit-dependencies fix
|
|
1305
|
+
|
|
1306
|
+
Follow-up to the `audit-ci@7.1.0` → `yarn npm audit` migration earlier in
|
|
1307
|
+
this cycle. The native audit pipeline surfaced 7 vulnerabilities that the
|
|
1308
|
+
broken handler had been printing as `undefined` and never failing on.
|
|
1309
|
+
All closed in this changeset. `yarn audit-dependencies` → 0 findings.
|
|
1310
|
+
|
|
1311
|
+
| # | CVE | Pkg | Severity | Strategy |
|
|
1312
|
+
| --- | ------------------- | ---------------- | -------- | ------------------------------------------------------------------------------------------------------------------- |
|
|
1313
|
+
| 1 | GHSA-3xgq-45jj-v275 | `cross-spawn` | High | Root resolution `cross-spawn: ^7.0.6` (was transitive 5.1.0 via `execa@0.8.0` → `clipboardy` → `title` → `nextra`). |
|
|
1314
|
+
| 2 | GHSA-qjx8-664m-686j | `js-cookie` | High | Direct upgrade in `packages/relay`: `3.0.5` → `3.0.7`. |
|
|
1315
|
+
| 3 | GHSA-37ch-88jc-xwx2 | `path-to-regexp` | High | Direct upgrade in `packages/relay`: `express 4.21.2` → `4.22.2` (express 4.22 ships path-to-regexp 0.1.13). |
|
|
1316
|
+
| 4 | GHSA-7mvr-c777-76hp | `playwright` | High | Direct upgrade in `packages/core`: `@playwright/test 1.49.1` → `1.60.0`. |
|
|
1317
|
+
| 5 | GHSA-qx2v-qp2m-jg93 | `postcss` | Moderate | Root resolution `postcss: ^8.5.10` (Next 15 pinned 8.4.31; css-loader already uses 8.5.15). |
|
|
1318
|
+
| 6 | GHSA-6rw7-vpxm-498p | `qs` | Moderate | Closed by item 3 (express 4.22.2 bundles body-parser 1.20.5 → qs 6.15.2). |
|
|
1319
|
+
| 7 | GHSA-q8mj-m7cp-5q26 | `qs` | Moderate | Closed by item 3 (same). |
|
|
1320
|
+
|
|
1321
|
+
**Verified post-remediation:**
|
|
1322
|
+
- `corepack yarn audit-dependencies` → exit 0, no audit suggestions.
|
|
1323
|
+
- `corepack yarn workspace @apollion-dsi/core run validate` → green (types + prettier + lint + tests + build + check-vendors-not-published + visual gate). Visual regression suite chromium **133/133 passing** with `@playwright/test@1.60.0` — no baseline drift from the playwright bump.
|
|
1324
|
+
- `corepack yarn workspace @apollion-dsi/relay run validate` → green (3 test suites / 11 tests / 0 failures).
|
|
1325
|
+
- `corepack yarn workspace @apollion-dsi/website run build` → green.
|
|
1326
|
+
|
|
1327
|
+
**Exploit-surface notes:**
|
|
1328
|
+
- Express, body-parser, qs, path-to-regexp are all in `@apollion-dsi/relay#devDependencies` (test fixtures for the GraphQL relay environment) — realistic exploit surface was zero. Upgraded anyway because the fix was free.
|
|
1329
|
+
- Playwright cert verification (item 4) only matters during `npx playwright install` — also low exploit surface in a single-machine setup, but upgrading was free.
|
|
1330
|
+
- cross-spawn ReDoS reachable only during `nextra` doc generation, dev-only.
|
|
1331
|
+
|
|
1332
|
+
- 29081ae: chore(visual): regenerate firefox + webkit baselines (post ADR-006 OKLch)
|
|
1333
|
+
|
|
1334
|
+
DevDeps-only — no consumer-facing API change. Refreshes the 124 stale
|
|
1335
|
+
firefox + webkit baselines that drifted after `d57c47c feat(v4-s2): OKLch
|
|
1336
|
+
lerp via culori` updated only chromium baselines (the pre-push hook is
|
|
1337
|
+
chromium-only, so firefox + webkit drift went unnoticed). Restores the
|
|
1338
|
+
multi-browser net at 399/399 green and idempotent on darwin-arm64.
|
|
1339
|
+
- **Median diff absorbed:** 0.53 %; **max:** 10.35 % on
|
|
1340
|
+
`Layouts/SideBarLayout › Default` firefox — `primary.dark` shifted from
|
|
1341
|
+
`rgb(20, 70, 88)` (pre-OKLch RGB lerp) to `rgb(7, 46, 60)` (OKLch lerp).
|
|
1342
|
+
Same code, new perceptually-uniform color math.
|
|
1343
|
+
- **Net-new baselines:** `Components/Button › AllDimensions` and
|
|
1344
|
+
`Components/Card › AllDimensions` firefox + webkit captured for the first
|
|
1345
|
+
time (story count 131 → 133).
|
|
1346
|
+
- **PER_STORY_THRESHOLD escalations** (firefox skeleton shimmer sub-pixel
|
|
1347
|
+
drift — pre-existing class documented in `__image_snapshots__/AUDIT.md`):
|
|
1348
|
+
- `components-textpreset--default`: 0.5 % (re-emergence of the S2 entry,
|
|
1349
|
+
handled per AUDIT's predicted path).
|
|
1350
|
+
- `components-scenario-rect--default`: 1 % (new entry — same root cause).
|
|
1351
|
+
|
|
1352
|
+
Verified:
|
|
1353
|
+
- `VISUAL_BROWSERS="chromium firefox webkit" yarn workspace @apollion-dsi/core run test-storybook`
|
|
1354
|
+
is 399/399 green on two consecutive fresh runs (~80 s each, no `-u`).
|
|
1355
|
+
- Pre-push hook (chromium-only) behavior unchanged — closes the same gate.
|
|
1356
|
+
- SHA-256 of regenerated PNGs differs from `HEAD` (real pixel updates, not
|
|
1357
|
+
no-op mtime touches).
|