@customafk/lunas-ui 0.2.82 → 0.2.83
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/dist/{action-submit-kYjq-iPD.cjs → action-submit-B9vHpLoN.cjs} +2 -2
- package/dist/{action-submit-kYjq-iPD.cjs.map → action-submit-B9vHpLoN.cjs.map} +1 -1
- package/dist/{action-submit-DVNxnW4-.mjs → action-submit-BQdkz4mS.mjs} +2 -2
- package/dist/{action-submit-DVNxnW4-.mjs.map → action-submit-BQdkz4mS.mjs.map} +1 -1
- package/dist/{actions-form-DRrkiGzh.mjs → actions-form-D4n1W3-X.mjs} +2 -2
- package/dist/{actions-form-DRrkiGzh.mjs.map → actions-form-D4n1W3-X.mjs.map} +1 -1
- package/dist/{actions-form-CwicJU89.cjs → actions-form-DF2eYxGQ.cjs} +2 -2
- package/dist/{actions-form-CwicJU89.cjs.map → actions-form-DF2eYxGQ.cjs.map} +1 -1
- package/dist/{analysis-panel-BoKjkPYz.cjs → analysis-panel-B4ynYuwg.cjs} +2 -2
- package/dist/{analysis-panel-BoKjkPYz.cjs.map → analysis-panel-B4ynYuwg.cjs.map} +1 -1
- package/dist/{analysis-panel-CZ8g9AAO.mjs → analysis-panel-CcM3tBcc.mjs} +2 -2
- package/dist/{analysis-panel-CZ8g9AAO.mjs.map → analysis-panel-CcM3tBcc.mjs.map} +1 -1
- package/dist/{badge-BPiU1Ss2.d.cts → badge-C_NPjGXe.d.cts} +9 -2
- package/dist/{badge-BPiU1Ss2.d.mts → badge-C_NPjGXe.d.mts} +9 -2
- package/dist/{badge-display-DHbCN998.cjs → badge-display-C1_Fc3Sj.cjs} +2 -2
- package/dist/{badge-display-DHbCN998.cjs.map → badge-display-C1_Fc3Sj.cjs.map} +1 -1
- package/dist/{badge-display-B5m09_Hs.mjs → badge-display-DRmVhZ-C.mjs} +2 -2
- package/dist/{badge-display-B5m09_Hs.mjs.map → badge-display-DRmVhZ-C.mjs.map} +1 -1
- package/dist/{boolean-display-CzHHDfHW.mjs → boolean-display-ByTs3aOa.mjs} +2 -2
- package/dist/{boolean-display-CzHHDfHW.mjs.map → boolean-display-ByTs3aOa.mjs.map} +1 -1
- package/dist/{boolean-display-D2wjQhNX.cjs → boolean-display-DUA-6Q13.cjs} +2 -2
- package/dist/{boolean-display-D2wjQhNX.cjs.map → boolean-display-DUA-6Q13.cjs.map} +1 -1
- package/dist/{checkbox-field-BN3Vd9qq.mjs → checkbox-field-BRGTLOjq.mjs} +2 -2
- package/dist/{checkbox-field-BN3Vd9qq.mjs.map → checkbox-field-BRGTLOjq.mjs.map} +1 -1
- package/dist/{checkbox-field-DBUjQC_4.cjs → checkbox-field-ldZRSCca.cjs} +2 -2
- package/dist/{checkbox-field-DBUjQC_4.cjs.map → checkbox-field-ldZRSCca.cjs.map} +1 -1
- package/dist/{cms-layout-DCJhB-GY.cjs → cms-layout-BGsf1E4E.cjs} +2 -2
- package/dist/{cms-layout-DCJhB-GY.cjs.map → cms-layout-BGsf1E4E.cjs.map} +1 -1
- package/dist/{cms-layout-Ba_5wSnr.mjs → cms-layout-BHLo0_L_.mjs} +2 -2
- package/dist/{cms-layout-Ba_5wSnr.mjs.map → cms-layout-BHLo0_L_.mjs.map} +1 -1
- package/dist/combobox-Bhgo112r.cjs +2 -0
- package/dist/{combobox-kp_kPY8o.cjs.map → combobox-Bhgo112r.cjs.map} +1 -1
- package/dist/combobox-C0nno01T.mjs +2 -0
- package/dist/{combobox-C64Rvd7n.mjs.map → combobox-C0nno01T.mjs.map} +1 -1
- package/dist/{combobox-field-Bug1qI5B.mjs → combobox-field-CvkdZkQE.mjs} +2 -2
- package/dist/{combobox-field-Bug1qI5B.mjs.map → combobox-field-CvkdZkQE.mjs.map} +1 -1
- package/dist/{combobox-field-BE9miJ3D.cjs → combobox-field-ZYr7636s.cjs} +2 -2
- package/dist/{combobox-field-BE9miJ3D.cjs.map → combobox-field-ZYr7636s.cjs.map} +1 -1
- package/dist/{currency-display-B06kc2IG.cjs → currency-display-DefLJLqL.cjs} +2 -2
- package/dist/{currency-display-B06kc2IG.cjs.map → currency-display-DefLJLqL.cjs.map} +1 -1
- package/dist/{currency-display-7w-ZjVUw.mjs → currency-display-DpbtUluj.mjs} +2 -2
- package/dist/{currency-display-7w-ZjVUw.mjs.map → currency-display-DpbtUluj.mjs.map} +1 -1
- package/dist/data-display/phone-number.cjs +1 -1
- package/dist/data-display/phone-number.cjs.map +1 -1
- package/dist/data-display/phone-number.d.cts +1 -1
- package/dist/data-display/phone-number.d.mts +1 -1
- package/dist/data-display/phone-number.mjs +1 -1
- package/dist/data-display/phone-number.mjs.map +1 -1
- package/dist/{date-display-BO7OY_AC.mjs → date-display-ByvkuSk0.mjs} +2 -2
- package/dist/{date-display-BO7OY_AC.mjs.map → date-display-ByvkuSk0.mjs.map} +1 -1
- package/dist/{date-display-DHnZr_yf.cjs → date-display-CkPBLlWz.cjs} +2 -2
- package/dist/{date-display-DHnZr_yf.cjs.map → date-display-CkPBLlWz.cjs.map} +1 -1
- package/dist/{date-field-CYoPe74G.cjs → date-field-1Hmcv8Zp.cjs} +2 -2
- package/dist/{date-field-CYoPe74G.cjs.map → date-field-1Hmcv8Zp.cjs.map} +1 -1
- package/dist/{date-field-D_qpBb-t.mjs → date-field-DGMTG_hu.mjs} +2 -2
- package/dist/{date-field-D_qpBb-t.mjs.map → date-field-DGMTG_hu.mjs.map} +1 -1
- package/dist/{description-display-CBfoP3Y2.mjs → description-display-BFTBwDmB.mjs} +2 -2
- package/dist/{description-display-CBfoP3Y2.mjs.map → description-display-BFTBwDmB.mjs.map} +1 -1
- package/dist/{description-display-Cckihd1s.cjs → description-display-DeEwppdC.cjs} +2 -2
- package/dist/{description-display-Cckihd1s.cjs.map → description-display-DeEwppdC.cjs.map} +1 -1
- package/dist/descriptions-Bw9GSCjo.mjs +3 -0
- package/dist/descriptions-Bw9GSCjo.mjs.map +1 -0
- package/dist/descriptions-DUsJjqd2.cjs +3 -0
- package/dist/descriptions-DUsJjqd2.cjs.map +1 -0
- package/dist/{dialog-form-CCIcht28.mjs → dialog-form-BRSZpRTC.mjs} +2 -2
- package/dist/{dialog-form-CCIcht28.mjs.map → dialog-form-BRSZpRTC.mjs.map} +1 -1
- package/dist/{dialog-form-BTZZwz3T.cjs → dialog-form-C1qpltYx.cjs} +2 -2
- package/dist/{dialog-form-BTZZwz3T.cjs.map → dialog-form-C1qpltYx.cjs.map} +1 -1
- package/dist/{email-display-w-hRYIeL.cjs → email-display-BXw4IbbW.cjs} +2 -2
- package/dist/{email-display-w-hRYIeL.cjs.map → email-display-BXw4IbbW.cjs.map} +1 -1
- package/dist/{email-display-Bk_furIx.mjs → email-display-qxdrnYmK.mjs} +2 -2
- package/dist/{email-display-Bk_furIx.mjs.map → email-display-qxdrnYmK.mjs.map} +1 -1
- package/dist/{email-field-DxSNJ6tf.mjs → email-field-C2Lvl_rQ.mjs} +2 -2
- package/dist/{email-field-DxSNJ6tf.mjs.map → email-field-C2Lvl_rQ.mjs.map} +1 -1
- package/dist/{email-field-DJa7iASY.cjs → email-field-D3nSkHj2.cjs} +2 -2
- package/dist/{email-field-DJa7iASY.cjs.map → email-field-D3nSkHj2.cjs.map} +1 -1
- package/dist/features/descriptions/index.cjs +1 -2
- package/dist/features/descriptions/index.d.cts +2 -2
- package/dist/features/descriptions/index.d.mts +2 -2
- package/dist/features/descriptions/index.mjs +1 -2
- package/dist/features/tables/index.cjs +1 -1
- package/dist/features/tables/index.d.cts +1 -1
- package/dist/features/tables/index.d.mts +1 -1
- package/dist/features/tables/index.mjs +1 -1
- package/dist/features/tanstack-form/index.cjs +1 -1
- package/dist/features/tanstack-form/index.mjs +1 -1
- package/dist/{filter-BO7ISTIR.mjs → filter-DM4QLW77.mjs} +2 -2
- package/dist/{filter-BO7ISTIR.mjs.map → filter-DM4QLW77.mjs.map} +1 -1
- package/dist/{filter-CQ9BD0MV.cjs → filter-DQEjSnOP.cjs} +2 -2
- package/dist/{filter-CQ9BD0MV.cjs.map → filter-DQEjSnOP.cjs.map} +1 -1
- package/dist/{flex-CrxTaAXE.d.cts → flex-C63_IqSY.d.cts} +6 -4
- package/dist/{flex-CrxTaAXE.d.mts → flex-C63_IqSY.d.mts} +6 -4
- package/dist/{index-DaLpXe5l.d.cts → index--wNkNzCB.d.cts} +5 -5
- package/dist/index-Cp4Db57w.d.cts +598 -0
- package/dist/index-CqE3mOHo.d.mts +598 -0
- package/dist/{index-BPo-Lg3p.d.mts → index-CrkOhm--.d.mts} +5 -5
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +8 -8
- package/dist/index.d.mts +8 -8
- package/dist/index.mjs +1 -1
- package/dist/layouts/cms-layout/index.cjs +1 -1
- package/dist/layouts/cms-layout/index.mjs +1 -1
- package/dist/layouts/flex.cjs +1 -1
- package/dist/layouts/flex.cjs.map +1 -1
- package/dist/layouts/flex.d.cts +1 -1
- package/dist/layouts/flex.d.mts +1 -1
- package/dist/layouts/flex.mjs +1 -1
- package/dist/layouts/flex.mjs.map +1 -1
- package/dist/layouts/payment-layout/index.cjs +1 -1
- package/dist/layouts/payment-layout/index.mjs +1 -1
- package/dist/layouts/ui-grid.cjs +1 -1
- package/dist/layouts/ui-grid.cjs.map +1 -1
- package/dist/layouts/ui-grid.d.cts +1 -1
- package/dist/layouts/ui-grid.d.mts +1 -1
- package/dist/layouts/ui-grid.mjs +1 -1
- package/dist/layouts/ui-grid.mjs.map +1 -1
- package/dist/{list-display-DLsm8uAh.mjs → list-display-4tTkV29U.mjs} +2 -2
- package/dist/{list-display-DLsm8uAh.mjs.map → list-display-4tTkV29U.mjs.map} +1 -1
- package/dist/{list-display-DDeJoneW.cjs → list-display-CJvQ-wwT.cjs} +2 -2
- package/dist/{list-display-DDeJoneW.cjs.map → list-display-CJvQ-wwT.cjs.map} +1 -1
- package/dist/{name-display-H5HFH1fU.mjs → name-display-BFoDcvt2.mjs} +2 -2
- package/dist/{name-display-H5HFH1fU.mjs.map → name-display-BFoDcvt2.mjs.map} +1 -1
- package/dist/{name-display-CKnyugrP.cjs → name-display-Br7rcdqi.cjs} +2 -2
- package/dist/{name-display-CKnyugrP.cjs.map → name-display-Br7rcdqi.cjs.map} +1 -1
- package/dist/{number-field-5INgdUUv.mjs → number-field-CR5PLX6H.mjs} +2 -2
- package/dist/{number-field-5INgdUUv.mjs.map → number-field-CR5PLX6H.mjs.map} +1 -1
- package/dist/{number-field-DKZz-27X.cjs → number-field-CWDYA3La.cjs} +2 -2
- package/dist/{number-field-DKZz-27X.cjs.map → number-field-CWDYA3La.cjs.map} +1 -1
- package/dist/{password-field-DOIe6wTv.mjs → password-field-B2_kzss6.mjs} +2 -2
- package/dist/{password-field-DOIe6wTv.mjs.map → password-field-B2_kzss6.mjs.map} +1 -1
- package/dist/{password-field-BuWARi35.cjs → password-field-BHRhVyZ0.cjs} +2 -2
- package/dist/{password-field-BuWARi35.cjs.map → password-field-BHRhVyZ0.cjs.map} +1 -1
- package/dist/{payment-layout-BSl9DYQA.mjs → payment-layout--b7bhmR1.mjs} +2 -2
- package/dist/{payment-layout-BSl9DYQA.mjs.map → payment-layout--b7bhmR1.mjs.map} +1 -1
- package/dist/payment-layout-BZtIcu-3.cjs +2 -0
- package/dist/{payment-layout-DDcLanA0.cjs.map → payment-layout-BZtIcu-3.cjs.map} +1 -1
- package/dist/{permalink-CaCx9fi6.mjs → permalink-BPCF_npZ.mjs} +2 -2
- package/dist/{permalink-CaCx9fi6.mjs.map → permalink-BPCF_npZ.mjs.map} +1 -1
- package/dist/{permalink-azuGQg2b.cjs → permalink-DCvWlrAT.cjs} +2 -2
- package/dist/{permalink-azuGQg2b.cjs.map → permalink-DCvWlrAT.cjs.map} +1 -1
- package/dist/phone-CTTjc3mv.mjs +2 -0
- package/dist/phone-CTTjc3mv.mjs.map +1 -0
- package/dist/phone-CUxXVTg6.cjs +2 -0
- package/dist/phone-CUxXVTg6.cjs.map +1 -0
- package/dist/{phone-number-D9j5xYDW.d.cts → phone-number-B1bLIt8i.d.cts} +3 -3
- package/dist/{phone-number-D9j5xYDW.d.mts → phone-number-B1bLIt8i.d.mts} +3 -3
- package/dist/{phone-number-Ba-f4s1Y.mjs → phone-number-DHFLnHWO.mjs} +2 -2
- package/dist/{phone-number-Ba-f4s1Y.mjs.map → phone-number-DHFLnHWO.mjs.map} +1 -1
- package/dist/{phone-number-BqRhKQdr.cjs → phone-number-YzmDmFBU.cjs} +2 -2
- package/dist/{phone-number-BqRhKQdr.cjs.map → phone-number-YzmDmFBU.cjs.map} +1 -1
- package/dist/{popover-form-BsapHJck.mjs → popover-form-CeRVpy1B.mjs} +2 -2
- package/dist/{popover-form-BsapHJck.mjs.map → popover-form-CeRVpy1B.mjs.map} +1 -1
- package/dist/{popover-form-Bq2GcuZu.cjs → popover-form-Ch_iMMSm.cjs} +2 -2
- package/dist/{popover-form-Bq2GcuZu.cjs.map → popover-form-Ch_iMMSm.cjs.map} +1 -1
- package/dist/{progress-display-CiYWPOnq.cjs → progress-display-57LT7U37.cjs} +2 -2
- package/dist/{progress-display-CiYWPOnq.cjs.map → progress-display-57LT7U37.cjs.map} +1 -1
- package/dist/{progress-display-0UsBzt_r.mjs → progress-display-AfoHitiE.mjs} +2 -2
- package/dist/{progress-display-0UsBzt_r.mjs.map → progress-display-AfoHitiE.mjs.map} +1 -1
- package/dist/{radio-group-field-kTgtvp1p.cjs → radio-group-field-BFhBfzoT.cjs} +2 -2
- package/dist/{radio-group-field-kTgtvp1p.cjs.map → radio-group-field-BFhBfzoT.cjs.map} +1 -1
- package/dist/{radio-group-field-DOJ4jVSr.mjs → radio-group-field-Iwo2Q2Ig.mjs} +2 -2
- package/dist/{radio-group-field-DOJ4jVSr.mjs.map → radio-group-field-Iwo2Q2Ig.mjs.map} +1 -1
- package/dist/{resizable-C3uADYIg.d.mts → resizable-CNqPu4Ck.d.cts} +2 -2
- package/dist/{resizable-C3uADYIg.d.cts → resizable-CNqPu4Ck.d.mts} +2 -2
- package/dist/{select-field-CURv37h4.cjs → select-field-CvDBZQTl.cjs} +2 -2
- package/dist/{select-field-CURv37h4.cjs.map → select-field-CvDBZQTl.cjs.map} +1 -1
- package/dist/{select-field-BcsFBbNJ.mjs → select-field-NJgDDCO2.mjs} +2 -2
- package/dist/{select-field-BcsFBbNJ.mjs.map → select-field-NJgDDCO2.mjs.map} +1 -1
- package/dist/{simple-array-field-wFE_DUOV.mjs → simple-array-field-BwNCeUnn.mjs} +2 -2
- package/dist/{simple-array-field-wFE_DUOV.mjs.map → simple-array-field-BwNCeUnn.mjs.map} +1 -1
- package/dist/{simple-array-field-bCUuPMgT.cjs → simple-array-field-aGXkDZXD.cjs} +2 -2
- package/dist/{simple-array-field-bCUuPMgT.cjs.map → simple-array-field-aGXkDZXD.cjs.map} +1 -1
- package/dist/{simple-boolean-field-DRapzNrB.cjs → simple-boolean-field-BeVkn3c4.cjs} +2 -2
- package/dist/{simple-boolean-field-DRapzNrB.cjs.map → simple-boolean-field-BeVkn3c4.cjs.map} +1 -1
- package/dist/{simple-boolean-field-GQJyeyVS.mjs → simple-boolean-field-t_XDXqYs.mjs} +2 -2
- package/dist/{simple-boolean-field-GQJyeyVS.mjs.map → simple-boolean-field-t_XDXqYs.mjs.map} +1 -1
- package/dist/{simple-combobox-field-D6IaMJKl.mjs → simple-combobox-field-HCB4A33-.mjs} +2 -2
- package/dist/{simple-combobox-field-D6IaMJKl.mjs.map → simple-combobox-field-HCB4A33-.mjs.map} +1 -1
- package/dist/{simple-combobox-field-Cp5dfQv3.cjs → simple-combobox-field-U0ZAl7VQ.cjs} +2 -2
- package/dist/{simple-combobox-field-Cp5dfQv3.cjs.map → simple-combobox-field-U0ZAl7VQ.cjs.map} +1 -1
- package/dist/{simple-date-field-dszQs7Ik.mjs → simple-date-field-Dj4bJoji.mjs} +2 -2
- package/dist/{simple-date-field-dszQs7Ik.mjs.map → simple-date-field-Dj4bJoji.mjs.map} +1 -1
- package/dist/{simple-date-field-_PSkIXAt.cjs → simple-date-field-DtxEpEZj.cjs} +2 -2
- package/dist/{simple-date-field-_PSkIXAt.cjs.map → simple-date-field-DtxEpEZj.cjs.map} +1 -1
- package/dist/{simple-email-field-CwyoXqWo.mjs → simple-email-field-BDyhkmHV.mjs} +2 -2
- package/dist/{simple-email-field-CwyoXqWo.mjs.map → simple-email-field-BDyhkmHV.mjs.map} +1 -1
- package/dist/{simple-email-field-DIHwYrhk.cjs → simple-email-field-DK9I_Tc_.cjs} +2 -2
- package/dist/{simple-email-field-DIHwYrhk.cjs.map → simple-email-field-DK9I_Tc_.cjs.map} +1 -1
- package/dist/{simple-number-field-VdEeaIiC.cjs → simple-number-field-BspqWU-3.cjs} +2 -2
- package/dist/{simple-number-field-VdEeaIiC.cjs.map → simple-number-field-BspqWU-3.cjs.map} +1 -1
- package/dist/{simple-number-field-Id1kV5yR.mjs → simple-number-field-hneXMhfJ.mjs} +2 -2
- package/dist/{simple-number-field-Id1kV5yR.mjs.map → simple-number-field-hneXMhfJ.mjs.map} +1 -1
- package/dist/{simple-password-field-7xbVB1H3.cjs → simple-password-field-BEEcleom.cjs} +2 -2
- package/dist/{simple-password-field-7xbVB1H3.cjs.map → simple-password-field-BEEcleom.cjs.map} +1 -1
- package/dist/{simple-password-field-DIO9FwQy.mjs → simple-password-field-vsLRHDk4.mjs} +2 -2
- package/dist/{simple-password-field-DIO9FwQy.mjs.map → simple-password-field-vsLRHDk4.mjs.map} +1 -1
- package/dist/{simple-radio-group-field-BmHWRnns.mjs → simple-radio-group-field-BURm_BSA.mjs} +2 -2
- package/dist/{simple-radio-group-field-BmHWRnns.mjs.map → simple-radio-group-field-BURm_BSA.mjs.map} +1 -1
- package/dist/{simple-radio-group-field-CxVAr6yW.cjs → simple-radio-group-field-Wm8xB0fN.cjs} +2 -2
- package/dist/{simple-radio-group-field-CxVAr6yW.cjs.map → simple-radio-group-field-Wm8xB0fN.cjs.map} +1 -1
- package/dist/{simple-select-field-DfZk0zPa.mjs → simple-select-field-8cY51U4d.mjs} +2 -2
- package/dist/{simple-select-field-DfZk0zPa.mjs.map → simple-select-field-8cY51U4d.mjs.map} +1 -1
- package/dist/{simple-select-field-C9u7Pg9u.cjs → simple-select-field-QQ65caBf.cjs} +2 -2
- package/dist/{simple-select-field-C9u7Pg9u.cjs.map → simple-select-field-QQ65caBf.cjs.map} +1 -1
- package/dist/{simple-text-field-BxPjcB4c.cjs → simple-text-field-BHkCPiE5.cjs} +2 -2
- package/dist/{simple-text-field-BxPjcB4c.cjs.map → simple-text-field-BHkCPiE5.cjs.map} +1 -1
- package/dist/{simple-text-field-CT9KFUSK.mjs → simple-text-field-DK72_OA_.mjs} +2 -2
- package/dist/{simple-text-field-CT9KFUSK.mjs.map → simple-text-field-DK72_OA_.mjs.map} +1 -1
- package/dist/{simple-textarea-field-B22rT6zS.mjs → simple-textarea-field-B72nNQHv.mjs} +2 -2
- package/dist/{simple-textarea-field-B22rT6zS.mjs.map → simple-textarea-field-B72nNQHv.mjs.map} +1 -1
- package/dist/{simple-textarea-field-DG9oPtP-.cjs → simple-textarea-field-Bu5h7sfH.cjs} +2 -2
- package/dist/{simple-textarea-field-DG9oPtP-.cjs.map → simple-textarea-field-Bu5h7sfH.cjs.map} +1 -1
- package/dist/{statistic-CE_Jg8SN.cjs → statistic-CXBTEgKI.cjs} +2 -2
- package/dist/{statistic-CE_Jg8SN.cjs.map → statistic-CXBTEgKI.cjs.map} +1 -1
- package/dist/{statistic-639yMA2d.mjs → statistic-CvgurN5Z.mjs} +2 -2
- package/dist/{statistic-639yMA2d.mjs.map → statistic-CvgurN5Z.mjs.map} +1 -1
- package/dist/{status-display-BCYpNJmd.mjs → status-display-Caae2aYf.mjs} +2 -2
- package/dist/{status-display-BCYpNJmd.mjs.map → status-display-Caae2aYf.mjs.map} +1 -1
- package/dist/{status-display-xcCCGpGS.cjs → status-display-EVwkPrm6.cjs} +2 -2
- package/dist/{status-display-xcCCGpGS.cjs.map → status-display-EVwkPrm6.cjs.map} +1 -1
- package/dist/{summary-bar-C3NAnI3V.mjs → summary-bar-B6B_wmZA.mjs} +2 -2
- package/dist/{summary-bar-C3NAnI3V.mjs.map → summary-bar-B6B_wmZA.mjs.map} +1 -1
- package/dist/{summary-bar-C08g8bb1.cjs → summary-bar-D36n4fox.cjs} +2 -2
- package/dist/{summary-bar-C08g8bb1.cjs.map → summary-bar-D36n4fox.cjs.map} +1 -1
- package/dist/{switch-field-Cz4lDf1D.mjs → switch-field-DoPUWb9d.mjs} +2 -2
- package/dist/{switch-field-Cz4lDf1D.mjs.map → switch-field-DoPUWb9d.mjs.map} +1 -1
- package/dist/{switch-field-yE4A6EoF.cjs → switch-field-eLVlQZSI.cjs} +2 -2
- package/dist/{switch-field-yE4A6EoF.cjs.map → switch-field-eLVlQZSI.cjs.map} +1 -1
- package/dist/{tables-Dg3KMBKA.mjs → tables-CuoBQNqx.mjs} +2 -2
- package/dist/{tables-Dg3KMBKA.mjs.map → tables-CuoBQNqx.mjs.map} +1 -1
- package/dist/{tables-BqZ4Zs6e.cjs → tables-DdLEj1dI.cjs} +2 -2
- package/dist/{tables-BqZ4Zs6e.cjs.map → tables-DdLEj1dI.cjs.map} +1 -1
- package/dist/{tanstack-form-BxqS40rB.cjs → tanstack-form-C0ab8EEl.cjs} +2 -2
- package/dist/{tanstack-form-BxqS40rB.cjs.map → tanstack-form-C0ab8EEl.cjs.map} +1 -1
- package/dist/{tanstack-form-q9hDCc0Y.mjs → tanstack-form-fkaBh9RO.mjs} +2 -2
- package/dist/{tanstack-form-q9hDCc0Y.mjs.map → tanstack-form-fkaBh9RO.mjs.map} +1 -1
- package/dist/{text-editor-field-CQ8tnZFw.mjs → text-editor-field-B6HEsAHt.mjs} +2 -2
- package/dist/{text-editor-field-CQ8tnZFw.mjs.map → text-editor-field-B6HEsAHt.mjs.map} +1 -1
- package/dist/{text-editor-field-CxU-KMMn.cjs → text-editor-field-DcEUC0iH.cjs} +2 -2
- package/dist/{text-editor-field-CxU-KMMn.cjs.map → text-editor-field-DcEUC0iH.cjs.map} +1 -1
- package/dist/{text-field-B3xlvEUN.mjs → text-field-Bm-k6Jr7.mjs} +2 -2
- package/dist/{text-field-B3xlvEUN.mjs.map → text-field-Bm-k6Jr7.mjs.map} +1 -1
- package/dist/{text-field-BQovKYN-.cjs → text-field-DT50dOVI.cjs} +2 -2
- package/dist/{text-field-BQovKYN-.cjs.map → text-field-DT50dOVI.cjs.map} +1 -1
- package/dist/{textarea-field-B38SnNv4.cjs → textarea-field-BhqX29CS.cjs} +2 -2
- package/dist/{textarea-field-B38SnNv4.cjs.map → textarea-field-BhqX29CS.cjs.map} +1 -1
- package/dist/{textarea-field-u2UUwtr_.mjs → textarea-field-DNLyrRH7.mjs} +2 -2
- package/dist/{textarea-field-u2UUwtr_.mjs.map → textarea-field-DNLyrRH7.mjs.map} +1 -1
- package/dist/{tooltip-BVzKgxrZ.cjs → tooltip-CUyGXE9e.cjs} +3 -3
- package/dist/{tooltip-BVzKgxrZ.cjs.map → tooltip-CUyGXE9e.cjs.map} +1 -1
- package/dist/{tooltip-D7U_Nl5c.mjs → tooltip-DSxSeIak.mjs} +3 -3
- package/dist/{tooltip-D7U_Nl5c.mjs.map → tooltip-DSxSeIak.mjs.map} +1 -1
- package/dist/ui/badge.cjs +1 -1
- package/dist/ui/badge.cjs.map +1 -1
- package/dist/ui/badge.d.cts +2 -2
- package/dist/ui/badge.d.mts +2 -2
- package/dist/ui/badge.mjs +1 -1
- package/dist/ui/badge.mjs.map +1 -1
- package/dist/ui/combobox.cjs +1 -1
- package/dist/ui/combobox.mjs +1 -1
- package/dist/ui/resizable.d.cts +1 -1
- package/dist/ui/resizable.d.mts +1 -1
- package/dist/{ui-grid-CzL5J7cm.d.cts → ui-grid-D1-Ponqs.d.cts} +5 -5
- package/dist/{ui-grid-CzL5J7cm.d.mts → ui-grid-D1-Ponqs.d.mts} +5 -5
- package/package.json +2 -3
- package/ai-docs.md +0 -419
- package/dist/combobox-C64Rvd7n.mjs +0 -2
- package/dist/combobox-kp_kPY8o.cjs +0 -2
- package/dist/features/descriptions/index.cjs.map +0 -1
- package/dist/features/descriptions/index.mjs.map +0 -1
- package/dist/index-BMuVmm7f.d.mts +0 -236
- package/dist/index-CLx89ATZ.d.cts +0 -236
- package/dist/payment-layout-DDcLanA0.cjs +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptions-Bw9GSCjo.mjs","names":["Image"],"sources":["../packages/components/features/descriptions/context.ts","../packages/components/features/descriptions/descriptions.variants.ts","../packages/components/features/descriptions/search-utils.ts","../packages/components/features/descriptions/collapsible-section.tsx","../packages/components/features/descriptions/components/empty.tsx","../packages/components/features/descriptions/components/badge.tsx","../packages/components/features/descriptions/components/boolean.tsx","../packages/components/features/descriptions/components/color.tsx","../packages/components/features/descriptions/components/use-copy-feedback.ts","../packages/components/features/descriptions/components/copy.tsx","../packages/components/features/descriptions/components/copy-all.tsx","../packages/components/features/descriptions/components/date.tsx","../packages/components/features/descriptions/components/file.tsx","../packages/components/features/descriptions/components/images.tsx","../packages/components/features/descriptions/components/json.tsx","../packages/components/features/descriptions/components/link.tsx","../packages/components/features/descriptions/components/longtext.tsx","../packages/components/features/descriptions/components/name.tsx","../packages/components/features/descriptions/components/number-phone.tsx","../packages/components/features/descriptions/components/progress.tsx","../packages/components/features/descriptions/components/statistic.tsx","../packages/components/features/descriptions/components/status.tsx","../packages/components/features/descriptions/components/tag-list.tsx","../packages/components/features/descriptions/components/text.tsx","../packages/components/features/descriptions/components/user.tsx","../packages/components/features/descriptions/row.tsx","../packages/components/features/descriptions/search.tsx","../packages/components/features/descriptions/index.tsx"],"sourcesContent":["import { createContext } from 'react';\n\nimport type { TUIGridBreakpoint } from '@/components/layouts/ui-grid';\nimport type { TDescriptionSize } from './descriptions.variants';\n\n/** Number of grid columns (out of 12) a label column can occupy. `12` is deliberately excluded so the value column always keeps at least 1. */\nexport type TDescriptionLabelSpan = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;\n\n/**\n * Label column width — a plain number fixes it at every container width, or an object varies it\n * per container-query breakpoint (see {@link TUIGridBreakpoint} for the exact pixel value of each key).\n */\nexport type TDescriptionLabelColSpan = TDescriptionLabelSpan | Partial<Record<TUIGridBreakpoint, TDescriptionLabelSpan>>;\n\n/** Whether the nearest ancestor is a `DescriptionGroup` — read by `Description` to pick its `grouped` surface. */\nexport const DescriptionGroupContext = createContext(false);\n\nexport type TDescriptionConfig = {\n labelColSpan: TDescriptionLabelColSpan | null;\n size: TDescriptionSize;\n bordered: boolean;\n};\n\nexport const DESCRIPTION_CONFIG_DEFAULT: TDescriptionConfig = { labelColSpan: null, size: 'md', bordered: true };\n\n/**\n * Cascading config a `Description`/`DescriptionGroup`/`DescriptionRow` publishes for every descendant\n * `DescriptionItem`/`DescriptionHeader`/`DescriptionSection` to read. Each provider MERGES over the\n * inherited value (only overriding the keys it was explicitly given), so `size`/`bordered` inherit\n * through nested panels and groups unless a descendant sets its own.\n */\nexport const DescriptionConfigContext = createContext<TDescriptionConfig>(DESCRIPTION_CONFIG_DEFAULT);\n\n/** Set by `DescriptionRow` so a wrapped `DescriptionItem` knows to skip its own bottom rule — the row wrapper owns it instead. */\nexport const DescriptionRowContext = createContext(false);\n\nexport type TDescriptionSearch = { query: string; setQuery: (query: string) => void };\n\nconst noopSetQuery = () => {};\n\n/** Live search query published by `Description`, set by a `DescriptionSearch` input and read by every `DescriptionItem`/`DescriptionCollapsibleSection` to decide their own visibility. */\nexport const DescriptionSearchContext = createContext<TDescriptionSearch>({ query: '', setQuery: noopSetQuery });\n\nexport type TDescriptionSectionScope = { report: (id: string, matched: boolean | null) => void };\n\n/** Lets a `DescriptionItem` report its own search-match state up to the nearest `DescriptionCollapsibleSection`, which aggregates matches to decide its own visibility. `matched: null` means \"this item is unmounting\". */\nexport const DescriptionSectionScopeContext = createContext<TDescriptionSectionScope | null>(null);\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * These variants only carry surface/border/padding/typography classes. Flex mechanics\n * (`flex`, `items-*`, `justify-*`, `gap-*`) are expressed as props on the `Flex` component\n * that wraps each region instead — don't re-add them here.\n */\n\n/** Shared size scale across every Description sub-component, matching `ui/badge.tsx`/`ui/button.tsx`'s `xs–xl` scale. */\nexport type TDescriptionSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport const descriptionVariants = cva('relative flex flex-col bg-card', {\n variants: {\n surface: {\n /** Standalone card — the default. */\n card: 'size-full overflow-y-auto rounded-lg',\n /** Embedded inside another Description's value cell — no shadow/ring. */\n nested: 'w-full overflow-hidden rounded-md',\n /** Rendered inside a DescriptionGroup — the group owns the card chrome. */\n grouped: '',\n },\n bordered: {\n true: '',\n false: 'bg-transparent shadow-none ring-0',\n },\n },\n compoundVariants: [\n { surface: 'card', bordered: true, className: 'border border-border shadow-card ring-1 ring-border-weak' },\n { surface: 'nested', bordered: true, className: 'border border-border' },\n { surface: 'grouped', bordered: true, className: 'border-b border-b-border last:border-b-0' },\n ],\n defaultVariants: {\n surface: 'card',\n bordered: true,\n },\n});\n\nexport const descriptionGroupVariants = cva('relative size-full overflow-y-auto rounded-lg bg-card', {\n variants: {\n bordered: {\n true: 'border border-border shadow-card ring-1 ring-border-weak',\n false: '',\n },\n },\n defaultVariants: {\n bordered: true,\n },\n});\n\nexport const descriptionHeaderVariants = cva('bg-card', {\n variants: {\n sticky: {\n true: 'sticky top-0 z-30',\n false: 'relative',\n },\n size: {\n xs: 'px-2.5 py-1.5',\n sm: 'px-3 py-2',\n md: 'px-4 py-3',\n lg: 'px-5 py-3.5',\n xl: 'px-6 py-4',\n },\n bordered: {\n true: 'border-b border-b-border',\n false: '',\n },\n },\n defaultVariants: {\n sticky: true,\n size: 'md',\n bordered: true,\n },\n});\n\nexport const descriptionHeaderTitleVariants = cva('truncate font-semibold text-text-positive', {\n variants: {\n size: {\n xs: 'text-xs',\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nexport const descriptionHeaderDescriptionVariants = cva('text-text-positive-weak', {\n variants: {\n size: {\n xs: 'text-[10px]',\n sm: 'text-[11px]',\n md: 'text-xs',\n lg: 'text-sm',\n xl: 'text-sm',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nexport const descriptionSectionVariants = cva('', {\n variants: {\n size: {\n xs: 'gap-2 px-2.5 py-1.5',\n sm: 'gap-2.5 px-3 py-2',\n md: 'gap-3 px-4 py-2.5',\n lg: 'gap-3 px-5 py-3',\n xl: 'gap-4 px-6 py-3.5',\n },\n bordered: {\n true: 'border-b border-b-border',\n false: '',\n },\n },\n defaultVariants: {\n size: 'md',\n bordered: true,\n },\n});\n\n/**\n * Bottom rule that disappears on the last *visible* row instead of merely the last DOM row.\n * `:has(~ …)` reads \"has a following sibling row/item that isn't search-hidden\" — this subsumes\n * plain `last:border-b-0` and additionally survives a `DescriptionSearch` filter hiding trailing\n * rows via `data-search-hidden` (see `search.tsx`). `last:border-b-0` stays as a plain fallback.\n */\nexport const DESCRIPTION_LAST_ROW_SELECTOR =\n 'last:border-b-0 [&:not(:has(~:is([data-slot=\"description-item\"],[data-slot=\"description-row\"]):not([data-search-hidden])))]:border-b-0';\n\nexport const descriptionItemVariants = cva('', {\n variants: {\n orientation: {\n horizontal: '',\n vertical: 'flex flex-col',\n },\n bordered: {\n true: `border-b border-b-border ${DESCRIPTION_LAST_ROW_SELECTOR}`,\n false: '',\n },\n /** Set when rendered as a cell inside a `DescriptionRow` — the row wrapper owns the horizontal rule instead. */\n inRow: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [{ inRow: true, bordered: true, className: 'border-b-0' }],\n defaultVariants: {\n orientation: 'horizontal',\n bordered: true,\n inRow: false,\n },\n});\n\nexport const descriptionItemLabelVariants = cva('font-medium text-text-positive-weak', {\n variants: {\n orientation: {\n horizontal: 'h-full min-w-full tabular-nums',\n vertical: '',\n },\n size: {\n xs: 'text-[11px]',\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-sm',\n xl: 'text-base',\n },\n bordered: {\n true: 'bg-secondary-muted',\n false: '',\n },\n },\n compoundVariants: [\n { orientation: 'horizontal', bordered: true, className: 'border-r border-r-border' },\n { orientation: 'vertical', bordered: true, className: 'border-b border-b-border' },\n { orientation: 'horizontal', size: 'xs', className: 'py-1.5 pr-1.5 pl-2.5' },\n { orientation: 'horizontal', size: 'sm', className: 'py-2 pr-2 pl-3' },\n { orientation: 'horizontal', size: 'md', className: 'py-3 pr-2 pl-4' },\n { orientation: 'horizontal', size: 'lg', className: 'py-3.5 pr-2.5 pl-5' },\n { orientation: 'horizontal', size: 'xl', className: 'py-4 pr-3 pl-6' },\n { orientation: 'vertical', size: 'xs', className: 'py-1 pr-1.5 pl-2.5' },\n { orientation: 'vertical', size: 'sm', className: 'py-1.5 pr-2 pl-3' },\n { orientation: 'vertical', size: 'md', className: 'py-2 pr-2 pl-4' },\n { orientation: 'vertical', size: 'lg', className: 'py-2.5 pr-2.5 pl-5' },\n { orientation: 'vertical', size: 'xl', className: 'py-3 pr-3 pl-6' },\n /** Borderless mode needs no left inset — the panel edge itself is the alignment reference. */\n { bordered: false, className: 'pl-0' },\n ],\n defaultVariants: {\n orientation: 'horizontal',\n size: 'md',\n bordered: true,\n },\n});\n\nexport const descriptionItemValueVariants = cva('text-text-positive', {\n variants: {\n size: {\n xs: 'py-1.5 pr-1.5 pl-2.5 text-[11px]',\n sm: 'py-2 pr-2 pl-3 text-xs',\n md: 'py-3 pr-2 pl-4 text-sm',\n lg: 'py-3.5 pr-2.5 pl-5 text-sm',\n xl: 'py-4 pr-3 pl-6 text-base',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\n/** Layout-only — surface/border classes for a `DescriptionRow`'s wrapper (the row itself, not its cells). */\nexport const descriptionRowVariants = cva('', {\n variants: {\n bordered: {\n true: `border-b border-b-border ${DESCRIPTION_LAST_ROW_SELECTOR}`,\n false: '',\n },\n },\n defaultVariants: {\n bordered: true,\n },\n});\n\nexport type DescriptionVariants = VariantProps<typeof descriptionVariants>;\nexport type DescriptionHeaderVariants = VariantProps<typeof descriptionHeaderVariants>;\nexport type DescriptionItemVariants = VariantProps<typeof descriptionItemVariants>;\n","/**\n * Diacritic-insensitive so \"dien thoai\" matches \"Điện thoại\" — necessary for this Vietnamese-facing\n * library. `đ`/`Đ` is folded to `d`/`D` as an explicit extra step: unlike `ệ`/`ạ` (a base letter plus a\n * combining mark that NFD splits apart), Vietnamese `đ` is its own base codepoint with no combining-mark\n * decomposition, so `\\p{Diacritic}` stripping alone leaves it untouched.\n */\nexport function normalizeSearchText(value: string): string {\n return value\n .normalize('NFD')\n .replace(/\\p{Diacritic}/gu, '')\n .toLowerCase()\n .replace(/đ/g, 'd')\n .trim();\n}\n\n/** Case- and diacritic-insensitive substring match. An empty/whitespace-only query matches everything. */\nexport function matchesSearch(label: string, query: string): boolean {\n if (query.trim() === '') return true;\n return normalizeSearchText(label).includes(normalizeSearchText(query));\n}\n","'use client';\n\nimport { use, useCallback, useMemo, useState } from 'react';\n\nimport { ChevronDownIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible';\n\nimport { DescriptionConfigContext, DescriptionSearchContext, DescriptionSectionScopeContext, type TDescriptionSectionScope } from './context';\nimport { descriptionSectionVariants } from './descriptions.variants';\nimport { matchesSearch } from './search-utils';\n\ntype DescriptionCollapsibleSectionProps = React.PropsWithChildren<{\n /** Section label rendered beside the divider line and chevron. */\n title: string;\n /** Uncontrolled initial state. @default true */\n defaultOpen?: boolean;\n /** Controlled open state — pair with `onOpenChange`. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /**\n * Set `false` to render a static section header with no trigger/chevron (children always render)\n * while still participating in `DescriptionSearch` — a search-aware alternative to the flat\n * `DescriptionSection` divider.\n * @default true\n */\n collapsible?: boolean;\n className?: string;\n}>;\n\n/**\n * A `DescriptionSection`-style divider whose items collapse/expand, and — unlike the flat\n * `DescriptionSection` — auto-hides itself when every `DescriptionItem` inside it is filtered out by a\n * `DescriptionSearch` (and auto-opens while a query matches one of its items, so hits are never buried\n * inside a collapsed section).\n *\n * @example\n * import { Description, DescriptionCollapsibleSection, DescriptionItem } from '@customafk/lunas-ui/features/descriptions';\n *\n * <Description>\n * <DescriptionCollapsibleSection title=\"Advanced\" defaultOpen={false}>\n * <DescriptionItem label=\"Internal ID\">usr_01hv3k9x2b</DescriptionItem>\n * </DescriptionCollapsibleSection>\n * </Description>\n */\nexport const DescriptionCollapsibleSection: React.FC<DescriptionCollapsibleSectionProps> = ({\n title,\n defaultOpen = true,\n open: openProp,\n onOpenChange,\n collapsible = true,\n className,\n children,\n}) => {\n const config = use(DescriptionConfigContext);\n const { query } = use(DescriptionSearchContext);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const [matches, setMatches] = useState<Record<string, boolean>>({});\n\n // Each DescriptionItem inside reports its own match state here; both branches bail out of the state\n // update when nothing actually changed, which is what keeps this from looping on every render.\n const report = useCallback((id: string, matched: boolean | null) => {\n setMatches(prev => {\n if (matched === null) {\n if (!(id in prev)) return prev;\n const { [id]: _dropped, ...rest } = prev;\n return rest;\n }\n if (prev[id] === matched) return prev;\n return { ...prev, [id]: matched };\n });\n }, []);\n\n const scope = useMemo<TDescriptionSectionScope>(() => ({ report }), [report]);\n const anyChildMatched = useMemo(() => Object.values(matches).some(Boolean), [matches]);\n const titleMatched = matchesSearch(title, query);\n const searching = query.trim() !== '';\n const sectionHidden = searching && !titleMatched && !anyChildMatched;\n\n const isControlled = openProp !== undefined;\n const baseOpen = isControlled ? openProp : uncontrolledOpen;\n // Auto-open while a query matches one of this section's items, so the hit isn't buried in a collapsed\n // section — only for the uncontrolled case, so a consumer pinning `open` always keeps final say.\n const resolvedOpen = !isControlled && searching && anyChildMatched ? true : baseOpen;\n\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const searchHiddenProps = sectionHidden ? ({ 'data-search-hidden': 'true' } as const) : undefined;\n const triggerClassName = cn(\n 'group/section flex w-full items-center gap-3 text-left outline-none',\n collapsible && 'cursor-pointer transition-colors hover:bg-secondary-muted/60',\n 'focus-visible:ring-[3px] focus-visible:ring-border-weak',\n descriptionSectionVariants({ size: config.size, bordered: config.bordered })\n );\n const titleNode = <p className=\"shrink-0 font-semibold text-text-positive-weak text-xs uppercase tracking-widest\">{title}</p>;\n const ruleNode = <span className=\"h-px flex-1 bg-border\" />;\n\n if (!collapsible) {\n return (\n <div data-slot=\"description-collapsible-section\" {...searchHiddenProps} className={cn(sectionHidden && 'hidden', className)}>\n <div data-slot=\"description-collapsible-section-trigger\" className={triggerClassName}>\n {titleNode}\n {ruleNode}\n </div>\n <DescriptionSectionScopeContext.Provider value={scope}>{children}</DescriptionSectionScopeContext.Provider>\n </div>\n );\n }\n\n return (\n <Collapsible\n open={resolvedOpen}\n onOpenChange={handleOpenChange}\n data-slot=\"description-collapsible-section\"\n {...searchHiddenProps}\n className={cn(sectionHidden && 'hidden', className)}\n >\n <CollapsibleTrigger data-slot=\"description-collapsible-section-trigger\" className={triggerClassName}>\n <ChevronDownIcon\n size={14}\n className=\"-rotate-90 shrink-0 text-text-positive-weak transition-transform duration-200 group-data-[state=open]/section:rotate-0\"\n />\n {titleNode}\n {ruleNode}\n </CollapsibleTrigger>\n {/*\n forceMount keeps items mounted while collapsed, so a DescriptionSearch query can still match\n against — and auto-open — a section that starts closed (without it, Radix unmounts collapsed\n content entirely and its items could never report a match in the first place). `inert` then\n makes the collapsed content correctly non-focusable/non-perceivable to assistive tech, since\n `forceMount` alone would otherwise leave it tabbable at height:0.\n */}\n <CollapsibleContent\n data-slot=\"description-collapsible-section-content\"\n forceMount\n inert={!resolvedOpen}\n // fill-mode-forwards is required: tw-animate-css's collapsible-up/-down keyframes default to\n // `animation-fill-mode: none`, so without it the element's height snaps back to `auto` (fully\n // visible) the instant each animation finishes, regardless of which direction it just ran.\n // The plain `data-[state=closed]:h-0` is a static safety net alongside the animation: on the very\n // first render (data-state is already \"closed\", never transitioned from \"open\") there's no prior\n // --radix-collapsible-content-height measurement yet, so the keyframe's `from` value falls back to\n // `auto` and the animation can't reliably interpolate — the static rule guarantees the settled,\n // non-animating state is still correct even if that first animation pass doesn't land cleanly.\n className=\"fill-mode-forwards overflow-hidden data-[state=closed]:h-0 data-[state=open]:h-auto data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down\"\n >\n <DescriptionSectionScopeContext.Provider value={scope}>{children}</DescriptionSectionScopeContext.Provider>\n </CollapsibleContent>\n </Collapsible>\n );\n};\n","'use client';\n\nexport const DescriptionEmpty: React.FC = () => {\n return (\n <span data-slot=\"description-empty\" aria-label=\"Empty value\" className=\"select-none font-medium text-sm text-text-positive-muted\">\n —\n </span>\n );\n};\n","'use client';\n\nimport type { BadgeProps } from '@/components/ui/badge';\nimport { Badge } from '@/components/ui/badge';\n\nimport { DescriptionEmpty } from './empty';\n\ntype DescriptionBadgeProps = {\n label: string | number | null | undefined;\n color?: BadgeProps['color'];\n variant?: BadgeProps['variant'];\n size?: BadgeProps['size'];\n};\n\nexport const DescriptionBadge: React.FC<DescriptionBadgeProps> = ({ label, color = 'secondary', variant = 'soft', size = 'sm' }) => {\n if (!label) return <DescriptionEmpty />;\n return (\n <Badge data-slot=\"description-badge\" color={color} variant={variant} size={size}>\n {label}\n </Badge>\n );\n};\n","'use client';\n\nimport { Badge } from '@/components/ui/badge';\n\nimport { DescriptionEmpty } from './empty';\n\ntype DescriptionBooleanProps = {\n value: boolean | null | undefined;\n trueLabel?: string;\n falseLabel?: string;\n};\n\nexport const DescriptionBoolean: React.FC<DescriptionBooleanProps> = ({ value, trueLabel = 'Yes', falseLabel = 'No' }) => {\n if (value == null) return <DescriptionEmpty />;\n return (\n <Badge data-slot=\"description-boolean\" variant=\"soft\" color={value ? 'success' : 'danger'} size=\"sm\">\n {value ? trueLabel : falseLabel}\n </Badge>\n );\n};\n","'use client';\n\nimport { DescriptionEmpty } from './empty';\n\ntype DescriptionColorProps = {\n /** Any valid CSS color value (`#rrggbb`, `rgb(...)`, a named color, ...). */\n value: string | null | undefined;\n /** Text shown next to the swatch. Defaults to the uppercased raw `value`. */\n label?: string;\n};\n\n/** A small color swatch + label — for hex codes, theme tokens, or any other color-valued field. */\nexport const DescriptionColor: React.FC<DescriptionColorProps> = ({ value, label }) => {\n if (!value?.trim()) return <DescriptionEmpty />;\n\n const text = label ?? value.toUpperCase();\n\n return (\n <span data-slot=\"description-color\" className=\"inline-flex items-center gap-2 text-sm text-text-positive\">\n <span\n aria-label={text}\n style={{ backgroundColor: value }}\n className=\"size-4 shrink-0 rounded-sm border border-border-weak ring-1 ring-black/5 ring-inset\"\n />\n <span className=\"font-mono text-xs tabular-nums\">{text}</span>\n </span>\n );\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { useCopyToClipboard } from '@customafk/react-toolkit/hooks/useCopyToClipboard';\n\n/**\n * Shared \"click to copy, flash a checkmark for 1.5s\" behavior — used by `DescriptionCopy`,\n * `DescriptionJson`'s copy button, and `DescriptionCopyAll`. A timestamp (not a boolean) changes\n * identity on every click, so clicking again inside the window restarts the timer instead of\n * leaving a stale one running.\n */\nexport function useCopyFeedback() {\n const [copiedAt, setCopiedAt] = useState<number | null>(null);\n const [, copy] = useCopyToClipboard();\n const copied = copiedAt !== null;\n\n const copyText = useCallback(\n async (text: string) => {\n if (!text) return false;\n const ok = await copy(text);\n if (ok) setCopiedAt(Date.now());\n return ok;\n },\n [copy]\n );\n\n useEffect(() => {\n if (copiedAt === null) return;\n const id = setTimeout(() => setCopiedAt(null), 1500);\n return () => clearTimeout(id);\n }, [copiedAt]);\n\n return { copied, copy: copyText };\n}\n","'use client';\n\nimport { CheckIcon, CopyIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { DescriptionEmpty } from './empty';\nimport { useCopyFeedback } from './use-copy-feedback';\n\ntype DescriptionCopyProps = {\n value: string | null | undefined;\n truncate?: boolean;\n};\n\nexport const DescriptionCopy: React.FC<DescriptionCopyProps> = ({ value, truncate = true }) => {\n const { copied, copy } = useCopyFeedback();\n\n if (!value) return <DescriptionEmpty />;\n\n return (\n <button\n type=\"button\"\n data-slot=\"description-copy\"\n data-copied={copied}\n title={copied ? 'Đã sao chép' : 'Sao chép'}\n onClick={() => copy(value)}\n className={cn(\n 'group inline-flex max-w-full cursor-pointer items-center gap-1.5 rounded-sm border border-border-weak bg-secondary-muted px-2 py-0.5 font-mono text-xs text-text-positive-weak transition-[border-color,color,box-shadow] hover:border-border hover:text-text-positive hover:shadow-xs',\n truncate && 'min-w-0'\n )}\n >\n <span className={cn('tabular-nums', truncate && 'truncate')}>{value}</span>\n {copied ? (\n <CheckIcon data-slot=\"description-copy-icon\" size={12} className=\"shrink-0 text-success\" />\n ) : (\n <CopyIcon data-slot=\"description-copy-icon\" size={12} className=\"shrink-0 opacity-50 group-hover:opacity-100\" />\n )}\n </button>\n );\n};\n","'use client';\n\nimport { useCallback, useRef } from 'react';\n\nimport { CheckIcon, CopyIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { useCopyFeedback } from './use-copy-feedback';\n\nconst OWN_ITEM_SELECTOR = [\n '[data-slot=\"description-header\"]',\n '[data-slot=\"description-section\"]',\n '[data-slot=\"description-collapsible-section-trigger\"]',\n '[data-slot=\"description-item\"]',\n].join(',');\n\nfunction textOf(el: Element | null): string {\n return el?.textContent?.replace(/\\s+/g, ' ').trim() ?? '';\n}\n\n/**\n * True when `el` belongs to `root` itself rather than to a nested embedded `Description`.\n * `nested === root` covers `root` itself being the nested panel (button placed inside it); the\n * `!root.contains(nested)` branch covers `root` being embedded inside some *other* nested panel\n * further up the tree — that outer boundary is irrelevant to what counts as `root`'s own items.\n */\nfunction isOwn(el: Element, root: HTMLElement): boolean {\n const nested = el.closest('[data-slot=\"description\"][data-surface=\"nested\"]');\n return nested === null || nested === root || !root.contains(nested);\n}\n\nfunction buildPanelText(root: HTMLElement): string {\n const lines: string[] = [];\n\n for (const el of root.querySelectorAll(OWN_ITEM_SELECTOR)) {\n if (!isOwn(el, root)) continue;\n // Skip anything filtered out by DescriptionSearch, or hidden inside a collapsed/hidden section.\n if (el.closest('[data-search-hidden]')) continue;\n\n if (el.matches('[data-slot=\"description-header\"]')) {\n const title = textOf(el.querySelector('p'));\n if (title) lines.push(lines.length ? `\\n${title}` : title, '');\n continue;\n }\n if (el.matches('[data-slot=\"description-section\"],[data-slot=\"description-collapsible-section-trigger\"]')) {\n const title = textOf(el.querySelector('p'));\n if (title) lines.push(lines.length ? `\\n[${title}]` : `[${title}]`);\n continue;\n }\n // Prefer the dedicated label-text slot so a `description-item-action` node's text can't bleed in.\n const label = textOf(el.querySelector('[data-slot=\"description-item-label-text\"]') ?? el.querySelector('[data-slot=\"description-item-label\"]'));\n const value = textOf(el.querySelector('[data-slot=\"description-item-value\"]'));\n if (label) lines.push(`${label}: ${value}`);\n }\n\n return lines.join('\\n');\n}\n\ntype DescriptionCopyAllProps = {\n /** Accessible label / tooltip text for the button. @default 'Sao chép toàn bộ' */\n label?: string;\n className?: string;\n};\n\n/**\n * A small icon button that copies every visible `label: value` pair of the nearest ancestor\n * `Description`/`DescriptionGroup` as plain text — place it explicitly wherever you want it, typically\n * inside `DescriptionHeader`'s `extra` slot: `<DescriptionHeader extra={<DescriptionCopyAll />} />`.\n *\n * Reads the *rendered DOM* rather than any props, because a value cell can render arbitrary nodes —\n * the only universally correct \"what's currently displayed\" is what's actually painted. Section/header\n * titles are included as heading lines so the pasted text keeps its structure, and anything hidden by a\n * `DescriptionSearch` filter (or a collapsed `DescriptionCollapsibleSection`) is skipped — copying\n * matches what's currently visible on screen.\n *\n * @example\n * import { Description, DescriptionHeader } from '@customafk/lunas-ui/features/descriptions';\n * import { DescriptionCopyAll } from '@customafk/lunas-ui/features/descriptions/components';\n *\n * <Description>\n * <DescriptionHeader title=\"Order #1234\" extra={<DescriptionCopyAll />} />\n * ...\n * </Description>\n */\nexport const DescriptionCopyAll: React.FC<DescriptionCopyAllProps> = ({ label = 'Sao chép toàn bộ', className }) => {\n const ref = useRef<HTMLButtonElement>(null);\n const { copied, copy } = useCopyFeedback();\n\n const handleClick = useCallback(async () => {\n const root = ref.current?.closest('[data-slot=\"description\"],[data-slot=\"description-group\"]');\n if (!(root instanceof HTMLElement)) return;\n const text = buildPanelText(root);\n if (!text) return;\n await copy(text);\n }, [copy]);\n\n return (\n <button\n ref={ref}\n type=\"button\"\n data-slot=\"description-copy-all\"\n data-copied={copied}\n title={copied ? 'Đã sao chép' : label}\n aria-label={label}\n onClick={handleClick}\n className={cn(\n 'cursor-pointer rounded-sm border border-border-weak bg-card p-1 text-text-positive-weak transition-[border-color,color,box-shadow] hover:border-border hover:text-text-positive hover:shadow-xs',\n className\n )}\n >\n {copied ? <CheckIcon size={14} className=\"text-success\" /> : <CopyIcon size={14} />}\n </button>\n );\n};\n","'use client';\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport { DateDisplay } from '@/components/data-display/date';\nimport { DescriptionEmpty } from './empty';\n\ntype DescriptionDateProps = {\n date: Date | string | number | null | undefined;\n};\n\nexport const DescriptionDate: React.FC<DescriptionDateProps> = ({ date }) => {\n if (date == null) return <DescriptionEmpty />;\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n {/* DateDisplay doesn't spread ...props, so Radix's Slot-injected hover/focus handlers need a real element to land on. */}\n <span data-slot=\"description-date\" className=\"cursor-help\">\n <DateDisplay date={date} format=\"medium\" />\n </span>\n </TooltipTrigger>\n <TooltipContent>\n <DateDisplay date={date} format=\"full\" showTime className=\"text-xs font-medium\" />\n </TooltipContent>\n </Tooltip>\n );\n};\n","'use client';\n\nimport { DownloadIcon, FileIcon } from 'lucide-react';\n\nimport { formatBytes } from '@customafk/react-toolkit/utils';\n\nimport { DescriptionEmpty } from './empty';\n\ntype DescriptionFileProps = {\n name: string | null | undefined;\n /** Download/view URL. Omit while an upload is pending — the filename still renders as inert text. */\n url?: string | null;\n /** File size in bytes, shown formatted (KB/MB/...) next to the name. */\n size?: number | null;\n};\n\n/**\n * Filename + optional size, linking to `url` for download when one is available. Only null-guards on\n * `!name` — a pending/unavailable upload has a name but no `url` yet, and showing the filename as inert\n * text is more useful than an empty dash.\n */\nexport const DescriptionFile: React.FC<DescriptionFileProps> = ({ name, url, size }) => {\n if (!name) return <DescriptionEmpty />;\n\n const sizeText = typeof size === 'number' ? formatBytes(size) : null;\n\n if (!url) {\n return (\n <span data-slot=\"description-file\" className=\"inline-flex max-w-full items-center gap-1.5 text-sm text-text-positive\">\n <FileIcon size={12} className=\"shrink-0 opacity-70\" />\n <span className=\"truncate\">{name}</span>\n {sizeText && <span className=\"shrink-0 text-text-positive-muted text-xs\">{sizeText}</span>}\n </span>\n );\n }\n\n return (\n <a\n data-slot=\"description-file\"\n href={url}\n download={name}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex max-w-full items-center gap-1.5 text-primary text-sm underline decoration-dashed underline-offset-2 transition-colors hover:text-primary-strong hover:decoration-solid\"\n >\n <DownloadIcon size={12} className=\"shrink-0 opacity-70\" />\n <span className=\"truncate\">{name}</span>\n {sizeText && <span className=\"shrink-0 text-text-positive-muted text-xs no-underline\">{sizeText}</span>}\n </a>\n );\n};\n","'use client';\n\nimport { Image } from '@/components/ui/image';\n\nimport { DescriptionEmpty } from './empty';\n\ntype ImageItem = { id: string; src: string; alt: string };\n\nexport const DescriptionImages: React.FC<{\n images?: Array<ImageItem> | null | undefined;\n}> = ({ images }) => {\n if (!images?.length) return <DescriptionEmpty />;\n\n const isSingle = images.length === 1;\n\n return (\n <div data-slot=\"description-images\" className=\"flex flex-wrap gap-4\">\n {images.map(image => (\n <div\n key={image.id}\n className={\n isSingle\n ? 'group relative size-42 overflow-hidden rounded border border-border shadow-xs transition-shadow hover:shadow-card'\n : 'group relative size-20 overflow-hidden rounded border border-border shadow-xs transition-shadow hover:shadow-card'\n }\n >\n <Image src={image.src} alt={image.alt} width=\"100%\" height=\"100%\" className=\"transition-transform duration-200 group-hover:scale-105\" />\n </div>\n ))}\n </div>\n );\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport { CheckIcon, CopyIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { DescriptionEmpty } from './empty';\nimport { useCopyFeedback } from './use-copy-feedback';\n\ntype DescriptionJsonProps = {\n value: unknown;\n /** Max rendered height in px before the block scrolls internally rather than growing the row. @default 240 */\n maxHeight?: number;\n /** `JSON.stringify` indent width. @default 2 */\n indent?: number;\n /** Renders a click-to-copy button in the top-right corner of the block. @default true */\n copyable?: boolean;\n};\n\n/**\n * Pretty-printed, monospaced JSON viewer for a value inside a `DescriptionItem`. Bounded height + internal\n * scroll rather than collapsible-by-default — inside a description row the JSON is a *value*, and a value\n * that's collapsed by default reads as empty. Reach for `DescriptionCollapsibleSection` if you want the\n * surrounding section itself to start collapsed.\n */\nexport const DescriptionJson: React.FC<DescriptionJsonProps> = ({ value, maxHeight = 240, indent = 2, copyable = true }) => {\n const text = useMemo(() => {\n if (value == null) return null;\n try {\n return JSON.stringify(value, null, indent);\n } catch {\n // Circular references and other non-serializable values — same \"nothing sensible to show\" outcome as null.\n return null;\n }\n }, [value, indent]);\n const { copied, copy } = useCopyFeedback();\n\n if (text == null) return <DescriptionEmpty />;\n\n return (\n <div data-slot=\"description-json\" className=\"relative w-full min-w-0\">\n {copyable && (\n <button\n type=\"button\"\n data-slot=\"description-json-copy\"\n data-copied={copied}\n title={copied ? 'Đã sao chép' : 'Sao chép'}\n onClick={() => copy(text)}\n className={cn(\n 'absolute top-1.5 right-1.5 cursor-pointer rounded-sm border border-border-weak bg-card p-1 text-text-positive-weak transition-[border-color,color,box-shadow] hover:border-border hover:text-text-positive hover:shadow-xs'\n )}\n >\n {copied ? <CheckIcon size={12} className=\"text-success\" /> : <CopyIcon size={12} />}\n </button>\n )}\n <pre\n style={{ maxHeight }}\n className=\"overflow-auto rounded-sm border border-border-weak bg-secondary-muted px-2 py-1.5 pr-8 font-mono text-text-positive-weak text-xs leading-relaxed\"\n >\n <code data-slot=\"description-json-code\">{text}</code>\n </pre>\n </div>\n );\n};\n","'use client';\n\nimport { ExternalLinkIcon, LinkIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { DescriptionEmpty } from './empty';\n\ntype DescriptionLinkProps = {\n href: string | null | undefined;\n label?: string;\n external?: boolean;\n className?: string;\n};\n\nexport const DescriptionLink: React.FC<DescriptionLinkProps> = ({ href, label, external = true, className }) => {\n if (!href) return <DescriptionEmpty />;\n\n return (\n <a\n data-slot=\"description-link\"\n href={href}\n target={external ? '_blank' : undefined}\n rel={external ? 'noopener noreferrer' : undefined}\n className={cn(\n 'inline-flex max-w-full items-center gap-1 text-sm text-primary underline decoration-dashed underline-offset-2 transition-colors hover:text-primary-strong hover:decoration-solid',\n className\n )}\n >\n {!external && <LinkIcon size={12} className=\"shrink-0 opacity-70\" />}\n <span className=\"truncate\">{label ?? href}</span>\n {external && <ExternalLinkIcon size={12} className=\"shrink-0 opacity-70\" />}\n </a>\n );\n};\n","'use client';\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport { Paragraph } from '@/components/typography/paragraph';\nimport { DescriptionEmpty } from './empty';\n\nexport const DescriptionLongText: React.FC<{ content: string | null | undefined | number }> = ({ content }) => {\n if (content == null) return <DescriptionEmpty />;\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Paragraph\n data-slot=\"description-longtext\"\n variant=\"sm\"\n className=\"line-clamp-2 cursor-pointer whitespace-pre-line break-all text-start text-sm hover:text-text-positive transition-colors\"\n >\n {content}\n </Paragraph>\n </TooltipTrigger>\n <TooltipContent align=\"start\" className=\"h-fit min-w-48 max-w-80 pt-4\">\n <div className=\"flex flex-col gap-y-2\">\n <p className=\"whitespace-pre-line text-wrap break-keep\">{content}</p>\n <p className=\"w-full text-end text-text-positive-subtle\">{content.toString().length} chars</p>\n </div>\n </TooltipContent>\n </Tooltip>\n );\n};\n","'use client';\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport { Paragraph } from '@/components/typography/paragraph';\nimport { DescriptionEmpty } from './empty';\n\nexport const DescriptionName: React.FC<{\n name?: string | null | undefined;\n}> = ({ name }) => {\n if (!name) return <DescriptionEmpty />;\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Paragraph data-slot=\"description-name\" variant=\"sm\" className=\"line-clamp-2 w-full cursor-pointer truncate hover:text-text-positive transition-colors\">\n {name}\n </Paragraph>\n </TooltipTrigger>\n <TooltipContent align=\"start\" className=\"h-fit min-w-48 max-w-80 pt-4\">\n <div className=\"flex flex-col gap-y-2\">\n <p className=\"whitespace-pre-line text-wrap break-keep\">{name}</p>\n <p className=\"w-full text-end text-text-positive-subtle\">{name.length} chars</p>\n </div>\n </TooltipContent>\n </Tooltip>\n );\n};\n","'use client';\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport { Paragraph } from '@/components/typography/paragraph';\nimport { formatVietnamesePhone } from '@/libs/phone';\nimport { DescriptionEmpty } from './empty';\n\nexport const DescriptionNumberPhone: React.FC<{ value?: string | null }> = ({ value }) => {\n const phone = formatVietnamesePhone(value);\n if (!phone) return <DescriptionEmpty />;\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Paragraph data-slot=\"description-phone\" variant=\"sm\" className=\"cursor-help tabular-nums transition-colors\">\n {phone.national}\n </Paragraph>\n </TooltipTrigger>\n <TooltipContent align=\"start\">\n <p className=\"tabular-nums\">{phone.international}</p>\n </TooltipContent>\n </Tooltip>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Progress } from '@/components/ui/progress';\n\nimport { Flex } from '@/components/layouts/flex';\nimport { DescriptionEmpty } from './empty';\n\ntype DescriptionProgressColor = 'primary' | 'success' | 'warning' | 'danger';\n\nconst INDICATOR_COLOR: Record<DescriptionProgressColor, string> = {\n primary: '[&_[data-slot=progress-indicator]]:bg-primary',\n success: '[&_[data-slot=progress-indicator]]:bg-success',\n warning: '[&_[data-slot=progress-indicator]]:bg-warning',\n danger: '[&_[data-slot=progress-indicator]]:bg-danger',\n};\n\nconst BAR_HEIGHT: Record<'xs' | 'sm' | 'md', string> = {\n xs: 'h-1',\n sm: 'h-1.5',\n md: 'h-2',\n};\n\ntype DescriptionProgressProps = {\n value: number | null | undefined;\n /** @default 100 */\n max?: number;\n /** @default true */\n showValue?: boolean;\n /** Bar thickness. @default 'sm' */\n size?: 'xs' | 'sm' | 'md';\n /** @default 'primary' */\n color?: DescriptionProgressColor;\n};\n\n/**\n * Thin-wraps `ui/progress` for use as a description value. `value={0}` renders a (visually empty) bar,\n * not `DescriptionEmpty` — 0% progress is real information, unlike `DescriptionStatistic`'s `0`-hides-by-default\n * behavior for currency-like values, where an unset field and a genuine zero amount are indistinguishable.\n */\nexport const DescriptionProgress: React.FC<DescriptionProgressProps> = ({ value, max = 100, showValue = true, size = 'sm', color = 'primary' }) => {\n if (value == null || Number.isNaN(value)) return <DescriptionEmpty />;\n\n const pct = Math.min(100, Math.max(0, (value / max) * 100));\n\n return (\n <Flex data-slot=\"description-progress\" width=\"full\" padding=\"none\" gap=\"sm\" wrap={false} align=\"center\">\n <Progress value={pct} className={cn('min-w-24 flex-1', BAR_HEIGHT[size], INDICATOR_COLOR[color])} />\n {showValue && (\n <span data-slot=\"description-progress-value\" className=\"shrink-0 font-number text-text-positive-weak text-xs tabular-nums\">\n {Math.round(pct)}%\n </span>\n )}\n </Flex>\n );\n};\n","'use client';\n\nimport { memo, useCallback, useMemo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { DescriptionEmpty } from './empty';\n\nconst applyRounding = (num: number, precisionValue: number, roundingMode?: 'round' | 'floor' | 'ceil') => {\n const multiplier = 10 ** precisionValue;\n switch (roundingMode) {\n case 'floor':\n return Math.floor(num * multiplier) / multiplier;\n case 'ceil':\n return Math.ceil(num * multiplier) / multiplier;\n default:\n return Math.round(num * multiplier) / multiplier;\n }\n};\n\nconst descriptionStatisticVariants = cva('inline-flex items-center gap-1 font-number tabular-nums transition-colors', {\n variants: {\n size: {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n },\n trend: {\n neutral: 'text-text-positive',\n up: 'text-success',\n down: 'text-danger',\n },\n },\n defaultVariants: {\n size: 'sm',\n trend: 'neutral',\n },\n});\n\nexport type DescriptionStatisticProps = VariantProps<typeof descriptionStatisticVariants> & {\n decimalSeparator?: string;\n groupSeparator?: string;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n precision?: number;\n roundingMode?: 'round' | 'floor' | 'ceil';\n showTrailingZeros?: boolean;\n value: number | string | null | undefined;\n className?: string;\n /**\n * Renders `DescriptionEmpty` for a literal `0` value, same as any other unset/invalid input.\n * Set to `false` to display a genuine `0` amount instead.\n * @default true\n */\n emptyOnZero?: boolean;\n};\n\n/**\n * The value-cell to use for numbers inside a `DescriptionItem` — prefer this over the standalone\n * `Statistic` (`data-display/statistic`) so empty/invalid values consistently fall back to `DescriptionEmpty`.\n */\nexport const DescriptionStatistic = memo(\n ({\n decimalSeparator = '.',\n groupSeparator = ',',\n prefix: Prefix,\n suffix: Suffix,\n precision,\n roundingMode = 'round',\n showTrailingZeros = false,\n size = 'sm',\n trend = 'neutral',\n value = 0,\n className,\n emptyOnZero = true,\n }: DescriptionStatisticProps) => {\n const formatOptions = useMemo((): Intl.NumberFormatOptions => {\n const options: Intl.NumberFormatOptions = {};\n if (typeof precision === 'number' && precision >= 0) {\n if (showTrailingZeros) {\n options.minimumFractionDigits = precision;\n options.maximumFractionDigits = precision;\n } else {\n options.maximumFractionDigits = precision;\n }\n }\n return options;\n }, [precision, showTrailingZeros]);\n\n const formatNumber = useCallback(\n (num: number): string => {\n let processedNum = num;\n if (typeof precision === 'number' && precision >= 0) {\n processedNum = applyRounding(num, precision, roundingMode);\n }\n return processedNum.toLocaleString('vi-VN', formatOptions);\n },\n [roundingMode, formatOptions, precision]\n );\n\n const processedValue = useMemo((): string => {\n if (typeof value === 'number') {\n if (Number.isNaN(value) || !Number.isFinite(value)) return 'N/A';\n return formatNumber(value);\n }\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n if (!trimmedValue) return 'N/A';\n const numValue = Number(trimmedValue);\n if (Number.isNaN(numValue) || !Number.isFinite(numValue)) return 'N/A';\n return formatNumber(numValue);\n }\n return 'N/A';\n }, [value, formatNumber]);\n\n const finalFormattedValue = useMemo((): string => {\n if (decimalSeparator === '.' && groupSeparator === ',') return processedValue;\n return processedValue.replace(/,/g, groupSeparator).replace(/\\./g, decimalSeparator);\n }, [processedValue, decimalSeparator, groupSeparator]);\n\n if ((emptyOnZero && finalFormattedValue === '0') || finalFormattedValue === 'N/A' || !finalFormattedValue) {\n return <DescriptionEmpty />;\n }\n\n return (\n <div data-slot=\"description-statistic\" className={cn(descriptionStatisticVariants({ size, trend }), className)}>\n {!!Prefix && <span data-slot=\"description-statistic-prefix\">{Prefix}</span>}\n <p data-slot=\"description-statistic-value\">{finalFormattedValue}</p>\n {!!Suffix && <span data-slot=\"description-statistic-suffix\">{Suffix}</span>}\n </div>\n );\n }\n);\nDescriptionStatistic.displayName = 'DescriptionStatistic';\n","'use client';\n\nimport type { BadgeProps } from '@/components/ui/badge';\nimport { Badge, badgeDotVariants } from '@/components/ui/badge';\n\nimport { DescriptionEmpty } from './empty';\n\ntype StatusColor = NonNullable<BadgeProps['color']>;\n\ntype DescriptionStatusProps = {\n label: string | null | undefined;\n color?: StatusColor;\n dot?: boolean;\n};\n\nexport const DescriptionStatus: React.FC<DescriptionStatusProps> = ({ label, color = 'info', dot = true }) => {\n if (!label) return <DescriptionEmpty />;\n return (\n <Badge data-slot=\"description-status\" variant=\"soft\" color={color} size=\"sm\" className=\"gap-1.5\">\n {dot && <span className={badgeDotVariants({ color })} />}\n {label}\n </Badge>\n );\n};\n","'use client';\n\nimport type { BadgeProps } from '@/components/ui/badge';\nimport { Badge } from '@/components/ui/badge';\n\nimport { DescriptionEmpty } from './empty';\n\ntype DescriptionTagListProps = {\n tags: Array<string | number> | null | undefined;\n max?: number;\n color?: BadgeProps['color'];\n variant?: BadgeProps['variant'];\n};\n\nexport const DescriptionTagList: React.FC<DescriptionTagListProps> = ({ tags, max = 5, color = 'secondary', variant = 'soft' }) => {\n if (!tags?.length) return <DescriptionEmpty />;\n\n // A tag list is semantically a set — dedupe by string value (also collapses a `1`/`'1'` collision) so\n // the overflow count and the React key are both stable, instead of relying on array index.\n const unique = Array.from(new Map(tags.map(tag => [String(tag), tag])).values());\n const visible = unique.slice(0, max);\n const overflow = unique.length - visible.length;\n\n return (\n <div data-slot=\"description-tag-list\" className=\"flex flex-wrap gap-1\">\n {visible.map(tag => (\n <Badge key={String(tag)} variant={variant} color={color} size=\"sm\">\n {tag}\n </Badge>\n ))}\n {overflow > 0 && (\n <Badge variant=\"outline\" color=\"muted\" size=\"sm\">\n +{overflow}\n </Badge>\n )}\n </div>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Paragraph } from '@/components/typography/paragraph';\nimport { DescriptionEmpty } from './empty';\n\ntype DescriptionTextProps = {\n value: string | number | null | undefined;\n /** `'normal'` (default) or `'medium'` — the two weights used across real detail panels. */\n weight?: 'normal' | 'medium';\n /** Clamp to a single line with an ellipsis. @default false */\n truncate?: boolean;\n className?: string;\n};\n\n/**\n * Plain-text value cell with a built-in `DescriptionEmpty` fallback — use this instead of hand-wrapping\n * a value in `<p className=\"text-sm\">` (the `DescriptionItem` value slot already applies that styling).\n *\n * @example\n * import { DescriptionItem, DescriptionText } from '@customafk/lunas-ui/features/descriptions';\n *\n * <DescriptionItem label=\"Ghi chú\">\n * <DescriptionText value={order.note} />\n * </DescriptionItem>\n */\nexport const DescriptionText: React.FC<DescriptionTextProps> = ({ value, weight = 'normal', truncate = false, className }) => {\n if (value == null || value === '') return <DescriptionEmpty />;\n return (\n <Paragraph data-slot=\"description-text\" variant=\"sm\" className={cn(weight === 'medium' && 'font-medium', truncate && 'truncate', className)}>\n {value}\n </Paragraph>\n );\n};\n","'use client';\n\nimport { UserDataDisplay } from '@/components/data-display/user';\nimport { DescriptionEmpty } from './empty';\n\ntype DescriptionUserProps = {\n uuid?: string | null;\n username?: string | null;\n email?: string | null;\n};\n\nexport const DescriptionUser: React.FC<DescriptionUserProps> = ({ uuid, username, email }) => {\n if (!uuid && !username) return <DescriptionEmpty />;\n return <UserDataDisplay uuid={uuid ?? ''} username={username ?? ''} email={email ?? ''} />;\n};\n","'use client';\n\nimport { Children, isValidElement, use, useMemo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { type TUIGridBreakpoint, type TUIGridItemSpan, type TUIGridSpan, UIGrid, UIGridItem } from '@/components/layouts/ui-grid';\nimport { DescriptionConfigContext, DescriptionRowContext, type TDescriptionConfig, type TDescriptionLabelColSpan } from './context';\nimport { descriptionRowVariants } from './descriptions.variants';\n\n/** Column counts that divide 12 evenly, so every cell in a `DescriptionRow` is equal-width. */\nexport type TDescriptionRowColumns = 1 | 2 | 3 | 4 | 6;\n\n/**\n * Number of `DescriptionItem`s laid out per row — a plain number resolves to `{ base: 1, md: N }`\n * (stacked below 448px, `N`-per-row above), or an object varies it per container-query breakpoint\n * the same way `UIGrid.cols`/`labelColSpan` do.\n */\nexport type TDescriptionRowColumnsConfig = TDescriptionRowColumns | Partial<Record<TUIGridBreakpoint, TDescriptionRowColumns>>;\n\nconst COLUMN_TO_SPAN: Record<TDescriptionRowColumns, TUIGridSpan> = { 1: 12, 2: 6, 3: 4, 4: 3, 6: 2 };\n\nfunction resolveCellSpan(columns: TDescriptionRowColumnsConfig): TUIGridItemSpan {\n if (typeof columns === 'number') return { base: 12, md: COLUMN_TO_SPAN[columns] };\n return Object.fromEntries(\n Object.entries({ base: 1 as TDescriptionRowColumns, ...columns }).map(([breakpoint, n]) => [breakpoint, COLUMN_TO_SPAN[n]])\n ) as TUIGridItemSpan;\n}\n\n/**\n * Lays a run of `DescriptionItem`s out `columns`-per-row instead of each taking the full row width —\n * an explicit wrapper rather than auto-detecting consecutive `DescriptionItem` children, so the layout\n * never depends on how the children happen to be written (`.map()`, a `Fragment`, a conditional, ...).\n *\n * Each cell nests its own `UIGrid` (the one `DescriptionItem` already renders internally for its\n * label/value split) inside this row's `UIGrid` cell — both declare the same named `@container/ui-grid`\n * context, so the nearer one wins and a squeezed cell's label column resolves against the *cell's* own\n * width, not the full row's, which is exactly what you want (a half-width cell gets the wider `base: 5`\n * label share automatically).\n *\n * There's no vertical rule between cells by default: with a responsive `columns`, \"last cell in a visual\n * row\" isn't knowable in CSS, so a blanket rule would put a stray line flush against the card's own right\n * edge on every row. Pass `divided` only when every row is known to divide evenly.\n *\n * @example\n * import { Description, DescriptionRow, DescriptionItem } from '@customafk/lunas-ui/features/descriptions';\n *\n * <Description>\n * <DescriptionRow columns={2}>\n * <DescriptionItem label=\"First name\">John</DescriptionItem>\n * <DescriptionItem label=\"Last name\">Doe</DescriptionItem>\n * </DescriptionRow>\n * </Description>\n */\nexport const DescriptionRow: React.FC<\n React.PropsWithChildren<{\n /** @default 2 */\n columns?: TDescriptionRowColumnsConfig;\n /** Label column width override for every `DescriptionItem` in this row (they'd otherwise inherit the panel default). */\n labelColSpan?: TDescriptionLabelColSpan;\n /** Renders a vertical rule between cells. Only safe when every row has exactly `columns` items. @default false */\n divided?: boolean;\n className?: string;\n }>\n> = ({ columns = 2, labelColSpan, divided = false, className, children }) => {\n const inherited = use(DescriptionConfigContext);\n const span = useMemo(() => resolveCellSpan(columns), [columns]);\n const rowConfig = useMemo<TDescriptionConfig>(() => (labelColSpan ? { ...inherited, labelColSpan } : inherited), [inherited, labelColSpan]);\n const cells = Children.toArray(children).filter(isValidElement);\n\n return (\n <DescriptionConfigContext.Provider value={rowConfig}>\n <DescriptionRowContext.Provider value={true}>\n <div\n data-slot=\"description-row\"\n data-columns={typeof columns === 'number' ? columns : 'responsive'}\n className={cn(descriptionRowVariants({ bordered: inherited.bordered }), className)}\n >\n <UIGrid cols={12} gap=\"none\">\n {cells.map((cell, i) => (\n <UIGridItem\n key={cell.key ?? i}\n span={span}\n suspense={false}\n data-slot=\"description-row-cell\"\n className={cn('min-w-0', divided && i < cells.length - 1 && 'border-r border-r-border')}\n >\n {cell}\n </UIGridItem>\n ))}\n </UIGrid>\n </div>\n </DescriptionRowContext.Provider>\n </DescriptionConfigContext.Provider>\n );\n};\n","'use client';\n\nimport { use } from 'react';\n\nimport { SearchIcon, XIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Input } from '@/components/ui/input';\n\nimport { DescriptionConfigContext, DescriptionSearchContext } from './context';\n\ntype DescriptionSearchProps = {\n /** @default 'Tìm kiếm...' */\n placeholder?: string;\n autoFocus?: boolean;\n className?: string;\n};\n\n/**\n * A live, as-you-type filter for a `Description`'s `DescriptionItem`s — no debounce, since matching is a\n * cheap string test over at most a few dozen items. Place it inside `DescriptionHeader`'s `extra` slot\n * (the header is sticky by default, so the input stays reachable while scrolling filtered results); it\n * also works as a direct child of `Description`.\n *\n * Filters by case- and diacritic-insensitive substring match against each `DescriptionItem`'s `label` —\n * this is cross-cutting by design (every sibling item reads the query from context), so no wiring is\n * needed beyond mounting this component once per panel.\n *\n * @example\n * import { Description, DescriptionHeader, DescriptionSearch } from '@customafk/lunas-ui/features/descriptions';\n *\n * <Description>\n * <DescriptionHeader title=\"Order details\" extra={<DescriptionSearch />} />\n * ...\n * </Description>\n */\nexport const DescriptionSearch: React.FC<DescriptionSearchProps> = ({ placeholder = 'Tìm kiếm...', autoFocus, className }) => {\n const { query, setQuery } = use(DescriptionSearchContext);\n const { size } = use(DescriptionConfigContext);\n const inputSize = size === 'xs' || size === 'sm' ? 'xs' : 'sm';\n\n return (\n <div data-slot=\"description-search\" className={cn('relative w-full max-w-56', className)}>\n <SearchIcon size={14} className=\"-translate-y-1/2 pointer-events-none absolute top-1/2 left-2 text-text-positive-muted\" />\n <Input\n size={inputSize}\n value={query}\n autoFocus={autoFocus}\n placeholder={placeholder}\n onValueChange={setQuery}\n aria-label={placeholder}\n className=\"pl-7\"\n />\n {query !== '' && (\n <button\n type=\"button\"\n data-slot=\"description-search-clear\"\n aria-label=\"Xoá tìm kiếm\"\n onClick={() => setQuery('')}\n className=\"-translate-y-1/2 absolute top-1/2 right-1.5 cursor-pointer text-text-positive-muted transition-colors hover:text-text-positive\"\n >\n <XIcon size={14} />\n </button>\n )}\n </div>\n );\n};\n","'use client';\n\nimport { use, useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport { Flex } from '@/components/layouts/flex';\nimport { type TUIGridItemSpan, UIGrid, UIGridItem } from '@/components/layouts/ui-grid';\nimport {\n DescriptionConfigContext,\n DescriptionGroupContext,\n DescriptionRowContext,\n DescriptionSearchContext,\n DescriptionSectionScopeContext,\n type TDescriptionConfig,\n type TDescriptionLabelColSpan,\n} from './context';\nimport {\n type DescriptionVariants,\n descriptionGroupVariants,\n descriptionHeaderDescriptionVariants,\n descriptionHeaderTitleVariants,\n descriptionHeaderVariants,\n descriptionItemLabelVariants,\n descriptionItemValueVariants,\n descriptionItemVariants,\n descriptionSectionVariants,\n descriptionVariants,\n type TDescriptionSize,\n} from './descriptions.variants';\nimport { matchesSearch } from './search-utils';\n\nexport * from './collapsible-section';\nexport * from './components';\nexport * from './context';\nexport * from './descriptions.variants';\nexport * from './row';\nexport * from './search';\n\nconst DEFAULT_BASE_LABEL_SPAN = 5 as const;\n/** Wider label column below 384px/448px (roomier inside a narrow SidePanel/Dialog), settling to today's 3/12 from 448px up. */\nconst DEFAULT_LABEL_COL_SPAN: TDescriptionLabelColSpan = { base: DEFAULT_BASE_LABEL_SPAN, sm: 4, md: 3 };\n\n/** Guarantees a `base` entry so no container width is left without a col-span class. */\nfunction normalizeLabelSpan(value: TDescriptionLabelColSpan): TUIGridItemSpan {\n return typeof value === 'number' ? value : { base: DEFAULT_BASE_LABEL_SPAN, ...value };\n}\n\n/** Complement of the label span at every breakpoint — always 1–11 since the label span type excludes 12. */\nfunction toValueSpan(value: TUIGridItemSpan): TUIGridItemSpan {\n if (typeof value === 'number') return (12 - value) as TUIGridItemSpan;\n return Object.fromEntries(Object.entries(value).map(([breakpoint, span]) => [breakpoint, 12 - (span as number)])) as TUIGridItemSpan;\n}\n\n/**\n * Tracks whether an element's content is currently clipped by `truncate` (`scrollWidth > clientWidth`),\n * re-checking on resize since a responsive label column changes width without the element unmounting.\n *\n * Uses a callback ref rather than a ref object + mount-only effect: the caller's returned JSX shape\n * changes once `truncated` flips (bare span → `Tooltip`-wrapped span), which makes React unmount the old\n * span and mount a new one at that position. A one-time effect would keep observing the now-detached old\n * node — which reports a spurious resize to 0×0 once removed — flipping `truncated` back off. A callback\n * ref fires again on every such swap, so the observer always tracks the currently-mounted node.\n */\nfunction useIsTruncated<T extends HTMLElement>() {\n const [truncated, setTruncated] = useState(false);\n const cleanupRef = useRef<() => void>(() => {});\n\n const ref = useCallback((el: T | null) => {\n cleanupRef.current();\n if (!el) {\n cleanupRef.current = () => {};\n return;\n }\n const check = () => setTruncated(el.scrollWidth > el.clientWidth);\n check();\n const observer = new ResizeObserver(check);\n observer.observe(el);\n // ResizeObserver only fires when the element's own box size changes — not when its content's natural\n // width changes while the box stays fixed (e.g. a web font finishing load after the initial layout,\n // which reflows text metrics without resizing the already-truncated box). Re-check once fonts settle.\n document.fonts?.ready.then(check);\n cleanupRef.current = () => observer.disconnect();\n }, []);\n\n return [ref, truncated] as const;\n}\n\n/** Keeps the label column to a single line — a long label truncates with an ellipsis instead of wrapping to a second line. Only wraps in a `Tooltip` when the text is actually clipped, so a label that already fits doesn't get a redundant hover affordance. */\nconst DescriptionItemLabelText: React.FC<{ label: string }> = ({ label }) => {\n const [ref, truncated] = useIsTruncated<HTMLSpanElement>();\n const span = (\n <span ref={ref} data-slot=\"description-item-label-text\" className=\"min-w-0 flex-1 cursor-default truncate\">\n {label}\n </span>\n );\n\n if (!truncated) return span;\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{span}</TooltipTrigger>\n <TooltipContent align=\"start\">{label}</TooltipContent>\n </Tooltip>\n );\n};\n\n/**\n * A single labeled row within a {@link Description} container, supporting both horizontal (side-by-side label/value) and vertical (stacked) layouts.\n *\n * The label column width defaults to a responsive `{ base: 5, sm: 4, md: 3 }` (out of 12) — wider on narrow\n * containers like a `SidePanel`, settling to the classic 3/12 from 448px up — and can be overridden per-item\n * via `labelColSpan`, or for every item in a panel at once via {@link Description}'s own `labelColSpan` prop.\n * A label that doesn't fit its column truncates to a single line with an ellipsis — never wraps to a second\n * line — and shows the full text in a tooltip on hover/focus.\n *\n * Renders inline `size`/`bordered` inherited from the nearest {@link Description}, and, if placed inside a\n * {@link DescriptionSearch}-enabled panel, hides itself (`hidden` + `data-search-hidden`) when its `label`\n * doesn't match the live query — no props needed for this, it's cross-cutting via context.\n *\n * @example\n * import { Description, DescriptionItem } from '@customafk/lunas-ui/features/descriptions';\n *\n * <Description>\n * <DescriptionItem label=\"Full name\">John Doe</DescriptionItem>\n * <DescriptionItem label=\"Email\" orientation=\"vertical\">john@example.com</DescriptionItem>\n * </Description>\n */\nexport const DescriptionItem: React.FC<\n React.PropsWithChildren<{\n /** Text displayed in the label column. */\n label: string;\n /**\n * Column width (out of 12) allocated to the label in horizontal orientation. Overrides\n * whatever the parent {@link Description}'s own `labelColSpan` (or the library default) is.\n * @default { base: 5, sm: 4, md: 3 }\n */\n labelColSpan?: TDescriptionLabelColSpan;\n /**\n * Layout direction of the label/value pair.\n * - `'horizontal'` — label and value are side by side.\n * - `'vertical'` — label sits above the value.\n * @default 'horizontal'\n */\n orientation?: 'horizontal' | 'vertical';\n /** Optional node rendered in the top-right corner of the label area (e.g. an edit action). */\n action?: React.ReactNode;\n /**\n * Horizontal alignment of the label text within its column.\n * @default 'start'\n */\n labelAlign?: 'start' | 'end';\n }>\n> = ({ label, labelColSpan, orientation = 'horizontal', action, labelAlign = 'start', children }) => {\n const config = use(DescriptionConfigContext);\n const inRow = use(DescriptionRowContext);\n const { query } = use(DescriptionSearchContext);\n const sectionScope = use(DescriptionSectionScopeContext);\n const matched = matchesSearch(label, query);\n const registrationId = useId();\n\n // Reports this item's match state to the nearest DescriptionCollapsibleSection (if any), so the section\n // can decide its own visibility. Both branches bail out of the state update when nothing changed, which\n // is what keeps this from looping: report(id, null) on unmount only removes an existing entry.\n useEffect(() => {\n if (!sectionScope) return;\n sectionScope.report(registrationId, matched);\n return () => sectionScope.report(registrationId, null);\n }, [sectionScope, registrationId, matched]);\n\n const searchHiddenProps = matched ? undefined : ({ 'data-search-hidden': 'true' } as const);\n\n if (orientation === 'vertical') {\n return (\n <div\n data-slot=\"description-item\"\n data-orientation=\"vertical\"\n {...searchHiddenProps}\n className={cn(descriptionItemVariants({ orientation: 'vertical', bordered: config.bordered, inRow }), !matched && 'hidden')}\n >\n <Flex\n data-slot=\"description-item-label\"\n width=\"full\"\n padding=\"none\"\n gap=\"none\"\n wrap={false}\n align=\"center\"\n justify={labelAlign === 'end' ? 'end' : 'between'}\n className={descriptionItemLabelVariants({ orientation: 'vertical', size: config.size, bordered: config.bordered })}\n >\n <DescriptionItemLabelText label={label} />\n {!!action && (\n <div data-slot=\"description-item-action\" className=\"shrink-0\">\n {action}\n </div>\n )}\n </Flex>\n <Flex\n data-slot=\"description-item-value\"\n width=\"full\"\n padding=\"none\"\n wrap\n align=\"center\"\n gap=\"sm\"\n className={descriptionItemValueVariants({ size: config.size })}\n >\n {children}\n </Flex>\n </div>\n );\n }\n\n const labelSpan = normalizeLabelSpan(labelColSpan ?? config.labelColSpan ?? DEFAULT_LABEL_COL_SPAN);\n const valueSpan = toValueSpan(labelSpan);\n\n return (\n <div\n data-slot=\"description-item\"\n data-orientation=\"horizontal\"\n {...searchHiddenProps}\n className={cn(descriptionItemVariants({ orientation: 'horizontal', bordered: config.bordered, inRow }), !matched && 'hidden')}\n >\n <UIGrid cols={12} gap=\"none\">\n <UIGridItem span={labelSpan} suspense={false} className=\"min-w-0\">\n <Flex\n data-slot=\"description-item-label\"\n width=\"full\"\n padding=\"none\"\n gap=\"none\"\n wrap={false}\n align=\"center\"\n justify={labelAlign === 'end' ? 'end' : 'between'}\n className={descriptionItemLabelVariants({ orientation: 'horizontal', size: config.size, bordered: config.bordered })}\n >\n <DescriptionItemLabelText label={label} />\n {!!action && (\n <div data-slot=\"description-item-action\" className=\"shrink-0 pr-1\">\n {action}\n </div>\n )}\n </Flex>\n </UIGridItem>\n <UIGridItem span={valueSpan} suspense={false} className=\"min-w-0\">\n <Flex\n data-slot=\"description-item-value\"\n width=\"full\"\n padding=\"none\"\n wrap\n align=\"center\"\n gap=\"sm\"\n className={descriptionItemValueVariants({ size: config.size })}\n >\n {children}\n </Flex>\n </UIGridItem>\n </UIGrid>\n </div>\n );\n};\n\n/**\n * A header bar for a {@link Description} block, showing a title, an optional subtitle, and an optional trailing action area.\n *\n * @example\n * import { Description, DescriptionHeader } from '@customafk/lunas-ui/features/descriptions';\n *\n * <Description>\n * <DescriptionHeader title=\"User details\" description=\"Read-only overview\" extra={<EditBtn />} />\n * </Description>\n */\nexport const DescriptionHeader: React.FC<{\n /** Primary heading text. */\n title: string;\n /** Optional secondary text rendered below the title in a smaller, muted style. */\n description?: string;\n /** Optional node rendered on the right side of the header (e.g. action buttons, a {@link DescriptionSearch}). */\n extra?: React.ReactNode;\n /**\n * Sticks the header to the top of its scroll container (`sticky top-0 z-30`). Disable when the\n * header is rendered inside a non-scrolling context (e.g. a `Dialog`) where stickiness has no effect.\n * @default true\n */\n sticky?: boolean;\n /** Additional CSS class names applied to the header wrapper. */\n className?: string;\n}> = ({ title, description, extra, sticky = true, className }) => {\n const config = use(DescriptionConfigContext);\n return (\n <Flex\n data-slot=\"description-header\"\n width=\"full\"\n padding=\"none\"\n gap=\"md\"\n wrap={false}\n justify=\"between\"\n align=\"center\"\n className={cn(descriptionHeaderVariants({ sticky, size: config.size, bordered: config.bordered }), className)}\n >\n <Flex vertical width=\"full\" padding=\"none\" gap=\"none\" align=\"start\" className=\"min-w-0 gap-0.5\">\n <p className={descriptionHeaderTitleVariants({ size: config.size })}>{title}</p>\n {!!description && <p className={descriptionHeaderDescriptionVariants({ size: config.size })}>{description}</p>}\n </Flex>\n {!!extra && (\n <div data-slot=\"description-header-extra\" className=\"shrink-0\">\n {extra}\n </div>\n )}\n </Flex>\n );\n};\n\n/**\n * A visual section divider inside a {@link Description} container that optionally displays a section title with a decorative horizontal rule.\n *\n * This flat divider stays always-visible during a {@link DescriptionSearch} filter (it has no ownership of\n * the items that follow it). Use {@link DescriptionCollapsibleSection} instead when you want a section that\n * auto-hides once every item inside it is filtered out.\n *\n * @example\n * import { Description, DescriptionSection, DescriptionItem } from '@customafk/lunas-ui/features/descriptions';\n *\n * <Description>\n * <DescriptionSection title=\"Contact\" />\n * <DescriptionItem label=\"Email\">john@example.com</DescriptionItem>\n * </Description>\n */\nexport const DescriptionSection: React.FC<{\n /** Optional section label rendered as uppercase small-caps text beside the divider line. */\n title?: string;\n /** Additional CSS class names applied to the section wrapper. */\n className?: string;\n}> = ({ title, className }) => {\n const config = use(DescriptionConfigContext);\n return (\n <Flex\n data-slot=\"description-section\"\n width=\"full\"\n padding=\"none\"\n gap=\"none\"\n wrap={false}\n align=\"center\"\n className={cn(descriptionSectionVariants({ size: config.size, bordered: config.bordered }), className)}\n >\n {!!title && <p className=\"shrink-0 font-semibold text-text-positive-weak text-xs uppercase tracking-widest\">{title}</p>}\n <div className=\"h-px flex-1 bg-border\" />\n </Flex>\n );\n};\n\n/** Fixed pool of stable row keys for the loading skeleton — avoids array-index keys while still supporting up to 24 `loadingRows`. */\nconst SKELETON_ROW_KEYS = Array.from({ length: 24 }, (_, i) => `description-loading-row-${i}`);\n\nconst DescriptionLoadingSkeleton: React.FC<{ rows: number }> = ({ rows }) => {\n const config = use(DescriptionConfigContext);\n const labelSpan = normalizeLabelSpan(config.labelColSpan ?? DEFAULT_LABEL_COL_SPAN);\n const valueSpan = toValueSpan(labelSpan);\n\n return (\n <div data-slot=\"description-loading\">\n <Flex\n data-slot=\"description-loading-header\"\n width=\"full\"\n padding=\"none\"\n gap=\"md\"\n wrap={false}\n justify=\"between\"\n align=\"center\"\n className={descriptionHeaderVariants({ sticky: false, size: config.size, bordered: config.bordered })}\n >\n <Flex vertical padding=\"none\" gap=\"none\" align=\"start\" className=\"gap-1.5\">\n <Skeleton className=\"h-3.5 w-36\" />\n <Skeleton className=\"h-2.5 w-24\" />\n </Flex>\n <Skeleton className=\"h-5 w-16\" />\n </Flex>\n {SKELETON_ROW_KEYS.slice(0, rows).map(key => (\n <div key={key} data-slot=\"description-loading-row\" className={descriptionItemVariants({ orientation: 'horizontal', bordered: config.bordered })}>\n <UIGrid cols={12} gap=\"none\">\n <UIGridItem span={labelSpan} suspense={false} className=\"min-w-0\">\n <Flex\n width=\"full\"\n padding=\"none\"\n gap=\"none\"\n wrap={false}\n align=\"center\"\n className={descriptionItemLabelVariants({ orientation: 'horizontal', size: config.size, bordered: config.bordered })}\n >\n <Skeleton className=\"h-3 w-20\" />\n </Flex>\n </UIGridItem>\n <UIGridItem span={valueSpan} suspense={false} className=\"min-w-0\">\n <Flex width=\"full\" padding=\"none\" wrap align=\"center\" gap=\"sm\" className={descriptionItemValueVariants({ size: config.size })}>\n <Skeleton className=\"h-3 w-28\" />\n </Flex>\n </UIGridItem>\n </UIGrid>\n </div>\n ))}\n </div>\n );\n};\n\n/**\n * Root container for a description block — a bordered, rounded card that groups {@link DescriptionHeader}, {@link DescriptionSection}, and {@link DescriptionItem} elements.\n *\n * Set `nested` when embedding one `Description` inside another (removes the outer card shadow/ring and constrains sizing).\n * Set `loading` to replace content with animated skeleton rows while data is being fetched.\n * Set `labelColSpan` to apply the same label column width to every child `DescriptionItem` at once.\n * Set `size`/`bordered` to apply the same size scale / border style to every descendant at once — both\n * inherit from an ancestor `Description`/`DescriptionGroup` when omitted, so a nested panel matches its\n * parent by default.\n *\n * @example\n * import { Description, DescriptionHeader, DescriptionItem } from '@customafk/lunas-ui/features/descriptions';\n *\n * <Description>\n * <DescriptionHeader title=\"Order #1234\" />\n * <DescriptionItem label=\"Status\">Shipped</DescriptionItem>\n * <DescriptionItem label=\"Total\">$99.00</DescriptionItem>\n * </Description>\n */\nexport const Description: React.FC<\n React.PropsWithChildren<{\n /** Additional CSS class names applied to the root wrapper element. */\n className?: string;\n /** Strips the outer card shadow/ring and adapts sizing for embedding inside another Description. */\n nested?: boolean;\n /** Replaces children with animated skeleton rows while data is loading. */\n loading?: boolean;\n /** Number of skeleton rows shown when `loading` is true (max 24). @default 4 */\n loadingRows?: number;\n /** Label column width applied to every child `DescriptionItem` that doesn't set its own `labelColSpan`. */\n labelColSpan?: TDescriptionLabelColSpan;\n /** Padding/typography scale for every descendant. Inherits from an ancestor `Description`/`DescriptionGroup` when omitted. @default 'md' */\n size?: TDescriptionSize;\n /** Whether the card chrome and every internal grid line render. `false` strips both the outer border and the inner label background/dividers for a flat look. Inherits when omitted. @default true */\n bordered?: boolean;\n }>\n> = ({ children, className, nested = false, loading = false, loadingRows = 4, labelColSpan, size, bordered }) => {\n const inGroup = use(DescriptionGroupContext);\n const inherited = use(DescriptionConfigContext);\n const [query, setQuery] = useState('');\n const config = useMemo<TDescriptionConfig>(\n () => ({\n labelColSpan: labelColSpan ?? inherited.labelColSpan,\n size: size ?? inherited.size,\n bordered: bordered ?? inherited.bordered,\n }),\n [labelColSpan, size, bordered, inherited]\n );\n const search = useMemo(() => ({ query, setQuery }), [query]);\n const surface: NonNullable<DescriptionVariants['surface']> = inGroup ? 'grouped' : nested ? 'nested' : 'card';\n\n return (\n <DescriptionConfigContext.Provider value={config}>\n <DescriptionSearchContext.Provider value={search}>\n <div data-slot=\"description\" data-surface={surface} className={cn(descriptionVariants({ surface, bordered: config.bordered }), className)}>\n {loading ? <DescriptionLoadingSkeleton rows={loadingRows} /> : children}\n </div>\n </DescriptionSearchContext.Provider>\n </DescriptionConfigContext.Provider>\n );\n};\n\n/**\n * A scrollable container that groups multiple {@link Description} blocks and makes each\n * {@link DescriptionHeader} sticky. As you scroll, the next section header stacks above\n * (pushes out) the previous one — standard CSS sticky behaviour within a single scroll context.\n *\n * `size`/`bordered` set here cascade to every child `Description` that doesn't set its own.\n *\n * @example\n * import { DescriptionGroup, Description, DescriptionHeader, DescriptionItem } from '@customafk/lunas-ui/features/descriptions';\n *\n * <DescriptionGroup>\n * <Description>\n * <DescriptionHeader title=\"Personal info\" />\n * <DescriptionItem label=\"Name\">John Doe</DescriptionItem>\n * </Description>\n * <Description>\n * <DescriptionHeader title=\"Contact\" />\n * <DescriptionItem label=\"Email\">john@example.com</DescriptionItem>\n * </Description>\n * </DescriptionGroup>\n */\nexport const DescriptionGroup: React.FC<\n React.PropsWithChildren<{\n /** Additional CSS class names applied to the group wrapper. */\n className?: string;\n /** Applied to every child `Description` that doesn't set its own. @default 'md' */\n size?: TDescriptionSize;\n /** Applied to every child `Description` that doesn't set its own. @default true */\n bordered?: boolean;\n }>\n> = ({ children, className, size, bordered }) => {\n const inherited = use(DescriptionConfigContext);\n const config = useMemo<TDescriptionConfig>(\n () => ({\n labelColSpan: inherited.labelColSpan,\n size: size ?? inherited.size,\n bordered: bordered ?? inherited.bordered,\n }),\n [size, bordered, inherited]\n );\n\n return (\n <DescriptionGroupContext.Provider value={true}>\n <DescriptionConfigContext.Provider value={config}>\n <div data-slot=\"description-group\" className={cn(descriptionGroupVariants({ bordered: config.bordered }), className)}>\n {children}\n </div>\n </DescriptionConfigContext.Provider>\n </DescriptionGroupContext.Provider>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const e=require("./typography/paragraph.cjs"),t=require("./ui/skeleton.cjs"),n=require("./ui/image.cjs"),r=require("./layouts/flex.cjs"),i=require("./date-B3cozmfV.cjs"),a=require("./ui/badge.cjs"),o=require("./ui/tooltip.cjs"),s=require("./phone-CUxXVTg6.cjs"),c=require("./data-display/user.cjs"),l=require("./layouts/ui-grid.cjs"),u=require("./ui/collapsible.cjs"),d=require("./ui/progress.cjs"),f=require("./ui/input.cjs");let p=require("lucide-react"),m=require("react"),h=require("@customafk/react-toolkit/utils"),g=require("class-variance-authority"),_=require("react/jsx-runtime"),v=require("@customafk/react-toolkit/hooks/useCopyToClipboard");const y=(0,m.createContext)(!1),b={labelColSpan:null,size:`md`,bordered:!0},x=(0,m.createContext)(b),S=(0,m.createContext)(!1),C=(0,m.createContext)({query:``,setQuery:()=>{}}),w=(0,m.createContext)(null),T=(0,g.cva)(`relative flex flex-col bg-card`,{variants:{surface:{card:`size-full overflow-y-auto rounded-lg`,nested:`w-full overflow-hidden rounded-md`,grouped:``},bordered:{true:``,false:`bg-transparent shadow-none ring-0`}},compoundVariants:[{surface:`card`,bordered:!0,className:`border border-border shadow-card ring-1 ring-border-weak`},{surface:`nested`,bordered:!0,className:`border border-border`},{surface:`grouped`,bordered:!0,className:`border-b border-b-border last:border-b-0`}],defaultVariants:{surface:`card`,bordered:!0}}),E=(0,g.cva)(`relative size-full overflow-y-auto rounded-lg bg-card`,{variants:{bordered:{true:`border border-border shadow-card ring-1 ring-border-weak`,false:``}},defaultVariants:{bordered:!0}}),D=(0,g.cva)(`bg-card`,{variants:{sticky:{true:`sticky top-0 z-30`,false:`relative`},size:{xs:`px-2.5 py-1.5`,sm:`px-3 py-2`,md:`px-4 py-3`,lg:`px-5 py-3.5`,xl:`px-6 py-4`},bordered:{true:`border-b border-b-border`,false:``}},defaultVariants:{sticky:!0,size:`md`,bordered:!0}}),O=(0,g.cva)(`truncate font-semibold text-text-positive`,{variants:{size:{xs:`text-xs`,sm:`text-xs`,md:`text-sm`,lg:`text-base`,xl:`text-lg`}},defaultVariants:{size:`md`}}),k=(0,g.cva)(`text-text-positive-weak`,{variants:{size:{xs:`text-[10px]`,sm:`text-[11px]`,md:`text-xs`,lg:`text-sm`,xl:`text-sm`}},defaultVariants:{size:`md`}}),A=(0,g.cva)(``,{variants:{size:{xs:`gap-2 px-2.5 py-1.5`,sm:`gap-2.5 px-3 py-2`,md:`gap-3 px-4 py-2.5`,lg:`gap-3 px-5 py-3`,xl:`gap-4 px-6 py-3.5`},bordered:{true:`border-b border-b-border`,false:``}},defaultVariants:{size:`md`,bordered:!0}}),j=`last:border-b-0 [&:not(:has(~:is([data-slot="description-item"],[data-slot="description-row"]):not([data-search-hidden])))]:border-b-0`,M=(0,g.cva)(``,{variants:{orientation:{horizontal:``,vertical:`flex flex-col`},bordered:{true:`border-b border-b-border ${j}`,false:``},inRow:{true:``,false:``}},compoundVariants:[{inRow:!0,bordered:!0,className:`border-b-0`}],defaultVariants:{orientation:`horizontal`,bordered:!0,inRow:!1}}),N=(0,g.cva)(`font-medium text-text-positive-weak`,{variants:{orientation:{horizontal:`h-full min-w-full tabular-nums`,vertical:``},size:{xs:`text-[11px]`,sm:`text-xs`,md:`text-sm`,lg:`text-sm`,xl:`text-base`},bordered:{true:`bg-secondary-muted`,false:``}},compoundVariants:[{orientation:`horizontal`,bordered:!0,className:`border-r border-r-border`},{orientation:`vertical`,bordered:!0,className:`border-b border-b-border`},{orientation:`horizontal`,size:`xs`,className:`py-1.5 pr-1.5 pl-2.5`},{orientation:`horizontal`,size:`sm`,className:`py-2 pr-2 pl-3`},{orientation:`horizontal`,size:`md`,className:`py-3 pr-2 pl-4`},{orientation:`horizontal`,size:`lg`,className:`py-3.5 pr-2.5 pl-5`},{orientation:`horizontal`,size:`xl`,className:`py-4 pr-3 pl-6`},{orientation:`vertical`,size:`xs`,className:`py-1 pr-1.5 pl-2.5`},{orientation:`vertical`,size:`sm`,className:`py-1.5 pr-2 pl-3`},{orientation:`vertical`,size:`md`,className:`py-2 pr-2 pl-4`},{orientation:`vertical`,size:`lg`,className:`py-2.5 pr-2.5 pl-5`},{orientation:`vertical`,size:`xl`,className:`py-3 pr-3 pl-6`},{bordered:!1,className:`pl-0`}],defaultVariants:{orientation:`horizontal`,size:`md`,bordered:!0}}),P=(0,g.cva)(`text-text-positive`,{variants:{size:{xs:`py-1.5 pr-1.5 pl-2.5 text-[11px]`,sm:`py-2 pr-2 pl-3 text-xs`,md:`py-3 pr-2 pl-4 text-sm`,lg:`py-3.5 pr-2.5 pl-5 text-sm`,xl:`py-4 pr-3 pl-6 text-base`}},defaultVariants:{size:`md`}}),F=(0,g.cva)(``,{variants:{bordered:{true:`border-b border-b-border ${j}`,false:``}},defaultVariants:{bordered:!0}});function I(e){return e.normalize(`NFD`).replace(/\p{Diacritic}/gu,``).toLowerCase().replace(/đ/g,`d`).trim()}function L(e,t){return t.trim()===``||I(e).includes(I(t))}const ee=({title:e,defaultOpen:t=!0,open:n,onOpenChange:r,collapsible:i=!0,className:a,children:o})=>{let s=(0,m.use)(x),{query:c}=(0,m.use)(C),[l,d]=(0,m.useState)(t),[f,g]=(0,m.useState)({}),v=(0,m.useCallback)((e,t)=>{g(n=>{if(t===null){if(!(e in n))return n;let{[e]:t,...r}=n;return r}return n[e]===t?n:{...n,[e]:t}})},[]),y=(0,m.useMemo)(()=>({report:v}),[v]),b=(0,m.useMemo)(()=>Object.values(f).some(Boolean),[f]),S=L(e,c),T=c.trim()!==``,E=T&&!S&&!b,D=n!==void 0,O=!D&&T&&b?!0:D?n:l,k=(0,m.useCallback)(e=>{D||d(e),r?.(e)},[D,r]),j=E?{"data-search-hidden":`true`}:void 0,M=(0,h.cn)(`group/section flex w-full items-center gap-3 text-left outline-none`,i&&`cursor-pointer transition-colors hover:bg-secondary-muted/60`,`focus-visible:ring-[3px] focus-visible:ring-border-weak`,A({size:s.size,bordered:s.bordered})),N=(0,_.jsx)(`p`,{className:`shrink-0 font-semibold text-text-positive-weak text-xs uppercase tracking-widest`,children:e}),P=(0,_.jsx)(`span`,{className:`h-px flex-1 bg-border`});return i?(0,_.jsxs)(u.Collapsible,{open:O,onOpenChange:k,"data-slot":`description-collapsible-section`,...j,className:(0,h.cn)(E&&`hidden`,a),children:[(0,_.jsxs)(u.CollapsibleTrigger,{"data-slot":`description-collapsible-section-trigger`,className:M,children:[(0,_.jsx)(p.ChevronDownIcon,{size:14,className:`-rotate-90 shrink-0 text-text-positive-weak transition-transform duration-200 group-data-[state=open]/section:rotate-0`}),N,P]}),(0,_.jsx)(u.CollapsibleContent,{"data-slot":`description-collapsible-section-content`,forceMount:!0,inert:!O,className:`fill-mode-forwards overflow-hidden data-[state=closed]:h-0 data-[state=open]:h-auto data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down`,children:(0,_.jsx)(w.Provider,{value:y,children:o})})]}):(0,_.jsxs)(`div`,{"data-slot":`description-collapsible-section`,...j,className:(0,h.cn)(E&&`hidden`,a),children:[(0,_.jsxs)(`div`,{"data-slot":`description-collapsible-section-trigger`,className:M,children:[N,P]}),(0,_.jsx)(w.Provider,{value:y,children:o})]})},R=()=>(0,_.jsx)(`span`,{"data-slot":`description-empty`,"aria-label":`Empty value`,className:`select-none font-medium text-sm text-text-positive-muted`,children:`—`}),te=({label:e,color:t=`secondary`,variant:n=`soft`,size:r=`sm`})=>e?(0,_.jsx)(a.Badge,{"data-slot":`description-badge`,color:t,variant:n,size:r,children:e}):(0,_.jsx)(R,{}),ne=({value:e,trueLabel:t=`Yes`,falseLabel:n=`No`})=>e==null?(0,_.jsx)(R,{}):(0,_.jsx)(a.Badge,{"data-slot":`description-boolean`,variant:`soft`,color:e?`success`:`danger`,size:`sm`,children:e?t:n}),re=({value:e,label:t})=>{if(!e?.trim())return(0,_.jsx)(R,{});let n=t??e.toUpperCase();return(0,_.jsxs)(`span`,{"data-slot":`description-color`,className:`inline-flex items-center gap-2 text-sm text-text-positive`,children:[(0,_.jsx)(`span`,{"aria-label":n,style:{backgroundColor:e},className:`size-4 shrink-0 rounded-sm border border-border-weak ring-1 ring-black/5 ring-inset`}),(0,_.jsx)(`span`,{className:`font-mono text-xs tabular-nums`,children:n})]})};function z(){let[e,t]=(0,m.useState)(null),[,n]=(0,v.useCopyToClipboard)(),r=e!==null,i=(0,m.useCallback)(async e=>{if(!e)return!1;let r=await n(e);return r&&t(Date.now()),r},[n]);return(0,m.useEffect)(()=>{if(e===null)return;let n=setTimeout(()=>t(null),1500);return()=>clearTimeout(n)},[e]),{copied:r,copy:i}}const ie=({value:e,truncate:t=!0})=>{let{copied:n,copy:r}=z();return e?(0,_.jsxs)(`button`,{type:`button`,"data-slot":`description-copy`,"data-copied":n,title:n?`Đã sao chép`:`Sao chép`,onClick:()=>r(e),className:(0,h.cn)(`group inline-flex max-w-full cursor-pointer items-center gap-1.5 rounded-sm border border-border-weak bg-secondary-muted px-2 py-0.5 font-mono text-xs text-text-positive-weak transition-[border-color,color,box-shadow] hover:border-border hover:text-text-positive hover:shadow-xs`,t&&`min-w-0`),children:[(0,_.jsx)(`span`,{className:(0,h.cn)(`tabular-nums`,t&&`truncate`),children:e}),n?(0,_.jsx)(p.CheckIcon,{"data-slot":`description-copy-icon`,size:12,className:`shrink-0 text-success`}):(0,_.jsx)(p.CopyIcon,{"data-slot":`description-copy-icon`,size:12,className:`shrink-0 opacity-50 group-hover:opacity-100`})]}):(0,_.jsx)(R,{})},ae=[`[data-slot="description-header"]`,`[data-slot="description-section"]`,`[data-slot="description-collapsible-section-trigger"]`,`[data-slot="description-item"]`].join(`,`);function B(e){return e?.textContent?.replace(/\s+/g,` `).trim()??``}function oe(e,t){let n=e.closest(`[data-slot="description"][data-surface="nested"]`);return n===null||n===t||!t.contains(n)}function se(e){let t=[];for(let n of e.querySelectorAll(ae)){if(!oe(n,e)||n.closest(`[data-search-hidden]`))continue;if(n.matches(`[data-slot="description-header"]`)){let e=B(n.querySelector(`p`));e&&t.push(t.length?`\n${e}`:e,``);continue}if(n.matches(`[data-slot="description-section"],[data-slot="description-collapsible-section-trigger"]`)){let e=B(n.querySelector(`p`));e&&t.push(t.length?`\n[${e}]`:`[${e}]`);continue}let r=B(n.querySelector(`[data-slot="description-item-label-text"]`)??n.querySelector(`[data-slot="description-item-label"]`)),i=B(n.querySelector(`[data-slot="description-item-value"]`));r&&t.push(`${r}: ${i}`)}return t.join(`
|
|
2
|
+
`)}const V=({label:e=`Sao chép toàn bộ`,className:t})=>{let n=(0,m.useRef)(null),{copied:r,copy:i}=z(),a=(0,m.useCallback)(async()=>{let e=n.current?.closest(`[data-slot="description"],[data-slot="description-group"]`);if(!(e instanceof HTMLElement))return;let t=se(e);t&&await i(t)},[i]);return(0,_.jsx)(`button`,{ref:n,type:`button`,"data-slot":`description-copy-all`,"data-copied":r,title:r?`Đã sao chép`:e,"aria-label":e,onClick:a,className:(0,h.cn)(`cursor-pointer rounded-sm border border-border-weak bg-card p-1 text-text-positive-weak transition-[border-color,color,box-shadow] hover:border-border hover:text-text-positive hover:shadow-xs`,t),children:r?(0,_.jsx)(p.CheckIcon,{size:14,className:`text-success`}):(0,_.jsx)(p.CopyIcon,{size:14})})},H=({date:e})=>e==null?(0,_.jsx)(R,{}):(0,_.jsxs)(o.Tooltip,{children:[(0,_.jsx)(o.TooltipTrigger,{asChild:!0,children:(0,_.jsx)(`span`,{"data-slot":`description-date`,className:`cursor-help`,children:(0,_.jsx)(i.t,{date:e,format:`medium`})})}),(0,_.jsx)(o.TooltipContent,{children:(0,_.jsx)(i.t,{date:e,format:`full`,showTime:!0,className:`text-xs font-medium`})})]}),U=({name:e,url:t,size:n})=>{if(!e)return(0,_.jsx)(R,{});let r=typeof n==`number`?(0,h.formatBytes)(n):null;return t?(0,_.jsxs)(`a`,{"data-slot":`description-file`,href:t,download:e,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex max-w-full items-center gap-1.5 text-primary text-sm underline decoration-dashed underline-offset-2 transition-colors hover:text-primary-strong hover:decoration-solid`,children:[(0,_.jsx)(p.DownloadIcon,{size:12,className:`shrink-0 opacity-70`}),(0,_.jsx)(`span`,{className:`truncate`,children:e}),r&&(0,_.jsx)(`span`,{className:`shrink-0 text-text-positive-muted text-xs no-underline`,children:r})]}):(0,_.jsxs)(`span`,{"data-slot":`description-file`,className:`inline-flex max-w-full items-center gap-1.5 text-sm text-text-positive`,children:[(0,_.jsx)(p.FileIcon,{size:12,className:`shrink-0 opacity-70`}),(0,_.jsx)(`span`,{className:`truncate`,children:e}),r&&(0,_.jsx)(`span`,{className:`shrink-0 text-text-positive-muted text-xs`,children:r})]})},W=({images:e})=>{if(!e?.length)return(0,_.jsx)(R,{});let t=e.length===1;return(0,_.jsx)(`div`,{"data-slot":`description-images`,className:`flex flex-wrap gap-4`,children:e.map(e=>(0,_.jsx)(`div`,{className:t?`group relative size-42 overflow-hidden rounded border border-border shadow-xs transition-shadow hover:shadow-card`:`group relative size-20 overflow-hidden rounded border border-border shadow-xs transition-shadow hover:shadow-card`,children:(0,_.jsx)(n.Image,{src:e.src,alt:e.alt,width:`100%`,height:`100%`,className:`transition-transform duration-200 group-hover:scale-105`})},e.id))})},G=({value:e,maxHeight:t=240,indent:n=2,copyable:r=!0})=>{let i=(0,m.useMemo)(()=>{if(e==null)return null;try{return JSON.stringify(e,null,n)}catch{return null}},[e,n]),{copied:a,copy:o}=z();return i==null?(0,_.jsx)(R,{}):(0,_.jsxs)(`div`,{"data-slot":`description-json`,className:`relative w-full min-w-0`,children:[r&&(0,_.jsx)(`button`,{type:`button`,"data-slot":`description-json-copy`,"data-copied":a,title:a?`Đã sao chép`:`Sao chép`,onClick:()=>o(i),className:(0,h.cn)(`absolute top-1.5 right-1.5 cursor-pointer rounded-sm border border-border-weak bg-card p-1 text-text-positive-weak transition-[border-color,color,box-shadow] hover:border-border hover:text-text-positive hover:shadow-xs`),children:a?(0,_.jsx)(p.CheckIcon,{size:12,className:`text-success`}):(0,_.jsx)(p.CopyIcon,{size:12})}),(0,_.jsx)(`pre`,{style:{maxHeight:t},className:`overflow-auto rounded-sm border border-border-weak bg-secondary-muted px-2 py-1.5 pr-8 font-mono text-text-positive-weak text-xs leading-relaxed`,children:(0,_.jsx)(`code`,{"data-slot":`description-json-code`,children:i})})]})},K=({href:e,label:t,external:n=!0,className:r})=>e?(0,_.jsxs)(`a`,{"data-slot":`description-link`,href:e,target:n?`_blank`:void 0,rel:n?`noopener noreferrer`:void 0,className:(0,h.cn)(`inline-flex max-w-full items-center gap-1 text-sm text-primary underline decoration-dashed underline-offset-2 transition-colors hover:text-primary-strong hover:decoration-solid`,r),children:[!n&&(0,_.jsx)(p.LinkIcon,{size:12,className:`shrink-0 opacity-70`}),(0,_.jsx)(`span`,{className:`truncate`,children:t??e}),n&&(0,_.jsx)(p.ExternalLinkIcon,{size:12,className:`shrink-0 opacity-70`})]}):(0,_.jsx)(R,{}),ce=({content:t})=>t==null?(0,_.jsx)(R,{}):(0,_.jsxs)(o.Tooltip,{children:[(0,_.jsx)(o.TooltipTrigger,{asChild:!0,children:(0,_.jsx)(e.Paragraph,{"data-slot":`description-longtext`,variant:`sm`,className:`line-clamp-2 cursor-pointer whitespace-pre-line break-all text-start text-sm hover:text-text-positive transition-colors`,children:t})}),(0,_.jsx)(o.TooltipContent,{align:`start`,className:`h-fit min-w-48 max-w-80 pt-4`,children:(0,_.jsxs)(`div`,{className:`flex flex-col gap-y-2`,children:[(0,_.jsx)(`p`,{className:`whitespace-pre-line text-wrap break-keep`,children:t}),(0,_.jsxs)(`p`,{className:`w-full text-end text-text-positive-subtle`,children:[t.toString().length,` chars`]})]})})]}),le=({name:t})=>t?(0,_.jsxs)(o.Tooltip,{children:[(0,_.jsx)(o.TooltipTrigger,{asChild:!0,children:(0,_.jsx)(e.Paragraph,{"data-slot":`description-name`,variant:`sm`,className:`line-clamp-2 w-full cursor-pointer truncate hover:text-text-positive transition-colors`,children:t})}),(0,_.jsx)(o.TooltipContent,{align:`start`,className:`h-fit min-w-48 max-w-80 pt-4`,children:(0,_.jsxs)(`div`,{className:`flex flex-col gap-y-2`,children:[(0,_.jsx)(`p`,{className:`whitespace-pre-line text-wrap break-keep`,children:t}),(0,_.jsxs)(`p`,{className:`w-full text-end text-text-positive-subtle`,children:[t.length,` chars`]})]})})]}):(0,_.jsx)(R,{}),ue=({value:t})=>{let n=s.t(t);return n?(0,_.jsxs)(o.Tooltip,{children:[(0,_.jsx)(o.TooltipTrigger,{asChild:!0,children:(0,_.jsx)(e.Paragraph,{"data-slot":`description-phone`,variant:`sm`,className:`cursor-help tabular-nums transition-colors`,children:n.national})}),(0,_.jsx)(o.TooltipContent,{align:`start`,children:(0,_.jsx)(`p`,{className:`tabular-nums`,children:n.international})})]}):(0,_.jsx)(R,{})},de={primary:`[&_[data-slot=progress-indicator]]:bg-primary`,success:`[&_[data-slot=progress-indicator]]:bg-success`,warning:`[&_[data-slot=progress-indicator]]:bg-warning`,danger:`[&_[data-slot=progress-indicator]]:bg-danger`},fe={xs:`h-1`,sm:`h-1.5`,md:`h-2`},pe=({value:e,max:t=100,showValue:n=!0,size:i=`sm`,color:a=`primary`})=>{if(e==null||Number.isNaN(e))return(0,_.jsx)(R,{});let o=Math.min(100,Math.max(0,e/t*100));return(0,_.jsxs)(r.Flex,{"data-slot":`description-progress`,width:`full`,padding:`none`,gap:`sm`,wrap:!1,align:`center`,children:[(0,_.jsx)(d.Progress,{value:o,className:(0,h.cn)(`min-w-24 flex-1`,fe[i],de[a])}),n&&(0,_.jsxs)(`span`,{"data-slot":`description-progress-value`,className:`shrink-0 font-number text-text-positive-weak text-xs tabular-nums`,children:[Math.round(o),`%`]})]})},me=(e,t,n)=>{let r=10**t;switch(n){case`floor`:return Math.floor(e*r)/r;case`ceil`:return Math.ceil(e*r)/r;default:return Math.round(e*r)/r}},he=(0,g.cva)(`inline-flex items-center gap-1 font-number tabular-nums transition-colors`,{variants:{size:{xs:`text-xs`,sm:`text-sm`,md:`text-base`,lg:`text-lg`,xl:`text-xl`},trend:{neutral:`text-text-positive`,up:`text-success`,down:`text-danger`}},defaultVariants:{size:`sm`,trend:`neutral`}}),q=(0,m.memo)(({decimalSeparator:e=`.`,groupSeparator:t=`,`,prefix:n,suffix:r,precision:i,roundingMode:a=`round`,showTrailingZeros:o=!1,size:s=`sm`,trend:c=`neutral`,value:l=0,className:u,emptyOnZero:d=!0})=>{let f=(0,m.useMemo)(()=>{let e={};return typeof i==`number`&&i>=0&&(o&&(e.minimumFractionDigits=i),e.maximumFractionDigits=i),e},[i,o]),p=(0,m.useCallback)(e=>{let t=e;return typeof i==`number`&&i>=0&&(t=me(e,i,a)),t.toLocaleString(`vi-VN`,f)},[a,f,i]),g=(0,m.useMemo)(()=>{if(typeof l==`number`)return Number.isNaN(l)||!Number.isFinite(l)?`N/A`:p(l);if(typeof l==`string`){let e=l.trim();if(!e)return`N/A`;let t=Number(e);return Number.isNaN(t)||!Number.isFinite(t)?`N/A`:p(t)}return`N/A`},[l,p]),v=(0,m.useMemo)(()=>e===`.`&&t===`,`?g:g.replace(/,/g,t).replace(/\./g,e),[g,e,t]);return d&&v===`0`||v===`N/A`||!v?(0,_.jsx)(R,{}):(0,_.jsxs)(`div`,{"data-slot":`description-statistic`,className:(0,h.cn)(he({size:s,trend:c}),u),children:[!!n&&(0,_.jsx)(`span`,{"data-slot":`description-statistic-prefix`,children:n}),(0,_.jsx)(`p`,{"data-slot":`description-statistic-value`,children:v}),!!r&&(0,_.jsx)(`span`,{"data-slot":`description-statistic-suffix`,children:r})]})});q.displayName=`DescriptionStatistic`;const ge=({label:e,color:t=`info`,dot:n=!0})=>e?(0,_.jsxs)(a.Badge,{"data-slot":`description-status`,variant:`soft`,color:t,size:`sm`,className:`gap-1.5`,children:[n&&(0,_.jsx)(`span`,{className:a.badgeDotVariants({color:t})}),e]}):(0,_.jsx)(R,{}),_e=({tags:e,max:t=5,color:n=`secondary`,variant:r=`soft`})=>{if(!e?.length)return(0,_.jsx)(R,{});let i=Array.from(new Map(e.map(e=>[String(e),e])).values()),o=i.slice(0,t),s=i.length-o.length;return(0,_.jsxs)(`div`,{"data-slot":`description-tag-list`,className:`flex flex-wrap gap-1`,children:[o.map(e=>(0,_.jsx)(a.Badge,{variant:r,color:n,size:`sm`,children:e},String(e))),s>0&&(0,_.jsxs)(a.Badge,{variant:`outline`,color:`muted`,size:`sm`,children:[`+`,s]})]})},ve=({value:t,weight:n=`normal`,truncate:r=!1,className:i})=>t==null||t===``?(0,_.jsx)(R,{}):(0,_.jsx)(e.Paragraph,{"data-slot":`description-text`,variant:`sm`,className:(0,h.cn)(n===`medium`&&`font-medium`,r&&`truncate`,i),children:t}),ye=({uuid:e,username:t,email:n})=>!e&&!t?(0,_.jsx)(R,{}):(0,_.jsx)(c.UserDataDisplay,{uuid:e??``,username:t??``,email:n??``}),J={1:12,2:6,3:4,4:3,6:2};function be(e){return typeof e==`number`?{base:12,md:J[e]}:Object.fromEntries(Object.entries({base:1,...e}).map(([e,t])=>[e,J[t]]))}const xe=({columns:e=2,labelColSpan:t,divided:n=!1,className:r,children:i})=>{let a=(0,m.use)(x),o=(0,m.useMemo)(()=>be(e),[e]),s=(0,m.useMemo)(()=>t?{...a,labelColSpan:t}:a,[a,t]),c=m.Children.toArray(i).filter(m.isValidElement);return(0,_.jsx)(x.Provider,{value:s,children:(0,_.jsx)(S.Provider,{value:!0,children:(0,_.jsx)(`div`,{"data-slot":`description-row`,"data-columns":typeof e==`number`?e:`responsive`,className:(0,h.cn)(F({bordered:a.bordered}),r),children:(0,_.jsx)(l.UIGrid,{cols:12,gap:`none`,children:c.map((e,t)=>(0,_.jsx)(l.UIGridItem,{span:o,suspense:!1,"data-slot":`description-row-cell`,className:(0,h.cn)(`min-w-0`,n&&t<c.length-1&&`border-r border-r-border`),children:e},e.key??t))})})})})},Se=({placeholder:e=`Tìm kiếm...`,autoFocus:t,className:n})=>{let{query:r,setQuery:i}=(0,m.use)(C),{size:a}=(0,m.use)(x),o=a===`xs`||a===`sm`?`xs`:`sm`;return(0,_.jsxs)(`div`,{"data-slot":`description-search`,className:(0,h.cn)(`relative w-full max-w-56`,n),children:[(0,_.jsx)(p.SearchIcon,{size:14,className:`-translate-y-1/2 pointer-events-none absolute top-1/2 left-2 text-text-positive-muted`}),(0,_.jsx)(f.Input,{size:o,value:r,autoFocus:t,placeholder:e,onValueChange:i,"aria-label":e,className:`pl-7`}),r!==``&&(0,_.jsx)(`button`,{type:`button`,"data-slot":`description-search-clear`,"aria-label":`Xoá tìm kiếm`,onClick:()=>i(``),className:`-translate-y-1/2 absolute top-1/2 right-1.5 cursor-pointer text-text-positive-muted transition-colors hover:text-text-positive`,children:(0,_.jsx)(p.XIcon,{size:14})})]})},Y={base:5,sm:4,md:3};function X(e){return typeof e==`number`?e:{base:5,...e}}function Z(e){return typeof e==`number`?12-e:Object.fromEntries(Object.entries(e).map(([e,t])=>[e,12-t]))}function Ce(){let[e,t]=(0,m.useState)(!1),n=(0,m.useRef)(()=>{});return[(0,m.useCallback)(e=>{if(n.current(),!e){n.current=()=>{};return}let r=()=>t(e.scrollWidth>e.clientWidth);r();let i=new ResizeObserver(r);i.observe(e),document.fonts?.ready.then(r),n.current=()=>i.disconnect()},[]),e]}const Q=({label:e})=>{let[t,n]=Ce(),r=(0,_.jsx)(`span`,{ref:t,"data-slot":`description-item-label-text`,className:`min-w-0 flex-1 cursor-default truncate`,children:e});return n?(0,_.jsxs)(o.Tooltip,{children:[(0,_.jsx)(o.TooltipTrigger,{asChild:!0,children:r}),(0,_.jsx)(o.TooltipContent,{align:`start`,children:e})]}):r},$=({label:e,labelColSpan:t,orientation:n=`horizontal`,action:i,labelAlign:a=`start`,children:o})=>{let s=(0,m.use)(x),c=(0,m.use)(S),{query:u}=(0,m.use)(C),d=(0,m.use)(w),f=L(e,u),p=(0,m.useId)();(0,m.useEffect)(()=>{if(d)return d.report(p,f),()=>d.report(p,null)},[d,p,f]);let g=f?void 0:{"data-search-hidden":`true`};if(n===`vertical`)return(0,_.jsxs)(`div`,{"data-slot":`description-item`,"data-orientation":`vertical`,...g,className:(0,h.cn)(M({orientation:`vertical`,bordered:s.bordered,inRow:c}),!f&&`hidden`),children:[(0,_.jsxs)(r.Flex,{"data-slot":`description-item-label`,width:`full`,padding:`none`,gap:`none`,wrap:!1,align:`center`,justify:a===`end`?`end`:`between`,className:N({orientation:`vertical`,size:s.size,bordered:s.bordered}),children:[(0,_.jsx)(Q,{label:e}),!!i&&(0,_.jsx)(`div`,{"data-slot":`description-item-action`,className:`shrink-0`,children:i})]}),(0,_.jsx)(r.Flex,{"data-slot":`description-item-value`,width:`full`,padding:`none`,wrap:!0,align:`center`,gap:`sm`,className:P({size:s.size}),children:o})]});let v=X(t??s.labelColSpan??Y),y=Z(v);return(0,_.jsx)(`div`,{"data-slot":`description-item`,"data-orientation":`horizontal`,...g,className:(0,h.cn)(M({orientation:`horizontal`,bordered:s.bordered,inRow:c}),!f&&`hidden`),children:(0,_.jsxs)(l.UIGrid,{cols:12,gap:`none`,children:[(0,_.jsx)(l.UIGridItem,{span:v,suspense:!1,className:`min-w-0`,children:(0,_.jsxs)(r.Flex,{"data-slot":`description-item-label`,width:`full`,padding:`none`,gap:`none`,wrap:!1,align:`center`,justify:a===`end`?`end`:`between`,className:N({orientation:`horizontal`,size:s.size,bordered:s.bordered}),children:[(0,_.jsx)(Q,{label:e}),!!i&&(0,_.jsx)(`div`,{"data-slot":`description-item-action`,className:`shrink-0 pr-1`,children:i})]})}),(0,_.jsx)(l.UIGridItem,{span:y,suspense:!1,className:`min-w-0`,children:(0,_.jsx)(r.Flex,{"data-slot":`description-item-value`,width:`full`,padding:`none`,wrap:!0,align:`center`,gap:`sm`,className:P({size:s.size}),children:o})})]})})},we=({title:e,description:t,extra:n,sticky:i=!0,className:a})=>{let o=(0,m.use)(x);return(0,_.jsxs)(r.Flex,{"data-slot":`description-header`,width:`full`,padding:`none`,gap:`md`,wrap:!1,justify:`between`,align:`center`,className:(0,h.cn)(D({sticky:i,size:o.size,bordered:o.bordered}),a),children:[(0,_.jsxs)(r.Flex,{vertical:!0,width:`full`,padding:`none`,gap:`none`,align:`start`,className:`min-w-0 gap-0.5`,children:[(0,_.jsx)(`p`,{className:O({size:o.size}),children:e}),!!t&&(0,_.jsx)(`p`,{className:k({size:o.size}),children:t})]}),!!n&&(0,_.jsx)(`div`,{"data-slot":`description-header-extra`,className:`shrink-0`,children:n})]})},Te=({title:e,className:t})=>{let n=(0,m.use)(x);return(0,_.jsxs)(r.Flex,{"data-slot":`description-section`,width:`full`,padding:`none`,gap:`none`,wrap:!1,align:`center`,className:(0,h.cn)(A({size:n.size,bordered:n.bordered}),t),children:[!!e&&(0,_.jsx)(`p`,{className:`shrink-0 font-semibold text-text-positive-weak text-xs uppercase tracking-widest`,children:e}),(0,_.jsx)(`div`,{className:`h-px flex-1 bg-border`})]})},Ee=Array.from({length:24},(e,t)=>`description-loading-row-${t}`),De=({rows:e})=>{let n=(0,m.use)(x),i=X(n.labelColSpan??Y),a=Z(i);return(0,_.jsxs)(`div`,{"data-slot":`description-loading`,children:[(0,_.jsxs)(r.Flex,{"data-slot":`description-loading-header`,width:`full`,padding:`none`,gap:`md`,wrap:!1,justify:`between`,align:`center`,className:D({sticky:!1,size:n.size,bordered:n.bordered}),children:[(0,_.jsxs)(r.Flex,{vertical:!0,padding:`none`,gap:`none`,align:`start`,className:`gap-1.5`,children:[(0,_.jsx)(t.Skeleton,{className:`h-3.5 w-36`}),(0,_.jsx)(t.Skeleton,{className:`h-2.5 w-24`})]}),(0,_.jsx)(t.Skeleton,{className:`h-5 w-16`})]}),Ee.slice(0,e).map(e=>(0,_.jsx)(`div`,{"data-slot":`description-loading-row`,className:M({orientation:`horizontal`,bordered:n.bordered}),children:(0,_.jsxs)(l.UIGrid,{cols:12,gap:`none`,children:[(0,_.jsx)(l.UIGridItem,{span:i,suspense:!1,className:`min-w-0`,children:(0,_.jsx)(r.Flex,{width:`full`,padding:`none`,gap:`none`,wrap:!1,align:`center`,className:N({orientation:`horizontal`,size:n.size,bordered:n.bordered}),children:(0,_.jsx)(t.Skeleton,{className:`h-3 w-20`})})}),(0,_.jsx)(l.UIGridItem,{span:a,suspense:!1,className:`min-w-0`,children:(0,_.jsx)(r.Flex,{width:`full`,padding:`none`,wrap:!0,align:`center`,gap:`sm`,className:P({size:n.size}),children:(0,_.jsx)(t.Skeleton,{className:`h-3 w-28`})})})]})},e))]})},Oe=({children:e,className:t,nested:n=!1,loading:r=!1,loadingRows:i=4,labelColSpan:a,size:o,bordered:s})=>{let c=(0,m.use)(y),l=(0,m.use)(x),[u,d]=(0,m.useState)(``),f=(0,m.useMemo)(()=>({labelColSpan:a??l.labelColSpan,size:o??l.size,bordered:s??l.bordered}),[a,o,s,l]),p=(0,m.useMemo)(()=>({query:u,setQuery:d}),[u]),g=c?`grouped`:n?`nested`:`card`;return(0,_.jsx)(x.Provider,{value:f,children:(0,_.jsx)(C.Provider,{value:p,children:(0,_.jsx)(`div`,{"data-slot":`description`,"data-surface":g,className:(0,h.cn)(T({surface:g,bordered:f.bordered}),t),children:r?(0,_.jsx)(De,{rows:i}):e})})})},ke=({children:e,className:t,size:n,bordered:r})=>{let i=(0,m.use)(x),a=(0,m.useMemo)(()=>({labelColSpan:i.labelColSpan,size:n??i.size,bordered:r??i.bordered}),[n,r,i]);return(0,_.jsx)(y.Provider,{value:!0,children:(0,_.jsx)(x.Provider,{value:a,children:(0,_.jsx)(`div`,{"data-slot":`description-group`,className:(0,h.cn)(E({bordered:a.bordered}),t),children:e})})})};Object.defineProperty(exports,"A",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"B",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"C",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,"D",{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,"E",{enumerable:!0,get:function(){return te}}),Object.defineProperty(exports,"F",{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,"G",{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,"H",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"I",{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,"L",{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,"M",{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,"N",{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,"O",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,"P",{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,"R",{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,"S",{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,"T",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(exports,"U",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"V",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"W",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return ge}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,"j",{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,"k",{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return ke}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return Se}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return we}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return xe}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Oe}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return _e}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,"w",{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,"z",{enumerable:!0,get:function(){return T}});
|
|
3
|
+
//# sourceMappingURL=descriptions-DUsJjqd2.cjs.map
|