@wakastellar/ui 3.2.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +95557 -98934
- 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 +101 -70
- 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 +45 -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,120 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { cn } from "../../utils"
|
|
5
|
+
import { Copy, Check, FileCode } from "lucide-react"
|
|
6
|
+
import { Button } from "../button"
|
|
7
|
+
import Prism from "prismjs"
|
|
8
|
+
import "prismjs/components/prism-typescript"
|
|
9
|
+
import "prismjs/components/prism-javascript"
|
|
10
|
+
import "prismjs/components/prism-jsx"
|
|
11
|
+
import "prismjs/components/prism-tsx"
|
|
12
|
+
import "prismjs/components/prism-css"
|
|
13
|
+
import "prismjs/components/prism-json"
|
|
14
|
+
import "prismjs/components/prism-bash"
|
|
15
|
+
import "prismjs/components/prism-python"
|
|
16
|
+
import "prismjs/components/prism-go"
|
|
17
|
+
import "prismjs/components/prism-rust"
|
|
18
|
+
import "prismjs/components/prism-sql"
|
|
19
|
+
import "prismjs/components/prism-yaml"
|
|
20
|
+
import "prismjs/components/prism-docker"
|
|
21
|
+
import "prismjs/components/prism-markdown"
|
|
22
|
+
|
|
23
|
+
export interface WakaDocCodeBlockProps {
|
|
24
|
+
code: string
|
|
25
|
+
language?: string
|
|
26
|
+
filename?: string
|
|
27
|
+
showLineNumbers?: boolean
|
|
28
|
+
highlightLines?: number[]
|
|
29
|
+
className?: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function WakaDocCodeBlock({
|
|
33
|
+
code,
|
|
34
|
+
language,
|
|
35
|
+
filename,
|
|
36
|
+
showLineNumbers = false,
|
|
37
|
+
highlightLines = [],
|
|
38
|
+
className,
|
|
39
|
+
}: WakaDocCodeBlockProps) {
|
|
40
|
+
const [copied, setCopied] = React.useState(false)
|
|
41
|
+
|
|
42
|
+
const lines = code.split("\n")
|
|
43
|
+
|
|
44
|
+
const handleCopy = async () => {
|
|
45
|
+
try {
|
|
46
|
+
await navigator.clipboard.writeText(code)
|
|
47
|
+
setCopied(true)
|
|
48
|
+
setTimeout(() => setCopied(false), 2000)
|
|
49
|
+
} catch {}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<div
|
|
54
|
+
className={cn(
|
|
55
|
+
"group relative my-4 overflow-hidden rounded-lg",
|
|
56
|
+
"border border-border/50",
|
|
57
|
+
"bg-muted/30 backdrop-blur-sm",
|
|
58
|
+
className
|
|
59
|
+
)}
|
|
60
|
+
>
|
|
61
|
+
{/* Header */}
|
|
62
|
+
<div className="flex items-center justify-between border-b border-border/50 bg-muted/50 px-4 py-2">
|
|
63
|
+
<div className="flex items-center gap-2 text-xs text-muted-foreground">
|
|
64
|
+
<FileCode className="h-3.5 w-3.5" />
|
|
65
|
+
<span className="font-medium">
|
|
66
|
+
{filename || language?.toUpperCase() || "CODE"}
|
|
67
|
+
</span>
|
|
68
|
+
</div>
|
|
69
|
+
<Button
|
|
70
|
+
variant="ghost"
|
|
71
|
+
size="icon"
|
|
72
|
+
className="h-7 w-7 opacity-0 transition-opacity group-hover:opacity-100"
|
|
73
|
+
onClick={handleCopy}
|
|
74
|
+
>
|
|
75
|
+
{copied ? (
|
|
76
|
+
<Check className="h-3.5 w-3.5 text-emerald-500" />
|
|
77
|
+
) : (
|
|
78
|
+
<Copy className="h-3.5 w-3.5" />
|
|
79
|
+
)}
|
|
80
|
+
</Button>
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
{/* Code */}
|
|
84
|
+
<div className="overflow-x-auto">
|
|
85
|
+
<pre className="p-4 text-sm leading-relaxed">
|
|
86
|
+
<code>
|
|
87
|
+
{lines.map((line, i) => {
|
|
88
|
+
let highlightedLine = line
|
|
89
|
+
try {
|
|
90
|
+
if (language && Prism.languages[language]) {
|
|
91
|
+
highlightedLine = Prism.highlight(line, Prism.languages[language], language)
|
|
92
|
+
}
|
|
93
|
+
} catch {}
|
|
94
|
+
|
|
95
|
+
return (
|
|
96
|
+
<div
|
|
97
|
+
key={i}
|
|
98
|
+
className={cn(
|
|
99
|
+
"flex",
|
|
100
|
+
highlightLines.includes(i + 1) &&
|
|
101
|
+
"bg-primary/10 -mx-4 px-4 border-l-2 border-primary"
|
|
102
|
+
)}
|
|
103
|
+
>
|
|
104
|
+
{showLineNumbers && (
|
|
105
|
+
<span className="mr-4 inline-block w-8 select-none text-right text-muted-foreground/50">
|
|
106
|
+
{i + 1}
|
|
107
|
+
</span>
|
|
108
|
+
)}
|
|
109
|
+
<span
|
|
110
|
+
dangerouslySetInnerHTML={{ __html: highlightedLine }}
|
|
111
|
+
/>
|
|
112
|
+
</div>
|
|
113
|
+
)
|
|
114
|
+
})}
|
|
115
|
+
</code>
|
|
116
|
+
</pre>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
)
|
|
120
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import { WakaDocNav } from './index'
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
import { BookOpen, Zap, Settings, Code, Palette } from 'lucide-react'
|
|
5
|
+
|
|
6
|
+
const meta: Meta<typeof WakaDocNav> = {
|
|
7
|
+
title: 'Components/Documentation/WakaDocNav',
|
|
8
|
+
component: WakaDocNav,
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: 'centered',
|
|
11
|
+
docs: {
|
|
12
|
+
description: {
|
|
13
|
+
component: 'Tree navigation sidebar for documentation with collapsible sections, active state, and badges.',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
tags: ['autodocs'],
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default meta
|
|
21
|
+
type Story = StoryObj<typeof WakaDocNav>
|
|
22
|
+
|
|
23
|
+
const sampleItems = [
|
|
24
|
+
{
|
|
25
|
+
id: 'getting-started',
|
|
26
|
+
label: 'Getting Started',
|
|
27
|
+
icon: <Zap className="h-4 w-4" />,
|
|
28
|
+
children: [
|
|
29
|
+
{ id: 'installation', label: 'Installation' },
|
|
30
|
+
{ id: 'quick-start', label: 'Quick Start' },
|
|
31
|
+
{ id: 'configuration', label: 'Configuration' },
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'components',
|
|
36
|
+
label: 'Components',
|
|
37
|
+
icon: <Code className="h-4 w-4" />,
|
|
38
|
+
badge: '10',
|
|
39
|
+
children: [
|
|
40
|
+
{ id: 'doc-renderer', label: 'DocRenderer' },
|
|
41
|
+
{ id: 'doc-code-block', label: 'DocCodeBlock' },
|
|
42
|
+
{ id: 'doc-callout', label: 'DocCallout' },
|
|
43
|
+
{ id: 'doc-nav', label: 'DocNav' },
|
|
44
|
+
{ id: 'doc-search', label: 'DocSearch' },
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: 'theming',
|
|
49
|
+
label: 'Theming',
|
|
50
|
+
icon: <Palette className="h-4 w-4" />,
|
|
51
|
+
children: [
|
|
52
|
+
{ id: 'colors', label: 'Colors' },
|
|
53
|
+
{ id: 'dark-mode', label: 'Dark Mode' },
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 'api',
|
|
58
|
+
label: 'API Reference',
|
|
59
|
+
icon: <BookOpen className="h-4 w-4" />,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'settings',
|
|
63
|
+
label: 'Settings',
|
|
64
|
+
icon: <Settings className="h-4 w-4" />,
|
|
65
|
+
},
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
export const Default: Story = {
|
|
69
|
+
render: () => (
|
|
70
|
+
<div className="w-[260px] rounded-lg border p-2">
|
|
71
|
+
<WakaDocNav
|
|
72
|
+
items={sampleItems}
|
|
73
|
+
activeId="doc-callout"
|
|
74
|
+
onItemClick={(item) => console.log('Clicked:', item.id)}
|
|
75
|
+
/>
|
|
76
|
+
</div>
|
|
77
|
+
),
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export const FlatNavigation: Story = {
|
|
81
|
+
render: () => (
|
|
82
|
+
<div className="w-[260px] rounded-lg border p-2">
|
|
83
|
+
<WakaDocNav
|
|
84
|
+
items={[
|
|
85
|
+
{ id: 'intro', label: 'Introduction' },
|
|
86
|
+
{ id: 'install', label: 'Installation' },
|
|
87
|
+
{ id: 'usage', label: 'Usage' },
|
|
88
|
+
{ id: 'api', label: 'API Reference' },
|
|
89
|
+
{ id: 'changelog', label: 'Changelog', badge: 'New' },
|
|
90
|
+
]}
|
|
91
|
+
activeId="usage"
|
|
92
|
+
/>
|
|
93
|
+
</div>
|
|
94
|
+
),
|
|
95
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { cn } from "../../utils"
|
|
5
|
+
import { ChevronRight, FileText, FolderOpen, Folder } from "lucide-react"
|
|
6
|
+
|
|
7
|
+
export interface DocNavItem {
|
|
8
|
+
id: string
|
|
9
|
+
label: string
|
|
10
|
+
href?: string
|
|
11
|
+
icon?: React.ReactNode
|
|
12
|
+
children?: DocNavItem[]
|
|
13
|
+
badge?: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface WakaDocNavProps {
|
|
17
|
+
items: DocNavItem[]
|
|
18
|
+
activeId?: string
|
|
19
|
+
onItemClick?: (item: DocNavItem) => void
|
|
20
|
+
className?: string
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function WakaDocNav({ items, activeId, onItemClick, className }: WakaDocNavProps) {
|
|
24
|
+
return (
|
|
25
|
+
<nav className={cn("space-y-1", className)}>
|
|
26
|
+
{items.map((item) => (
|
|
27
|
+
<NavItem
|
|
28
|
+
key={item.id}
|
|
29
|
+
item={item}
|
|
30
|
+
activeId={activeId}
|
|
31
|
+
onItemClick={onItemClick}
|
|
32
|
+
depth={0}
|
|
33
|
+
/>
|
|
34
|
+
))}
|
|
35
|
+
</nav>
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function NavItem({
|
|
40
|
+
item,
|
|
41
|
+
activeId,
|
|
42
|
+
onItemClick,
|
|
43
|
+
depth,
|
|
44
|
+
}: {
|
|
45
|
+
item: DocNavItem
|
|
46
|
+
activeId?: string
|
|
47
|
+
onItemClick?: (item: DocNavItem) => void
|
|
48
|
+
depth: number
|
|
49
|
+
}) {
|
|
50
|
+
const hasChildren = item.children && item.children.length > 0
|
|
51
|
+
const isActive = activeId === item.id
|
|
52
|
+
const isParentOfActive = hasChildren && containsActive(item.children!, activeId)
|
|
53
|
+
const [expanded, setExpanded] = React.useState(isParentOfActive)
|
|
54
|
+
|
|
55
|
+
React.useEffect(() => {
|
|
56
|
+
if (isParentOfActive) setExpanded(true)
|
|
57
|
+
}, [isParentOfActive])
|
|
58
|
+
|
|
59
|
+
const handleClick = () => {
|
|
60
|
+
if (hasChildren) {
|
|
61
|
+
setExpanded((prev) => !prev)
|
|
62
|
+
}
|
|
63
|
+
onItemClick?.(item)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const DefaultIcon = hasChildren
|
|
67
|
+
? expanded ? FolderOpen : Folder
|
|
68
|
+
: FileText
|
|
69
|
+
|
|
70
|
+
return (
|
|
71
|
+
<div>
|
|
72
|
+
<button
|
|
73
|
+
onClick={handleClick}
|
|
74
|
+
className={cn(
|
|
75
|
+
"group flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm transition-all duration-200",
|
|
76
|
+
isActive
|
|
77
|
+
? "bg-primary/10 font-medium text-primary"
|
|
78
|
+
: "text-muted-foreground hover:bg-muted/50 hover:text-foreground"
|
|
79
|
+
)}
|
|
80
|
+
style={{ paddingLeft: `${depth * 12 + 12}px` }}
|
|
81
|
+
>
|
|
82
|
+
{hasChildren && (
|
|
83
|
+
<ChevronRight
|
|
84
|
+
className={cn(
|
|
85
|
+
"h-3.5 w-3.5 shrink-0 transition-transform duration-200",
|
|
86
|
+
expanded && "rotate-90"
|
|
87
|
+
)}
|
|
88
|
+
/>
|
|
89
|
+
)}
|
|
90
|
+
<span className="shrink-0">
|
|
91
|
+
{item.icon || <DefaultIcon className="h-4 w-4" />}
|
|
92
|
+
</span>
|
|
93
|
+
<span className="truncate">{item.label}</span>
|
|
94
|
+
{item.badge && (
|
|
95
|
+
<span className="ml-auto shrink-0 rounded-full bg-primary/10 px-2 py-0.5 text-xs font-medium text-primary">
|
|
96
|
+
{item.badge}
|
|
97
|
+
</span>
|
|
98
|
+
)}
|
|
99
|
+
</button>
|
|
100
|
+
|
|
101
|
+
{hasChildren && expanded && (
|
|
102
|
+
<div className="mt-0.5 space-y-0.5">
|
|
103
|
+
{item.children!.map((child) => (
|
|
104
|
+
<NavItem
|
|
105
|
+
key={child.id}
|
|
106
|
+
item={child}
|
|
107
|
+
activeId={activeId}
|
|
108
|
+
onItemClick={onItemClick}
|
|
109
|
+
depth={depth + 1}
|
|
110
|
+
/>
|
|
111
|
+
))}
|
|
112
|
+
</div>
|
|
113
|
+
)}
|
|
114
|
+
</div>
|
|
115
|
+
)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function containsActive(items: DocNavItem[], activeId?: string): boolean {
|
|
119
|
+
if (!activeId) return false
|
|
120
|
+
for (const item of items) {
|
|
121
|
+
if (item.id === activeId) return true
|
|
122
|
+
if (item.children && containsActive(item.children, activeId)) return true
|
|
123
|
+
}
|
|
124
|
+
return false
|
|
125
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import { WakaDocRenderer } from './index'
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof WakaDocRenderer> = {
|
|
6
|
+
title: 'Components/Documentation/WakaDocRenderer',
|
|
7
|
+
component: WakaDocRenderer,
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: 'padded',
|
|
10
|
+
docs: {
|
|
11
|
+
description: {
|
|
12
|
+
component: 'Renders markdown content as styled React components with syntax highlighting, callouts, tables, and heading extraction for TOC.',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
tags: ['autodocs'],
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default meta
|
|
20
|
+
type Story = StoryObj<typeof WakaDocRenderer>
|
|
21
|
+
|
|
22
|
+
const fullMarkdown = `# WakaDoc Suite
|
|
23
|
+
|
|
24
|
+
Welcome to the **WakaDoc Suite** documentation. This library provides a complete set of components for building beautiful documentation pages.
|
|
25
|
+
|
|
26
|
+
## Getting Started
|
|
27
|
+
|
|
28
|
+
### Installation
|
|
29
|
+
|
|
30
|
+
Install the package and its peer dependencies:
|
|
31
|
+
|
|
32
|
+
\`\`\`bash
|
|
33
|
+
pnpm add @wakastellar/ui react-markdown remark-gfm rehype-slug rehype-raw
|
|
34
|
+
\`\`\`
|
|
35
|
+
|
|
36
|
+
### Quick Start
|
|
37
|
+
|
|
38
|
+
Import and use the components:
|
|
39
|
+
|
|
40
|
+
\`\`\`typescript
|
|
41
|
+
import { WakaDocRenderer } from "@wakastellar/ui/doc"
|
|
42
|
+
|
|
43
|
+
export function DocsPage({ content }: { content: string }) {
|
|
44
|
+
return <WakaDocRenderer content={content} />
|
|
45
|
+
}
|
|
46
|
+
\`\`\`
|
|
47
|
+
|
|
48
|
+
## Features
|
|
49
|
+
|
|
50
|
+
| Feature | Description | Status |
|
|
51
|
+
|---------|-------------|--------|
|
|
52
|
+
| Markdown Rendering | Full GFM support | Stable |
|
|
53
|
+
| Syntax Highlighting | PrismJS with 14+ languages | Stable |
|
|
54
|
+
| Callouts | Info, warning, danger, tip blocks | Stable |
|
|
55
|
+
| Table of Contents | Auto-generated with scroll spy | Stable |
|
|
56
|
+
| Search | Full-text client-side search | Stable |
|
|
57
|
+
|
|
58
|
+
## Components
|
|
59
|
+
|
|
60
|
+
### WakaDocRenderer
|
|
61
|
+
|
|
62
|
+
The core rendering component. It converts markdown to React elements with custom styling.
|
|
63
|
+
|
|
64
|
+
Inline code looks like \`this\` and links work like [this](https://example.com).
|
|
65
|
+
|
|
66
|
+
> [!info]
|
|
67
|
+
> This is an info callout using the GitHub-style syntax.
|
|
68
|
+
|
|
69
|
+
> [!warning]
|
|
70
|
+
> Be careful with this feature, it requires additional configuration.
|
|
71
|
+
|
|
72
|
+
> [!tip]
|
|
73
|
+
> You can customize the appearance using Tailwind classes.
|
|
74
|
+
|
|
75
|
+
### Lists
|
|
76
|
+
|
|
77
|
+
Unordered list:
|
|
78
|
+
- First item
|
|
79
|
+
- Second item with **bold** text
|
|
80
|
+
- Third item with \`inline code\`
|
|
81
|
+
|
|
82
|
+
Ordered list:
|
|
83
|
+
1. Step one
|
|
84
|
+
2. Step two
|
|
85
|
+
3. Step three
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## API Reference
|
|
90
|
+
|
|
91
|
+
### Props
|
|
92
|
+
|
|
93
|
+
The renderer accepts the following props:
|
|
94
|
+
|
|
95
|
+
\`\`\`typescript
|
|
96
|
+
interface WakaDocRendererProps {
|
|
97
|
+
content: string
|
|
98
|
+
onHeadingsExtracted?: (headings: TocItem[]) => void
|
|
99
|
+
className?: string
|
|
100
|
+
}
|
|
101
|
+
\`\`\`
|
|
102
|
+
|
|
103
|
+
> This is a regular blockquote, not a callout.
|
|
104
|
+
|
|
105
|
+
That's it! Happy documenting.
|
|
106
|
+
`
|
|
107
|
+
|
|
108
|
+
export const Default: Story = {
|
|
109
|
+
render: () => (
|
|
110
|
+
<div className="mx-auto max-w-3xl">
|
|
111
|
+
<WakaDocRenderer content={fullMarkdown} onHeadingsExtracted={(h) => console.log('Headings:', h)} />
|
|
112
|
+
</div>
|
|
113
|
+
),
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export const SimpleContent: Story = {
|
|
117
|
+
args: {
|
|
118
|
+
content: '# Hello World\n\nA simple paragraph with **bold** and *italic* text.\n\n## Section\n\nMore content here.',
|
|
119
|
+
},
|
|
120
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { cn } from "../../utils"
|
|
5
|
+
import { WakaDocCodeBlock } from "../waka-doc-code-block"
|
|
6
|
+
import { WakaDocCallout, type CalloutType } from "../waka-doc-callout"
|
|
7
|
+
import type { TocItem } from "../waka-doc-toc"
|
|
8
|
+
|
|
9
|
+
export interface WakaDocRendererProps {
|
|
10
|
+
content: string
|
|
11
|
+
onHeadingsExtracted?: (headings: TocItem[]) => void
|
|
12
|
+
className?: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface MarkdownModule {
|
|
16
|
+
ReactMarkdown: React.ComponentType<{
|
|
17
|
+
children: string
|
|
18
|
+
remarkPlugins?: unknown[]
|
|
19
|
+
rehypePlugins?: unknown[]
|
|
20
|
+
components?: Record<string, React.ComponentType<Record<string, unknown>>>
|
|
21
|
+
}>
|
|
22
|
+
remarkGfm: unknown
|
|
23
|
+
rehypeSlug: unknown
|
|
24
|
+
rehypeRaw: unknown
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function WakaDocRenderer({ content, onHeadingsExtracted, className }: WakaDocRendererProps) {
|
|
28
|
+
const [mdModule, setMdModule] = React.useState<MarkdownModule | null>(null)
|
|
29
|
+
const [loadError, setLoadError] = React.useState(false)
|
|
30
|
+
|
|
31
|
+
React.useEffect(() => {
|
|
32
|
+
const load = async () => {
|
|
33
|
+
try {
|
|
34
|
+
const [rm, gfm, slug, raw] = await Promise.all([
|
|
35
|
+
import("react-markdown"),
|
|
36
|
+
import("remark-gfm"),
|
|
37
|
+
import("rehype-slug"),
|
|
38
|
+
import("rehype-raw"),
|
|
39
|
+
])
|
|
40
|
+
setMdModule({
|
|
41
|
+
ReactMarkdown: rm.default,
|
|
42
|
+
remarkGfm: gfm.default || gfm,
|
|
43
|
+
rehypeSlug: slug.default || slug,
|
|
44
|
+
rehypeRaw: raw.default || raw,
|
|
45
|
+
})
|
|
46
|
+
} catch {
|
|
47
|
+
setLoadError(true)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
load()
|
|
51
|
+
}, [])
|
|
52
|
+
|
|
53
|
+
// Extraire les headings du markdown
|
|
54
|
+
React.useEffect(() => {
|
|
55
|
+
if (!onHeadingsExtracted) return
|
|
56
|
+
const headings: TocItem[] = []
|
|
57
|
+
const lines = content.split("\n")
|
|
58
|
+
for (const line of lines) {
|
|
59
|
+
const match = line.match(/^(#{2,4})\s+(.+)$/)
|
|
60
|
+
if (match) {
|
|
61
|
+
const level = match[1].length
|
|
62
|
+
const text = match[2].replace(/[`*_~]/g, "")
|
|
63
|
+
const id = text
|
|
64
|
+
.toLowerCase()
|
|
65
|
+
.replace(/[^\w\s-]/g, "")
|
|
66
|
+
.replace(/\s+/g, "-")
|
|
67
|
+
headings.push({ id, text, level })
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
onHeadingsExtracted(headings)
|
|
71
|
+
}, [content, onHeadingsExtracted])
|
|
72
|
+
|
|
73
|
+
if (loadError) {
|
|
74
|
+
return (
|
|
75
|
+
<div className={cn("whitespace-pre-wrap font-mono text-sm", className)}>
|
|
76
|
+
{content}
|
|
77
|
+
</div>
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!mdModule) {
|
|
82
|
+
return (
|
|
83
|
+
<div className={cn("animate-pulse space-y-4", className)}>
|
|
84
|
+
<div className="h-8 w-3/4 rounded bg-muted" />
|
|
85
|
+
<div className="h-4 w-full rounded bg-muted" />
|
|
86
|
+
<div className="h-4 w-5/6 rounded bg-muted" />
|
|
87
|
+
<div className="h-4 w-4/5 rounded bg-muted" />
|
|
88
|
+
</div>
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const { ReactMarkdown, remarkGfm, rehypeSlug, rehypeRaw } = mdModule
|
|
93
|
+
|
|
94
|
+
return (
|
|
95
|
+
<div className={cn("waka-doc-renderer", className)}>
|
|
96
|
+
<ReactMarkdown
|
|
97
|
+
remarkPlugins={[remarkGfm]}
|
|
98
|
+
rehypePlugins={[rehypeSlug, rehypeRaw]}
|
|
99
|
+
components={{
|
|
100
|
+
h1: ({ children, ...props }: Record<string, unknown>) => (
|
|
101
|
+
<h1 className="mb-4 mt-8 scroll-mt-24 text-3xl font-bold tracking-tight first:mt-0" {...props}>
|
|
102
|
+
{children as React.ReactNode}
|
|
103
|
+
</h1>
|
|
104
|
+
),
|
|
105
|
+
h2: ({ children, ...props }: Record<string, unknown>) => (
|
|
106
|
+
<h2 className="mb-3 mt-8 scroll-mt-24 border-b border-border/30 pb-2 text-2xl font-semibold tracking-tight first:mt-0" {...props}>
|
|
107
|
+
{children as React.ReactNode}
|
|
108
|
+
</h2>
|
|
109
|
+
),
|
|
110
|
+
h3: ({ children, ...props }: Record<string, unknown>) => (
|
|
111
|
+
<h3 className="mb-2 mt-6 scroll-mt-24 text-xl font-semibold tracking-tight" {...props}>
|
|
112
|
+
{children as React.ReactNode}
|
|
113
|
+
</h3>
|
|
114
|
+
),
|
|
115
|
+
h4: ({ children, ...props }: Record<string, unknown>) => (
|
|
116
|
+
<h4 className="mb-2 mt-4 scroll-mt-24 text-lg font-medium" {...props}>
|
|
117
|
+
{children as React.ReactNode}
|
|
118
|
+
</h4>
|
|
119
|
+
),
|
|
120
|
+
p: ({ children }: Record<string, unknown>) => (
|
|
121
|
+
<p className="mb-4 leading-7 text-foreground/80">{children as React.ReactNode}</p>
|
|
122
|
+
),
|
|
123
|
+
a: ({ href, children }: Record<string, unknown>) => (
|
|
124
|
+
<a
|
|
125
|
+
href={href as string}
|
|
126
|
+
target={(href as string)?.startsWith("http") ? "_blank" : undefined}
|
|
127
|
+
rel={(href as string)?.startsWith("http") ? "noopener noreferrer" : undefined}
|
|
128
|
+
className="font-medium text-primary underline decoration-primary/30 underline-offset-4 transition-colors hover:decoration-primary"
|
|
129
|
+
>
|
|
130
|
+
{children as React.ReactNode}
|
|
131
|
+
</a>
|
|
132
|
+
),
|
|
133
|
+
pre: ({ children }: Record<string, unknown>) => {
|
|
134
|
+
const child = children as React.ReactElement<{ className?: string; children?: string }>
|
|
135
|
+
if (child?.props) {
|
|
136
|
+
const lang = child.props.className?.replace("language-", "") || ""
|
|
137
|
+
const code = typeof child.props.children === "string"
|
|
138
|
+
? child.props.children.replace(/\n$/, "")
|
|
139
|
+
: ""
|
|
140
|
+
return <WakaDocCodeBlock code={code} language={lang} showLineNumbers />
|
|
141
|
+
}
|
|
142
|
+
return <pre>{children as React.ReactNode}</pre>
|
|
143
|
+
},
|
|
144
|
+
code: ({ children, className: codeClassName }: Record<string, unknown>) => {
|
|
145
|
+
if (codeClassName) return <code className={codeClassName as string}>{children as React.ReactNode}</code>
|
|
146
|
+
return (
|
|
147
|
+
<code className="rounded bg-muted px-1.5 py-0.5 text-sm font-mono text-primary">
|
|
148
|
+
{children as React.ReactNode}
|
|
149
|
+
</code>
|
|
150
|
+
)
|
|
151
|
+
},
|
|
152
|
+
blockquote: ({ children }: Record<string, unknown>) => {
|
|
153
|
+
const text = extractText(children as React.ReactNode)
|
|
154
|
+
const calloutMatch = text.match(/^\[!(info|warning|danger|tip)\]\s*\n?(.*)$/s)
|
|
155
|
+
if (calloutMatch) {
|
|
156
|
+
const calloutType = calloutMatch[1] as CalloutType
|
|
157
|
+
const body = calloutMatch[2]
|
|
158
|
+
return <WakaDocCallout type={calloutType}><p>{body}</p></WakaDocCallout>
|
|
159
|
+
}
|
|
160
|
+
return (
|
|
161
|
+
<blockquote className="my-4 border-l-4 border-primary/30 bg-muted/20 py-1 pl-4 italic text-foreground/70">
|
|
162
|
+
{children as React.ReactNode}
|
|
163
|
+
</blockquote>
|
|
164
|
+
)
|
|
165
|
+
},
|
|
166
|
+
table: ({ children }: Record<string, unknown>) => (
|
|
167
|
+
<div className="my-4 overflow-x-auto rounded-lg border border-border/50">
|
|
168
|
+
<table className={cn(
|
|
169
|
+
"w-full text-sm",
|
|
170
|
+
"[&_thead]:bg-muted/50 [&_thead]:backdrop-blur-sm",
|
|
171
|
+
"[&_th]:px-4 [&_th]:py-3 [&_th]:text-left [&_th]:font-semibold [&_th]:text-foreground/80",
|
|
172
|
+
"[&_td]:px-4 [&_td]:py-3 [&_td]:text-foreground/70",
|
|
173
|
+
"[&_tr]:border-b [&_tr]:border-border/30 [&_tbody_tr:last-child]:border-0",
|
|
174
|
+
"[&_tbody_tr:nth-child(even)]:bg-muted/30",
|
|
175
|
+
"[&_tbody_tr]:transition-colors [&_tbody_tr:hover]:bg-muted/50"
|
|
176
|
+
)}>
|
|
177
|
+
{children as React.ReactNode}
|
|
178
|
+
</table>
|
|
179
|
+
</div>
|
|
180
|
+
),
|
|
181
|
+
ul: ({ children }: Record<string, unknown>) => (
|
|
182
|
+
<ul className="my-4 ml-6 list-disc space-y-2 text-foreground/80 marker:text-primary/50">
|
|
183
|
+
{children as React.ReactNode}
|
|
184
|
+
</ul>
|
|
185
|
+
),
|
|
186
|
+
ol: ({ children }: Record<string, unknown>) => (
|
|
187
|
+
<ol className="my-4 ml-6 list-decimal space-y-2 text-foreground/80 marker:text-primary/50">
|
|
188
|
+
{children as React.ReactNode}
|
|
189
|
+
</ol>
|
|
190
|
+
),
|
|
191
|
+
li: ({ children }: Record<string, unknown>) => (
|
|
192
|
+
<li className="leading-7">{children as React.ReactNode}</li>
|
|
193
|
+
),
|
|
194
|
+
hr: () => <hr className="my-8 border-border/50" />,
|
|
195
|
+
img: ({ src, alt }: Record<string, unknown>) => (
|
|
196
|
+
<img
|
|
197
|
+
src={src as string}
|
|
198
|
+
alt={(alt as string) || ""}
|
|
199
|
+
className="my-4 rounded-lg border border-border/50 shadow-sm"
|
|
200
|
+
/>
|
|
201
|
+
),
|
|
202
|
+
} as Record<string, React.ComponentType<Record<string, unknown>>>}
|
|
203
|
+
>
|
|
204
|
+
{content}
|
|
205
|
+
</ReactMarkdown>
|
|
206
|
+
</div>
|
|
207
|
+
)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function extractText(node: React.ReactNode): string {
|
|
211
|
+
if (typeof node === "string") return node
|
|
212
|
+
if (Array.isArray(node)) return node.map(extractText).join("")
|
|
213
|
+
if (React.isValidElement(node) && node.props) {
|
|
214
|
+
return extractText((node.props as { children?: React.ReactNode }).children)
|
|
215
|
+
}
|
|
216
|
+
return ""
|
|
217
|
+
}
|