@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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@customafk/lunas-ui",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.83",
|
|
4
4
|
"description": "UI library for Lunas Enterprise",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": {
|
|
@@ -16,8 +16,7 @@
|
|
|
16
16
|
"files": [
|
|
17
17
|
"dist",
|
|
18
18
|
"styles",
|
|
19
|
-
"README.md"
|
|
20
|
-
"ai-docs.md"
|
|
19
|
+
"README.md"
|
|
21
20
|
],
|
|
22
21
|
"engines": {
|
|
23
22
|
"node": ">= 22.0.0"
|
package/ai-docs.md
DELETED
|
@@ -1,419 +0,0 @@
|
|
|
1
|
-
# @customafk/lunas-ui — AI Reference Documentation
|
|
2
|
-
|
|
3
|
-
> Optimized for AI agents (Claude, GitHub Copilot, Cursor, etc.).
|
|
4
|
-
> Add a reference to this file in your project's CLAUDE.md or AI context config
|
|
5
|
-
> so the assistant always has accurate import paths, prop types, and usage patterns.
|
|
6
|
-
|
|
7
|
-
## Package Identity
|
|
8
|
-
|
|
9
|
-
- **Package name:** `@customafk/lunas-ui`
|
|
10
|
-
- **Framework:** React 19+ · TypeScript 5+
|
|
11
|
-
- **Styling:** TailwindCSS v4 (CSS custom properties — stylesheet import is required)
|
|
12
|
-
- **Radix UI:** primitives are wrapped — always import from `@customafk/lunas-ui/*`, never from `@radix-ui/*`
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## CRITICAL: Required Stylesheet Imports
|
|
17
|
-
|
|
18
|
-
Import these in your root layout **before** any component renders.
|
|
19
|
-
Without them all color tokens and base styles will be absent.
|
|
20
|
-
|
|
21
|
-
```tsx
|
|
22
|
-
import '@customafk/lunas-ui/styles/base';
|
|
23
|
-
import '@customafk/lunas-ui/styles/theme';
|
|
24
|
-
// Optional: enhanced typographic defaults
|
|
25
|
-
import '@customafk/lunas-ui/styles/typography';
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## Import Rules (STRICT)
|
|
31
|
-
|
|
32
|
-
### Rule 1 — Named imports only; never default imports
|
|
33
|
-
|
|
34
|
-
```tsx
|
|
35
|
-
// ✅ CORRECT
|
|
36
|
-
import { Button } from '@customafk/lunas-ui/ui/button';
|
|
37
|
-
import type { ButtonProps } from '@customafk/lunas-ui/ui/button';
|
|
38
|
-
|
|
39
|
-
// ❌ WRONG — no default export exists
|
|
40
|
-
import Button from '@customafk/lunas-ui/ui/button';
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### Rule 2 — Use the exact published export paths
|
|
44
|
-
|
|
45
|
-
Each component has its own path that matches the `package.json` exports map exactly.
|
|
46
|
-
|
|
47
|
-
```tsx
|
|
48
|
-
// ✅ CORRECT
|
|
49
|
-
import { Button } from '@customafk/lunas-ui/ui/button';
|
|
50
|
-
import { ConfirmDialog } from '@customafk/lunas-ui/dialogs/confirm-dialog';
|
|
51
|
-
import { Flex } from '@customafk/lunas-ui/layouts/flex';
|
|
52
|
-
import { UserDataDisplay } from '@customafk/lunas-ui/data-display/user';
|
|
53
|
-
import { Description } from '@customafk/lunas-ui/features/descriptions';
|
|
54
|
-
|
|
55
|
-
// ❌ WRONG — internal source path, not shipped
|
|
56
|
-
import { Button } from '@customafk/lunas-ui/packages/components/ui/button';
|
|
57
|
-
|
|
58
|
-
// ❌ WRONG — missing category prefix
|
|
59
|
-
import { Button } from '@customafk/lunas-ui/button';
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### Rule 3 — Never import Radix UI primitives directly
|
|
63
|
-
|
|
64
|
-
```tsx
|
|
65
|
-
// ❌ WRONG
|
|
66
|
-
import { AlertDialog } from '@radix-ui/react-alert-dialog';
|
|
67
|
-
|
|
68
|
-
// ✅ CORRECT — use the lunas-ui wrapper
|
|
69
|
-
import { AlertDialog } from '@customafk/lunas-ui/ui/alert-dialog';
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
### Rule 4 — Separate type and value imports
|
|
73
|
-
|
|
74
|
-
```tsx
|
|
75
|
-
import { Statistic } from '@customafk/lunas-ui/data-display/statistic';
|
|
76
|
-
import type { StatisticProps } from '@customafk/lunas-ui/data-display/statistic';
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## Component Catalog
|
|
82
|
-
|
|
83
|
-
### UI Primitives — `@customafk/lunas-ui/ui/*`
|
|
84
|
-
|
|
85
|
-
| Component(s) | Full import path | Key props |
|
|
86
|
-
|---|---|---|
|
|
87
|
-
| `Button` | `.../ui/button` | `variant`, `color`, `size`, `isLoading`, `asChild` |
|
|
88
|
-
| `Input` | `.../ui/input` | All native `<input>` props |
|
|
89
|
-
| `Textarea` | `.../ui/textarea` | All native `<textarea>` props |
|
|
90
|
-
| `Label` | `.../ui/label` | `htmlFor` |
|
|
91
|
-
| `Checkbox` | `.../ui/checkbox` | `checked`, `onCheckedChange` |
|
|
92
|
-
| `Switch` | `.../ui/switch` | `checked`, `onCheckedChange` |
|
|
93
|
-
| `RadioGroup` + `RadioGroupItem` | `.../ui/radio-group` | `value`, `onValueChange` |
|
|
94
|
-
| `Select` + `SelectTrigger` + `SelectContent` + `SelectItem` + `SelectValue` | `.../ui/select` | Radix composition |
|
|
95
|
-
| `MultiSelect` | `.../ui/multi-select` | Multi-value select |
|
|
96
|
-
| `Dialog` + sub-components | `.../ui/dialog` | `open`, `onOpenChange` |
|
|
97
|
-
| `AlertDialog` + sub-components | `.../ui/alert-dialog` | `open`, `onOpenChange` |
|
|
98
|
-
| `Sheet` + `SheetContent` | `.../ui/sheet` | `side`: `left`\|`right`\|`top`\|`bottom` |
|
|
99
|
-
| `Drawer` + `DrawerContent` | `.../ui/drawer` | Mobile-first sheet |
|
|
100
|
-
| `Popover` + `PopoverContent` + `PopoverTrigger` | `.../ui/popover` | `open`, `onOpenChange` |
|
|
101
|
-
| `Tooltip` + `TooltipContent` + `TooltipTrigger` + `TooltipProvider` | `.../ui/tooltip` | Wrap app with `TooltipProvider` |
|
|
102
|
-
| `Badge` | `.../ui/badge` | `variant`, `color` |
|
|
103
|
-
| `Card` + `CardHeader` + `CardContent` + `CardFooter` + `CardTitle` + `CardDescription` + `CardAction` | `.../ui/card` | Composition |
|
|
104
|
-
| `Avatar` + `AvatarImage` + `AvatarFallback` | `.../ui/avatar` | — |
|
|
105
|
-
| `Tabs` + `TabsList` + `TabsTrigger` + `TabsContent` | `.../ui/tabs` | `defaultValue`, `value`, `onValueChange` |
|
|
106
|
-
| `Table` + `TableHeader` + `TableBody` + `TableRow` + `TableHead` + `TableCell` | `.../ui/table` | Semantic HTML table |
|
|
107
|
-
| `Calendar` | `.../ui/calendar` | `mode`, `selected`, `onSelect` |
|
|
108
|
-
| `Command` + sub-components | `.../ui/command` | Command palette |
|
|
109
|
-
| `Separator` | `.../ui/separator` | `orientation`: `horizontal`\|`vertical` |
|
|
110
|
-
| `ScrollArea` | `.../ui/scroll-area` | `className` for fixed height |
|
|
111
|
-
| `Skeleton` | `.../ui/skeleton` | `className` for shape |
|
|
112
|
-
| `Spinner` | `.../ui/spinner` | `size`, `className` |
|
|
113
|
-
| `Progress` | `.../ui/progress` | `value` (0–100) |
|
|
114
|
-
| `Slider` | `.../ui/slider` | `value`, `min`, `max`, `step` |
|
|
115
|
-
| `Sonner` | `.../ui/sonner` | Toast — use `toast()` from `sonner` package |
|
|
116
|
-
| `Pagination` | `.../ui/pagination` | Page navigation |
|
|
117
|
-
| `FileUploader` | `.../ui/file-uploader` | `onUpload`, `accept`, `maxSize` |
|
|
118
|
-
| `ButtonGroup` | `.../ui/button-group` | Groups buttons |
|
|
119
|
-
| `DropdownMenu` + sub-components | `.../ui/dropdown-menu` | — |
|
|
120
|
-
| `ContextMenu` | `.../ui/context-menu` | Right-click menu |
|
|
121
|
-
| `HoverCard` + sub-components | `.../ui/hover-card` | — |
|
|
122
|
-
| `Collapsible` + sub-components | `.../ui/collapsible` | — |
|
|
123
|
-
| `Breadcrumb` | `.../ui/breadcrumb` | — |
|
|
124
|
-
| `Carousel` + sub-components | `.../ui/carousel` | — |
|
|
125
|
-
| `Toggle` | `.../ui/toggle` | — |
|
|
126
|
-
| `ToggleGroup` + `ToggleGroupItem` | `.../ui/toggle-group` | — |
|
|
127
|
-
| `Resizable` + sub-components | `.../ui/resizable` | — |
|
|
128
|
-
| `InputOTP` | `.../ui/input-otp` | OTP / PIN input |
|
|
129
|
-
| `Sidebar` | `.../ui/sidebar` | App sidebar shell |
|
|
130
|
-
|
|
131
|
-
#### Button — Complete Prop Reference
|
|
132
|
-
|
|
133
|
-
```tsx
|
|
134
|
-
interface ButtonProps extends Omit<React.ComponentProps<'button'>, 'color'> {
|
|
135
|
-
variant?: 'default' | 'outline' | 'ghost' | 'link' | 'icon' | 'destructive'; // default: 'default'
|
|
136
|
-
color?: 'primary' | 'success' | 'danger' | 'warning' | 'muted'; // default: 'primary'
|
|
137
|
-
size?: 'sm' | 'default' | 'lg' | 'icon'; // default: 'default'
|
|
138
|
-
isLoading?: boolean; // Shows spinner + auto-disables. default: false
|
|
139
|
-
asChild?: boolean; // Renders child via Radix Slot. default: false
|
|
140
|
-
innerClassName?: string; // Classes on inner flex wrapper
|
|
141
|
-
}
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
---
|
|
145
|
-
|
|
146
|
-
### Specialized UI Buttons — `@customafk/lunas-ui/ui/buttons/*`
|
|
147
|
-
|
|
148
|
-
| Component | Full import path | Purpose |
|
|
149
|
-
|---|---|---|
|
|
150
|
-
| `AddNewButton` | `.../ui/buttons/add-new` | Standard "+ Add new" CTA |
|
|
151
|
-
| `EditButton` | `.../ui/buttons/edit` | Edit / pencil icon |
|
|
152
|
-
| `RefreshButton` | `.../ui/buttons/refresh` | Reload action |
|
|
153
|
-
| `TrashButton` | `.../ui/buttons/trash` | Delete action |
|
|
154
|
-
| `UploadImageButton` | `.../ui/buttons/upload-image` | Image upload trigger |
|
|
155
|
-
| `SearchInput` | `.../ui/inputs/search-input` | Search field with icon |
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
### Layout Components
|
|
160
|
-
|
|
161
|
-
| Component | Full import path | Key Props |
|
|
162
|
-
|---|---|---|
|
|
163
|
-
| `Flex` | `.../layouts/flex` | `vertical`, `wrap`, `gap`, `justify`, `align`, `padding`, `margin`, `width` |
|
|
164
|
-
| `Grid` | `.../layouts/grid` | Children grid container |
|
|
165
|
-
| `CmsLayout` | `.../layouts/cms-layout` | App shell with sidebar + header |
|
|
166
|
-
| `PaymentLayout` | `.../layouts/payment-layout` | Checkout page layout |
|
|
167
|
-
|
|
168
|
-
#### Flex — Complete Prop Reference
|
|
169
|
-
|
|
170
|
-
```tsx
|
|
171
|
-
type FlexProps = {
|
|
172
|
-
vertical?: boolean; // flex-col when true | flex-row when false (default: false)
|
|
173
|
-
wrap?: boolean; // flex-wrap vs flex-nowrap (default: true)
|
|
174
|
-
gap?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl'; // default: 'xs'
|
|
175
|
-
justify?: 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly' | 'stretch'; // default: 'start'
|
|
176
|
-
align?: 'start' | 'center' | 'end' | 'baseline' | 'stretch'; // default: 'center'
|
|
177
|
-
padding?: 'none' | 'sm' | 'md' | 'lg' | 'xl'; // default: 'sm'
|
|
178
|
-
margin?: 'none' | 'sm' | 'md' | 'lg' | 'xl'; // default: 'none'
|
|
179
|
-
width?: 'full' | 'auto' | 'fit' | 'screen' | 'min' | 'max' | null; // default: 'fit'
|
|
180
|
-
className?: string;
|
|
181
|
-
};
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
---
|
|
185
|
-
|
|
186
|
-
### Typography
|
|
187
|
-
|
|
188
|
-
| Component | Full import path | Key Props |
|
|
189
|
-
|---|---|---|
|
|
190
|
-
| `Title` | `.../typography/title` | `level` (1–6) → `<h1>`–`<h6>` |
|
|
191
|
-
| `Paragraph` | `.../typography/paragraph` | `variant`, all `<p>` attrs |
|
|
192
|
-
|
|
193
|
-
---
|
|
194
|
-
|
|
195
|
-
### Data Display — `@customafk/lunas-ui/data-display/*`
|
|
196
|
-
|
|
197
|
-
Read-only components for formatted entity fields.
|
|
198
|
-
|
|
199
|
-
| Component | Full import path | Key Props |
|
|
200
|
-
|---|---|---|
|
|
201
|
-
| `UserDataDisplay` | `.../data-display/user` | `uuid`, `username`, `email` |
|
|
202
|
-
| `DateDisplay` | `.../data-display/date` | `date` (ISO string or `Date`), `format?`, `showTime?` |
|
|
203
|
-
| `DateTooltip` | `.../data-display/date-tooltip` | `date` — relative label + full date on hover |
|
|
204
|
-
| `NameDisplay` | `.../data-display/name` | `name` |
|
|
205
|
-
| `PhoneNumberDisplay` | `.../data-display/phone-number` | `value` |
|
|
206
|
-
| `CountryDisplay` | `.../data-display/country` | `country` (ISO 3166-1 alpha-2) |
|
|
207
|
-
| `RoleBadge` | `.../data-display/role-badge` | `status` (role / status string) |
|
|
208
|
-
| `Statistic` | `.../data-display/statistic` | `label`, `value`, `trend?` |
|
|
209
|
-
| `EmptyDisplay` | `.../data-display/empty` | `label?` |
|
|
210
|
-
| `DataList` + `DataListItem` | `.../data-display/data-list` | `DataListItem`: `label` + `value` |
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
### Dialogs — `@customafk/lunas-ui/dialogs/*`
|
|
215
|
-
|
|
216
|
-
All dialogs are **controlled** — manage `open` state in the parent.
|
|
217
|
-
|
|
218
|
-
| Component | Full import path | Key Props |
|
|
219
|
-
|---|---|---|
|
|
220
|
-
| `ConfirmDialog` | `.../dialogs/confirm-dialog` | `open`, `title`, `description`, `onConfirm`, `isLoading`, `submitText`, `cancelText` |
|
|
221
|
-
| `LoadingDialog` | `.../dialogs/loading-dialog` | `open`, `onOpenChange` |
|
|
222
|
-
| `ErrorDialog` | `.../dialogs/error-dialog` | `open`, `title`, `onOpenChange`, `children` |
|
|
223
|
-
| `DetailDialog` | `.../dialogs/detail-dialog` | `open`, `title`, `isLoading?`, `createdAt?`, `sidebar?`, `onOpenChange` |
|
|
224
|
-
|
|
225
|
-
#### ConfirmDialog — Complete Prop Reference
|
|
226
|
-
|
|
227
|
-
```tsx
|
|
228
|
-
type ConfirmDialogProps = {
|
|
229
|
-
open?: boolean;
|
|
230
|
-
isLoading?: boolean; // default: false
|
|
231
|
-
title: string; // required
|
|
232
|
-
description: string; // required
|
|
233
|
-
cancelText?: string; // default: 'Cancel'
|
|
234
|
-
submitText?: string; // default: 'Confirm'
|
|
235
|
-
descriptionClassName?: string;
|
|
236
|
-
onOpenChange?: (open: boolean) => void;
|
|
237
|
-
onConfirm?: () => Promise<void> | void; // async-safe
|
|
238
|
-
};
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
---
|
|
242
|
-
|
|
243
|
-
### Feature Components
|
|
244
|
-
|
|
245
|
-
#### Descriptions — `@customafk/lunas-ui/features/descriptions`
|
|
246
|
-
|
|
247
|
-
```tsx
|
|
248
|
-
import {
|
|
249
|
-
Description, // Outer container (border, shadow, rounded)
|
|
250
|
-
DescriptionHeader, // title, description?, extra?, className?
|
|
251
|
-
DescriptionSection, // title? — labeled horizontal divider
|
|
252
|
-
DescriptionItem, // label, labelColSpan? (default 3/12),
|
|
253
|
-
// orientation? ('horizontal'|'vertical'), action?
|
|
254
|
-
} from '@customafk/lunas-ui/features/descriptions';
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
Also exports typed value cells:
|
|
258
|
-
`DescriptionBadge`, `DescriptionDate`, `DescriptionName`, `DescriptionEmpty`,
|
|
259
|
-
`DescriptionStatistic`, `DescriptionNumberPhone`, `DescriptionImages`, `DescriptionLongtext`.
|
|
260
|
-
|
|
261
|
-
#### Tables — `@customafk/lunas-ui/features/tables`
|
|
262
|
-
|
|
263
|
-
TanStack React Table v8 wrapper with column helpers, filter components, and table context provider.
|
|
264
|
-
|
|
265
|
-
#### TanStack Form — `@customafk/lunas-ui/features/tanstack-form`
|
|
266
|
-
|
|
267
|
-
```tsx
|
|
268
|
-
import {
|
|
269
|
-
useTanStackForm, // Form factory hook — call once per form definition
|
|
270
|
-
withTanStackForm, // HOC: connect a component to the form context
|
|
271
|
-
withTanStackFieldGroup, // HOC: wrap a group of related fields
|
|
272
|
-
} from '@customafk/lunas-ui/features/tanstack-form';
|
|
273
|
-
// Field components (TextField, ComboboxField, etc.) are registered in the
|
|
274
|
-
// factory — use them via the form's .AppField slot, not as direct imports.
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
#### Search Modal — `@customafk/lunas-ui/features/search-modal`
|
|
278
|
-
|
|
279
|
-
```tsx
|
|
280
|
-
import { SearchModal } from '@customafk/lunas-ui/features/search-modal';
|
|
281
|
-
// Self-contained command-palette dialog — no props required.
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
---
|
|
285
|
-
|
|
286
|
-
### Cards
|
|
287
|
-
|
|
288
|
-
| Component | Full import path | Key Props |
|
|
289
|
-
|---|---|---|
|
|
290
|
-
| `SimpleCard` | `.../cards/simple-card` | `title`, `description?`, `action?`, `footer?` |
|
|
291
|
-
| `ProductCard` | `.../cards/product-card` | `id`, `name`, `thumbnail`, `price` |
|
|
292
|
-
| `GridProductCard` | `.../cards/grid-product-card` | `id`, `name`, `thumbnail`, `price` |
|
|
293
|
-
|
|
294
|
-
### Page Components
|
|
295
|
-
|
|
296
|
-
| Component | Full import path | Purpose |
|
|
297
|
-
|---|---|---|
|
|
298
|
-
| `NotFound` | `.../pages/NotFound` | 404 page |
|
|
299
|
-
| `NotAuthorized` | `.../pages/NotAuthorized` | 403 / access denied |
|
|
300
|
-
| `FeatureDeveloping` | `.../pages/FeatureDeveloping` | Coming-soon placeholder |
|
|
301
|
-
| `FeatureFixing` | `.../pages/FeatureFixing` | Maintenance-mode page |
|
|
302
|
-
|
|
303
|
-
---
|
|
304
|
-
|
|
305
|
-
## Usage Patterns (RAG Examples)
|
|
306
|
-
|
|
307
|
-
### Pattern 1 — Confirm dialog before a destructive mutation
|
|
308
|
-
|
|
309
|
-
```tsx
|
|
310
|
-
import { useState } from 'react';
|
|
311
|
-
import { Button } from '@customafk/lunas-ui/ui/button';
|
|
312
|
-
import { ConfirmDialog } from '@customafk/lunas-ui/dialogs/confirm-dialog';
|
|
313
|
-
|
|
314
|
-
export function DeleteUserButton({ userId, onDeleted }: {
|
|
315
|
-
userId: string;
|
|
316
|
-
onDeleted: () => void;
|
|
317
|
-
}) {
|
|
318
|
-
const [open, setOpen] = useState(false);
|
|
319
|
-
const [isPending, setIsPending] = useState(false);
|
|
320
|
-
|
|
321
|
-
const handleConfirm = async () => {
|
|
322
|
-
setIsPending(true);
|
|
323
|
-
try {
|
|
324
|
-
await deleteUser(userId);
|
|
325
|
-
setOpen(false);
|
|
326
|
-
onDeleted();
|
|
327
|
-
} finally {
|
|
328
|
-
setIsPending(false);
|
|
329
|
-
}
|
|
330
|
-
};
|
|
331
|
-
|
|
332
|
-
return (
|
|
333
|
-
<>
|
|
334
|
-
<Button variant="outline" color="danger" onClick={() => setOpen(true)}>
|
|
335
|
-
Delete user
|
|
336
|
-
</Button>
|
|
337
|
-
<ConfirmDialog
|
|
338
|
-
open={open}
|
|
339
|
-
title="Delete user?"
|
|
340
|
-
description="This action is permanent and cannot be undone."
|
|
341
|
-
submitText="Yes, delete"
|
|
342
|
-
isLoading={isPending}
|
|
343
|
-
onOpenChange={setOpen}
|
|
344
|
-
onConfirm={handleConfirm}
|
|
345
|
-
/>
|
|
346
|
-
</>
|
|
347
|
-
);
|
|
348
|
-
}
|
|
349
|
-
```
|
|
350
|
-
|
|
351
|
-
### Pattern 2 — Entity detail panel with Description + Data Display
|
|
352
|
-
|
|
353
|
-
```tsx
|
|
354
|
-
import {
|
|
355
|
-
Description,
|
|
356
|
-
DescriptionHeader,
|
|
357
|
-
DescriptionItem,
|
|
358
|
-
DescriptionSection,
|
|
359
|
-
} from '@customafk/lunas-ui/features/descriptions';
|
|
360
|
-
import { UserDataDisplay } from '@customafk/lunas-ui/data-display/user';
|
|
361
|
-
import { DateDisplay } from '@customafk/lunas-ui/data-display/date';
|
|
362
|
-
import { RoleBadge } from '@customafk/lunas-ui/data-display/role-badge';
|
|
363
|
-
import { Statistic } from '@customafk/lunas-ui/data-display/statistic';
|
|
364
|
-
|
|
365
|
-
export function OrderDetailPanel({ order }: { order: Order }) {
|
|
366
|
-
return (
|
|
367
|
-
<Description>
|
|
368
|
-
<DescriptionHeader title="Order Details" description={`#${order.id}`} />
|
|
369
|
-
<DescriptionSection title="Customer" />
|
|
370
|
-
<DescriptionItem label="Account">
|
|
371
|
-
<UserDataDisplay uuid={order.customer.id} username={order.customer.name} email={order.customer.email} />
|
|
372
|
-
</DescriptionItem>
|
|
373
|
-
<DescriptionItem label="Created at">
|
|
374
|
-
<DateDisplay date={order.createdAt} showTime />
|
|
375
|
-
</DescriptionItem>
|
|
376
|
-
<DescriptionSection title="Order" />
|
|
377
|
-
<DescriptionItem label="Status">
|
|
378
|
-
<RoleBadge status={order.status} />
|
|
379
|
-
</DescriptionItem>
|
|
380
|
-
<DescriptionItem label="Total">
|
|
381
|
-
<Statistic label="VND" value={order.total} />
|
|
382
|
-
</DescriptionItem>
|
|
383
|
-
</Description>
|
|
384
|
-
);
|
|
385
|
-
}
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
---
|
|
389
|
-
|
|
390
|
-
## Semantic Color Tokens (TailwindCSS)
|
|
391
|
-
|
|
392
|
-
| Token | Usage |
|
|
393
|
-
|---|---|
|
|
394
|
-
| `text-text-positive` | Primary body text |
|
|
395
|
-
| `text-text-positive-weak` | Secondary / muted text |
|
|
396
|
-
| `text-text-positive-strong` | Emphasis / heading text |
|
|
397
|
-
| `text-text-positive-muted` | Placeholder / disabled text |
|
|
398
|
-
| `bg-primary` | Primary brand fill |
|
|
399
|
-
| `bg-secondary-muted` | Light gray surface (table headers, label columns) |
|
|
400
|
-
| `bg-card` | Card / panel background |
|
|
401
|
-
| `border-border` | Default border |
|
|
402
|
-
| `border-border-weak` | Subtle border / divider |
|
|
403
|
-
| `text-success` | Positive / success value |
|
|
404
|
-
| `text-danger` | Error / destructive value |
|
|
405
|
-
| `text-warning` | Cautionary value |
|
|
406
|
-
|
|
407
|
-
---
|
|
408
|
-
|
|
409
|
-
## Anti-patterns to Avoid
|
|
410
|
-
|
|
411
|
-
| ❌ Don't | ✅ Do instead |
|
|
412
|
-
|---|---|
|
|
413
|
-
| `import Button from '…/ui/button'` | `import { Button } from '…/ui/button'` |
|
|
414
|
-
| `import { Button } from '…/button'` | Include category: `'…/ui/button'` |
|
|
415
|
-
| Import from `@radix-ui/*` directly | Use the lunas-ui wrapper |
|
|
416
|
-
| Skip stylesheet imports | Always import `styles/base` + `styles/theme` |
|
|
417
|
-
| `window.confirm()` for destructive actions | Use `<ConfirmDialog>` |
|
|
418
|
-
| `<div className="flex gap-2">` | Use `<Flex gap="sm">` |
|
|
419
|
-
| Add `disabled` manually during loading | Use `isLoading` on `<Button>` |
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{Button as e}from"./ui/button.mjs";import{Badge as t}from"./ui/badge.mjs";import{Command as n,CommandGroup as r,CommandItem as i,CommandList as ee}from"./ui/command.mjs";import{Spinner as te}from"./ui/spinner.mjs";import{Popover as ne,PopoverContent as re,PopoverTrigger as ie}from"./ui/popover.mjs";import{inputVariants as ae}from"./ui/input.mjs";import{CheckIcon as oe,ChevronDownIcon as se,PlusIcon as ce,XIcon as a}from"lucide-react";import{forwardRef as o,useCallback as s,useEffect as c,useImperativeHandle as le,useMemo as l,useRef as u,useState as d}from"react";import{cn as f}from"@customafk/react-toolkit/utils";import{cva as ue}from"class-variance-authority";import{Fragment as p,jsx as m,jsxs as h}from"react/jsx-runtime";import{Command as de,useCommandState as g}from"cmdk";const fe=ue([`relative flex flex-wrap items-center gap-1 rounded border bg-transparent text-sm transition-shadow`,`outline-hidden`,`aria-disabled:cursor-not-allowed aria-disabled:bg-muted-muted aria-disabled:text-text-positive-weak`],{variants:{color:{normal:[`border-border-weak`,`focus-visible:border-primary focus-visible:ring-4 focus-visible:ring-primary-weak`,`data-[state=open]:border-primary data-[state=open]:ring-4 data-[state=open]:ring-primary-weak`].join(` `),danger:[`border-danger bg-danger-bg-subtle`,`focus-visible:border-danger focus-visible:ring-4 focus-visible:ring-danger-weak`,`data-[state=open]:border-danger data-[state=open]:ring-4 data-[state=open]:ring-danger-weak`].join(` `)},size:{sm:`min-h-8 text-xs`,md:`min-h-9 text-sm`,lg:`min-h-10 text-base`}},defaultVariants:{color:`normal`,size:`md`}});function _(e){e.preventDefault(),e.stopPropagation()}function pe(e,t){let[n,r]=d(e);return c(()=>{let n=setTimeout(()=>r(e),t??500);return()=>clearTimeout(n)},[e,t]),n}function v(e,t){if(e.length===0)return{};if(!t)return{"":e};let n={};return e.forEach(e=>{let r=e[t]||``;n[r]||(n[r]=[]),n[r].push(e)}),n}function me(e,t){let n={};for(let[r,i]of Object.entries(e))n[r]=i.filter(e=>!t.has(e.value));return n}function he(e,t){return e.length===t.length&&e.every((e,n)=>e.value===t[n]?.value)}const y=o(({className:e,...t},n)=>g(e=>e.filtered.count===0)?m(`div`,{ref:n,className:f(`p-2.5 pt-1 text-center text-xs`,e),"cmdk-empty":``,role:`presentation`,...t}):null);y.displayName=`ComboboxCommandEmpty`;const b=o(({value:o,defaultValue:ue=[],onChange:g,options:b,defaultOptions:ge=[],onSearch:x,delay:_e,triggerSearchOnFocus:S=!1,groupBy:C,placeholder:w,disabled:T,color:E,size:D=`md`,loadingIndicator:ve,loadingText:ye,emptyIndicator:be,creatable:O=!1,createHint:k,createLabel:A,onCreateOption:j,maxSelected:M=2**53-1,onMaxSelected:N,hideSelectedFromList:P=!1,hideClearAllButton:xe=!1,onClearAll:Se,hideClearQueryButton:Ce=!1,onClearQuery:we,className:Te,badgeClassName:Ee,contentClassName:De,commandProps:F,inputProps:I},Oe)=>{let L=u(null),R=u(0),z=u(!0),[B,V]=d(!1),[H,ke]=d(!1),[Ae,je]=d(ue),[U,Me]=d(v(ge,C)),[W,G]=d(``),K=o??Ae,q=W.trim(),J=pe(W,_e??500),Y=s(e=>{o===void 0&&je(e),g?.(e)},[g,o]);le(Oe,()=>({selectedValue:[...K],input:L.current,focus:()=>{V(!0),L.current?.focus()},reset:()=>Y([]),clearQuery:()=>G(``)}),[K,Y]),c(()=>(z.current=!0,()=>{z.current=!1}),[]),c(()=>{B||G(``)},[B]);let X=l(()=>new Set(K.map(e=>e.value)),[K]),Z=s(e=>{Y(K.filter(t=>t.value!==e.value))},[K,Y]),Ne=s(e=>{if(X.has(e.value)){e.fixed||Z(e);return}if(K.length>=M){N?.(M);return}G(``),Y([...K,e])},[Z,M,N,K,X,Y]);c(()=>{!b||x||Me(e=>he(b,Object.values(e).flat())?e:v(b,C))},[b,C,x]),c(()=>{(async()=>{if(!x||!B||!S&&!J)return;let e=++R.current;ke(!0);let t=await x(J);!z.current||e!==R.current||(Me(v(t,C)),ke(!1))})()},[J,C,B,S,x]);let Pe=l(()=>P?me(U,X):U,[P,U,X]),Q=l(()=>{if(!O||!q||H)return!1;let e=q.toLowerCase(),t=Object.values(U).some(t=>t.some(t=>t.label.toLowerCase()===e)),n=K.some(t=>t.label.toLowerCase()===e);return!t&&!n},[O,q,H,U,K]),Fe=typeof A==`function`?A(q):A??`Create "${q}"`,Ie=typeof k==`function`?k(q):k,$=s(()=>{if(K.length>=M){N?.(M);return}let e=q;G(``),Y([...K,{value:e,label:e}]),j?.(e),V(!1)},[q,M,j,N,K,Y]),Le=s(e=>{let t=L.current;if(t){if((e.key===`Delete`||e.key===`Backspace`)&&t.value===``&&K.length>0){let e=K[K.length-1];e.fixed||Z(e)}e.key===`Enter`&&Q&&(e.preventDefault(),$())}},[$,Z,K,Q]),Re=K.some(e=>!e.fixed);return h(ne,{open:B,onOpenChange:e=>!T&&V(e),children:[m(ie,{asChild:!0,children:h(`div`,{"data-slot":`combobox-trigger`,role:`combobox`,"aria-expanded":B,"aria-haspopup":`listbox`,"aria-disabled":T||void 0,tabIndex:T?-1:0,className:f(fe({color:E,size:D}),K.length!==0&&`p-1`,!T&&`cursor-pointer`,T&&`pointer-events-none`,Te),onKeyDown:e=>{T||(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),V(e=>!e))},children:[K.length===0&&m(`span`,{className:`flex-1 truncate px-3 py-2 text-text-positive-muted`,children:w}),K.map(e=>h(t,{"data-slot":`combobox-chip`,"data-fixed":e.fixed||void 0,variant:`soft`,color:E===`danger`?`danger`:`secondary`,size:D,pill:!1,className:f(`gap-1 text-xs bg-muted-muted font-normal`,T&&`opacity-50`,Ee),children:[e.label,!e.fixed&&!T&&m(`button`,{type:`button`,"data-slot":`combobox-chip-remove`,"aria-label":`Remove ${e.label}`,onMouseDown:_,onClick:t=>{t.stopPropagation(),Z(e)},className:`ms-0.5 -me-0.5 rounded-sm outline-hidden hover:text-text-positive text-text-positive-muted`,children:m(a,{size:12,strokeWidth:2,"aria-hidden":`true`})})]},e.value)),m(se,{size:16,"aria-hidden":`true`,className:f(`ms-auto me-2 shrink-0 text-text-positive-muted transition-transform`,B&&`rotate-180`)})]})}),m(re,{align:`start`,"data-slot":`combobox-content`,className:f(`w-(--radix-popover-trigger-width) p-0`,De),children:h(n,{...F,onKeyDown:e=>{Le(e),F?.onKeyDown?.(e)},"data-slot":`combobox`,className:f(`overflow-visible bg-white`,F?.className),shouldFilter:F?.shouldFilter??!x,children:[!xe&&Re&&h(e,{type:`button`,"data-slot":`combobox-clear-all`,tabIndex:-1,size:`xs`,variant:`ghost`,color:`muted`,className:`w-fit mt-1 font-normal hover:text-text-positive`,onMouseDown:_,onClick:()=>{let e=K.filter(e=>e.fixed);Y(e),Se?.()},children:[m(a,{size:10,strokeWidth:2,"aria-hidden":`true`,className:`size-3!`}),`Clear Selected Input`]}),h(`div`,{"data-slot":`combobox-search`,className:`relative px-2.5 pt-2.5 pb-1 border-t border-t-border`,children:[m(de.Input,{...I,ref:L,"data-slot":`combobox-input`,value:W,onValueChange:e=>{G(e),I?.onValueChange?.(e)},placeholder:w,className:f(ae({size:`sm`}),`pe-8`,I?.className)}),!Ce&&W.length>0&&m(`button`,{type:`button`,"data-slot":`combobox-clear-query`,"aria-label":`Clear search`,onMouseDown:_,onClick:()=>{G(``),we?.(),L.current?.focus()},className:`absolute inset-y-6 inset-e-4 flex items-center justify-center text-text-positive-muted transition-colors hover:text-text-positive`,children:m(a,{size:14,strokeWidth:2,"aria-hidden":`true`})})]}),m(ee,{"data-slot":`combobox-list`,className:`shadow-lg outline-hidden`,onMouseDown:e=>e.preventDefault(),children:H?m(`div`,{"data-slot":`combobox-loading`,className:`flex items-center justify-center gap-2 px-2 py-6 text-sm text-text-positive-muted`,children:ve??h(p,{children:[m(te,{className:`size-4`}),ye]})}):Q?h(`div`,{"data-slot":`combobox-create`,className:`flex flex-col gap-2 p-3`,children:[Ie&&m(`p`,{className:`pe-10 text-text-positive-weak text-xs`,children:Ie}),m(`div`,{className:`flex justify-end`,children:h(e,{type:`button`,"data-slot":`combobox-create-confirm`,"aria-label":Fe,size:`xs`,variant:`outline`,color:`muted`,onMouseDown:_,onClick:$,children:[m(ce,{}),`Thêm mới`]})})]}):h(p,{children:[m(y,{"data-slot":`combobox-empty`,children:m(`div`,{className:`bg-muted-muted size-full min-h-14 flex items-center justify-center`,children:be??`No results found.`})}),m(i,{value:`__combobox-first-item-guard__`,className:`hidden`,"aria-hidden":`true`}),Object.entries(Pe).map(([e,t])=>m(r,{heading:e||void 0,value:e||`__combobox-options__`,children:t.map(e=>{let t=X.has(e.value);return h(i,{value:e.value,keywords:[e.label],disabled:e.disable,"data-picked":t||void 0,onMouseDown:_,onSelect:()=>Ne(e),className:f(`cursor-pointer justify-between`,e.disable&&`cursor-not-allowed opacity-50`,t&&`bg-primary-bg-subtle! text-primary!`),children:[e.label,t&&h(p,{children:[m(oe,{size:14,className:`ms-auto text-primary`,"aria-hidden":`true`}),m(`span`,{className:`sr-only`,children:`, selected`})]})]},e.value)})},e))]})})]})})]})});b.displayName=`Combobox`;export{b as t};
|
|
2
|
-
//# sourceMappingURL=combobox-C64Rvd7n.mjs.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("./ui/button.cjs"),t=require("./ui/badge.cjs"),n=require("./ui/command.cjs"),r=require("./ui/spinner.cjs"),i=require("./ui/popover.cjs"),ee=require("./ui/input.cjs");let a=require("lucide-react"),o=require("react"),s=require("@customafk/react-toolkit/utils"),c=require("class-variance-authority"),l=require("react/jsx-runtime"),u=require("cmdk");const te=(0,c.cva)([`relative flex flex-wrap items-center gap-1 rounded border bg-transparent text-sm transition-shadow`,`outline-hidden`,`aria-disabled:cursor-not-allowed aria-disabled:bg-muted-muted aria-disabled:text-text-positive-weak`],{variants:{color:{normal:[`border-border-weak`,`focus-visible:border-primary focus-visible:ring-4 focus-visible:ring-primary-weak`,`data-[state=open]:border-primary data-[state=open]:ring-4 data-[state=open]:ring-primary-weak`].join(` `),danger:[`border-danger bg-danger-bg-subtle`,`focus-visible:border-danger focus-visible:ring-4 focus-visible:ring-danger-weak`,`data-[state=open]:border-danger data-[state=open]:ring-4 data-[state=open]:ring-danger-weak`].join(` `)},size:{sm:`min-h-8 text-xs`,md:`min-h-9 text-sm`,lg:`min-h-10 text-base`}},defaultVariants:{color:`normal`,size:`md`}});function d(e){e.preventDefault(),e.stopPropagation()}function ne(e,t){let[n,r]=(0,o.useState)(e);return(0,o.useEffect)(()=>{let n=setTimeout(()=>r(e),t??500);return()=>clearTimeout(n)},[e,t]),n}function f(e,t){if(e.length===0)return{};if(!t)return{"":e};let n={};return e.forEach(e=>{let r=e[t]||``;n[r]||(n[r]=[]),n[r].push(e)}),n}function re(e,t){let n={};for(let[r,i]of Object.entries(e))n[r]=i.filter(e=>!t.has(e.value));return n}function p(e,t){return e.length===t.length&&e.every((e,n)=>e.value===t[n]?.value)}const m=(0,o.forwardRef)(({className:e,...t},n)=>(0,u.useCommandState)(e=>e.filtered.count===0)?(0,l.jsx)(`div`,{ref:n,className:(0,s.cn)(`p-2.5 pt-1 text-center text-xs`,e),"cmdk-empty":``,role:`presentation`,...t}):null);m.displayName=`ComboboxCommandEmpty`;const h=(0,o.forwardRef)(({value:c,defaultValue:h=[],onChange:g,options:_,defaultOptions:ie=[],onSearch:v,delay:ae,triggerSearchOnFocus:y=!1,groupBy:b,placeholder:x,disabled:S,color:C,size:w=`md`,loadingIndicator:oe,loadingText:se,emptyIndicator:ce,creatable:T=!1,createHint:E,createLabel:D,onCreateOption:O,maxSelected:k=2**53-1,onMaxSelected:A,hideSelectedFromList:j=!1,hideClearAllButton:le=!1,onClearAll:ue,hideClearQueryButton:de=!1,onClearQuery:fe,className:pe,badgeClassName:me,contentClassName:he,commandProps:M,inputProps:N},ge)=>{let P=(0,o.useRef)(null),F=(0,o.useRef)(0),I=(0,o.useRef)(!0),[L,R]=(0,o.useState)(!1),[z,B]=(0,o.useState)(!1),[_e,ve]=(0,o.useState)(h),[V,H]=(0,o.useState)(f(ie,b)),[U,W]=(0,o.useState)(``),G=c??_e,K=U.trim(),q=ne(U,ae??500),J=(0,o.useCallback)(e=>{c===void 0&&ve(e),g?.(e)},[g,c]);(0,o.useImperativeHandle)(ge,()=>({selectedValue:[...G],input:P.current,focus:()=>{R(!0),P.current?.focus()},reset:()=>J([]),clearQuery:()=>W(``)}),[G,J]),(0,o.useEffect)(()=>(I.current=!0,()=>{I.current=!1}),[]),(0,o.useEffect)(()=>{L||W(``)},[L]);let Y=(0,o.useMemo)(()=>new Set(G.map(e=>e.value)),[G]),X=(0,o.useCallback)(e=>{J(G.filter(t=>t.value!==e.value))},[G,J]),ye=(0,o.useCallback)(e=>{if(Y.has(e.value)){e.fixed||X(e);return}if(G.length>=k){A?.(k);return}W(``),J([...G,e])},[X,k,A,G,Y,J]);(0,o.useEffect)(()=>{!_||v||H(e=>p(_,Object.values(e).flat())?e:f(_,b))},[_,b,v]),(0,o.useEffect)(()=>{(async()=>{if(!v||!L||!y&&!q)return;let e=++F.current;B(!0);let t=await v(q);!I.current||e!==F.current||(H(f(t,b)),B(!1))})()},[q,b,L,y,v]);let be=(0,o.useMemo)(()=>j?re(V,Y):V,[j,V,Y]),Z=(0,o.useMemo)(()=>{if(!T||!K||z)return!1;let e=K.toLowerCase(),t=Object.values(V).some(t=>t.some(t=>t.label.toLowerCase()===e)),n=G.some(t=>t.label.toLowerCase()===e);return!t&&!n},[T,K,z,V,G]),xe=typeof D==`function`?D(K):D??`Create "${K}"`,Q=typeof E==`function`?E(K):E,$=(0,o.useCallback)(()=>{if(G.length>=k){A?.(k);return}let e=K;W(``),J([...G,{value:e,label:e}]),O?.(e),R(!1)},[K,k,O,A,G,J]),Se=(0,o.useCallback)(e=>{let t=P.current;if(t){if((e.key===`Delete`||e.key===`Backspace`)&&t.value===``&&G.length>0){let e=G[G.length-1];e.fixed||X(e)}e.key===`Enter`&&Z&&(e.preventDefault(),$())}},[$,X,G,Z]),Ce=G.some(e=>!e.fixed);return(0,l.jsxs)(i.Popover,{open:L,onOpenChange:e=>!S&&R(e),children:[(0,l.jsx)(i.PopoverTrigger,{asChild:!0,children:(0,l.jsxs)(`div`,{"data-slot":`combobox-trigger`,role:`combobox`,"aria-expanded":L,"aria-haspopup":`listbox`,"aria-disabled":S||void 0,tabIndex:S?-1:0,className:(0,s.cn)(te({color:C,size:w}),G.length!==0&&`p-1`,!S&&`cursor-pointer`,S&&`pointer-events-none`,pe),onKeyDown:e=>{S||(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),R(e=>!e))},children:[G.length===0&&(0,l.jsx)(`span`,{className:`flex-1 truncate px-3 py-2 text-text-positive-muted`,children:x}),G.map(e=>(0,l.jsxs)(t.Badge,{"data-slot":`combobox-chip`,"data-fixed":e.fixed||void 0,variant:`soft`,color:C===`danger`?`danger`:`secondary`,size:w,pill:!1,className:(0,s.cn)(`gap-1 text-xs bg-muted-muted font-normal`,S&&`opacity-50`,me),children:[e.label,!e.fixed&&!S&&(0,l.jsx)(`button`,{type:`button`,"data-slot":`combobox-chip-remove`,"aria-label":`Remove ${e.label}`,onMouseDown:d,onClick:t=>{t.stopPropagation(),X(e)},className:`ms-0.5 -me-0.5 rounded-sm outline-hidden hover:text-text-positive text-text-positive-muted`,children:(0,l.jsx)(a.XIcon,{size:12,strokeWidth:2,"aria-hidden":`true`})})]},e.value)),(0,l.jsx)(a.ChevronDownIcon,{size:16,"aria-hidden":`true`,className:(0,s.cn)(`ms-auto me-2 shrink-0 text-text-positive-muted transition-transform`,L&&`rotate-180`)})]})}),(0,l.jsx)(i.PopoverContent,{align:`start`,"data-slot":`combobox-content`,className:(0,s.cn)(`w-(--radix-popover-trigger-width) p-0`,he),children:(0,l.jsxs)(n.Command,{...M,onKeyDown:e=>{Se(e),M?.onKeyDown?.(e)},"data-slot":`combobox`,className:(0,s.cn)(`overflow-visible bg-white`,M?.className),shouldFilter:M?.shouldFilter??!v,children:[!le&&Ce&&(0,l.jsxs)(e.Button,{type:`button`,"data-slot":`combobox-clear-all`,tabIndex:-1,size:`xs`,variant:`ghost`,color:`muted`,className:`w-fit mt-1 font-normal hover:text-text-positive`,onMouseDown:d,onClick:()=>{let e=G.filter(e=>e.fixed);J(e),ue?.()},children:[(0,l.jsx)(a.XIcon,{size:10,strokeWidth:2,"aria-hidden":`true`,className:`size-3!`}),`Clear Selected Input`]}),(0,l.jsxs)(`div`,{"data-slot":`combobox-search`,className:`relative px-2.5 pt-2.5 pb-1 border-t border-t-border`,children:[(0,l.jsx)(u.Command.Input,{...N,ref:P,"data-slot":`combobox-input`,value:U,onValueChange:e=>{W(e),N?.onValueChange?.(e)},placeholder:x,className:(0,s.cn)(ee.inputVariants({size:`sm`}),`pe-8`,N?.className)}),!de&&U.length>0&&(0,l.jsx)(`button`,{type:`button`,"data-slot":`combobox-clear-query`,"aria-label":`Clear search`,onMouseDown:d,onClick:()=>{W(``),fe?.(),P.current?.focus()},className:`absolute inset-y-6 inset-e-4 flex items-center justify-center text-text-positive-muted transition-colors hover:text-text-positive`,children:(0,l.jsx)(a.XIcon,{size:14,strokeWidth:2,"aria-hidden":`true`})})]}),(0,l.jsx)(n.CommandList,{"data-slot":`combobox-list`,className:`shadow-lg outline-hidden`,onMouseDown:e=>e.preventDefault(),children:z?(0,l.jsx)(`div`,{"data-slot":`combobox-loading`,className:`flex items-center justify-center gap-2 px-2 py-6 text-sm text-text-positive-muted`,children:oe??(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(r.Spinner,{className:`size-4`}),se]})}):Z?(0,l.jsxs)(`div`,{"data-slot":`combobox-create`,className:`flex flex-col gap-2 p-3`,children:[Q&&(0,l.jsx)(`p`,{className:`pe-10 text-text-positive-weak text-xs`,children:Q}),(0,l.jsx)(`div`,{className:`flex justify-end`,children:(0,l.jsxs)(e.Button,{type:`button`,"data-slot":`combobox-create-confirm`,"aria-label":xe,size:`xs`,variant:`outline`,color:`muted`,onMouseDown:d,onClick:$,children:[(0,l.jsx)(a.PlusIcon,{}),`Thêm mới`]})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(m,{"data-slot":`combobox-empty`,children:(0,l.jsx)(`div`,{className:`bg-muted-muted size-full min-h-14 flex items-center justify-center`,children:ce??`No results found.`})}),(0,l.jsx)(n.CommandItem,{value:`__combobox-first-item-guard__`,className:`hidden`,"aria-hidden":`true`}),Object.entries(be).map(([e,t])=>(0,l.jsx)(n.CommandGroup,{heading:e||void 0,value:e||`__combobox-options__`,children:t.map(e=>{let t=Y.has(e.value);return(0,l.jsxs)(n.CommandItem,{value:e.value,keywords:[e.label],disabled:e.disable,"data-picked":t||void 0,onMouseDown:d,onSelect:()=>ye(e),className:(0,s.cn)(`cursor-pointer justify-between`,e.disable&&`cursor-not-allowed opacity-50`,t&&`bg-primary-bg-subtle! text-primary!`),children:[e.label,t&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(a.CheckIcon,{size:14,className:`ms-auto text-primary`,"aria-hidden":`true`}),(0,l.jsx)(`span`,{className:`sr-only`,children:`, selected`})]})]},e.value)})},e))]})})]})})]})});h.displayName=`Combobox`,Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return h}});
|
|
2
|
-
//# sourceMappingURL=combobox-kp_kPY8o.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["Badge","Badge","CheckIcon","CopyIcon","TooltipProvider","Tooltip","TooltipTrigger","DateDisplay","TooltipContent","Image","LinkIcon","ExternalLinkIcon","Tooltip","TooltipTrigger","Paragraph","TooltipContent","Tooltip","TooltipTrigger","Paragraph","TooltipContent","Tooltip","TooltipTrigger","Paragraph","TooltipContent","Badge","Badge","UserDataDisplay"],"sources":["../../../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/copy.tsx","../../../packages/components/features/descriptions/components/date.tsx","../../../packages/components/features/descriptions/components/images.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/statistic.tsx","../../../packages/components/features/descriptions/components/status.tsx","../../../packages/components/features/descriptions/components/tag-list.tsx","../../../packages/components/features/descriptions/components/user.tsx","../../../packages/components/features/descriptions/index.tsx"],"sourcesContent":["'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 { Badge } from '@/components/ui/badge';\nimport type { BadgeProps } 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 { useCallback, useState } from 'react';\nimport { CheckIcon, CopyIcon } from 'lucide-react';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { DescriptionEmpty } from './empty';\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, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n if (!value) return;\n await navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n }, [value]);\n\n if (!value) return <DescriptionEmpty />;\n\n return (\n <button\n type=\"button\"\n data-slot=\"description-copy\"\n onClick={handleCopy}\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 ? <CheckIcon size={12} className=\"shrink-0 text-success\" /> : <CopyIcon size={12} className=\"shrink-0 opacity-50 group-hover:opacity-100\" />}\n </button>\n );\n};\n","'use client';\n\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { DateDisplay } from '@/components/data-display/date';\n\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 <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <DateDisplay data-slot=\"description-date\" date={date} format=\"medium\" className=\"cursor-help\" />\n </TooltipTrigger>\n <TooltipContent>\n <DateDisplay date={date} format=\"full\" showTime className=\"text-xs font-medium\" />\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\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 { ExternalLinkIcon, LinkIcon } from 'lucide-react';\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';\nimport { Paragraph } from '@/components/typography/paragraph';\n\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';\nimport { Paragraph } from '@/components/typography/paragraph';\n\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';\nimport { Paragraph } from '@/components/typography/paragraph';\n\nexport const DescriptionNumberPhone: React.FC<{ value: string }> = ({ value }) => {\n return (\n <Tooltip>\n <TooltipTrigger data-slot=\"description-phone\">\n <Paragraph variant=\"sm\" className=\"tabular-nums transition-colors\">\n {value.replace(/(\\d{3})(\\d{3})(\\d{4})/, '($1) $2-$3')}\n </Paragraph>\n </TooltipTrigger>\n <TooltipContent align=\"start\">\n <p className=\"tabular-nums\">{value.slice(1).replace(/(\\d{2})(\\d{3})(\\d{4})/, '(00) (+84) ($1) $2-$3')}</p>\n </TooltipContent>\n </Tooltip>\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\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 }: 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 (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 { cn } from '@customafk/react-toolkit/utils';\n\nimport { Badge } from '@/components/ui/badge';\nimport type { BadgeProps } from '@/components/ui/badge';\n\nimport { DescriptionEmpty } from './empty';\n\ntype StatusColor = NonNullable<BadgeProps['color']>;\n\nconst dotColorMap: Record<StatusColor, string> = {\n primary: 'bg-primary',\n secondary: 'bg-secondary',\n muted: 'bg-muted',\n accent: 'bg-accent',\n info: 'bg-info',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n};\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={cn('inline-block size-1.5 shrink-0 rounded-full', dotColorMap[color])} />}\n {label}\n </Badge>\n );\n};\n","'use client';\n\nimport { Badge } from '@/components/ui/badge';\nimport type { BadgeProps } 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 const visible = tags.slice(0, max);\n const overflow = tags.length - visible.length;\n\n return (\n <div data-slot=\"description-tag-list\" className=\"flex flex-wrap gap-1\">\n {visible.map((tag, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: static display list\n <Badge key={i} 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 { UserDataDisplay } from '@/components/data-display/user';\n\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 || !email) return <DescriptionEmpty />;\n return <UserDataDisplay uuid={uuid} username={username} email={email} />;\n};\n","'use client';\n\nimport { createContext, useContext } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nexport * from './components';\n\nconst DescriptionGroupContext = createContext(false);\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 * @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 * Number of grid columns (out of 12) allocated to the label in horizontal orientation.\n * @default 3\n */\n labelColSpan?: number;\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 = 3, orientation = 'horizontal', action, labelAlign = 'start', children }) => {\n if (orientation === 'vertical') {\n return (\n <div data-slot=\"description-item\" className=\"flex flex-col border-b border-b-border last:border-b-0\">\n <div\n data-slot=\"description-item-label\"\n className={cn(\n 'flex items-center border-b border-b-border bg-secondary-muted py-2 pr-2 pl-4 font-medium text-sm text-text-positive-weak',\n labelAlign === 'end' ? 'justify-end' : 'justify-between'\n )}\n >\n <span>{label}</span>\n {!!action && <div className=\"shrink-0\">{action}</div>}\n </div>\n <div data-slot=\"description-item-value\" className=\"flex flex-wrap items-center gap-2 py-3 pr-2 pl-4 text-sm text-text-positive\">\n {children}\n </div>\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"description-item\"\n style={{ display: 'grid', gridTemplateColumns: 'repeat(12, minmax(0, 1fr))' }}\n className=\"grid border-b border-b-border last:border-b-0\"\n >\n <div\n data-slot=\"description-item-label\"\n style={{ gridColumn: `span ${labelColSpan} / span ${labelColSpan}` }}\n className={cn(\n 'flex min-w-full items-center overflow-x-hidden text-wrap break-all border-r border-r-border bg-secondary-muted py-3 pr-2 pl-4 font-medium text-sm text-text-positive-weak tabular-nums',\n labelAlign === 'end' ? 'justify-end' : 'justify-between'\n )}\n >\n <span>{label}</span>\n {!!action && <div className=\"shrink-0 pr-1\">{action}</div>}\n </div>\n <div\n data-slot=\"description-item-value\"\n style={{ gridColumn: `span ${12 - labelColSpan} / span ${12 - labelColSpan}` }}\n className=\"flex flex-wrap items-center gap-2 py-3 pr-2 pl-4 text-sm text-text-positive\"\n >\n {children}\n </div>\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). */\n extra?: React.ReactNode;\n /** Additional CSS class names applied to the header wrapper. */\n className?: string;\n}> = ({ title, description, extra, className }) => {\n return (\n <div\n data-slot=\"description-header\"\n className={cn('sticky top-0 z-10 flex items-center justify-between gap-4 border-b border-b-border bg-card px-4 py-3', className)}\n >\n <div className=\"flex flex-col gap-0.5\">\n <p className=\"font-semibold text-sm text-text-positive\">{title}</p>\n {!!description && <p className=\"text-text-positive-weak text-xs\">{description}</p>}\n </div>\n {!!extra && <div className=\"shrink-0\">{extra}</div>}\n </div>\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 * @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 return (\n <div data-slot=\"description-section\" className={cn('flex items-center gap-3 border-b border-b-border px-4 py-2.5', className)}>\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 </div>\n );\n};\n\nconst DescriptionLoadingSkeleton: React.FC<{ rows: number }> = ({ rows }) => (\n <div data-slot=\"description-loading\" className=\"animate-pulse\">\n <div className=\"flex items-center justify-between border-b border-b-border px-4 py-3\">\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"h-3.5 w-36 rounded bg-border\" />\n <div className=\"h-2.5 w-24 rounded bg-border-weak\" />\n </div>\n <div className=\"h-5 w-16 rounded bg-border-weak\" />\n </div>\n {Array.from({ length: rows }).map((_, i) => (\n <div\n key={`${i.toLocaleString()}`}\n style={{ display: 'grid', gridTemplateColumns: 'repeat(12, minmax(0, 1fr))' }}\n className=\"grid border-b border-b-border last:border-b-0\"\n >\n <div style={{ gridColumn: 'span 3 / span 3' }} className=\"flex items-center border-r border-r-border bg-secondary-muted py-3 pr-2 pl-4\">\n <div className=\"h-3 w-20 rounded bg-border\" />\n </div>\n <div style={{ gridColumn: 'span 9 / span 9' }} className=\"flex items-center py-3 pr-2 pl-4\">\n <div className=\"h-3 w-28 rounded bg-border-weak\" />\n </div>\n </div>\n ))}\n </div>\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 *\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. @default 4 */\n loadingRows?: number;\n }>\n> = ({ children, className, nested = false, loading = false, loadingRows = 4 }) => {\n const inGroup = useContext(DescriptionGroupContext);\n\n return (\n <div\n data-slot=\"description\"\n className={cn(\n 'relative flex flex-col bg-card',\n inGroup\n ? 'border-b border-b-border last:border-b-0'\n : nested\n ? 'w-full overflow-hidden rounded-md border border-border'\n : 'size-full overflow-y-auto rounded-lg border border-border shadow-card ring-1 ring-border-weak',\n className\n )}\n >\n {loading ? <DescriptionLoadingSkeleton rows={loadingRows} /> : children}\n </div>\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 * @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 }>\n> = ({ children, className }) => {\n return (\n <DescriptionGroupContext.Provider value={true}>\n <div\n data-slot=\"description-group\"\n className={cn('relative size-full overflow-y-auto rounded-lg border border-border bg-card shadow-card ring-1 ring-border-weak', className)}\n >\n {children}\n </div>\n </DescriptionGroupContext.Provider>\n );\n};\n"],"mappings":"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"}
|