@wakastellar/ui 3.2.0 → 3.3.2
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/charts.cjs.js +1 -1
- package/dist/charts.d.ts +1 -17
- package/dist/charts.es.js +2 -16
- package/dist/chunk-BDDJmn7V.js +1 -0
- package/dist/chunk-BH6uBOac.mjs +23 -0
- package/dist/cli/index.cjs +621 -188
- package/dist/cn-DnPbmOCy.js +1 -0
- package/dist/cn-DpLcAzrf.mjs +22 -0
- package/dist/doc.cjs.js +2 -0
- package/dist/doc.d.ts +1 -0
- package/dist/doc.es.js +131 -0
- package/dist/exceljs.min-BuefmDRS.js +28 -0
- package/dist/exceljs.min-DG9M8IZ1.mjs +32037 -0
- package/dist/export.cjs.js +1 -1
- package/dist/export.d.ts +1 -30
- package/dist/export.es.js +2 -5
- package/dist/index.cjs.js +259 -240
- package/dist/index.d.ts +1 -35
- package/dist/index.es.js +95716 -98932
- package/dist/rich-text.cjs.js +1 -1
- package/dist/rich-text.d.ts +1 -21
- package/dist/rich-text.es.js +2 -4
- package/dist/separator-BDReXBvI.mjs +59 -0
- package/dist/separator-BKjNl9sI.js +1 -0
- package/dist/src/blocks/waka-doc-shell/index.d.ts +3 -0
- package/dist/src/blocks/waka-doc-shell/types.d.ts +32 -0
- package/dist/src/charts.d.ts +17 -0
- package/dist/src/components/command/index.d.ts +83 -0
- package/dist/{components → src/components}/index.d.ts +39 -0
- package/dist/src/components/waka-actor-badge/index.d.ts +8 -0
- package/dist/src/components/waka-actors-list/index.d.ts +18 -0
- package/dist/src/components/waka-ai-assistant-button/index.d.ts +8 -0
- package/dist/src/components/waka-credit-activity-feed/index.d.ts +21 -0
- package/dist/src/components/waka-credit-alert/index.d.ts +24 -0
- package/dist/src/components/waka-credit-balance/index.d.ts +30 -0
- package/dist/src/components/waka-credit-balance/types.d.ts +34 -0
- package/dist/src/components/waka-credit-breakdown/index.d.ts +32 -0
- package/dist/src/components/waka-credit-burn-rate/index.d.ts +25 -0
- package/dist/src/components/waka-credit-history/index.d.ts +31 -0
- package/dist/src/components/waka-credit-meter/index.d.ts +27 -0
- package/dist/src/components/waka-credit-pricing-pack/index.d.ts +17 -0
- package/dist/src/components/waka-credit-projection/index.d.ts +21 -0
- package/dist/src/components/waka-credit-quota/index.d.ts +25 -0
- package/dist/src/components/waka-credit-receipt/index.d.ts +23 -0
- package/dist/src/components/waka-credit-top-up/index.d.ts +26 -0
- package/dist/src/components/waka-credit-transaction/index.d.ts +22 -0
- package/dist/src/components/waka-credit-transfer-form/index.d.ts +27 -0
- package/dist/src/components/waka-credit-usage-chart/index.d.ts +34 -0
- package/dist/src/components/waka-doc-breadcrumb/index.d.ts +11 -0
- package/dist/src/components/waka-doc-callout/index.d.ts +9 -0
- package/dist/src/components/waka-doc-code-block/index.d.ts +9 -0
- package/dist/src/components/waka-doc-nav/index.d.ts +16 -0
- package/dist/src/components/waka-doc-renderer/index.d.ts +7 -0
- package/dist/src/components/waka-doc-search/index.d.ts +18 -0
- package/dist/src/components/waka-doc-table/index.d.ts +8 -0
- package/dist/src/components/waka-doc-toc/index.d.ts +11 -0
- package/dist/src/components/waka-doc-toolbar/index.d.ts +10 -0
- package/dist/src/components/waka-doc-version/index.d.ts +13 -0
- package/dist/src/components/waka-document-flyover/index.d.ts +10 -0
- package/dist/src/components/waka-document-preview-popup/index.d.ts +26 -0
- package/dist/src/components/waka-hour-balance-badge/index.d.ts +8 -0
- package/dist/src/components/waka-hour-consumption-table/index.d.ts +15 -0
- package/dist/src/components/waka-hour-pack-dialog/index.d.ts +8 -0
- package/dist/src/components/waka-project-stats-header/index.d.ts +15 -0
- package/dist/src/components/waka-step-comment-bubble/index.d.ts +13 -0
- package/dist/src/components/waka-step-comment-panel/index.d.ts +20 -0
- package/dist/src/components/waka-step-permission-matrix/index.d.ts +12 -0
- package/dist/src/components/waka-time-entry-dialog/index.d.ts +16 -0
- package/dist/src/components/waka-time-tracking-flyover/index.d.ts +11 -0
- package/dist/src/doc.d.ts +33 -0
- package/dist/src/export.d.ts +30 -0
- package/dist/src/index.d.ts +35 -0
- package/dist/src/rich-text.d.ts +21 -0
- package/dist/types-B6GVaSIP.mjs +934 -0
- package/dist/types-BH9cQRqZ.js +1 -0
- package/dist/ui.css +2 -1
- package/dist/useDataTableImport-BPvfo--2.mjs +250 -0
- package/dist/useDataTableImport-Cm_pCKnO.js +7 -0
- package/dist/waka-doc-renderer-BZ2-SqyT.js +3 -0
- package/dist/waka-doc-renderer-BkIvas3z.mjs +1679 -0
- package/dist/waka-rich-text-editor-BJGlQgpq.js +1 -0
- package/dist/waka-rich-text-editor-BJzzxeP1.mjs +361 -0
- package/dist/waka-rich-text-editor-wnXLwvUo.js +1 -0
- package/package.json +100 -70
- package/src/blocks/footer/index.tsx +7 -1
- package/src/blocks/login/index.tsx +7 -1
- package/src/blocks/profile/index.tsx +5 -3
- package/src/blocks/waka-doc-shell/WakaDocShell.stories.tsx +198 -0
- package/src/blocks/waka-doc-shell/index.tsx +240 -0
- package/src/blocks/waka-doc-shell/types.ts +40 -0
- package/src/components/index.ts +46 -0
- package/src/components/waka-actor-badge/index.tsx +34 -0
- package/src/components/waka-actors-list/index.tsx +125 -0
- package/src/components/waka-ai-assistant-button/index.tsx +31 -0
- package/src/components/waka-credit-activity-feed/WakaCreditActivityFeed.stories.tsx +261 -0
- package/src/components/waka-credit-activity-feed/index.tsx +364 -0
- package/src/components/waka-credit-alert/WakaCreditAlert.stories.tsx +170 -0
- package/src/components/waka-credit-alert/index.tsx +179 -0
- package/src/components/waka-credit-balance/WakaCreditBalance.stories.tsx +259 -0
- package/src/components/waka-credit-balance/index.tsx +433 -0
- package/src/components/waka-credit-balance/types.ts +38 -0
- package/src/components/waka-credit-breakdown/WakaCreditBreakdown.stories.tsx +186 -0
- package/src/components/waka-credit-breakdown/index.tsx +487 -0
- package/src/components/waka-credit-burn-rate/WakaCreditBurnRate.stories.tsx +227 -0
- package/src/components/waka-credit-burn-rate/index.tsx +475 -0
- package/src/components/waka-credit-history/WakaCreditHistory.stories.tsx +290 -0
- package/src/components/waka-credit-history/index.tsx +654 -0
- package/src/components/waka-credit-meter/WakaCreditMeter.stories.tsx +418 -0
- package/src/components/waka-credit-meter/index.tsx +624 -0
- package/src/components/waka-credit-pricing-pack/WakaCreditPricingPack.stories.tsx +217 -0
- package/src/components/waka-credit-pricing-pack/index.tsx +185 -0
- package/src/components/waka-credit-projection/WakaCreditProjection.stories.tsx +163 -0
- package/src/components/waka-credit-projection/index.tsx +345 -0
- package/src/components/waka-credit-quota/WakaCreditQuota.stories.tsx +260 -0
- package/src/components/waka-credit-quota/index.tsx +461 -0
- package/src/components/waka-credit-receipt/WakaCreditReceipt.stories.tsx +98 -0
- package/src/components/waka-credit-receipt/index.tsx +247 -0
- package/src/components/waka-credit-top-up/WakaCreditTopUp.stories.tsx +196 -0
- package/src/components/waka-credit-top-up/index.tsx +403 -0
- package/src/components/waka-credit-transaction/WakaCreditTransaction.stories.tsx +218 -0
- package/src/components/waka-credit-transaction/index.tsx +278 -0
- package/src/components/waka-credit-transfer-form/WakaCreditTransferForm.stories.tsx +122 -0
- package/src/components/waka-credit-transfer-form/index.tsx +352 -0
- package/src/components/waka-credit-usage-chart/WakaCreditUsageChart.stories.tsx +214 -0
- package/src/components/waka-credit-usage-chart/index.tsx +307 -0
- package/src/components/waka-doc-breadcrumb/WakaDocBreadcrumb.stories.tsx +47 -0
- package/src/components/waka-doc-breadcrumb/index.tsx +42 -0
- package/src/components/waka-doc-callout/WakaDocCallout.stories.tsx +67 -0
- package/src/components/waka-doc-callout/index.tsx +86 -0
- package/src/components/waka-doc-code-block/WakaDocCodeBlock.stories.tsx +92 -0
- package/src/components/waka-doc-code-block/index.tsx +120 -0
- package/src/components/waka-doc-nav/WakaDocNav.stories.tsx +95 -0
- package/src/components/waka-doc-nav/index.tsx +125 -0
- package/src/components/waka-doc-renderer/WakaDocRenderer.stories.tsx +120 -0
- package/src/components/waka-doc-renderer/index.tsx +217 -0
- package/src/components/waka-doc-search/WakaDocSearch.stories.tsx +64 -0
- package/src/components/waka-doc-search/index.tsx +158 -0
- package/src/components/waka-doc-table/WakaDocTable.stories.tsx +47 -0
- package/src/components/waka-doc-table/index.tsx +37 -0
- package/src/components/waka-doc-toc/WakaDocToc.stories.tsx +54 -0
- package/src/components/waka-doc-toc/index.tsx +90 -0
- package/src/components/waka-doc-toolbar/WakaDocToolbar.stories.tsx +79 -0
- package/src/components/waka-doc-toolbar/index.tsx +131 -0
- package/src/components/waka-doc-version/WakaDocVersion.stories.tsx +41 -0
- package/src/components/waka-doc-version/index.tsx +63 -0
- package/src/components/waka-document-flyover/index.tsx +36 -0
- package/src/components/waka-document-preview-popup/index.tsx +103 -0
- package/src/components/waka-hour-balance-badge/index.tsx +43 -0
- package/src/components/waka-hour-consumption-table/index.tsx +72 -0
- package/src/components/waka-hour-pack-dialog/index.tsx +72 -0
- package/src/components/waka-project-stats-header/index.tsx +69 -0
- package/src/components/waka-step-comment-bubble/index.tsx +71 -0
- package/src/components/waka-step-comment-panel/index.tsx +106 -0
- package/src/components/waka-step-permission-matrix/index.tsx +65 -0
- package/src/components/waka-time-entry-dialog/index.tsx +131 -0
- package/src/components/waka-time-tracking-flyover/index.tsx +41 -0
- package/dist/cn-B-fTneHh.js +0 -1
- package/dist/cn-DzRe1GWm.mjs +0 -21
- package/dist/components/command/index.d.ts +0 -51
- package/dist/exceljs.min-BcLLX0PC.js +0 -29
- package/dist/exceljs.min-KOayaaQ4.mjs +0 -23013
- package/dist/index-B9GTFkji.js +0 -1
- package/dist/index-c0jcWyEL.mjs +0 -466
- package/dist/types-BOWIoR7j.mjs +0 -1111
- package/dist/types-D2yCJ91P.js +0 -1
- package/dist/useDataTableImport-COVnvslz.js +0 -9
- package/dist/useDataTableImport-DAlxBY8w.mjs +0 -237
- /package/dist/{blocks → src/blocks}/activity-timeline/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/antivirus-dashboard/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/apm-overview/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/auth-2fa/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/calendar-view/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/chat/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/chat/widget.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/chat-interface/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/checkout-flow/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/cicd-builder/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/clamav-service-status/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/cloud-cost-dashboard/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/container-orchestrator/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/dashboard/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/dashboard-kpi/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/database-admin/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/deployment-dashboard/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/empty-states/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/error-pages/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/faq/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/file-manager/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/file-scan-uploader/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/footer/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/gitops-sync-status/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/header/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/headtab/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/i18n-editor/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/incident-manager/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/infrastructure-map/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/kanban-board/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/landing/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/language-selector/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/layout/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/login/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/login/types.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/on-call-schedule/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/player-profile/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/pricing/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/profile/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/quarantine-manager/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/release-notes/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/scan-history-log/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/scan-policy-editor/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/scan-report-generator/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/settings/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/sidebar/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/signature-database-manager/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/threat-alert-banner/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/user-management/index.d.ts +0 -0
- /package/dist/{blocks → src/blocks}/wizard/index.d.ts +0 -0
- /package/dist/{cli → src/cli}/commands/add.d.ts +0 -0
- /package/dist/{cli → src/cli}/commands/init.d.ts +0 -0
- /package/dist/{cli → src/cli}/commands/list.d.ts +0 -0
- /package/dist/{cli → src/cli}/commands/search.d.ts +0 -0
- /package/dist/{cli → src/cli}/index.d.ts +0 -0
- /package/dist/{cli → src/cli}/utils/config.d.ts +0 -0
- /package/dist/{cli → src/cli}/utils/logger.d.ts +0 -0
- /package/dist/{cli → src/cli}/utils/registry.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/DataTable.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/DataTableAdvanced.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/DataTableColumnResizer.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/DataTableContextMenu.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/DataTableEditCell.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/DataTableFilters.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/DataTableGrouping.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/DataTablePagination.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/DataTableSelection.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/DataTableToolbar.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/examples/EditExample.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/hooks/useDataTable.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/hooks/useDataTableAdvanced.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/hooks/useDataTableEdit.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/hooks/useDataTableExport.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/hooks/useDataTableImport.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/hooks/useDataTableTheme.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/hooks/useDataTableVirtualization.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/hooks/useTableLayout.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/index.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/types.d.ts +0 -0
- /package/dist/{components → src/components}/DataTable/utils.d.ts +0 -0
- /package/dist/{components → src/components}/accordion/index.d.ts +0 -0
- /package/dist/{components → src/components}/alert/index.d.ts +0 -0
- /package/dist/{components → src/components}/alert-dialog/index.d.ts +0 -0
- /package/dist/{components → src/components}/aspect-ratio/index.d.ts +0 -0
- /package/dist/{components → src/components}/avatar/index.d.ts +0 -0
- /package/dist/{components → src/components}/badge/index.d.ts +0 -0
- /package/dist/{components → src/components}/button/index.d.ts +0 -0
- /package/dist/{components → src/components}/calendar/index.d.ts +0 -0
- /package/dist/{components → src/components}/card/index.d.ts +0 -0
- /package/dist/{components → src/components}/checkbox/index.d.ts +0 -0
- /package/dist/{components → src/components}/code/index.d.ts +0 -0
- /package/dist/{components → src/components}/collapsible/index.d.ts +0 -0
- /package/dist/{components → src/components}/context-menu/index.d.ts +0 -0
- /package/dist/{components → src/components}/dialog/index.d.ts +0 -0
- /package/dist/{components → src/components}/dropdown-menu/index.d.ts +0 -0
- /package/dist/{components → src/components}/error-boundary/ErrorBoundary.d.ts +0 -0
- /package/dist/{components → src/components}/error-boundary/index.d.ts +0 -0
- /package/dist/{components → src/components}/form/index.d.ts +0 -0
- /package/dist/{components → src/components}/hover-card/index.d.ts +0 -0
- /package/dist/{components → src/components}/input/index.d.ts +0 -0
- /package/dist/{components → src/components}/input-otp/index.d.ts +0 -0
- /package/dist/{components → src/components}/label/index.d.ts +0 -0
- /package/dist/{components → src/components}/language-selector/index.d.ts +0 -0
- /package/dist/{components → src/components}/menubar/index.d.ts +0 -0
- /package/dist/{components → src/components}/navigation-menu/index.d.ts +0 -0
- /package/dist/{components → src/components}/popover/index.d.ts +0 -0
- /package/dist/{components → src/components}/progress/index.d.ts +0 -0
- /package/dist/{components → src/components}/radio-group/index.d.ts +0 -0
- /package/dist/{components → src/components}/scroll-area/index.d.ts +0 -0
- /package/dist/{components → src/components}/select/index.d.ts +0 -0
- /package/dist/{components → src/components}/separator/index.d.ts +0 -0
- /package/dist/{components → src/components}/sheet/index.d.ts +0 -0
- /package/dist/{components → src/components}/skeleton/index.d.ts +0 -0
- /package/dist/{components → src/components}/slider/index.d.ts +0 -0
- /package/dist/{components → src/components}/switch/index.d.ts +0 -0
- /package/dist/{components → src/components}/table/index.d.ts +0 -0
- /package/dist/{components → src/components}/tabs/index.d.ts +0 -0
- /package/dist/{components → src/components}/textarea/index.d.ts +0 -0
- /package/dist/{components → src/components}/theme-selector/index.d.ts +0 -0
- /package/dist/{components → src/components}/toast/index.d.ts +0 -0
- /package/dist/{components → src/components}/toaster/index.d.ts +0 -0
- /package/dist/{components → src/components}/toggle/index.d.ts +0 -0
- /package/dist/{components → src/components}/tooltip/index.d.ts +0 -0
- /package/dist/{components → src/components}/typography/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-3d-pie-chart/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-achievement-unlock/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-activity-feed/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-ad-banner/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-ad-fallback/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-ad-inline/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-ad-interstitial/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-ad-placeholder/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-ad-provider/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-ad-sidebar/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-ad-sticky-footer/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-address-autocomplete/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-admincrumb/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-alert-panel/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-alert-stack/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-allocation-matrix/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-approval-chain/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-artifact-list/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-audit-log/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-autocomplete/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-badge-showcase/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-barcode/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-biometric-prompt/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-bottom-sheet/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-breadcrumb/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-breadcrumb-path/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-budget-burn/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-build-matrix/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-capacity-planner/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-carousel/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-cart-summary/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-challenge-timer/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-charts/WakaAreaChart.d.ts +0 -0
- /package/dist/{components → src/components}/waka-charts/WakaBarChart.d.ts +0 -0
- /package/dist/{components → src/components}/waka-charts/WakaChart.d.ts +0 -0
- /package/dist/{components → src/components}/waka-charts/WakaLineChart.d.ts +0 -0
- /package/dist/{components → src/components}/waka-charts/WakaMiniChart.d.ts +0 -0
- /package/dist/{components → src/components}/waka-charts/WakaPieChart.d.ts +0 -0
- /package/dist/{components → src/components}/waka-charts/WakaSparkline.d.ts +0 -0
- /package/dist/{components → src/components}/waka-charts/dataTableHelpers.d.ts +0 -0
- /package/dist/{components → src/components}/waka-charts/hooks/useChartTheme.d.ts +0 -0
- /package/dist/{components → src/components}/waka-charts/hooks/useRechartsLoader.d.ts +0 -0
- /package/dist/{components → src/components}/waka-charts/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-charts/types.d.ts +0 -0
- /package/dist/{components → src/components}/waka-chat-bubble/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-checklist/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-checkout-stepper/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-cohort-table/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-color-picker/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-combo-counter/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-combobox/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-command-bar/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-compare-period/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-config-comparator/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-connection-matrix/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-container-list/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-content-recommendation/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-contribution-graph/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-cost-breakdown/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-coupon-input/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-credit-card-input/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-daily-reward/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-database-card/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-date-range-picker/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-datetime-picker/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-datetime-picker.form-integration/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-dependency-tree/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-deployment-lane/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-device-trust/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-dock/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-drawer/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-empty-state/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-env-var-editor/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-error-shake/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-feature-announcement/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-feature-flag-row/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-file-upload/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-floating-nav/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-flow-diagram/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-funnel-chart/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-glow-card/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-goal-progress/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-haptic-button/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-health-pulse/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-heatmap/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-hotspot/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-image/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-incident-timeline/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-invoice-preview/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-kanban/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-kpi-dashboard/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-kubernetes-overview/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-leaderboard/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-level-progress/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-liquid-button/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-loading-orbit/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-log-viewer/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-loot-box/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-magic-link/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-magnetic-button/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-mention-input/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-metric-sparkline/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-migration-list/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-milestone-road/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-modal/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-morph-button/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-network-topology/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-notifications/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-number-input/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-orbital-menu/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-order-tracker/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-outstream-video/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-pagination/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-password-strength/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-payment-method-picker/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-permission-matrix/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-phone-input/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-pipeline-view/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-player-card/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-pod-card/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-points-popup/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-power-up/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-presence-indicator/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-pricing-table/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-product-card/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-progress-onboarding/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-pull-to-refresh/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-qrcode/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-query-explain/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-quest-card/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-quota-bar/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-radar-score/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-rank-badge/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-rating-input/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-reaction-picker/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-region-map/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-resource-gauge/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-resource-pool/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-rich-text-editor/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-rollback-slider/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-sankey-diagram/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-schedule-picker/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-scratch-card/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-season-pass/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-secret-card/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-security-scan-result/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-security-score/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-segmented-control/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-server-rack/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-service-graph/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-session-manager/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-signature-pad/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-skeleton-wave/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-skill-tree/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-sla-tracker/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-slider-range/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-spin-wheel/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-spinner/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-sponsored-badge/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-sponsored-card/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-sponsored-feed/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-spotlight/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-stat/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-stats-hexagon/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-status-matrix/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-stepper/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-streak-counter/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-success-explosion/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-swipe-card/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-tabs-morph/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-tag-input/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-team-banner/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-terminal-output/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-test-report/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-theme-creator/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-theme-manager/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-thread-view/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-tilt-card/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-time-picker/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-timeline/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-tooltip-tour/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-tour-guide/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-tournament-bracket/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-trace-viewer/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-tree/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-treemap-chart/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-two-factor-setup/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-typewriter/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-typing-indicator/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-versus-card/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-video/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-video-ad/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-video-call/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-video-overlay/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-virtual-list/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-voice-message/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-welcome-modal/index.d.ts +0 -0
- /package/dist/{components → src/components}/waka-xp-bar/index.d.ts +0 -0
- /package/dist/{context → src/context}/admincrumb-context.d.ts +0 -0
- /package/dist/{context → src/context}/index.d.ts +0 -0
- /package/dist/{context → src/context}/language-context.d.ts +0 -0
- /package/dist/{context → src/context}/theme-context.d.ts +0 -0
- /package/dist/{context → src/context}/theme-provider.d.ts +0 -0
- /package/dist/{context → src/context}/waka-provider.d.ts +0 -0
- /package/dist/{hooks → src/hooks}/index.d.ts +0 -0
- /package/dist/{hooks → src/hooks}/use-toast.d.ts +0 -0
- /package/dist/{hooks → src/hooks}/use-translation.d.ts +0 -0
- /package/dist/{hooks → src/hooks}/useToast.d.ts +0 -0
- /package/dist/{lib → src/lib}/i18n.d.ts +0 -0
- /package/dist/{stories → src/stories}/Button.d.ts +0 -0
- /package/dist/{stories → src/stories}/Button.stories.d.ts +0 -0
- /package/dist/{stories → src/stories}/Header.d.ts +0 -0
- /package/dist/{stories → src/stories}/Header.stories.d.ts +0 -0
- /package/dist/{stories → src/stories}/Page.d.ts +0 -0
- /package/dist/{stories → src/stories}/Page.stories.d.ts +0 -0
- /package/dist/{types → src/types}/index.d.ts +0 -0
- /package/dist/{types → src/types}/link.d.ts +0 -0
- /package/dist/{types → src/types}/provider.d.ts +0 -0
- /package/dist/{utils → src/utils}/cn.d.ts +0 -0
- /package/dist/{utils → src/utils}/datetime-helpers.d.ts +0 -0
- /package/dist/{utils → src/utils}/error-handling.d.ts +0 -0
- /package/dist/{utils → src/utils}/index.d.ts +0 -0
- /package/dist/{utils → src/utils}/logger.d.ts +0 -0
- /package/dist/{utils → src/utils}/security.d.ts +0 -0
- /package/dist/{utils → src/utils}/theme-loader.d.ts +0 -0
- /package/dist/{utils → src/utils}/tweak.d.ts +0 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import { WakaDocVersion } from './index'
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof WakaDocVersion> = {
|
|
6
|
+
title: 'Components/Documentation/WakaDocVersion',
|
|
7
|
+
component: WakaDocVersion,
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: 'centered',
|
|
10
|
+
docs: {
|
|
11
|
+
description: {
|
|
12
|
+
component: 'Version selector dropdown with status badges (latest, stable, beta, rc, deprecated).',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
tags: ['autodocs'],
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default meta
|
|
20
|
+
type Story = StoryObj<typeof WakaDocVersion>
|
|
21
|
+
|
|
22
|
+
const versions = [
|
|
23
|
+
{ id: 'v4.0.0', label: 'v4.0.0', status: 'latest' as const },
|
|
24
|
+
{ id: 'v3.1.0', label: 'v3.1.0', status: 'stable' as const },
|
|
25
|
+
{ id: 'v3.0.0', label: 'v3.0.0' },
|
|
26
|
+
{ id: 'v2.5.0', label: 'v2.5.0', status: 'deprecated' as const },
|
|
27
|
+
{ id: 'v5.0.0-beta', label: 'v5.0.0-beta', status: 'beta' as const },
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
export const Default: Story = {
|
|
31
|
+
render: () => {
|
|
32
|
+
const [current, setCurrent] = React.useState('v4.0.0')
|
|
33
|
+
return (
|
|
34
|
+
<WakaDocVersion
|
|
35
|
+
versions={versions}
|
|
36
|
+
current={current}
|
|
37
|
+
onVersionChange={setCurrent}
|
|
38
|
+
/>
|
|
39
|
+
)
|
|
40
|
+
},
|
|
41
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { cn } from "../../utils"
|
|
5
|
+
import { Badge } from "../badge"
|
|
6
|
+
import {
|
|
7
|
+
Select,
|
|
8
|
+
SelectContent,
|
|
9
|
+
SelectItem,
|
|
10
|
+
SelectTrigger,
|
|
11
|
+
SelectValue,
|
|
12
|
+
} from "../select"
|
|
13
|
+
import { Tag } from "lucide-react"
|
|
14
|
+
|
|
15
|
+
export type VersionStatus = "latest" | "stable" | "beta" | "deprecated" | "rc"
|
|
16
|
+
|
|
17
|
+
export interface DocVersion {
|
|
18
|
+
id: string
|
|
19
|
+
label: string
|
|
20
|
+
status?: VersionStatus
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface WakaDocVersionProps {
|
|
24
|
+
versions: DocVersion[]
|
|
25
|
+
current: string
|
|
26
|
+
onVersionChange: (versionId: string) => void
|
|
27
|
+
className?: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const STATUS_CONFIG: Record<VersionStatus, { label: string; variant: "default" | "secondary" | "destructive" | "outline" }> = {
|
|
31
|
+
latest: { label: "Latest", variant: "default" },
|
|
32
|
+
stable: { label: "Stable", variant: "secondary" },
|
|
33
|
+
beta: { label: "Beta", variant: "outline" },
|
|
34
|
+
rc: { label: "RC", variant: "outline" },
|
|
35
|
+
deprecated: { label: "Deprecated", variant: "destructive" },
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function WakaDocVersion({ versions, current, onVersionChange, className }: WakaDocVersionProps) {
|
|
39
|
+
return (
|
|
40
|
+
<div className={cn("flex items-center gap-2", className)}>
|
|
41
|
+
<Tag className="h-4 w-4 text-muted-foreground" />
|
|
42
|
+
<Select value={current} onValueChange={onVersionChange}>
|
|
43
|
+
<SelectTrigger className="h-8 w-auto min-w-[120px] text-xs">
|
|
44
|
+
<SelectValue />
|
|
45
|
+
</SelectTrigger>
|
|
46
|
+
<SelectContent>
|
|
47
|
+
{versions.map((v) => (
|
|
48
|
+
<SelectItem key={v.id} value={v.id}>
|
|
49
|
+
<span className="flex items-center gap-2">
|
|
50
|
+
{v.label}
|
|
51
|
+
{v.status && (
|
|
52
|
+
<Badge variant={STATUS_CONFIG[v.status].variant} className="text-[10px] px-1.5 py-0">
|
|
53
|
+
{STATUS_CONFIG[v.status].label}
|
|
54
|
+
</Badge>
|
|
55
|
+
)}
|
|
56
|
+
</span>
|
|
57
|
+
</SelectItem>
|
|
58
|
+
))}
|
|
59
|
+
</SelectContent>
|
|
60
|
+
</Select>
|
|
61
|
+
</div>
|
|
62
|
+
)
|
|
63
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { HoverCard, HoverCardContent, HoverCardTrigger } from "../hover-card"
|
|
5
|
+
|
|
6
|
+
export interface DocumentFlyoverProps {
|
|
7
|
+
name: string
|
|
8
|
+
extension: string
|
|
9
|
+
sizeKb: number
|
|
10
|
+
lastModified: string
|
|
11
|
+
author: string
|
|
12
|
+
onClick: () => void
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function DocumentFlyover({ name, extension, sizeKb, lastModified, author, onClick }: DocumentFlyoverProps) {
|
|
16
|
+
return (
|
|
17
|
+
<HoverCard openDelay={200}>
|
|
18
|
+
<HoverCardTrigger asChild>
|
|
19
|
+
<button
|
|
20
|
+
onClick={onClick}
|
|
21
|
+
className="inline-flex items-center justify-center h-7 w-7 rounded-md bg-muted hover:bg-accent transition-colors"
|
|
22
|
+
aria-label={`Document: ${name}`}
|
|
23
|
+
>
|
|
24
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>
|
|
25
|
+
</button>
|
|
26
|
+
</HoverCardTrigger>
|
|
27
|
+
<HoverCardContent className="w-56 p-3 text-xs" side="top">
|
|
28
|
+
<p className="font-medium truncate">{name}.{extension}</p>
|
|
29
|
+
<p className="text-muted-foreground">{sizeKb} Ko — {lastModified}</p>
|
|
30
|
+
<p className="text-muted-foreground">par {author}</p>
|
|
31
|
+
</HoverCardContent>
|
|
32
|
+
</HoverCard>
|
|
33
|
+
)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { DocumentFlyover }
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { Dialog, DialogContent, DialogHeader, DialogTitle } from "../dialog"
|
|
5
|
+
|
|
6
|
+
export interface DocumentVersion {
|
|
7
|
+
id: string
|
|
8
|
+
label: string
|
|
9
|
+
date: string
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface PreviewDocument {
|
|
13
|
+
name: string
|
|
14
|
+
mimeType: string
|
|
15
|
+
content?: string
|
|
16
|
+
previewUrl?: string
|
|
17
|
+
sizeBytes: number
|
|
18
|
+
uploadedBy: string
|
|
19
|
+
uploadedAt: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface DocumentPreviewPopupProps {
|
|
23
|
+
open: boolean
|
|
24
|
+
onOpenChange: (open: boolean) => void
|
|
25
|
+
document: PreviewDocument
|
|
26
|
+
versions?: DocumentVersion[]
|
|
27
|
+
selectedVersion?: string
|
|
28
|
+
onVersionChange?: (versionId: string) => void
|
|
29
|
+
onDownload: (versionId?: string) => void
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const TEXT_TYPES = ["text/", "application/json", "application/xml", "application/javascript"]
|
|
33
|
+
const IMAGE_TYPES = ["image/"]
|
|
34
|
+
|
|
35
|
+
function isTextual(mimeType: string): boolean {
|
|
36
|
+
return TEXT_TYPES.some((t) => mimeType.startsWith(t)) || mimeType.includes("markdown")
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function isImage(mimeType: string): boolean {
|
|
40
|
+
return IMAGE_TYPES.some((t) => mimeType.startsWith(t))
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function formatSize(bytes: number): string {
|
|
44
|
+
if (bytes < 1024) return `${bytes} o`
|
|
45
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} Ko`
|
|
46
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} Mo`
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function DocumentPreviewPopup({
|
|
50
|
+
open, onOpenChange, document: doc, versions, selectedVersion, onVersionChange, onDownload,
|
|
51
|
+
}: DocumentPreviewPopupProps) {
|
|
52
|
+
return (
|
|
53
|
+
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
54
|
+
<DialogContent className="sm:max-w-4xl max-h-[90vh] flex flex-col">
|
|
55
|
+
<DialogHeader>
|
|
56
|
+
<div className="flex items-center justify-between gap-4">
|
|
57
|
+
<DialogTitle className="truncate">{doc.name}</DialogTitle>
|
|
58
|
+
<div className="flex items-center gap-2 shrink-0">
|
|
59
|
+
{versions && versions.length > 1 && (
|
|
60
|
+
<select
|
|
61
|
+
value={selectedVersion ?? versions[0]?.id}
|
|
62
|
+
onChange={(e) => onVersionChange?.(e.target.value)}
|
|
63
|
+
className="rounded-md border bg-background px-2 py-1 text-xs"
|
|
64
|
+
>
|
|
65
|
+
{versions.map((v) => (
|
|
66
|
+
<option key={v.id} value={v.id}>{v.label} — {v.date}</option>
|
|
67
|
+
))}
|
|
68
|
+
</select>
|
|
69
|
+
)}
|
|
70
|
+
<button
|
|
71
|
+
onClick={() => onDownload(selectedVersion)}
|
|
72
|
+
className="rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90"
|
|
73
|
+
>
|
|
74
|
+
Telecharger
|
|
75
|
+
</button>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
</DialogHeader>
|
|
79
|
+
|
|
80
|
+
<div className="flex-1 overflow-auto rounded-lg border bg-muted/30 p-4 min-h-[300px]">
|
|
81
|
+
{isTextual(doc.mimeType) && doc.content ? (
|
|
82
|
+
<pre className="whitespace-pre-wrap text-sm font-mono leading-relaxed">{doc.content}</pre>
|
|
83
|
+
) : isImage(doc.mimeType) && doc.previewUrl ? (
|
|
84
|
+
<img src={doc.previewUrl} alt={doc.name} className="max-w-full h-auto mx-auto rounded" />
|
|
85
|
+
) : (
|
|
86
|
+
<div className="flex flex-col items-center justify-center h-full gap-3 text-muted-foreground py-12">
|
|
87
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>
|
|
88
|
+
<p className="text-sm font-medium">Previsualisation non disponible</p>
|
|
89
|
+
<p className="text-xs">{doc.mimeType} — {formatSize(doc.sizeBytes)}</p>
|
|
90
|
+
</div>
|
|
91
|
+
)}
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
<div className="flex items-center justify-between text-xs text-muted-foreground border-t pt-2">
|
|
95
|
+
<span>{formatSize(doc.sizeBytes)}</span>
|
|
96
|
+
<span>Uploade par {doc.uploadedBy} le {doc.uploadedAt}</span>
|
|
97
|
+
</div>
|
|
98
|
+
</DialogContent>
|
|
99
|
+
</Dialog>
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export { DocumentPreviewPopup, formatSize }
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { cn } from "../../utils/cn"
|
|
5
|
+
|
|
6
|
+
export interface HourBalanceBadgeProps {
|
|
7
|
+
remainingMinutes: number
|
|
8
|
+
totalMinutes: number
|
|
9
|
+
className?: string
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function formatMinutes(minutes: number): string {
|
|
13
|
+
const abs = Math.abs(minutes)
|
|
14
|
+
const h = Math.floor(abs / 60)
|
|
15
|
+
const m = abs % 60
|
|
16
|
+
const sign = minutes < 0 ? "-" : ""
|
|
17
|
+
return m > 0 ? `${sign}${h}h${m.toString().padStart(2, "0")}` : `${sign}${h}h`
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function getColorClass(remainingMinutes: number): string {
|
|
21
|
+
if (remainingMinutes > 600) return "text-green-600 dark:text-green-400"
|
|
22
|
+
if (remainingMinutes > 300) return "text-orange-500 dark:text-orange-400"
|
|
23
|
+
return "text-red-600 dark:text-red-400 font-bold"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function HourBalanceBadge({ remainingMinutes, totalMinutes, className }: HourBalanceBadgeProps) {
|
|
27
|
+
return (
|
|
28
|
+
<span
|
|
29
|
+
className={cn(
|
|
30
|
+
"inline-flex items-center gap-0.5 text-sm tabular-nums",
|
|
31
|
+
getColorClass(remainingMinutes),
|
|
32
|
+
className,
|
|
33
|
+
)}
|
|
34
|
+
aria-label={`${formatMinutes(remainingMinutes)} restantes sur ${formatMinutes(totalMinutes)} total`}
|
|
35
|
+
>
|
|
36
|
+
<span>{formatMinutes(remainingMinutes)}</span>
|
|
37
|
+
<span className="text-muted-foreground font-normal">/</span>
|
|
38
|
+
<span className="text-muted-foreground font-normal">{formatMinutes(totalMinutes)}</span>
|
|
39
|
+
</span>
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { HourBalanceBadge, formatMinutes }
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { formatMinutes } from "../waka-hour-balance-badge"
|
|
5
|
+
|
|
6
|
+
export interface HourConsumption {
|
|
7
|
+
date: string
|
|
8
|
+
consultant: string
|
|
9
|
+
reason: string
|
|
10
|
+
stepName?: string
|
|
11
|
+
minutes: number
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface HourConsumptionTableProps {
|
|
15
|
+
consumptions: HourConsumption[]
|
|
16
|
+
page: number
|
|
17
|
+
totalPages: number
|
|
18
|
+
onPageChange: (page: number) => void
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function HourConsumptionTable({ consumptions, page, totalPages, onPageChange }: HourConsumptionTableProps) {
|
|
22
|
+
return (
|
|
23
|
+
<div className="space-y-2">
|
|
24
|
+
<table className="w-full text-sm">
|
|
25
|
+
<thead>
|
|
26
|
+
<tr className="border-b text-xs text-muted-foreground">
|
|
27
|
+
<th className="text-left p-2">Date</th>
|
|
28
|
+
<th className="text-left p-2">Consultant</th>
|
|
29
|
+
<th className="text-left p-2">Motif</th>
|
|
30
|
+
<th className="text-left p-2">Etape</th>
|
|
31
|
+
<th className="text-right p-2">Duree</th>
|
|
32
|
+
</tr>
|
|
33
|
+
</thead>
|
|
34
|
+
<tbody>
|
|
35
|
+
{consumptions.map((c, i) => (
|
|
36
|
+
<tr key={i} className="border-b hover:bg-muted/30">
|
|
37
|
+
<td className="p-2 text-xs">{c.date}</td>
|
|
38
|
+
<td className="p-2">{c.consultant}</td>
|
|
39
|
+
<td className="p-2 truncate max-w-[200px]">{c.reason}</td>
|
|
40
|
+
<td className="p-2 text-xs text-muted-foreground">{c.stepName ?? "—"}</td>
|
|
41
|
+
<td className="p-2 text-right tabular-nums font-medium">{formatMinutes(c.minutes)}</td>
|
|
42
|
+
</tr>
|
|
43
|
+
))}
|
|
44
|
+
{consumptions.length === 0 && (
|
|
45
|
+
<tr><td colSpan={5} className="p-4 text-center text-muted-foreground">Aucune consommation</td></tr>
|
|
46
|
+
)}
|
|
47
|
+
</tbody>
|
|
48
|
+
</table>
|
|
49
|
+
{totalPages > 1 && (
|
|
50
|
+
<div className="flex items-center justify-center gap-2">
|
|
51
|
+
<button
|
|
52
|
+
onClick={() => onPageChange(page - 1)}
|
|
53
|
+
disabled={page <= 1}
|
|
54
|
+
className="rounded border px-2 py-1 text-xs disabled:opacity-50 hover:bg-accent"
|
|
55
|
+
>
|
|
56
|
+
Precedent
|
|
57
|
+
</button>
|
|
58
|
+
<span className="text-xs text-muted-foreground">{page}/{totalPages}</span>
|
|
59
|
+
<button
|
|
60
|
+
onClick={() => onPageChange(page + 1)}
|
|
61
|
+
disabled={page >= totalPages}
|
|
62
|
+
className="rounded border px-2 py-1 text-xs disabled:opacity-50 hover:bg-accent"
|
|
63
|
+
>
|
|
64
|
+
Suivant
|
|
65
|
+
</button>
|
|
66
|
+
</div>
|
|
67
|
+
)}
|
|
68
|
+
</div>
|
|
69
|
+
)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export { HourConsumptionTable }
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "../dialog"
|
|
5
|
+
|
|
6
|
+
export interface HourPackDialogProps {
|
|
7
|
+
open: boolean
|
|
8
|
+
onOpenChange: (open: boolean) => void
|
|
9
|
+
onSubmit: (hours: number, comment: string) => void
|
|
10
|
+
isLoading?: boolean
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function HourPackDialog({ open, onOpenChange, onSubmit, isLoading }: HourPackDialogProps) {
|
|
14
|
+
const [hours, setHours] = React.useState(25)
|
|
15
|
+
const [comment, setComment] = React.useState("")
|
|
16
|
+
|
|
17
|
+
const handleSubmit = (e: React.FormEvent) => {
|
|
18
|
+
e.preventDefault()
|
|
19
|
+
if (hours < 1 || comment.trim().length < 10) return
|
|
20
|
+
onSubmit(hours, comment.trim())
|
|
21
|
+
setHours(25)
|
|
22
|
+
setComment("")
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
27
|
+
<DialogContent className="sm:max-w-md">
|
|
28
|
+
<DialogHeader>
|
|
29
|
+
<DialogTitle>Ajouter un pack d'heures</DialogTitle>
|
|
30
|
+
</DialogHeader>
|
|
31
|
+
<form onSubmit={handleSubmit} className="space-y-4">
|
|
32
|
+
<div>
|
|
33
|
+
<label className="text-sm font-medium">Nombre d'heures</label>
|
|
34
|
+
<input
|
|
35
|
+
type="number"
|
|
36
|
+
min={1}
|
|
37
|
+
value={hours}
|
|
38
|
+
onChange={(e) => setHours(Math.max(1, parseInt(e.target.value) || 1))}
|
|
39
|
+
className="mt-1 w-full rounded-md border bg-background px-3 py-2 text-sm"
|
|
40
|
+
/>
|
|
41
|
+
</div>
|
|
42
|
+
<div>
|
|
43
|
+
<label className="text-sm font-medium">Commentaire (obligatoire, min 10 chars)</label>
|
|
44
|
+
<textarea
|
|
45
|
+
value={comment}
|
|
46
|
+
onChange={(e) => setComment(e.target.value)}
|
|
47
|
+
placeholder="Ex: Commande initiale Biped du 30 mars 2026"
|
|
48
|
+
className="mt-1 w-full min-h-[80px] rounded-md border bg-background px-3 py-2 text-sm resize-none"
|
|
49
|
+
/>
|
|
50
|
+
{comment.length > 0 && comment.length < 10 && (
|
|
51
|
+
<p className="text-xs text-red-500 mt-1">{10 - comment.length} caracteres restants</p>
|
|
52
|
+
)}
|
|
53
|
+
</div>
|
|
54
|
+
<DialogFooter>
|
|
55
|
+
<button type="button" onClick={() => onOpenChange(false)} className="rounded-md border px-4 py-2 text-sm hover:bg-accent">
|
|
56
|
+
Annuler
|
|
57
|
+
</button>
|
|
58
|
+
<button
|
|
59
|
+
type="submit"
|
|
60
|
+
disabled={hours < 1 || comment.trim().length < 10 || isLoading}
|
|
61
|
+
className="rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50"
|
|
62
|
+
>
|
|
63
|
+
Ajouter
|
|
64
|
+
</button>
|
|
65
|
+
</DialogFooter>
|
|
66
|
+
</form>
|
|
67
|
+
</DialogContent>
|
|
68
|
+
</Dialog>
|
|
69
|
+
)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export { HourPackDialog }
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { cn } from "../../utils/cn"
|
|
5
|
+
import { HourBalanceBadge, formatMinutes } from "../waka-hour-balance-badge"
|
|
6
|
+
|
|
7
|
+
export interface ProjectStatsHeaderProps {
|
|
8
|
+
stats: {
|
|
9
|
+
ppMinutes: number
|
|
10
|
+
wakaMinutes: number
|
|
11
|
+
billableMinutes: number
|
|
12
|
+
billableTotalMinutes: number
|
|
13
|
+
breakdown?: { role: string; minutes: number }[]
|
|
14
|
+
}
|
|
15
|
+
onExpand?: (category: "pp" | "waka" | "billable") => void
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function StatPill({
|
|
19
|
+
label, value, colorClass, onClick,
|
|
20
|
+
}: {
|
|
21
|
+
label: string; value: React.ReactNode; colorClass: string; onClick?: () => void
|
|
22
|
+
}) {
|
|
23
|
+
return (
|
|
24
|
+
<button
|
|
25
|
+
onClick={onClick}
|
|
26
|
+
className={cn(
|
|
27
|
+
"inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-medium transition-colors",
|
|
28
|
+
"hover:bg-accent",
|
|
29
|
+
colorClass,
|
|
30
|
+
)}
|
|
31
|
+
>
|
|
32
|
+
<span>{label}</span>
|
|
33
|
+
<span className="font-bold tabular-nums">{value}</span>
|
|
34
|
+
</button>
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function ProjectStatsHeader({ stats, onExpand }: ProjectStatsHeaderProps) {
|
|
39
|
+
return (
|
|
40
|
+
<div className="flex items-center gap-2 flex-wrap">
|
|
41
|
+
<StatPill
|
|
42
|
+
label="PP"
|
|
43
|
+
value={formatMinutes(stats.ppMinutes)}
|
|
44
|
+
colorClass="border-emerald-200 text-emerald-700 dark:text-emerald-400"
|
|
45
|
+
onClick={() => onExpand?.("pp")}
|
|
46
|
+
/>
|
|
47
|
+
<StatPill
|
|
48
|
+
label="Waka"
|
|
49
|
+
value={formatMinutes(stats.wakaMinutes)}
|
|
50
|
+
colorClass="border-blue-200 text-blue-700 dark:text-blue-400"
|
|
51
|
+
onClick={() => onExpand?.("waka")}
|
|
52
|
+
/>
|
|
53
|
+
<StatPill
|
|
54
|
+
label="Facturables"
|
|
55
|
+
value={
|
|
56
|
+
<HourBalanceBadge
|
|
57
|
+
remainingMinutes={stats.billableTotalMinutes - stats.billableMinutes}
|
|
58
|
+
totalMinutes={stats.billableTotalMinutes}
|
|
59
|
+
className="text-xs"
|
|
60
|
+
/>
|
|
61
|
+
}
|
|
62
|
+
colorClass="border-amber-200"
|
|
63
|
+
onClick={() => onExpand?.("billable")}
|
|
64
|
+
/>
|
|
65
|
+
</div>
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export { ProjectStatsHeader }
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { cn } from "../../utils/cn"
|
|
5
|
+
import { HoverCard, HoverCardContent, HoverCardTrigger } from "../hover-card"
|
|
6
|
+
|
|
7
|
+
export interface RecentComment {
|
|
8
|
+
author: string
|
|
9
|
+
content: string
|
|
10
|
+
date: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface StepCommentBubbleProps {
|
|
14
|
+
count: number
|
|
15
|
+
recentComments?: RecentComment[]
|
|
16
|
+
onClick: () => void
|
|
17
|
+
className?: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function StepCommentBubble({ count, recentComments, onClick, className }: StepCommentBubbleProps) {
|
|
21
|
+
const hasComments = count > 0
|
|
22
|
+
|
|
23
|
+
const button = (
|
|
24
|
+
<button
|
|
25
|
+
onClick={onClick}
|
|
26
|
+
className={cn(
|
|
27
|
+
"relative inline-flex items-center justify-center h-8 w-8 rounded-full transition-colors",
|
|
28
|
+
hasComments
|
|
29
|
+
? "bg-blue-100 text-blue-600 hover:bg-blue-200 dark:bg-blue-900/30 dark:text-blue-400"
|
|
30
|
+
: "bg-muted text-muted-foreground hover:bg-accent",
|
|
31
|
+
className,
|
|
32
|
+
)}
|
|
33
|
+
aria-label={`${count} commentaire${count !== 1 ? "s" : ""}`}
|
|
34
|
+
>
|
|
35
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M7.9 20A9 9 0 1 0 4 16.1L2 22Z"/></svg>
|
|
36
|
+
{hasComments && (
|
|
37
|
+
<span className="absolute -top-1 -right-1 flex h-4 w-4 items-center justify-center rounded-full bg-blue-600 text-[10px] font-bold text-white">
|
|
38
|
+
{count > 9 ? "9+" : count}
|
|
39
|
+
</span>
|
|
40
|
+
)}
|
|
41
|
+
</button>
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
if (!recentComments?.length) return button
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<HoverCard openDelay={200}>
|
|
48
|
+
<HoverCardTrigger asChild>{button}</HoverCardTrigger>
|
|
49
|
+
<HoverCardContent className="w-72 p-3" side="top">
|
|
50
|
+
<div className="space-y-2">
|
|
51
|
+
{recentComments.slice(0, 3).map((c, i) => (
|
|
52
|
+
<div key={i} className="text-xs">
|
|
53
|
+
<div className="flex justify-between text-muted-foreground">
|
|
54
|
+
<span className="font-medium">{c.author}</span>
|
|
55
|
+
<span>{c.date}</span>
|
|
56
|
+
</div>
|
|
57
|
+
<p className="line-clamp-2 mt-0.5">{c.content}</p>
|
|
58
|
+
</div>
|
|
59
|
+
))}
|
|
60
|
+
{count > 3 && (
|
|
61
|
+
<p className="text-xs text-muted-foreground text-center">
|
|
62
|
+
+{count - 3} autre{count - 3 > 1 ? "s" : ""}
|
|
63
|
+
</p>
|
|
64
|
+
)}
|
|
65
|
+
</div>
|
|
66
|
+
</HoverCardContent>
|
|
67
|
+
</HoverCard>
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export { StepCommentBubble }
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { Sheet, SheetContent, SheetHeader, SheetTitle } from "../sheet"
|
|
5
|
+
import { ActorBadge } from "../waka-actor-badge"
|
|
6
|
+
|
|
7
|
+
export interface StepComment {
|
|
8
|
+
id: string
|
|
9
|
+
authorName: string
|
|
10
|
+
authorRole: string
|
|
11
|
+
content: string
|
|
12
|
+
createdAt: string
|
|
13
|
+
isEdited: boolean
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface StepCommentPanelProps {
|
|
17
|
+
open: boolean
|
|
18
|
+
onOpenChange: (open: boolean) => void
|
|
19
|
+
comments: StepComment[]
|
|
20
|
+
onAdd: (content: string) => void
|
|
21
|
+
onEdit?: (id: string, content: string) => void
|
|
22
|
+
onDelete?: (id: string) => void
|
|
23
|
+
canEditDelete?: boolean
|
|
24
|
+
isLoading?: boolean
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function StepCommentPanel({
|
|
28
|
+
open, onOpenChange, comments, onAdd, onEdit, onDelete, canEditDelete, isLoading,
|
|
29
|
+
}: StepCommentPanelProps) {
|
|
30
|
+
const [draft, setDraft] = React.useState("")
|
|
31
|
+
|
|
32
|
+
const handleSubmit = (e: React.FormEvent) => {
|
|
33
|
+
e.preventDefault()
|
|
34
|
+
if (!draft.trim()) return
|
|
35
|
+
onAdd(draft.trim())
|
|
36
|
+
setDraft("")
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<Sheet open={open} onOpenChange={onOpenChange}>
|
|
41
|
+
<SheetContent className="flex flex-col w-full sm:max-w-md">
|
|
42
|
+
<SheetHeader>
|
|
43
|
+
<SheetTitle>Commentaires ({comments.length})</SheetTitle>
|
|
44
|
+
</SheetHeader>
|
|
45
|
+
|
|
46
|
+
<div className="flex-1 overflow-y-auto space-y-3 py-4">
|
|
47
|
+
{comments.length === 0 && (
|
|
48
|
+
<p className="text-sm text-muted-foreground text-center py-8">Aucun commentaire</p>
|
|
49
|
+
)}
|
|
50
|
+
{comments.map((c) => (
|
|
51
|
+
<div key={c.id} className="rounded-lg border p-3 space-y-1.5">
|
|
52
|
+
<div className="flex items-center justify-between">
|
|
53
|
+
<ActorBadge role={c.authorRole} name={c.authorName} />
|
|
54
|
+
<span className="text-xs text-muted-foreground">{c.createdAt}</span>
|
|
55
|
+
</div>
|
|
56
|
+
<p className="text-sm whitespace-pre-wrap">{c.content}</p>
|
|
57
|
+
<div className="flex items-center gap-2">
|
|
58
|
+
{c.isEdited && <span className="text-xs text-muted-foreground italic">(modifie)</span>}
|
|
59
|
+
{canEditDelete && onEdit && (
|
|
60
|
+
<button
|
|
61
|
+
className="text-xs text-blue-600 hover:underline"
|
|
62
|
+
onClick={() => {
|
|
63
|
+
const newContent = prompt("Modifier le commentaire:", c.content)
|
|
64
|
+
if (newContent && newContent !== c.content) onEdit(c.id, newContent)
|
|
65
|
+
}}
|
|
66
|
+
>
|
|
67
|
+
Modifier
|
|
68
|
+
</button>
|
|
69
|
+
)}
|
|
70
|
+
{canEditDelete && onDelete && (
|
|
71
|
+
<button
|
|
72
|
+
className="text-xs text-red-600 hover:underline"
|
|
73
|
+
onClick={() => {
|
|
74
|
+
if (confirm("Supprimer ce commentaire ?")) onDelete(c.id)
|
|
75
|
+
}}
|
|
76
|
+
>
|
|
77
|
+
Supprimer
|
|
78
|
+
</button>
|
|
79
|
+
)}
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
))}
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
<form onSubmit={handleSubmit} className="border-t pt-3 flex gap-2">
|
|
86
|
+
<textarea
|
|
87
|
+
value={draft}
|
|
88
|
+
onChange={(e) => setDraft(e.target.value)}
|
|
89
|
+
placeholder="Ajouter un commentaire..."
|
|
90
|
+
className="flex-1 min-h-[60px] rounded-md border bg-background px-3 py-2 text-sm resize-none focus:outline-none focus:ring-2 focus:ring-ring"
|
|
91
|
+
disabled={isLoading}
|
|
92
|
+
/>
|
|
93
|
+
<button
|
|
94
|
+
type="submit"
|
|
95
|
+
disabled={!draft.trim() || isLoading}
|
|
96
|
+
className="self-end rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50"
|
|
97
|
+
>
|
|
98
|
+
Envoyer
|
|
99
|
+
</button>
|
|
100
|
+
</form>
|
|
101
|
+
</SheetContent>
|
|
102
|
+
</Sheet>
|
|
103
|
+
)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export { StepCommentPanel }
|