@signalflare-ai/ui 0.5.0 → 1.0.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/CHANGELOG.md +117 -1
- package/ai/USAGE.md +64 -0
- package/ai/component-registry.json +492 -618
- package/ai/component-registry.md +167 -85
- package/ai/schemas.ts +545 -102
- package/bin/sf.js +2 -3
- package/dist/.build-complete +1 -1
- package/dist/ai/schemas.d.ts +1659 -5532
- package/dist/ai/schemas.d.ts.map +1 -1
- package/dist/{ai-actions-DG1dhDMP.js → ai-actions-DSVeQn4e.js} +1 -1
- package/dist/{ai-actions-DG1dhDMP.js.map → ai-actions-DSVeQn4e.js.map} +1 -1
- package/dist/{ai-agent-card-BbtL4NII.js → ai-agent-card-BXHwhWAU.js} +1 -1
- package/dist/{ai-agent-card-BbtL4NII.js.map → ai-agent-card-BXHwhWAU.js.map} +1 -1
- package/dist/{ai-approval-Mb7-BY6i.js → ai-approval-aa0qvjFN.js} +1 -1
- package/dist/{ai-approval-Mb7-BY6i.js.map → ai-approval-aa0qvjFN.js.map} +1 -1
- package/dist/{ai-code-block-BI_z0UVR.js → ai-code-block-BgtIxtZZ.js} +1 -1
- package/dist/{ai-code-block-BI_z0UVR.js.map → ai-code-block-BgtIxtZZ.js.map} +1 -1
- package/dist/{ai-conversation-DYtExcrw.js → ai-conversation-CArP7C8K.js} +1 -1
- package/dist/{ai-conversation-DYtExcrw.js.map → ai-conversation-CArP7C8K.js.map} +1 -1
- package/dist/{ai-info-banner-BpzauUAY.js → ai-info-banner-uFxHHwBA.js} +1 -1
- package/dist/{ai-info-banner-BpzauUAY.js.map → ai-info-banner-uFxHHwBA.js.map} +1 -1
- package/dist/{ai-message-CV8SBoHM.js → ai-message-BjnFznXy.js} +1 -1
- package/dist/{ai-message-CV8SBoHM.js.map → ai-message-BjnFznXy.js.map} +1 -1
- package/dist/{ai-mission-header-ByYkJ6YP.js → ai-mission-header-08__gULL.js} +1 -1
- package/dist/{ai-mission-header-ByYkJ6YP.js.map → ai-mission-header-08__gULL.js.map} +1 -1
- package/dist/ai-part-group-DBtgTgAn.js +277 -0
- package/dist/ai-part-group-DBtgTgAn.js.map +1 -0
- package/dist/ai-prompt-input-Dy1LfxPk.js +1541 -0
- package/dist/ai-prompt-input-Dy1LfxPk.js.map +1 -0
- package/dist/{ai-question-Dp1g9k2o.js → ai-question-CHHoDJMg.js} +1 -1
- package/dist/{ai-question-Dp1g9k2o.js.map → ai-question-CHHoDJMg.js.map} +1 -1
- package/dist/{ai-reasoning-UAmNx_LD.js → ai-reasoning-CnL6ZSr5.js} +84 -5
- package/dist/ai-reasoning-CnL6ZSr5.js.map +1 -0
- package/dist/{ai-response-BWoVsNQG.js → ai-response-BEUg3xvd.js} +13 -16
- package/dist/ai-response-BEUg3xvd.js.map +1 -0
- package/dist/{ai-shimmer-BpOmfonu.js → ai-shimmer-By5_L05p.js} +1 -1
- package/dist/{ai-shimmer-BpOmfonu.js.map → ai-shimmer-By5_L05p.js.map} +1 -1
- package/dist/{ai-status-badge-WhbKVeqn.js → ai-status-badge-BGYGWYF6.js} +1 -1
- package/dist/{ai-status-badge-WhbKVeqn.js.map → ai-status-badge-BGYGWYF6.js.map} +1 -1
- package/dist/{ai-streaming-text-ClL7FwvD.js → ai-streaming-text-CMfoThV0.js} +1 -1
- package/dist/{ai-streaming-text-ClL7FwvD.js.map → ai-streaming-text-CMfoThV0.js.map} +1 -1
- package/dist/{ai-subagent-BruGN1UE.js → ai-subagent-DcPRqkAA.js} +1 -1
- package/dist/{ai-subagent-BruGN1UE.js.map → ai-subagent-DcPRqkAA.js.map} +1 -1
- package/dist/{ai-suggestion-CNsCZj5P.js → ai-suggestion-MgeCg5Ar.js} +1 -1
- package/dist/{ai-suggestion-CNsCZj5P.js.map → ai-suggestion-MgeCg5Ar.js.map} +1 -1
- package/dist/{ai-task-list-B9CpMDYN.js → ai-task-list-Da9zIm00.js} +9 -12
- package/dist/ai-task-list-Da9zIm00.js.map +1 -0
- package/dist/{ai-timeline-Bb5ntsr3.js → ai-timeline-Cwu045IR.js} +1 -1
- package/dist/ai-timeline-Cwu045IR.js.map +1 -0
- package/dist/{ai-tool-BGH8nQ_D.js → ai-tool-Cn1O4xjP.js} +168 -11
- package/dist/ai-tool-Cn1O4xjP.js.map +1 -0
- package/dist/{ai-usage-bar-BI-p-JBk.js → ai-usage-bar-DjS12DMp.js} +1 -1
- package/dist/{ai-usage-bar-BI-p-JBk.js.map → ai-usage-bar-DjS12DMp.js.map} +1 -1
- package/dist/catalog.js +3 -3
- package/dist/catalog.js.map +1 -1
- package/dist/{chart-Bes4MN3C.js → chart-BK3sVPnD.js} +442 -248
- package/dist/chart-BK3sVPnD.js.map +1 -0
- package/dist/{checkbox-CPX7lBaU.js → checkbox-DYhUmZNw.js} +4 -4
- package/dist/checkbox-DYhUmZNw.js.map +1 -0
- package/dist/{clipboard-text-92YeCybc.js → clipboard-text-ssybngLw.js} +2 -2
- package/dist/{clipboard-text-92YeCybc.js.map → clipboard-text-ssybngLw.js.map} +1 -1
- package/dist/{code-DE1Yy1Cu.js → code-Cx-QSoOT.js} +2 -2
- package/dist/{code-DE1Yy1Cu.js.map → code-Cx-QSoOT.js.map} +1 -1
- package/dist/{combobox-B0bLdsX8.js → combobox-C0iW6a0r.js} +2 -2
- package/dist/{combobox-B0bLdsX8.js.map → combobox-C0iW6a0r.js.map} +1 -1
- package/dist/command-line/cli.js +22 -27
- package/dist/{command-palette-CBTY8EiF.js → command-palette-DGzioeki.js} +2 -2
- package/dist/command-palette-DGzioeki.js.map +1 -0
- package/dist/components/ai-actions.js +1 -1
- package/dist/components/ai-agent-card.js +1 -1
- package/dist/components/ai-approval.js +1 -1
- package/dist/components/ai-code-block.js +1 -1
- package/dist/components/ai-conversation.js +1 -1
- package/dist/components/ai-info-banner.js +1 -1
- package/dist/components/ai-message.js +1 -1
- package/dist/components/ai-mission-header.js +1 -1
- package/dist/components/ai-part-group.js +3 -0
- package/dist/components/ai-prompt-input.js +2 -2
- package/dist/components/ai-question.js +1 -1
- package/dist/components/ai-reasoning.js +1 -1
- package/dist/components/ai-response.js +1 -1
- package/dist/components/ai-shimmer.js +1 -1
- package/dist/components/ai-status-badge.js +1 -1
- package/dist/components/ai-streaming-text.js +1 -1
- package/dist/components/ai-subagent.js +1 -1
- package/dist/components/ai-suggestion.js +1 -1
- package/dist/components/ai-task-list.js +1 -1
- package/dist/components/ai-timeline.js +1 -1
- package/dist/components/ai-tool.js +1 -1
- package/dist/components/ai-usage-bar.js +1 -1
- package/dist/components/chart.js +3 -2
- package/dist/components/checkbox.js +1 -1
- package/dist/components/clipboard-text.js +1 -1
- package/dist/components/code.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/command-palette.js +1 -1
- package/dist/components/data-grid.js +1 -1
- package/dist/components/date-picker.js +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/filters.js +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/link.js +2 -2
- package/dist/components/link.js.map +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/radio.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/sensitive-input.js +1 -1
- package/dist/components/sidebar.js +1 -1
- package/dist/components/sparkline.js +3 -0
- package/dist/components/stat-card.js +3 -0
- package/dist/components/table.js +1 -1
- package/dist/components/text-roll.js +3 -0
- package/dist/components/theme-toggle.js +1 -1
- package/dist/components/use-agent-harness.js +1 -1
- package/dist/{data-grid-UJ9ja5cu.js → data-grid-CG76N_hK.js} +6 -6
- package/dist/data-grid-CG76N_hK.js.map +1 -0
- package/dist/{date-picker-ebekkC3R.js → date-picker-Dqg9L4xu.js} +2 -2
- package/dist/{date-picker-ebekkC3R.js.map → date-picker-Dqg9L4xu.js.map} +1 -1
- package/dist/{dist-BNlyONdD.js → dist-1-gcEL2L.js} +224 -135
- package/dist/dist-1-gcEL2L.js.map +1 -0
- package/dist/{dropdown-J5T4pHaR.js → dropdown-qnEYRFXZ.js} +2 -2
- package/dist/{dropdown-J5T4pHaR.js.map → dropdown-qnEYRFXZ.js.map} +1 -1
- package/dist/echart-DURZEyai.js +314 -0
- package/dist/echart-DURZEyai.js.map +1 -0
- package/dist/{filters-BdBogf7D.js → filters-Bw_U6ZTx.js} +5 -5
- package/dist/filters-Bw_U6ZTx.js.map +1 -0
- package/dist/flow-BRsYUCJa.js.map +1 -1
- package/dist/genui.js +2 -2
- package/dist/genui.js.map +1 -1
- package/dist/index.js +45 -42
- package/dist/index.js.map +1 -1
- package/dist/{input-BxQAnXki.js → input-DXYUjGgD.js} +2 -2
- package/dist/{input-BxQAnXki.js.map → input-DXYUjGgD.js.map} +1 -1
- package/dist/{input-Cn25I4o5.js → input-DddtBN-g.js} +2 -2
- package/dist/{input-Cn25I4o5.js.map → input-DddtBN-g.js.map} +1 -1
- package/dist/layer-card-BME0eljh.js.map +1 -1
- package/dist/{pagination-C_YqCy8l.js → pagination-BVqdlONY.js} +2 -2
- package/dist/{pagination-C_YqCy8l.js.map → pagination-BVqdlONY.js.map} +1 -1
- package/dist/primitives/otp-field.js +2 -0
- package/dist/primitives.js +1 -0
- package/dist/{radio-B7zg1wUI.js → radio-BNSwOt3B.js} +3 -3
- package/dist/radio-BNSwOt3B.js.map +1 -0
- package/dist/{select-9p721G00.js → select-1w2aebGQ.js} +2 -2
- package/dist/select-1w2aebGQ.js.map +1 -0
- package/dist/{sensitive-input-D5je2NLl.js → sensitive-input-82Cez3vj.js} +2 -2
- package/dist/{sensitive-input-D5je2NLl.js.map → sensitive-input-82Cez3vj.js.map} +1 -1
- package/dist/{sidebar-DOwBrq57.js → sidebar-CAsCmSpM.js} +3 -3
- package/dist/sidebar-CAsCmSpM.js.map +1 -0
- package/dist/sparkline-DdbeM4Ai.js +108 -0
- package/dist/sparkline-DdbeM4Ai.js.map +1 -0
- package/dist/src/blocks/agent-harness/agent-harness.d.ts +30 -9
- package/dist/src/blocks/agent-harness/agent-harness.d.ts.map +1 -1
- package/dist/src/blocks/agent-harness/agent-harness.stories.tsx +114 -0
- package/dist/src/blocks/agent-harness/agent-harness.tsx +144 -63
- package/dist/src/blocks/commander/commander.stories.tsx +31 -0
- package/dist/src/blocks/dashboard-grid/dashboard-grid.d.ts +48 -0
- package/dist/src/blocks/dashboard-grid/dashboard-grid.d.ts.map +1 -0
- package/dist/src/blocks/dashboard-grid/dashboard-grid.stories.tsx +19 -0
- package/dist/src/blocks/dashboard-grid/dashboard-grid.tsx +110 -0
- package/dist/src/blocks/dashboard-grid/index.d.ts +2 -0
- package/dist/src/blocks/dashboard-grid/index.d.ts.map +1 -0
- package/dist/src/blocks/delete-resource/delete-resource.stories.tsx +31 -0
- package/dist/src/blocks/map-block/map-block.stories.tsx +41 -0
- package/dist/src/blocks/metrics-overview/index.d.ts +2 -0
- package/dist/src/blocks/metrics-overview/index.d.ts.map +1 -0
- package/dist/src/blocks/metrics-overview/metrics-overview.d.ts +67 -0
- package/dist/src/blocks/metrics-overview/metrics-overview.d.ts.map +1 -0
- package/dist/src/blocks/metrics-overview/metrics-overview.stories.tsx +26 -0
- package/dist/src/blocks/metrics-overview/metrics-overview.tsx +139 -0
- package/dist/src/blocks/page-header/page-header.stories.tsx +56 -0
- package/dist/src/blocks/resource-list/resource-list.stories.tsx +31 -0
- package/dist/src/catalog/catalog.d.ts +1 -1
- package/dist/src/catalog/index.d.ts +1 -1
- package/dist/src/catalog/types.d.ts +1 -1
- package/dist/src/command-line/build-cli.d.ts +1 -1
- package/dist/src/command-line/cli.d.ts +1 -1
- package/dist/src/command-line/commands/add.d.ts +1 -1
- package/dist/src/command-line/commands/add.d.ts.map +1 -1
- package/dist/src/command-line/commands/ai.d.ts.map +1 -1
- package/dist/src/command-line/commands/blocks.d.ts +1 -1
- package/dist/src/command-line/commands/blocks.d.ts.map +1 -1
- package/dist/src/command-line/commands/doc.d.ts +1 -1
- package/dist/src/command-line/commands/doc.d.ts.map +1 -1
- package/dist/src/command-line/commands/ls.d.ts +1 -1
- package/dist/src/command-line/commands/ls.d.ts.map +1 -1
- package/dist/src/command-line/commands/migrate.d.ts +3 -3
- package/dist/src/command-line/commands/migrate.d.ts.map +1 -1
- package/dist/src/command-line/utils/config.d.ts +1 -1
- package/dist/src/command-line/utils/transformer.d.ts +1 -1
- package/dist/src/components/ai-part-group/ai-part-group.d.ts +134 -0
- package/dist/src/components/ai-part-group/ai-part-group.d.ts.map +1 -0
- package/dist/src/components/ai-part-group/index.d.ts +2 -0
- package/dist/src/components/ai-part-group/index.d.ts.map +1 -0
- package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts +196 -7
- package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/controller.d.ts +41 -0
- package/dist/src/components/ai-prompt-input/controller.d.ts.map +1 -0
- package/dist/src/components/ai-prompt-input/index.d.ts +3 -1
- package/dist/src/components/ai-prompt-input/index.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/types.d.ts +86 -0
- package/dist/src/components/ai-prompt-input/types.d.ts.map +1 -0
- package/dist/src/components/ai-reasoning/ai-reasoning.d.ts +17 -1
- package/dist/src/components/ai-reasoning/ai-reasoning.d.ts.map +1 -1
- package/dist/src/components/ai-response/ai-response.d.ts +1 -2
- package/dist/src/components/ai-response/ai-response.d.ts.map +1 -1
- package/dist/src/components/ai-task-list/ai-task-list.d.ts.map +1 -1
- package/dist/src/components/ai-tool/ai-tool.d.ts +17 -1
- package/dist/src/components/ai-tool/ai-tool.d.ts.map +1 -1
- package/dist/src/components/chart/area-chart.d.ts +69 -0
- package/dist/src/components/chart/area-chart.d.ts.map +1 -0
- package/dist/src/components/chart/bar-chart.d.ts +60 -0
- package/dist/src/components/chart/bar-chart.d.ts.map +1 -0
- package/dist/src/components/chart/color.d.ts +56 -0
- package/dist/src/components/chart/color.d.ts.map +1 -1
- package/dist/src/components/chart/echart.d.ts.map +1 -1
- package/dist/src/components/chart/index.d.ts +5 -0
- package/dist/src/components/chart/index.d.ts.map +1 -1
- package/dist/src/components/chart/pie-chart.d.ts +64 -0
- package/dist/src/components/chart/pie-chart.d.ts.map +1 -0
- package/dist/src/components/chart/scatter-chart.d.ts +57 -0
- package/dist/src/components/chart/scatter-chart.d.ts.map +1 -0
- package/dist/src/components/chart/stacked-bar-chart.d.ts +59 -0
- package/dist/src/components/chart/stacked-bar-chart.d.ts.map +1 -0
- package/dist/src/components/chart/timeseries-chart.d.ts.map +1 -1
- package/dist/src/components/code/code.d.ts +1 -1
- package/dist/src/components/command-palette/command-palette.d.ts +1 -1
- package/dist/src/components/data-grid/data-grid.d.ts.map +1 -1
- package/dist/src/components/data-grid/index.d.ts +1 -1
- package/dist/src/components/data-grid/index.d.ts.map +1 -1
- package/dist/src/components/data-grid/types.d.ts.map +1 -1
- package/dist/src/components/date-picker/date-picker.d.ts +2 -2
- package/dist/src/components/filters/filters.d.ts.map +1 -1
- package/dist/src/components/filters/helpers.d.ts.map +1 -1
- package/dist/src/components/filters/types.d.ts.map +1 -1
- package/dist/src/components/layer-card/layer-card.d.ts +1 -1
- package/dist/src/components/link/link.d.ts +2 -2
- package/dist/src/components/radio/radio.d.ts +1 -1
- package/dist/src/components/select/select.d.ts +1 -1
- package/dist/src/components/sidebar/sidebar.d.ts +2 -2
- package/dist/src/components/sparkline/index.d.ts +2 -0
- package/dist/src/components/sparkline/index.d.ts.map +1 -0
- package/dist/src/components/sparkline/sparkline.d.ts +52 -0
- package/dist/src/components/sparkline/sparkline.d.ts.map +1 -0
- package/dist/src/components/stat-card/index.d.ts +2 -0
- package/dist/src/components/{ai-loader → stat-card}/index.d.ts.map +1 -1
- package/dist/src/components/stat-card/stat-card.d.ts +80 -0
- package/dist/src/components/stat-card/stat-card.d.ts.map +1 -0
- package/dist/src/components/text-roll/index.d.ts +2 -0
- package/dist/src/components/text-roll/index.d.ts.map +1 -0
- package/dist/src/components/text-roll/text-roll.d.ts +49 -0
- package/dist/src/components/text-roll/text-roll.d.ts.map +1 -0
- package/dist/src/components/toast/toast.d.ts.map +1 -1
- package/dist/src/components/use-agent-harness/use-agent-harness.d.ts +2 -2
- package/dist/src/genui/genui.d.ts.map +1 -1
- package/dist/src/index.d.ts +5 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/primitives/index.d.ts +1 -0
- package/dist/src/primitives/index.d.ts.map +1 -1
- package/dist/src/primitives/otp-field.d.ts +13 -0
- package/dist/src/primitives/otp-field.d.ts.map +1 -0
- package/dist/src/registry/index.d.ts +1 -1
- package/dist/src/registry/types.d.ts +1 -1
- package/dist/stat-card-CEZscNh8.js +103 -0
- package/dist/stat-card-CEZscNh8.js.map +1 -0
- package/dist/styles/sf-binding.css +20 -62
- package/dist/styles/sf-standalone.css +2 -2
- package/dist/styles/shadcn.css +120 -0
- package/dist/styles/theme-blue-tint.css +98 -0
- package/dist/styles/theme-fedramp.css +3 -12
- package/dist/styles/theme-minimal.css +26 -104
- package/dist/styles/theme-sf.css +96 -114
- package/dist/{table-CIMx0Oq0.js → table-Rv4JMy0B.js} +2 -2
- package/dist/{table-CIMx0Oq0.js.map → table-Rv4JMy0B.js.map} +1 -1
- package/dist/text-roll-BZ3I1umc.js +79 -0
- package/dist/text-roll-BZ3I1umc.js.map +1 -0
- package/dist/{theme-toggle-Dpgnoj_Q.js → theme-toggle-Bhu681D7.js} +1 -1
- package/dist/{theme-toggle-Dpgnoj_Q.js.map → theme-toggle-Bhu681D7.js.map} +1 -1
- package/dist/{use-agent-harness-DZzcn96L.js → use-agent-harness-BMyF8pTq.js} +5 -5
- package/dist/use-agent-harness-BMyF8pTq.js.map +1 -0
- package/package.json +48 -19
- package/scripts/component-registry/discovery.ts +2 -2
- package/scripts/component-registry/index.ts +1 -1
- package/scripts/component-registry/props-filter.ts +1 -1
- package/scripts/component-registry/utils.ts +5 -5
- package/scripts/component-registry/variant-parser.ts +124 -19
- package/scripts/convert-demos-to-stories.ts +253 -0
- package/scripts/css-build.ts +4 -3
- package/scripts/generate-primitives.ts +11 -3
- package/scripts/theme-generator/config.ts +339 -71
- package/scripts/theme-generator/generate-css.ts +17 -3
- package/scripts/theme-generator/index.ts +3 -3
- package/scripts/theme-generator/migrate.ts +1 -1
- package/dist/ai-loader-Cr3eQkNS.js +0 -134
- package/dist/ai-loader-Cr3eQkNS.js.map +0 -1
- package/dist/ai-prompt-input-Bo1YuJly.js +0 -769
- package/dist/ai-prompt-input-Bo1YuJly.js.map +0 -1
- package/dist/ai-reasoning-UAmNx_LD.js.map +0 -1
- package/dist/ai-response-BWoVsNQG.js.map +0 -1
- package/dist/ai-task-list-B9CpMDYN.js.map +0 -1
- package/dist/ai-timeline-Bb5ntsr3.js.map +0 -1
- package/dist/ai-tool-BGH8nQ_D.js.map +0 -1
- package/dist/chart-Bes4MN3C.js.map +0 -1
- package/dist/checkbox-CPX7lBaU.js.map +0 -1
- package/dist/command-palette-CBTY8EiF.js.map +0 -1
- package/dist/components/ai-loader.js +0 -3
- package/dist/data-grid-UJ9ja5cu.js.map +0 -1
- package/dist/dist-BNlyONdD.js.map +0 -1
- package/dist/filters-BdBogf7D.js.map +0 -1
- package/dist/radio-B7zg1wUI.js.map +0 -1
- package/dist/select-9p721G00.js.map +0 -1
- package/dist/sidebar-DOwBrq57.js.map +0 -1
- package/dist/src/components/ai-loader/ai-loader.d.ts +0 -44
- package/dist/src/components/ai-loader/ai-loader.d.ts.map +0 -1
- package/dist/src/components/ai-loader/index.d.ts +0 -2
- package/dist/styles/theme-navigator.css +0 -137
- package/dist/use-agent-harness-DZzcn96L.js.map +0 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
/** Column span within a 12-column `DashboardGrid`. */
|
|
3
|
+
export type DashboardCellSpan = 2 | 3 | 4 | 6 | 8 | 12;
|
|
4
|
+
/** Props for `DashboardGrid`. */
|
|
5
|
+
export interface DashboardGridProps extends HTMLAttributes<HTMLDivElement> {
|
|
6
|
+
/** Children cells / rows. */
|
|
7
|
+
children?: ReactNode;
|
|
8
|
+
/** Additional CSS classes merged via `cn()`. */
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* DashboardGrid — opinionated 12-column responsive grid for composing BI
|
|
13
|
+
* dashboards from KPI cards, charts, and tables.
|
|
14
|
+
*
|
|
15
|
+
* Cells stack to a single column below `md` and fall into 12-column slots
|
|
16
|
+
* at `md` and above.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* <DashboardGrid>
|
|
21
|
+
* <DashboardGrid.Cell span={3}><StatCard ... /></DashboardGrid.Cell>
|
|
22
|
+
* <DashboardGrid.Cell span={3}><StatCard ... /></DashboardGrid.Cell>
|
|
23
|
+
* <DashboardGrid.Cell span={6}><TimeseriesChart ... /></DashboardGrid.Cell>
|
|
24
|
+
* </DashboardGrid>
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function DashboardGrid({ children, className, ...props }: DashboardGridProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
export declare namespace DashboardGrid {
|
|
29
|
+
var Row: ({ children, className, ...props }: DashboardGridRowProps) => import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
var Cell: ({ span, children, className, ...props }: DashboardGridCellProps) => import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
}
|
|
32
|
+
/** Props for `DashboardGrid.Row`. */
|
|
33
|
+
export interface DashboardGridRowProps extends HTMLAttributes<HTMLDivElement> {
|
|
34
|
+
/** Row children (cells). */
|
|
35
|
+
children?: ReactNode;
|
|
36
|
+
/** Additional CSS classes merged via `cn()`. */
|
|
37
|
+
className?: string;
|
|
38
|
+
}
|
|
39
|
+
/** Props for `DashboardGrid.Cell`. */
|
|
40
|
+
export interface DashboardGridCellProps extends HTMLAttributes<HTMLDivElement> {
|
|
41
|
+
/** Number of 12-column columns this cell spans at `md` and up. */
|
|
42
|
+
span?: DashboardCellSpan;
|
|
43
|
+
/** Cell content. */
|
|
44
|
+
children?: ReactNode;
|
|
45
|
+
/** Additional CSS classes merged via `cn()`. */
|
|
46
|
+
className?: string;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=dashboard-grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-grid.d.ts","sourceRoot":"","sources":["../../../../src/blocks/dashboard-grid/dashboard-grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvD,sDAAsD;AACtD,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;AAWvD,iCAAiC;AACjC,MAAM,WAAW,kBAAmB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACxE,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,kBAAkB,2CAYpB;yBAhBe,aAAa;iDA+BmB,qBAAqB;wDA6BlE,sBAAsB;;AA1CzB,qCAAqC;AACrC,MAAM,WAAW,qBAAsB,SAAQ,cAAc,CAAC,cAAc,CAAC;IAC3E,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAqBD,sCAAsC;AACtC,MAAM,WAAW,sBAAuB,SAAQ,cAAc,CAAC,cAAc,CAAC;IAC5E,kEAAkE;IAClE,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
|
|
3
|
+
import { DashboardGridDemo as Demo_DashboardGridDemo } from "../../../../docs/src/components/demos/DashboardGridDemo";
|
|
4
|
+
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
|
+
const meta: Meta<any> = {
|
|
7
|
+
title: "Blocks/DashboardGrid",
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: "padded",
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export default meta;
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
+
type Story = StoryObj<any>;
|
|
16
|
+
|
|
17
|
+
export const Default: Story = {
|
|
18
|
+
render: () => <Demo_DashboardGridDemo />,
|
|
19
|
+
};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
import { cn } from "../../utils/cn";
|
|
4
|
+
|
|
5
|
+
/** Column span within a 12-column `DashboardGrid`. */
|
|
6
|
+
export type DashboardCellSpan = 2 | 3 | 4 | 6 | 8 | 12;
|
|
7
|
+
|
|
8
|
+
const SPAN_CLASSES: Record<DashboardCellSpan, string> = {
|
|
9
|
+
2: "md:col-span-2",
|
|
10
|
+
3: "md:col-span-3",
|
|
11
|
+
4: "md:col-span-4",
|
|
12
|
+
6: "md:col-span-6",
|
|
13
|
+
8: "md:col-span-8",
|
|
14
|
+
12: "md:col-span-12",
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/** Props for `DashboardGrid`. */
|
|
18
|
+
export interface DashboardGridProps extends HTMLAttributes<HTMLDivElement> {
|
|
19
|
+
/** Children cells / rows. */
|
|
20
|
+
children?: ReactNode;
|
|
21
|
+
/** Additional CSS classes merged via `cn()`. */
|
|
22
|
+
className?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* DashboardGrid — opinionated 12-column responsive grid for composing BI
|
|
27
|
+
* dashboards from KPI cards, charts, and tables.
|
|
28
|
+
*
|
|
29
|
+
* Cells stack to a single column below `md` and fall into 12-column slots
|
|
30
|
+
* at `md` and above.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```tsx
|
|
34
|
+
* <DashboardGrid>
|
|
35
|
+
* <DashboardGrid.Cell span={3}><StatCard ... /></DashboardGrid.Cell>
|
|
36
|
+
* <DashboardGrid.Cell span={3}><StatCard ... /></DashboardGrid.Cell>
|
|
37
|
+
* <DashboardGrid.Cell span={6}><TimeseriesChart ... /></DashboardGrid.Cell>
|
|
38
|
+
* </DashboardGrid>
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function DashboardGrid({
|
|
42
|
+
children,
|
|
43
|
+
className,
|
|
44
|
+
...props
|
|
45
|
+
}: DashboardGridProps) {
|
|
46
|
+
return (
|
|
47
|
+
<div
|
|
48
|
+
{...props}
|
|
49
|
+
className={cn(
|
|
50
|
+
"grid grid-cols-1 gap-4 md:grid-cols-12 md:gap-6",
|
|
51
|
+
className
|
|
52
|
+
)}
|
|
53
|
+
>
|
|
54
|
+
{children}
|
|
55
|
+
</div>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Props for `DashboardGrid.Row`. */
|
|
60
|
+
export interface DashboardGridRowProps extends HTMLAttributes<HTMLDivElement> {
|
|
61
|
+
/** Row children (cells). */
|
|
62
|
+
children?: ReactNode;
|
|
63
|
+
/** Additional CSS classes merged via `cn()`. */
|
|
64
|
+
className?: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Row — optional wrapper that breaks its children onto a new grid row by
|
|
69
|
+
* spanning all 12 columns and re-creating an inner 12-col grid. Useful when
|
|
70
|
+
* you want to force a visual row boundary.
|
|
71
|
+
*/
|
|
72
|
+
function Row({ children, className, ...props }: DashboardGridRowProps) {
|
|
73
|
+
return (
|
|
74
|
+
<div
|
|
75
|
+
{...props}
|
|
76
|
+
className={cn(
|
|
77
|
+
"col-span-1 grid grid-cols-1 gap-4 md:col-span-12 md:grid-cols-12 md:gap-6",
|
|
78
|
+
className
|
|
79
|
+
)}
|
|
80
|
+
>
|
|
81
|
+
{children}
|
|
82
|
+
</div>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Props for `DashboardGrid.Cell`. */
|
|
87
|
+
export interface DashboardGridCellProps extends HTMLAttributes<HTMLDivElement> {
|
|
88
|
+
/** Number of 12-column columns this cell spans at `md` and up. */
|
|
89
|
+
span?: DashboardCellSpan;
|
|
90
|
+
/** Cell content. */
|
|
91
|
+
children?: ReactNode;
|
|
92
|
+
/** Additional CSS classes merged via `cn()`. */
|
|
93
|
+
className?: string;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function Cell({
|
|
97
|
+
span = 4,
|
|
98
|
+
children,
|
|
99
|
+
className,
|
|
100
|
+
...props
|
|
101
|
+
}: DashboardGridCellProps) {
|
|
102
|
+
return (
|
|
103
|
+
<div {...props} className={cn("col-span-1", SPAN_CLASSES[span], className)}>
|
|
104
|
+
{children}
|
|
105
|
+
</div>
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
DashboardGrid.Row = Row;
|
|
110
|
+
DashboardGrid.Cell = Cell;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/blocks/dashboard-grid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
DeleteResourceBasicDemo as Demo_DeleteResourceBasicDemo,
|
|
5
|
+
DeleteResourceWorkerDemo as Demo_DeleteResourceWorkerDemo,
|
|
6
|
+
DeleteResourceErrorDemo as Demo_DeleteResourceErrorDemo,
|
|
7
|
+
} from "../../../../docs/src/components/demos/DeleteResourceDemo";
|
|
8
|
+
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
const meta: Meta<any> = {
|
|
11
|
+
title: "Blocks/DeleteResource",
|
|
12
|
+
parameters: {
|
|
13
|
+
layout: "padded",
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default meta;
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
|
+
type Story = StoryObj<any>;
|
|
20
|
+
|
|
21
|
+
export const Basic: Story = {
|
|
22
|
+
render: () => <Demo_DeleteResourceBasicDemo />,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const Worker: Story = {
|
|
26
|
+
render: () => <Demo_DeleteResourceWorkerDemo />,
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const Error: Story = {
|
|
30
|
+
render: () => <Demo_DeleteResourceErrorDemo />,
|
|
31
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
MapBasicDemo as Demo_MapBasicDemo,
|
|
5
|
+
MapLegendDemo as Demo_MapLegendDemo,
|
|
6
|
+
MapH3Demo as Demo_MapH3Demo,
|
|
7
|
+
MapFiltersDemo as Demo_MapFiltersDemo,
|
|
8
|
+
MapClickDemo as Demo_MapClickDemo,
|
|
9
|
+
} from "../../../../docs/src/components/demos/MapBlockDemo";
|
|
10
|
+
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
const meta: Meta<any> = {
|
|
13
|
+
title: "Blocks/MapBlock",
|
|
14
|
+
parameters: {
|
|
15
|
+
layout: "padded",
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export default meta;
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
|
+
type Story = StoryObj<any>;
|
|
22
|
+
|
|
23
|
+
export const MapBasic: Story = {
|
|
24
|
+
render: () => <Demo_MapBasicDemo />,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export const MapLegend: Story = {
|
|
28
|
+
render: () => <Demo_MapLegendDemo />,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const MapH3: Story = {
|
|
32
|
+
render: () => <Demo_MapH3Demo />,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const MapFilters: Story = {
|
|
36
|
+
render: () => <Demo_MapFiltersDemo />,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const MapClick: Story = {
|
|
40
|
+
render: () => <Demo_MapClickDemo />,
|
|
41
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/blocks/metrics-overview/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { StatCardDelta } from '../../components/stat-card';
|
|
3
|
+
import { DashboardCellSpan } from '../dashboard-grid/dashboard-grid';
|
|
4
|
+
/** A single KPI tile displayed in the overview strip. */
|
|
5
|
+
export interface MetricsOverviewKpi {
|
|
6
|
+
/** Stable key for React list rendering. */
|
|
7
|
+
id: string;
|
|
8
|
+
/** KPI label (e.g. `"Active users"`). */
|
|
9
|
+
label: ReactNode;
|
|
10
|
+
/** Primary value (pre-formatted). */
|
|
11
|
+
value: ReactNode;
|
|
12
|
+
/** Optional delta indicator. */
|
|
13
|
+
delta?: StatCardDelta;
|
|
14
|
+
/** Optional secondary hint shown beneath the value. */
|
|
15
|
+
hint?: ReactNode;
|
|
16
|
+
/** Optional trend slot — typically a `<Sparkline />`. */
|
|
17
|
+
trend?: ReactNode;
|
|
18
|
+
/**
|
|
19
|
+
* Column span at `md` breakpoint and above within the internal 12-col grid.
|
|
20
|
+
* Defaults to an even split based on the number of KPIs.
|
|
21
|
+
*/
|
|
22
|
+
span?: DashboardCellSpan;
|
|
23
|
+
}
|
|
24
|
+
/** Props for `MetricsOverview`. */
|
|
25
|
+
export interface MetricsOverviewProps {
|
|
26
|
+
/** Heading rendered in the top-left of the header row. */
|
|
27
|
+
title?: ReactNode;
|
|
28
|
+
/** Optional description or subtitle shown under the title. */
|
|
29
|
+
description?: ReactNode;
|
|
30
|
+
/** Right-aligned slot for timeframe toggles, filters, or actions. */
|
|
31
|
+
actions?: ReactNode;
|
|
32
|
+
/** KPI tiles displayed in the strip under the header. */
|
|
33
|
+
kpis: MetricsOverviewKpi[];
|
|
34
|
+
/**
|
|
35
|
+
* Primary chart slot. Typically a `<TimeseriesChart />` or `<BarChart />`
|
|
36
|
+
* configured by the consumer.
|
|
37
|
+
*/
|
|
38
|
+
chart?: ReactNode;
|
|
39
|
+
/** When `true`, renders skeleton placeholders on KPI tiles. */
|
|
40
|
+
loading?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* When `kpis` is empty and no chart is provided, this node is rendered in
|
|
43
|
+
* place of the overview.
|
|
44
|
+
*/
|
|
45
|
+
emptyState?: ReactNode;
|
|
46
|
+
/** Additional CSS classes merged via `cn()`. */
|
|
47
|
+
className?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* MetricsOverview — composed block that assembles a dashboard header, a strip
|
|
51
|
+
* of KPI tiles, and a primary chart area into one reusable layout.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```tsx
|
|
55
|
+
* <MetricsOverview
|
|
56
|
+
* title="Revenue overview"
|
|
57
|
+
* actions={<TimeframeToggle ... />}
|
|
58
|
+
* kpis={[
|
|
59
|
+
* { id: "mrr", label: "MRR", value: "$128,420", delta: { value: 0.12, label: "vs last month" } },
|
|
60
|
+
* { id: "arpu", label: "ARPU", value: "$42.10" },
|
|
61
|
+
* ]}
|
|
62
|
+
* chart={<TimeseriesChart echarts={echarts} data={series} />}
|
|
63
|
+
* />
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare function MetricsOverview({ title, description, actions, kpis, chart, loading, emptyState, className, }: MetricsOverviewProps): import("react/jsx-runtime").JSX.Element;
|
|
67
|
+
//# sourceMappingURL=metrics-overview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics-overview.d.ts","sourceRoot":"","sources":["../../../../src/blocks/metrics-overview/metrics-overview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE1E,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,kCAAkC,CAAC;AAE1C,yDAAyD;AACzD,MAAM,WAAW,kBAAkB;IACjC,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,yCAAyC;IACzC,KAAK,EAAE,SAAS,CAAC;IACjB,qCAAqC;IACrC,KAAK,EAAE,SAAS,CAAC;IACjB,gCAAgC;IAChC,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,uDAAuD;IACvD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,yDAAyD;IACzD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAED,mCAAmC;AACnC,MAAM,WAAW,oBAAoB;IACnC,0DAA0D;IAC1D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,qEAAqE;IACrE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,yDAAyD;IACzD,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,WAAW,EACX,OAAO,EACP,IAAI,EACJ,KAAK,EACL,OAAO,EACP,UAAU,EACV,SAAS,GACV,EAAE,oBAAoB,2CAiDtB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
MetricsOverviewDemo as Demo_MetricsOverviewDemo,
|
|
5
|
+
MetricsOverviewLoadingDemo as Demo_MetricsOverviewLoadingDemo,
|
|
6
|
+
} from "../../../../docs/src/components/demos/MetricsOverviewDemo";
|
|
7
|
+
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
|
+
const meta: Meta<any> = {
|
|
10
|
+
title: "Blocks/MetricsOverview",
|
|
11
|
+
parameters: {
|
|
12
|
+
layout: "padded",
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default meta;
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
|
+
type Story = StoryObj<any>;
|
|
19
|
+
|
|
20
|
+
export const Default: Story = {
|
|
21
|
+
render: () => <Demo_MetricsOverviewDemo />,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const Loading: Story = {
|
|
25
|
+
render: () => <Demo_MetricsOverviewLoadingDemo />,
|
|
26
|
+
};
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
import { StatCard, type StatCardDelta } from "../../components/stat-card";
|
|
4
|
+
import { cn } from "../../utils/cn";
|
|
5
|
+
import {
|
|
6
|
+
DashboardGrid,
|
|
7
|
+
type DashboardCellSpan,
|
|
8
|
+
} from "../dashboard-grid/dashboard-grid";
|
|
9
|
+
|
|
10
|
+
/** A single KPI tile displayed in the overview strip. */
|
|
11
|
+
export interface MetricsOverviewKpi {
|
|
12
|
+
/** Stable key for React list rendering. */
|
|
13
|
+
id: string;
|
|
14
|
+
/** KPI label (e.g. `"Active users"`). */
|
|
15
|
+
label: ReactNode;
|
|
16
|
+
/** Primary value (pre-formatted). */
|
|
17
|
+
value: ReactNode;
|
|
18
|
+
/** Optional delta indicator. */
|
|
19
|
+
delta?: StatCardDelta;
|
|
20
|
+
/** Optional secondary hint shown beneath the value. */
|
|
21
|
+
hint?: ReactNode;
|
|
22
|
+
/** Optional trend slot — typically a `<Sparkline />`. */
|
|
23
|
+
trend?: ReactNode;
|
|
24
|
+
/**
|
|
25
|
+
* Column span at `md` breakpoint and above within the internal 12-col grid.
|
|
26
|
+
* Defaults to an even split based on the number of KPIs.
|
|
27
|
+
*/
|
|
28
|
+
span?: DashboardCellSpan;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Props for `MetricsOverview`. */
|
|
32
|
+
export interface MetricsOverviewProps {
|
|
33
|
+
/** Heading rendered in the top-left of the header row. */
|
|
34
|
+
title?: ReactNode;
|
|
35
|
+
/** Optional description or subtitle shown under the title. */
|
|
36
|
+
description?: ReactNode;
|
|
37
|
+
/** Right-aligned slot for timeframe toggles, filters, or actions. */
|
|
38
|
+
actions?: ReactNode;
|
|
39
|
+
/** KPI tiles displayed in the strip under the header. */
|
|
40
|
+
kpis: MetricsOverviewKpi[];
|
|
41
|
+
/**
|
|
42
|
+
* Primary chart slot. Typically a `<TimeseriesChart />` or `<BarChart />`
|
|
43
|
+
* configured by the consumer.
|
|
44
|
+
*/
|
|
45
|
+
chart?: ReactNode;
|
|
46
|
+
/** When `true`, renders skeleton placeholders on KPI tiles. */
|
|
47
|
+
loading?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* When `kpis` is empty and no chart is provided, this node is rendered in
|
|
50
|
+
* place of the overview.
|
|
51
|
+
*/
|
|
52
|
+
emptyState?: ReactNode;
|
|
53
|
+
/** Additional CSS classes merged via `cn()`. */
|
|
54
|
+
className?: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function inferSpan(kpiCount: number): DashboardCellSpan {
|
|
58
|
+
if (kpiCount <= 1) return 12;
|
|
59
|
+
if (kpiCount === 2) return 6;
|
|
60
|
+
if (kpiCount === 3) return 4;
|
|
61
|
+
return 3;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* MetricsOverview — composed block that assembles a dashboard header, a strip
|
|
66
|
+
* of KPI tiles, and a primary chart area into one reusable layout.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```tsx
|
|
70
|
+
* <MetricsOverview
|
|
71
|
+
* title="Revenue overview"
|
|
72
|
+
* actions={<TimeframeToggle ... />}
|
|
73
|
+
* kpis={[
|
|
74
|
+
* { id: "mrr", label: "MRR", value: "$128,420", delta: { value: 0.12, label: "vs last month" } },
|
|
75
|
+
* { id: "arpu", label: "ARPU", value: "$42.10" },
|
|
76
|
+
* ]}
|
|
77
|
+
* chart={<TimeseriesChart echarts={echarts} data={series} />}
|
|
78
|
+
* />
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export function MetricsOverview({
|
|
82
|
+
title,
|
|
83
|
+
description,
|
|
84
|
+
actions,
|
|
85
|
+
kpis,
|
|
86
|
+
chart,
|
|
87
|
+
loading,
|
|
88
|
+
emptyState,
|
|
89
|
+
className,
|
|
90
|
+
}: MetricsOverviewProps) {
|
|
91
|
+
const hasContent = kpis.length > 0 || chart !== undefined;
|
|
92
|
+
|
|
93
|
+
if (!hasContent && emptyState !== undefined) {
|
|
94
|
+
return <div className={className}>{emptyState}</div>;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const defaultSpan = inferSpan(kpis.length);
|
|
98
|
+
|
|
99
|
+
return (
|
|
100
|
+
<section className={cn("flex flex-col gap-4", className)}>
|
|
101
|
+
{(title || description || actions) && (
|
|
102
|
+
<header className="flex flex-wrap items-start justify-between gap-3">
|
|
103
|
+
<div className="flex flex-col gap-1">
|
|
104
|
+
{title ? (
|
|
105
|
+
<h2 className="text-lg font-semibold text-sf-strong">{title}</h2>
|
|
106
|
+
) : null}
|
|
107
|
+
{description ? (
|
|
108
|
+
<p className="text-sm text-sf-subtle">{description}</p>
|
|
109
|
+
) : null}
|
|
110
|
+
</div>
|
|
111
|
+
{actions ? (
|
|
112
|
+
<div className="flex shrink-0 items-center gap-2">{actions}</div>
|
|
113
|
+
) : null}
|
|
114
|
+
</header>
|
|
115
|
+
)}
|
|
116
|
+
|
|
117
|
+
{kpis.length > 0 ? (
|
|
118
|
+
<DashboardGrid>
|
|
119
|
+
{kpis.map((kpi) => (
|
|
120
|
+
<DashboardGrid.Cell key={kpi.id} span={kpi.span ?? defaultSpan}>
|
|
121
|
+
<StatCard
|
|
122
|
+
label={kpi.label}
|
|
123
|
+
value={kpi.value}
|
|
124
|
+
delta={kpi.delta}
|
|
125
|
+
hint={kpi.hint}
|
|
126
|
+
trend={kpi.trend}
|
|
127
|
+
loading={loading}
|
|
128
|
+
/>
|
|
129
|
+
</DashboardGrid.Cell>
|
|
130
|
+
))}
|
|
131
|
+
</DashboardGrid>
|
|
132
|
+
) : null}
|
|
133
|
+
|
|
134
|
+
{chart ? (
|
|
135
|
+
<div className="rounded-lg bg-sf-elevated p-4">{chart}</div>
|
|
136
|
+
) : null}
|
|
137
|
+
</section>
|
|
138
|
+
);
|
|
139
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
PageHeaderHeroDemo as Demo_PageHeaderHeroDemo,
|
|
5
|
+
PageHeaderBasicDemo as Demo_PageHeaderBasicDemo,
|
|
6
|
+
PageHeaderWithIconsDemo as Demo_PageHeaderWithIconsDemo,
|
|
7
|
+
PageHeaderWithTabsDemo as Demo_PageHeaderWithTabsDemo,
|
|
8
|
+
PageHeaderWithActionsDemo as Demo_PageHeaderWithActionsDemo,
|
|
9
|
+
PageHeaderWithTitleDemo as Demo_PageHeaderWithTitleDemo,
|
|
10
|
+
PageHeaderWithTitleDescriptionDemo as Demo_PageHeaderWithTitleDescriptionDemo,
|
|
11
|
+
PageHeaderCompleteDemo as Demo_PageHeaderCompleteDemo,
|
|
12
|
+
} from "../../../../docs/src/components/demos/PageHeaderDemo";
|
|
13
|
+
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
+
const meta: Meta<any> = {
|
|
16
|
+
title: "Blocks/PageHeader",
|
|
17
|
+
parameters: {
|
|
18
|
+
layout: "padded",
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export default meta;
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
|
+
type Story = StoryObj<any>;
|
|
25
|
+
|
|
26
|
+
export const Hero: Story = {
|
|
27
|
+
render: () => <Demo_PageHeaderHeroDemo />,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const Basic: Story = {
|
|
31
|
+
render: () => <Demo_PageHeaderBasicDemo />,
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const WithIcons: Story = {
|
|
35
|
+
render: () => <Demo_PageHeaderWithIconsDemo />,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export const WithTabs: Story = {
|
|
39
|
+
render: () => <Demo_PageHeaderWithTabsDemo />,
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const WithActions: Story = {
|
|
43
|
+
render: () => <Demo_PageHeaderWithActionsDemo />,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export const WithTitle: Story = {
|
|
47
|
+
render: () => <Demo_PageHeaderWithTitleDemo />,
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export const WithTitleDescription: Story = {
|
|
51
|
+
render: () => <Demo_PageHeaderWithTitleDescriptionDemo />,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const Complete: Story = {
|
|
55
|
+
render: () => <Demo_PageHeaderCompleteDemo />,
|
|
56
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
ResourceListBasicDemo as Demo_ResourceListBasicDemo,
|
|
5
|
+
ResourceListWithUsageDemo as Demo_ResourceListWithUsageDemo,
|
|
6
|
+
ResourceListCompleteDemo as Demo_ResourceListCompleteDemo,
|
|
7
|
+
} from "../../../../docs/src/components/demos/ResourceListDemo";
|
|
8
|
+
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
const meta: Meta<any> = {
|
|
11
|
+
title: "Blocks/ResourceList",
|
|
12
|
+
parameters: {
|
|
13
|
+
layout: "padded",
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default meta;
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
|
+
type Story = StoryObj<any>;
|
|
20
|
+
|
|
21
|
+
export const Basic: Story = {
|
|
22
|
+
render: () => <Demo_ResourceListBasicDemo />,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const WithUsage: Story = {
|
|
26
|
+
render: () => <Demo_ResourceListWithUsageDemo />,
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const Complete: Story = {
|
|
30
|
+
render: () => <Demo_ResourceListCompleteDemo />,
|
|
31
|
+
};
|
|
@@ -39,7 +39,7 @@ interface SchemasModule {
|
|
|
39
39
|
*/
|
|
40
40
|
export declare function loadSchemas(): Promise<SchemasModule>;
|
|
41
41
|
/**
|
|
42
|
-
* Create a
|
|
42
|
+
* Create a SignalFlare catalog for runtime validation.
|
|
43
43
|
*
|
|
44
44
|
* The catalog:
|
|
45
45
|
* - Uses auto-generated Zod schemas from component-registry.json
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../../src/command-line/commands/add.ts"],"names":[],"mappings":";AACA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../../src/command-line/commands/add.ts"],"names":[],"mappings":";AACA;;;GAGG;AAiGH;;GAEG;AACH,wBAAsB,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoJtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../../../src/command-line/commands/ai.ts"],"names":[],"mappings":";AACA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../../../src/command-line/commands/ai.ts"],"names":[],"mappings":";AACA;;;GAGG;AAKH;;GAEG;AACH,wBAAgB,EAAE,IAAI,IAAI,CAczB"}
|