@modern-admin/web 0.4.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/vite.js +20 -0
- package/dist/lib/index.js +6 -5
- package/dist/lib/index.js.map +1 -1
- package/dist/standalone/assets/action-component-host-8DE4kuUJ.js +2 -0
- package/dist/standalone/assets/action-component-host-8DE4kuUJ.js.br +0 -0
- package/dist/standalone/assets/action-component-host-8DE4kuUJ.js.gz +0 -0
- package/dist/standalone/assets/{action-component-host-P6HcuKj3.js.map → action-component-host-8DE4kuUJ.js.map} +1 -1
- package/dist/standalone/assets/action-page-D6BbXzUo.js +2 -0
- package/dist/standalone/assets/action-page-D6BbXzUo.js.br +0 -0
- package/dist/standalone/assets/action-page-D6BbXzUo.js.gz +0 -0
- package/dist/standalone/assets/{action-page-kyqtK3oq.js.map → action-page-D6BbXzUo.js.map} +1 -1
- package/dist/standalone/assets/ai-assistant-widget-BORa8_hT.js +2 -0
- package/dist/standalone/assets/ai-assistant-widget-BORa8_hT.js.br +0 -0
- package/dist/standalone/assets/ai-assistant-widget-BORa8_hT.js.gz +0 -0
- package/dist/standalone/assets/{ai-assistant-widget-DGanix6u.js.map → ai-assistant-widget-BORa8_hT.js.map} +1 -1
- package/dist/standalone/assets/arrow-left-yVCaEJJu.js +2 -0
- package/dist/standalone/assets/{arrow-left-CI9hUPwJ.js.map → arrow-left-yVCaEJJu.js.map} +1 -1
- package/dist/standalone/assets/audit-log-page-uHj9GWfi.js +2 -0
- package/dist/standalone/assets/audit-log-page-uHj9GWfi.js.br +0 -0
- package/dist/standalone/assets/audit-log-page-uHj9GWfi.js.gz +0 -0
- package/dist/standalone/assets/{audit-log-page-DozriTiA.js.map → audit-log-page-uHj9GWfi.js.map} +1 -1
- package/dist/standalone/assets/badge-CdW_Z0lB.js +2 -0
- package/dist/standalone/assets/{badge-lb2Nqx1b.js.map → badge-CdW_Z0lB.js.map} +1 -1
- package/dist/standalone/assets/{bot-DFDgGfNj.js → bot-CuDPD_ZU.js} +2 -2
- package/dist/standalone/assets/{bot-DFDgGfNj.js.map → bot-CuDPD_ZU.js.map} +1 -1
- package/dist/standalone/assets/cache-page-CBKj7WFq.js +2 -0
- package/dist/standalone/assets/cache-page-CBKj7WFq.js.br +0 -0
- package/dist/standalone/assets/cache-page-CBKj7WFq.js.gz +0 -0
- package/dist/standalone/assets/cache-page-CBKj7WFq.js.map +1 -0
- package/dist/standalone/assets/calendar-BuLRvNBg.js +2 -0
- package/dist/standalone/assets/calendar-BuLRvNBg.js.br +0 -0
- package/dist/standalone/assets/calendar-BuLRvNBg.js.gz +0 -0
- package/dist/standalone/assets/calendar-BuLRvNBg.js.map +1 -0
- package/dist/standalone/assets/card-BYbadRar.js +2 -0
- package/dist/standalone/assets/card-BYbadRar.js.br +0 -0
- package/dist/standalone/assets/card-BYbadRar.js.gz +0 -0
- package/dist/standalone/assets/{card-Dh44j2Nb.js.map → card-BYbadRar.js.map} +1 -1
- package/dist/standalone/assets/chart-widget-Bfk_mvm2.js +2 -0
- package/dist/standalone/assets/chart-widget-Bfk_mvm2.js.br +0 -0
- package/dist/standalone/assets/chart-widget-Bfk_mvm2.js.gz +0 -0
- package/dist/standalone/assets/{chart-widget-B819aHsE.js.map → chart-widget-Bfk_mvm2.js.map} +1 -1
- package/dist/standalone/assets/chevrons-up-down-y29_Sm-3.js +2 -0
- package/dist/standalone/assets/{chevrons-up-down-BHCs46XQ.js.map → chevrons-up-down-y29_Sm-3.js.map} +1 -1
- package/dist/standalone/assets/{circle-alert-0EyKeic4.js → circle-alert-D1sKnXtO.js} +2 -2
- package/dist/standalone/assets/{circle-alert-0EyKeic4.js.map → circle-alert-D1sKnXtO.js.map} +1 -1
- package/dist/standalone/assets/{clock-OCmX6DtA.js → clock-B9qbSr_k.js} +2 -2
- package/dist/standalone/assets/{clock-OCmX6DtA.js.map → clock-B9qbSr_k.js.map} +1 -1
- package/dist/standalone/assets/command-BAXXxf0P.js +2 -0
- package/dist/standalone/assets/command-BAXXxf0P.js.br +0 -0
- package/dist/standalone/assets/command-BAXXxf0P.js.gz +0 -0
- package/dist/standalone/assets/command-BAXXxf0P.js.map +1 -0
- package/dist/standalone/assets/{copy-BexCWf4U.js → copy-5fb4qj-_.js} +2 -2
- package/dist/standalone/assets/{copy-BexCWf4U.js.map → copy-5fb4qj-_.js.map} +1 -1
- package/dist/standalone/assets/createLucideIcon-QE2kj6ru.js +2 -0
- package/dist/standalone/assets/createLucideIcon-QE2kj6ru.js.br +0 -0
- package/dist/standalone/assets/createLucideIcon-QE2kj6ru.js.gz +0 -0
- package/dist/standalone/assets/createLucideIcon-QE2kj6ru.js.map +1 -0
- package/dist/standalone/assets/date-picker-Bxv-yrWf.js +2 -0
- package/dist/standalone/assets/date-picker-Bxv-yrWf.js.br +0 -0
- package/dist/standalone/assets/date-picker-Bxv-yrWf.js.gz +0 -0
- package/dist/standalone/assets/{date-picker-D0dWQEox.js.map → date-picker-Bxv-yrWf.js.map} +1 -1
- package/dist/standalone/assets/dist-COXu-_Zv.js +2 -0
- package/dist/standalone/assets/dist-COXu-_Zv.js.br +0 -0
- package/dist/standalone/assets/dist-COXu-_Zv.js.gz +0 -0
- package/dist/standalone/assets/dist-COXu-_Zv.js.map +1 -0
- package/dist/standalone/assets/dist-CiXwD0ML.js +2 -0
- package/dist/standalone/assets/dist-CiXwD0ML.js.br +0 -0
- package/dist/standalone/assets/dist-CiXwD0ML.js.gz +0 -0
- package/dist/standalone/assets/dist-CiXwD0ML.js.map +1 -0
- package/dist/standalone/assets/dist-DPxQeZn3.js +2 -0
- package/dist/standalone/assets/dist-DPxQeZn3.js.br +0 -0
- package/dist/standalone/assets/dist-DPxQeZn3.js.gz +0 -0
- package/dist/standalone/assets/dist-DPxQeZn3.js.map +1 -0
- package/dist/standalone/assets/edit-page-Dm638D2J.js +2 -0
- package/dist/standalone/assets/edit-page-Dm638D2J.js.br +0 -0
- package/dist/standalone/assets/edit-page-Dm638D2J.js.gz +0 -0
- package/dist/standalone/assets/{edit-page-CFPwq1_5.js.map → edit-page-Dm638D2J.js.map} +1 -1
- package/dist/standalone/assets/{ellipsis-lEjcTxo0.js → ellipsis-BRmOlhsy.js} +2 -2
- package/dist/standalone/assets/{ellipsis-lEjcTxo0.js.map → ellipsis-BRmOlhsy.js.map} +1 -1
- package/dist/standalone/assets/empty-DMs98grx.js +2 -0
- package/dist/standalone/assets/empty-DMs98grx.js.br +0 -0
- package/dist/standalone/assets/empty-DMs98grx.js.gz +0 -0
- package/dist/standalone/assets/empty-DMs98grx.js.map +1 -0
- package/dist/standalone/assets/{file-text-CcLZq8HA.js → file-text-MQF--yeB.js} +2 -2
- package/dist/standalone/assets/{file-text-CcLZq8HA.js.map → file-text-MQF--yeB.js.map} +1 -1
- package/dist/standalone/assets/floating-layer-BcTp2AMB.js +2 -0
- package/dist/standalone/assets/floating-layer-BcTp2AMB.js.br +0 -0
- package/dist/standalone/assets/floating-layer-BcTp2AMB.js.gz +0 -0
- package/dist/standalone/assets/floating-layer-BcTp2AMB.js.map +1 -0
- package/dist/standalone/assets/global-search-dialog-DxwxFDO5.js +2 -0
- package/dist/standalone/assets/global-search-dialog-DxwxFDO5.js.br +0 -0
- package/dist/standalone/assets/global-search-dialog-DxwxFDO5.js.gz +0 -0
- package/dist/standalone/assets/{global-search-dialog-AfQmJSE7.js.map → global-search-dialog-DxwxFDO5.js.map} +1 -1
- package/dist/standalone/assets/heavy-fields-LnhreUPp.js +174 -0
- package/dist/standalone/assets/heavy-fields-LnhreUPp.js.br +0 -0
- package/dist/standalone/assets/heavy-fields-LnhreUPp.js.gz +0 -0
- package/dist/standalone/assets/heavy-fields-LnhreUPp.js.map +1 -0
- package/dist/standalone/assets/home-page-DiDOzuic.js +61 -0
- package/dist/standalone/assets/home-page-DiDOzuic.js.br +0 -0
- package/dist/standalone/assets/home-page-DiDOzuic.js.gz +0 -0
- package/dist/standalone/assets/home-page-DiDOzuic.js.map +1 -0
- package/dist/standalone/assets/hooks-BiOfAnEq.js +186 -0
- package/dist/standalone/assets/hooks-BiOfAnEq.js.br +0 -0
- package/dist/standalone/assets/hooks-BiOfAnEq.js.gz +0 -0
- package/dist/standalone/assets/hooks-BiOfAnEq.js.map +1 -0
- package/dist/standalone/assets/icon-registry-s31CNk7M.js +2 -0
- package/dist/standalone/assets/icon-registry-s31CNk7M.js.br +0 -0
- package/dist/standalone/assets/icon-registry-s31CNk7M.js.gz +0 -0
- package/dist/standalone/assets/icon-registry-s31CNk7M.js.map +1 -0
- package/dist/standalone/assets/index-CASCzvYu.js +15 -0
- package/dist/standalone/assets/index-CASCzvYu.js.br +0 -0
- package/dist/standalone/assets/index-CASCzvYu.js.gz +0 -0
- package/dist/standalone/assets/index-CASCzvYu.js.map +1 -0
- package/dist/standalone/assets/index-Cz5ntgJ_.css +2 -0
- package/dist/standalone/assets/index-Cz5ntgJ_.css.br +0 -0
- package/dist/standalone/assets/index-Cz5ntgJ_.css.gz +0 -0
- package/dist/standalone/assets/{info-CGVdWTj1.js → info-ChwYoM77.js} +2 -2
- package/dist/standalone/assets/{info-CGVdWTj1.js.map → info-ChwYoM77.js.map} +1 -1
- package/dist/standalone/assets/json-editor-BD0UhGOT.js +2 -0
- package/dist/standalone/assets/json-editor-BD0UhGOT.js.br +0 -0
- package/dist/standalone/assets/json-editor-BD0UhGOT.js.gz +0 -0
- package/dist/standalone/assets/json-editor-BD0UhGOT.js.map +1 -0
- package/dist/standalone/assets/key-BzJFbNbz.js +2 -0
- package/dist/standalone/assets/key-BzJFbNbz.js.map +1 -0
- package/dist/standalone/assets/{key-round-CQLp1Ua9.js → key-round-oSqmVdkQ.js} +2 -2
- package/dist/standalone/assets/{key-round-CQLp1Ua9.js.map → key-round-oSqmVdkQ.js.map} +1 -1
- package/dist/standalone/assets/{minimize-2-Bx2cH_WS.js → minimize-2-iWv98HjE.js} +2 -2
- package/dist/standalone/assets/{minimize-2-Bx2cH_WS.js.map → minimize-2-iWv98HjE.js.map} +1 -1
- package/dist/standalone/assets/{palette-DVP_4RAn.js → palette-jgTV28yN.js} +2 -2
- package/dist/standalone/assets/{palette-DVP_4RAn.js.map → palette-jgTV28yN.js.map} +1 -1
- package/dist/standalone/assets/{pencil-BO-k3yTG.js → pencil-kFOObGrY.js} +2 -2
- package/dist/standalone/assets/{pencil-BO-k3yTG.js.map → pencil-kFOObGrY.js.map} +1 -1
- package/dist/standalone/assets/{pipette-CqHYfQnn.js → pipette-roLBCmPv.js} +2 -2
- package/dist/standalone/assets/pipette-roLBCmPv.js.br +0 -0
- package/dist/standalone/assets/pipette-roLBCmPv.js.gz +0 -0
- package/dist/standalone/assets/{pipette-CqHYfQnn.js.map → pipette-roLBCmPv.js.map} +1 -1
- package/dist/standalone/assets/plus-D7PHzena.js +2 -0
- package/dist/standalone/assets/{plus-Dk-FzitW.js.map → plus-D7PHzena.js.map} +1 -1
- package/dist/standalone/assets/property-renderer-ClrVnSny.js +4 -0
- package/dist/standalone/assets/property-renderer-ClrVnSny.js.br +0 -0
- package/dist/standalone/assets/property-renderer-ClrVnSny.js.gz +0 -0
- package/dist/standalone/assets/property-renderer-ClrVnSny.js.map +1 -0
- package/dist/standalone/assets/reference-BMbhUBHD.js +2 -0
- package/dist/standalone/assets/reference-BMbhUBHD.js.br +0 -0
- package/dist/standalone/assets/reference-BMbhUBHD.js.gz +0 -0
- package/dist/standalone/assets/{reference-DWJEoGIf.js.map → reference-BMbhUBHD.js.map} +1 -1
- package/dist/standalone/assets/refresh-cw-Cm9YiHGV.js +2 -0
- package/dist/standalone/assets/refresh-cw-Cm9YiHGV.js.map +1 -0
- package/dist/standalone/assets/revisions-button-Csueldv_.js +2 -0
- package/dist/standalone/assets/revisions-button-Csueldv_.js.br +0 -0
- package/dist/standalone/assets/revisions-button-Csueldv_.js.gz +0 -0
- package/dist/standalone/assets/{revisions-button-DR0oW2wX.js.map → revisions-button-Csueldv_.js.map} +1 -1
- package/dist/standalone/assets/richtext-render-DaiNQPjZ.js +68 -0
- package/dist/standalone/assets/richtext-render-DaiNQPjZ.js.br +0 -0
- package/dist/standalone/assets/richtext-render-DaiNQPjZ.js.gz +0 -0
- package/dist/standalone/assets/richtext-render-DaiNQPjZ.js.map +1 -0
- package/dist/standalone/assets/{rotate-ccw-BLr0QLAg.js → rotate-ccw-AB1VcvbK.js} +2 -2
- package/dist/standalone/assets/{rotate-ccw-BLr0QLAg.js.map → rotate-ccw-AB1VcvbK.js.map} +1 -1
- package/dist/standalone/assets/{save-Cd3oR3Sj.js → save-BkkrgP5Q.js} +2 -2
- package/dist/standalone/assets/{save-Cd3oR3Sj.js.map → save-BkkrgP5Q.js.map} +1 -1
- package/dist/standalone/assets/schemas-ByMQmMCS.js +65 -0
- package/dist/standalone/assets/schemas-ByMQmMCS.js.br +0 -0
- package/dist/standalone/assets/schemas-ByMQmMCS.js.gz +0 -0
- package/dist/standalone/assets/schemas-ByMQmMCS.js.map +1 -0
- package/dist/standalone/assets/select-BOe2daO9.js +2 -0
- package/dist/standalone/assets/select-BOe2daO9.js.br +0 -0
- package/dist/standalone/assets/select-BOe2daO9.js.gz +0 -0
- package/dist/standalone/assets/select-BOe2daO9.js.map +1 -0
- package/dist/standalone/assets/{send-D4KHQGYj.js → send-Bzb_4uMT.js} +2 -2
- package/dist/standalone/assets/{send-D4KHQGYj.js.map → send-Bzb_4uMT.js.map} +1 -1
- package/dist/standalone/assets/settings-page-BmphreWj.js +2 -0
- package/dist/standalone/assets/settings-page-BmphreWj.js.br +0 -0
- package/dist/standalone/assets/settings-page-BmphreWj.js.gz +0 -0
- package/dist/standalone/assets/{settings-page-DSWp2N6T.js.map → settings-page-BmphreWj.js.map} +1 -1
- package/dist/standalone/assets/show-page-CDgUXhsx.js +2 -0
- package/dist/standalone/assets/show-page-CDgUXhsx.js.br +0 -0
- package/dist/standalone/assets/show-page-CDgUXhsx.js.gz +0 -0
- package/dist/standalone/assets/{show-page-CGzUAZoO.js.map → show-page-CDgUXhsx.js.map} +1 -1
- package/dist/standalone/assets/{sparkles-CqF0zjrF.js → sparkles-1tT0H4n4.js} +2 -2
- package/dist/standalone/assets/{sparkles-CqF0zjrF.js.map → sparkles-1tT0H4n4.js.map} +1 -1
- package/dist/standalone/assets/{square-pen-DGT7ekeJ.js → square-pen-ZvVEwkzw.js} +2 -2
- package/dist/standalone/assets/{square-pen-DGT7ekeJ.js.map → square-pen-ZvVEwkzw.js.map} +1 -1
- package/dist/standalone/assets/table-RI-lM4fw.js +2 -0
- package/dist/standalone/assets/table-RI-lM4fw.js.br +1 -0
- package/dist/standalone/assets/table-RI-lM4fw.js.gz +0 -0
- package/dist/standalone/assets/table-RI-lM4fw.js.map +1 -0
- package/dist/standalone/assets/tabs-Bj4gQaH2.js +2 -0
- package/dist/standalone/assets/tabs-Bj4gQaH2.js.br +0 -0
- package/dist/standalone/assets/tabs-Bj4gQaH2.js.gz +0 -0
- package/dist/standalone/assets/tabs-Bj4gQaH2.js.map +1 -0
- package/dist/standalone/assets/textarea-C2w7TG3h.js +2 -0
- package/dist/standalone/assets/{textarea-DBVf3GGt.js.map → textarea-C2w7TG3h.js.map} +1 -1
- package/dist/standalone/assets/{trash-2-DhyKQCKv.js → trash-2-BIJVpWxv.js} +2 -2
- package/dist/standalone/assets/{trash-2-DhyKQCKv.js.map → trash-2-BIJVpWxv.js.map} +1 -1
- package/dist/standalone/assets/{triangle-alert-CyaaNWN8.js → triangle-alert-yljVpQCM.js} +2 -2
- package/dist/standalone/assets/{triangle-alert-CyaaNWN8.js.map → triangle-alert-yljVpQCM.js.map} +1 -1
- package/dist/standalone/assets/{undo-2-DlSB-5DM.js → undo-2-CnH3ScKE.js} +2 -2
- package/dist/standalone/assets/undo-2-CnH3ScKE.js.br +0 -0
- package/dist/standalone/assets/undo-2-CnH3ScKE.js.gz +0 -0
- package/dist/standalone/assets/{undo-2-DlSB-5DM.js.map → undo-2-CnH3ScKE.js.map} +1 -1
- package/dist/standalone/assets/{upload-BVhXhZgn.js → upload-DrfB-4bU.js} +2 -2
- package/dist/standalone/assets/upload-DrfB-4bU.js.br +0 -0
- package/dist/standalone/assets/upload-DrfB-4bU.js.gz +0 -0
- package/dist/standalone/assets/{upload-BVhXhZgn.js.map → upload-DrfB-4bU.js.map} +1 -1
- package/dist/standalone/assets/use-dashboard-charts-D7-ctwCE.js +2 -0
- package/dist/standalone/assets/use-dashboard-charts-D7-ctwCE.js.br +0 -0
- package/dist/standalone/assets/use-dashboard-charts-D7-ctwCE.js.gz +0 -0
- package/dist/standalone/assets/{use-dashboard-charts-Cr3OUSL5.js.map → use-dashboard-charts-D7-ctwCE.js.map} +1 -1
- package/dist/standalone/assets/useQueries-DNUnShBb.js +2 -0
- package/dist/standalone/assets/useQueries-DNUnShBb.js.br +0 -0
- package/dist/standalone/assets/useQueries-DNUnShBb.js.gz +0 -0
- package/dist/standalone/assets/useQueries-DNUnShBb.js.map +1 -0
- package/dist/standalone/assets/{user-directory-Df5X8VOe.js → user-directory-BvmDzxsG.js} +2 -2
- package/dist/standalone/assets/user-directory-BvmDzxsG.js.br +0 -0
- package/dist/standalone/assets/user-directory-BvmDzxsG.js.gz +0 -0
- package/dist/standalone/assets/{user-directory-Df5X8VOe.js.map → user-directory-BvmDzxsG.js.map} +1 -1
- package/dist/standalone/assets/{wand-sparkles-DWaFQeYS.js → wand-sparkles-DwseTI5T.js} +2 -2
- package/dist/standalone/assets/{wand-sparkles-DWaFQeYS.js.map → wand-sparkles-DwseTI5T.js.map} +1 -1
- package/dist/standalone/assets/wizard-create-page-D4a8FnmI.js +2 -0
- package/dist/standalone/assets/wizard-create-page-D4a8FnmI.js.br +0 -0
- package/dist/standalone/assets/wizard-create-page-D4a8FnmI.js.gz +0 -0
- package/dist/standalone/assets/{wizard-create-page-B8IcszRF.js.map → wizard-create-page-D4a8FnmI.js.map} +1 -1
- package/dist/standalone/assets/x-c-gfVPJa.js +2 -0
- package/dist/standalone/assets/{x-C3kLunD6.js.map → x-c-gfVPJa.js.map} +1 -1
- package/dist/standalone/assets/zap-BxPAEPtJ.js +2 -0
- package/dist/standalone/assets/zap-BxPAEPtJ.js.map +1 -0
- package/dist/standalone/assets/zod-2-ubQvxh.js +2 -0
- package/dist/standalone/assets/zod-2-ubQvxh.js.br +0 -0
- package/dist/standalone/assets/zod-2-ubQvxh.js.gz +0 -0
- package/dist/standalone/assets/zod-2-ubQvxh.js.map +1 -0
- package/dist/standalone/index.html +12 -12
- package/dist/standalone/index.html.br +0 -0
- package/dist/standalone/index.html.gz +0 -0
- package/package.json +21 -21
- package/src/vite.ts +21 -0
- package/dist/standalone/assets/action-component-host-P6HcuKj3.js +0 -2
- package/dist/standalone/assets/action-component-host-P6HcuKj3.js.br +0 -0
- package/dist/standalone/assets/action-component-host-P6HcuKj3.js.gz +0 -0
- package/dist/standalone/assets/action-page-kyqtK3oq.js +0 -2
- package/dist/standalone/assets/action-page-kyqtK3oq.js.br +0 -0
- package/dist/standalone/assets/action-page-kyqtK3oq.js.gz +0 -0
- package/dist/standalone/assets/ai-assistant-widget-DGanix6u.js +0 -2
- package/dist/standalone/assets/ai-assistant-widget-DGanix6u.js.br +0 -0
- package/dist/standalone/assets/ai-assistant-widget-DGanix6u.js.gz +0 -0
- package/dist/standalone/assets/arrow-left-CI9hUPwJ.js +0 -2
- package/dist/standalone/assets/audit-log-page-DozriTiA.js +0 -2
- package/dist/standalone/assets/audit-log-page-DozriTiA.js.br +0 -0
- package/dist/standalone/assets/audit-log-page-DozriTiA.js.gz +0 -0
- package/dist/standalone/assets/badge-lb2Nqx1b.js +0 -2
- package/dist/standalone/assets/calendar-crtd4PEn.js +0 -2
- package/dist/standalone/assets/calendar-crtd4PEn.js.br +0 -0
- package/dist/standalone/assets/calendar-crtd4PEn.js.gz +0 -0
- package/dist/standalone/assets/calendar-crtd4PEn.js.map +0 -1
- package/dist/standalone/assets/card-Dh44j2Nb.js +0 -2
- package/dist/standalone/assets/card-Dh44j2Nb.js.br +0 -0
- package/dist/standalone/assets/card-Dh44j2Nb.js.gz +0 -0
- package/dist/standalone/assets/chart-widget-B819aHsE.js +0 -2
- package/dist/standalone/assets/chart-widget-B819aHsE.js.br +0 -0
- package/dist/standalone/assets/chart-widget-B819aHsE.js.gz +0 -0
- package/dist/standalone/assets/chevrons-up-down-BHCs46XQ.js +0 -2
- package/dist/standalone/assets/command-xJ-6Grpv.js +0 -2
- package/dist/standalone/assets/command-xJ-6Grpv.js.br +0 -0
- package/dist/standalone/assets/command-xJ-6Grpv.js.gz +0 -0
- package/dist/standalone/assets/command-xJ-6Grpv.js.map +0 -1
- package/dist/standalone/assets/createLucideIcon-CUopU_LC.js +0 -2
- package/dist/standalone/assets/createLucideIcon-CUopU_LC.js.br +0 -0
- package/dist/standalone/assets/createLucideIcon-CUopU_LC.js.gz +0 -0
- package/dist/standalone/assets/createLucideIcon-CUopU_LC.js.map +0 -1
- package/dist/standalone/assets/date-picker-D0dWQEox.js +0 -2
- package/dist/standalone/assets/date-picker-D0dWQEox.js.br +0 -0
- package/dist/standalone/assets/date-picker-D0dWQEox.js.gz +0 -0
- package/dist/standalone/assets/dist-CWGgVQiS.js +0 -2
- package/dist/standalone/assets/dist-CWGgVQiS.js.br +0 -0
- package/dist/standalone/assets/dist-CWGgVQiS.js.gz +0 -0
- package/dist/standalone/assets/dist-CWGgVQiS.js.map +0 -1
- package/dist/standalone/assets/dist-UsTgBPww.js +0 -2
- package/dist/standalone/assets/dist-UsTgBPww.js.br +0 -0
- package/dist/standalone/assets/dist-UsTgBPww.js.gz +0 -0
- package/dist/standalone/assets/dist-UsTgBPww.js.map +0 -1
- package/dist/standalone/assets/dist-qlnAsTo_.js +0 -2
- package/dist/standalone/assets/dist-qlnAsTo_.js.br +0 -0
- package/dist/standalone/assets/dist-qlnAsTo_.js.gz +0 -0
- package/dist/standalone/assets/dist-qlnAsTo_.js.map +0 -1
- package/dist/standalone/assets/edit-page-CFPwq1_5.js +0 -2
- package/dist/standalone/assets/edit-page-CFPwq1_5.js.br +0 -0
- package/dist/standalone/assets/edit-page-CFPwq1_5.js.gz +0 -0
- package/dist/standalone/assets/empty-D9sUunOr.js +0 -2
- package/dist/standalone/assets/empty-D9sUunOr.js.br +0 -0
- package/dist/standalone/assets/empty-D9sUunOr.js.gz +0 -0
- package/dist/standalone/assets/empty-D9sUunOr.js.map +0 -1
- package/dist/standalone/assets/global-search-dialog-AfQmJSE7.js +0 -2
- package/dist/standalone/assets/global-search-dialog-AfQmJSE7.js.br +0 -0
- package/dist/standalone/assets/global-search-dialog-AfQmJSE7.js.gz +0 -0
- package/dist/standalone/assets/heavy-fields-_zVIBnm1.js +0 -181
- package/dist/standalone/assets/heavy-fields-_zVIBnm1.js.br +0 -0
- package/dist/standalone/assets/heavy-fields-_zVIBnm1.js.gz +0 -0
- package/dist/standalone/assets/heavy-fields-_zVIBnm1.js.map +0 -1
- package/dist/standalone/assets/home-page-BdTrAXqk.js +0 -3
- package/dist/standalone/assets/home-page-BdTrAXqk.js.br +0 -0
- package/dist/standalone/assets/home-page-BdTrAXqk.js.gz +0 -0
- package/dist/standalone/assets/home-page-BdTrAXqk.js.map +0 -1
- package/dist/standalone/assets/icon-registry-CcMm2Zh3.js +0 -2
- package/dist/standalone/assets/icon-registry-CcMm2Zh3.js.br +0 -0
- package/dist/standalone/assets/icon-registry-CcMm2Zh3.js.gz +0 -0
- package/dist/standalone/assets/icon-registry-CcMm2Zh3.js.map +0 -1
- package/dist/standalone/assets/index-DHZwffoP.css +0 -2
- package/dist/standalone/assets/index-DHZwffoP.css.br +0 -0
- package/dist/standalone/assets/index-DHZwffoP.css.gz +0 -0
- package/dist/standalone/assets/index-uYpCUVT4.js +0 -15
- package/dist/standalone/assets/index-uYpCUVT4.js.br +0 -0
- package/dist/standalone/assets/index-uYpCUVT4.js.gz +0 -0
- package/dist/standalone/assets/index-uYpCUVT4.js.map +0 -1
- package/dist/standalone/assets/json-editor-yfO4TUB_.js +0 -2
- package/dist/standalone/assets/json-editor-yfO4TUB_.js.br +0 -0
- package/dist/standalone/assets/json-editor-yfO4TUB_.js.gz +0 -0
- package/dist/standalone/assets/json-editor-yfO4TUB_.js.map +0 -1
- package/dist/standalone/assets/key-lbuX0yk_.js +0 -2
- package/dist/standalone/assets/key-lbuX0yk_.js.map +0 -1
- package/dist/standalone/assets/pipette-CqHYfQnn.js.br +0 -0
- package/dist/standalone/assets/pipette-CqHYfQnn.js.gz +0 -0
- package/dist/standalone/assets/plus-Dk-FzitW.js +0 -2
- package/dist/standalone/assets/property-renderer-CDKsa2KQ.js +0 -7
- package/dist/standalone/assets/property-renderer-CDKsa2KQ.js.br +0 -0
- package/dist/standalone/assets/property-renderer-CDKsa2KQ.js.gz +0 -0
- package/dist/standalone/assets/property-renderer-CDKsa2KQ.js.map +0 -1
- package/dist/standalone/assets/reference-DWJEoGIf.js +0 -2
- package/dist/standalone/assets/reference-DWJEoGIf.js.br +0 -0
- package/dist/standalone/assets/reference-DWJEoGIf.js.gz +0 -0
- package/dist/standalone/assets/refresh-cw-DHvUQTMb.js +0 -2
- package/dist/standalone/assets/refresh-cw-DHvUQTMb.js.map +0 -1
- package/dist/standalone/assets/revisions-button-DR0oW2wX.js +0 -2
- package/dist/standalone/assets/revisions-button-DR0oW2wX.js.br +0 -0
- package/dist/standalone/assets/revisions-button-DR0oW2wX.js.gz +0 -0
- package/dist/standalone/assets/richtext-render-VFCKGulc.js +0 -67
- package/dist/standalone/assets/richtext-render-VFCKGulc.js.br +0 -0
- package/dist/standalone/assets/richtext-render-VFCKGulc.js.gz +0 -0
- package/dist/standalone/assets/richtext-render-VFCKGulc.js.map +0 -1
- package/dist/standalone/assets/router-BcZgB5cZ.js +0 -186
- package/dist/standalone/assets/router-BcZgB5cZ.js.br +0 -0
- package/dist/standalone/assets/router-BcZgB5cZ.js.gz +0 -0
- package/dist/standalone/assets/router-BcZgB5cZ.js.map +0 -1
- package/dist/standalone/assets/schemas-twnCb1uT.js +0 -65
- package/dist/standalone/assets/schemas-twnCb1uT.js.br +0 -0
- package/dist/standalone/assets/schemas-twnCb1uT.js.gz +0 -0
- package/dist/standalone/assets/schemas-twnCb1uT.js.map +0 -1
- package/dist/standalone/assets/select-BiV9bunJ.js +0 -2
- package/dist/standalone/assets/select-BiV9bunJ.js.br +0 -0
- package/dist/standalone/assets/select-BiV9bunJ.js.gz +0 -0
- package/dist/standalone/assets/select-BiV9bunJ.js.map +0 -1
- package/dist/standalone/assets/settings-page-DSWp2N6T.js +0 -2
- package/dist/standalone/assets/settings-page-DSWp2N6T.js.br +0 -0
- package/dist/standalone/assets/settings-page-DSWp2N6T.js.gz +0 -0
- package/dist/standalone/assets/show-page-CGzUAZoO.js +0 -2
- package/dist/standalone/assets/show-page-CGzUAZoO.js.br +0 -0
- package/dist/standalone/assets/show-page-CGzUAZoO.js.gz +0 -0
- package/dist/standalone/assets/tabs-smdw70rV.js +0 -2
- package/dist/standalone/assets/tabs-smdw70rV.js.br +0 -0
- package/dist/standalone/assets/tabs-smdw70rV.js.gz +0 -0
- package/dist/standalone/assets/tabs-smdw70rV.js.map +0 -1
- package/dist/standalone/assets/textarea-DBVf3GGt.js +0 -2
- package/dist/standalone/assets/undo-2-DlSB-5DM.js.br +0 -0
- package/dist/standalone/assets/undo-2-DlSB-5DM.js.gz +0 -0
- package/dist/standalone/assets/upload-BVhXhZgn.js.br +0 -0
- package/dist/standalone/assets/upload-BVhXhZgn.js.gz +0 -0
- package/dist/standalone/assets/use-dashboard-charts-Cr3OUSL5.js +0 -2
- package/dist/standalone/assets/use-dashboard-charts-Cr3OUSL5.js.br +0 -0
- package/dist/standalone/assets/use-dashboard-charts-Cr3OUSL5.js.gz +0 -0
- package/dist/standalone/assets/useQueries-Ba2PuYhZ.js +0 -2
- package/dist/standalone/assets/useQueries-Ba2PuYhZ.js.br +0 -0
- package/dist/standalone/assets/useQueries-Ba2PuYhZ.js.gz +0 -0
- package/dist/standalone/assets/useQueries-Ba2PuYhZ.js.map +0 -1
- package/dist/standalone/assets/user-directory-Df5X8VOe.js.br +0 -0
- package/dist/standalone/assets/user-directory-Df5X8VOe.js.gz +0 -0
- package/dist/standalone/assets/value-format-BUeGtfH4.js +0 -60
- package/dist/standalone/assets/value-format-BUeGtfH4.js.br +0 -0
- package/dist/standalone/assets/value-format-BUeGtfH4.js.gz +0 -0
- package/dist/standalone/assets/value-format-BUeGtfH4.js.map +0 -1
- package/dist/standalone/assets/with-selector-id7qGzTH.js +0 -2
- package/dist/standalone/assets/with-selector-id7qGzTH.js.br +0 -0
- package/dist/standalone/assets/with-selector-id7qGzTH.js.gz +0 -0
- package/dist/standalone/assets/with-selector-id7qGzTH.js.map +0 -1
- package/dist/standalone/assets/wizard-create-page-B8IcszRF.js +0 -2
- package/dist/standalone/assets/wizard-create-page-B8IcszRF.js.br +0 -0
- package/dist/standalone/assets/wizard-create-page-B8IcszRF.js.gz +0 -0
- package/dist/standalone/assets/x-C3kLunD6.js +0 -2
- package/dist/standalone/assets/zap-b3saQVKc.js +0 -2
- package/dist/standalone/assets/zap-b3saQVKc.js.map +0 -1
- package/dist/standalone/assets/zod-mi61gVha.js +0 -2
- package/dist/standalone/assets/zod-mi61gVha.js.br +0 -0
- package/dist/standalone/assets/zod-mi61gVha.js.gz +0 -0
- package/dist/standalone/assets/zod-mi61gVha.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,n as t}from"./createLucideIcon-QE2kj6ru.js";import{C as n,l as r}from"./floating-layer-BcTp2AMB.js";var i=e(t(),1),a=n(),o=i.forwardRef(({className:e,...t},n)=>(0,a.jsx)(`div`,{ref:n,className:r(`rounded-lg border border-border bg-card text-card-foreground shadow-sm`,e),...t}));o.displayName=`Card`;var s=i.forwardRef(({className:e,...t},n)=>(0,a.jsx)(`div`,{ref:n,className:r(`flex flex-col gap-1.5 p-3 sm:p-6`,e),...t}));s.displayName=`CardHeader`;var c=i.forwardRef(({className:e,...t},n)=>(0,a.jsx)(`h3`,{ref:n,className:r(`text-lg font-semibold leading-none tracking-tight`,e),...t}));c.displayName=`CardTitle`;var l=i.forwardRef(({className:e,...t},n)=>(0,a.jsx)(`p`,{ref:n,className:r(`text-sm text-muted-foreground`,e),...t}));l.displayName=`CardDescription`;var u=i.forwardRef(({className:e,...t},n)=>(0,a.jsx)(`div`,{ref:n,className:r(`p-3 sm:p-6 [&:not(:first-child)]:pt-0`,e),...t}));u.displayName=`CardContent`;var d=i.forwardRef(({className:e,...t},n)=>(0,a.jsx)(`div`,{ref:n,className:r(`flex items-center gap-2 p-3 pt-0 sm:p-6 sm:pt-0`,e),...t}));d.displayName=`CardFooter`;export{c as a,s as i,u as n,l as r,o as t};
|
|
2
|
+
//# sourceMappingURL=card-BYbadRar.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-
|
|
1
|
+
{"version":3,"file":"card-BYbadRar.js","names":[],"sources":["../../../../ui/src/components/card.tsx"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/utils.js'\n\nexport const Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('rounded-lg border border-border bg-card text-card-foreground shadow-sm', className)}\n {...props}\n />\n ),\n)\nCard.displayName = 'Card'\n\nexport const CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex flex-col gap-1.5 p-3 sm:p-6', className)} {...props} />\n ),\n)\nCardHeader.displayName = 'CardHeader'\n\nexport const CardTitle = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref as unknown as React.Ref<HTMLHeadingElement>}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n ),\n)\nCardTitle.displayName = 'CardTitle'\n\nexport const CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref as unknown as React.Ref<HTMLParagraphElement>}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n))\nCardDescription.displayName = 'CardDescription'\n\n// `[&:not(:first-child)]:pt-0` collapses the top padding only when this content\n// follows a sibling (typically a `CardHeader`), so a standalone `<Card><CardContent/>`\n// keeps full top padding instead of inheriting the header-aware `pt-0`.\nexport const CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-3 sm:p-6 [&:not(:first-child)]:pt-0', className)} {...props} />\n ),\n)\nCardContent.displayName = 'CardContent'\n\nexport const CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex items-center gap-2 p-3 pt-0 sm:p-6 sm:pt-0', className)} {...props} />\n ),\n)\nCardFooter.displayName = 'CardFooter'\n"],"mappings":"uIAGa,EAAA,EAAa,YACvB,CAAE,YAAW,GAAG,GAAS,KACxB,EAAA,EAAA,IAAA,CAAC,MAAD,CACO,MACL,UAAW,EAAG,yEAA0E,CAAS,EACjG,GAAI,CACL,CAAA,CAEL,EACA,EAAK,YAAc,OAEnB,IAAa,EAAA,EAAmB,YAC7B,CAAE,YAAW,GAAG,GAAS,KACxB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAU,MAAK,UAAW,EAAG,mCAAoC,CAAS,EAAG,GAAI,CAAQ,CAAA,CAE7F,EACA,EAAW,YAAc,aAEzB,IAAa,EAAA,EAAkB,YAC5B,CAAE,YAAW,GAAG,GAAS,KACxB,EAAA,EAAA,IAAA,CAAC,KAAD,CACO,MACL,UAAW,EAAG,oDAAqD,CAAS,EAC5E,GAAI,CACL,CAAA,CAEL,EACA,EAAU,YAAc,YAExB,IAAa,EAAA,EAAwB,YAGlC,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,IAAD,CACO,MACL,UAAW,EAAG,gCAAiC,CAAS,EACxD,GAAI,CACL,CAAA,CACF,EACD,EAAgB,YAAc,kBAK9B,IAAa,EAAA,EAAoB,YAC9B,CAAE,YAAW,GAAG,GAAS,KACxB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAU,MAAK,UAAW,EAAG,wCAAyC,CAAS,EAAG,GAAI,CAAQ,CAAA,CAElG,EACA,EAAY,YAAc,cAE1B,IAAa,EAAA,EAAmB,YAC7B,CAAE,YAAW,GAAG,GAAS,KACxB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAU,MAAK,UAAW,EAAG,kDAAmD,CAAS,EAAG,GAAI,CAAQ,CAAA,CAE5G,EACA,EAAW,YAAc"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,n as t}from"./createLucideIcon-QE2kj6ru.js";import{C as n}from"./floating-layer-BcTp2AMB.js";import{i as r,r as i,t as a}from"./refresh-cw-Cm9YiHGV.js";import{t as o}from"./trash-2-BIJVpWxv.js";import{n as s,r as ee,t as te}from"./minimize-2-iWv98HjE.js";import{t as ne}from"./copy-5fb4qj-_.js";import{t as re}from"./ellipsis-BRmOlhsy.js";import{t as ie}from"./pencil-kFOObGrY.js";import{n as ae,t as oe}from"./palette-jgTV28yN.js";import{t as se}from"./triangle-alert-yljVpQCM.js";import{o as c}from"./dist-DPxQeZn3.js";import{A as ce,N as l,T as le}from"./hooks-BiOfAnEq.js";import{a as u,i as d,n as f,o as p,t as m}from"./select-BOe2daO9.js";import{t as h}from"./date-picker-Bxv-yrWf.js";import{a as ue,i as de,n as fe,t as pe}from"./card-BYbadRar.js";import{r as me}from"./use-dashboard-charts-D7-ctwCE.js";import{t as g}from"./reference-BMbhUBHD.js";import{a as _,c as he,i as ge,l as _e,n as ve,o as v,r as ye,s as y,t as b}from"./home-page-DiDOzuic.js";import{B as x,Dt as S,F as be,G as C,M as w,U as T,V as E,W as D,Y as xe,j as Se,k as Ce,nt as O,z as we}from"./index-CASCzvYu.js";var k=e(t(),1);function A(e,t,n){if(n===`all`)return[e.slice(0,10)];let r=[],i=N(new Date(e),n),a=N(new Date(t),n);for(;i.getTime()<=a.getTime();)r.push(M(i)),P(i,n);return r}function j(e,t,n,r){let i=A(t,n,r);return e.map(e=>{let t=new Map(e.points.map(e=>[e.date,e.value])),n=i.map(e=>({date:e,value:t.get(e)??0}));return{key:e.key,points:n}})}function Te(e,t=`en-US`){let n=new Intl.DateTimeFormat(t,{day:`2-digit`,month:`2-digit`}),r=new Intl.DateTimeFormat(t,{month:`2-digit`,year:`numeric`}),i=new Intl.DateTimeFormat(t,{year:`numeric`});return t=>{let a=new Date(t);return e===`year`?i.format(a):e===`month`?r.format(a):n.format(a)}}function Ee(e,t=`en-US`){let n=new Intl.DateTimeFormat(t,{day:`2-digit`,month:`long`,year:`numeric`}),r=new Intl.DateTimeFormat(t,{month:`long`,year:`numeric`}),i=new Intl.DateTimeFormat(t,{year:`numeric`}),a=new Intl.DateTimeFormat(t,{day:`2-digit`,month:`short`});return t=>{let o=new Date(t);if(e===`year`)return i.format(o);if(e===`month`)return r.format(o);if(e===`week`){let e=new Date(o);return e.setDate(e.getDate()+6),`${a.format(o)} – ${a.format(e)}`}return n.format(o)}}function M(e){return e.toISOString().slice(0,10)}function N(e,t){let n=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()));if(t===`week`){let e=(n.getUTCDay()+6)%7;n.setUTCDate(n.getUTCDate()-e)}else t===`month`?n.setUTCDate(1):t===`year`&&n.setUTCMonth(0,1);return n}function P(e,t){t===`day`?e.setUTCDate(e.getUTCDate()+1):t===`week`?e.setUTCDate(e.getUTCDate()+7):t===`month`?e.setUTCMonth(e.getUTCMonth()+1):t===`year`&&e.setUTCFullYear(e.getUTCFullYear()+1)}var F=`__prev__:`;function De(e){let t=Date.parse(`${e.from}T00:00:00.000Z`),n=Date.parse(`${e.to}T00:00:00.000Z`);if(Number.isNaN(t)||Number.isNaN(n)||n<t)return null;let r=Math.round((n-t)/864e5)+1;return{from:L(new Date(t-r*864e5)),to:L(new Date(t-864e5))}}function Oe(e,t,n,r){if(n.length===0)return[];let i=A(t.from,t.to,r),a=n.length-i.length;return e.map(e=>{let t=new Map(e.points.map(e=>[e.date,e.value])),r=n.map((e,n)=>{let r=i[n-a];return r===void 0?{date:e,value:0}:{date:e,value:t.get(r)??0,sourceDate:r}});return{key:`${F}${e.key}`,sourceKey:e.key,points:r}})}function I(e){if(!e||e.length===0)return null;let t=0;for(let n of e)for(let e of n.points)t+=e.value;return t}function ke(e,t){if(e==null||t==null||t===0)return null;let n=Math.round((e-t)/Math.abs(t)*1e3)/10;return{percent:n,direction:n>0?`up`:n<0?`down`:`flat`}}var L=e=>e.toISOString().slice(0,10),R=n();function Ae({items:e,onSave:t,onClose:n}){let{t:r}=l(),[i,a]=k.useState(()=>Object.fromEntries(e.map(e=>[e.key,e.override])));return(0,R.jsx)(x,{open:!0,onOpenChange:e=>{e||n()},children:(0,R.jsxs)(E,{className:`w-full max-w-lg`,children:[(0,R.jsx)(D,{children:(0,R.jsx)(C,{children:r(`dashboard:widget.colorsTitle`)})}),(0,R.jsx)(`div`,{className:`max-h-[60vh] space-y-4 overflow-y-auto py-1`,children:e.map(e=>(0,R.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,R.jsxs)(`div`,{className:`flex items-center gap-2 text-sm`,children:[(0,R.jsx)(`span`,{className:`size-3 shrink-0 rounded-full`,style:{backgroundColor:i[e.key]??e.auto}}),(0,R.jsx)(`span`,{className:`truncate font-medium`,children:e.label})]}),(0,R.jsx)(_,{value:i[e.key],onChange:t=>a(n=>({...n,[e.key]:t})),presets:v,labels:{custom:r(`dashboard:widget.colorCustom`),pick:r(`dashboard:widget.colorPick`),auto:r(`dashboard:widget.colorAuto`)}})]},e.key))}),(0,R.jsxs)(T,{children:[(0,R.jsx)(c,{variant:`outline`,onClick:n,children:r(`common:cancel`)}),(0,R.jsx)(c,{onClick:()=>{let e={};for(let[t,n]of Object.entries(i))n&&(e[t]=n);t(e)},children:r(`common:save`)})]})]})})}var je=[`7d`,`30d`,`90d`,`1y`,`all`,`custom`],Me=[`day`,`week`,`month`,`year`];function z({config:e,onEdit:t,onDelete:n,onMove:g,onUpdate:_}){let{t:v,locale:y}=l(),b=e.visualisation===`kpi`,x=b?`all`:e.timeRange.preset===`all`&&(e.step===`day`||e.step===`week`)?`month`:e.timeRange.preset===`1y`&&e.step===`day`?`week`:e.step,C=k.useMemo(()=>me(e.timeRange),[e.timeRange]),T=!b&&e.comparePrevious===!0&&!e.groupBy,E=le(e.resource),D=k.useMemo(()=>{if(e.groupByLabelResource)return e.groupByLabelResource;if(!e.groupBy||!E)return;let t=E.properties,n=t.find(t=>t.path===e.groupBy);if(!n)return;if(n.reference)return n.reference;let r=n.path.endsWith(`_id`)?n.path.slice(0,-3):n.path.endsWith(`Id`)?n.path.slice(0,-2):``;if(r){let e=t.find(e=>e.path===r&&e.reference);if(e?.reference)return e.reference}},[e.groupBy,e.groupByLabelResource,E]),O=k.useMemo(()=>({resource:e.resource,dateField:e.dateField,step:x,metric:e.metric,from:C.from,to:C.to,...e.field?{field:e.field}:{},...!b&&e.groupBy?{groupBy:e.groupBy}:{},...!b&&e.groupBy?{topN:e.topN}:{},...!b&&e.groupBy&&D?{groupByLabelResource:D}:{},...Object.keys(e.filters).length?{filters:e.filters}:{},...b||T?{comparePrevious:!0}:{}}),[e,C,b,T,x,D]),{data:j,isLoading:M,isError:N,refetch:P,isFetching:F}=ce(O),[L,z]=k.useState(!1),[B,V]=k.useState(!1),[H,U]=k.useState(C.from),[W,G]=k.useState(C.to),K=e.quickFilters??[],q=t=>{_({...e,...t,updatedAt:new Date().toISOString()})},Re=(t,n)=>{let r={...e.filters};n===``?delete r[t]:r[t]=n,q({filters:r})},ze=e=>{e===`custom`?(U(C.from),G(C.to),q({timeRange:{preset:`custom`,from:C.from,to:C.to}})):q({timeRange:{preset:e}})},Be=()=>{H&&W&&q({timeRange:{preset:`custom`,from:H,to:W}})},Ve=e=>{e!==`all`&&q({step:e})},He=()=>{q({width:e.width===`full`?`half`:`full`})},J=b?`h-32`:`h-[320px]`,Ue=j?.resolvedLabels,Y=k.useCallback(e=>e===`__total__`?v(`dashboard:seriesTotal`):e===`__other__`?v(`dashboard:seriesOther`):e===`__null__`?v(`dashboard:seriesNull`):Ue?.[e]??e,[Ue,v]),We=k.useMemo(()=>ye(e.format,y),[e.format,y]),Ge=k.useMemo(()=>ve(e.format,y),[e.format,y]),X=k.useMemo(()=>{let t=ge(Fe(j?.series??[],C,x,Y),e.transform).map(t=>{let n=e.series?.[t.key]?.color;return n?{...t,color:n}:t});if(!T||!j?.previous?.length)return t;let n=De(C);if(!n)return t;let r=A(C.from,C.to,x),i=ge(Oe(j.previous,n,r,x),e.transform).map(e=>({key:e.key,label:v(`dashboard:widget.previousSeries`).replace(`{label}`,Y(e.sourceKey)),points:e.points,dashed:!0,hiddenWith:e.sourceKey}));return[...t,...i]},[j?.series,j?.previous,C.from,C.to,x,Y,T,e.transform,e.series,v]),Z=k.useMemo(()=>T&&j?ke(I(j.series),I(j.previous)):null,[T,j]),[Ke,Q]=k.useState(!1),qe=k.useMemo(()=>{let t=X.filter(e=>!(`dashed`in e)||!e.dashed),n=_e(t.length);return t.map((t,r)=>({key:t.key,label:t.label,override:e.series?.[t.key]?.color,auto:n[r]}))},[X,e.series]),Je=t=>{let n={...e.series};for(let e of qe)delete n[e.key];for(let[e,r]of Object.entries(t))n[e]={color:r};q({series:n}),Q(!1)},$=j&&j.supported===!1;return(0,R.jsxs)(pe,{className:`flex flex-col`,children:[(0,R.jsxs)(de,{className:`flex flex-row items-center justify-between gap-2 p-3 pb-2 space-y-0 sm:p-6 sm:pb-2`,children:[(0,R.jsxs)(ue,{className:`flex min-w-0 items-center gap-2 text-sm font-medium pr-2`,children:[(0,R.jsx)(`span`,{className:`truncate`,children:e.title||v(`chart:untitled`)}),Z&&(0,R.jsxs)(`span`,{title:v(`dashboard:widget.previousPeriod`),className:`inline-flex shrink-0 items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-medium tabular-nums ${Z.direction===`up`?`bg-emerald-500/10 text-emerald-600 dark:text-emerald-400`:Z.direction===`down`?`bg-rose-500/10 text-rose-600 dark:text-rose-400`:`bg-muted text-muted-foreground`}`,children:[Z.direction===`up`?(0,R.jsx)(i,{className:`size-3`}):Z.direction===`down`?(0,R.jsx)(r,{className:`size-3`}):null,Math.abs(Z.percent),`%`]})]}),(0,R.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,R.jsx)(c,{variant:`ghost`,size:`icon`,className:`size-7`,onClick:He,"aria-label":e.width===`full`?v(`dashboard:widget.shrink`):v(`dashboard:widget.expand`),children:e.width===`full`?(0,R.jsx)(te,{className:`size-3.5`}):(0,R.jsx)(s,{className:`size-3.5`})}),j?.sql&&(0,R.jsx)(c,{variant:L?`secondary`:`ghost`,size:`icon`,className:`size-7`,onClick:()=>z(e=>!e),"aria-label":v(`dashboard:widget.toggleSql`),children:(0,R.jsx)(ee,{className:`size-3.5`})}),(0,R.jsx)(c,{variant:`ghost`,size:`icon`,className:`size-7`,onClick:()=>P(),disabled:F,"aria-label":v(`common:refresh`),children:(0,R.jsx)(a,{className:`size-3.5 ${F?`animate-spin`:``}`})}),(0,R.jsxs)(Ce,{children:[(0,R.jsx)(we,{asChild:!0,children:(0,R.jsx)(c,{variant:`ghost`,size:`icon`,className:`size-7`,"aria-label":v(`common:openMenu`),children:(0,R.jsx)(re,{className:`size-3.5`})})}),(0,R.jsxs)(Se,{align:`end`,children:[(0,R.jsxs)(w,{onClick:t,children:[(0,R.jsx)(ie,{className:`size-4 mr-2`}),v(`chart:editChart`)]}),!b&&(0,R.jsxs)(w,{onClick:()=>Q(!0),children:[(0,R.jsx)(oe,{className:`size-4 mr-2`}),v(`dashboard:widget.editColors`)]}),g&&(0,R.jsxs)(w,{onClick:g,children:[(0,R.jsx)(ae,{className:`size-4 mr-2`}),v(`chart:moveToGroup`)]}),(0,R.jsx)(be,{}),(0,R.jsxs)(w,{onClick:n,className:`text-destructive focus:text-destructive`,children:[(0,R.jsx)(o,{className:`size-4 mr-2`}),v(`chart:deleteChart`)]})]})]})]})]}),(0,R.jsxs)(fe,{className:`flex-1 p-3 pt-0 space-y-3 sm:p-6 sm:pt-0`,children:[!$&&(0,R.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 text-xs text-muted-foreground`,children:[K.length>0&&E&&K.map(t=>{let n=E.properties.find(e=>e.path===t);return n?(0,R.jsx)(Pe,{property:n,placeholder:n.label,value:e.filters[t]??``,onChange:e=>Re(t,e)},t):null}),!b&&(0,R.jsxs)(m,{value:e.step===`all`?`day`:e.step,onValueChange:e=>Ve(e),children:[(0,R.jsx)(u,{className:`h-8 px-2 text-xs w-auto`,"aria-label":v(`chart:step`),children:(0,R.jsx)(p,{})}),(0,R.jsx)(f,{children:Me.map(e=>(0,R.jsx)(d,{value:e,children:v(`chart:step${Ne(e)}`)},e))})]}),(0,R.jsxs)(m,{value:e.timeRange.preset,onValueChange:e=>ze(e),children:[(0,R.jsx)(u,{className:`h-8 px-2 text-xs w-auto`,"aria-label":v(`dashboard:builder.range`),children:(0,R.jsx)(p,{})}),(0,R.jsx)(f,{children:je.map(e=>(0,R.jsx)(d,{value:e,children:v(`dashboard:range.${e}`)},e))})]}),e.timeRange.preset===`custom`?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(h,{value:H,onChange:U,ariaLabel:v(`common:from`),openCalendarLabel:v(`common:openCalendar`),className:`w-[130px]`,inputClassName:`h-8 text-xs`}),(0,R.jsx)(`span`,{className:`text-muted-foreground`,children:`—`}),(0,R.jsx)(h,{value:W,onChange:G,ariaLabel:v(`common:to`),openCalendarLabel:v(`common:openCalendar`),className:`w-[130px]`,inputClassName:`h-8 text-xs`}),(0,R.jsxs)(c,{size:`sm`,className:`h-8 px-3 shrink-0`,onClick:Be,disabled:!H||!W,"aria-label":v(`common:apply`),children:[(0,R.jsx)(S,{className:`size-3.5 mr-1`}),v(`common:apply`)]})]}):(0,R.jsxs)(`span`,{className:`ml-auto tabular-nums`,children:[C.from,` — `,C.to]})]}),!$&&!N&&j?.truncated&&(0,R.jsxs)(`div`,{className:`flex items-start gap-2 rounded-md border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-xs text-amber-700 dark:text-amber-400`,children:[(0,R.jsx)(se,{className:`size-3.5 mt-0.5 shrink-0`}),(0,R.jsx)(`span`,{children:v(`dashboard:widget.truncatedWarning`)})]}),M?(0,R.jsx)(xe,{className:`${J} w-full rounded-md`}):N?(0,R.jsx)(`div`,{className:`flex items-center justify-center text-sm text-muted-foreground ${J}`,children:v(`chart:loadError`)}):$?(0,R.jsx)(`div`,{className:`flex items-center justify-center text-center text-sm text-muted-foreground px-4 ${J}`,children:v(`dashboard:widget.unsupported`)}):b?(0,R.jsx)(Ie,{data:j,transform:e.transform,formatNumber:We,labels:Le(v)}):(0,R.jsx)(he,{series:X,height:320,visualisation:e.visualisation===`kpi`?void 0:e.visualisation,tickFormatter:Te(x,y),labelFormatter:Ee(x,y),valueFormatter:We,axisValueFormatter:Ge,labels:{noData:v(`chart:noData`),showAll:v(`dashboard:widget.showAll`),hideAll:v(`dashboard:widget.hideAll`)}}),j?.sql&&L&&(0,R.jsxs)(`div`,{className:`relative`,children:[(0,R.jsx)(c,{variant:`ghost`,size:`icon`,className:`absolute top-1 right-1 size-6`,onClick:()=>{navigator.clipboard.writeText(j.sql??``),V(!0),setTimeout(()=>V(!1),2e3)},"aria-label":v(B?`common:copied`:`common:copy`),children:B?(0,R.jsx)(S,{className:`size-3 text-green-500`}):(0,R.jsx)(ne,{className:`size-3`})}),(0,R.jsx)(`pre`,{className:`text-[11px] leading-snug bg-muted/50 border border-border rounded-md p-2 pr-8 overflow-x-auto whitespace-pre`,children:j.sql})]})]}),Ke&&(0,R.jsx)(Ae,{items:qe,onSave:Je,onClose:()=>Q(!1)})]})}var Ne=e=>e.charAt(0).toUpperCase()+e.slice(1),B=`__none__`;function Pe({property:e,placeholder:t,value:n,onChange:r}){let i=t??e.label;if(e.reference)return(0,R.jsx)(`div`,{className:`w-36`,children:(0,R.jsx)(g,{referenceResourceId:e.reference,value:n||null,onChange:e=>r(e==null?``:String(e)),placeholder:i,className:`h-8 text-xs`})});if(e.availableValues&&e.availableValues.length>0)return(0,R.jsxs)(m,{value:n||B,onValueChange:e=>r(e===B?``:e),children:[(0,R.jsx)(u,{className:`h-8 px-2 text-xs w-36`,children:(0,R.jsx)(p,{placeholder:i})}),(0,R.jsxs)(f,{children:[(0,R.jsx)(d,{value:B,children:i}),e.availableValues.map(e=>(0,R.jsx)(d,{value:e.value,children:e.label},e.value))]})]});if(e.type===`boolean`)return(0,R.jsxs)(m,{value:n||B,onValueChange:e=>r(e===B?``:e),children:[(0,R.jsx)(u,{className:`h-8 px-2 text-xs w-36`,children:(0,R.jsx)(p,{placeholder:i})}),(0,R.jsxs)(f,{children:[(0,R.jsx)(d,{value:B,children:i}),(0,R.jsx)(d,{value:`true`,children:`true`}),(0,R.jsx)(d,{value:`false`,children:`false`})]})]});let a=e.type===`number`||e.type===`float`||e.type===`currency`;return(0,R.jsx)(O,{type:a?`number`:`text`,className:`h-8 px-2 text-xs w-36`,value:n,placeholder:i,onChange:e=>r(e.target.value)})}function Fe(e,t,n,r){return j(e.map(e=>({key:e.key,points:e.points})),t.from,t.to,n).map(e=>({key:e.key,label:r(e.key),points:[...e.points]}))}function Ie({data:e,transform:t,formatNumber:n,labels:r}){let i=V(e?.series),a=V(e?.previous),o=i==null?i:b(i,t),s=a==null?a:b(a,t);return(0,R.jsx)(y,{value:o,previousValue:s,formatNumber:n,labels:r})}function V(e){if(!e||e.length===0)return null;let t=0;for(let n of e)for(let e of n.points)t+=e.value;return t}function Le(e){return{noData:e(`chart:noData`),deltaUp:e(`dashboard:widget.deltaUp`),deltaDown:e(`dashboard:widget.deltaDown`),deltaFlat:e(`dashboard:widget.deltaFlat`),previousPeriod:e(`dashboard:widget.previousPeriod`)}}export{z as ChartWidget};
|
|
2
|
+
//# sourceMappingURL=chart-widget-Bfk_mvm2.js.map
|
|
Binary file
|
|
Binary file
|
package/dist/standalone/assets/{chart-widget-B819aHsE.js.map → chart-widget-Bfk_mvm2.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-widget-B819aHsE.js","names":[],"sources":["../../../../react/src/dashboard/time-series.ts","../../../../react/src/dashboard/compare.ts","../../../../react/src/components/chart-series-colors-dialog.tsx","../../../../react/src/components/chart-widget.tsx"],"sourcesContent":["// Time-series UI helpers — bucket fill, tick formatting, label formatting.\n// All zero-fill happens here on the client side (req: \"Заполнение нулями\n// должно быть только в ui, вне зависимости от адаптеров\"). Adapters return\n// only buckets that have data; the UI fabricates the rest at value 0 so\n// charts don't have visual gaps.\n\nimport type {\n TimeSeriesPoint,\n TimeSeriesSeries,\n TimeSeriesStep,\n} from '../client.js'\n\n/** Generate a continuous sequence of `YYYY-MM-DD` bucket keys spanning [from, to]. */\nexport function generateBuckets(\n fromIso: string,\n toIso: string,\n step: TimeSeriesStep,\n): string[] {\n if (step === 'all') return [fromIso.slice(0, 10)]\n const out: string[] = []\n const cur = startOf(new Date(fromIso), step)\n const end = startOf(new Date(toIso), step)\n while (cur.getTime() <= end.getTime()) {\n out.push(ymd(cur))\n advance(cur, step)\n }\n return out\n}\n\n/**\n * Zero-fill every series so each one has a value for every bucket in the\n * resolved date range. Missing buckets become `value: 0` rather than gaps,\n * which Recharts renders as flat segments instead of breaks.\n */\nexport function fillTimeSeries(\n series: TimeSeriesSeries[],\n fromIso: string,\n toIso: string,\n step: TimeSeriesStep,\n): TimeSeriesSeries[] {\n const buckets = generateBuckets(fromIso, toIso, step)\n return series.map((s) => {\n const map = new Map(s.points.map((p) => [p.date, p.value]))\n const points: TimeSeriesPoint[] = buckets.map((date) => ({\n date,\n value: map.get(date) ?? 0,\n }))\n return { key: s.key, points }\n })\n}\n\n/**\n * X-axis tick formatter — short label format depending on bucket size.\n * day/week → DD.MM, month → MM.YYYY, year → YYYY.\n */\nexport function makeTickFormatter(\n step: TimeSeriesStep,\n locale = 'en-US',\n): (iso: string) => string {\n const dayMonth = new Intl.DateTimeFormat(locale, { day: '2-digit', month: '2-digit' })\n const monthYear = new Intl.DateTimeFormat(locale, { month: '2-digit', year: 'numeric' })\n const year = new Intl.DateTimeFormat(locale, { year: 'numeric' })\n return (iso: string): string => {\n const d = new Date(iso)\n if (step === 'year') return year.format(d)\n if (step === 'month') return monthYear.format(d)\n return dayMonth.format(d)\n }\n}\n\n/**\n * Tooltip label formatter — long, human-friendly form. For week buckets\n * we render `Mon DD – Sun DD` (the bucket plus 6 days).\n */\nexport function makeLabelFormatter(\n step: TimeSeriesStep,\n locale = 'en-US',\n): (iso: string) => string {\n const fullDay = new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: 'long',\n year: 'numeric',\n })\n const monthYear = new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' })\n const year = new Intl.DateTimeFormat(locale, { year: 'numeric' })\n const shortDay = new Intl.DateTimeFormat(locale, { day: '2-digit', month: 'short' })\n return (iso: string): string => {\n const d = new Date(iso)\n if (step === 'year') return year.format(d)\n if (step === 'month') return monthYear.format(d)\n if (step === 'week') {\n const end = new Date(d)\n end.setDate(end.getDate() + 6)\n return `${shortDay.format(d)} – ${shortDay.format(end)}`\n }\n return fullDay.format(d)\n }\n}\n\n// ─── Internals ────────────────────────────────────────────────────────────\n\nfunction ymd(d: Date): string {\n return d.toISOString().slice(0, 10)\n}\n\nfunction startOf(d: Date, step: TimeSeriesStep): Date {\n const out = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()))\n if (step === 'week') {\n // Monday-anchored week.\n const dow = (out.getUTCDay() + 6) % 7\n out.setUTCDate(out.getUTCDate() - dow)\n } else if (step === 'month') {\n out.setUTCDate(1)\n } else if (step === 'year') {\n out.setUTCMonth(0, 1)\n }\n return out\n}\n\nfunction advance(d: Date, step: TimeSeriesStep): void {\n if (step === 'day') d.setUTCDate(d.getUTCDate() + 1)\n else if (step === 'week') d.setUTCDate(d.getUTCDate() + 7)\n else if (step === 'month') d.setUTCMonth(d.getUTCMonth() + 1)\n else if (step === 'year') d.setUTCFullYear(d.getUTCFullYear() + 1)\n}\n","// Previous-period comparison helpers for dashboard charts.\n//\n// The adapters compute the previous window as `prevTo = from`,\n// `prevFrom = from − (to − from)` where the wire `from`/`to` are\n// start-of-day / end-of-day instants. In whole-day terms that is the\n// N-day window ending the day before the current one starts — which is\n// what `serverPreviousRangeOf` reproduces so client-side zero-fill and\n// tooltips agree with the buckets the server actually returns. (The\n// degenerate 1 ms boundary bucket at `from` itself is dropped.)\n\nimport type { TimeSeriesSeries, TimeSeriesStep } from '../client.js'\nimport { generateBuckets } from './time-series.js'\n\n/** Prefix marking overlay series produced from the previous window. */\nexport const PREVIOUS_KEY_PREFIX = '__prev__:'\n\nexport interface AlignedPreviousPoint {\n /** Current-window bucket the point is plotted on. */\n date: string\n value: number\n /** Real previous-window bucket the value came from (for tooltips). */\n sourceDate?: string\n}\n\nexport interface AlignedPreviousSeries {\n key: string\n /** Key of the paired current-window series (`__total__`, …). */\n sourceKey: string\n points: AlignedPreviousPoint[]\n}\n\n/**\n * Whole-day previous window matching the adapters' formula: for a current\n * window of N days `[from, to]`, returns `[from − N, from − 1]`.\n */\nexport function serverPreviousRangeOf(range: {\n from: string\n to: string\n}): { from: string; to: string } | null {\n const f = Date.parse(`${range.from}T00:00:00.000Z`)\n const t = Date.parse(`${range.to}T00:00:00.000Z`)\n if (Number.isNaN(f) || Number.isNaN(t) || t < f) return null\n const days = Math.round((t - f) / 86_400_000) + 1\n return {\n from: ymd(new Date(f - days * 86_400_000)),\n to: ymd(new Date(f - 86_400_000)),\n }\n}\n\n/**\n * Zero-fill the previous window and re-plot each point onto the current\n * window's bucket axis (point *i* → `currentBuckets[i]`), keeping the real\n * date in `sourceDate`. When bucket counts differ (step-aligned month/week\n * windows drift by ±1) the series are aligned on their END — \"yesterday\n * lines up with yesterday\" — and leading gaps become zeros.\n */\nexport function alignPreviousSeries(\n previous: ReadonlyArray<TimeSeriesSeries>,\n prevRange: { from: string; to: string },\n currentBuckets: ReadonlyArray<string>,\n step: TimeSeriesStep,\n): AlignedPreviousSeries[] {\n if (currentBuckets.length === 0) return []\n const prevBuckets = generateBuckets(prevRange.from, prevRange.to, step)\n const offset = currentBuckets.length - prevBuckets.length\n return previous.map((s) => {\n const map = new Map(s.points.map((p) => [p.date, p.value]))\n const points: AlignedPreviousPoint[] = currentBuckets.map((date, i) => {\n const src = prevBuckets[i - offset]\n return src === undefined\n ? { date, value: 0 }\n : { date, value: map.get(src) ?? 0, sourceDate: src }\n })\n return { key: `${PREVIOUS_KEY_PREFIX}${s.key}`, sourceKey: s.key, points }\n })\n}\n\n/** Total across all points of all series (raw, pre-transform values). */\nexport function sumSeries(\n series: ReadonlyArray<TimeSeriesSeries> | undefined,\n): number | null {\n if (!series || series.length === 0) return null\n let total = 0\n for (const s of series) for (const p of s.points) total += p.value\n return total\n}\n\nexport interface PeriodDelta {\n /** Signed percentage, one decimal place (e.g. -81.7). */\n percent: number\n direction: 'up' | 'down' | 'flat'\n}\n\n/**\n * Period-over-period delta on raw totals: `(cur − prev) / prev`. Returns\n * null when the previous total is missing or 0 (undefined percentage).\n */\nexport function computeDelta(\n current: number | null,\n previous: number | null,\n): PeriodDelta | null {\n if (current == null || previous == null || previous === 0) return null\n const percent = Math.round(((current - previous) / Math.abs(previous)) * 1000) / 10\n return {\n percent,\n direction: percent > 0 ? 'up' : percent < 0 ? 'down' : 'flat',\n }\n}\n\nconst ymd = (d: Date): string => d.toISOString().slice(0, 10)\n","// Per-series color override dialog for a dashboard chart. Opened from the\n// widget \"…\" menu so it can list the series actually rendered (groupBy\n// values are only known once data is loaded). Lives in the react package\n// because it is i18n-aware; primitives come from @modern-admin/ui.\n\nimport * as React from 'react'\nimport {\n Button,\n ColorSwatchPicker,\n CHART_COLOR_PRESETS,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@modern-admin/ui'\nimport { useI18n } from '../i18n.js'\n\nexport interface SeriesColorItem {\n /** Stable series key (`__total__`, groupBy value, …). */\n key: string\n /** Display label (legend text). */\n label: string\n /** Persisted override, if any. */\n override?: string\n /** Palette color used when no override is set — shown as the row swatch. */\n auto: string\n}\n\nexport interface ChartSeriesColorsDialogProps {\n items: ReadonlyArray<SeriesColorItem>\n /** Receives only the overrides (key → hex); auto rows are omitted. */\n onSave(overrides: Record<string, string>): void\n onClose(): void\n}\n\nexport function ChartSeriesColorsDialog({\n items,\n onSave,\n onClose,\n}: ChartSeriesColorsDialogProps): React.ReactElement {\n const { t } = useI18n()\n const [draft, setDraft] = React.useState<Record<string, string | undefined>>(\n () => Object.fromEntries(items.map((i) => [i.key, i.override])),\n )\n\n const handleSave = (): void => {\n const overrides: Record<string, string> = {}\n for (const [key, color] of Object.entries(draft)) {\n if (color) overrides[key] = color\n }\n onSave(overrides)\n }\n\n return (\n <Dialog open onOpenChange={(open) => { if (!open) onClose() }}>\n <DialogContent className=\"w-full max-w-lg\">\n <DialogHeader>\n <DialogTitle>{t('dashboard:widget.colorsTitle')}</DialogTitle>\n </DialogHeader>\n\n <div className=\"max-h-[60vh] space-y-4 overflow-y-auto py-1\">\n {items.map((item) => (\n <div key={item.key} className=\"space-y-1.5\">\n <div className=\"flex items-center gap-2 text-sm\">\n <span\n className=\"size-3 shrink-0 rounded-full\"\n style={{ backgroundColor: draft[item.key] ?? item.auto }}\n />\n <span className=\"truncate font-medium\">{item.label}</span>\n </div>\n <ColorSwatchPicker\n value={draft[item.key]}\n onChange={(next) =>\n setDraft((prev) => ({ ...prev, [item.key]: next }))\n }\n presets={CHART_COLOR_PRESETS}\n labels={{\n custom: t('dashboard:widget.colorCustom'),\n pick: t('dashboard:widget.colorPick'),\n auto: t('dashboard:widget.colorAuto'),\n }}\n />\n </div>\n ))}\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>{t('common:cancel')}</Button>\n <Button onClick={handleSave}>{t('common:save')}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","// Dashboard tile rendering one ChartDef. Phase 10 brings:\n// • Per-widget toolbar (step / range / width / SQL toggle) — changes persist\n// via `onUpdate` so a tweak survives reload without re-opening the builder.\n// • Time-series chart (date X-axis, value Y-axis) with multi-series via\n// secondary `groupBy`. Zero-fill happens UI-side regardless of adapter.\n// • KPI mode = `step: 'all'` — sums the single bucket and shows period-over-\n// period delta.\n// • Graceful degradation when the adapter cannot do time-series aggregation\n// (e.g. non-relational DB) — shows a friendly message instead of erroring.\n\nimport * as React from 'react'\nimport {\n MoreHorizontal,\n Pencil,\n Trash2,\n RefreshCw,\n Maximize2,\n Minimize2,\n Code,\n Copy,\n Check,\n FolderSymlink,\n AlertTriangle,\n ArrowUp,\n ArrowDown,\n Palette,\n} from 'lucide-react'\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n TimeSeriesChart,\n KpiCard,\n DatePicker,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Button,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Skeleton,\n paletteFor,\n} from '@modern-admin/ui'\nimport { ReferenceCombobox } from '../reference.js'\nimport type { PropertyJSON } from '../types.js'\nimport type {\n ChartDef,\n ChartDefInput,\n AggregationStep,\n ChartWidth,\n TimeRange,\n TimeRangePreset,\n} from '@modern-admin/core'\nimport { useTimeSeries, useResource } from '../hooks.js'\nimport { useI18n } from '../i18n.js'\nimport { resolveRange } from '../use-dashboard-charts.js'\nimport {\n fillTimeSeries,\n generateBuckets,\n makeLabelFormatter,\n makeTickFormatter,\n} from '../dashboard/time-series.js'\nimport {\n applyTransform,\n transformSeries,\n makeValueFormatter,\n makeAxisFormatter,\n} from '../dashboard/value-format.js'\nimport {\n alignPreviousSeries,\n serverPreviousRangeOf,\n sumSeries,\n computeDelta,\n} from '../dashboard/compare.js'\nimport { ChartSeriesColorsDialog } from './chart-series-colors-dialog.js'\nimport type { TimeSeriesQuery, TimeSeriesSeries } from '../client.js'\nimport type { ChartTransformStep } from '@modern-admin/core'\n\nconst PRESETS: TimeRangePreset[] = ['7d', '30d', '90d', '1y', 'all', 'custom']\nconst STEPS: Exclude<AggregationStep, 'all'>[] = ['day', 'week', 'month', 'year']\n\nexport interface ChartWidgetProps {\n config: ChartDef\n onEdit(): void\n onDelete(): void\n onMove?(): void\n /** Called when the user tweaks step / range / width directly on the widget. */\n onUpdate(input: ChartDefInput): void\n}\n\nexport function ChartWidget({\n config,\n onEdit,\n onDelete,\n onMove,\n onUpdate,\n}: ChartWidgetProps): React.ReactElement {\n const { t, locale } = useI18n()\n\n const isKpi = config.visualisation === 'kpi'\n // KPI charts force `step: 'all'`; the schema enforces this at save time.\n // For very wide presets, automatically coarsen granularity so the point\n // count stays manageable — 3650 daily buckets for 'all' would render an\n // unreadable axis and cause significant memory pressure in Recharts.\n const renderStep: AggregationStep =\n isKpi ? 'all'\n : config.timeRange.preset === 'all' && (config.step === 'day' || config.step === 'week') ? 'month'\n : config.timeRange.preset === '1y' && config.step === 'day' ? 'week'\n : config.step\n\n // Resolve the time-range preset to concrete from/to per render so cards\n // automatically reflect \"now\" as days roll over without re-saving.\n const range = React.useMemo(() => resolveRange(config.timeRange), [config.timeRange])\n\n // Previous-period overlay is only meaningful without a breakdown: top-N is\n // computed independently per window, so grouped series keys aren't stable.\n const compareActive = !isKpi && config.comparePrevious === true && !config.groupBy\n\n // If the saved ChartDef pre-dates the groupByLabelResource feature (i.e.,\n // groupBy is set but groupByLabelResource is not), derive it from the\n // resource's property metadata so labels resolve without requiring a re-save.\n const resourceConfig = useResource(config.resource)\n const effectiveLabelResource = React.useMemo(() => {\n if (config.groupByLabelResource) return config.groupByLabelResource\n if (!config.groupBy || !resourceConfig) return undefined\n const props = resourceConfig.properties\n const prop = props.find((p) => p.path === config.groupBy)\n if (!prop) return undefined\n if (prop.reference) return prop.reference\n // FK heuristic: strip Id / _id suffix and look for a sibling reference prop.\n const base = prop.path.endsWith('_id')\n ? prop.path.slice(0, -3)\n : prop.path.endsWith('Id')\n ? prop.path.slice(0, -2)\n : ''\n if (base) {\n const sibling = props.find((p) => p.path === base && p.reference)\n if (sibling?.reference) return sibling.reference\n }\n return undefined\n }, [config.groupBy, config.groupByLabelResource, resourceConfig])\n\n const query = React.useMemo<TimeSeriesQuery>(\n () => ({\n resource: config.resource,\n dateField: config.dateField,\n step: renderStep as TimeSeriesQuery['step'],\n metric: config.metric,\n from: range.from,\n to: range.to,\n ...(config.field ? { field: config.field } : {}),\n ...(!isKpi && config.groupBy ? { groupBy: config.groupBy } : {}),\n ...(!isKpi && config.groupBy ? { topN: config.topN } : {}),\n ...(!isKpi && config.groupBy && effectiveLabelResource\n ? { groupByLabelResource: effectiveLabelResource }\n : {}),\n ...(Object.keys(config.filters).length ? { filters: config.filters } : {}),\n ...(isKpi || compareActive ? { comparePrevious: true as const } : {}),\n }),\n [config, range, isKpi, compareActive, renderStep, effectiveLabelResource],\n )\n\n const { data, isLoading, isError, refetch, isFetching } = useTimeSeries(query)\n\n const [showSql, setShowSql] = React.useState(false)\n const [sqlCopied, setSqlCopied] = React.useState(false)\n\n // Draft from/to — only committed when the user clicks Apply.\n // Seeded from `config.timeRange` when preset changes to 'custom'.\n const [draftFrom, setDraftFrom] = React.useState(range.from)\n const [draftTo, setDraftTo] = React.useState(range.to)\n\n // Quick filters exposed inline in the toolbar, alongside the date range\n // controls. Each change applies immediately — no separate Apply step.\n const quickFilterPaths = config.quickFilters ?? []\n\n // Mutators — persisted by the parent via `onUpdate(updatedDef)`.\n const update = (patch: Partial<ChartDefInput>): void => {\n onUpdate({ ...config, ...patch, updatedAt: new Date().toISOString() })\n }\n\n const applyQuickFilter = (path: string, value: string): void => {\n const next: Record<string, string> = { ...config.filters }\n if (value === '') delete next[path]\n else next[path] = value\n update({ filters: next })\n }\n\n const onPresetChange = (preset: TimeRangePreset): void => {\n if (preset === 'custom') {\n // Seed draft with the currently resolved window — user can then narrow\n // it and click Apply without triggering an immediate refetch.\n setDraftFrom(range.from)\n setDraftTo(range.to)\n update({\n timeRange: { preset: 'custom', from: range.from, to: range.to } as TimeRange,\n })\n } else {\n update({ timeRange: { preset } as TimeRange })\n }\n }\n\n const applyCustomRange = (): void => {\n if (draftFrom && draftTo) {\n update({\n timeRange: { preset: 'custom', from: draftFrom, to: draftTo } as TimeRange,\n })\n }\n }\n\n const onStepChange = (step: AggregationStep): void => {\n if (step === 'all') return // KPI is selected via the builder, not the toolbar\n update({ step })\n }\n\n const onWidthToggle = (): void => {\n update({ width: (config.width === 'full' ? 'half' : 'full') as ChartWidth })\n }\n\n // ── Render ────────────────────────────────────────────────────────────\n\n const heightClass = isKpi ? 'h-32' : 'h-[320px]'\n\n const resolvedLabels = data?.resolvedLabels\n const seriesLabel = React.useCallback(\n (key: string): string => {\n if (key === '__total__') return t('dashboard:seriesTotal')\n if (key === '__other__') return t('dashboard:seriesOther')\n if (key === '__null__') return t('dashboard:seriesNull')\n return resolvedLabels?.[key] ?? key\n },\n [resolvedLabels, t],\n )\n\n const valueFormatter = React.useMemo(\n () => makeValueFormatter(config.format, locale),\n [config.format, locale],\n )\n const axisValueFormatter = React.useMemo(\n () => makeAxisFormatter(config.format, locale),\n [config.format, locale],\n )\n\n const chartSeries = React.useMemo(() => {\n const primary = transformSeries(\n prepareSeries(data?.series ?? [], range, renderStep, seriesLabel),\n config.transform,\n ).map((s) => {\n const color = config.series?.[s.key]?.color\n return color ? { ...s, color } : s\n })\n if (!compareActive || !data?.previous?.length) return primary\n const prevRange = serverPreviousRangeOf(range)\n if (!prevRange) return primary\n const currentBuckets = generateBuckets(range.from, range.to, renderStep)\n const overlays = transformSeries(\n alignPreviousSeries(data.previous, prevRange, currentBuckets, renderStep),\n config.transform,\n ).map((s) => ({\n key: s.key,\n label: t('dashboard:widget.previousSeries').replace(\n '{label}',\n seriesLabel(s.sourceKey),\n ),\n points: s.points,\n dashed: true,\n hiddenWith: s.sourceKey,\n }))\n return [...primary, ...overlays]\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n data?.series,\n data?.previous,\n range.from,\n range.to,\n renderStep,\n seriesLabel,\n compareActive,\n config.transform,\n config.series,\n t,\n ])\n\n // Period-over-period delta on raw (pre-transform) totals.\n const delta = React.useMemo(\n () =>\n compareActive && data\n ? computeDelta(sumSeries(data.series), sumSeries(data.previous))\n : null,\n [compareActive, data],\n )\n\n const [colorsOpen, setColorsOpen] = React.useState(false)\n // Effective colors for the dialog rows: override or palette by index\n // among primary (non-dashed) series — matches TimeSeriesChart's slots.\n const colorItems = React.useMemo(() => {\n const primary = chartSeries.filter((s) => !('dashed' in s) || !s.dashed)\n const palette = paletteFor(primary.length)\n return primary.map((s, i) => ({\n key: s.key,\n label: s.label,\n override: config.series?.[s.key]?.color,\n auto: palette[i]!,\n }))\n }, [chartSeries, config.series])\n\n const saveSeriesColors = (overrides: Record<string, string>): void => {\n // Preserve overrides for series not currently rendered (other windows /\n // filters may surface different groupBy values).\n const next: Record<string, { color?: string }> = { ...config.series }\n for (const item of colorItems) delete next[item.key]\n for (const [key, color] of Object.entries(overrides)) next[key] = { color }\n update({ series: next })\n setColorsOpen(false)\n }\n\n // Adapter cannot do time-series — friendly message, no toolbar churn.\n const unsupported = data && data.supported === false\n\n return (\n <Card className=\"flex flex-col\">\n <CardHeader className=\"flex flex-row items-center justify-between gap-2 p-3 pb-2 space-y-0 sm:p-6 sm:pb-2\">\n <CardTitle className=\"flex min-w-0 items-center gap-2 text-sm font-medium pr-2\">\n <span className=\"truncate\">{config.title || t('chart:untitled')}</span>\n {delta && (\n <span\n title={t('dashboard:widget.previousPeriod')}\n className={`inline-flex shrink-0 items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-medium tabular-nums ${\n delta.direction === 'up'\n ? 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400'\n : delta.direction === 'down'\n ? 'bg-rose-500/10 text-rose-600 dark:text-rose-400'\n : 'bg-muted text-muted-foreground'\n }`}\n >\n {delta.direction === 'up' ? (\n <ArrowUp className=\"size-3\" />\n ) : delta.direction === 'down' ? (\n <ArrowDown className=\"size-3\" />\n ) : null}\n {Math.abs(delta.percent)}%\n </span>\n )}\n </CardTitle>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n onClick={onWidthToggle}\n aria-label={\n config.width === 'full'\n ? t('dashboard:widget.shrink')\n : t('dashboard:widget.expand')\n }\n >\n {config.width === 'full' ? (\n <Minimize2 className=\"size-3.5\" />\n ) : (\n <Maximize2 className=\"size-3.5\" />\n )}\n </Button>\n {data?.sql && (\n <Button\n variant={showSql ? 'secondary' : 'ghost'}\n size=\"icon\"\n className=\"size-7\"\n onClick={() => setShowSql((v) => !v)}\n aria-label={t('dashboard:widget.toggleSql')}\n >\n <Code className=\"size-3.5\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n onClick={() => refetch()}\n disabled={isFetching}\n aria-label={t('common:refresh')}\n >\n <RefreshCw className={`size-3.5 ${isFetching ? 'animate-spin' : ''}`} />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n aria-label={t('common:openMenu')}\n >\n <MoreHorizontal className=\"size-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={onEdit}>\n <Pencil className=\"size-4 mr-2\" />\n {t('chart:editChart')}\n </DropdownMenuItem>\n {!isKpi && (\n <DropdownMenuItem onClick={() => setColorsOpen(true)}>\n <Palette className=\"size-4 mr-2\" />\n {t('dashboard:widget.editColors')}\n </DropdownMenuItem>\n )}\n {onMove && (\n <DropdownMenuItem onClick={onMove}>\n <FolderSymlink className=\"size-4 mr-2\" />\n {t('chart:moveToGroup')}\n </DropdownMenuItem>\n )}\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={onDelete}\n className=\"text-destructive focus:text-destructive\"\n >\n <Trash2 className=\"size-4 mr-2\" />\n {t('chart:deleteChart')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </CardHeader>\n\n <CardContent className=\"flex-1 p-3 pt-0 space-y-3 sm:p-6 sm:pt-0\">\n {/* Toolbar — quick filters + step + range + window display, all in one\n row. Hidden for unsupported adapters because changing knobs would\n have no effect. Quick filters apply immediately on change. */}\n {!unsupported && (\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-muted-foreground\">\n {quickFilterPaths.length > 0 && resourceConfig &&\n quickFilterPaths.map((path) => {\n const prop = resourceConfig.properties.find((p) => p.path === path)\n if (!prop) return null\n return (\n <QuickFilterInput\n key={path}\n property={prop}\n placeholder={prop.label}\n value={config.filters[path] ?? ''}\n onChange={(v) => applyQuickFilter(path, v)}\n />\n )\n })}\n {!isKpi && (\n <Select\n value={config.step === 'all' ? 'day' : config.step}\n onValueChange={(v) => onStepChange(v as AggregationStep)}\n >\n <SelectTrigger\n className=\"h-8 px-2 text-xs w-auto\"\n aria-label={t('chart:step')}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {STEPS.map((s) => (\n <SelectItem key={s} value={s}>\n {t(`chart:step${cap(s)}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n <Select\n value={config.timeRange.preset}\n onValueChange={(v) => onPresetChange(v as TimeRangePreset)}\n >\n <SelectTrigger\n className=\"h-8 px-2 text-xs w-auto\"\n aria-label={t('dashboard:builder.range')}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PRESETS.map((p) => (\n <SelectItem key={p} value={p}>\n {t(`dashboard:range.${p}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {config.timeRange.preset === 'custom' ? (\n <>\n <DatePicker\n value={draftFrom}\n onChange={setDraftFrom}\n ariaLabel={t('common:from')}\n openCalendarLabel={t('common:openCalendar')}\n className=\"w-[130px]\"\n inputClassName=\"h-8 text-xs\"\n />\n <span className=\"text-muted-foreground\">—</span>\n <DatePicker\n value={draftTo}\n onChange={setDraftTo}\n ariaLabel={t('common:to')}\n openCalendarLabel={t('common:openCalendar')}\n className=\"w-[130px]\"\n inputClassName=\"h-8 text-xs\"\n />\n <Button\n size=\"sm\"\n className=\"h-8 px-3 shrink-0\"\n onClick={applyCustomRange}\n disabled={!draftFrom || !draftTo}\n aria-label={t('common:apply')}\n >\n <Check className=\"size-3.5 mr-1\" />\n {t('common:apply')}\n </Button>\n </>\n ) : (\n <span className=\"ml-auto tabular-nums\">\n {range.from} — {range.to}\n </span>\n )}\n </div>\n )}\n\n {/* Truncation warning — adapter capped the scan, so the chart reflects\n only a subset of the window. Hidden while loading / unsupported. */}\n {!unsupported && !isError && data?.truncated && (\n <div className=\"flex items-start gap-2 rounded-md border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-xs text-amber-700 dark:text-amber-400\">\n <AlertTriangle className=\"size-3.5 mt-0.5 shrink-0\" />\n <span>{t('dashboard:widget.truncatedWarning')}</span>\n </div>\n )}\n\n {/* Body */}\n {isLoading ? (\n <Skeleton className={`${heightClass} w-full rounded-md`} />\n ) : isError ? (\n <div\n className={`flex items-center justify-center text-sm text-muted-foreground ${heightClass}`}\n >\n {t('chart:loadError')}\n </div>\n ) : unsupported ? (\n <div\n className={`flex items-center justify-center text-center text-sm text-muted-foreground px-4 ${heightClass}`}\n >\n {t('dashboard:widget.unsupported')}\n </div>\n ) : isKpi ? (\n <KpiBody\n data={data}\n transform={config.transform}\n formatNumber={valueFormatter}\n labels={kpiLabels(t)}\n />\n ) : (\n <TimeSeriesChart\n series={chartSeries}\n height={320}\n visualisation={config.visualisation === 'kpi' ? undefined : config.visualisation}\n tickFormatter={makeTickFormatter(renderStep, locale)}\n labelFormatter={makeLabelFormatter(renderStep, locale)}\n valueFormatter={valueFormatter}\n axisValueFormatter={axisValueFormatter}\n labels={{\n noData: t('chart:noData'),\n showAll: t('dashboard:widget.showAll'),\n hideAll: t('dashboard:widget.hideAll'),\n }}\n />\n )}\n\n {/* Captured SQL — only when the user toggled and server returned it. */}\n {data?.sql && showSql && (\n <div className=\"relative\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute top-1 right-1 size-6\"\n onClick={() => {\n void navigator.clipboard.writeText(data.sql ?? '')\n setSqlCopied(true)\n setTimeout(() => setSqlCopied(false), 2000)\n }}\n aria-label={sqlCopied ? t('common:copied') : t('common:copy')}\n >\n {sqlCopied\n ? <Check className=\"size-3 text-green-500\" />\n : <Copy className=\"size-3\" />}\n </Button>\n <pre className=\"text-[11px] leading-snug bg-muted/50 border border-border rounded-md p-2 pr-8 overflow-x-auto whitespace-pre\">\n {data.sql}\n </pre>\n </div>\n )}\n </CardContent>\n\n {colorsOpen && (\n <ChartSeriesColorsDialog\n items={colorItems}\n onSave={saveSeriesColors}\n onClose={() => setColorsOpen(false)}\n />\n )}\n </Card>\n )\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────\n\nconst cap = (s: string): string => s.charAt(0).toUpperCase() + s.slice(1)\n\nconst QF_NONE = '__none__'\n\n/** Compact inline filter input — label is passed as placeholder so no\n * extra row is needed. Matches the `h-7 text-xs` sizing of toolbar controls. */\nfunction QuickFilterInput({\n property,\n placeholder,\n value,\n onChange,\n}: {\n property: PropertyJSON\n placeholder?: string\n value: string\n onChange(next: string): void\n}): React.ReactElement {\n const ph = placeholder ?? property.label\n if (property.reference) {\n return (\n <div className=\"w-36\">\n <ReferenceCombobox\n referenceResourceId={property.reference}\n value={value || null}\n onChange={(next) => onChange(next == null ? '' : String(next))}\n placeholder={ph}\n className=\"h-8 text-xs\"\n />\n </div>\n )\n }\n if (property.availableValues && property.availableValues.length > 0) {\n return (\n <Select\n value={value || QF_NONE}\n onValueChange={(v) => onChange(v === QF_NONE ? '' : v)}\n >\n <SelectTrigger className=\"h-8 px-2 text-xs w-36\">\n <SelectValue placeholder={ph} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={QF_NONE}>{ph}</SelectItem>\n {property.availableValues.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>{opt.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n }\n if (property.type === 'boolean') {\n return (\n <Select\n value={value || QF_NONE}\n onValueChange={(v) => onChange(v === QF_NONE ? '' : v)}\n >\n <SelectTrigger className=\"h-8 px-2 text-xs w-36\">\n <SelectValue placeholder={ph} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={QF_NONE}>{ph}</SelectItem>\n <SelectItem value=\"true\">true</SelectItem>\n <SelectItem value=\"false\">false</SelectItem>\n </SelectContent>\n </Select>\n )\n }\n const isNumeric =\n property.type === 'number' || property.type === 'float' || property.type === 'currency'\n return (\n <Input\n type={isNumeric ? 'number' : 'text'}\n className=\"h-8 px-2 text-xs w-36\"\n value={value}\n placeholder={ph}\n onChange={(e) => onChange(e.target.value)}\n />\n )\n}\n\n/**\n * Zero-fill every series across the resolved date range and re-tag each\n * with its display label (so legend shows \"Total\" / \"Other\" / actual\n * groupBy values rather than the wire-format internal keys).\n */\nfunction prepareSeries(\n series: ReadonlyArray<TimeSeriesSeries>,\n range: { from: string; to: string },\n step: AggregationStep,\n labelFor: (key: string) => string,\n): { key: string; label: string; points: { date: string; value: number }[] }[] {\n const filled = fillTimeSeries(\n series.map((s) => ({ key: s.key, points: s.points })),\n range.from,\n range.to,\n step as Exclude<AggregationStep, 'all'> | 'all',\n )\n return filled.map((s) => ({\n key: s.key,\n label: labelFor(s.key),\n points: [...s.points],\n }))\n}\n\ninterface KpiBodyProps {\n data: { series: ReadonlyArray<TimeSeriesSeries>; previous?: ReadonlyArray<TimeSeriesSeries> } | undefined\n transform: ReadonlyArray<ChartTransformStep>\n formatNumber: (n: number) => string\n labels: {\n noData: string\n deltaUp: string\n deltaDown: string\n deltaFlat: string\n previousPeriod: string\n }\n}\n\n/** KPI mode summarises the single-bucket response to one scalar. The value\n * transform applies to both windows so the delta stays consistent. */\nfunction KpiBody({ data, transform, formatNumber, labels }: KpiBodyProps): React.ReactElement {\n const raw = sumAll(data?.series)\n const rawPrev = sumAll(data?.previous)\n const value = raw == null ? raw : applyTransform(raw, transform)\n const prev = rawPrev == null ? rawPrev : applyTransform(rawPrev, transform)\n return (\n <KpiCard\n value={value}\n previousValue={prev}\n formatNumber={formatNumber}\n labels={labels}\n />\n )\n}\n\nfunction sumAll(series: ReadonlyArray<TimeSeriesSeries> | undefined): number | null {\n if (!series || series.length === 0) return null\n let total = 0\n for (const s of series) for (const p of s.points) total += p.value\n return total\n}\n\nfunction kpiLabels(t: (key: string) => string): {\n noData: string\n deltaUp: string\n deltaDown: string\n deltaFlat: string\n previousPeriod: string\n} {\n return {\n noData: t('chart:noData'),\n deltaUp: t('dashboard:widget.deltaUp'),\n deltaDown: t('dashboard:widget.deltaDown'),\n deltaFlat: t('dashboard:widget.deltaFlat'),\n previousPeriod: t('dashboard:widget.previousPeriod'),\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-widget-Bfk_mvm2.js","names":[],"sources":["../../../../react/src/dashboard/time-series.ts","../../../../react/src/dashboard/compare.ts","../../../../react/src/components/chart-series-colors-dialog.tsx","../../../../react/src/components/chart-widget.tsx"],"sourcesContent":["// Time-series UI helpers — bucket fill, tick formatting, label formatting.\n// All zero-fill happens here on the client side (req: \"Заполнение нулями\n// должно быть только в ui, вне зависимости от адаптеров\"). Adapters return\n// only buckets that have data; the UI fabricates the rest at value 0 so\n// charts don't have visual gaps.\n\nimport type {\n TimeSeriesPoint,\n TimeSeriesSeries,\n TimeSeriesStep,\n} from '../client.js'\n\n/** Generate a continuous sequence of `YYYY-MM-DD` bucket keys spanning [from, to]. */\nexport function generateBuckets(\n fromIso: string,\n toIso: string,\n step: TimeSeriesStep,\n): string[] {\n if (step === 'all') return [fromIso.slice(0, 10)]\n const out: string[] = []\n const cur = startOf(new Date(fromIso), step)\n const end = startOf(new Date(toIso), step)\n while (cur.getTime() <= end.getTime()) {\n out.push(ymd(cur))\n advance(cur, step)\n }\n return out\n}\n\n/**\n * Zero-fill every series so each one has a value for every bucket in the\n * resolved date range. Missing buckets become `value: 0` rather than gaps,\n * which Recharts renders as flat segments instead of breaks.\n */\nexport function fillTimeSeries(\n series: TimeSeriesSeries[],\n fromIso: string,\n toIso: string,\n step: TimeSeriesStep,\n): TimeSeriesSeries[] {\n const buckets = generateBuckets(fromIso, toIso, step)\n return series.map((s) => {\n const map = new Map(s.points.map((p) => [p.date, p.value]))\n const points: TimeSeriesPoint[] = buckets.map((date) => ({\n date,\n value: map.get(date) ?? 0,\n }))\n return { key: s.key, points }\n })\n}\n\n/**\n * X-axis tick formatter — short label format depending on bucket size.\n * day/week → DD.MM, month → MM.YYYY, year → YYYY.\n */\nexport function makeTickFormatter(\n step: TimeSeriesStep,\n locale = 'en-US',\n): (iso: string) => string {\n const dayMonth = new Intl.DateTimeFormat(locale, { day: '2-digit', month: '2-digit' })\n const monthYear = new Intl.DateTimeFormat(locale, { month: '2-digit', year: 'numeric' })\n const year = new Intl.DateTimeFormat(locale, { year: 'numeric' })\n return (iso: string): string => {\n const d = new Date(iso)\n if (step === 'year') return year.format(d)\n if (step === 'month') return monthYear.format(d)\n return dayMonth.format(d)\n }\n}\n\n/**\n * Tooltip label formatter — long, human-friendly form. For week buckets\n * we render `Mon DD – Sun DD` (the bucket plus 6 days).\n */\nexport function makeLabelFormatter(\n step: TimeSeriesStep,\n locale = 'en-US',\n): (iso: string) => string {\n const fullDay = new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: 'long',\n year: 'numeric',\n })\n const monthYear = new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' })\n const year = new Intl.DateTimeFormat(locale, { year: 'numeric' })\n const shortDay = new Intl.DateTimeFormat(locale, { day: '2-digit', month: 'short' })\n return (iso: string): string => {\n const d = new Date(iso)\n if (step === 'year') return year.format(d)\n if (step === 'month') return monthYear.format(d)\n if (step === 'week') {\n const end = new Date(d)\n end.setDate(end.getDate() + 6)\n return `${shortDay.format(d)} – ${shortDay.format(end)}`\n }\n return fullDay.format(d)\n }\n}\n\n// ─── Internals ────────────────────────────────────────────────────────────\n\nfunction ymd(d: Date): string {\n return d.toISOString().slice(0, 10)\n}\n\nfunction startOf(d: Date, step: TimeSeriesStep): Date {\n const out = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()))\n if (step === 'week') {\n // Monday-anchored week.\n const dow = (out.getUTCDay() + 6) % 7\n out.setUTCDate(out.getUTCDate() - dow)\n } else if (step === 'month') {\n out.setUTCDate(1)\n } else if (step === 'year') {\n out.setUTCMonth(0, 1)\n }\n return out\n}\n\nfunction advance(d: Date, step: TimeSeriesStep): void {\n if (step === 'day') d.setUTCDate(d.getUTCDate() + 1)\n else if (step === 'week') d.setUTCDate(d.getUTCDate() + 7)\n else if (step === 'month') d.setUTCMonth(d.getUTCMonth() + 1)\n else if (step === 'year') d.setUTCFullYear(d.getUTCFullYear() + 1)\n}\n","// Previous-period comparison helpers for dashboard charts.\n//\n// The adapters compute the previous window as `prevTo = from`,\n// `prevFrom = from − (to − from)` where the wire `from`/`to` are\n// start-of-day / end-of-day instants. In whole-day terms that is the\n// N-day window ending the day before the current one starts — which is\n// what `serverPreviousRangeOf` reproduces so client-side zero-fill and\n// tooltips agree with the buckets the server actually returns. (The\n// degenerate 1 ms boundary bucket at `from` itself is dropped.)\n\nimport type { TimeSeriesSeries, TimeSeriesStep } from '../client.js'\nimport { generateBuckets } from './time-series.js'\n\n/** Prefix marking overlay series produced from the previous window. */\nexport const PREVIOUS_KEY_PREFIX = '__prev__:'\n\nexport interface AlignedPreviousPoint {\n /** Current-window bucket the point is plotted on. */\n date: string\n value: number\n /** Real previous-window bucket the value came from (for tooltips). */\n sourceDate?: string\n}\n\nexport interface AlignedPreviousSeries {\n key: string\n /** Key of the paired current-window series (`__total__`, …). */\n sourceKey: string\n points: AlignedPreviousPoint[]\n}\n\n/**\n * Whole-day previous window matching the adapters' formula: for a current\n * window of N days `[from, to]`, returns `[from − N, from − 1]`.\n */\nexport function serverPreviousRangeOf(range: {\n from: string\n to: string\n}): { from: string; to: string } | null {\n const f = Date.parse(`${range.from}T00:00:00.000Z`)\n const t = Date.parse(`${range.to}T00:00:00.000Z`)\n if (Number.isNaN(f) || Number.isNaN(t) || t < f) return null\n const days = Math.round((t - f) / 86_400_000) + 1\n return {\n from: ymd(new Date(f - days * 86_400_000)),\n to: ymd(new Date(f - 86_400_000)),\n }\n}\n\n/**\n * Zero-fill the previous window and re-plot each point onto the current\n * window's bucket axis (point *i* → `currentBuckets[i]`), keeping the real\n * date in `sourceDate`. When bucket counts differ (step-aligned month/week\n * windows drift by ±1) the series are aligned on their END — \"yesterday\n * lines up with yesterday\" — and leading gaps become zeros.\n */\nexport function alignPreviousSeries(\n previous: ReadonlyArray<TimeSeriesSeries>,\n prevRange: { from: string; to: string },\n currentBuckets: ReadonlyArray<string>,\n step: TimeSeriesStep,\n): AlignedPreviousSeries[] {\n if (currentBuckets.length === 0) return []\n const prevBuckets = generateBuckets(prevRange.from, prevRange.to, step)\n const offset = currentBuckets.length - prevBuckets.length\n return previous.map((s) => {\n const map = new Map(s.points.map((p) => [p.date, p.value]))\n const points: AlignedPreviousPoint[] = currentBuckets.map((date, i) => {\n const src = prevBuckets[i - offset]\n return src === undefined\n ? { date, value: 0 }\n : { date, value: map.get(src) ?? 0, sourceDate: src }\n })\n return { key: `${PREVIOUS_KEY_PREFIX}${s.key}`, sourceKey: s.key, points }\n })\n}\n\n/** Total across all points of all series (raw, pre-transform values). */\nexport function sumSeries(\n series: ReadonlyArray<TimeSeriesSeries> | undefined,\n): number | null {\n if (!series || series.length === 0) return null\n let total = 0\n for (const s of series) for (const p of s.points) total += p.value\n return total\n}\n\nexport interface PeriodDelta {\n /** Signed percentage, one decimal place (e.g. -81.7). */\n percent: number\n direction: 'up' | 'down' | 'flat'\n}\n\n/**\n * Period-over-period delta on raw totals: `(cur − prev) / prev`. Returns\n * null when the previous total is missing or 0 (undefined percentage).\n */\nexport function computeDelta(\n current: number | null,\n previous: number | null,\n): PeriodDelta | null {\n if (current == null || previous == null || previous === 0) return null\n const percent = Math.round(((current - previous) / Math.abs(previous)) * 1000) / 10\n return {\n percent,\n direction: percent > 0 ? 'up' : percent < 0 ? 'down' : 'flat',\n }\n}\n\nconst ymd = (d: Date): string => d.toISOString().slice(0, 10)\n","// Per-series color override dialog for a dashboard chart. Opened from the\n// widget \"…\" menu so it can list the series actually rendered (groupBy\n// values are only known once data is loaded). Lives in the react package\n// because it is i18n-aware; primitives come from @modern-admin/ui.\n\nimport * as React from 'react'\nimport {\n Button,\n ColorSwatchPicker,\n CHART_COLOR_PRESETS,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@modern-admin/ui'\nimport { useI18n } from '../i18n.js'\n\nexport interface SeriesColorItem {\n /** Stable series key (`__total__`, groupBy value, …). */\n key: string\n /** Display label (legend text). */\n label: string\n /** Persisted override, if any. */\n override?: string\n /** Palette color used when no override is set — shown as the row swatch. */\n auto: string\n}\n\nexport interface ChartSeriesColorsDialogProps {\n items: ReadonlyArray<SeriesColorItem>\n /** Receives only the overrides (key → hex); auto rows are omitted. */\n onSave(overrides: Record<string, string>): void\n onClose(): void\n}\n\nexport function ChartSeriesColorsDialog({\n items,\n onSave,\n onClose,\n}: ChartSeriesColorsDialogProps): React.ReactElement {\n const { t } = useI18n()\n const [draft, setDraft] = React.useState<Record<string, string | undefined>>(\n () => Object.fromEntries(items.map((i) => [i.key, i.override])),\n )\n\n const handleSave = (): void => {\n const overrides: Record<string, string> = {}\n for (const [key, color] of Object.entries(draft)) {\n if (color) overrides[key] = color\n }\n onSave(overrides)\n }\n\n return (\n <Dialog open onOpenChange={(open) => { if (!open) onClose() }}>\n <DialogContent className=\"w-full max-w-lg\">\n <DialogHeader>\n <DialogTitle>{t('dashboard:widget.colorsTitle')}</DialogTitle>\n </DialogHeader>\n\n <div className=\"max-h-[60vh] space-y-4 overflow-y-auto py-1\">\n {items.map((item) => (\n <div key={item.key} className=\"space-y-1.5\">\n <div className=\"flex items-center gap-2 text-sm\">\n <span\n className=\"size-3 shrink-0 rounded-full\"\n style={{ backgroundColor: draft[item.key] ?? item.auto }}\n />\n <span className=\"truncate font-medium\">{item.label}</span>\n </div>\n <ColorSwatchPicker\n value={draft[item.key]}\n onChange={(next) =>\n setDraft((prev) => ({ ...prev, [item.key]: next }))\n }\n presets={CHART_COLOR_PRESETS}\n labels={{\n custom: t('dashboard:widget.colorCustom'),\n pick: t('dashboard:widget.colorPick'),\n auto: t('dashboard:widget.colorAuto'),\n }}\n />\n </div>\n ))}\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>{t('common:cancel')}</Button>\n <Button onClick={handleSave}>{t('common:save')}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","// Dashboard tile rendering one ChartDef. Phase 10 brings:\n// • Per-widget toolbar (step / range / width / SQL toggle) — changes persist\n// via `onUpdate` so a tweak survives reload without re-opening the builder.\n// • Time-series chart (date X-axis, value Y-axis) with multi-series via\n// secondary `groupBy`. Zero-fill happens UI-side regardless of adapter.\n// • KPI mode = `step: 'all'` — sums the single bucket and shows period-over-\n// period delta.\n// • Graceful degradation when the adapter cannot do time-series aggregation\n// (e.g. non-relational DB) — shows a friendly message instead of erroring.\n\nimport * as React from 'react'\nimport {\n MoreHorizontal,\n Pencil,\n Trash2,\n RefreshCw,\n Maximize2,\n Minimize2,\n Code,\n Copy,\n Check,\n FolderSymlink,\n AlertTriangle,\n ArrowUp,\n ArrowDown,\n Palette,\n} from 'lucide-react'\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n TimeSeriesChart,\n KpiCard,\n DatePicker,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Button,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Skeleton,\n paletteFor,\n} from '@modern-admin/ui'\nimport { ReferenceCombobox } from '../reference.js'\nimport type { PropertyJSON } from '../types.js'\nimport type {\n ChartDef,\n ChartDefInput,\n AggregationStep,\n ChartWidth,\n TimeRange,\n TimeRangePreset,\n} from '@modern-admin/core'\nimport { useTimeSeries, useResource } from '../hooks.js'\nimport { useI18n } from '../i18n.js'\nimport { resolveRange } from '../use-dashboard-charts.js'\nimport {\n fillTimeSeries,\n generateBuckets,\n makeLabelFormatter,\n makeTickFormatter,\n} from '../dashboard/time-series.js'\nimport {\n applyTransform,\n transformSeries,\n makeValueFormatter,\n makeAxisFormatter,\n} from '../dashboard/value-format.js'\nimport {\n alignPreviousSeries,\n serverPreviousRangeOf,\n sumSeries,\n computeDelta,\n} from '../dashboard/compare.js'\nimport { ChartSeriesColorsDialog } from './chart-series-colors-dialog.js'\nimport type { TimeSeriesQuery, TimeSeriesSeries } from '../client.js'\nimport type { ChartTransformStep } from '@modern-admin/core'\n\nconst PRESETS: TimeRangePreset[] = ['7d', '30d', '90d', '1y', 'all', 'custom']\nconst STEPS: Exclude<AggregationStep, 'all'>[] = ['day', 'week', 'month', 'year']\n\nexport interface ChartWidgetProps {\n config: ChartDef\n onEdit(): void\n onDelete(): void\n onMove?(): void\n /** Called when the user tweaks step / range / width directly on the widget. */\n onUpdate(input: ChartDefInput): void\n}\n\nexport function ChartWidget({\n config,\n onEdit,\n onDelete,\n onMove,\n onUpdate,\n}: ChartWidgetProps): React.ReactElement {\n const { t, locale } = useI18n()\n\n const isKpi = config.visualisation === 'kpi'\n // KPI charts force `step: 'all'`; the schema enforces this at save time.\n // For very wide presets, automatically coarsen granularity so the point\n // count stays manageable — 3650 daily buckets for 'all' would render an\n // unreadable axis and cause significant memory pressure in Recharts.\n const renderStep: AggregationStep =\n isKpi ? 'all'\n : config.timeRange.preset === 'all' && (config.step === 'day' || config.step === 'week') ? 'month'\n : config.timeRange.preset === '1y' && config.step === 'day' ? 'week'\n : config.step\n\n // Resolve the time-range preset to concrete from/to per render so cards\n // automatically reflect \"now\" as days roll over without re-saving.\n const range = React.useMemo(() => resolveRange(config.timeRange), [config.timeRange])\n\n // Previous-period overlay is only meaningful without a breakdown: top-N is\n // computed independently per window, so grouped series keys aren't stable.\n const compareActive = !isKpi && config.comparePrevious === true && !config.groupBy\n\n // If the saved ChartDef pre-dates the groupByLabelResource feature (i.e.,\n // groupBy is set but groupByLabelResource is not), derive it from the\n // resource's property metadata so labels resolve without requiring a re-save.\n const resourceConfig = useResource(config.resource)\n const effectiveLabelResource = React.useMemo(() => {\n if (config.groupByLabelResource) return config.groupByLabelResource\n if (!config.groupBy || !resourceConfig) return undefined\n const props = resourceConfig.properties\n const prop = props.find((p) => p.path === config.groupBy)\n if (!prop) return undefined\n if (prop.reference) return prop.reference\n // FK heuristic: strip Id / _id suffix and look for a sibling reference prop.\n const base = prop.path.endsWith('_id')\n ? prop.path.slice(0, -3)\n : prop.path.endsWith('Id')\n ? prop.path.slice(0, -2)\n : ''\n if (base) {\n const sibling = props.find((p) => p.path === base && p.reference)\n if (sibling?.reference) return sibling.reference\n }\n return undefined\n }, [config.groupBy, config.groupByLabelResource, resourceConfig])\n\n const query = React.useMemo<TimeSeriesQuery>(\n () => ({\n resource: config.resource,\n dateField: config.dateField,\n step: renderStep as TimeSeriesQuery['step'],\n metric: config.metric,\n from: range.from,\n to: range.to,\n ...(config.field ? { field: config.field } : {}),\n ...(!isKpi && config.groupBy ? { groupBy: config.groupBy } : {}),\n ...(!isKpi && config.groupBy ? { topN: config.topN } : {}),\n ...(!isKpi && config.groupBy && effectiveLabelResource\n ? { groupByLabelResource: effectiveLabelResource }\n : {}),\n ...(Object.keys(config.filters).length ? { filters: config.filters } : {}),\n ...(isKpi || compareActive ? { comparePrevious: true as const } : {}),\n }),\n [config, range, isKpi, compareActive, renderStep, effectiveLabelResource],\n )\n\n const { data, isLoading, isError, refetch, isFetching } = useTimeSeries(query)\n\n const [showSql, setShowSql] = React.useState(false)\n const [sqlCopied, setSqlCopied] = React.useState(false)\n\n // Draft from/to — only committed when the user clicks Apply.\n // Seeded from `config.timeRange` when preset changes to 'custom'.\n const [draftFrom, setDraftFrom] = React.useState(range.from)\n const [draftTo, setDraftTo] = React.useState(range.to)\n\n // Quick filters exposed inline in the toolbar, alongside the date range\n // controls. Each change applies immediately — no separate Apply step.\n const quickFilterPaths = config.quickFilters ?? []\n\n // Mutators — persisted by the parent via `onUpdate(updatedDef)`.\n const update = (patch: Partial<ChartDefInput>): void => {\n onUpdate({ ...config, ...patch, updatedAt: new Date().toISOString() })\n }\n\n const applyQuickFilter = (path: string, value: string): void => {\n const next: Record<string, string> = { ...config.filters }\n if (value === '') delete next[path]\n else next[path] = value\n update({ filters: next })\n }\n\n const onPresetChange = (preset: TimeRangePreset): void => {\n if (preset === 'custom') {\n // Seed draft with the currently resolved window — user can then narrow\n // it and click Apply without triggering an immediate refetch.\n setDraftFrom(range.from)\n setDraftTo(range.to)\n update({\n timeRange: { preset: 'custom', from: range.from, to: range.to } as TimeRange,\n })\n } else {\n update({ timeRange: { preset } as TimeRange })\n }\n }\n\n const applyCustomRange = (): void => {\n if (draftFrom && draftTo) {\n update({\n timeRange: { preset: 'custom', from: draftFrom, to: draftTo } as TimeRange,\n })\n }\n }\n\n const onStepChange = (step: AggregationStep): void => {\n if (step === 'all') return // KPI is selected via the builder, not the toolbar\n update({ step })\n }\n\n const onWidthToggle = (): void => {\n update({ width: (config.width === 'full' ? 'half' : 'full') as ChartWidth })\n }\n\n // ── Render ────────────────────────────────────────────────────────────\n\n const heightClass = isKpi ? 'h-32' : 'h-[320px]'\n\n const resolvedLabels = data?.resolvedLabels\n const seriesLabel = React.useCallback(\n (key: string): string => {\n if (key === '__total__') return t('dashboard:seriesTotal')\n if (key === '__other__') return t('dashboard:seriesOther')\n if (key === '__null__') return t('dashboard:seriesNull')\n return resolvedLabels?.[key] ?? key\n },\n [resolvedLabels, t],\n )\n\n const valueFormatter = React.useMemo(\n () => makeValueFormatter(config.format, locale),\n [config.format, locale],\n )\n const axisValueFormatter = React.useMemo(\n () => makeAxisFormatter(config.format, locale),\n [config.format, locale],\n )\n\n const chartSeries = React.useMemo(() => {\n const primary = transformSeries(\n prepareSeries(data?.series ?? [], range, renderStep, seriesLabel),\n config.transform,\n ).map((s) => {\n const color = config.series?.[s.key]?.color\n return color ? { ...s, color } : s\n })\n if (!compareActive || !data?.previous?.length) return primary\n const prevRange = serverPreviousRangeOf(range)\n if (!prevRange) return primary\n const currentBuckets = generateBuckets(range.from, range.to, renderStep)\n const overlays = transformSeries(\n alignPreviousSeries(data.previous, prevRange, currentBuckets, renderStep),\n config.transform,\n ).map((s) => ({\n key: s.key,\n label: t('dashboard:widget.previousSeries').replace(\n '{label}',\n seriesLabel(s.sourceKey),\n ),\n points: s.points,\n dashed: true,\n hiddenWith: s.sourceKey,\n }))\n return [...primary, ...overlays]\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n data?.series,\n data?.previous,\n range.from,\n range.to,\n renderStep,\n seriesLabel,\n compareActive,\n config.transform,\n config.series,\n t,\n ])\n\n // Period-over-period delta on raw (pre-transform) totals.\n const delta = React.useMemo(\n () =>\n compareActive && data\n ? computeDelta(sumSeries(data.series), sumSeries(data.previous))\n : null,\n [compareActive, data],\n )\n\n const [colorsOpen, setColorsOpen] = React.useState(false)\n // Effective colors for the dialog rows: override or palette by index\n // among primary (non-dashed) series — matches TimeSeriesChart's slots.\n const colorItems = React.useMemo(() => {\n const primary = chartSeries.filter((s) => !('dashed' in s) || !s.dashed)\n const palette = paletteFor(primary.length)\n return primary.map((s, i) => ({\n key: s.key,\n label: s.label,\n override: config.series?.[s.key]?.color,\n auto: palette[i]!,\n }))\n }, [chartSeries, config.series])\n\n const saveSeriesColors = (overrides: Record<string, string>): void => {\n // Preserve overrides for series not currently rendered (other windows /\n // filters may surface different groupBy values).\n const next: Record<string, { color?: string }> = { ...config.series }\n for (const item of colorItems) delete next[item.key]\n for (const [key, color] of Object.entries(overrides)) next[key] = { color }\n update({ series: next })\n setColorsOpen(false)\n }\n\n // Adapter cannot do time-series — friendly message, no toolbar churn.\n const unsupported = data && data.supported === false\n\n return (\n <Card className=\"flex flex-col\">\n <CardHeader className=\"flex flex-row items-center justify-between gap-2 p-3 pb-2 space-y-0 sm:p-6 sm:pb-2\">\n <CardTitle className=\"flex min-w-0 items-center gap-2 text-sm font-medium pr-2\">\n <span className=\"truncate\">{config.title || t('chart:untitled')}</span>\n {delta && (\n <span\n title={t('dashboard:widget.previousPeriod')}\n className={`inline-flex shrink-0 items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-medium tabular-nums ${\n delta.direction === 'up'\n ? 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400'\n : delta.direction === 'down'\n ? 'bg-rose-500/10 text-rose-600 dark:text-rose-400'\n : 'bg-muted text-muted-foreground'\n }`}\n >\n {delta.direction === 'up' ? (\n <ArrowUp className=\"size-3\" />\n ) : delta.direction === 'down' ? (\n <ArrowDown className=\"size-3\" />\n ) : null}\n {Math.abs(delta.percent)}%\n </span>\n )}\n </CardTitle>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n onClick={onWidthToggle}\n aria-label={\n config.width === 'full'\n ? t('dashboard:widget.shrink')\n : t('dashboard:widget.expand')\n }\n >\n {config.width === 'full' ? (\n <Minimize2 className=\"size-3.5\" />\n ) : (\n <Maximize2 className=\"size-3.5\" />\n )}\n </Button>\n {data?.sql && (\n <Button\n variant={showSql ? 'secondary' : 'ghost'}\n size=\"icon\"\n className=\"size-7\"\n onClick={() => setShowSql((v) => !v)}\n aria-label={t('dashboard:widget.toggleSql')}\n >\n <Code className=\"size-3.5\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n onClick={() => refetch()}\n disabled={isFetching}\n aria-label={t('common:refresh')}\n >\n <RefreshCw className={`size-3.5 ${isFetching ? 'animate-spin' : ''}`} />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n aria-label={t('common:openMenu')}\n >\n <MoreHorizontal className=\"size-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={onEdit}>\n <Pencil className=\"size-4 mr-2\" />\n {t('chart:editChart')}\n </DropdownMenuItem>\n {!isKpi && (\n <DropdownMenuItem onClick={() => setColorsOpen(true)}>\n <Palette className=\"size-4 mr-2\" />\n {t('dashboard:widget.editColors')}\n </DropdownMenuItem>\n )}\n {onMove && (\n <DropdownMenuItem onClick={onMove}>\n <FolderSymlink className=\"size-4 mr-2\" />\n {t('chart:moveToGroup')}\n </DropdownMenuItem>\n )}\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={onDelete}\n className=\"text-destructive focus:text-destructive\"\n >\n <Trash2 className=\"size-4 mr-2\" />\n {t('chart:deleteChart')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </CardHeader>\n\n <CardContent className=\"flex-1 p-3 pt-0 space-y-3 sm:p-6 sm:pt-0\">\n {/* Toolbar — quick filters + step + range + window display, all in one\n row. Hidden for unsupported adapters because changing knobs would\n have no effect. Quick filters apply immediately on change. */}\n {!unsupported && (\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-muted-foreground\">\n {quickFilterPaths.length > 0 && resourceConfig &&\n quickFilterPaths.map((path) => {\n const prop = resourceConfig.properties.find((p) => p.path === path)\n if (!prop) return null\n return (\n <QuickFilterInput\n key={path}\n property={prop}\n placeholder={prop.label}\n value={config.filters[path] ?? ''}\n onChange={(v) => applyQuickFilter(path, v)}\n />\n )\n })}\n {!isKpi && (\n <Select\n value={config.step === 'all' ? 'day' : config.step}\n onValueChange={(v) => onStepChange(v as AggregationStep)}\n >\n <SelectTrigger\n className=\"h-8 px-2 text-xs w-auto\"\n aria-label={t('chart:step')}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {STEPS.map((s) => (\n <SelectItem key={s} value={s}>\n {t(`chart:step${cap(s)}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n <Select\n value={config.timeRange.preset}\n onValueChange={(v) => onPresetChange(v as TimeRangePreset)}\n >\n <SelectTrigger\n className=\"h-8 px-2 text-xs w-auto\"\n aria-label={t('dashboard:builder.range')}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PRESETS.map((p) => (\n <SelectItem key={p} value={p}>\n {t(`dashboard:range.${p}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {config.timeRange.preset === 'custom' ? (\n <>\n <DatePicker\n value={draftFrom}\n onChange={setDraftFrom}\n ariaLabel={t('common:from')}\n openCalendarLabel={t('common:openCalendar')}\n className=\"w-[130px]\"\n inputClassName=\"h-8 text-xs\"\n />\n <span className=\"text-muted-foreground\">—</span>\n <DatePicker\n value={draftTo}\n onChange={setDraftTo}\n ariaLabel={t('common:to')}\n openCalendarLabel={t('common:openCalendar')}\n className=\"w-[130px]\"\n inputClassName=\"h-8 text-xs\"\n />\n <Button\n size=\"sm\"\n className=\"h-8 px-3 shrink-0\"\n onClick={applyCustomRange}\n disabled={!draftFrom || !draftTo}\n aria-label={t('common:apply')}\n >\n <Check className=\"size-3.5 mr-1\" />\n {t('common:apply')}\n </Button>\n </>\n ) : (\n <span className=\"ml-auto tabular-nums\">\n {range.from} — {range.to}\n </span>\n )}\n </div>\n )}\n\n {/* Truncation warning — adapter capped the scan, so the chart reflects\n only a subset of the window. Hidden while loading / unsupported. */}\n {!unsupported && !isError && data?.truncated && (\n <div className=\"flex items-start gap-2 rounded-md border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-xs text-amber-700 dark:text-amber-400\">\n <AlertTriangle className=\"size-3.5 mt-0.5 shrink-0\" />\n <span>{t('dashboard:widget.truncatedWarning')}</span>\n </div>\n )}\n\n {/* Body */}\n {isLoading ? (\n <Skeleton className={`${heightClass} w-full rounded-md`} />\n ) : isError ? (\n <div\n className={`flex items-center justify-center text-sm text-muted-foreground ${heightClass}`}\n >\n {t('chart:loadError')}\n </div>\n ) : unsupported ? (\n <div\n className={`flex items-center justify-center text-center text-sm text-muted-foreground px-4 ${heightClass}`}\n >\n {t('dashboard:widget.unsupported')}\n </div>\n ) : isKpi ? (\n <KpiBody\n data={data}\n transform={config.transform}\n formatNumber={valueFormatter}\n labels={kpiLabels(t)}\n />\n ) : (\n <TimeSeriesChart\n series={chartSeries}\n height={320}\n visualisation={config.visualisation === 'kpi' ? undefined : config.visualisation}\n tickFormatter={makeTickFormatter(renderStep, locale)}\n labelFormatter={makeLabelFormatter(renderStep, locale)}\n valueFormatter={valueFormatter}\n axisValueFormatter={axisValueFormatter}\n labels={{\n noData: t('chart:noData'),\n showAll: t('dashboard:widget.showAll'),\n hideAll: t('dashboard:widget.hideAll'),\n }}\n />\n )}\n\n {/* Captured SQL — only when the user toggled and server returned it. */}\n {data?.sql && showSql && (\n <div className=\"relative\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute top-1 right-1 size-6\"\n onClick={() => {\n void navigator.clipboard.writeText(data.sql ?? '')\n setSqlCopied(true)\n setTimeout(() => setSqlCopied(false), 2000)\n }}\n aria-label={sqlCopied ? t('common:copied') : t('common:copy')}\n >\n {sqlCopied\n ? <Check className=\"size-3 text-green-500\" />\n : <Copy className=\"size-3\" />}\n </Button>\n <pre className=\"text-[11px] leading-snug bg-muted/50 border border-border rounded-md p-2 pr-8 overflow-x-auto whitespace-pre\">\n {data.sql}\n </pre>\n </div>\n )}\n </CardContent>\n\n {colorsOpen && (\n <ChartSeriesColorsDialog\n items={colorItems}\n onSave={saveSeriesColors}\n onClose={() => setColorsOpen(false)}\n />\n )}\n </Card>\n )\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────\n\nconst cap = (s: string): string => s.charAt(0).toUpperCase() + s.slice(1)\n\nconst QF_NONE = '__none__'\n\n/** Compact inline filter input — label is passed as placeholder so no\n * extra row is needed. Matches the `h-7 text-xs` sizing of toolbar controls. */\nfunction QuickFilterInput({\n property,\n placeholder,\n value,\n onChange,\n}: {\n property: PropertyJSON\n placeholder?: string\n value: string\n onChange(next: string): void\n}): React.ReactElement {\n const ph = placeholder ?? property.label\n if (property.reference) {\n return (\n <div className=\"w-36\">\n <ReferenceCombobox\n referenceResourceId={property.reference}\n value={value || null}\n onChange={(next) => onChange(next == null ? '' : String(next))}\n placeholder={ph}\n className=\"h-8 text-xs\"\n />\n </div>\n )\n }\n if (property.availableValues && property.availableValues.length > 0) {\n return (\n <Select\n value={value || QF_NONE}\n onValueChange={(v) => onChange(v === QF_NONE ? '' : v)}\n >\n <SelectTrigger className=\"h-8 px-2 text-xs w-36\">\n <SelectValue placeholder={ph} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={QF_NONE}>{ph}</SelectItem>\n {property.availableValues.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>{opt.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n }\n if (property.type === 'boolean') {\n return (\n <Select\n value={value || QF_NONE}\n onValueChange={(v) => onChange(v === QF_NONE ? '' : v)}\n >\n <SelectTrigger className=\"h-8 px-2 text-xs w-36\">\n <SelectValue placeholder={ph} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={QF_NONE}>{ph}</SelectItem>\n <SelectItem value=\"true\">true</SelectItem>\n <SelectItem value=\"false\">false</SelectItem>\n </SelectContent>\n </Select>\n )\n }\n const isNumeric =\n property.type === 'number' || property.type === 'float' || property.type === 'currency'\n return (\n <Input\n type={isNumeric ? 'number' : 'text'}\n className=\"h-8 px-2 text-xs w-36\"\n value={value}\n placeholder={ph}\n onChange={(e) => onChange(e.target.value)}\n />\n )\n}\n\n/**\n * Zero-fill every series across the resolved date range and re-tag each\n * with its display label (so legend shows \"Total\" / \"Other\" / actual\n * groupBy values rather than the wire-format internal keys).\n */\nfunction prepareSeries(\n series: ReadonlyArray<TimeSeriesSeries>,\n range: { from: string; to: string },\n step: AggregationStep,\n labelFor: (key: string) => string,\n): { key: string; label: string; points: { date: string; value: number }[] }[] {\n const filled = fillTimeSeries(\n series.map((s) => ({ key: s.key, points: s.points })),\n range.from,\n range.to,\n step as Exclude<AggregationStep, 'all'> | 'all',\n )\n return filled.map((s) => ({\n key: s.key,\n label: labelFor(s.key),\n points: [...s.points],\n }))\n}\n\ninterface KpiBodyProps {\n data: { series: ReadonlyArray<TimeSeriesSeries>; previous?: ReadonlyArray<TimeSeriesSeries> } | undefined\n transform: ReadonlyArray<ChartTransformStep>\n formatNumber: (n: number) => string\n labels: {\n noData: string\n deltaUp: string\n deltaDown: string\n deltaFlat: string\n previousPeriod: string\n }\n}\n\n/** KPI mode summarises the single-bucket response to one scalar. The value\n * transform applies to both windows so the delta stays consistent. */\nfunction KpiBody({ data, transform, formatNumber, labels }: KpiBodyProps): React.ReactElement {\n const raw = sumAll(data?.series)\n const rawPrev = sumAll(data?.previous)\n const value = raw == null ? raw : applyTransform(raw, transform)\n const prev = rawPrev == null ? rawPrev : applyTransform(rawPrev, transform)\n return (\n <KpiCard\n value={value}\n previousValue={prev}\n formatNumber={formatNumber}\n labels={labels}\n />\n )\n}\n\nfunction sumAll(series: ReadonlyArray<TimeSeriesSeries> | undefined): number | null {\n if (!series || series.length === 0) return null\n let total = 0\n for (const s of series) for (const p of s.points) total += p.value\n return total\n}\n\nfunction kpiLabels(t: (key: string) => string): {\n noData: string\n deltaUp: string\n deltaDown: string\n deltaFlat: string\n previousPeriod: string\n} {\n return {\n noData: t('chart:noData'),\n deltaUp: t('dashboard:widget.deltaUp'),\n deltaDown: t('dashboard:widget.deltaDown'),\n deltaFlat: t('dashboard:widget.deltaFlat'),\n previousPeriod: t('dashboard:widget.previousPeriod'),\n }\n}\n"],"mappings":"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"}
|
package/dist/standalone/assets/{chevrons-up-down-BHCs46XQ.js.map → chevrons-up-down-y29_Sm-3.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chevrons-up-down-
|
|
1
|
+
{"version":3,"file":"chevrons-up-down-y29_Sm-3.js","names":[],"sources":["../../../../../node_modules/.bun/lucide-react@1.31.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/chevrons-up-down.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m7 15 5 5 5-5\", key: \"1hf1tw\" }],\n [\"path\", { d: \"m7 9 5-5 5 5\", key: \"sgt6xg\" }]\n];\nconst ChevronsUpDown = createLucideIcon(\"chevrons-up-down\", __iconNode);\n\nexport { __iconNode, ChevronsUpDown as default };\n//# sourceMappingURL=chevrons-up-down.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAaA,IAAM,EAAiB,EAAiB,mBAAoB,CAH1D,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAS,CAAC,EAC9C,CAAC,OAAQ,CAAE,EAAG,eAAgB,IAAK,QAAS,CAAC,CAEa,CAAU"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./createLucideIcon-
|
|
2
|
-
//# sourceMappingURL=circle-alert-
|
|
1
|
+
import{t as e}from"./createLucideIcon-QE2kj6ru.js";var t=e(`circle-alert`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`12`,x2:`12`,y1:`8`,y2:`12`,key:`1pkeuh`}],[`line`,{x1:`12`,x2:`12.01`,y1:`16`,y2:`16`,key:`4dfq90`}]]);export{t};
|
|
2
|
+
//# sourceMappingURL=circle-alert-D1sKnXtO.js.map
|
package/dist/standalone/assets/{circle-alert-0EyKeic4.js.map → circle-alert-D1sKnXtO.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circle-alert-
|
|
1
|
+
{"version":3,"file":"circle-alert-D1sKnXtO.js","names":[],"sources":["../../../../../node_modules/.bun/lucide-react@1.31.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/circle-alert.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n];\nconst CircleAlert = createLucideIcon(\"circle-alert\", __iconNode);\n\nexport { __iconNode, CircleAlert as default };\n//# sourceMappingURL=circle-alert.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAcA,IAAM,EAAc,EAAiB,eAAgB,CAJnD,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,QAAS,CAAC,EACzD,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,IAAK,GAAI,KAAM,IAAK,QAAS,CAAC,EACjE,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,QAAS,GAAI,KAAM,GAAI,KAAM,IAAK,QAAS,CAAC,CAElB,CAAU"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./createLucideIcon-
|
|
2
|
-
//# sourceMappingURL=clock-
|
|
1
|
+
import{t as e}from"./createLucideIcon-QE2kj6ru.js";var t=e(`arrow-right`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]),n=e(`clock`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 6v6l4 2`,key:`mmk7yg`}]]);export{t as n,n as t};
|
|
2
|
+
//# sourceMappingURL=clock-B9qbSr_k.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clock-
|
|
1
|
+
{"version":3,"file":"clock-B9qbSr_k.js","names":["__iconNode"],"sources":["../../../../../node_modules/.bun/lucide-react@1.31.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/arrow-right.mjs","../../../../../node_modules/.bun/lucide-react@1.31.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/clock.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"m12 5 7 7-7 7\", key: \"xquz4c\" }]\n];\nconst ArrowRight = createLucideIcon(\"arrow-right\", __iconNode);\n\nexport { __iconNode, ArrowRight as default };\n//# sourceMappingURL=arrow-right.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 6v6l4 2\", key: \"mmk7yg\" }]\n];\nconst Clock = createLucideIcon(\"clock\", __iconNode);\n\nexport { __iconNode, Clock as default };\n//# sourceMappingURL=clock.mjs.map\n"],"x_google_ignoreList":[0,1],"mappings":"mDAaA,IAAM,EAAa,EAAiB,cAAeA,CAHjD,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAS,CAAC,CAEGA,CAAU,ECAvD,EAAQ,EAAiB,QAAS,CAHtC,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,QAAS,CAAC,EACzD,CAAC,OAAQ,CAAE,EAAG,cAAe,IAAK,QAAS,CAAC,CAEN,CAAU"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,n as t}from"./createLucideIcon-QE2kj6ru.js";import{C as n,l as r,w as i}from"./floating-layer-BcTp2AMB.js";import{it as a,rt as o}from"./hooks-BiOfAnEq.js";import{B as s,V as c,ot as l}from"./index-CASCzvYu.js";var u=e(t(),1),d=1,f=.9,p=.8,m=.17,h=.1,g=.999,_=.9999,v=.99,y=/[\\\/_+.#"@\[\(\{&]/,b=/[\\\/_+.#"@\[\(\{&]/g,x=/[\s-]/,S=/[\s-]/g;function C(e,t,n,r,i,a,o){if(a===t.length)return i===e.length?d:v;var s=`${i},${a}`;if(o[s]!==void 0)return o[s];for(var c=r.charAt(a),l=n.indexOf(c,i),u=0,w,T,E,D;l>=0;)w=C(e,t,n,r,l+1,a+1,o),w>u&&(l===i?w*=d:y.test(e.charAt(l-1))?(w*=p,E=e.slice(i,l-1).match(b),E&&i>0&&(w*=g**+E.length)):x.test(e.charAt(l-1))?(w*=f,D=e.slice(i,l-1).match(S),D&&i>0&&(w*=g**+D.length)):(w*=m,i>0&&(w*=g**+(l-i))),e.charAt(l)!==t.charAt(a)&&(w*=_)),(w<h&&n.charAt(l-1)===r.charAt(a+1)||r.charAt(a+1)===r.charAt(a)&&n.charAt(l-1)!==r.charAt(a))&&(T=C(e,t,n,r,l+1,a+2,o),T*h>w&&(w=T*h)),w>u&&(u=w),l=n.indexOf(c,l+1);return o[s]=u,u}function w(e){return e.toLowerCase().replace(S,` `)}function T(e,t,n){return e=n&&n.length>0?`${e+` `+n.join(` `)}`:e,C(e,t,w(e),w(t),0,0,{})}typeof window<`u`&&window.document&&window.document.createElement;function E(e,t,{checkForDefaultPrevented:n=!0}={}){return function(r){if(e?.(r),n===!1||!r||!r.defaultPrevented)return t?.(r)}}function D(e,t){if(typeof e==`function`)return e(t);e!=null&&(e.current=t)}function O(...e){return t=>{let n=!1,r=e.map(e=>{let r=D(e,t);return!n&&typeof r==`function`&&(n=!0),r});if(n)return()=>{for(let t=0;t<r.length;t++){let n=r[t];typeof n==`function`?n():D(e[t],null)}}}}function k(...e){return u.useCallback(O(...e),e)}var A=n();function j(e,t=[]){let n=[];function r(t,r){let i=u.createContext(r);i.displayName=t+`Context`;let a=n.length;n=[...n,r];let o=t=>{let{scope:n,children:r,...o}=t,s=n?.[e]?.[a]||i,c=u.useMemo(()=>o,Object.values(o));return(0,A.jsx)(s.Provider,{value:c,children:r})};o.displayName=t+`Provider`;function s(n,o,s={}){let{optional:c=!1}=s,l=o?.[e]?.[a]||i,d=u.useContext(l);if(d)return d;if(r!==void 0)return r;if(!c)throw Error(`\`${n}\` must be used within \`${t}\``)}return[o,s]}let i=()=>{let t=n.map(e=>u.createContext(e));return function(n){let r=n?.[e]||t;return u.useMemo(()=>({[`__scope${e}`]:{...n,[e]:r}}),[n,r])}};return i.scopeName=e,[r,M(i,...t)]}function M(...e){let t=e[0];if(e.length===1)return t;let n=()=>{let n=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return function(e){let r=n.reduce((t,{useScope:n,scopeName:r})=>{let i=n(e)[`__scope${r}`];return{...t,...i}},{});return u.useMemo(()=>({[`__scope${t.scopeName}`]:r}),[r])}};return n.scopeName=t.scopeName,n}var N=globalThis?.document?u.useLayoutEffect:()=>{},P=u.useId||(()=>void 0),ee=0;function F(e){let[t,n]=u.useState(P());return N(()=>{e||n(e=>e??String(ee++))},[e]),e||(t?`radix-${t}`:``)}var te=u.useInsertionEffect||N;function ne({prop:e,defaultProp:t,onChange:n=()=>{},caller:r}){let[i,a,o]=re({defaultProp:t,onChange:n}),s=e!==void 0,c=s?e:i;{let t=u.useRef(e!==void 0);u.useEffect(()=>{let e=t.current;e!==s&&console.warn(`${r} is changing from ${e?`controlled`:`uncontrolled`} to ${s?`controlled`:`uncontrolled`}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),t.current=s},[s,r])}return[c,u.useCallback(t=>{if(s){let n=ie(t)?t(e):t;n!==e&&o.current?.(n)}else a(t)},[s,e,a,o])]}function re({defaultProp:e,onChange:t}){let[n,r]=u.useState(e),i=u.useRef(n),a=u.useRef(t);return te(()=>{a.current=t},[t]),u.useEffect(()=>{i.current!==n&&(a.current?.(n),i.current=n)},[n,i]),[n,r,a]}function ie(e){return typeof e==`function`}var ae=e(i(),1);function oe(e){let t=u.forwardRef((t,n)=>{let{children:r,...i}=t,a=null,o=!1,s=[];pe(r)&&typeof I==`function`&&(r=I(r._payload)),u.Children.forEach(r,e=>{if(de(e)){o=!0;let t=e,n=`child`in t.props?t.props.child:t.props.children;pe(n)&&typeof I==`function`&&(n=I(n._payload)),a=ce(t,n),s.push(a?.props?.children)}else s.push(e)}),a?a=u.cloneElement(a,void 0,s):!o&&u.Children.count(r)===1&&u.isValidElement(r)&&(a=r);let c=a?ue(a):void 0,l=k(n,c);if(!a){if(r||r===0)throw Error(o?ge(e):he(e));return r}let d=le(i,a.props??{});return a.type!==u.Fragment&&(d.ref=n?l:c),u.cloneElement(a,d)});return t.displayName=`${e}.Slot`,t}var se=Symbol.for(`radix.slottable`),ce=(e,t)=>{if(`child`in e.props){let t=e.props.child;return u.isValidElement(t)?u.cloneElement(t,void 0,e.props.children(t.props.children)):null}return u.isValidElement(t)?t:null};function le(e,t){let n={...t};for(let r in t){let i=e[r],a=t[r];/^on[A-Z]/.test(r)?i&&a?n[r]=(...e)=>{let t=a(...e);return i(...e),t}:i&&(n[r]=i):r===`style`?n[r]={...i,...a}:r===`className`&&(n[r]=[i,a].filter(Boolean).join(` `))}return{...e,...n}}function ue(e){let t=Object.getOwnPropertyDescriptor(e.props,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}function de(e){return u.isValidElement(e)&&typeof e.type==`function`&&`__radixId`in e.type&&e.type.__radixId===se}var fe=Symbol.for(`react.lazy`);function pe(e){return typeof e==`object`&&!!e&&`$$typeof`in e&&e.$$typeof===fe&&`_payload`in e&&me(e._payload)}function me(e){return typeof e==`object`&&!!e&&`then`in e}var he=e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,ge=e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,I=u.use,L=[`a`,`button`,`div`,`form`,`h2`,`h3`,`img`,`input`,`label`,`li`,`nav`,`ol`,`p`,`select`,`span`,`svg`,`ul`].reduce((e,t)=>{let n=oe(`Primitive.${t}`),r=u.forwardRef((e,r)=>{let{asChild:i,...a}=e,o=i?n:t;return typeof window<`u`&&(window[Symbol.for(`radix-ui`)]=!0),(0,A.jsx)(o,{...a,ref:r})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function _e(e,t){e&&ae.flushSync(()=>e.dispatchEvent(t))}function R(e){let t=u.useRef(e);return u.useEffect(()=>{t.current=e}),u.useMemo(()=>((...e)=>t.current?.(...e)),[])}var ve=`DismissableLayer`,ye=`dismissableLayer.update`,be=`dismissableLayer.pointerDownOutside`,xe=`dismissableLayer.focusOutside`,Se,Ce=u.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),we=u.forwardRef((e,t)=>{let{disableOutsidePointerEvents:n=!1,deferPointerDownOutside:r=!1,onEscapeKeyDown:i,onPointerDownOutside:a,onFocusOutside:o,onInteractOutside:s,onDismiss:c,...l}=e,d=u.useContext(Ce),[f,p]=u.useState(null),m=f?.ownerDocument??globalThis?.document,[,h]=u.useState({}),g=k(t,p),_=Array.from(d.layers),[v]=[...d.layersWithOutsidePointerEventsDisabled].slice(-1),y=v?_.indexOf(v):-1,b=f?_.indexOf(f):-1,x=d.layersWithOutsidePointerEventsDisabled.size>0,S=b>=y,C=u.useRef(!1),w=ke(e=>{a?.(e),s?.(e),e.defaultPrevented||c?.()},{ownerDocument:m,deferPointerDownOutside:r,isDeferredPointerDownOutsideRef:C,dismissableSurfaces:d.dismissableSurfaces,shouldHandlePointerDownOutside:u.useCallback(e=>{if(!(e instanceof Node))return!1;let t=[...d.branches].some(t=>t.contains(e));return S&&!t},[d.branches,S])}),T=Ae(e=>{if(r&&C.current)return;let t=e.target;[...d.branches].some(e=>e.contains(t))||(o?.(e),s?.(e),e.defaultPrevented||c?.())},m),D=f?b===_.length-1:!1,O=R(e=>{e.key===`Escape`&&(i?.(e),!e.defaultPrevented&&c&&(e.preventDefault(),c()))});return u.useEffect(()=>{if(D)return m.addEventListener(`keydown`,O,{capture:!0}),()=>m.removeEventListener(`keydown`,O,{capture:!0})},[m,D,O]),u.useEffect(()=>{if(f)return n&&(d.layersWithOutsidePointerEventsDisabled.size===0&&(Se=m.body.style.pointerEvents,m.body.style.pointerEvents=`none`),d.layersWithOutsidePointerEventsDisabled.add(f)),d.layers.add(f),je(),()=>{n&&(d.layersWithOutsidePointerEventsDisabled.delete(f),d.layersWithOutsidePointerEventsDisabled.size===0&&(m.body.style.pointerEvents=Se))}},[f,m,n,d]),u.useEffect(()=>()=>{f&&(d.layers.delete(f),d.layersWithOutsidePointerEventsDisabled.delete(f),je())},[f,d]),u.useEffect(()=>{let e=()=>h({});return document.addEventListener(ye,e),()=>document.removeEventListener(ye,e)},[]),(0,A.jsx)(L.div,{...l,ref:g,style:{pointerEvents:x?S?`auto`:`none`:void 0,...e.style},onFocusCapture:E(e.onFocusCapture,T.onFocusCapture),onBlurCapture:E(e.onBlurCapture,T.onBlurCapture),onPointerDownCapture:E(e.onPointerDownCapture,w.onPointerDownCapture)})});we.displayName=ve;var Te=`DismissableLayerBranch`,Ee=u.forwardRef((e,t)=>{let n=u.useContext(Ce),r=u.useRef(null),i=k(t,r);return u.useEffect(()=>{let e=r.current;if(e)return n.branches.add(e),()=>{n.branches.delete(e)}},[n.branches]),(0,A.jsx)(L.div,{...e,ref:i})});Ee.displayName=Te;function De(){let e=u.useContext(Ce),[t,n]=u.useState(null);return u.useEffect(()=>{if(t)return e.dismissableSurfaces.add(t),()=>{e.dismissableSurfaces.delete(t)}},[t,e.dismissableSurfaces]),n}var Oe=()=>!0;function ke(e,t){let{ownerDocument:n=globalThis?.document,deferPointerDownOutside:r=!1,isDeferredPointerDownOutsideRef:i,dismissableSurfaces:a,shouldHandlePointerDownOutside:o=Oe}=t,s=R(e),c=u.useRef(!1),l=u.useRef(!1),d=u.useRef(new Map),f=u.useRef(()=>{});return u.useEffect(()=>{function e(){l.current=!1,i.current=!1,d.current.clear()}function t(){return Array.from(d.current.values()).some(Boolean)}function u(e){if(!l.current)return;let t=e.target;t instanceof Node&&[...a].some(e=>e.contains(t))||d.current.set(e.type,!0),e.type===`click`&&window.setTimeout(()=>{l.current&&f.current()},0)}function p(e){l.current&&d.current.set(e.type,!1)}let m=a=>{if(a.target&&!c.current){let u=function(){n.removeEventListener(`click`,f.current);let r=t();e(),r||Me(be,s,p,{discrete:!0})};if(!o(a.target)){n.removeEventListener(`click`,f.current),e(),c.current=!1;return}let p={originalEvent:a};l.current=!0,i.current=r&&a.button===0,d.current.clear(),!r||a.button!==0?u():(n.removeEventListener(`click`,f.current),f.current=u,n.addEventListener(`click`,f.current,{once:!0}))}else n.removeEventListener(`click`,f.current),e();c.current=!1},h=[`pointerup`,`mousedown`,`mouseup`,`touchstart`,`touchend`,`click`];for(let e of h)n.addEventListener(e,u,!0),n.addEventListener(e,p);let g=window.setTimeout(()=>{n.addEventListener(`pointerdown`,m)},0);return()=>{window.clearTimeout(g),n.removeEventListener(`pointerdown`,m),n.removeEventListener(`click`,f.current);for(let e of h)n.removeEventListener(e,u,!0),n.removeEventListener(e,p)}},[n,s,r,i,a,o]),{onPointerDownCapture:()=>c.current=!0}}function Ae(e,t=globalThis?.document){let n=R(e),r=u.useRef(!1);return u.useEffect(()=>{let e=e=>{e.target&&!r.current&&Me(xe,n,{originalEvent:e},{discrete:!1})};return t.addEventListener(`focusin`,e),()=>t.removeEventListener(`focusin`,e)},[t,n]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function je(){let e=new CustomEvent(ye);document.dispatchEvent(e)}function Me(e,t,n,{discrete:r}){let i=n.originalEvent.target,a=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&i.addEventListener(e,t,{once:!0}),r?_e(i,a):i.dispatchEvent(a)}var Ne=`focusScope.autoFocusOnMount`,Pe=`focusScope.autoFocusOnUnmount`,Fe={bubbles:!1,cancelable:!0},Ie=`FocusScope`,Le=u.forwardRef((e,t)=>{let{loop:n=!1,trapped:r=!1,onMountAutoFocus:i,onUnmountAutoFocus:a,...o}=e,[s,c]=u.useState(null),l=R(i),d=R(a),f=u.useRef(null),p=k(t,c),m=u.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;u.useEffect(()=>{if(r){let e=function(e){if(m.paused||!s)return;let t=e.target;s.contains(t)?f.current=t:z(f.current,{select:!0})},t=function(e){if(m.paused||!s)return;let t=e.relatedTarget;t!==null&&(s.contains(t)||z(f.current,{select:!0}))},n=function(e){if(document.activeElement===document.body)for(let t of e)t.removedNodes.length>0&&z(s)};document.addEventListener(`focusin`,e),document.addEventListener(`focusout`,t);let r=new MutationObserver(n);return s&&r.observe(s,{childList:!0,subtree:!0}),()=>{document.removeEventListener(`focusin`,e),document.removeEventListener(`focusout`,t),r.disconnect()}}},[r,s,m.paused]),u.useEffect(()=>{if(s){We.add(m);let e=document.activeElement;if(!s.contains(e)){let t=new CustomEvent(Ne,Fe);s.addEventListener(Ne,l),s.dispatchEvent(t),t.defaultPrevented||(Re(qe(Be(s)),{select:!0}),document.activeElement===e&&z(s))}return()=>{s.removeEventListener(Ne,l),setTimeout(()=>{let t=new CustomEvent(Pe,Fe);s.addEventListener(Pe,d),s.dispatchEvent(t),t.defaultPrevented||z(e??document.body,{select:!0}),s.removeEventListener(Pe,d),We.remove(m)},0)}}},[s,l,d,m]);let h=u.useCallback(e=>{if(!n&&!r||m.paused)return;let t=e.key===`Tab`&&!e.altKey&&!e.ctrlKey&&!e.metaKey,i=document.activeElement;if(t&&i){let t=e.currentTarget,[r,a]=ze(t);r&&a?!e.shiftKey&&i===a?(e.preventDefault(),n&&z(r,{select:!0})):e.shiftKey&&i===r&&(e.preventDefault(),n&&z(a,{select:!0})):i===t&&e.preventDefault()}},[n,r,m.paused]);return(0,A.jsx)(L.div,{tabIndex:-1,...o,ref:p,onKeyDown:h})});Le.displayName=Ie;function Re(e,{select:t=!1}={}){let n=document.activeElement;for(let r of e)if(z(r,{select:t}),document.activeElement!==n)return}function ze(e){let t=Be(e);return[Ve(t,e),Ve(t.reverse(),e)]}function Be(e){let t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:e=>{let t=e.tagName===`INPUT`&&e.type===`hidden`;return e.disabled||e.hidden||t?NodeFilter.FILTER_SKIP:e.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function Ve(e,t){let n=typeof t.checkVisibility==`function`&&t.checkVisibility({checkVisibilityCSS:!0});for(let r of e)if(!(n?!r.checkVisibility({checkVisibilityCSS:!0}):He(r,{upTo:t})))return r}function He(e,{upTo:t}){if(getComputedStyle(e).visibility===`hidden`)return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display===`none`)return!0;e=e.parentElement}return!1}function Ue(e){return e instanceof HTMLInputElement&&`select`in e}function z(e,{select:t=!1}={}){if(e&&e.focus){let n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&Ue(e)&&t&&e.select()}}var We=Ge();function Ge(){let e=[];return{add(t){let n=e[0];t!==n&&n?.pause(),e=Ke(e,t),e.unshift(t)},remove(t){e=Ke(e,t),e[0]?.resume()}}}function Ke(e,t){let n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function qe(e){return e.filter(e=>e.tagName!==`A`)}var Je=`Portal`,Ye=u.forwardRef((e,t)=>{let{container:n,...r}=e,[i,a]=u.useState(!1);N(()=>a(!0),[]);let o=n||i&&globalThis?.document?.body;return o?ae.createPortal((0,A.jsx)(L.div,{...r,ref:t}),o):null});Ye.displayName=Je;function Xe(e,t){return u.useReducer((e,n)=>t[e][n]??e,e)}var B=e=>{let{present:t,children:n}=e,r=Ze(t),i=typeof n==`function`?n({present:r.isPresent}):u.Children.only(n),a=$e(r.ref,et(i));return typeof n==`function`||r.isPresent?u.cloneElement(i,{ref:a}):null};B.displayName=`Presence`;function Ze(e){let[t,n]=u.useState(),r=u.useRef(null),i=u.useRef(e),a=u.useRef(`none`),o=u.useRef(void 0),[s,c]=Xe(e?`mounted`:`unmounted`,{mounted:{UNMOUNT:`unmounted`,ANIMATION_OUT:`unmountSuspended`},unmountSuspended:{MOUNT:`mounted`,ANIMATION_END:`unmounted`},unmounted:{MOUNT:`mounted`}});return u.useEffect(()=>{s===`mounted`?(a.current=o.current??V(r.current),o.current=void 0):a.current=`none`},[s]),N(()=>{let t=r.current,n=i.current;if(n!==e){let r=a.current,s=V(t);e?(o.current=s,c(`MOUNT`)):s===`none`||t?.display===`none`?c(`UNMOUNT`):c(n&&r!==s?`ANIMATION_OUT`:`UNMOUNT`),i.current=e}},[e,c]),N(()=>{if(t){let e,n=t.ownerDocument.defaultView??window,o=a=>{let o=V(r.current).includes(CSS.escape(a.animationName));if(a.target===t&&o&&(c(`ANIMATION_END`),!i.current)){let r=t.style.animationFillMode;t.style.animationFillMode=`forwards`,e=n.setTimeout(()=>{t.style.animationFillMode===`forwards`&&(t.style.animationFillMode=r)})}},s=e=>{e.target===t&&(a.current=V(r.current))};return t.addEventListener(`animationstart`,s),t.addEventListener(`animationcancel`,o),t.addEventListener(`animationend`,o),()=>{n.clearTimeout(e),t.removeEventListener(`animationstart`,s),t.removeEventListener(`animationcancel`,o),t.removeEventListener(`animationend`,o)}}c(`ANIMATION_END`)},[t,c]),{isPresent:[`mounted`,`unmountSuspended`].includes(s),ref:u.useCallback(e=>{if(e){let t=getComputedStyle(e);r.current=t,o.current=V(t)}else r.current=null;n(e)},[])}}function Qe(e,t){if(typeof e==`function`)return e(t);e!=null&&(e.current=t)}function $e(...e){let t=u.useRef(e);return t.current=e,u.useCallback(e=>{let n=t.current,r=!1,i=n.map(t=>{let n=Qe(t,e);return!r&&typeof n==`function`&&(r=!0),n});if(r)return()=>{for(let e=0;e<i.length;e++){let t=i[e];typeof t==`function`?t():Qe(n[e],null)}}},[])}function V(e){return e?.animationName||`none`}function et(e){let t=Object.getOwnPropertyDescriptor(e.props,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var H=0,U=null;function tt(){u.useEffect(()=>{U||={start:nt(),end:nt()};let{start:e,end:t}=U;return document.body.firstElementChild!==e&&document.body.insertAdjacentElement(`afterbegin`,e),document.body.lastElementChild!==t&&document.body.insertAdjacentElement(`beforeend`,t),H++,()=>{H===1&&(U?.start.remove(),U?.end.remove(),U=null),H=Math.max(0,H-1)}},[])}function nt(){let e=document.createElement(`span`);return e.setAttribute(`data-radix-focus-guard`,``),e.tabIndex=0,e.style.outline=`none`,e.style.opacity=`0`,e.style.position=`fixed`,e.style.pointerEvents=`none`,e}var rt=`Dialog`,[it,at]=j(rt),[ot,W]=it(rt),st=e=>{let{__scopeDialog:t,children:n,open:r,defaultOpen:i,onOpenChange:a,modal:o=!0}=e,s=u.useRef(null),c=u.useRef(null),[l,d]=ne({prop:r,defaultProp:i??!1,onChange:a,caller:rt});return(0,A.jsx)(ot,{scope:t,triggerRef:s,contentRef:c,contentId:F(),titleId:F(),descriptionId:F(),open:l,onOpenChange:d,onOpenToggle:u.useCallback(()=>d(e=>!e),[d]),modal:o,children:n})};st.displayName=rt;var ct=`DialogTrigger`,lt=u.forwardRef((e,t)=>{let{__scopeDialog:n,...r}=e,i=W(ct,n),a=k(t,i.triggerRef);return(0,A.jsx)(L.button,{type:`button`,"aria-haspopup":`dialog`,"aria-expanded":i.open,"aria-controls":i.open?i.contentId:void 0,"data-state":Ot(i.open),...r,ref:a,onClick:E(e.onClick,i.onOpenToggle)})});lt.displayName=ct;var ut=`DialogPortal`,[dt,ft]=it(ut,{forceMount:void 0}),pt=e=>{let{__scopeDialog:t,forceMount:n,children:r,container:i}=e,a=W(ut,t);return(0,A.jsx)(dt,{scope:t,forceMount:n,children:u.Children.map(r,e=>(0,A.jsx)(B,{present:n||a.open,children:(0,A.jsx)(Ye,{asChild:!0,container:i,children:e})}))})};pt.displayName=ut;var mt=`DialogOverlay`,ht=u.forwardRef((e,t)=>{let n=ft(mt,e.__scopeDialog),{forceMount:r=n.forceMount,...i}=e,a=W(mt,e.__scopeDialog);return a.modal?(0,A.jsx)(B,{present:r||a.open,children:(0,A.jsx)(_t,{...i,ref:t})}):null});ht.displayName=mt;var gt=oe(`DialogOverlay.RemoveScroll`),_t=u.forwardRef((e,t)=>{let{__scopeDialog:n,...r}=e,i=W(mt,n),a=k(t,De());return(0,A.jsx)(o,{as:gt,allowPinchZoom:!0,shards:[i.contentRef],children:(0,A.jsx)(L.div,{"data-state":Ot(i.open),...r,ref:a,style:{pointerEvents:`auto`,...r.style}})})}),G=`DialogContent`,vt=u.forwardRef((e,t)=>{let n=ft(G,e.__scopeDialog),{forceMount:r=n.forceMount,...i}=e,a=W(G,e.__scopeDialog);return(0,A.jsx)(B,{present:r||a.open,children:a.modal?(0,A.jsx)(yt,{...i,ref:t}):(0,A.jsx)(bt,{...i,ref:t})})});vt.displayName=G;var yt=u.forwardRef((e,t)=>{let n=W(G,e.__scopeDialog),r=u.useRef(null),i=k(t,n.contentRef,r);return u.useEffect(()=>{let e=r.current;if(e)return a(e)},[]),(0,A.jsx)(xt,{...e,ref:i,trapFocus:n.open,disableOutsidePointerEvents:n.open,onCloseAutoFocus:E(e.onCloseAutoFocus,e=>{e.preventDefault(),n.triggerRef.current?.focus()}),onPointerDownOutside:E(e.onPointerDownOutside,e=>{let t=e.detail.originalEvent,n=t.button===0&&t.ctrlKey===!0;(t.button===2||n)&&e.preventDefault()}),onFocusOutside:E(e.onFocusOutside,e=>e.preventDefault())})}),bt=u.forwardRef((e,t)=>{let n=W(G,e.__scopeDialog),r=u.useRef(!1),i=u.useRef(!1);return(0,A.jsx)(xt,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:t=>{e.onCloseAutoFocus?.(t),t.defaultPrevented||(r.current||n.triggerRef.current?.focus(),t.preventDefault()),r.current=!1,i.current=!1},onInteractOutside:t=>{e.onInteractOutside?.(t),t.defaultPrevented||(r.current=!0,t.detail.originalEvent.type===`pointerdown`&&(i.current=!0));let a=t.target;n.triggerRef.current?.contains(a)&&t.preventDefault(),t.detail.originalEvent.type===`focusin`&&i.current&&t.preventDefault()}})}),xt=u.forwardRef((e,t)=>{let{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:i,onCloseAutoFocus:a,...o}=e,s=W(G,n);return tt(),(0,A.jsx)(A.Fragment,{children:(0,A.jsx)(Le,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:i,onUnmountAutoFocus:a,children:(0,A.jsx)(we,{role:`dialog`,id:s.contentId,"aria-describedby":s.descriptionId,"aria-labelledby":s.titleId,"data-state":Ot(s.open),...o,ref:t,deferPointerDownOutside:!0,onDismiss:()=>s.onOpenChange(!1)})})})}),St=`DialogTitle`,Ct=u.forwardRef((e,t)=>{let{__scopeDialog:n,...r}=e,i=W(St,n);return(0,A.jsx)(L.h2,{id:i.titleId,...r,ref:t})});Ct.displayName=St;var wt=`DialogDescription`,Tt=u.forwardRef((e,t)=>{let{__scopeDialog:n,...r}=e,i=W(wt,n);return(0,A.jsx)(L.p,{id:i.descriptionId,...r,ref:t})});Tt.displayName=wt;var Et=`DialogClose`,Dt=u.forwardRef((e,t)=>{let{__scopeDialog:n,...r}=e,i=W(Et,n);return(0,A.jsx)(L.button,{type:`button`,...r,ref:t,onClick:E(e.onClick,()=>i.onOpenChange(!1))})});Dt.displayName=Et;function Ot(e){return e?`open`:`closed`}var K=`[cmdk-group=""]`,kt=`[cmdk-group-items=""]`,At=`[cmdk-group-heading=""]`,jt=`[cmdk-item=""]`,Mt=`${jt}:not([aria-disabled="true"])`,Nt=`cmdk-item-select`,q=`data-value`,Pt=(e,t,n)=>T(e,t,n),Ft=u.createContext(void 0),J=()=>u.useContext(Ft),It=u.createContext(void 0),Lt=()=>u.useContext(It),Rt=u.createContext(void 0),zt=u.forwardRef((e,t)=>{let n=Z(()=>({search:``,value:e.value??e.defaultValue??``,selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}})),r=Z(()=>new Set),i=Z(()=>new Map),a=Z(()=>new Map),o=Z(()=>new Set),s=Xt(e),{label:c,children:l,value:d,onValueChange:f,filter:p,shouldFilter:m,loop:h,disablePointerSelection:g=!1,vimBindings:_=!0,...v}=e,y=F(),b=F(),x=F(),S=u.useRef(null),C=Qt();X(()=>{if(d!==void 0){let e=d.trim();n.current.value=e,w.emit()}},[d]),X(()=>{C(6,A)},[]);let w=u.useMemo(()=>({subscribe:e=>(o.current.add(e),()=>o.current.delete(e)),snapshot:()=>n.current,setState:(e,t,r)=>{var i,a,o;if(!Object.is(n.current[e],t)){if(n.current[e]=t,e===`search`)k(),D(),C(1,O);else if(e===`value`){if(document.activeElement.hasAttribute(`cmdk-input`)||document.activeElement.hasAttribute(`cmdk-root`)){let e=document.getElementById(x);e?e.focus():(i=document.getElementById(y))==null||i.focus()}if(C(7,()=>{n.current.selectedItemId=j()?.id,w.emit()}),r||C(5,A),s.current?.value!==void 0){let e=t??``;(o=(a=s.current).onValueChange)==null||o.call(a,e);return}}w.emit()}},emit:()=>{o.current.forEach(e=>e())}}),[]),T=u.useMemo(()=>({value:(e,t,r)=>{t!==a.current.get(e)?.value&&(a.current.set(e,{value:t,keywords:r}),n.current.filtered.items.set(e,E(t,r)),C(2,()=>{D(),w.emit()}))},item:(e,t)=>(r.current.add(e),t&&(i.current.has(t)?i.current.get(t).add(e):i.current.set(t,new Set([e]))),C(3,()=>{k(),D(),n.current.value||O(),w.emit()}),()=>{a.current.delete(e),r.current.delete(e),n.current.filtered.items.delete(e);let t=j();C(4,()=>{k(),t?.getAttribute(`id`)===e&&O(),w.emit()})}),group:e=>(i.current.has(e)||i.current.set(e,new Set),()=>{a.current.delete(e),i.current.delete(e)}),filter:()=>s.current.shouldFilter,label:c||e[`aria-label`],getDisablePointerSelection:()=>s.current.disablePointerSelection,listId:y,inputId:x,labelId:b,listInnerRef:S}),[]);function E(e,t){let r=s.current?.filter??Pt;return e?r(e,n.current.search,t):0}function D(){if(!n.current.search||s.current.shouldFilter===!1)return;let e=n.current.filtered.items,t=[];n.current.filtered.groups.forEach(n=>{let r=i.current.get(n),a=0;r.forEach(t=>{let n=e.get(t);a=Math.max(n,a)}),t.push([n,a])});let r=S.current;M().sort((t,n)=>{let r=t.getAttribute(`id`),i=n.getAttribute(`id`);return(e.get(i)??0)-(e.get(r)??0)}).forEach(e=>{let t=e.closest(kt);t?t.appendChild(e.parentElement===t?e:e.closest(`${kt} > *`)):r.appendChild(e.parentElement===r?e:e.closest(`${kt} > *`))}),t.sort((e,t)=>t[1]-e[1]).forEach(e=>{let t=S.current?.querySelector(`${K}[${q}="${encodeURIComponent(e[0])}"]`);t?.parentElement.appendChild(t)})}function O(){let e=M().find(e=>e.getAttribute(`aria-disabled`)!==`true`)?.getAttribute(q);w.setState(`value`,e||void 0)}function k(){if(!n.current.search||s.current.shouldFilter===!1){n.current.filtered.count=r.current.size;return}n.current.filtered.groups=new Set;let e=0;for(let t of r.current){let r=E(a.current.get(t)?.value??``,a.current.get(t)?.keywords??[]);n.current.filtered.items.set(t,r),r>0&&e++}for(let[e,t]of i.current)for(let r of t)if(n.current.filtered.items.get(r)>0){n.current.filtered.groups.add(e);break}n.current.filtered.count=e}function A(){var e;let t=j();t&&(t.parentElement?.firstChild===t&&((e=t.closest(K)?.querySelector(At))==null||e.scrollIntoView({block:`nearest`})),t.scrollIntoView({block:`nearest`}))}function j(){return S.current?.querySelector(`${jt}[aria-selected="true"]`)}function M(){return Array.from(S.current?.querySelectorAll(Mt)||[])}function N(e){let t=M()[e];t&&w.setState(`value`,t.getAttribute(q))}function P(e){var t;let n=j(),r=M(),i=r.findIndex(e=>e===n),a=r[i+e];(t=s.current)!=null&&t.loop&&(a=i+e<0?r[r.length-1]:i+e===r.length?r[0]:r[i+e]),a&&w.setState(`value`,a.getAttribute(q))}function ee(e){let t=j()?.closest(K),n;for(;t&&!n;)t=e>0?Jt(t,K):Yt(t,K),n=t?.querySelector(Mt);n?w.setState(`value`,n.getAttribute(q)):P(e)}let te=()=>N(M().length-1),ne=e=>{e.preventDefault(),e.metaKey?te():e.altKey?ee(1):P(1)},re=e=>{e.preventDefault(),e.metaKey?N(0):e.altKey?ee(-1):P(-1)};return u.createElement(L.div,{ref:t,tabIndex:-1,...v,"cmdk-root":``,onKeyDown:e=>{var t;(t=v.onKeyDown)==null||t.call(v,e);let n=e.nativeEvent.isComposing||e.keyCode===229;if(!(e.defaultPrevented||n))switch(e.key){case`n`:case`j`:_&&e.ctrlKey&&ne(e);break;case`ArrowDown`:ne(e);break;case`p`:case`k`:_&&e.ctrlKey&&re(e);break;case`ArrowUp`:re(e);break;case`Home`:e.preventDefault(),N(0);break;case`End`:e.preventDefault(),te();break;case`Enter`:{e.preventDefault();let t=j();if(t){let e=new Event(Nt);t.dispatchEvent(e)}}}}},u.createElement(`label`,{"cmdk-label":``,htmlFor:T.inputId,id:T.labelId,style:en},c),$(e,e=>u.createElement(It.Provider,{value:w},u.createElement(Ft.Provider,{value:T},e))))}),Bt=u.forwardRef((e,t)=>{let n=F(),r=u.useRef(null),i=u.useContext(Rt),a=J(),o=Xt(e),s=o.current?.forceMount??i?.forceMount;X(()=>{if(!s)return a.item(n,i?.id)},[s]);let c=Zt(n,r,[e.value,e.children,r],e.keywords),l=Lt(),d=Q(e=>e.value&&e.value===c.current),f=Q(e=>s||a.filter()===!1?!0:!e.search||e.filtered.items.get(n)>0);u.useEffect(()=>{let t=r.current;if(!(!t||e.disabled))return t.addEventListener(Nt,p),()=>t.removeEventListener(Nt,p)},[f,e.onSelect,e.disabled]);function p(){var e,t;m(),(t=(e=o.current).onSelect)==null||t.call(e,c.current)}function m(){l.setState(`value`,c.current,!0)}if(!f)return null;let{disabled:h,value:g,onSelect:_,forceMount:v,keywords:y,...b}=e;return u.createElement(L.div,{ref:O(r,t),...b,id:n,"cmdk-item":``,role:`option`,"aria-disabled":!!h,"aria-selected":!!d,"data-disabled":!!h,"data-selected":!!d,onPointerMove:h||a.getDisablePointerSelection()?void 0:m,onClick:h?void 0:p},e.children)}),Vt=u.forwardRef((e,t)=>{let{heading:n,children:r,forceMount:i,...a}=e,o=F(),s=u.useRef(null),c=u.useRef(null),l=F(),d=J(),f=Q(e=>i||d.filter()===!1?!0:!e.search||e.filtered.groups.has(o));X(()=>d.group(o),[]),Zt(o,s,[e.value,e.heading,c]);let p=u.useMemo(()=>({id:o,forceMount:i}),[i]);return u.createElement(L.div,{ref:O(s,t),...a,"cmdk-group":``,role:`presentation`,hidden:!f||void 0},n&&u.createElement(`div`,{ref:c,"cmdk-group-heading":``,"aria-hidden":!0,id:l},n),$(e,e=>u.createElement(`div`,{"cmdk-group-items":``,role:`group`,"aria-labelledby":n?l:void 0},u.createElement(Rt.Provider,{value:p},e))))}),Ht=u.forwardRef((e,t)=>{let{alwaysRender:n,...r}=e,i=u.useRef(null),a=Q(e=>!e.search);return!n&&!a?null:u.createElement(L.div,{ref:O(i,t),...r,"cmdk-separator":``,role:`separator`})}),Ut=u.forwardRef((e,t)=>{let{onValueChange:n,...r}=e,i=e.value!=null,a=Lt(),o=Q(e=>e.search),s=Q(e=>e.selectedItemId),c=J();return u.useEffect(()=>{e.value!=null&&a.setState(`search`,e.value)},[e.value]),u.createElement(L.input,{ref:t,...r,"cmdk-input":``,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,"aria-autocomplete":`list`,role:`combobox`,"aria-expanded":!0,"aria-controls":c.listId,"aria-labelledby":c.labelId,"aria-activedescendant":s,id:c.inputId,type:`text`,value:i?e.value:o,onChange:e=>{i||a.setState(`search`,e.target.value),n?.(e.target.value)}})}),Wt=u.forwardRef((e,t)=>{let{children:n,label:r=`Suggestions`,...i}=e,a=u.useRef(null),o=u.useRef(null),s=Q(e=>e.selectedItemId),c=J();return u.useEffect(()=>{if(o.current&&a.current){let e=o.current,t=a.current,n,r=new ResizeObserver(()=>{n=requestAnimationFrame(()=>{let n=e.offsetHeight;t.style.setProperty(`--cmdk-list-height`,n.toFixed(1)+`px`)})});return r.observe(e),()=>{cancelAnimationFrame(n),r.unobserve(e)}}},[]),u.createElement(L.div,{ref:O(a,t),...i,"cmdk-list":``,role:`listbox`,tabIndex:-1,"aria-activedescendant":s,"aria-label":r,id:c.listId},$(e,e=>u.createElement(`div`,{ref:O(o,c.listInnerRef),"cmdk-list-sizer":``},e)))}),Gt=u.forwardRef((e,t)=>{let{open:n,onOpenChange:r,overlayClassName:i,contentClassName:a,container:o,...s}=e;return u.createElement(st,{open:n,onOpenChange:r},u.createElement(pt,{container:o},u.createElement(ht,{"cmdk-overlay":``,className:i}),u.createElement(vt,{"aria-label":e.label,"cmdk-dialog":``,className:a},u.createElement(zt,{ref:t,...s}))))}),Kt=u.forwardRef((e,t)=>Q(e=>e.filtered.count===0)?u.createElement(L.div,{ref:t,...e,"cmdk-empty":``,role:`presentation`}):null),qt=u.forwardRef((e,t)=>{let{progress:n,children:r,label:i=`Loading...`,...a}=e;return u.createElement(L.div,{ref:t,...a,"cmdk-loading":``,role:`progressbar`,"aria-valuenow":n,"aria-valuemin":0,"aria-valuemax":100,"aria-label":i},$(e,e=>u.createElement(`div`,{"aria-hidden":!0},e)))}),Y=Object.assign(zt,{List:Wt,Item:Bt,Input:Ut,Group:Vt,Separator:Ht,Dialog:Gt,Empty:Kt,Loading:qt});function Jt(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return n;n=n.nextElementSibling}}function Yt(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return n;n=n.previousElementSibling}}function Xt(e){let t=u.useRef(e);return X(()=>{t.current=e}),t}var X=typeof window>`u`?u.useEffect:u.useLayoutEffect;function Z(e){let t=u.useRef();return t.current===void 0&&(t.current=e()),t}function Q(e){let t=Lt(),n=()=>e(t.snapshot());return u.useSyncExternalStore(t.subscribe,n,n)}function Zt(e,t,n,r=[]){let i=u.useRef(),a=J();return X(()=>{var o;let s=(()=>{for(let e of n){if(typeof e==`string`)return e.trim();if(typeof e==`object`&&`current`in e)return e.current?e.current.textContent?.trim():i.current}})(),c=r.map(e=>e.trim());a.value(e,s,c),(o=t.current)==null||o.setAttribute(q,s),i.current=s}),i}var Qt=()=>{let[e,t]=u.useState(),n=Z(()=>new Map);return X(()=>{n.current.forEach(e=>e()),n.current=new Map},[e]),(e,r)=>{n.current.set(e,r),t({})}};function $t(e){let t=e.type;return typeof t==`function`?t(e.props):`render`in t?t.render(e.props):e}function $({asChild:e,children:t},n){return e&&u.isValidElement(t)?u.cloneElement($t(t),{ref:t.ref},n(t.props.children)):n(t)}var en={position:`absolute`,width:`1px`,height:`1px`,padding:`0`,margin:`-1px`,overflow:`hidden`,clip:`rect(0, 0, 0, 0)`,whiteSpace:`nowrap`,borderWidth:`0`},tn=u.forwardRef(({className:e,...t},n)=>(0,A.jsx)(Y,{ref:n,className:r(`flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground`,e),...t}));tn.displayName=Y.displayName;var nn=({children:e,...t})=>(0,A.jsx)(s,{...t,children:(0,A.jsx)(c,{className:`overflow-hidden p-0 shadow-lg`,children:(0,A.jsx)(tn,{className:`[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5`,children:e})})}),rn=u.forwardRef(({className:e,...t},n)=>(0,A.jsxs)(`div`,{className:`flex shrink-0 items-center border-b border-border px-3`,"cmdk-input-wrapper":``,children:[(0,A.jsx)(l,{className:`mr-2 h-4 w-4 shrink-0 opacity-50`}),(0,A.jsx)(Y.Input,{ref:n,className:r(`flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50`,e),...t})]}));rn.displayName=Y.Input.displayName;var an=u.forwardRef(({className:e,...t},n)=>(0,A.jsx)(Y.List,{ref:n,className:r(`max-h-[300px] min-h-0 overscroll-contain overflow-y-auto overflow-x-hidden`,e),...t}));an.displayName=Y.List.displayName;var on=u.forwardRef((e,t)=>(0,A.jsx)(Y.Empty,{ref:t,className:`py-6 text-center text-sm`,...e}));on.displayName=Y.Empty.displayName;var sn=u.forwardRef(({className:e,...t},n)=>(0,A.jsx)(Y.Group,{ref:n,className:r(`overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground`,e),...t}));sn.displayName=Y.Group.displayName;var cn=u.forwardRef(({className:e,...t},n)=>(0,A.jsx)(Y.Separator,{ref:n,className:r(`-mx-1 h-px bg-border/40`,e),...t}));cn.displayName=Y.Separator.displayName;var ln=u.forwardRef(({className:e,...t},n)=>(0,A.jsx)(Y.Item,{ref:n,className:r(`relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0`,e),...t}));ln.displayName=Y.Item.displayName;export{rn as a,cn as c,sn as i,nn as n,ln as o,on as r,an as s,tn as t};
|
|
2
|
+
//# sourceMappingURL=command-BAXXxf0P.js.map
|
|
Binary file
|
|
Binary file
|