@signalflare-ai/ui 1.0.0 → 1.2.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 +37 -4
- package/README.md +1 -1
- package/ai/component-registry.json +1047 -183
- package/ai/component-registry.md +4241 -50
- package/ai/schemas.ts +99 -502
- package/dist/.build-complete +1 -1
- package/dist/ai/schemas.d.ts +76 -58
- package/dist/ai/schemas.d.ts.map +1 -1
- package/dist/{ai-actions-DSVeQn4e.js → ai-actions-BdUZI3Gk.js} +3 -3
- package/dist/{ai-actions-DSVeQn4e.js.map → ai-actions-BdUZI3Gk.js.map} +1 -1
- package/dist/{ai-agent-card-BXHwhWAU.js → ai-agent-card-BR2NIYhi.js} +1 -1
- package/dist/{ai-agent-card-BXHwhWAU.js.map → ai-agent-card-BR2NIYhi.js.map} +1 -1
- package/dist/{ai-approval-aa0qvjFN.js → ai-approval-Ba7mrKba.js} +2 -2
- package/dist/{ai-approval-aa0qvjFN.js.map → ai-approval-Ba7mrKba.js.map} +1 -1
- package/dist/{ai-code-block-BgtIxtZZ.js → ai-code-block-CZtoL73R.js} +3 -3
- package/dist/{ai-code-block-BgtIxtZZ.js.map → ai-code-block-CZtoL73R.js.map} +1 -1
- package/dist/ai-conversation-Cc7WlaBg.js +242 -0
- package/dist/ai-conversation-Cc7WlaBg.js.map +1 -0
- package/dist/{ai-info-banner-uFxHHwBA.js → ai-info-banner-C7EWPBj7.js} +7 -3
- package/dist/ai-info-banner-C7EWPBj7.js.map +1 -0
- package/dist/{ai-message-BjnFznXy.js → ai-message-Bp7L68U_.js} +27 -8
- package/dist/ai-message-Bp7L68U_.js.map +1 -0
- package/dist/{ai-mission-header-08__gULL.js → ai-mission-header-TiCJfTNt.js} +1 -1
- package/dist/{ai-mission-header-08__gULL.js.map → ai-mission-header-TiCJfTNt.js.map} +1 -1
- package/dist/{ai-part-group-DBtgTgAn.js → ai-part-group-DNb9I446.js} +3 -3
- package/dist/{ai-part-group-DBtgTgAn.js.map → ai-part-group-DNb9I446.js.map} +1 -1
- package/dist/{ai-prompt-input-Dy1LfxPk.js → ai-prompt-input-BVvov_KF.js} +467 -25
- package/dist/ai-prompt-input-BVvov_KF.js.map +1 -0
- package/dist/{ai-question-CHHoDJMg.js → ai-question-GPPMk7YM.js} +2 -2
- package/dist/{ai-question-CHHoDJMg.js.map → ai-question-GPPMk7YM.js.map} +1 -1
- package/dist/{ai-reasoning-CnL6ZSr5.js → ai-reasoning-_feFjk56.js} +2 -2
- package/dist/{ai-reasoning-CnL6ZSr5.js.map → ai-reasoning-_feFjk56.js.map} +1 -1
- package/dist/{ai-response-BEUg3xvd.js → ai-response-CvjV3WhV.js} +8 -3
- package/dist/ai-response-CvjV3WhV.js.map +1 -0
- package/dist/{ai-shimmer-By5_L05p.js → ai-shimmer-j6lKIrjj.js} +1 -1
- package/dist/{ai-shimmer-By5_L05p.js.map → ai-shimmer-j6lKIrjj.js.map} +1 -1
- package/dist/{ai-status-badge-BGYGWYF6.js → ai-status-badge-CSU_QOdz.js} +1 -1
- package/dist/{ai-status-badge-BGYGWYF6.js.map → ai-status-badge-CSU_QOdz.js.map} +1 -1
- package/dist/{ai-streaming-text-CMfoThV0.js → ai-streaming-text-IWW1BhvZ.js} +44 -16
- package/dist/ai-streaming-text-IWW1BhvZ.js.map +1 -0
- package/dist/{ai-subagent-DcPRqkAA.js → ai-subagent-JA4iIMW3.js} +13 -5
- package/dist/ai-subagent-JA4iIMW3.js.map +1 -0
- package/dist/{ai-suggestion-MgeCg5Ar.js → ai-suggestion-BdO6MBuH.js} +2 -2
- package/dist/{ai-suggestion-MgeCg5Ar.js.map → ai-suggestion-BdO6MBuH.js.map} +1 -1
- package/dist/{ai-task-list-Da9zIm00.js → ai-task-list-DYw4R1FA.js} +12 -5
- package/dist/ai-task-list-DYw4R1FA.js.map +1 -0
- package/dist/{ai-timeline-Cwu045IR.js → ai-timeline-C42tOUT8.js} +1 -1
- package/dist/{ai-timeline-Cwu045IR.js.map → ai-timeline-C42tOUT8.js.map} +1 -1
- package/dist/{ai-tool-Cn1O4xjP.js → ai-tool-03jOTwUI.js} +23 -10
- package/dist/ai-tool-03jOTwUI.js.map +1 -0
- package/dist/{ai-usage-bar-DjS12DMp.js → ai-usage-bar-BRf5LC_b.js} +1 -1
- package/dist/{ai-usage-bar-DjS12DMp.js.map → ai-usage-bar-BRf5LC_b.js.map} +1 -1
- package/dist/{badge-D_eaA6wv.js → badge-BheXjMc8.js} +2 -2
- package/dist/{badge-D_eaA6wv.js.map → badge-BheXjMc8.js.map} +1 -1
- package/dist/{banner-B_6oBrsu.js → banner-CcsjunJg.js} +7 -2
- package/dist/banner-CcsjunJg.js.map +1 -0
- package/dist/{breadcrumbs-BlmeYfgq.js → breadcrumbs-CouSyy3H.js} +3 -3
- package/dist/{breadcrumbs-BlmeYfgq.js.map → breadcrumbs-CouSyy3H.js.map} +1 -1
- package/dist/{button-De0267YU.js → button-CO6-qPax.js} +1 -1
- package/dist/{button-De0267YU.js.map → button-CO6-qPax.js.map} +1 -1
- package/dist/catalog.js +1 -1
- package/dist/{chart-BK3sVPnD.js → chart-Dg0qUeSc.js} +2 -2
- package/dist/{chart-BK3sVPnD.js.map → chart-Dg0qUeSc.js.map} +1 -1
- package/dist/{checkbox-DYhUmZNw.js → checkbox-D7p4QKsC.js} +2 -2
- package/dist/{checkbox-DYhUmZNw.js.map → checkbox-D7p4QKsC.js.map} +1 -1
- package/dist/{clipboard-text-ssybngLw.js → clipboard-text-kLaMogs3.js} +3 -3
- package/dist/{clipboard-text-ssybngLw.js.map → clipboard-text-kLaMogs3.js.map} +1 -1
- package/dist/{code-Cx-QSoOT.js → code-BN8InC0G.js} +2 -2
- package/dist/{code-Cx-QSoOT.js.map → code-BN8InC0G.js.map} +1 -1
- package/dist/{collapsible-DWsXeXmS.js → collapsible-D_ueZ0jz.js} +1 -1
- package/dist/{collapsible-DWsXeXmS.js.map → collapsible-D_ueZ0jz.js.map} +1 -1
- package/dist/{combobox-C0iW6a0r.js → combobox-B7TOK0U2.js} +3 -3
- package/dist/{combobox-C0iW6a0r.js.map → combobox-B7TOK0U2.js.map} +1 -1
- package/dist/{command-palette-DGzioeki.js → command-palette-CuNUyJca.js} +2 -2
- package/dist/{command-palette-DGzioeki.js.map → command-palette-CuNUyJca.js.map} +1 -1
- 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 +2 -2
- 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 +1 -1
- 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 +2 -2
- 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/badge.js +1 -1
- package/dist/components/banner.js +1 -1
- package/dist/components/breadcrumbs.js +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/chart.js +2 -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/collapsible.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/date-range-picker.js +1 -1
- package/dist/components/dialog.js +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/empty.js +1 -1
- package/dist/components/field.js +1 -1
- package/dist/components/filters.js +1 -1
- package/dist/components/flow.js +1 -1
- package/dist/components/grid.js +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/label.js +1 -1
- package/dist/components/layer-card.js +1 -1
- package/dist/components/loader.js +1 -1
- package/dist/components/menubar.js +1 -1
- package/dist/components/meter.js +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/popover.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/signalflare-ai-logo.js +1 -1
- package/dist/components/sparkline.js +1 -1
- package/dist/components/stat-card.js +1 -1
- package/dist/components/surface.js +1 -1
- package/dist/components/switch.js +1 -1
- package/dist/components/table.js +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/text-roll.js +1 -1
- package/dist/components/text.js +1 -1
- package/dist/components/theme-toggle.js +1 -1
- package/dist/components/toast.js +1 -1
- package/dist/components/tooltip.js +1 -1
- package/dist/components/use-agent-harness.js +1 -1
- package/dist/{data-grid-CG76N_hK.js → data-grid-DGHmU0w3.js} +8 -8
- package/dist/{data-grid-CG76N_hK.js.map → data-grid-DGHmU0w3.js.map} +1 -1
- package/dist/{date-picker-Dqg9L4xu.js → date-picker--ox89RBy.js} +1 -1
- package/dist/{date-picker-Dqg9L4xu.js.map → date-picker--ox89RBy.js.map} +1 -1
- package/dist/{date-range-picker-D75LLINc.js → date-range-picker-DVa7QBqE.js} +1 -1
- package/dist/{date-range-picker-D75LLINc.js.map → date-range-picker-DVa7QBqE.js.map} +1 -1
- package/dist/{dialog-CyHEQXEY.js → dialog-Bv1oSFOd.js} +2 -2
- package/dist/{dialog-CyHEQXEY.js.map → dialog-Bv1oSFOd.js.map} +1 -1
- package/dist/{dist-1-gcEL2L.js → dist-B6iWiWwp.js} +25 -25
- package/dist/{dist-1-gcEL2L.js.map → dist-B6iWiWwp.js.map} +1 -1
- package/dist/{dropdown-qnEYRFXZ.js → dropdown-B_nrGXjV.js} +2 -2
- package/dist/{dropdown-qnEYRFXZ.js.map → dropdown-B_nrGXjV.js.map} +1 -1
- package/dist/{echart-DURZEyai.js → echart-CdOUaT-r.js} +1 -1
- package/dist/{echart-DURZEyai.js.map → echart-CdOUaT-r.js.map} +1 -1
- package/dist/{empty-D2TypIId.js → empty-DZnN0zKX.js} +11 -6
- package/dist/empty-DZnN0zKX.js.map +1 -0
- package/dist/{field-Y_UK1_Cg.js → field-B_yVof52.js} +2 -2
- package/dist/{field-Y_UK1_Cg.js.map → field-B_yVof52.js.map} +1 -1
- package/dist/{filters-Bw_U6ZTx.js → filters-cpJCY21R.js} +7 -7
- package/dist/{filters-Bw_U6ZTx.js.map → filters-cpJCY21R.js.map} +1 -1
- package/dist/{flow-BRsYUCJa.js → flow-B4v198ot.js} +1 -1
- package/dist/{flow-BRsYUCJa.js.map → flow-B4v198ot.js.map} +1 -1
- package/dist/genui.js +1 -1
- package/dist/{grid-qUAN9hFx.js → grid-CEd64Lnh.js} +1 -1
- package/dist/{grid-qUAN9hFx.js.map → grid-CEd64Lnh.js.map} +1 -1
- package/dist/{highlight-to-react-ClEfL81q.js → highlight-to-react-D0Yav4jk.js} +1 -1
- package/dist/{highlight-to-react-ClEfL81q.js.map → highlight-to-react-D0Yav4jk.js.map} +1 -1
- package/dist/index.js +69 -69
- package/dist/{input-DXYUjGgD.js → input-B2bbijRh.js} +2 -2
- package/dist/{input-DXYUjGgD.js.map → input-B2bbijRh.js.map} +1 -1
- package/dist/{input-DddtBN-g.js → input-ClB_E4Lb.js} +4 -4
- package/dist/{input-DddtBN-g.js.map → input-ClB_E4Lb.js.map} +1 -1
- package/dist/{label-QtJxtJ4u.js → label-DUv_urO1.js} +2 -2
- package/dist/{label-QtJxtJ4u.js.map → label-DUv_urO1.js.map} +1 -1
- package/dist/{layer-card-BME0eljh.js → layer-card-BK7eYfwn.js} +1 -1
- package/dist/{layer-card-BME0eljh.js.map → layer-card-BK7eYfwn.js.map} +1 -1
- package/dist/layout-DJHMMap2.js +6103 -0
- package/dist/layout-DJHMMap2.js.map +1 -0
- package/dist/measured-text-BI3dTJmH.js +290 -0
- package/dist/measured-text-BI3dTJmH.js.map +1 -0
- package/dist/{menubar-C8NzAjfd.js → menubar-Cxf3xeAt.js} +2 -2
- package/dist/{menubar-C8NzAjfd.js.map → menubar-Cxf3xeAt.js.map} +1 -1
- package/dist/{meter-CpmTenEr.js → meter-BFFe9l5b.js} +1 -1
- package/dist/{meter-CpmTenEr.js.map → meter-BFFe9l5b.js.map} +1 -1
- package/dist/{pagination-BVqdlONY.js → pagination-yS372Tr4.js} +2 -2
- package/dist/{pagination-BVqdlONY.js.map → pagination-yS372Tr4.js.map} +1 -1
- package/dist/{popover-BRQZ2b6z.js → popover-SRoJaCZr.js} +1 -1
- package/dist/{popover-BRQZ2b6z.js.map → popover-SRoJaCZr.js.map} +1 -1
- package/dist/{radio-BNSwOt3B.js → radio-BcwhwYNB.js} +1 -1
- package/dist/{radio-BNSwOt3B.js.map → radio-BcwhwYNB.js.map} +1 -1
- package/dist/{select-1w2aebGQ.js → select-DMhdoHMa.js} +4 -4
- package/dist/{select-1w2aebGQ.js.map → select-DMhdoHMa.js.map} +1 -1
- package/dist/{sensitive-input-82Cez3vj.js → sensitive-input-CJUpIRal.js} +3 -3
- package/dist/{sensitive-input-82Cez3vj.js.map → sensitive-input-CJUpIRal.js.map} +1 -1
- package/dist/{sidebar-CAsCmSpM.js → sidebar-D4zrlYpn.js} +2 -2
- package/dist/{sidebar-CAsCmSpM.js.map → sidebar-D4zrlYpn.js.map} +1 -1
- package/dist/{signalflare-ai-logo-DDhxMJD6.js → signalflare-ai-logo-Bipogceq.js} +1 -1
- package/dist/{signalflare-ai-logo-DDhxMJD6.js.map → signalflare-ai-logo-Bipogceq.js.map} +1 -1
- package/dist/{skeleton-line-Do3UmGk9.js → skeleton-line-CH1-h6e2.js} +1 -1
- package/dist/{skeleton-line-Do3UmGk9.js.map → skeleton-line-CH1-h6e2.js.map} +1 -1
- package/dist/{sparkline-DdbeM4Ai.js → sparkline-DHmgj1d0.js} +2 -2
- package/dist/{sparkline-DdbeM4Ai.js.map → sparkline-DHmgj1d0.js.map} +1 -1
- package/dist/src/blocks/agent-harness/agent-harness.d.ts.map +1 -1
- package/dist/src/blocks/agent-harness/agent-harness.tsx +29 -5
- package/dist/src/components/ai-conversation/ai-conversation.d.ts +69 -37
- package/dist/src/components/ai-conversation/ai-conversation.d.ts.map +1 -1
- package/dist/src/components/ai-conversation/index.d.ts +2 -1
- package/dist/src/components/ai-conversation/index.d.ts.map +1 -1
- package/dist/src/components/ai-conversation/measurement-constants.d.ts +30 -0
- package/dist/src/components/ai-conversation/measurement-constants.d.ts.map +1 -0
- package/dist/src/components/ai-info-banner/ai-info-banner.d.ts.map +1 -1
- package/dist/src/components/ai-message/ai-message.d.ts +3 -0
- package/dist/src/components/ai-message/ai-message.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts +58 -4
- 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 +10 -2
- package/dist/src/components/ai-prompt-input/controller.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/index.d.ts +2 -2
- package/dist/src/components/ai-prompt-input/index.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/types.d.ts +16 -0
- package/dist/src/components/ai-prompt-input/types.d.ts.map +1 -1
- package/dist/src/components/ai-response/ai-response.d.ts +12 -1
- package/dist/src/components/ai-response/ai-response.d.ts.map +1 -1
- package/dist/src/components/ai-streaming-text/ai-streaming-text.d.ts +27 -0
- package/dist/src/components/ai-streaming-text/ai-streaming-text.d.ts.map +1 -1
- package/dist/src/components/ai-streaming-text/index.d.ts +1 -1
- package/dist/src/components/ai-streaming-text/index.d.ts.map +1 -1
- package/dist/src/components/ai-subagent/ai-subagent.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.map +1 -1
- package/dist/src/components/banner/banner.d.ts.map +1 -1
- package/dist/src/components/empty/empty.d.ts.map +1 -1
- package/dist/src/components/stat-card/stat-card.d.ts +5 -0
- package/dist/src/components/stat-card/stat-card.d.ts.map +1 -1
- package/dist/src/components/text/text.d.ts +35 -1
- package/dist/src/components/text/text.d.ts.map +1 -1
- package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/utils/index.d.ts +2 -0
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/measured-text.d.ts +40 -0
- package/dist/src/utils/measured-text.d.ts.map +1 -0
- package/dist/src/utils/use-measured-text.d.ts +59 -0
- package/dist/src/utils/use-measured-text.d.ts.map +1 -0
- package/dist/{stat-card-CEZscNh8.js → stat-card-Ew-ofzEm.js} +28 -10
- package/dist/stat-card-Ew-ofzEm.js.map +1 -0
- package/dist/styles/sf-binding.css +9 -1
- package/dist/styles/sf-standalone.css +2 -2
- package/dist/styles/shadcn.css +1 -1
- package/dist/styles/theme-fedramp.css +12 -3
- package/dist/styles/theme-minimal.css +104 -26
- package/dist/styles/theme-sf.css +138 -39
- package/dist/styles/theme-vesper.css +91 -0
- package/dist/{surface-BduI7Ehl.js → surface-DGwRlC0o.js} +1 -1
- package/dist/{surface-BduI7Ehl.js.map → surface-DGwRlC0o.js.map} +1 -1
- package/dist/{switch-CzZBRBL7.js → switch-BxAMfHdt.js} +2 -2
- package/dist/{switch-CzZBRBL7.js.map → switch-BxAMfHdt.js.map} +1 -1
- package/dist/{table-Rv4JMy0B.js → table-BBeAtYVZ.js} +2 -2
- package/dist/{table-Rv4JMy0B.js.map → table-BBeAtYVZ.js.map} +1 -1
- package/dist/{tabs-1cHrYoel.js → tabs-CeHu7Scn.js} +1 -1
- package/dist/{tabs-1cHrYoel.js.map → tabs-CeHu7Scn.js.map} +1 -1
- package/dist/{text-KJmGkwnf.js → text-Cqryz7rk.js} +27 -5
- package/dist/text-Cqryz7rk.js.map +1 -0
- package/dist/{text-roll-BZ3I1umc.js → text-roll-Ch52hcQj.js} +1 -1
- package/dist/{text-roll-BZ3I1umc.js.map → text-roll-Ch52hcQj.js.map} +1 -1
- package/dist/{theme-toggle-Bhu681D7.js → theme-toggle-LDfIKEqx.js} +3 -3
- package/dist/{theme-toggle-Bhu681D7.js.map → theme-toggle-LDfIKEqx.js.map} +1 -1
- package/dist/{toast-Nw28a5Cx.js → toast-CaFQNYng.js} +2 -2
- package/dist/{toast-Nw28a5Cx.js.map → toast-CaFQNYng.js.map} +1 -1
- package/dist/{tooltip-Cb7QW-7H.js → tooltip-g9lFsvcT.js} +8 -2
- package/dist/tooltip-g9lFsvcT.js.map +1 -0
- package/dist/{use-agent-harness-BMyF8pTq.js → use-agent-harness-BTcNJdw4.js} +1 -1
- package/dist/{use-agent-harness-BMyF8pTq.js.map → use-agent-harness-BTcNJdw4.js.map} +1 -1
- package/dist/utils.js +2 -1
- package/package.json +2 -1
- package/scripts/component-registry/index.ts +2 -2
- package/scripts/css-build.ts +1 -1
- package/scripts/theme-generator/config.ts +27 -141
- package/scripts/theme-generator/generate-css.ts +0 -1
- package/scripts/theme-generator/index.ts +0 -1
- package/dist/ai-conversation-CArP7C8K.js +0 -184
- package/dist/ai-conversation-CArP7C8K.js.map +0 -1
- package/dist/ai-info-banner-uFxHHwBA.js.map +0 -1
- package/dist/ai-message-BjnFznXy.js.map +0 -1
- package/dist/ai-prompt-input-Dy1LfxPk.js.map +0 -1
- package/dist/ai-response-BEUg3xvd.js.map +0 -1
- package/dist/ai-streaming-text-CMfoThV0.js.map +0 -1
- package/dist/ai-subagent-DcPRqkAA.js.map +0 -1
- package/dist/ai-task-list-Da9zIm00.js.map +0 -1
- package/dist/ai-tool-Cn1O4xjP.js.map +0 -1
- package/dist/banner-B_6oBrsu.js.map +0 -1
- package/dist/empty-D2TypIId.js.map +0 -1
- package/dist/stat-card-CEZscNh8.js.map +0 -1
- package/dist/styles/theme-blue-tint.css +0 -98
- package/dist/text-KJmGkwnf.js.map +0 -1
- package/dist/tooltip-Cb7QW-7H.js.map +0 -1
|
@@ -29,8 +29,13 @@
|
|
|
29
29
|
"optional": true
|
|
30
30
|
}
|
|
31
31
|
},
|
|
32
|
-
"examples": [
|
|
33
|
-
"
|
|
32
|
+
"examples": [
|
|
33
|
+
"<AiActions>\n <AiAction tooltip=\"Copy\">\n <CopyIcon className=\"size-4\" />\n </AiAction>\n <AiAction tooltip=\"Retry\">\n <ArrowCounterClockwiseIcon className=\"size-4\" />\n </AiAction>\n <AiAction tooltip=\"Thumbs up\">\n <ThumbsUpIcon className=\"size-4\" />\n </AiAction>\n <AiAction tooltip=\"Thumbs down\">\n <ThumbsDownIcon className=\"size-4\" />\n </AiAction>\n </AiActions>"
|
|
34
|
+
],
|
|
35
|
+
"colors": [
|
|
36
|
+
"text-sf-default",
|
|
37
|
+
"text-sf-subtle"
|
|
38
|
+
]
|
|
34
39
|
},
|
|
35
40
|
"AiAgentCard": {
|
|
36
41
|
"name": "AiAgentCard",
|
|
@@ -52,7 +57,12 @@
|
|
|
52
57
|
"type": "enum",
|
|
53
58
|
"optional": true,
|
|
54
59
|
"description": "Current status.",
|
|
55
|
-
"values": [
|
|
60
|
+
"values": [
|
|
61
|
+
"idle",
|
|
62
|
+
"running",
|
|
63
|
+
"completed",
|
|
64
|
+
"error"
|
|
65
|
+
],
|
|
56
66
|
"descriptions": {
|
|
57
67
|
"idle": "Agent is idle, not yet started",
|
|
58
68
|
"running": "Agent is actively working",
|
|
@@ -95,7 +105,10 @@
|
|
|
95
105
|
"type": "enum",
|
|
96
106
|
"optional": true,
|
|
97
107
|
"description": "Card size.",
|
|
98
|
-
"values": [
|
|
108
|
+
"values": [
|
|
109
|
+
"sm",
|
|
110
|
+
"md"
|
|
111
|
+
],
|
|
99
112
|
"descriptions": {
|
|
100
113
|
"sm": "Compact card for dense grids",
|
|
101
114
|
"md": "Default card size"
|
|
@@ -109,7 +122,11 @@
|
|
|
109
122
|
"type": {
|
|
110
123
|
"type": "enum",
|
|
111
124
|
"optional": true,
|
|
112
|
-
"values": [
|
|
125
|
+
"values": [
|
|
126
|
+
"submit",
|
|
127
|
+
"reset",
|
|
128
|
+
"button"
|
|
129
|
+
]
|
|
113
130
|
},
|
|
114
131
|
"value": {
|
|
115
132
|
"type": "string | string[] | number",
|
|
@@ -132,7 +149,12 @@
|
|
|
132
149
|
"optional": true
|
|
133
150
|
}
|
|
134
151
|
},
|
|
135
|
-
"examples": [
|
|
152
|
+
"examples": [
|
|
153
|
+
"<div className=\"flex flex-wrap gap-3\">\n <AiAgentCard\n name=\"Explore\"\n agentType=\"explore\"\n status=\"running\"\n modelId=\"claude-haiku-3.5\"\n currentTask=\"Scanning auth files for deprecated patterns...\"\n duration={4200}\n toolCallCount={3}\n />\n <AiAgentCard\n name=\"Execute\"\n agentType=\"execute\"\n status=\"running\"\n modelId=\"claude-sonnet-4\"\n currentTask=\"Rewriting jwt.ts using jose library...\"\n duration={8700}\n toolCallCount={1}\n />\n </div>",
|
|
154
|
+
"<div className=\"flex flex-wrap gap-3\">\n <AiAgentCard\n name=\"Explore\"\n agentType=\"explore\"\n status=\"idle\"\n modelId=\"claude-haiku-3.5\"\n />\n <AiAgentCard\n name=\"Plan\"\n agentType=\"plan\"\n status=\"running\"\n modelId=\"claude-sonnet-4\"\n currentTask=\"Drafting migration steps...\"\n duration={2100}\n toolCallCount={0}\n />\n <AiAgentCard\n name=\"Execute\"\n agentType=\"execute\"\n status=\"completed\"\n modelId=\"claude-sonnet-4\"\n currentTask=\"Rewrote 4 files successfully.\"\n duration={12_400}\n toolCallCount={7}\n />\n <AiAgentCard\n name=\"Test\"\n agentType=\"test\"\n status=\"error\"\n modelId=\"claude-haiku-3.5\"\n currentTask=\"3 tests failed: auth.spec.ts\"\n duration={3200}\n toolCallCount={2}\n />\n </div>",
|
|
155
|
+
"<div className=\"flex flex-wrap gap-3\">\n <AiAgentCard\n name=\"Explore\"\n agentType=\"explore\"\n status=\"completed\"\n modelId=\"claude-haiku-3.5\"\n duration={4200}\n toolCallCount={5}\n />\n <AiAgentCard\n name=\"Execute\"\n agentType=\"execute\"\n status=\"running\"\n modelId=\"claude-sonnet-4\"\n currentTask=\"Patching consumers...\"\n duration={6100}\n toolCallCount={3}\n selected\n />\n </div>",
|
|
156
|
+
"<div className=\"flex flex-wrap gap-2\">\n {[\n { name: \"Explore\", agentType: \"explore\", status: \"completed\" as const },\n { name: \"Plan\", agentType: \"plan\", status: \"completed\" as const },\n { name: \"Execute\", agentType: \"execute\", status: \"running\" as const },\n { name: \"Review\", agentType: \"review\", status: \"idle\" as const },\n ].map((agent) => (\n <AiAgentCard key={agent.name} size=\"sm\" {...agent} />\n ))}\n </div>"
|
|
157
|
+
],
|
|
136
158
|
"colors": [
|
|
137
159
|
"bg-sf-brand",
|
|
138
160
|
"bg-sf-danger",
|
|
@@ -162,7 +184,10 @@
|
|
|
162
184
|
"type": "enum",
|
|
163
185
|
"optional": true,
|
|
164
186
|
"description": "Approval kind — `\"tool\"` for individual tool calls, `\"plan\"` for multi-step plans.",
|
|
165
|
-
"values": [
|
|
187
|
+
"values": [
|
|
188
|
+
"tool",
|
|
189
|
+
"plan"
|
|
190
|
+
],
|
|
166
191
|
"descriptions": {
|
|
167
192
|
"tool": "Tool call approval",
|
|
168
193
|
"plan": "Plan approval"
|
|
@@ -173,7 +198,11 @@
|
|
|
173
198
|
"type": "enum",
|
|
174
199
|
"optional": true,
|
|
175
200
|
"description": "Current approval status.",
|
|
176
|
-
"values": [
|
|
201
|
+
"values": [
|
|
202
|
+
"pending",
|
|
203
|
+
"approved",
|
|
204
|
+
"rejected"
|
|
205
|
+
],
|
|
177
206
|
"descriptions": {
|
|
178
207
|
"pending": "Awaiting user decision",
|
|
179
208
|
"approved": "Approved by user",
|
|
@@ -233,7 +262,10 @@
|
|
|
233
262
|
"optional": true
|
|
234
263
|
}
|
|
235
264
|
},
|
|
236
|
-
"examples": [
|
|
265
|
+
"examples": [
|
|
266
|
+
"<div className=\"w-full max-w-md\">\n <AiApproval\n kind=\"tool\"\n status={status}\n title=\"Execute shell command\"\n description=\"rm -rf /tmp/cache\"\n onApprove={() => setStatus(\"approved\")}\n onReject={() => setStatus(\"rejected\")}\n />\n </div>",
|
|
267
|
+
"<div className=\"w-full max-w-md\">\n <AiApproval\n kind=\"plan\"\n status={status}\n title=\"Deployment plan\"\n description=\"The agent proposes the following steps:\"\n items={[\n { id: \"1\", label: \"Run test suite\", description: \"All 142 tests\" },\n { id: \"2\", label: \"Build production bundle\" },\n { id: \"3\", label: \"Deploy to staging\", description: \"us-east-1\" },\n { id: \"4\", label: \"Run smoke tests\" },\n { id: \"5\", label: \"Promote to production\" },\n ]}\n showFeedback\n onApprove={() => setStatus(\"approved\")}\n onReject={() => setStatus(\"rejected\")}\n />\n </div>"
|
|
268
|
+
],
|
|
237
269
|
"colors": [
|
|
238
270
|
"bg-sf-base",
|
|
239
271
|
"bg-sf-brand",
|
|
@@ -291,7 +323,11 @@
|
|
|
291
323
|
"optional": true
|
|
292
324
|
}
|
|
293
325
|
},
|
|
294
|
-
"examples": [
|
|
326
|
+
"examples": [
|
|
327
|
+
"<AiCodeBlock code={CODE} language=\"tsx\">\n <AiCodeBlockCopyButton />\n </AiCodeBlock>",
|
|
328
|
+
"<AiCodeBlock\n code={`function greet(name: string) {\\n return \\`Hello, \\${name}!\\`;\\n}`}\n language=\"ts\"\n showLineNumbers\n >\n <AiCodeBlockCopyButton />\n </AiCodeBlock>",
|
|
329
|
+
"<AiCodeBlock code=\"npm install @signalflare-ai/ui\">\n <AiCodeBlockCopyButton />\n </AiCodeBlock>"
|
|
330
|
+
],
|
|
295
331
|
"colors": [
|
|
296
332
|
"bg-sf-recessed",
|
|
297
333
|
"border-sf-line",
|
|
@@ -328,7 +364,9 @@
|
|
|
328
364
|
"optional": true
|
|
329
365
|
}
|
|
330
366
|
},
|
|
331
|
-
"examples": [
|
|
367
|
+
"examples": [
|
|
368
|
+
"<div className=\"h-80 w-full overflow-hidden rounded-lg border border-sf-line\">\n <AiConversation>\n <AiConversationContent>\n {MESSAGES.map((m) => (\n <AiMessage key={m.id} from={m.from}>\n <AiMessageContent>\n <AiResponse>{m.text}</AiResponse>\n </AiMessageContent>\n </AiMessage>\n ))}\n </AiConversationContent>\n </AiConversation>\n </div>"
|
|
369
|
+
],
|
|
332
370
|
"colors": []
|
|
333
371
|
},
|
|
334
372
|
"AiInfoBanner": {
|
|
@@ -342,7 +380,11 @@
|
|
|
342
380
|
"type": "enum",
|
|
343
381
|
"optional": true,
|
|
344
382
|
"description": "Banner level controls icon and color treatment.",
|
|
345
|
-
"values": [
|
|
383
|
+
"values": [
|
|
384
|
+
"info",
|
|
385
|
+
"error",
|
|
386
|
+
"change"
|
|
387
|
+
],
|
|
346
388
|
"descriptions": {
|
|
347
389
|
"info": "Informational notice",
|
|
348
390
|
"error": "Error notice",
|
|
@@ -376,7 +418,9 @@
|
|
|
376
418
|
"optional": true
|
|
377
419
|
}
|
|
378
420
|
},
|
|
379
|
-
"examples": [
|
|
421
|
+
"examples": [
|
|
422
|
+
"<div className=\"flex w-full flex-col gap-3\">\n <AiInfoBanner level=\"info\">\n Follow-up message queued — will send after current response completes\n </AiInfoBanner>\n <AiInfoBanner level=\"change\">Switched to claude-opus-4-6</AiInfoBanner>\n <AiInfoBanner level=\"error\">\n Connection lost. Retrying in 3s…\n </AiInfoBanner>\n </div>"
|
|
423
|
+
],
|
|
380
424
|
"colors": [
|
|
381
425
|
"border-sf-danger",
|
|
382
426
|
"border-sf-info",
|
|
@@ -397,7 +441,11 @@
|
|
|
397
441
|
"type": "enum",
|
|
398
442
|
"required": true,
|
|
399
443
|
"description": "Message sender role — controls layout and group class.",
|
|
400
|
-
"values": [
|
|
444
|
+
"values": [
|
|
445
|
+
"user",
|
|
446
|
+
"assistant",
|
|
447
|
+
"system"
|
|
448
|
+
],
|
|
401
449
|
"descriptions": {
|
|
402
450
|
"user": "User message — right-aligned with max width",
|
|
403
451
|
"assistant": "Assistant message — full width left-aligned",
|
|
@@ -431,7 +479,11 @@
|
|
|
431
479
|
"optional": true
|
|
432
480
|
}
|
|
433
481
|
},
|
|
434
|
-
"examples": [
|
|
482
|
+
"examples": [
|
|
483
|
+
"<div className=\"flex w-full flex-col gap-2 p-4\">\n <AiMessage from=\"user\">\n <AiMessageContent>What is the capital of France?</AiMessageContent>\n </AiMessage>\n <AiMessage from=\"assistant\">\n <AiMessageContent>\n <AiResponse>{\"The capital of France is **Paris**.\"}</AiResponse>\n </AiMessageContent>\n <AiMessageToolbar>\n <AiMessageActions>\n <AiMessageAction tooltip=\"Copy\">\n <CopyIcon className=\"size-4\" />\n </AiMessageAction>\n <AiMessageAction tooltip=\"Retry\">\n <ArrowCounterClockwiseIcon className=\"size-4\" />\n </AiMessageAction>\n </AiMessageActions>\n </AiMessageToolbar>\n </AiMessage>\n </div>",
|
|
484
|
+
"<AiMessage from=\"user\">\n <AiMessageContent>Can you summarise this document?</AiMessageContent>\n </AiMessage>",
|
|
485
|
+
"<AiMessage from=\"assistant\">\n <AiMessageContent>\n <AiResponse>\n {\n \"Here is the summary you requested. The document covers three main topics: **architecture**, **deployment**, and **monitoring**.\"\n }\n </AiResponse>\n </AiMessageContent>\n </AiMessage>"
|
|
486
|
+
],
|
|
435
487
|
"colors": [
|
|
436
488
|
"bg-sf-control",
|
|
437
489
|
"bg-sf-overlay",
|
|
@@ -491,7 +543,10 @@
|
|
|
491
543
|
"type": "enum",
|
|
492
544
|
"optional": true,
|
|
493
545
|
"description": "Display variant.",
|
|
494
|
-
"values": [
|
|
546
|
+
"values": [
|
|
547
|
+
"default",
|
|
548
|
+
"compact"
|
|
549
|
+
],
|
|
495
550
|
"descriptions": {
|
|
496
551
|
"default": "Full header with all stats",
|
|
497
552
|
"compact": "Single-row compact header"
|
|
@@ -515,7 +570,11 @@
|
|
|
515
570
|
"optional": true
|
|
516
571
|
}
|
|
517
572
|
},
|
|
518
|
-
"examples": [
|
|
573
|
+
"examples": [
|
|
574
|
+
"<AiMissionHeader\n title=\"Refactor auth module\"\n taskList={{\n title: \"Refactor auth module\",\n tasks: [\n {\n id: \"t1\",\n content: \"Explore authentication codebase\",\n status: \"completed\",\n priority: \"high\",\n },\n {\n id: \"t2\",\n content: \"Identify deprecated patterns\",\n status: \"completed\",\n priority: \"high\",\n },\n {\n id: \"t3\",\n content: \"Write updated auth helpers\",\n status: \"in_progress\",\n priority: \"medium\",\n },\n {\n id: \"t4\",\n content: \"Update all consumers\",\n status: \"pending\",\n priority: \"medium\",\n },\n {\n id: \"t5\",\n content: \"Update tests\",\n status: \"pending\",\n priority: \"low\",\n },\n ],\n }}\n usage={{\n inputTokens: 12_480,\n outputTokens: 3256,\n totalTokens: 15_736,\n cost: 0.04,\n }}\n activeAgentCount={2}\n totalAgentCount={4}\n startedAt={startedAt}\n isRunning\n />",
|
|
575
|
+
"<AiMissionHeader\n title=\"Deploy to production\"\n taskList={{\n tasks: [\n {\n id: \"t1\",\n content: \"Run tests\",\n status: \"completed\",\n priority: \"high\",\n },\n {\n id: \"t2\",\n content: \"Build artifacts\",\n status: \"completed\",\n priority: \"high\",\n },\n {\n id: \"t3\",\n content: \"Deploy to staging\",\n status: \"completed\",\n priority: \"medium\",\n },\n {\n id: \"t4\",\n content: \"Smoke test\",\n status: \"completed\",\n priority: \"medium\",\n },\n {\n id: \"t5\",\n content: \"Deploy to production\",\n status: \"completed\",\n priority: \"high\",\n },\n ],\n }}\n usage={{ totalTokens: 28_400, cost: 0.12 }}\n activeAgentCount={0}\n totalAgentCount={3}\n startedAt={startedAt}\n endedAt={endedAt}\n isRunning={false}\n />",
|
|
576
|
+
"<AiMissionHeader\n title=\"Analyze codebase\"\n activeAgentCount={1}\n totalAgentCount={2}\n startedAt={startedAt}\n isRunning\n variant=\"compact\"\n />"
|
|
577
|
+
],
|
|
519
578
|
"colors": [
|
|
520
579
|
"bg-sf-base",
|
|
521
580
|
"bg-sf-brand",
|
|
@@ -569,7 +628,9 @@
|
|
|
569
628
|
"optional": true
|
|
570
629
|
}
|
|
571
630
|
},
|
|
572
|
-
"examples": [
|
|
631
|
+
"examples": [
|
|
632
|
+
"<div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <Text variant=\"secondary\" size=\"sm\">\n Rolling window of 3 rows while streaming. Collapses to a single frozen\n line when complete.\n </Text>\n <Button\n onClick={() => setRunId((n) => n + 1)}\n size=\"sm\"\n variant=\"ghost\"\n >\n Run again\n </Button>\n </div>\n <div className=\"min-h-[6rem] rounded-md border border-sf-line/40 bg-sf-base/40 p-3\">\n <AiPartGroup\n complete={complete}\n groupKey={`activity-demo-${runId}`}\n max={3}\n title=\"Investigating failing auth tests\"\n >\n {steps.map((s) =>\n s.kind === \"tool\" ? (\n <AiToolCall\n duration={s.duration}\n key={s.part.toolCallId}\n part={s.part}\n variant=\"ephemeral\"\n />\n ) : (\n <AiReasoning\n duration={s.duration}\n isStreaming={s.isStreaming}\n key={s.id}\n part={{ text: s.text }}\n variant=\"ephemeral\"\n />\n )\n )}\n </AiPartGroup>\n </div>\n </div>"
|
|
633
|
+
],
|
|
573
634
|
"colors": [
|
|
574
635
|
"bg-sf-tint",
|
|
575
636
|
"border-sf-line",
|
|
@@ -605,7 +666,10 @@
|
|
|
605
666
|
"type": "enum",
|
|
606
667
|
"optional": true,
|
|
607
668
|
"description": "Current status.",
|
|
608
|
-
"values": [
|
|
669
|
+
"values": [
|
|
670
|
+
"pending",
|
|
671
|
+
"answered"
|
|
672
|
+
],
|
|
609
673
|
"descriptions": {
|
|
610
674
|
"pending": "Waiting for answer",
|
|
611
675
|
"answered": "User has answered"
|
|
@@ -649,7 +713,10 @@
|
|
|
649
713
|
"optional": true
|
|
650
714
|
}
|
|
651
715
|
},
|
|
652
|
-
"examples": [
|
|
716
|
+
"examples": [
|
|
717
|
+
"<div className=\"w-full max-w-md\">\n <AiQuestion\n questionId=\"q-demo-1\"\n question=\"How should I handle the failing tests?\"\n header=\"Decision needed\"\n status={status}\n answeredWith={answer}\n options={[\n {\n label: \"Fix them\",\n description: \"Update the test expectations to match new behavior\",\n },\n {\n label: \"Skip them\",\n description: \"Mark as skipped for now and create a ticket\",\n },\n {\n label: \"Delete them\",\n description: \"Remove outdated tests entirely\",\n },\n ]}\n allowCustom\n onAnswer={(_id, ans) => {\n setAnswer(ans);\n setStatus(\"answered\");\n }}\n />\n </div>",
|
|
718
|
+
"<div className=\"w-full max-w-md\">\n <AiQuestion\n questionId=\"q-demo-2\"\n question=\"What should the commit message be for these changes?\"\n status={status}\n answeredWith={answer}\n allowCustom\n onAnswer={(_id, ans) => {\n setAnswer(ans);\n setStatus(\"answered\");\n }}\n />\n </div>"
|
|
719
|
+
],
|
|
653
720
|
"colors": [
|
|
654
721
|
"bg-sf-base",
|
|
655
722
|
"bg-sf-brand",
|
|
@@ -676,7 +743,12 @@
|
|
|
676
743
|
"type": "enum",
|
|
677
744
|
"optional": true,
|
|
678
745
|
"description": "Display variant.",
|
|
679
|
-
"values": [
|
|
746
|
+
"values": [
|
|
747
|
+
"default",
|
|
748
|
+
"inline",
|
|
749
|
+
"minimal",
|
|
750
|
+
"ephemeral"
|
|
751
|
+
],
|
|
680
752
|
"descriptions": {
|
|
681
753
|
"default": "Expandable card with collapsible reasoning text and duration",
|
|
682
754
|
"inline": "Compact single-line display with left accent border",
|
|
@@ -756,7 +828,15 @@
|
|
|
756
828
|
"optional": true
|
|
757
829
|
}
|
|
758
830
|
},
|
|
759
|
-
"examples": [
|
|
831
|
+
"examples": [
|
|
832
|
+
"<AiReasoning\n part={{ text: SAMPLE_REASONING }}\n isStreaming={false}\n duration={3}\n defaultExpanded\n />",
|
|
833
|
+
"<AiReasoning\n part={{ text: \"Analysing context and forming a response...\" }}\n isStreaming\n />",
|
|
834
|
+
"<AiReasoning\n variant=\"inline\"\n part={{ text: SAMPLE_REASONING }}\n isStreaming={false}\n />",
|
|
835
|
+
"<AiReasoning\n variant=\"minimal\"\n part={{ text: SAMPLE_REASONING }}\n isStreaming={false}\n />",
|
|
836
|
+
"<AiReasoning\n part={{ text: RICH_MARKDOWN_REASONING }}\n isStreaming={false}\n duration={5}\n defaultExpanded\n />",
|
|
837
|
+
"<div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <Text variant=\"secondary\" size=\"sm\">\n Reasoning row evaporates 800ms after streaming ends.\n </Text>\n <Button\n onClick={() => setRunId((n) => n + 1)}\n size=\"sm\"\n variant=\"ghost\"\n >\n Think again\n </Button>\n </div>\n <div\n className={\n \"min-h-[3.5rem] rounded-md border border-sf-line/40 bg-sf-base/40 p-3\"\n }\n >\n <AiReasoning\n // `key` ensures each replay re-mounts to reset the dismiss state.\n key={runId}\n variant=\"ephemeral\"\n part={{\n text: \"**Reviewing diff** — checking for breaking changes in the migration.\",\n }}\n isStreaming={isStreaming}\n />\n </div>\n </div>",
|
|
838
|
+
"<AiReasoningGroup\n parts={[\n { text: \"**Step 1** — Understood the user intent and context.\" },\n { text: \"**Step 2** — Reviewed relevant data and constraints.\" },\n { text: \"**Step 3** — Formulated the final response structure.\" },\n ]}\n isStreaming={false}\n totalDuration={7}\n defaultExpanded\n />"
|
|
839
|
+
],
|
|
760
840
|
"colors": [
|
|
761
841
|
"bg-sf-tint",
|
|
762
842
|
"border-sf-line",
|
|
@@ -780,8 +860,15 @@
|
|
|
780
860
|
"description": "Child elements"
|
|
781
861
|
}
|
|
782
862
|
},
|
|
783
|
-
"examples": [
|
|
784
|
-
|
|
863
|
+
"examples": [
|
|
864
|
+
"<AiResponse>{MARKDOWN_LIKE}</AiResponse>",
|
|
865
|
+
"<AiResponse>The capital of France is Paris.</AiResponse>",
|
|
866
|
+
"<AiResponse>{MARKDOWN_WITH_CODE}</AiResponse>",
|
|
867
|
+
"<AiResponse isAnimating={isAnimating}>{text}</AiResponse>"
|
|
868
|
+
],
|
|
869
|
+
"colors": [
|
|
870
|
+
"text-sf-default"
|
|
871
|
+
]
|
|
785
872
|
},
|
|
786
873
|
"AiShimmer": {
|
|
787
874
|
"name": "AiShimmer",
|
|
@@ -816,7 +903,11 @@
|
|
|
816
903
|
"description": "Shimmer width multiplier relative to text length."
|
|
817
904
|
}
|
|
818
905
|
},
|
|
819
|
-
"examples": [
|
|
906
|
+
"examples": [
|
|
907
|
+
"<AiShimmer>Thinking...</AiShimmer>",
|
|
908
|
+
"<p className=\"text-sf-default text-sm\">\n The AI is{\" \"}\n <AiShimmer as=\"span\" duration={1.5}>\n generating a response\n </AiShimmer>\n .\n </p>",
|
|
909
|
+
"<AiShimmer duration={4}>Analysing your request...</AiShimmer>"
|
|
910
|
+
],
|
|
820
911
|
"colors": []
|
|
821
912
|
},
|
|
822
913
|
"AiStatusBadge": {
|
|
@@ -840,7 +931,12 @@
|
|
|
840
931
|
"type": "enum",
|
|
841
932
|
"optional": true,
|
|
842
933
|
"description": "Current status — determines the status icon on the right.",
|
|
843
|
-
"values": [
|
|
934
|
+
"values": [
|
|
935
|
+
"idle",
|
|
936
|
+
"running",
|
|
937
|
+
"success",
|
|
938
|
+
"error"
|
|
939
|
+
],
|
|
844
940
|
"descriptions": {
|
|
845
941
|
"idle": "Default idle state — no status icon shown",
|
|
846
942
|
"running": "Actively running — spinner icon shown",
|
|
@@ -875,7 +971,12 @@
|
|
|
875
971
|
"optional": true
|
|
876
972
|
}
|
|
877
973
|
},
|
|
878
|
-
"examples": [
|
|
974
|
+
"examples": [
|
|
975
|
+
"<AiStatusBadge\n icon={MagnifyingGlassIcon}\n label=\"web_search\"\n status=\"idle\"\n />",
|
|
976
|
+
"<div className=\"flex flex-wrap gap-2\">\n <AiStatusBadge icon={GlobeIcon} label=\"search_web\" status=\"idle\" />\n <AiStatusBadge icon={GlobeIcon} label=\"search_web\" status=\"running\" />\n <AiStatusBadge icon={GlobeIcon} label=\"search_web\" status=\"success\" />\n <AiStatusBadge icon={GlobeIcon} label=\"search_web\" status=\"error\" />\n </div>",
|
|
977
|
+
"<div className=\"flex flex-wrap gap-2\">\n <AiStatusBadge\n icon={DatabaseIcon}\n label=\"query_db\"\n info=\"3/5\"\n status=\"running\"\n />\n <AiStatusBadge\n icon={BrainIcon}\n label=\"analyse\"\n info=\"done\"\n status=\"success\"\n />\n </div>",
|
|
978
|
+
"<div className=\"flex flex-wrap gap-2\">\n <AiStatusBadge label=\"processing\" status=\"running\" />\n <AiStatusBadge label=\"complete\" status=\"success\" />\n </div>"
|
|
979
|
+
],
|
|
879
980
|
"colors": [
|
|
880
981
|
"bg-sf-tint",
|
|
881
982
|
"text-sf-brand",
|
|
@@ -900,7 +1001,9 @@
|
|
|
900
1001
|
"description": "Child elements"
|
|
901
1002
|
}
|
|
902
1003
|
},
|
|
903
|
-
"examples": [
|
|
1004
|
+
"examples": [
|
|
1005
|
+
"<p className=\"max-w-sm text-sf-default text-sm\">\n {displayed}\n {streaming && (\n <span className=\"ml-0.5 inline-block h-4 w-0.5 animate-pulse bg-sf-brand\" />\n )}\n </p>"
|
|
1006
|
+
],
|
|
904
1007
|
"colors": []
|
|
905
1008
|
},
|
|
906
1009
|
"AiSubagent": {
|
|
@@ -924,7 +1027,11 @@
|
|
|
924
1027
|
"type": "enum",
|
|
925
1028
|
"optional": true,
|
|
926
1029
|
"description": "Current status.",
|
|
927
|
-
"values": [
|
|
1030
|
+
"values": [
|
|
1031
|
+
"running",
|
|
1032
|
+
"completed",
|
|
1033
|
+
"error"
|
|
1034
|
+
],
|
|
928
1035
|
"descriptions": {
|
|
929
1036
|
"running": "Subagent is actively processing",
|
|
930
1037
|
"completed": "Subagent finished successfully",
|
|
@@ -978,12 +1085,15 @@
|
|
|
978
1085
|
"optional": true
|
|
979
1086
|
}
|
|
980
1087
|
},
|
|
981
|
-
"examples": [
|
|
1088
|
+
"examples": [
|
|
1089
|
+
"<div className=\"w-full max-w-lg\">\n <AiSubagent\n name=\"Explore\"\n agentType=\"explore\"\n status=\"running\"\n modelId=\"claude-haiku-3.5\"\n defaultExpanded\n >\n <div className=\"flex flex-col gap-1.5 text-sm text-sf-subtle\">\n <p>Searching codebase for authentication patterns...</p>\n <div className=\"flex items-center gap-2 border-l-2 border-sf-fill py-1 pl-2 text-xs\">\n <span className=\"text-sf-brand\">Glob</span>\n <span className=\"text-sf-subtle\">src/**/*auth*</span>\n </div>\n <div className=\"flex items-center gap-2 border-l-2 border-sf-fill py-1 pl-2 text-xs\">\n <span className=\"text-sf-brand\">Read</span>\n <span className=\"text-sf-subtle\">src/middleware/auth.ts</span>\n </div>\n </div>\n </AiSubagent>\n </div>",
|
|
1090
|
+
"<div className=\"w-full max-w-lg\">\n <AiSubagent\n name=\"Execute\"\n agentType=\"execute\"\n status=\"completed\"\n modelId=\"claude-sonnet-4\"\n duration={12400}\n defaultExpanded={false}\n >\n <div className=\"text-sm text-sf-subtle\">\n <p>Refactored 3 files, added 2 new tests. All tests passing.</p>\n </div>\n </AiSubagent>\n </div>",
|
|
1091
|
+
"<div className=\"w-full max-w-lg\">\n <AiSubagent\n name=\"Plan\"\n agentType=\"plan\"\n status=\"completed\"\n modelId=\"claude-sonnet-4\"\n duration={28000}\n defaultExpanded\n >\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-sm text-sf-subtle\">\n Breaking down the migration into subtasks...\n </p>\n <AiSubagent\n name=\"Explore\"\n agentType=\"explore\"\n status=\"completed\"\n modelId=\"claude-haiku-3.5\"\n duration={4200}\n defaultExpanded={false}\n >\n <p className=\"text-sm text-sf-subtle\">\n Found 12 files using deprecated API.\n </p>\n </AiSubagent>\n <AiSubagent\n name=\"Execute\"\n agentType=\"execute\"\n status=\"running\"\n modelId=\"claude-sonnet-4\"\n defaultExpanded\n >\n <p className=\"text-sm text-sf-subtle\">\n Updating import paths in batch 1/3...\n </p>\n </AiSubagent>\n </div>\n </AiSubagent>\n </div>"
|
|
1092
|
+
],
|
|
982
1093
|
"colors": [
|
|
983
1094
|
"bg-sf-tint",
|
|
984
1095
|
"text-sf-brand",
|
|
985
1096
|
"text-sf-danger",
|
|
986
|
-
"text-sf-default",
|
|
987
1097
|
"text-sf-subtle",
|
|
988
1098
|
"text-sf-success"
|
|
989
1099
|
]
|
|
@@ -1063,7 +1173,10 @@
|
|
|
1063
1173
|
"optional": true
|
|
1064
1174
|
}
|
|
1065
1175
|
},
|
|
1066
|
-
"examples": [
|
|
1176
|
+
"examples": [
|
|
1177
|
+
"<div className=\"w-full max-w-sm\">\n <AiTaskList title=\"Agent tasks\" tasks={tasks} />\n </div>",
|
|
1178
|
+
"<div className=\"w-full max-w-sm\">\n <AiTaskList title=\"Cleanup tasks\" tasks={tasks} />\n </div>"
|
|
1179
|
+
],
|
|
1067
1180
|
"colors": [
|
|
1068
1181
|
"bg-sf-brand",
|
|
1069
1182
|
"bg-sf-danger",
|
|
@@ -1106,7 +1219,10 @@
|
|
|
1106
1219
|
"type": "enum",
|
|
1107
1220
|
"optional": true,
|
|
1108
1221
|
"description": "Lane density variant.",
|
|
1109
|
-
"values": [
|
|
1222
|
+
"values": [
|
|
1223
|
+
"comfortable",
|
|
1224
|
+
"compact"
|
|
1225
|
+
],
|
|
1110
1226
|
"descriptions": {
|
|
1111
1227
|
"comfortable": "Taller lanes with more padding",
|
|
1112
1228
|
"compact": "Tight lanes for dense views"
|
|
@@ -1135,7 +1251,11 @@
|
|
|
1135
1251
|
"optional": true
|
|
1136
1252
|
}
|
|
1137
1253
|
},
|
|
1138
|
-
"examples": [
|
|
1254
|
+
"examples": [
|
|
1255
|
+
"<AiTimeline\n timeOrigin={T0}\n pixelsPerSecond={25}\n showNowMarker\n nowMs={nowMs}\n >\n <AiTimelineLane\n label=\"Main\"\n agentType=\"main\"\n status=\"running\"\n modelId=\"claude-sonnet-4\"\n blocks={mainBlocks}\n timeOrigin={T0}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n />\n <AiTimelineLane\n label=\"Explore\"\n agentType=\"explore\"\n status=\"completed\"\n modelId=\"claude-haiku-3.5\"\n blocks={exploreBlocks}\n timeOrigin={T0}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n />\n <AiTimelineLane\n label=\"Plan\"\n agentType=\"plan\"\n status=\"completed\"\n modelId=\"claude-sonnet-4\"\n blocks={planBlocks}\n timeOrigin={T0}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n />\n <AiTimelineLane\n label=\"Execute\"\n agentType=\"execute\"\n status=\"running\"\n modelId=\"claude-sonnet-4\"\n blocks={executeBlocks}\n timeOrigin={T0}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n />\n </AiTimeline>",
|
|
1256
|
+
"<AiTimeline\n timeOrigin={T0}\n pixelsPerSecond={25}\n showNowMarker\n nowMs={nowMs}\n >\n <AiTimelineLane\n label=\"Explore\"\n agentType=\"explore\"\n status=\"completed\"\n blocks={exploreBlocks}\n timeOrigin={T0}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n density=\"compact\"\n />\n <AiTimelineLane\n label=\"Execute\"\n agentType=\"execute\"\n status=\"running\"\n blocks={executeBlocks}\n timeOrigin={T0}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n density=\"compact\"\n />\n </AiTimeline>",
|
|
1257
|
+
"<AiTimeline\n timeOrigin={t}\n pixelsPerSecond={30}\n showNowMarker={false}\n nowMs={nowMs}\n >\n <AiTimelineLane\n label=\"Agent\"\n blocks={allTypeBlocks}\n timeOrigin={t}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n />\n </AiTimeline>"
|
|
1258
|
+
],
|
|
1139
1259
|
"colors": [
|
|
1140
1260
|
"bg-sf-base",
|
|
1141
1261
|
"bg-sf-brand",
|
|
@@ -1169,7 +1289,12 @@
|
|
|
1169
1289
|
"type": "enum",
|
|
1170
1290
|
"optional": true,
|
|
1171
1291
|
"description": "Display variant.",
|
|
1172
|
-
"values": [
|
|
1292
|
+
"values": [
|
|
1293
|
+
"default",
|
|
1294
|
+
"inline",
|
|
1295
|
+
"minimal",
|
|
1296
|
+
"ephemeral"
|
|
1297
|
+
],
|
|
1173
1298
|
"descriptions": {
|
|
1174
1299
|
"default": "Expandable card with collapsible input/output sections",
|
|
1175
1300
|
"inline": "Compact single-line display with left accent border",
|
|
@@ -1197,7 +1322,11 @@
|
|
|
1197
1322
|
"type": "enum",
|
|
1198
1323
|
"optional": true,
|
|
1199
1324
|
"description": "Approval state for tools requiring confirmation.",
|
|
1200
|
-
"values": [
|
|
1325
|
+
"values": [
|
|
1326
|
+
"awaiting",
|
|
1327
|
+
"approved",
|
|
1328
|
+
"declined"
|
|
1329
|
+
]
|
|
1201
1330
|
},
|
|
1202
1331
|
"defaultExpanded": {
|
|
1203
1332
|
"type": "boolean",
|
|
@@ -1312,8 +1441,14 @@
|
|
|
1312
1441
|
"optional": true
|
|
1313
1442
|
}
|
|
1314
1443
|
},
|
|
1315
|
-
"examples": [
|
|
1316
|
-
|
|
1444
|
+
"examples": [
|
|
1445
|
+
"<div className=\"w-full max-w-md rounded-lg border border-sf-line\">\n <AiUsageBar\n inputTokens={12480}\n outputTokens={3256}\n cost={0.04}\n modelId=\"claude-sonnet-4\"\n />\n </div>",
|
|
1446
|
+
"<div className=\"w-full max-w-sm rounded-lg border border-sf-line\">\n <AiUsageBar inputTokens={850} outputTokens={124} />\n </div>"
|
|
1447
|
+
],
|
|
1448
|
+
"colors": [
|
|
1449
|
+
"text-sf-inactive",
|
|
1450
|
+
"text-sf-subtle"
|
|
1451
|
+
]
|
|
1317
1452
|
},
|
|
1318
1453
|
"Badge": {
|
|
1319
1454
|
"name": "Badge",
|
|
@@ -1380,7 +1515,10 @@
|
|
|
1380
1515
|
"type": "enum",
|
|
1381
1516
|
"optional": true,
|
|
1382
1517
|
"description": "Position of the icon relative to the text.",
|
|
1383
|
-
"values": [
|
|
1518
|
+
"values": [
|
|
1519
|
+
"left",
|
|
1520
|
+
"right"
|
|
1521
|
+
]
|
|
1384
1522
|
},
|
|
1385
1523
|
"loading": {
|
|
1386
1524
|
"type": "boolean",
|
|
@@ -1391,7 +1529,13 @@
|
|
|
1391
1529
|
"type": "enum",
|
|
1392
1530
|
"optional": true,
|
|
1393
1531
|
"description": "Renders a small colored status dot before the text.",
|
|
1394
|
-
"values": [
|
|
1532
|
+
"values": [
|
|
1533
|
+
"green",
|
|
1534
|
+
"red",
|
|
1535
|
+
"yellow",
|
|
1536
|
+
"blue",
|
|
1537
|
+
"gray"
|
|
1538
|
+
]
|
|
1395
1539
|
},
|
|
1396
1540
|
"tooltip": {
|
|
1397
1541
|
"type": "ReactNode",
|
|
@@ -1403,7 +1547,25 @@
|
|
|
1403
1547
|
"optional": true
|
|
1404
1548
|
}
|
|
1405
1549
|
},
|
|
1406
|
-
"examples": [
|
|
1550
|
+
"examples": [
|
|
1551
|
+
"<div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"primary\">Primary</Badge>\n <Badge variant=\"secondary\">Secondary</Badge>\n <Badge variant=\"destructive\">Destructive</Badge>\n <Badge variant=\"outline\">Outline</Badge>\n <Badge variant=\"beta\">Beta</Badge>\n <Badge variant=\"success\">Success</Badge>\n <Badge variant=\"warning\">Warning</Badge>\n <Badge variant=\"info\">Info</Badge>\n <Badge variant=\"ghost\">Ghost</Badge>\n </div>",
|
|
1552
|
+
"<Badge variant=\"primary\">Primary</Badge>",
|
|
1553
|
+
"<Badge variant=\"secondary\">Secondary</Badge>",
|
|
1554
|
+
"<Badge variant=\"destructive\">Destructive</Badge>",
|
|
1555
|
+
"<Badge variant=\"outline\">Outline</Badge>",
|
|
1556
|
+
"<Badge variant=\"beta\">Beta</Badge>",
|
|
1557
|
+
"<Badge variant=\"success\">Success</Badge>",
|
|
1558
|
+
"<Badge variant=\"warning\">Warning</Badge>",
|
|
1559
|
+
"<Badge variant=\"info\">Info</Badge>",
|
|
1560
|
+
"<Badge variant=\"ghost\">Ghost</Badge>",
|
|
1561
|
+
"<p className=\"flex items-center gap-2\">\n Workers\n <Badge variant=\"beta\">Beta</Badge>\n </p>",
|
|
1562
|
+
"<div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"success\" icon={CheckCircleIcon}>\n Verified\n </Badge>\n <Badge variant=\"secondary\" icon={LightningIcon}>\n Boosted\n </Badge>\n <Badge variant=\"outline\" icon={TagIcon} iconPosition=\"right\">\n Tagged\n </Badge>\n </div>",
|
|
1563
|
+
"<div className=\"flex flex-wrap items-center gap-2\">\n {tags.map((tag) => (\n <Badge\n key={tag}\n variant=\"secondary\"\n onDismiss={() => setTags((t) => t.filter((v) => v !== tag))}\n >\n {tag}\n </Badge>\n ))}\n {tags.length === 0 && (\n <span className=\"text-sm text-sf-subtle\">All tags removed</span>\n )}\n </div>",
|
|
1564
|
+
"<div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"secondary\" loading>\n Syncing\n </Badge>\n <Badge variant=\"info\" loading>\n Deploying\n </Badge>\n </div>",
|
|
1565
|
+
"<div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"outline\" dot=\"green\">\n Online\n </Badge>\n <Badge variant=\"outline\" dot=\"red\">\n Offline\n </Badge>\n <Badge variant=\"outline\" dot=\"yellow\">\n Degraded\n </Badge>\n <Badge variant=\"outline\" dot=\"blue\">\n Deploying\n </Badge>\n </div>",
|
|
1566
|
+
"<div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"secondary\" onClick={handleBadgeClick}>\n Clickable\n </Badge>\n <Badge variant=\"info\" href=\"https://example.com\">\n Link badge\n </Badge>\n </div>",
|
|
1567
|
+
"<TooltipProvider>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"success\" tooltip=\"Deployed 2 hours ago\" dot=\"green\">\n Production\n </Badge>\n <Badge variant=\"outline\" tooltip=\"3 of 5 tasks complete\">\n 3/5\n </Badge>\n </div>\n </TooltipProvider>"
|
|
1568
|
+
],
|
|
1407
1569
|
"colors": [
|
|
1408
1570
|
"bg-sf-brand",
|
|
1409
1571
|
"bg-sf-contrast",
|
|
@@ -1449,7 +1611,11 @@
|
|
|
1449
1611
|
"type": "enum",
|
|
1450
1612
|
"optional": true,
|
|
1451
1613
|
"description": "Visual style of the banner.\n- `\"default\"` — Informational blue banner for general messages\n- `\"alert\"` — Warning yellow banner for cautionary messages\n- `\"error\"` — Error red banner for critical issues",
|
|
1452
|
-
"values": [
|
|
1614
|
+
"values": [
|
|
1615
|
+
"default",
|
|
1616
|
+
"alert",
|
|
1617
|
+
"error"
|
|
1618
|
+
],
|
|
1453
1619
|
"descriptions": {
|
|
1454
1620
|
"default": "Informational banner for general messages",
|
|
1455
1621
|
"alert": "Warning banner for cautionary messages",
|
|
@@ -1468,7 +1634,14 @@
|
|
|
1468
1634
|
"description": "Additional CSS classes merged via `cn()`."
|
|
1469
1635
|
}
|
|
1470
1636
|
},
|
|
1471
|
-
"examples": [
|
|
1637
|
+
"examples": [
|
|
1638
|
+
"<div className=\"space-y-3\">\n <Banner>This is an informational banner.</Banner>\n <Banner variant=\"alert\">This is an alert banner.</Banner>\n <Banner variant=\"error\">This is an error banner.</Banner>\n </div>",
|
|
1639
|
+
"<Banner>This is an informational banner.</Banner>",
|
|
1640
|
+
"<Banner variant=\"alert\">Your session will expire soon.</Banner>",
|
|
1641
|
+
"<Banner variant=\"error\">We couldn't save your changes.</Banner>",
|
|
1642
|
+
"<Banner icon={<WarningCircleIcon />} variant=\"alert\">\n Review your billing information.\n </Banner>",
|
|
1643
|
+
"<Banner icon={<InfoIcon />}>\n <Text DANGEROUS_className=\"text-inherit\">\n This banner supports <strong>custom content</strong> with Text.\n </Text>\n </Banner>"
|
|
1644
|
+
],
|
|
1472
1645
|
"colors": [
|
|
1473
1646
|
"bg-sf-danger",
|
|
1474
1647
|
"bg-sf-danger-tint",
|
|
@@ -1496,7 +1669,10 @@
|
|
|
1496
1669
|
"type": "enum",
|
|
1497
1670
|
"optional": true,
|
|
1498
1671
|
"description": "Size of the breadcrumbs.\n- `\"sm\"` — Compact breadcrumbs for dense UIs\n- `\"base\"` — Default breadcrumbs size",
|
|
1499
|
-
"values": [
|
|
1672
|
+
"values": [
|
|
1673
|
+
"sm",
|
|
1674
|
+
"base"
|
|
1675
|
+
],
|
|
1500
1676
|
"descriptions": {
|
|
1501
1677
|
"sm": "Compact breadcrumbs for dense UIs",
|
|
1502
1678
|
"base": "Default breadcrumbs size"
|
|
@@ -1517,8 +1693,18 @@
|
|
|
1517
1693
|
"description": "Additional CSS classes merged via `cn()`."
|
|
1518
1694
|
}
|
|
1519
1695
|
},
|
|
1520
|
-
"examples": [
|
|
1521
|
-
|
|
1696
|
+
"examples": [
|
|
1697
|
+
"<Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Link href=\"#\">Docs</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Breadcrumbs</Breadcrumbs.Current>\n </Breadcrumbs>",
|
|
1698
|
+
"<Breadcrumbs>\n <Breadcrumbs.Link href=\"#\" icon={<HouseIcon size={16} />}>\n Home\n </Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Link href=\"#\">Projects</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Current Project</Breadcrumbs.Current>\n </Breadcrumbs>",
|
|
1699
|
+
"<Breadcrumbs>\n <Breadcrumbs.Link href=\"#\" icon={<HouseIcon size={16} />}>\n Home\n </Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Link href=\"#\">Docs</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current loading />\n </Breadcrumbs>",
|
|
1700
|
+
"<Breadcrumbs>\n <Breadcrumbs.Current icon={<HouseIcon size={16} />}>\n Worker Analytics\n </Breadcrumbs.Current>\n </Breadcrumbs>",
|
|
1701
|
+
"<Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Breadcrumbs</Breadcrumbs.Current>\n <Breadcrumbs.Clipboard text=\"#\" />\n </Breadcrumbs>"
|
|
1702
|
+
],
|
|
1703
|
+
"colors": [
|
|
1704
|
+
"text-sf-inactive",
|
|
1705
|
+
"text-sf-subtle",
|
|
1706
|
+
"text-sf-success"
|
|
1707
|
+
],
|
|
1522
1708
|
"subComponents": {
|
|
1523
1709
|
"Link": {
|
|
1524
1710
|
"name": "Link",
|
|
@@ -1575,7 +1761,11 @@
|
|
|
1575
1761
|
"shape": {
|
|
1576
1762
|
"type": "enum",
|
|
1577
1763
|
"optional": true,
|
|
1578
|
-
"values": [
|
|
1764
|
+
"values": [
|
|
1765
|
+
"base",
|
|
1766
|
+
"square",
|
|
1767
|
+
"circle"
|
|
1768
|
+
],
|
|
1579
1769
|
"descriptions": {
|
|
1580
1770
|
"base": "Default rectangular button shape",
|
|
1581
1771
|
"square": "Square button for icon-only actions",
|
|
@@ -1590,7 +1780,12 @@
|
|
|
1590
1780
|
"size": {
|
|
1591
1781
|
"type": "enum",
|
|
1592
1782
|
"optional": true,
|
|
1593
|
-
"values": [
|
|
1783
|
+
"values": [
|
|
1784
|
+
"xs",
|
|
1785
|
+
"sm",
|
|
1786
|
+
"base",
|
|
1787
|
+
"lg"
|
|
1788
|
+
],
|
|
1594
1789
|
"descriptions": {
|
|
1595
1790
|
"xs": "Extra small button for compact UIs",
|
|
1596
1791
|
"sm": "Small button for secondary actions",
|
|
@@ -1698,14 +1893,31 @@
|
|
|
1698
1893
|
"type": {
|
|
1699
1894
|
"type": "enum",
|
|
1700
1895
|
"optional": true,
|
|
1701
|
-
"values": [
|
|
1896
|
+
"values": [
|
|
1897
|
+
"submit",
|
|
1898
|
+
"reset",
|
|
1899
|
+
"button"
|
|
1900
|
+
]
|
|
1702
1901
|
},
|
|
1703
1902
|
"value": {
|
|
1704
1903
|
"type": "string | string[] | number",
|
|
1705
1904
|
"optional": true
|
|
1706
1905
|
}
|
|
1707
1906
|
},
|
|
1708
|
-
"examples": [
|
|
1907
|
+
"examples": [
|
|
1908
|
+
"<div className=\"flex flex-wrap items-center gap-2\">\n <Button variant=\"secondary\">Button</Button>\n <Button\n variant=\"secondary\"\n shape=\"square\"\n icon={PlusIcon}\n aria-label=\"Add\"\n />\n </div>",
|
|
1909
|
+
"<Button variant=\"primary\">Primary</Button>",
|
|
1910
|
+
"<Button variant=\"secondary\">Secondary</Button>",
|
|
1911
|
+
"<Button variant=\"ghost\">Ghost</Button>",
|
|
1912
|
+
"<Button variant=\"destructive\">Destructive</Button>",
|
|
1913
|
+
"<Button variant=\"outline\">Outline</Button>",
|
|
1914
|
+
"<Button variant=\"secondary-destructive\">Secondary Destructive</Button>",
|
|
1915
|
+
"<div className=\"flex flex-wrap items-center gap-3\">\n <Button size=\"xs\" variant=\"secondary\">\n Extra Small\n </Button>\n <Button size=\"sm\" variant=\"secondary\">\n Small\n </Button>\n <Button size=\"base\" variant=\"secondary\">\n Base\n </Button>\n <Button size=\"lg\" variant=\"secondary\">\n Large\n </Button>\n </div>",
|
|
1916
|
+
"<Button variant=\"secondary\" icon={PlusIcon}>\n Create Worker\n </Button>",
|
|
1917
|
+
"<div className=\"flex flex-wrap items-center gap-3\">\n <Button\n variant=\"secondary\"\n shape=\"square\"\n icon={PlusIcon}\n aria-label=\"Add item\"\n />\n <Button\n variant=\"secondary\"\n shape=\"circle\"\n icon={PlusIcon}\n aria-label=\"Add item\"\n />\n </div>",
|
|
1918
|
+
"<Button variant=\"primary\" loading>\n Loading...\n </Button>",
|
|
1919
|
+
"<Button variant=\"secondary\" disabled>\n Disabled\n </Button>"
|
|
1920
|
+
],
|
|
1709
1921
|
"colors": [
|
|
1710
1922
|
"bg-sf-base",
|
|
1711
1923
|
"bg-sf-brand",
|
|
@@ -1731,7 +1943,10 @@
|
|
|
1731
1943
|
"type": "enum",
|
|
1732
1944
|
"optional": true,
|
|
1733
1945
|
"description": "Visual variant: \"default\" or \"error\" for validation failures (visual only, no error text)",
|
|
1734
|
-
"values": [
|
|
1946
|
+
"values": [
|
|
1947
|
+
"default",
|
|
1948
|
+
"error"
|
|
1949
|
+
],
|
|
1735
1950
|
"descriptions": {
|
|
1736
1951
|
"default": "Default checkbox appearance",
|
|
1737
1952
|
"error": "Error state for validation failures"
|
|
@@ -1798,7 +2013,17 @@
|
|
|
1798
2013
|
"description": "Callback when checkbox value changes"
|
|
1799
2014
|
}
|
|
1800
2015
|
},
|
|
1801
|
-
"examples": [
|
|
2016
|
+
"examples": [
|
|
2017
|
+
"<Checkbox\n label=\"Accept terms and conditions\"\n checked={checked}\n onCheckedChange={setChecked}\n />",
|
|
2018
|
+
"<Checkbox\n label=\"Enable notifications\"\n checked={checked}\n onCheckedChange={setChecked}\n />",
|
|
2019
|
+
"<Checkbox label=\"I agree\" checked={checked} onCheckedChange={setChecked} />",
|
|
2020
|
+
"<Checkbox\n label=\"Select all\"\n indeterminate={indeterminate}\n onCheckedChange={setIndeterminate}\n />",
|
|
2021
|
+
"<Checkbox\n label=\"Remember me\"\n controlFirst={false}\n checked={checked}\n onCheckedChange={setChecked}\n />",
|
|
2022
|
+
"<Checkbox label=\"Disabled option\" disabled />",
|
|
2023
|
+
"<Checkbox label=\"Invalid option\" variant=\"error\" />",
|
|
2024
|
+
"<Checkbox.Group\n legend=\"Email preferences\"\n description=\"Choose how you'd like to receive updates\"\n value={preferences}\n onValueChange={setPreferences}\n >\n <Checkbox.Item value=\"email\" label=\"Email notifications\" />\n <Checkbox.Item value=\"sms\" label=\"SMS notifications\" />\n <Checkbox.Item value=\"push\" label=\"Push notifications\" />\n </Checkbox.Group>",
|
|
2025
|
+
"<Checkbox.Group\n legend=\"Required preferences\"\n error=\"Please select at least one notification method\"\n value={[]}\n onValueChange={() => {}}\n >\n <Checkbox.Item value=\"email\" label=\"Email\" variant=\"error\" />\n <Checkbox.Item value=\"sms\" label=\"SMS\" variant=\"error\" />\n </Checkbox.Group>"
|
|
2026
|
+
],
|
|
1802
2027
|
"colors": [
|
|
1803
2028
|
"bg-sf-base",
|
|
1804
2029
|
"bg-sf-contrast",
|
|
@@ -1864,14 +2089,32 @@
|
|
|
1864
2089
|
"styling": {
|
|
1865
2090
|
"dimensions": "h-4 w-4",
|
|
1866
2091
|
"borderRadius": "rounded-sm",
|
|
1867
|
-
"baseTokens": [
|
|
2092
|
+
"baseTokens": [
|
|
2093
|
+
"bg-sf-base",
|
|
2094
|
+
"ring-sf-line"
|
|
2095
|
+
],
|
|
1868
2096
|
"states": {
|
|
1869
|
-
"checked": [
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
"
|
|
1874
|
-
|
|
2097
|
+
"checked": [
|
|
2098
|
+
"bg-sf-contrast",
|
|
2099
|
+
"text-sf-inverse"
|
|
2100
|
+
],
|
|
2101
|
+
"indeterminate": [
|
|
2102
|
+
"bg-sf-contrast",
|
|
2103
|
+
"text-sf-inverse"
|
|
2104
|
+
],
|
|
2105
|
+
"error": [
|
|
2106
|
+
"ring-sf-danger"
|
|
2107
|
+
],
|
|
2108
|
+
"hover": [
|
|
2109
|
+
"ring-sf-ring"
|
|
2110
|
+
],
|
|
2111
|
+
"focus": [
|
|
2112
|
+
"ring-sf-ring"
|
|
2113
|
+
],
|
|
2114
|
+
"disabled": [
|
|
2115
|
+
"opacity-50",
|
|
2116
|
+
"cursor-not-allowed"
|
|
2117
|
+
]
|
|
1875
2118
|
},
|
|
1876
2119
|
"icons": [
|
|
1877
2120
|
{
|
|
@@ -1898,7 +2141,11 @@
|
|
|
1898
2141
|
"type": "enum",
|
|
1899
2142
|
"optional": true,
|
|
1900
2143
|
"description": "Size of the clipboard text field.\n- `\"sm\"` — Small clipboard text for compact UIs\n- `\"base\"` — Default clipboard text size\n- `\"lg\"` — Large clipboard text for prominent display",
|
|
1901
|
-
"values": [
|
|
2144
|
+
"values": [
|
|
2145
|
+
"sm",
|
|
2146
|
+
"base",
|
|
2147
|
+
"lg"
|
|
2148
|
+
],
|
|
1902
2149
|
"descriptions": {
|
|
1903
2150
|
"sm": "Small clipboard text for compact UIs",
|
|
1904
2151
|
"base": "Default clipboard text size",
|
|
@@ -1932,7 +2179,13 @@
|
|
|
1932
2179
|
"description": "Accessible labels for i18n."
|
|
1933
2180
|
}
|
|
1934
2181
|
},
|
|
1935
|
-
"examples": [
|
|
2182
|
+
"examples": [
|
|
2183
|
+
"<ClipboardText text=\"0c239dd2\" />",
|
|
2184
|
+
"<ClipboardText text=\"abc123\" />",
|
|
2185
|
+
"<ClipboardText text=\"sk_live_51H8...\" />",
|
|
2186
|
+
"<ClipboardText text=\"https://example.com/very/long/url/path\" />",
|
|
2187
|
+
"<ClipboardText\n text=\"npx sf add button\"\n tooltip={{ copiedText: \"Copied!\", side: \"top\", text: \"Copy\" }}\n />"
|
|
2188
|
+
],
|
|
1936
2189
|
"colors": [
|
|
1937
2190
|
"bg-sf-base",
|
|
1938
2191
|
"border-sf-line",
|
|
@@ -1947,9 +2200,18 @@
|
|
|
1947
2200
|
"border-sf-fill"
|
|
1948
2201
|
],
|
|
1949
2202
|
"states": {
|
|
1950
|
-
"input": [
|
|
1951
|
-
|
|
1952
|
-
|
|
2203
|
+
"input": [
|
|
2204
|
+
"bg-sf-control",
|
|
2205
|
+
"text-sf-default",
|
|
2206
|
+
"ring-sf-line"
|
|
2207
|
+
],
|
|
2208
|
+
"text": [
|
|
2209
|
+
"bg-sf-base",
|
|
2210
|
+
"font-mono"
|
|
2211
|
+
],
|
|
2212
|
+
"button": [
|
|
2213
|
+
"border-sf-fill"
|
|
2214
|
+
]
|
|
1953
2215
|
},
|
|
1954
2216
|
"inputStyles": {
|
|
1955
2217
|
"base": "bg-sf-control text-sf-default ring ring-sf-line",
|
|
@@ -2020,7 +2282,13 @@
|
|
|
2020
2282
|
"type": "enum",
|
|
2021
2283
|
"optional": true,
|
|
2022
2284
|
"description": "Language hint for the code content.\n- `\"ts\"` — TypeScript code\n- `\"tsx\"` — TypeScript JSX code\n- `\"jsonc\"` — JSON with comments\n- `\"bash\"` — Shell/Bash commands\n- `\"css\"` — CSS styles",
|
|
2023
|
-
"values": [
|
|
2285
|
+
"values": [
|
|
2286
|
+
"ts",
|
|
2287
|
+
"tsx",
|
|
2288
|
+
"jsonc",
|
|
2289
|
+
"bash",
|
|
2290
|
+
"css"
|
|
2291
|
+
],
|
|
2024
2292
|
"descriptions": {
|
|
2025
2293
|
"ts": "TypeScript code",
|
|
2026
2294
|
"tsx": "TypeScript JSX code",
|
|
@@ -2046,8 +2314,18 @@
|
|
|
2046
2314
|
"description": "Additional CSS classes merged via `cn()`."
|
|
2047
2315
|
}
|
|
2048
2316
|
},
|
|
2049
|
-
"examples": [
|
|
2050
|
-
"
|
|
2317
|
+
"examples": [
|
|
2318
|
+
"<CodeBlock\n lang=\"tsx\"\n code={`const greeting = \"Hello, World!\";\nconsole.log(greeting);`}\n />",
|
|
2319
|
+
"<CodeBlock\n lang=\"tsx\"\n code={`interface User {\n id: string;\n name: string;\n email: string;\n}\n\nconst user: User = {\n id: \"1\",\n name: \"John Doe\",\n email: \"john@example.com\"\n};`}\n />",
|
|
2320
|
+
"<CodeBlock\n lang=\"bash\"\n code={`npm install @signalflare-ai/ui\nbun add @signalflare-ai/ui`}\n />",
|
|
2321
|
+
"<CodeBlock\n lang=\"jsonc\"\n code={`{\n \"name\": \"sf\",\n \"version\": \"1.0.0\",\n \"dependencies\": {\n \"react\": \"^19.0.0\"\n }\n}`}\n />",
|
|
2322
|
+
"<Code\n lang=\"bash\"\n code=\"export API_KEY={{apiKey}}\"\n values={{\n apiKey: { highlight: true, value: \"sk_live_123\" },\n }}\n />"
|
|
2323
|
+
],
|
|
2324
|
+
"colors": [
|
|
2325
|
+
"bg-sf-recessed",
|
|
2326
|
+
"border-sf-line",
|
|
2327
|
+
"text-sf-default"
|
|
2328
|
+
],
|
|
2051
2329
|
"subComponents": {
|
|
2052
2330
|
"Block": {
|
|
2053
2331
|
"name": "Block",
|
|
@@ -2097,8 +2375,15 @@
|
|
|
2097
2375
|
"description": "Callback when collapsed state changes"
|
|
2098
2376
|
}
|
|
2099
2377
|
},
|
|
2100
|
-
"examples": [
|
|
2101
|
-
|
|
2378
|
+
"examples": [
|
|
2379
|
+
"<div className=\"w-full\">\n <Collapsible label=\"What is SF?\" open={isOpen} onOpenChange={setIsOpen}>\n A minimal, composable component library for building modern interfaces.\n </Collapsible>\n </div>",
|
|
2380
|
+
"<div className=\"w-full\">\n <Collapsible label=\"What is SF?\" open={isOpen} onOpenChange={setIsOpen}>\n A minimal, composable component library for building modern interfaces.\n </Collapsible>\n </div>",
|
|
2381
|
+
"<div className=\"w-full space-y-2\">\n <Collapsible label=\"What is SF?\" open={open1} onOpenChange={setOpen1}>\n A minimal, composable component library for building modern interfaces.\n </Collapsible>\n <Collapsible\n label=\"How do I use it?\"\n open={open2}\n onOpenChange={setOpen2}\n >\n Install the components and import them into your project.\n </Collapsible>\n <Collapsible\n label=\"Is it open source?\"\n open={open3}\n onOpenChange={setOpen3}\n >\n Check the repository for license information.\n </Collapsible>\n </div>"
|
|
2382
|
+
],
|
|
2383
|
+
"colors": [
|
|
2384
|
+
"border-sf-fill",
|
|
2385
|
+
"text-sf-link"
|
|
2386
|
+
]
|
|
2102
2387
|
},
|
|
2103
2388
|
"Combobox": {
|
|
2104
2389
|
"name": "Combobox",
|
|
@@ -2111,7 +2396,10 @@
|
|
|
2111
2396
|
"type": "enum",
|
|
2112
2397
|
"optional": true,
|
|
2113
2398
|
"description": "Position of the text input relative to chips in multi-select mode.\n- `\"right\"` — Input inline to the right of chips\n- `\"top\"` — Input above chips",
|
|
2114
|
-
"values": [
|
|
2399
|
+
"values": [
|
|
2400
|
+
"right",
|
|
2401
|
+
"top"
|
|
2402
|
+
],
|
|
2115
2403
|
"descriptions": {
|
|
2116
2404
|
"right": "Input positioned inline to the right of chips",
|
|
2117
2405
|
"top": "Input positioned above chips"
|
|
@@ -2176,7 +2464,14 @@
|
|
|
2176
2464
|
"description": "Custom equality function for comparing items"
|
|
2177
2465
|
}
|
|
2178
2466
|
},
|
|
2179
|
-
"examples": [
|
|
2467
|
+
"examples": [
|
|
2468
|
+
"<Combobox\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n items={fruits}\n >\n <Combobox.TriggerInput placeholder=\"Please select\" />\n <Combobox.Content>\n <Combobox.Empty />\n <Combobox.List>\n {(item: string) => (\n <Combobox.Item key={item} value={item}>\n {item}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>",
|
|
2469
|
+
"<Combobox\n value={value}\n onValueChange={(v) => setValue(v as Language)}\n items={languages}\n >\n <Combobox.TriggerValue className=\"w-[200px]\" />\n <Combobox.Content>\n <Combobox.Input placeholder=\"Search languages\" />\n <Combobox.Empty />\n <Combobox.List>\n {(item: Language) => (\n <Combobox.Item key={item.value} value={item}>\n {item.emoji} {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>",
|
|
2470
|
+
"<Combobox\n value={value}\n onValueChange={(v) => setValue(v as ServerLocation | null)}\n items={servers}\n >\n <Combobox.TriggerInput\n className=\"w-[200px]\"\n placeholder=\"Select server\"\n />\n <Combobox.Content>\n <Combobox.Empty />\n <Combobox.List>\n {(group: ServerLocationGroup) => (\n <Combobox.Group key={group.value} items={group.items}>\n <Combobox.GroupLabel>{group.value}</Combobox.GroupLabel>\n <Combobox.Collection>\n {(item: ServerLocation) => (\n <Combobox.Item key={item.value} value={item}>\n {item.label}\n </Combobox.Item>\n )}\n </Combobox.Collection>\n </Combobox.Group>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>",
|
|
2471
|
+
"<div className=\"flex gap-2\">\n <Combobox\n value={value}\n onValueChange={setValue}\n items={bots}\n isItemEqualToValue={(bot: BotItem, selected: BotItem) =>\n bot.value === selected.value\n }\n multiple\n >\n <Combobox.TriggerMultipleWithInput\n className=\"w-[400px]\"\n placeholder=\"Select bots\"\n renderItem={(selected: BotItem) => (\n <Combobox.Chip key={selected.value}>{selected.label}</Combobox.Chip>\n )}\n inputSide=\"right\"\n />\n <Combobox.Content className=\"max-h-[200px] min-w-auto overflow-y-auto\">\n <Combobox.Empty />\n <Combobox.List>\n {(item: BotItem) => (\n <Combobox.Item key={item.value} value={item}>\n <div className=\"flex gap-2\">\n <Text>{item.label}</Text>\n <Text variant=\"secondary\">{item.author}</Text>\n </div>\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n <Button variant=\"primary\">Submit</Button>\n </div>",
|
|
2472
|
+
"<div className=\"w-80\">\n <Combobox\n items={databases}\n value={value}\n onValueChange={setValue}\n label=\"Database\"\n description=\"Select your preferred database\"\n >\n <Combobox.TriggerInput placeholder=\"Select database\" />\n <Combobox.Content>\n <Combobox.Empty />\n <Combobox.List>\n {(item: DatabaseItem) => (\n <Combobox.Item key={item.value} value={item}>\n {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n </div>",
|
|
2473
|
+
"<div className=\"w-80\">\n <Combobox\n items={databases}\n value={value}\n onValueChange={setValue}\n label=\"Database\"\n error={{ match: true, message: \"Please select a database\" }}\n >\n <Combobox.TriggerInput placeholder=\"Select database\" />\n <Combobox.Content>\n <Combobox.Empty />\n <Combobox.List>\n {(item: DatabaseItem) => (\n <Combobox.Item key={item.value} value={item}>\n {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n </div>"
|
|
2474
|
+
],
|
|
2180
2475
|
"colors": [
|
|
2181
2476
|
"bg-sf-control",
|
|
2182
2477
|
"bg-sf-fill-hover",
|
|
@@ -2299,7 +2594,12 @@
|
|
|
2299
2594
|
"description": "Child content - typically one or more Panel components"
|
|
2300
2595
|
}
|
|
2301
2596
|
},
|
|
2302
|
-
"examples": [
|
|
2597
|
+
"examples": [
|
|
2598
|
+
"<div className=\"flex flex-col items-start gap-4\">\n <Button onClick={() => setOpen(true)}>Open Command Palette</Button>\n {selectedItem && (\n <p className=\"text-sm text-sf-subtle\">\n Last selected: <span className=\"text-sf-default\">{selectedItem}</span>\n </p>\n )}\n\n <CommandPalette.Root\n open={open}\n onOpenChange={setOpen}\n items={sampleGroups}\n value={search}\n onValueChange={setSearch}\n itemToStringValue={(group) => group.label}\n onSelect={(item, { newTab }) => {\n console.log(\"Selected:\", item.title, newTab ? \"(new tab)\" : \"\");\n handleSelect(item);\n }}\n getSelectableItems={getSelectableItems}\n >\n <CommandPalette.Input placeholder=\"Type a command or search...\" />\n <CommandPalette.List>\n <CommandPalette.Results>\n {(group: CommandGroup) => (\n <CommandPalette.Group key={group.id}>\n <CommandPalette.GroupLabel>\n {group.label}\n </CommandPalette.GroupLabel>\n <CommandPalette.Items>\n {(item: CommandItem) => (\n <CommandPalette.Item\n key={item.id}\n value={item}\n onClick={() => handleSelect(item)}\n >\n <span className=\"flex items-center gap-3\">\n {item.icon && (\n <span className=\"text-sf-subtle\">{item.icon}</span>\n )}\n <span>{item.title}</span>\n </span>\n </CommandPalette.Item>\n )}\n </CommandPalette.Items>\n </CommandPalette.Group>\n )}\n </CommandPalette.Results>\n <CommandPalette.Empty>No commands found</CommandPalette.Empty>\n </CommandPalette.List>\n <CommandPalette.Footer>\n <span className=\"flex items-center gap-2\">\n <kbd className=\"rounded border border-sf-line bg-sf-base px-1.5 py-0.5 text-[10px]\">\n ↑↓\n </kbd>\n <span>Navigate</span>\n </span>\n <span className=\"flex items-center gap-2\">\n <kbd className=\"rounded border border-sf-line bg-sf-base px-1.5 py-0.5 text-[10px]\">\n ↵\n </kbd>\n <span>Select</span>\n </span>\n </CommandPalette.Footer>\n </CommandPalette.Root>\n </div>",
|
|
2599
|
+
"<div>\n <Button onClick={() => setOpen(true)}>Open Simple Palette</Button>\n\n <CommandPalette.Root\n open={open}\n onOpenChange={setOpen}\n items={simpleItems}\n value={search}\n onValueChange={setSearch}\n itemToStringValue={(item) => item.title}\n onSelect={(item) => {\n console.log(\"Selected:\", item.title);\n setOpen(false);\n }}\n getSelectableItems={(items) => items}\n >\n <CommandPalette.Input placeholder=\"Search actions...\" />\n <CommandPalette.List>\n <CommandPalette.Results>\n {(item: SimpleItem) => (\n <CommandPalette.Item\n key={item.id}\n value={item}\n onClick={() => {\n console.log(\"Clicked:\", item.title);\n setOpen(false);\n }}\n >\n {item.title}\n </CommandPalette.Item>\n )}\n </CommandPalette.Results>\n <CommandPalette.Empty>No actions found</CommandPalette.Empty>\n </CommandPalette.List>\n </CommandPalette.Root>\n </div>",
|
|
2600
|
+
"<div>\n <Button onClick={handleOpen}>Open with Loading</Button>\n\n <CommandPalette.Root\n open={open}\n onOpenChange={setOpen}\n items={loading ? [] : sampleGroups}\n value={search}\n onValueChange={setSearch}\n itemToStringValue={(group) => group.label}\n getSelectableItems={getSelectableItems}\n >\n <CommandPalette.Input placeholder=\"Search...\" />\n <CommandPalette.List>\n {loading ? (\n <CommandPalette.Loading />\n ) : (\n <>\n <CommandPalette.Results>\n {(group: CommandGroup) => (\n <CommandPalette.Group key={group.id}>\n <CommandPalette.GroupLabel>\n {group.label}\n </CommandPalette.GroupLabel>\n <CommandPalette.Items>\n {(item: CommandItem) => (\n <CommandPalette.Item\n key={item.id}\n value={item}\n onClick={() => setOpen(false)}\n >\n <span className=\"flex items-center gap-3\">\n {item.icon && (\n <span className=\"text-sf-subtle\">\n {item.icon}\n </span>\n )}\n <span>{item.title}</span>\n </span>\n </CommandPalette.Item>\n )}\n </CommandPalette.Items>\n </CommandPalette.Group>\n )}\n </CommandPalette.Results>\n <CommandPalette.Empty>No results found</CommandPalette.Empty>\n </>\n )}\n </CommandPalette.List>\n </CommandPalette.Root>\n </div>",
|
|
2601
|
+
"<div>\n <Button onClick={() => setOpen(true)}>Open with ResultItem</Button>\n\n <CommandPalette.Root\n open={open}\n onOpenChange={setOpen}\n items={searchResults}\n value={search}\n onValueChange={setSearch}\n itemToStringValue={(item) => item.title}\n getSelectableItems={(items) => items}\n >\n <CommandPalette.Input placeholder=\"Search documentation...\" />\n <CommandPalette.List>\n <CommandPalette.Results>\n {(item: SearchResult) => (\n <CommandPalette.ResultItem\n key={item.id}\n value={item}\n title={item.title}\n breadcrumbs={item.breadcrumbs}\n icon={item.icon}\n onClick={() => {\n console.log(\"Navigate to:\", item.title);\n setOpen(false);\n }}\n />\n )}\n </CommandPalette.Results>\n <CommandPalette.Empty>No pages found</CommandPalette.Empty>\n </CommandPalette.List>\n <CommandPalette.Footer>\n <span className=\"flex items-center gap-2\">\n <kbd className=\"rounded border border-sf-line bg-sf-base px-1.5 py-0.5 text-[10px]\">\n ↑↓\n </kbd>\n <span>Navigate</span>\n </span>\n <span className=\"flex items-center gap-2\">\n <kbd className=\"rounded border border-sf-line bg-sf-base px-1.5 py-0.5 text-[10px]\">\n ⌘↵\n </kbd>\n <span>Open in new tab</span>\n </span>\n </CommandPalette.Footer>\n </CommandPalette.Root>\n </div>"
|
|
2602
|
+
],
|
|
2303
2603
|
"colors": [
|
|
2304
2604
|
"bg-sf-elevated",
|
|
2305
2605
|
"bg-sf-overlay",
|
|
@@ -2319,7 +2619,10 @@
|
|
|
2319
2619
|
"props": {
|
|
2320
2620
|
"layout": {
|
|
2321
2621
|
"type": "enum",
|
|
2322
|
-
"values": [
|
|
2622
|
+
"values": [
|
|
2623
|
+
"auto",
|
|
2624
|
+
"fixed"
|
|
2625
|
+
],
|
|
2323
2626
|
"default": "auto",
|
|
2324
2627
|
"descriptions": {
|
|
2325
2628
|
"auto": "Auto column sizing - columns resize based on content",
|
|
@@ -2335,7 +2638,16 @@
|
|
|
2335
2638
|
"description": "Child elements"
|
|
2336
2639
|
}
|
|
2337
2640
|
},
|
|
2338
|
-
"examples": [
|
|
2641
|
+
"examples": [
|
|
2642
|
+
"<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid data={sampleUsers} columns={columns} enableSorting>\n <DataGrid.Content />\n </DataGrid>\n </LayerCard.Primary>\n </LayerCard>",
|
|
2643
|
+
"<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid\n data={paginatedData}\n columns={columns.slice(0, 3)}\n pageSize={pageSize}\n pageIndex={pageIndex}\n onPaginationChange={({ pageIndex: newPage }) => setPageIndex(newPage)}\n totalCount={totalCount}\n manualPagination\n >\n <DataGrid.Content />\n <DataGrid.Pagination />\n </DataGrid>\n </LayerCard.Primary>\n </LayerCard>",
|
|
2644
|
+
"<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid\n data={sampleUsers.slice(0, 4)}\n columns={columns}\n enableRowSelection\n rowSelection={rowSelection}\n onRowSelectionChange={setRowSelection}\n >\n <DataGrid.Content />\n </DataGrid>\n <div className=\"border-t border-sf-line p-3 text-sm\">\n <p className=\"text-sf-subtle\">\n Selected: {Object.keys(rowSelection).length} rows\n </p>\n </div>\n </LayerCard.Primary>\n </LayerCard>",
|
|
2645
|
+
"<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid\n data={sampleUsers.slice(0, 4)}\n columns={columns}\n columnVisibility={columnVisibility}\n onColumnVisibilityChange={setColumnVisibility}\n >\n <DataGrid.Toolbar className=\"p-3\">\n <DataGrid.ColumnToggle />\n </DataGrid.Toolbar>\n <DataGrid.Content />\n </DataGrid>\n </LayerCard.Primary>\n </LayerCard>",
|
|
2646
|
+
"<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid data={sampleUsers} columns={columns} enableSorting>\n <DataGrid.Toolbar className=\"flex items-center justify-between p-3\">\n <span className=\"text-sm font-medium\">Users</span>\n <DataGrid.ColumnToggle />\n </DataGrid.Toolbar>\n <DataGrid.Content />\n </DataGrid>\n </LayerCard.Primary>\n </LayerCard>",
|
|
2647
|
+
"<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid\n data={[]}\n columns={columns.slice(0, 3)}\n emptyState={\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <p className=\"text-sf-strong font-medium\">No users found</p>\n <p className=\"text-sf-subtle mt-1 text-sm\">\n Try adjusting your filters or add new users\n </p>\n </div>\n }\n >\n <DataGrid.Content />\n </DataGrid>\n </LayerCard.Primary>\n </LayerCard>",
|
|
2648
|
+
"<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid\n data={[]}\n columns={columns.slice(0, 3)}\n loading\n loadingRows={3}\n >\n <DataGrid.Content />\n </DataGrid>\n </LayerCard.Primary>\n </LayerCard>",
|
|
2649
|
+
"<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <DataGrid\n data={sampleUsers}\n columns={resizableColumns}\n enableSorting\n enableColumnResizing\n columnResizeMode=\"onEnd\"\n >\n <DataGrid.Content />\n </DataGrid>\n </LayerCard.Primary>\n </LayerCard>"
|
|
2650
|
+
],
|
|
2339
2651
|
"colors": [
|
|
2340
2652
|
"bg-sf-base",
|
|
2341
2653
|
"bg-sf-brand",
|
|
@@ -2390,8 +2702,19 @@
|
|
|
2390
2702
|
"description": "Child elements"
|
|
2391
2703
|
}
|
|
2392
2704
|
},
|
|
2393
|
-
"examples": [
|
|
2394
|
-
"
|
|
2705
|
+
"examples": [
|
|
2706
|
+
"<div className=\"flex flex-col gap-4\">\n <DatePicker\n mode=\"single\"\n selected={date}\n onChange={(d) => {\n if (d) {\n setDate(d);\n }\n }}\n />\n <p className=\"text-sm text-sf-subtle\">\n Selected: {date ? date.toLocaleDateString() : \"None\"}\n </p>\n </div>",
|
|
2707
|
+
"<div className=\"flex flex-col gap-4\">\n <DatePicker\n mode=\"multiple\"\n selected={dates}\n onChange={setDates}\n max={5}\n />\n <p className=\"text-sm text-sf-subtle\">\n Selected: {dates?.length ?? 0} date(s)\n </p>\n </div>",
|
|
2708
|
+
"<div className=\"flex flex-col gap-4\">\n <DatePicker\n mode=\"range\"\n selected={range}\n onChange={setRange}\n numberOfMonths={2}\n />\n <p className=\"text-sm text-sf-subtle\">\n Range:{\" \"}\n {range?.from\n ? `${range.from.toLocaleDateString()} - ${range.to?.toLocaleDateString() ?? \"...\"}`\n : \"None\"}\n </p>\n </div>",
|
|
2709
|
+
"<div className=\"flex flex-col gap-4\">\n <DatePicker\n mode=\"range\"\n selected={range}\n onChange={setRange}\n min={3}\n max={7}\n footer={\n <span className=\"text-xs text-sf-subtle\">Select 3-7 nights</span>\n }\n />\n </div>",
|
|
2710
|
+
"<Popover>\n <Popover.Trigger asChild>\n <Button variant=\"outline\" icon={CalendarDotsIcon}>\n {date ? date.toLocaleDateString() : \"Pick a date\"}\n </Button>\n </Popover.Trigger>\n <Popover.Content className=\"p-3\">\n <DatePicker mode=\"single\" selected={date} onChange={setDate} />\n </Popover.Content>\n </Popover>",
|
|
2711
|
+
"<Popover>\n <Popover.Trigger asChild>\n <Button variant=\"outline\" icon={CalendarDotsIcon}>\n {formatRange()}\n </Button>\n </Popover.Trigger>\n <Popover.Content className=\"p-3\">\n <DatePicker\n mode=\"range\"\n selected={range}\n onChange={setRange}\n numberOfMonths={2}\n />\n </Popover.Content>\n </Popover>",
|
|
2712
|
+
"<Popover>\n <Popover.Trigger asChild>\n <Button variant=\"outline\" icon={CalendarDotsIcon}>\n {formatRange()}\n </Button>\n </Popover.Trigger>\n <Popover.Content className=\"p-0\">\n <div className=\"flex\">\n <div className=\"flex flex-col gap-1 border-r border-sf-line p-2 text-sm\">\n {presets.map((preset) => {\n const isActive = isPresetActive(preset);\n return (\n <button\n key={preset.label}\n type=\"button\"\n onClick={() => handlePresetClick(preset)}\n className={`rounded-md px-3 py-1.5 text-left whitespace-nowrap ${\n isActive\n ? \"bg-sf-bg-inverse text-sf-text-inverse\"\n : \"text-sf-strong hover:bg-sf-control\"\n }`}\n >\n {preset.label}\n </button>\n );\n })}\n </div>\n <div className=\"p-3\">\n <DatePicker\n mode=\"range\"\n selected={range}\n onChange={setRange}\n month={month}\n onMonthChange={setMonth}\n numberOfMonths={2}\n />\n </div>\n </div>\n </Popover.Content>\n </Popover>",
|
|
2713
|
+
"<DatePicker\n mode=\"multiple\"\n selected={dates}\n onChange={setDates}\n max={maxDays}\n disabled={unavailableDates}\n fixedWeeks\n footer={\n <p className=\"text-xs text-sf-subtle pt-2 w-full\">\n {selectedCount}/{maxDays} days selected. Grayed dates are unavailable.\n </p>\n }\n />"
|
|
2714
|
+
],
|
|
2715
|
+
"colors": [
|
|
2716
|
+
"bg-sf-base"
|
|
2717
|
+
]
|
|
2395
2718
|
},
|
|
2396
2719
|
"DateRangePicker": {
|
|
2397
2720
|
"name": "DateRangePicker",
|
|
@@ -2404,7 +2727,11 @@
|
|
|
2404
2727
|
"type": "enum",
|
|
2405
2728
|
"optional": true,
|
|
2406
2729
|
"description": "Calendar size.\n- `\"sm\"` — Compact calendar for tight spaces\n- `\"base\"` — Default calendar size\n- `\"lg\"` — Large calendar for prominent date selection",
|
|
2407
|
-
"values": [
|
|
2730
|
+
"values": [
|
|
2731
|
+
"sm",
|
|
2732
|
+
"base",
|
|
2733
|
+
"lg"
|
|
2734
|
+
],
|
|
2408
2735
|
"descriptions": {
|
|
2409
2736
|
"sm": "Compact calendar for tight spaces",
|
|
2410
2737
|
"base": "Default calendar size",
|
|
@@ -2421,7 +2748,10 @@
|
|
|
2421
2748
|
"type": "enum",
|
|
2422
2749
|
"optional": true,
|
|
2423
2750
|
"description": "Visual variant.\n- `\"default\"` — Standard appearance with overlay background\n- `\"subtle\"` — Minimal background",
|
|
2424
|
-
"values": [
|
|
2751
|
+
"values": [
|
|
2752
|
+
"default",
|
|
2753
|
+
"subtle"
|
|
2754
|
+
],
|
|
2425
2755
|
"descriptions": {
|
|
2426
2756
|
"default": "Default calendar appearance",
|
|
2427
2757
|
"subtle": "Subtle calendar with minimal background"
|
|
@@ -2528,7 +2858,12 @@
|
|
|
2528
2858
|
"type": "enum",
|
|
2529
2859
|
"optional": true,
|
|
2530
2860
|
"description": "Dialog width.\n- `\"sm\"` — Small (min 288px) for simple confirmations\n- `\"base\"` — Default (min 384px)\n- `\"lg\"` — Large (min 512px) for complex content\n- `\"xl\"` — Extra large (min 768px) for detailed views",
|
|
2531
|
-
"values": [
|
|
2861
|
+
"values": [
|
|
2862
|
+
"base",
|
|
2863
|
+
"sm",
|
|
2864
|
+
"lg",
|
|
2865
|
+
"xl"
|
|
2866
|
+
],
|
|
2532
2867
|
"descriptions": {
|
|
2533
2868
|
"base": "Default dialog width",
|
|
2534
2869
|
"sm": "Small dialog for simple confirmations",
|
|
@@ -2544,7 +2879,14 @@
|
|
|
2544
2879
|
"default": "base"
|
|
2545
2880
|
}
|
|
2546
2881
|
},
|
|
2547
|
-
"examples": [
|
|
2882
|
+
"examples": [
|
|
2883
|
+
"<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Click me</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Modal Title\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<XIcon />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"text-sf-subtle\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do\n eiusmod tempor incididunt ut labore et dolore magna aliqua.\n </Dialog.Description>\n </Dialog>\n </Dialog.Root>",
|
|
2884
|
+
"<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Delete</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Modal Title\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<XIcon />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"text-sf-subtle\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do\n eiusmod tempor incididunt ut labore et dolore magna aliqua.\n </Dialog.Description>\n <div className=\"mt-8 flex justify-end gap-2\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Cancel\n </Button>\n )}\n />\n <Dialog.Close\n render={(props) => (\n <Button variant=\"destructive\" {...props}>\n Delete\n </Button>\n )}\n />\n </div>\n </Dialog>\n </Dialog.Root>",
|
|
2885
|
+
"<Dialog.Root disablePointerDismissal>\n <Dialog.Trigger\n render={(p) => (\n <Button {...p} variant=\"destructive\">\n Delete Project\n </Button>\n )}\n />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-sf-danger/20\">\n <WarningIcon size={20} className=\"text-sf-danger\" />\n </div>\n <Dialog.Title className=\"text-xl font-semibold\">\n Delete Project?\n </Dialog.Title>\n </div>\n <Dialog.Description className=\"text-sf-subtle\">\n This action cannot be undone. This will permanently delete the project\n and all associated data.\n </Dialog.Description>\n <div className=\"mt-8 flex justify-end gap-2\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Cancel\n </Button>\n )}\n />\n <Dialog.Close\n render={(props) => (\n <Button variant=\"destructive\" {...props}>\n Delete\n </Button>\n )}\n />\n </div>\n </Dialog>\n </Dialog.Root>",
|
|
2886
|
+
"<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Open Form</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Create Resource\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<XIcon />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"mb-4 text-sf-subtle\">\n Select a region for your new resource.\n </Dialog.Description>\n <Select\n className=\"w-full\"\n renderValue={(v) =>\n regions.find((r) => r.value === v)?.label ?? \"Select region...\"\n }\n >\n {regions.map((region) => (\n <Select.Option key={region.value} value={region.value}>\n {region.label}\n </Select.Option>\n ))}\n </Select>\n <div className=\"mt-8 flex justify-end gap-2\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Cancel\n </Button>\n )}\n />\n <Button variant=\"primary\">Create</Button>\n </div>\n </Dialog>\n </Dialog.Root>",
|
|
2887
|
+
"<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Open Form</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Create Resource\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<XIcon />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"mb-4 text-sf-subtle\">\n Search and select a region for your new resource.\n </Dialog.Description>\n <Combobox value={value} onValueChange={setValue} items={regions}>\n <Combobox.TriggerInput\n className=\"w-full\"\n placeholder=\"Search regions...\"\n />\n <Combobox.Content>\n <Combobox.Empty>No regions found</Combobox.Empty>\n <Combobox.List>\n {(item: { value: string; label: string }) => (\n <Combobox.Item key={item.value} value={item}>\n {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n <div className=\"mt-8 flex justify-end gap-2\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Cancel\n </Button>\n )}\n />\n <Button variant=\"primary\">Create</Button>\n </div>\n </Dialog>\n </Dialog.Root>",
|
|
2888
|
+
"<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Open Form</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Resource Actions\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<XIcon />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"mb-4 text-sf-subtle\">\n Choose an action for the selected resource.\n </Dialog.Description>\n <DropdownMenu>\n <DropdownMenu.Trigger render={<Button>Actions</Button>} />\n <DropdownMenu.Content>\n <DropdownMenu.Item>Edit</DropdownMenu.Item>\n <DropdownMenu.Item>Duplicate</DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item variant=\"danger\">Delete</DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n <div className=\"mt-8 flex justify-end\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Close\n </Button>\n )}\n />\n </div>\n </Dialog>\n </Dialog.Root>"
|
|
2889
|
+
],
|
|
2548
2890
|
"colors": [
|
|
2549
2891
|
"bg-sf-elevated",
|
|
2550
2892
|
"bg-sf-overlay",
|
|
@@ -2661,7 +3003,10 @@
|
|
|
2661
3003
|
"type": "enum",
|
|
2662
3004
|
"optional": true,
|
|
2663
3005
|
"description": "Visual style of the dropdown item.\n- `\"default\"` — Standard item appearance\n- `\"danger\"` — Destructive action with red text",
|
|
2664
|
-
"values": [
|
|
3006
|
+
"values": [
|
|
3007
|
+
"default",
|
|
3008
|
+
"danger"
|
|
3009
|
+
],
|
|
2665
3010
|
"descriptions": {
|
|
2666
3011
|
"default": "Default dropdown item appearance",
|
|
2667
3012
|
"danger": "Destructive action item"
|
|
@@ -2780,7 +3125,11 @@
|
|
|
2780
3125
|
"type": "enum",
|
|
2781
3126
|
"optional": true,
|
|
2782
3127
|
"description": "Size of the empty state container.\n- `\"sm\"` — Compact empty state for smaller containers\n- `\"base\"` — Default empty state size\n- `\"lg\"` — Large empty state for prominent placement",
|
|
2783
|
-
"values": [
|
|
3128
|
+
"values": [
|
|
3129
|
+
"sm",
|
|
3130
|
+
"base",
|
|
3131
|
+
"lg"
|
|
3132
|
+
],
|
|
2784
3133
|
"descriptions": {
|
|
2785
3134
|
"sm": "Compact empty state for smaller containers",
|
|
2786
3135
|
"base": "Default empty state size",
|
|
@@ -2824,7 +3173,14 @@
|
|
|
2824
3173
|
"description": "Additional CSS classes merged via `cn()`."
|
|
2825
3174
|
}
|
|
2826
3175
|
},
|
|
2827
|
-
"examples": [
|
|
3176
|
+
"examples": [
|
|
3177
|
+
"<Empty\n icon={<PackageIcon size={48} />}\n title=\"No packages found\"\n description=\"Get started by installing your first package.\"\n commandLine=\"npm install @signalflare-ai/ui\"\n contents={\n <div className=\"flex items-center gap-2\">\n <Button icon={<CodeIcon />}>See examples</Button>\n <Button icon={<GlobeIcon />} variant=\"primary\">\n View documentation\n </Button>\n </div>\n }\n />",
|
|
3178
|
+
"<div className=\"flex flex-col gap-8\">\n <div>\n <p className=\"mb-2 text-sm text-sf-subtle\">Small</p>\n <Empty\n size=\"sm\"\n icon={<DatabaseIcon size={32} className=\"text-sf-inactive\" />}\n title=\"No data available\"\n description=\"There is no data to display.\"\n />\n </div>\n <div>\n <p className=\"mb-2 text-sm text-sf-subtle\">Base</p>\n <Empty\n size=\"base\"\n icon={<DatabaseIcon size={48} className=\"text-sf-inactive\" />}\n title=\"No data available\"\n description=\"There is no data to display.\"\n />\n </div>\n <div>\n <p className=\"mb-2 text-sm text-sf-subtle\">Large</p>\n <Empty\n size=\"lg\"\n icon={<DatabaseIcon size={64} className=\"text-sf-inactive\" />}\n title=\"No data available\"\n description=\"There is no data to display.\"\n />\n </div>\n </div>",
|
|
3179
|
+
"<Empty\n icon={<FolderOpenIcon size={48} className=\"text-sf-inactive\" />}\n title=\"No projects found\"\n description=\"Get started by creating your first project using the command below.\"\n commandLine=\"npm create sf-project\"\n />",
|
|
3180
|
+
"<Empty\n icon={<CloudSlashIcon size={48} className=\"text-sf-inactive\" />}\n title=\"No connection\"\n description=\"Unable to connect to the server. Please check your connection and try again.\"\n contents={\n <div className=\"flex gap-2\">\n <Button variant=\"primary\">Retry</Button>\n <Button variant=\"secondary\">Go Back</Button>\n </div>\n }\n />",
|
|
3181
|
+
"<Empty title=\"Nothing here\" />",
|
|
3182
|
+
"<Empty\n title=\"No results found\"\n description=\"Try adjusting your search or filter to find what you're looking for.\"\n />"
|
|
3183
|
+
],
|
|
2828
3184
|
"colors": [
|
|
2829
3185
|
"bg-sf-control",
|
|
2830
3186
|
"bg-sf-overlay",
|
|
@@ -2881,7 +3237,11 @@
|
|
|
2881
3237
|
}
|
|
2882
3238
|
},
|
|
2883
3239
|
"examples": [],
|
|
2884
|
-
"colors": [
|
|
3240
|
+
"colors": [
|
|
3241
|
+
"text-sf-danger",
|
|
3242
|
+
"text-sf-default",
|
|
3243
|
+
"text-sf-subtle"
|
|
3244
|
+
]
|
|
2885
3245
|
},
|
|
2886
3246
|
"Filters": {
|
|
2887
3247
|
"name": "Filters",
|
|
@@ -2904,7 +3264,11 @@
|
|
|
2904
3264
|
"type": "enum",
|
|
2905
3265
|
"optional": true,
|
|
2906
3266
|
"description": "Size variant for filter pills",
|
|
2907
|
-
"values": [
|
|
3267
|
+
"values": [
|
|
3268
|
+
"sm",
|
|
3269
|
+
"default",
|
|
3270
|
+
"lg"
|
|
3271
|
+
],
|
|
2908
3272
|
"descriptions": {
|
|
2909
3273
|
"sm": "Small filter items",
|
|
2910
3274
|
"default": "Default filter items",
|
|
@@ -2963,7 +3327,13 @@
|
|
|
2963
3327
|
"description": "CSS classes for the filter menu popup"
|
|
2964
3328
|
}
|
|
2965
3329
|
},
|
|
2966
|
-
"examples": [
|
|
3330
|
+
"examples": [
|
|
3331
|
+
"<div className=\"w-full rounded-lg border border-sf-line bg-sf-base p-4\">\n <Filters filters={filters} fields={filterFields} onChange={setFilters} />\n <div className=\"mt-4 rounded bg-sf-elevated p-3 font-mono text-xs\">\n <p className=\"text-sf-subtle mb-1\">Active filters:</p>\n <pre className=\"text-sf-strong overflow-x-auto\">\n {JSON.stringify(filters, null, 2)}\n </pre>\n </div>\n </div>",
|
|
3332
|
+
"<div className=\"w-full rounded-lg border border-sf-line bg-sf-base p-4\">\n <Filters\n filters={filters}\n fields={filterFields.slice(0, 3)}\n onChange={setFilters}\n size=\"sm\"\n />\n </div>",
|
|
3333
|
+
"<div className=\"w-full rounded-lg border border-sf-line bg-sf-base p-4\">\n <Filters\n filters={filters}\n fields={filterFields}\n onChange={setFilters}\n size=\"lg\"\n />\n </div>",
|
|
3334
|
+
"<div className=\"w-full rounded-lg border border-sf-line bg-sf-base p-4\">\n <Filters\n filters={filters}\n fields={filterFields}\n onChange={setFilters}\n showSearchInput\n />\n <p className=\"text-sf-subtle mt-3 text-xs\">\n Open the \"Add Filter\" menu to see grouped fields (General, User Details)\n </p>\n </div>",
|
|
3335
|
+
"<div className=\"w-full rounded-lg border border-sf-line bg-sf-base p-4\">\n <Filters\n filters={filters}\n fields={filterFields.slice(0, 3)}\n onChange={setFilters}\n enableShortcut\n shortcutKey=\"k\"\n shortcutLabel=\"Cmd+K\"\n />\n <p className=\"text-sf-subtle mt-3 text-xs\">\n Press Cmd+K (or Ctrl+K) to quickly open the add filter menu\n </p>\n </div>"
|
|
3336
|
+
],
|
|
2967
3337
|
"colors": [
|
|
2968
3338
|
"bg-sf-fill",
|
|
2969
3339
|
"bg-sf-line",
|
|
@@ -3015,7 +3385,12 @@
|
|
|
3015
3385
|
"type": "enum",
|
|
3016
3386
|
"optional": true,
|
|
3017
3387
|
"description": "Gap size between grid items.\n- `\"none\"` — No gap\n- `\"sm\"` — 12px gap\n- `\"base\"` — Responsive gap (8px → 24px → 32px)\n- `\"lg\"` — 32px gap",
|
|
3018
|
-
"values": [
|
|
3388
|
+
"values": [
|
|
3389
|
+
"none",
|
|
3390
|
+
"sm",
|
|
3391
|
+
"base",
|
|
3392
|
+
"lg"
|
|
3393
|
+
],
|
|
3019
3394
|
"descriptions": {
|
|
3020
3395
|
"none": "No gap between grid items",
|
|
3021
3396
|
"sm": "Small gap between grid items",
|
|
@@ -3069,8 +3444,16 @@
|
|
|
3069
3444
|
}
|
|
3070
3445
|
}
|
|
3071
3446
|
},
|
|
3072
|
-
"examples": [
|
|
3073
|
-
"
|
|
3447
|
+
"examples": [
|
|
3448
|
+
"<Grid variant=\"2up\" gap=\"base\">\n <GridItem>\n <Tile>\n <div>Item 1</div>\n <div className=\"mt-1\">First grid item</div>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <div>Item 2</div>\n <div className=\"mt-1\">Second grid item</div>\n </Tile>\n </GridItem>\n </Grid>",
|
|
3449
|
+
"<div className=\"flex flex-col gap-8\">\n <div>\n <p className=\"mb-2 text-sf-subtle\">variant=\"2up\"</p>\n <Grid variant=\"2up\" gap=\"sm\">\n <GridItem>\n <Tile>\n <span className=\"block text-center\">1</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">2</span>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n\n <div>\n <p className=\"mb-2 text-sf-subtle\">variant=\"3up\"</p>\n <Grid variant=\"3up\" gap=\"sm\">\n <GridItem>\n <Tile>\n <span className=\"block text-center\">1</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">2</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">3</span>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n\n <div>\n <p className=\"mb-2 text-sf-subtle\">variant=\"4up\"</p>\n <Grid variant=\"4up\" gap=\"sm\">\n <GridItem>\n <Tile>\n <span className=\"block text-center\">1</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">2</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">3</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">4</span>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n </div>",
|
|
3450
|
+
"<div className=\"flex flex-col gap-8\">\n <div>\n <p className=\"mb-2 text-sf-subtle\">variant=\"2-1\" (66% / 33%)</p>\n <Grid variant=\"2-1\" gap=\"sm\">\n <GridItem>\n <Tile>\n <div>Main Content</div>\n <div className=\"mt-1\">Two-thirds width</div>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <div>Sidebar</div>\n <div className=\"mt-1\">One-third width</div>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n\n <div>\n <p className=\"mb-2 text-sf-subtle\">variant=\"1-2\" (33% / 66%)</p>\n <Grid variant=\"1-2\" gap=\"sm\">\n <GridItem>\n <Tile>\n <div>Sidebar</div>\n <div className=\"mt-1\">One-third width</div>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <div>Main Content</div>\n <div className=\"mt-1\">Two-thirds width</div>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n </div>",
|
|
3451
|
+
"<div className=\"flex flex-col gap-8\">\n <div>\n <p className=\"mb-2 text-sf-subtle\">gap=\"none\"</p>\n <Grid variant=\"side-by-side\" gap=\"none\">\n <GridItem>\n <Tile>\n <span className=\"block text-center\">1</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">2</span>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n\n <div>\n <p className=\"mb-2 text-sf-subtle\">gap=\"sm\"</p>\n <Grid variant=\"side-by-side\" gap=\"sm\">\n <GridItem>\n <Tile>\n <span className=\"block text-center\">1</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">2</span>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n\n <div>\n <p className=\"mb-2 text-sf-subtle\">gap=\"base\" (default, responsive)</p>\n <Grid variant=\"side-by-side\" gap=\"base\">\n <GridItem>\n <Tile>\n <span className=\"block text-center\">1</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">2</span>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n\n <div>\n <p className=\"mb-2 text-sf-subtle\">gap=\"lg\"</p>\n <Grid variant=\"side-by-side\" gap=\"lg\">\n <GridItem>\n <Tile>\n <span className=\"block text-center\">1</span>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <span className=\"block text-center\">2</span>\n </Tile>\n </GridItem>\n </Grid>\n </div>\n </div>",
|
|
3452
|
+
"<Grid variant=\"4up\" gap=\"base\" mobileDivider>\n <GridItem>\n <Tile>\n <div>Item 1</div>\n <div className=\"mt-1\">Has divider on mobile</div>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <div>Item 2</div>\n <div className=\"mt-1\">Has divider on mobile</div>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <div>Item 3</div>\n <div className=\"mt-1\">Has divider on mobile</div>\n </Tile>\n </GridItem>\n <GridItem>\n <Tile>\n <div>Item 4</div>\n <div className=\"mt-1\">Has divider on mobile</div>\n </Tile>\n </GridItem>\n </Grid>"
|
|
3453
|
+
],
|
|
3454
|
+
"colors": [
|
|
3455
|
+
"border-sf-line"
|
|
3456
|
+
]
|
|
3074
3457
|
},
|
|
3075
3458
|
"Input": {
|
|
3076
3459
|
"name": "Input",
|
|
@@ -3103,7 +3486,12 @@
|
|
|
3103
3486
|
"type": "enum",
|
|
3104
3487
|
"optional": true,
|
|
3105
3488
|
"description": "Input size.\n- `\"xs\"` — Extra small for compact UIs\n- `\"sm\"` — Small for secondary fields\n- `\"base\"` — Default size\n- `\"lg\"` — Large for prominent fields",
|
|
3106
|
-
"values": [
|
|
3489
|
+
"values": [
|
|
3490
|
+
"xs",
|
|
3491
|
+
"sm",
|
|
3492
|
+
"base",
|
|
3493
|
+
"lg"
|
|
3494
|
+
],
|
|
3107
3495
|
"descriptions": {
|
|
3108
3496
|
"xs": "Extra small input for compact UIs",
|
|
3109
3497
|
"sm": "Small input for secondary fields",
|
|
@@ -3122,7 +3510,10 @@
|
|
|
3122
3510
|
"type": "enum",
|
|
3123
3511
|
"optional": true,
|
|
3124
3512
|
"description": "Visual variant.\n- `\"default\"` — Standard input\n- `\"error\"` — Error state for validation failures",
|
|
3125
|
-
"values": [
|
|
3513
|
+
"values": [
|
|
3514
|
+
"default",
|
|
3515
|
+
"error"
|
|
3516
|
+
],
|
|
3126
3517
|
"descriptions": {
|
|
3127
3518
|
"default": "Default input appearance",
|
|
3128
3519
|
"error": "Error state for validation failures"
|
|
@@ -3142,7 +3533,19 @@
|
|
|
3142
3533
|
"default": "default"
|
|
3143
3534
|
}
|
|
3144
3535
|
},
|
|
3145
|
-
"examples": [
|
|
3536
|
+
"examples": [
|
|
3537
|
+
"<Input\n label=\"Email\"\n placeholder=\"you@example.com\"\n description=\"We'll never share your email\"\n />",
|
|
3538
|
+
"<Input\n label=\"Username\"\n placeholder=\"Choose a username\"\n description=\"3-20 characters, alphanumeric only\"\n />",
|
|
3539
|
+
"<Input\n label=\"Email\"\n placeholder=\"you@example.com\"\n value=\"invalid-email\"\n variant=\"error\"\n error=\"Please enter a valid email address\"\n />",
|
|
3540
|
+
"<Input\n label=\"Password\"\n type=\"password\"\n value=\"short\"\n variant=\"error\"\n error={{\n match: \"tooShort\",\n message: \"Password must be at least 8 characters\",\n }}\n minLength={8}\n />",
|
|
3541
|
+
"<div className=\"flex flex-col gap-4\">\n <Input size=\"xs\" label=\"Extra Small\" placeholder=\"Extra small input\" />\n <Input size=\"sm\" label=\"Small\" placeholder=\"Small input\" />\n <Input label=\"Base\" placeholder=\"Base input (default)\" />\n <Input size=\"lg\" label=\"Large\" placeholder=\"Large input\" />\n </div>",
|
|
3542
|
+
"<Input label=\"Disabled field\" placeholder=\"Cannot edit\" disabled />",
|
|
3543
|
+
"<Input placeholder=\"Search...\" aria-label=\"Search products\" />",
|
|
3544
|
+
"<div className=\"flex flex-col gap-4\">\n <Input type=\"email\" label=\"Email\" placeholder=\"you@example.com\" />\n <Input type=\"password\" label=\"Password\" placeholder=\"••••••••\" />\n <Input type=\"number\" label=\"Age\" placeholder=\"18\" />\n <Input type=\"tel\" label=\"Phone\" placeholder=\"+1 (555) 000-0000\" />\n </div>",
|
|
3545
|
+
"<Input\n label=\"Phone Number\"\n required={false}\n placeholder=\"+1 (555) 000-0000\"\n />",
|
|
3546
|
+
"<Input\n label=\"API Key\"\n labelTooltip=\"Find this in your dashboard under Settings > API Keys\"\n placeholder=\"sk_live_...\"\n />",
|
|
3547
|
+
"<Input\n label={\n <span>\n Email for <strong>billing</strong>\n </span>\n }\n required\n placeholder=\"billing@company.com\"\n type=\"email\"\n />"
|
|
3548
|
+
],
|
|
3146
3549
|
"colors": [
|
|
3147
3550
|
"bg-sf-control",
|
|
3148
3551
|
"ring-sf-danger",
|
|
@@ -3240,8 +3643,18 @@
|
|
|
3240
3643
|
"description": "When true, only renders the inline content (indicators, tooltip) without the outer label element with font styling. Useful when composed inside another label element that already provides the text styling."
|
|
3241
3644
|
}
|
|
3242
3645
|
},
|
|
3243
|
-
"examples": [
|
|
3244
|
-
|
|
3646
|
+
"examples": [
|
|
3647
|
+
"<div className=\"flex flex-col gap-4\">\n <Label>Default Label</Label>\n <Label showOptional>Optional Label</Label>\n <Label tooltip=\"More information about this field\">\n Label with Tooltip\n </Label>\n </div>",
|
|
3648
|
+
"<Input label=\"Phone Number\" required={false} placeholder=\"+1 555-0000\" />",
|
|
3649
|
+
"<Input\n label=\"API Key\"\n labelTooltip=\"Find this in your dashboard settings under API > Keys\"\n placeholder=\"sk_live_...\"\n />",
|
|
3650
|
+
"<Checkbox\n label={\n <span>\n I agree to the <strong>Terms of Service</strong>\n </span>\n }\n />",
|
|
3651
|
+
"<div className=\"flex max-w-md flex-col gap-4\">\n <Input label=\"Full Name\" placeholder=\"John Doe\" />\n <Input\n label=\"Email\"\n labelTooltip=\"We'll send your receipt here\"\n placeholder=\"john@example.com\"\n type=\"email\"\n />\n <Input label=\"Company\" required={false} placeholder=\"Acme Inc.\" />\n <Select label=\"Country\" hideLabel={false} placeholder=\"Select a country\">\n <Select.Option value=\"us\">United States</Select.Option>\n <Select.Option value=\"uk\">United Kingdom</Select.Option>\n <Select.Option value=\"ca\">Canada</Select.Option>\n </Select>\n </div>",
|
|
3652
|
+
"<div className=\"flex flex-col gap-3\">\n <Label>Default</Label>\n <Label showOptional>Optional</Label>\n <Label tooltip=\"Important field\">With Tooltip</Label>\n </div>"
|
|
3653
|
+
],
|
|
3654
|
+
"colors": [
|
|
3655
|
+
"text-sf-default",
|
|
3656
|
+
"text-sf-strong"
|
|
3657
|
+
]
|
|
3245
3658
|
},
|
|
3246
3659
|
"LayerCard": {
|
|
3247
3660
|
"name": "LayerCard",
|
|
@@ -3260,7 +3673,11 @@
|
|
|
3260
3673
|
"description": "Additional CSS classes merged via `cn()`."
|
|
3261
3674
|
}
|
|
3262
3675
|
},
|
|
3263
|
-
"examples": [
|
|
3676
|
+
"examples": [
|
|
3677
|
+
"<LayerCard>\n <LayerCard.Secondary className=\"flex items-center justify-between\">\n <div>Next Steps</div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n shape=\"square\"\n aria-label=\"Go to next steps\"\n >\n <ArrowRightIcon size={16} />\n </Button>\n </LayerCard.Secondary>\n\n <LayerCard.Primary>Get started with SF</LayerCard.Primary>\n </LayerCard>",
|
|
3678
|
+
"<LayerCard className=\"w-[250px]\">\n <LayerCard.Secondary>Getting Started</LayerCard.Secondary>\n <LayerCard.Primary>\n <p className=\"text-sm text-sf-subtle\">\n Quick start guide for new users\n </p>\n </LayerCard.Primary>\n </LayerCard>",
|
|
3679
|
+
"<div className=\"flex gap-4\">\n <LayerCard className=\"w-[200px]\">\n <LayerCard.Secondary>Components</LayerCard.Secondary>\n <LayerCard.Primary>\n <p className=\"text-sm\">Browse all components</p>\n </LayerCard.Primary>\n </LayerCard>\n <LayerCard className=\"w-[200px]\">\n <LayerCard.Secondary>Examples</LayerCard.Secondary>\n <LayerCard.Primary>\n <p className=\"text-sm\">View code examples</p>\n </LayerCard.Primary>\n </LayerCard>\n </div>"
|
|
3680
|
+
],
|
|
3264
3681
|
"colors": [
|
|
3265
3682
|
"bg-sf-base",
|
|
3266
3683
|
"bg-sf-elevated",
|
|
@@ -3314,7 +3731,11 @@
|
|
|
3314
3731
|
"type": "enum",
|
|
3315
3732
|
"optional": true,
|
|
3316
3733
|
"description": "Visual style of the link.\n- `\"inline\"` — Inline text link that flows with content\n- `\"current\"` — Link that inherits color from parent text\n- `\"plain\"` — Link without underline decoration",
|
|
3317
|
-
"values": [
|
|
3734
|
+
"values": [
|
|
3735
|
+
"inline",
|
|
3736
|
+
"current",
|
|
3737
|
+
"plain"
|
|
3738
|
+
],
|
|
3318
3739
|
"descriptions": {
|
|
3319
3740
|
"inline": "Inline text link that flows with content",
|
|
3320
3741
|
"current": "Link that inherits color from parent text",
|
|
@@ -3405,7 +3826,13 @@
|
|
|
3405
3826
|
"description": "Allows you to replace the component's HTML element with a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render."
|
|
3406
3827
|
}
|
|
3407
3828
|
},
|
|
3408
|
-
"examples": [
|
|
3829
|
+
"examples": [
|
|
3830
|
+
"<div className=\"grid gap-x-6 gap-y-4 text-base md:grid-cols-3\">\n <Link href=\"#\">Default inline link</Link>\n <Link href=\"#\" variant=\"current\">\n Current color link\n </Link>\n <Link href=\"#\" variant=\"plain\">\n Plain inline link\n </Link>\n </div>",
|
|
3831
|
+
"<p className=\"mx-auto max-w-md text-base leading-relaxed text-sf-default\">\n This is a paragraph with an <Link href=\"#\">inline link</Link> that flows\n naturally with the surrounding text. Links maintain proper underline\n offset for readability.\n </p>",
|
|
3832
|
+
"<Link\n href=\"https://cloudflare.com\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-base\"\n >\n Visit Cloudflare <Link.ExternalIcon />\n </Link>",
|
|
3833
|
+
"<p className=\"text-base text-sf-danger\">\n This error message contains a{\" \"}\n <Link href=\"#\" variant=\"current\">\n link\n </Link>{\" \"}\n that inherits the red color from its parent.\n </p>",
|
|
3834
|
+
"<div className=\"flex flex-col gap-x-6 gap-y-4 text-base md:flex-row\">\n <Link render={<CustomRouterLink href=\"/dashboard\" />} variant=\"inline\">\n Dashboard (via render)\n </Link>\n <Link\n render={\n <CustomRouterLink\n href=\"https://developers.cloudflare.com\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n />\n }\n variant=\"inline\"\n >\n Cloudflare Docs <Link.ExternalIcon />\n </Link>\n </div>"
|
|
3835
|
+
],
|
|
3409
3836
|
"colors": [],
|
|
3410
3837
|
"subComponents": {
|
|
3411
3838
|
"ExternalIcon": {
|
|
@@ -3431,7 +3858,11 @@
|
|
|
3431
3858
|
"type": "enum",
|
|
3432
3859
|
"optional": true,
|
|
3433
3860
|
"description": "Size of the spinner. Use a preset name or a custom pixel number.\n- `\"sm\"` — 16px, for inline use\n- `\"base\"` — 24px, default size\n- `\"lg\"` — 32px, for prominent loading states",
|
|
3434
|
-
"values": [
|
|
3861
|
+
"values": [
|
|
3862
|
+
"sm",
|
|
3863
|
+
"base",
|
|
3864
|
+
"lg"
|
|
3865
|
+
],
|
|
3435
3866
|
"descriptions": {
|
|
3436
3867
|
"sm": "Small loader for inline use",
|
|
3437
3868
|
"base": "Default loader size",
|
|
@@ -3440,7 +3871,11 @@
|
|
|
3440
3871
|
"default": "base"
|
|
3441
3872
|
}
|
|
3442
3873
|
},
|
|
3443
|
-
"examples": [
|
|
3874
|
+
"examples": [
|
|
3875
|
+
"<Loader />",
|
|
3876
|
+
"<div className=\"flex items-center gap-4\">\n <Loader size=\"sm\" />\n <Loader size=\"base\" />\n <Loader size=\"lg\" />\n </div>",
|
|
3877
|
+
"<Loader size={24} />"
|
|
3878
|
+
],
|
|
3444
3879
|
"colors": []
|
|
3445
3880
|
},
|
|
3446
3881
|
"MenuBar": {
|
|
@@ -3471,8 +3906,16 @@
|
|
|
3471
3906
|
"description": "When true, each option's `id` field is used for matching instead of its array index."
|
|
3472
3907
|
}
|
|
3473
3908
|
},
|
|
3474
|
-
"examples": [
|
|
3475
|
-
"
|
|
3909
|
+
"examples": [
|
|
3910
|
+
"<MenuBar\n isActive=\"bold\"\n optionIds\n options={[\n {\n icon: <TextBolderIcon />,\n id: \"bold\",\n onClick: () => {},\n tooltip: \"Bold\",\n },\n {\n icon: <TextItalicIcon />,\n id: \"italic\",\n onClick: () => {},\n tooltip: \"Italic\",\n },\n ]}\n />",
|
|
3911
|
+
"<MenuBar\n isActive=\"bold\"\n optionIds\n options={[\n {\n icon: <TextBolderIcon />,\n id: \"bold\",\n onClick: () => {},\n tooltip: \"Bold\",\n },\n {\n icon: <TextItalicIcon />,\n id: \"italic\",\n onClick: () => {},\n tooltip: \"Italic\",\n },\n ]}\n />",
|
|
3912
|
+
"<MenuBar\n isActive=\"\"\n optionIds\n options={[\n {\n icon: <TextBolderIcon />,\n id: \"bold\",\n onClick: () => {},\n tooltip: \"Bold\",\n },\n {\n icon: <TextItalicIcon />,\n id: \"italic\",\n onClick: () => {},\n tooltip: \"Italic\",\n },\n ]}\n />"
|
|
3913
|
+
],
|
|
3914
|
+
"colors": [
|
|
3915
|
+
"bg-sf-base",
|
|
3916
|
+
"bg-sf-fill",
|
|
3917
|
+
"border-sf-fill"
|
|
3918
|
+
],
|
|
3476
3919
|
"styling": {
|
|
3477
3920
|
"container": {
|
|
3478
3921
|
"height": 32,
|
|
@@ -3532,8 +3975,19 @@
|
|
|
3532
3975
|
"description": "Minimum value of the meter (default: 0)"
|
|
3533
3976
|
}
|
|
3534
3977
|
},
|
|
3535
|
-
"examples": [
|
|
3536
|
-
|
|
3978
|
+
"examples": [
|
|
3979
|
+
"<Meter label=\"Storage used\" value={65} />",
|
|
3980
|
+
"<Meter label=\"API requests\" value={75} customValue=\"750 / 1,000\" />",
|
|
3981
|
+
"<Meter label=\"Progress\" value={40} showValue={false} />",
|
|
3982
|
+
"<Meter label=\"Quota reached\" value={100} />",
|
|
3983
|
+
"<Meter label=\"Memory usage\" value={15} />",
|
|
3984
|
+
"<Meter\n label=\"Upload progress\"\n value={80}\n indicatorClassName=\"from-green-500 via-green-500 to-green-500\"\n />"
|
|
3985
|
+
],
|
|
3986
|
+
"colors": [
|
|
3987
|
+
"bg-sf-fill",
|
|
3988
|
+
"text-sf-default",
|
|
3989
|
+
"text-sf-strong"
|
|
3990
|
+
]
|
|
3537
3991
|
},
|
|
3538
3992
|
"Pagination": {
|
|
3539
3993
|
"name": "Pagination",
|
|
@@ -3545,7 +3999,10 @@
|
|
|
3545
3999
|
"controls": {
|
|
3546
4000
|
"type": "enum",
|
|
3547
4001
|
"optional": true,
|
|
3548
|
-
"values": [
|
|
4002
|
+
"values": [
|
|
4003
|
+
"full",
|
|
4004
|
+
"simple"
|
|
4005
|
+
],
|
|
3549
4006
|
"descriptions": {
|
|
3550
4007
|
"full": "Full pagination controls with first, previous, page input, next, and last buttons",
|
|
3551
4008
|
"simple": "Simple pagination controls with only previous and next buttons"
|
|
@@ -3578,8 +4035,17 @@
|
|
|
3578
4035
|
"description": "Method to provide custom pagination text"
|
|
3579
4036
|
}
|
|
3580
4037
|
},
|
|
3581
|
-
"examples": [
|
|
3582
|
-
|
|
4038
|
+
"examples": [
|
|
4039
|
+
"<Pagination page={page} setPage={setPage} perPage={10} totalCount={100} />",
|
|
4040
|
+
"<Pagination\n page={page}\n setPage={setPage}\n perPage={10}\n totalCount={100}\n controls=\"simple\"\n />",
|
|
4041
|
+
"<Pagination\n page={page}\n setPage={setPage}\n perPage={10}\n totalCount={100}\n controls=\"full\"\n />",
|
|
4042
|
+
"<Pagination page={page} setPage={setPage} perPage={10} totalCount={100} />",
|
|
4043
|
+
"<Pagination page={page} setPage={setPage} perPage={25} totalCount={1250} />",
|
|
4044
|
+
"<Pagination\n text={({ perPage }) => `Page ${page} - showing ${perPage} per page`}\n page={page}\n setPage={setPage}\n perPage={25}\n totalCount={100}\n />"
|
|
4045
|
+
],
|
|
4046
|
+
"colors": [
|
|
4047
|
+
"text-sf-strong"
|
|
4048
|
+
],
|
|
3583
4049
|
"styling": {
|
|
3584
4050
|
"layout": {
|
|
3585
4051
|
"height": 36,
|
|
@@ -3602,7 +4068,12 @@
|
|
|
3602
4068
|
"type": "enum",
|
|
3603
4069
|
"optional": true,
|
|
3604
4070
|
"description": "Which side of the trigger the popover appears on.\n- `\"top\"` — Above the trigger\n- `\"bottom\"` — Below the trigger\n- `\"left\"` — Left of the trigger\n- `\"right\"` — Right of the trigger",
|
|
3605
|
-
"values": [
|
|
4071
|
+
"values": [
|
|
4072
|
+
"top",
|
|
4073
|
+
"bottom",
|
|
4074
|
+
"left",
|
|
4075
|
+
"right"
|
|
4076
|
+
],
|
|
3606
4077
|
"descriptions": {
|
|
3607
4078
|
"top": "Popover appears above the trigger",
|
|
3608
4079
|
"bottom": "Popover appears below the trigger",
|
|
@@ -3612,7 +4083,14 @@
|
|
|
3612
4083
|
"default": "bottom"
|
|
3613
4084
|
}
|
|
3614
4085
|
},
|
|
3615
|
-
"examples": [
|
|
4086
|
+
"examples": [
|
|
4087
|
+
"<Popover>\n <Popover.Trigger asChild>\n <Button shape=\"square\" icon={BellIcon} aria-label=\"Notifications\" />\n </Popover.Trigger>\n <Popover.Content>\n <Popover.Title>Notifications</Popover.Title>\n <Popover.Description>\n You are all caught up. Good job!\n </Popover.Description>\n </Popover.Content>\n </Popover>",
|
|
4088
|
+
"<Popover>\n <Popover.Trigger asChild>\n <Button>Open Popover</Button>\n </Popover.Trigger>\n <Popover.Content>\n <Popover.Title>Popover Title</Popover.Title>\n <Popover.Description>\n This is a basic popover with a title and description.\n </Popover.Description>\n </Popover.Content>\n </Popover>",
|
|
4089
|
+
"<Popover>\n <Popover.Trigger asChild>\n <Button>Open Settings</Button>\n </Popover.Trigger>\n <Popover.Content>\n <Popover.Title>Settings</Popover.Title>\n <Popover.Description>\n Configure your preferences below.\n </Popover.Description>\n <div className=\"mt-3\">\n <Popover.Close asChild>\n <Button variant=\"secondary\" size=\"sm\">\n Close\n </Button>\n </Popover.Close>\n </div>\n </Popover.Content>\n </Popover>",
|
|
4090
|
+
"<div className=\"flex flex-wrap gap-4\">\n <Popover>\n <Popover.Trigger asChild>\n <Button variant=\"secondary\">Bottom</Button>\n </Popover.Trigger>\n <Popover.Content side=\"bottom\">\n <Popover.Title>Bottom</Popover.Title>\n <Popover.Description>\n Popover on bottom (default).\n </Popover.Description>\n </Popover.Content>\n </Popover>\n\n <Popover>\n <Popover.Trigger asChild>\n <Button variant=\"secondary\">Top</Button>\n </Popover.Trigger>\n <Popover.Content side=\"top\">\n <Popover.Title>Top</Popover.Title>\n <Popover.Description>Popover on top.</Popover.Description>\n </Popover.Content>\n </Popover>\n\n <Popover>\n <Popover.Trigger asChild>\n <Button variant=\"secondary\">Left</Button>\n </Popover.Trigger>\n <Popover.Content side=\"left\">\n <Popover.Title>Left</Popover.Title>\n <Popover.Description>Popover on left.</Popover.Description>\n </Popover.Content>\n </Popover>\n\n <Popover>\n <Popover.Trigger asChild>\n <Button variant=\"secondary\">Right</Button>\n </Popover.Trigger>\n <Popover.Content side=\"right\">\n <Popover.Title>Right</Popover.Title>\n <Popover.Description>Popover on right.</Popover.Description>\n </Popover.Content>\n </Popover>\n </div>",
|
|
4091
|
+
"<Popover>\n <Popover.Trigger asChild>\n <Button>User Profile</Button>\n </Popover.Trigger>\n <Popover.Content className=\"w-64\">\n <div className=\"flex items-center gap-3\">\n <div className=\"size-10 rounded-full bg-sf-recessed\" />\n <div>\n <Popover.Title>Jane Doe</Popover.Title>\n <p className=\"text-sm text-sf-subtle\">jane@example.com</p>\n </div>\n </div>\n <div className=\"mt-3 flex gap-2 border-t border-sf-line pt-3\">\n <Button variant=\"secondary\" size=\"sm\" className=\"flex-1\">\n Profile\n </Button>\n <Popover.Close asChild>\n <Button variant=\"ghost\" size=\"sm\" className=\"flex-1\">\n Sign Out\n </Button>\n </Popover.Close>\n </div>\n </Popover.Content>\n </Popover>",
|
|
4092
|
+
"<Popover>\n <Popover.Trigger openOnHover delay={200} asChild>\n <Button variant=\"secondary\">Hover Me</Button>\n </Popover.Trigger>\n <Popover.Content>\n <Popover.Title>Hover Triggered</Popover.Title>\n <Popover.Description>\n This popover opens on hover with a 200ms delay. It can still contain\n interactive content like buttons and links.\n </Popover.Description>\n <div className=\"mt-3\">\n <Popover.Close asChild>\n <Button variant=\"secondary\" size=\"sm\">\n Got it\n </Button>\n </Popover.Close>\n </div>\n </Popover.Content>\n </Popover>"
|
|
4093
|
+
],
|
|
3616
4094
|
"colors": [
|
|
3617
4095
|
"bg-sf-elevated",
|
|
3618
4096
|
"fill-sf-elevated",
|
|
@@ -3678,9 +4156,19 @@
|
|
|
3678
4156
|
"description": "Content rendered in the collapsible back layer (e.g. HITL approvals, task lists). When provided the prompt input is wrapped in a LayerCard shell with a header row containing a chevron toggle. Use `PromptInputBackLayer` to compose structured content for this slot."
|
|
3679
4157
|
},
|
|
3680
4158
|
"backLayerTitle": {
|
|
3681
|
-
"type": "
|
|
4159
|
+
"type": "ReactNode",
|
|
3682
4160
|
"optional": true,
|
|
3683
|
-
"description": "
|
|
4161
|
+
"description": "Header content shown in the back layer header row. Strings render as plain text; pass JSX to compose with icons/spinners/badges. Defaults to `\"Context\"`."
|
|
4162
|
+
},
|
|
4163
|
+
"backLayerStatus": {
|
|
4164
|
+
"type": "enum",
|
|
4165
|
+
"optional": true,
|
|
4166
|
+
"description": "Optional status indicator rendered next to the title. `\"running\"` shows a small spinner; `\"error\"` shows an inline error icon. Use this instead of composing JSX into `backLayerTitle` for the common case of an agent doing work.",
|
|
4167
|
+
"values": [
|
|
4168
|
+
"idle",
|
|
4169
|
+
"running",
|
|
4170
|
+
"error"
|
|
4171
|
+
]
|
|
3684
4172
|
},
|
|
3685
4173
|
"backLayerOpen": {
|
|
3686
4174
|
"type": "boolean",
|
|
@@ -3718,15 +4206,86 @@
|
|
|
3718
4206
|
"bg-sf-base",
|
|
3719
4207
|
"bg-sf-control",
|
|
3720
4208
|
"bg-sf-elevated",
|
|
4209
|
+
"bg-sf-info-tint",
|
|
3721
4210
|
"bg-sf-overlay",
|
|
3722
4211
|
"bg-sf-tint",
|
|
4212
|
+
"border-sf-info",
|
|
3723
4213
|
"ring-sf-line",
|
|
3724
4214
|
"ring-sf-ring",
|
|
3725
4215
|
"text-sf-brand",
|
|
4216
|
+
"text-sf-danger",
|
|
3726
4217
|
"text-sf-default",
|
|
3727
4218
|
"text-sf-inactive",
|
|
4219
|
+
"text-sf-strong",
|
|
3728
4220
|
"text-sf-subtle"
|
|
3729
|
-
]
|
|
4221
|
+
],
|
|
4222
|
+
"subComponents": {
|
|
4223
|
+
"BackLayer": {
|
|
4224
|
+
"name": "BackLayer",
|
|
4225
|
+
"description": "BackLayer sub-component",
|
|
4226
|
+
"props": {}
|
|
4227
|
+
},
|
|
4228
|
+
"Textarea": {
|
|
4229
|
+
"name": "Textarea",
|
|
4230
|
+
"description": "Textarea sub-component",
|
|
4231
|
+
"props": {}
|
|
4232
|
+
},
|
|
4233
|
+
"Editor": {
|
|
4234
|
+
"name": "Editor",
|
|
4235
|
+
"description": "Editor sub-component",
|
|
4236
|
+
"props": {}
|
|
4237
|
+
},
|
|
4238
|
+
"Toolbar": {
|
|
4239
|
+
"name": "Toolbar",
|
|
4240
|
+
"description": "Toolbar sub-component",
|
|
4241
|
+
"props": {}
|
|
4242
|
+
},
|
|
4243
|
+
"Tools": {
|
|
4244
|
+
"name": "Tools",
|
|
4245
|
+
"description": "Tools sub-component",
|
|
4246
|
+
"props": {}
|
|
4247
|
+
},
|
|
4248
|
+
"Submit": {
|
|
4249
|
+
"name": "Submit",
|
|
4250
|
+
"description": "Submit sub-component",
|
|
4251
|
+
"props": {}
|
|
4252
|
+
},
|
|
4253
|
+
"ModeSelector": {
|
|
4254
|
+
"name": "ModeSelector",
|
|
4255
|
+
"description": "ModeSelector sub-component",
|
|
4256
|
+
"props": {}
|
|
4257
|
+
},
|
|
4258
|
+
"AddTagButton": {
|
|
4259
|
+
"name": "AddTagButton",
|
|
4260
|
+
"description": "AddTagButton sub-component",
|
|
4261
|
+
"props": {}
|
|
4262
|
+
},
|
|
4263
|
+
"Tags": {
|
|
4264
|
+
"name": "Tags",
|
|
4265
|
+
"description": "Tags sub-component",
|
|
4266
|
+
"props": {}
|
|
4267
|
+
},
|
|
4268
|
+
"Tag": {
|
|
4269
|
+
"name": "Tag",
|
|
4270
|
+
"description": "Tag sub-component",
|
|
4271
|
+
"props": {}
|
|
4272
|
+
},
|
|
4273
|
+
"AttachButton": {
|
|
4274
|
+
"name": "AttachButton",
|
|
4275
|
+
"description": "AttachButton sub-component",
|
|
4276
|
+
"props": {}
|
|
4277
|
+
},
|
|
4278
|
+
"Attachments": {
|
|
4279
|
+
"name": "Attachments",
|
|
4280
|
+
"description": "Attachments sub-component",
|
|
4281
|
+
"props": {}
|
|
4282
|
+
},
|
|
4283
|
+
"Attachment": {
|
|
4284
|
+
"name": "Attachment",
|
|
4285
|
+
"description": "Attachment sub-component",
|
|
4286
|
+
"props": {}
|
|
4287
|
+
}
|
|
4288
|
+
}
|
|
3730
4289
|
},
|
|
3731
4290
|
"Radio": {
|
|
3732
4291
|
"name": "Radio",
|
|
@@ -3749,7 +4308,10 @@
|
|
|
3749
4308
|
"type": "enum",
|
|
3750
4309
|
"optional": true,
|
|
3751
4310
|
"description": "Layout direction of the radio items",
|
|
3752
|
-
"values": [
|
|
4311
|
+
"values": [
|
|
4312
|
+
"vertical",
|
|
4313
|
+
"horizontal"
|
|
4314
|
+
]
|
|
3753
4315
|
},
|
|
3754
4316
|
"error": {
|
|
3755
4317
|
"type": "string",
|
|
@@ -3775,7 +4337,10 @@
|
|
|
3775
4337
|
"type": "enum",
|
|
3776
4338
|
"optional": true,
|
|
3777
4339
|
"description": "Position of radio control relative to label: \"start\" (default) puts radio before label, \"end\" puts label before radio",
|
|
3778
|
-
"values": [
|
|
4340
|
+
"values": [
|
|
4341
|
+
"start",
|
|
4342
|
+
"end"
|
|
4343
|
+
]
|
|
3779
4344
|
},
|
|
3780
4345
|
"name": {
|
|
3781
4346
|
"type": "string",
|
|
@@ -3788,7 +4353,15 @@
|
|
|
3788
4353
|
"description": "Additional CSS classes"
|
|
3789
4354
|
}
|
|
3790
4355
|
},
|
|
3791
|
-
"examples": [
|
|
4356
|
+
"examples": [
|
|
4357
|
+
"<Radio.Group\n legend=\"Notification preference\"\n value={value}\n onValueChange={setValue}\n >\n <Radio.Item label=\"Email\" value=\"email\" />\n <Radio.Item label=\"SMS\" value=\"sms\" />\n <Radio.Item label=\"Push notification\" value=\"push\" />\n </Radio.Group>",
|
|
4358
|
+
"<Radio.Group legend=\"Account type\" value={value} onValueChange={setValue}>\n <Radio.Item label=\"Personal\" value=\"personal\" />\n <Radio.Item label=\"Business\" value=\"business\" />\n <Radio.Item label=\"Enterprise\" value=\"enterprise\" />\n </Radio.Group>",
|
|
4359
|
+
"<Radio.Group\n legend=\"Size\"\n orientation=\"horizontal\"\n value={value}\n onValueChange={setValue}\n >\n <Radio.Item label=\"Small\" value=\"sm\" />\n <Radio.Item label=\"Medium\" value=\"md\" />\n <Radio.Item label=\"Large\" value=\"lg\" />\n </Radio.Group>",
|
|
4360
|
+
"<Radio.Group\n legend=\"Shipping method\"\n description=\"Choose how you'd like to receive your order\"\n value={value}\n onValueChange={setValue}\n >\n <Radio.Item label=\"Standard (5-7 days)\" value=\"standard\" />\n <Radio.Item label=\"Express (2-3 days)\" value=\"express\" />\n <Radio.Item label=\"Overnight\" value=\"overnight\" />\n </Radio.Group>",
|
|
4361
|
+
"<Radio.Group\n legend=\"Payment method\"\n error=\"Please select a payment method to continue\"\n >\n <Radio.Item label=\"Credit Card\" value=\"card\" variant=\"error\" />\n <Radio.Item label=\"PayPal\" value=\"paypal\" variant=\"error\" />\n <Radio.Item label=\"Bank Transfer\" value=\"bank\" variant=\"error\" />\n </Radio.Group>",
|
|
4362
|
+
"<div className=\"flex flex-col gap-6\">\n <Radio.Group legend=\"Disabled group\" disabled defaultValue=\"a\">\n <Radio.Item label=\"Option A\" value=\"a\" />\n <Radio.Item label=\"Option B\" value=\"b\" />\n </Radio.Group>\n <Radio.Group legend=\"Individual disabled\" defaultValue=\"available\">\n <Radio.Item label=\"Available\" value=\"available\" />\n <Radio.Item label=\"Unavailable\" value=\"unavailable\" disabled />\n </Radio.Group>\n </div>",
|
|
4363
|
+
"<Radio.Group legend=\"Preferences\" controlPosition=\"end\" defaultValue=\"a\">\n <Radio.Item label=\"Label before radio\" value=\"a\" />\n <Radio.Item label=\"Another option\" value=\"b\" />\n </Radio.Group>"
|
|
4364
|
+
],
|
|
3792
4365
|
"colors": [
|
|
3793
4366
|
"bg-sf-base",
|
|
3794
4367
|
"bg-sf-contrast",
|
|
@@ -3877,7 +4450,16 @@
|
|
|
3877
4450
|
"description": "Initial value for uncontrolled mode"
|
|
3878
4451
|
}
|
|
3879
4452
|
},
|
|
3880
|
-
"examples": [
|
|
4453
|
+
"examples": [
|
|
4454
|
+
"<Select\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v ?? \"apple\")}\n items={{ apple: \"Apple\", banana: \"Banana\", cherry: \"Cherry\" }}\n >\n <Select.Option value=\"apple\">Apple</Select.Option>\n <Select.Option value=\"banana\">Banana</Select.Option>\n <Select.Option value=\"cherry\">Cherry</Select.Option>\n </Select>",
|
|
4455
|
+
"<Select\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v as string)}\n items={{\n bug: \"Bug\",\n documentation: \"Documentation\",\n feature: \"Feature\",\n }}\n >\n <Select.Option value=\"bug\">Bug</Select.Option>\n <Select.Option value=\"documentation\">Documentation</Select.Option>\n <Select.Option value=\"feature\">Feature</Select.Option>\n </Select>",
|
|
4456
|
+
"<Select\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n items={[\n { label: \"Please select\", value: null },\n { label: \"Bug\", value: \"bug\" },\n { label: \"Documentation\", value: \"documentation\" },\n { label: \"Feature\", value: \"feature\" },\n ]}\n >\n <Select.Option value=\"bug\">Bug</Select.Option>\n <Select.Option value=\"documentation\">Documentation</Select.Option>\n <Select.Option value=\"feature\">Feature</Select.Option>\n </Select>",
|
|
4457
|
+
"<Select\n className=\"w-[200px]\"\n renderValue={(v) => (\n <span>\n {v.emoji} {v.label}\n </span>\n )}\n value={value}\n onValueChange={(v) => setValue(v as (typeof languages)[0])}\n >\n {languages.map((language) => (\n <Select.Option key={language.value} value={language}>\n {language.emoji} {language.label}\n </Select.Option>\n ))}\n </Select>",
|
|
4458
|
+
"<Select className=\"w-[200px]\" loading />",
|
|
4459
|
+
"<Select\n className=\"w-[200px]\"\n loading={loading}\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n placeholder=\"Please select\"\n >\n {data?.map((item) => (\n <Select.Option key={item} value={item}>\n {item}\n </Select.Option>\n ))}\n </Select>",
|
|
4460
|
+
"<Select\n className=\"w-[250px]\"\n multiple\n renderValue={(value) => {\n if (value.length > 3) {\n return (\n <span className=\"line-clamp-1\">\n {value.slice(2).join(\", \") + ` and ${value.length - 2} more`}\n </span>\n );\n }\n return <span>{value.join(\", \")}</span>;\n }}\n value={value}\n onValueChange={(v) => setValue(v as string[])}\n >\n <Select.Option value=\"Name\">Name</Select.Option>\n <Select.Option value=\"Location\">Location</Select.Option>\n <Select.Option value=\"Size\">Size</Select.Option>\n <Select.Option value=\"Read\">Read</Select.Option>\n <Select.Option value=\"Write\">Write</Select.Option>\n <Select.Option value=\"CreatedAt\">Created At</Select.Option>\n </Select>",
|
|
4461
|
+
"<Select\n className=\"w-[200px]\"\n onValueChange={(v) => setValue(v as (typeof authors)[0] | null)}\n value={value}\n isItemEqualToValue={(item, value) => item?.id === value?.id}\n renderValue={(author) => author?.name ?? \"Please select author\"}\n >\n {authors.map((author) => (\n <Select.Option key={author.id} value={author}>\n <div className=\"flex w-[300px] items-center justify-between gap-2\">\n <Text>{author.name}</Text>\n <Text variant=\"secondary\">{author.title}</Text>\n </div>\n </Select.Option>\n ))}\n </Select>"
|
|
4462
|
+
],
|
|
3881
4463
|
"colors": [
|
|
3882
4464
|
"bg-sf-control",
|
|
3883
4465
|
"bg-sf-overlay",
|
|
@@ -4007,14 +4589,22 @@
|
|
|
4007
4589
|
"type": "enum",
|
|
4008
4590
|
"optional": true,
|
|
4009
4591
|
"description": "Size of the input.\n- `\"xs\"` — Extra small for compact UIs\n- `\"sm\"` — Small for secondary fields\n- `\"base\"` — Default input size\n- `\"lg\"` — Large for prominent fields",
|
|
4010
|
-
"values": [
|
|
4592
|
+
"values": [
|
|
4593
|
+
"xs",
|
|
4594
|
+
"sm",
|
|
4595
|
+
"base",
|
|
4596
|
+
"lg"
|
|
4597
|
+
],
|
|
4011
4598
|
"default": "base"
|
|
4012
4599
|
},
|
|
4013
4600
|
"variant": {
|
|
4014
4601
|
"type": "enum",
|
|
4015
4602
|
"optional": true,
|
|
4016
4603
|
"description": "Style variant of the input.\n- `\"default\"` — Default input appearance\n- `\"error\"` — Error state for validation failures",
|
|
4017
|
-
"values": [
|
|
4604
|
+
"values": [
|
|
4605
|
+
"default",
|
|
4606
|
+
"error"
|
|
4607
|
+
],
|
|
4018
4608
|
"default": "default"
|
|
4019
4609
|
},
|
|
4020
4610
|
"label": {
|
|
@@ -4038,7 +4628,12 @@
|
|
|
4038
4628
|
"description": "Error message or validation error object"
|
|
4039
4629
|
}
|
|
4040
4630
|
},
|
|
4041
|
-
"examples": [
|
|
4631
|
+
"examples": [
|
|
4632
|
+
"<div className=\"w-80\">\n <SensitiveInput label=\"API Key\" defaultValue=\"sk_live_abc123xyz789\" />\n </div>",
|
|
4633
|
+
"<div className=\"flex flex-col gap-4\">\n {sizes.map((size) => (\n <div key={size} className=\"flex items-center gap-2\">\n <span className=\"w-12 text-sm text-sf-subtle\">{size}</span>\n <SensitiveInput\n label={`${size} size`}\n size={size}\n defaultValue=\"secret-api-key-123\"\n />\n </div>\n ))}\n </div>",
|
|
4634
|
+
"<div className=\"flex w-80 flex-col gap-4\">\n <SensitiveInput\n label=\"Controlled Secret\"\n value={value}\n onValueChange={setValue}\n />\n <div className=\"text-sm text-sf-subtle\">\n Current value: <code className=\"text-sf-default\">{value}</code>\n </div>\n <div className=\"flex gap-2\">\n <Button\n onClick={() => setValue(\"new-secret-\" + Date.now())}\n variant=\"primary\"\n size=\"sm\"\n >\n Change value\n </Button>\n <Button onClick={() => setValue(\"\")} variant=\"secondary\" size=\"sm\">\n Clear\n </Button>\n </div>\n </div>",
|
|
4635
|
+
"<div className=\"flex w-80 flex-col gap-4\">\n <SensitiveInput\n label=\"Error State\"\n variant=\"error\"\n defaultValue=\"invalid-key\"\n error=\"This API key is not valid\"\n />\n <SensitiveInput label=\"Disabled\" defaultValue=\"cannot-edit\" disabled />\n <SensitiveInput\n label=\"Read-only\"\n defaultValue=\"view-only-secret-key\"\n readOnly\n />\n <SensitiveInput\n label=\"With Description\"\n defaultValue=\"my-secret-value\"\n description=\"Keep this value secure and don't share it\"\n />\n </div>"
|
|
4636
|
+
],
|
|
4042
4637
|
"colors": [
|
|
4043
4638
|
"bg-sf-brand",
|
|
4044
4639
|
"bg-sf-control",
|
|
@@ -4068,7 +4663,11 @@
|
|
|
4068
4663
|
"type": "enum",
|
|
4069
4664
|
"optional": true,
|
|
4070
4665
|
"description": "Sidebar layout variant.",
|
|
4071
|
-
"values": [
|
|
4666
|
+
"values": [
|
|
4667
|
+
"sidebar",
|
|
4668
|
+
"floating",
|
|
4669
|
+
"inset"
|
|
4670
|
+
],
|
|
4072
4671
|
"descriptions": {
|
|
4073
4672
|
"sidebar": "Standard sidebar with border separator",
|
|
4074
4673
|
"floating": "Floating sidebar with shadow and rounded corners",
|
|
@@ -4080,7 +4679,10 @@
|
|
|
4080
4679
|
"type": "enum",
|
|
4081
4680
|
"optional": true,
|
|
4082
4681
|
"description": "Which side the sidebar is on.",
|
|
4083
|
-
"values": [
|
|
4682
|
+
"values": [
|
|
4683
|
+
"left",
|
|
4684
|
+
"right"
|
|
4685
|
+
],
|
|
4084
4686
|
"descriptions": {
|
|
4085
4687
|
"left": "Left-aligned sidebar",
|
|
4086
4688
|
"right": "Right-aligned sidebar"
|
|
@@ -4090,7 +4692,11 @@
|
|
|
4090
4692
|
"collapsible": {
|
|
4091
4693
|
"type": "enum",
|
|
4092
4694
|
"optional": true,
|
|
4093
|
-
"values": [
|
|
4695
|
+
"values": [
|
|
4696
|
+
"icon",
|
|
4697
|
+
"offcanvas",
|
|
4698
|
+
"none"
|
|
4699
|
+
],
|
|
4094
4700
|
"descriptions": {
|
|
4095
4701
|
"icon": "Collapses to show icons only",
|
|
4096
4702
|
"offcanvas": "Slides off screen when collapsed",
|
|
@@ -4129,7 +4735,14 @@
|
|
|
4129
4735
|
"description": "Additional CSS classes for the wrapper div."
|
|
4130
4736
|
}
|
|
4131
4737
|
},
|
|
4132
|
-
"examples": [
|
|
4738
|
+
"examples": [
|
|
4739
|
+
"<DemoContainer>\n <Sidebar.Provider defaultOpen className=\"min-h-0! h-full\">\n <Sidebar>\n <Sidebar.Content>\n <Sidebar.Group>\n <Sidebar.GroupLabel>Overview</Sidebar.GroupLabel>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={HouseIcon} active>\n Home\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={ChartBarIcon}>\n Analytics\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={GlobeIcon}>\n Domains\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n\n <Sidebar.Group>\n <Sidebar.GroupLabel>Build</Sidebar.GroupLabel>\n <Sidebar.Menu>\n <Sidebar.MenuItem>\n <Sidebar.Collapsible defaultOpen>\n <Sidebar.CollapsibleTrigger\n render={\n <Sidebar.MenuButton icon={CodeIcon}>\n Compute\n <Sidebar.MenuChevron />\n </Sidebar.MenuButton>\n }\n />\n <Sidebar.CollapsibleContent>\n <Sidebar.MenuSub>\n <Sidebar.MenuSubButton>Workers</Sidebar.MenuSubButton>\n <Sidebar.MenuSubButton>\n Durable Objects\n </Sidebar.MenuSubButton>\n </Sidebar.MenuSub>\n </Sidebar.CollapsibleContent>\n </Sidebar.Collapsible>\n </Sidebar.MenuItem>\n <Sidebar.MenuButton icon={DatabaseIcon}>\n Storage\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n </Sidebar.Content>\n </Sidebar>\n <DemoMain />\n </Sidebar.Provider>\n </DemoContainer>",
|
|
4740
|
+
"<DemoContainer>\n <Sidebar.Provider defaultOpen className=\"min-h-0! h-full\">\n <Sidebar>\n <Sidebar.Content>\n <Sidebar.Group collapsible defaultOpen>\n <Sidebar.GroupLabel>Overview</Sidebar.GroupLabel>\n <Sidebar.GroupContent>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={HouseIcon} active>\n Home\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={ChartBarIcon}>\n Analytics\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={GlobeIcon}>\n Domains\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.GroupContent>\n </Sidebar.Group>\n\n <Sidebar.Group collapsible defaultOpen={false}>\n <Sidebar.GroupLabel>Settings</Sidebar.GroupLabel>\n <Sidebar.GroupContent>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={ShieldCheckIcon}>\n Security\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={LockIcon}>\n Access Control\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.GroupContent>\n </Sidebar.Group>\n </Sidebar.Content>\n </Sidebar>\n <DemoMain />\n </Sidebar.Provider>\n </DemoContainer>",
|
|
4741
|
+
"<DemoContainer>\n <Sidebar.Provider defaultOpen className=\"min-h-0! h-full\">\n <Sidebar>\n <Sidebar.Header>\n <BrandLogo />\n </Sidebar.Header>\n <Sidebar.Content>\n <Sidebar.Group>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={HouseIcon} tooltip=\"Home\" active>\n Home\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={ChartBarIcon} tooltip=\"Analytics\">\n Analytics\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={CodeIcon} tooltip=\"Compute\">\n Compute\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={DatabaseIcon} tooltip=\"Storage\">\n Storage\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n </Sidebar.Content>\n <Sidebar.Footer>\n <Sidebar.Trigger />\n </Sidebar.Footer>\n </Sidebar>\n <DemoMain>\n <ToggleButton />\n <p className=\"text-sm\">\n Click the button or the sidebar trigger to toggle\n </p>\n </DemoMain>\n </Sidebar.Provider>\n </DemoContainer>",
|
|
4742
|
+
"<DemoContainer>\n <Sidebar.Provider defaultOpen className=\"min-h-0! h-full\">\n <Sidebar>\n <Sidebar.Header>\n <BrandLogo />\n </Sidebar.Header>\n\n <Sidebar.Content>\n <div className=\"px-1 pb-2\">\n <Sidebar.Input placeholder=\"Quick search...\" shortcut=\"⌘K\" />\n </div>\n\n <Sidebar.Group>\n <Sidebar.GroupLabel>Overview</Sidebar.GroupLabel>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={HouseIcon} active>\n Home\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={ChartBarIcon}>\n Analytics\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={GlobeIcon}>\n Domains\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n\n <Sidebar.Separator />\n\n <Sidebar.Group>\n <Sidebar.GroupLabel>Build</Sidebar.GroupLabel>\n <Sidebar.Menu>\n <Sidebar.MenuItem>\n <Sidebar.Collapsible defaultOpen>\n <Sidebar.CollapsibleTrigger\n render={\n <Sidebar.MenuButton icon={CodeIcon}>\n Compute\n <Sidebar.MenuChevron />\n </Sidebar.MenuButton>\n }\n />\n <Sidebar.CollapsibleContent>\n <Sidebar.MenuSub>\n <Sidebar.MenuSubButton>Workers</Sidebar.MenuSubButton>\n <Sidebar.MenuSubButton>\n Durable Objects\n </Sidebar.MenuSubButton>\n <Sidebar.MenuSubButton>\n Containers\n <Sidebar.MenuBadge>Beta</Sidebar.MenuBadge>\n </Sidebar.MenuSubButton>\n </Sidebar.MenuSub>\n </Sidebar.CollapsibleContent>\n </Sidebar.Collapsible>\n </Sidebar.MenuItem>\n <Sidebar.MenuButton icon={DatabaseIcon}>\n Storage\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n\n <Sidebar.Group>\n <Sidebar.GroupLabel>Security</Sidebar.GroupLabel>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={ShieldCheckIcon}>\n Firewall\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={LockIcon}>\n Access\n <Sidebar.MenuBadge>Beta</Sidebar.MenuBadge>\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={BellIcon}>\n Notifications\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n </Sidebar.Content>\n\n <Sidebar.Footer>\n <Sidebar.MenuButton icon={GearIcon}>Settings</Sidebar.MenuButton>\n </Sidebar.Footer>\n </Sidebar>\n <DemoMain />\n </Sidebar.Provider>\n </DemoContainer>",
|
|
4743
|
+
"<DemoContainer>\n <Sidebar.Provider\n defaultOpen\n resizable\n defaultWidth={240}\n minWidth={180}\n maxWidth={400}\n className=\"min-h-0! h-full\"\n >\n <Sidebar>\n <Sidebar.Header>\n <BrandLogo />\n </Sidebar.Header>\n <Sidebar.Content>\n <Sidebar.Group>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={HouseIcon} active>\n Home\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={ChartBarIcon}>\n Analytics\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={GlobeIcon}>\n Domains\n </Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n </Sidebar.Content>\n <Sidebar.ResizeHandle />\n </Sidebar>\n <DemoMain>\n <p className=\"text-sm\">Drag the sidebar edge to resize</p>\n </DemoMain>\n </Sidebar.Provider>\n </DemoContainer>",
|
|
4744
|
+
"<DemoContainer>\n <Sidebar.Provider defaultOpen side=\"right\" className=\"min-h-0! h-full\">\n <DemoMain>\n <p className=\"text-sm\">Sidebar on the right</p>\n </DemoMain>\n <Sidebar>\n <Sidebar.Content>\n <Sidebar.Group>\n <Sidebar.GroupLabel>Details</Sidebar.GroupLabel>\n <Sidebar.Menu>\n <Sidebar.MenuButton icon={GearIcon} active>\n Properties\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={ChartBarIcon}>\n Metrics\n </Sidebar.MenuButton>\n <Sidebar.MenuButton icon={BellIcon}>Alerts</Sidebar.MenuButton>\n </Sidebar.Menu>\n </Sidebar.Group>\n </Sidebar.Content>\n </Sidebar>\n </Sidebar.Provider>\n </DemoContainer>"
|
|
4745
|
+
],
|
|
4133
4746
|
"colors": [
|
|
4134
4747
|
"bg-sf-base",
|
|
4135
4748
|
"bg-sf-brand",
|
|
@@ -4379,12 +4992,18 @@
|
|
|
4379
4992
|
"accumulate": {
|
|
4380
4993
|
"type": "enum",
|
|
4381
4994
|
"optional": true,
|
|
4382
|
-
"values": [
|
|
4995
|
+
"values": [
|
|
4996
|
+
"none",
|
|
4997
|
+
"sum"
|
|
4998
|
+
]
|
|
4383
4999
|
},
|
|
4384
5000
|
"additive": {
|
|
4385
5001
|
"type": "enum",
|
|
4386
5002
|
"optional": true,
|
|
4387
|
-
"values": [
|
|
5003
|
+
"values": [
|
|
5004
|
+
"replace",
|
|
5005
|
+
"sum"
|
|
5006
|
+
]
|
|
4388
5007
|
},
|
|
4389
5008
|
"alignmentBaseline": {
|
|
4390
5009
|
"type": "enum",
|
|
@@ -4408,7 +5027,10 @@
|
|
|
4408
5027
|
"allowReorder": {
|
|
4409
5028
|
"type": "enum",
|
|
4410
5029
|
"optional": true,
|
|
4411
|
-
"values": [
|
|
5030
|
+
"values": [
|
|
5031
|
+
"no",
|
|
5032
|
+
"yes"
|
|
5033
|
+
]
|
|
4412
5034
|
},
|
|
4413
5035
|
"alphabetic": {
|
|
4414
5036
|
"type": "number | string",
|
|
@@ -4421,7 +5043,12 @@
|
|
|
4421
5043
|
"arabicForm": {
|
|
4422
5044
|
"type": "enum",
|
|
4423
5045
|
"optional": true,
|
|
4424
|
-
"values": [
|
|
5046
|
+
"values": [
|
|
5047
|
+
"initial",
|
|
5048
|
+
"medial",
|
|
5049
|
+
"terminal",
|
|
5050
|
+
"isolated"
|
|
5051
|
+
]
|
|
4425
5052
|
},
|
|
4426
5053
|
"ascent": {
|
|
4427
5054
|
"type": "number | string",
|
|
@@ -4502,7 +5129,12 @@
|
|
|
4502
5129
|
"colorInterpolationFilters": {
|
|
4503
5130
|
"type": "enum",
|
|
4504
5131
|
"optional": true,
|
|
4505
|
-
"values": [
|
|
5132
|
+
"values": [
|
|
5133
|
+
"auto",
|
|
5134
|
+
"sRGB",
|
|
5135
|
+
"linearRGB",
|
|
5136
|
+
"inherit"
|
|
5137
|
+
]
|
|
4506
5138
|
},
|
|
4507
5139
|
"colorProfile": {
|
|
4508
5140
|
"type": "number | string",
|
|
@@ -4626,7 +5258,11 @@
|
|
|
4626
5258
|
"fillRule": {
|
|
4627
5259
|
"type": "enum",
|
|
4628
5260
|
"optional": true,
|
|
4629
|
-
"values": [
|
|
5261
|
+
"values": [
|
|
5262
|
+
"nonzero",
|
|
5263
|
+
"evenodd",
|
|
5264
|
+
"inherit"
|
|
5265
|
+
]
|
|
4630
5266
|
},
|
|
4631
5267
|
"filter": {
|
|
4632
5268
|
"type": "string",
|
|
@@ -5127,12 +5763,22 @@
|
|
|
5127
5763
|
"strokeLinecap": {
|
|
5128
5764
|
"type": "enum",
|
|
5129
5765
|
"optional": true,
|
|
5130
|
-
"values": [
|
|
5766
|
+
"values": [
|
|
5767
|
+
"butt",
|
|
5768
|
+
"round",
|
|
5769
|
+
"square",
|
|
5770
|
+
"inherit"
|
|
5771
|
+
]
|
|
5131
5772
|
},
|
|
5132
5773
|
"strokeLinejoin": {
|
|
5133
5774
|
"type": "enum",
|
|
5134
5775
|
"optional": true,
|
|
5135
|
-
"values": [
|
|
5776
|
+
"values": [
|
|
5777
|
+
"miter",
|
|
5778
|
+
"round",
|
|
5779
|
+
"bevel",
|
|
5780
|
+
"inherit"
|
|
5781
|
+
]
|
|
5136
5782
|
},
|
|
5137
5783
|
"strokeMiterlimit": {
|
|
5138
5784
|
"type": "number | string",
|
|
@@ -5169,7 +5815,12 @@
|
|
|
5169
5815
|
"textAnchor": {
|
|
5170
5816
|
"type": "enum",
|
|
5171
5817
|
"optional": true,
|
|
5172
|
-
"values": [
|
|
5818
|
+
"values": [
|
|
5819
|
+
"start",
|
|
5820
|
+
"middle",
|
|
5821
|
+
"end",
|
|
5822
|
+
"inherit"
|
|
5823
|
+
]
|
|
5173
5824
|
},
|
|
5174
5825
|
"textDecoration": {
|
|
5175
5826
|
"type": "number | string",
|
|
@@ -5383,7 +6034,10 @@
|
|
|
5383
6034
|
"type": "enum",
|
|
5384
6035
|
"optional": true,
|
|
5385
6036
|
"description": "Logo variant\n- `glyph`: Map pin icon only\n- `full`: Full logo with wordmark and decorative element",
|
|
5386
|
-
"values": [
|
|
6037
|
+
"values": [
|
|
6038
|
+
"glyph",
|
|
6039
|
+
"full"
|
|
6040
|
+
],
|
|
5387
6041
|
"descriptions": {
|
|
5388
6042
|
"glyph": "Map pin icon only (logomark)",
|
|
5389
6043
|
"full": "Full logo with icon, wordmark, and decorative element"
|
|
@@ -5391,8 +6045,24 @@
|
|
|
5391
6045
|
"default": "full"
|
|
5392
6046
|
}
|
|
5393
6047
|
},
|
|
5394
|
-
"examples": [
|
|
5395
|
-
|
|
6048
|
+
"examples": [
|
|
6049
|
+
"<SignalFlareAILogo className=\"w-72\" />",
|
|
6050
|
+
"<SignalFlareAILogo variant=\"glyph\" className=\"w-16\" />",
|
|
6051
|
+
"<div className=\"flex flex-wrap items-center gap-8\">\n <SignalFlareAILogo className=\"w-32\" color=\"brand\" />\n <SignalFlareAILogo className=\"w-32\" color=\"mono\" />\n <div className=\"rounded-lg bg-white p-4\">\n <SignalFlareAILogo className=\"w-32\" color=\"black\" />\n </div>\n <div className=\"rounded-lg bg-black p-4\">\n <SignalFlareAILogo className=\"w-32\" color=\"white\" />\n </div>\n </div>",
|
|
6052
|
+
"<div className=\"flex flex-wrap items-center gap-8\">\n <SignalFlareAILogo variant=\"glyph\" className=\"w-10\" color=\"brand\" />\n <SignalFlareAILogo variant=\"glyph\" className=\"w-10\" color=\"mono\" />\n <div className=\"rounded-lg bg-white p-4\">\n <SignalFlareAILogo variant=\"glyph\" className=\"w-10\" color=\"black\" />\n </div>\n <div className=\"rounded-lg bg-black p-4\">\n <SignalFlareAILogo variant=\"glyph\" className=\"w-10\" color=\"white\" />\n </div>\n </div>",
|
|
6053
|
+
"<div className=\"flex flex-wrap items-end gap-6\">\n <SignalFlareAILogo className=\"w-24\" />\n <SignalFlareAILogo className=\"w-36\" />\n <SignalFlareAILogo className=\"w-52\" />\n </div>",
|
|
6054
|
+
"<div className=\"flex items-center gap-4\">\n <DropdownMenu>\n <DropdownMenu.Trigger>\n <button\n type=\"button\"\n className=\"flex items-center gap-2 rounded-lg bg-[#4188ff] px-4 py-3 text-white transition-opacity hover:opacity-80\"\n >\n <SignalFlareAILogo variant=\"glyph\" color=\"white\" className=\"w-6\" />\n <span className=\"font-medium\">Logo</span>\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content>\n <DropdownMenu.Item\n icon={MapPinIcon}\n onSelect={() =>\n copyToClipboard(\n generateSignalFlareAILogoSvg({ variant: \"glyph\" }),\n \"glyph\"\n )\n }\n >\n {copied === \"glyph\" ? \"Copied!\" : \"Copy icon as SVG\"}\n </DropdownMenu.Item>\n <DropdownMenu.Item\n icon={CodeIcon}\n onSelect={() =>\n copyToClipboard(\n generateSignalFlareAILogoSvg({ variant: \"full\" }),\n \"full\"\n )\n }\n >\n {copied === \"full\" ? \"Copied!\" : \"Copy full logo as SVG\"}\n </DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n icon={ArrowSquareOutIcon}\n onSelect={() =>\n window.open(\"https://signalflare.ai\", \"_blank\", \"noopener\")\n }\n >\n Visit SignalFlare AI\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n\n <span className=\"text-sm text-sf-subtle\">\n Click to open the brand assets menu\n </span>\n </div>",
|
|
6055
|
+
"<PoweredBySignalFlareAI />",
|
|
6056
|
+
"<div className=\"flex flex-wrap items-center gap-4\">\n <PoweredBySignalFlareAI color=\"brand\" />\n <PoweredBySignalFlareAI color=\"mono\" />\n <PoweredBySignalFlareAI color=\"black\" />\n <div className=\"rounded-lg bg-black p-3\">\n <PoweredBySignalFlareAI color=\"white\" />\n </div>\n </div>",
|
|
6057
|
+
"<footer className=\"flex w-full items-center justify-between rounded-lg border border-sf-line bg-sf-elevated px-6 py-4\">\n <span className=\"text-sm text-sf-subtle\">\n © 2026 Your Company. All rights reserved.\n </span>\n <PoweredBySignalFlareAI />\n </footer>",
|
|
6058
|
+
"<PoweredByNavigator />",
|
|
6059
|
+
"<div className=\"flex flex-wrap items-center gap-4\">\n <PoweredByNavigator color=\"brand\" />\n <PoweredByNavigator color=\"mono\" />\n <PoweredByNavigator color=\"black\" />\n <div className=\"rounded-lg bg-black p-3\">\n <PoweredByNavigator color=\"white\" />\n </div>\n </div>"
|
|
6060
|
+
],
|
|
6061
|
+
"colors": [
|
|
6062
|
+
"bg-sf-base",
|
|
6063
|
+
"ring-sf-line",
|
|
6064
|
+
"text-sf-default"
|
|
6065
|
+
]
|
|
5396
6066
|
},
|
|
5397
6067
|
"Sparkline": {
|
|
5398
6068
|
"name": "Sparkline",
|
|
@@ -5410,13 +6080,17 @@
|
|
|
5410
6080
|
"description": "Child elements"
|
|
5411
6081
|
}
|
|
5412
6082
|
},
|
|
5413
|
-
"examples": [
|
|
6083
|
+
"examples": [
|
|
6084
|
+
"<Sparkline echarts={echarts} data={sample} isDarkMode={isDarkMode} />",
|
|
6085
|
+
"<Sparkline\n echarts={echarts}\n data={sample}\n variant=\"area\"\n isDarkMode={isDarkMode}\n />",
|
|
6086
|
+
"<Sparkline\n echarts={echarts}\n data={sample}\n variant=\"bars\"\n isDarkMode={isDarkMode}\n />"
|
|
6087
|
+
],
|
|
5414
6088
|
"colors": []
|
|
5415
6089
|
},
|
|
5416
6090
|
"StatCard": {
|
|
5417
6091
|
"name": "StatCard",
|
|
5418
6092
|
"type": "component",
|
|
5419
|
-
"description": "StatCard — compact KPI tile displaying a label, a primary value, and an optional delta + trend sparkline.",
|
|
6093
|
+
"description": "StatCard — compact KPI tile displaying a label, a primary value, and an optional delta + trend sparkline. Uses pretext-driven `Text` for consistent spacing and wrapping: - Labels use `wrap=\"balance\"` for even multiline breaks - Values use `wrap=\"shrink\"` so sparklines tuck tight against numbers - Hints use `wrap=\"natural\"` (numeric content rarely wraps)",
|
|
5420
6094
|
"importPath": "@signalflare-ai/ui",
|
|
5421
6095
|
"category": "Other",
|
|
5422
6096
|
"props": {
|
|
@@ -5424,7 +6098,10 @@
|
|
|
5424
6098
|
"type": "enum",
|
|
5425
6099
|
"optional": true,
|
|
5426
6100
|
"description": "Size of the card. Defaults to `\"base\"`.",
|
|
5427
|
-
"values": [
|
|
6101
|
+
"values": [
|
|
6102
|
+
"sm",
|
|
6103
|
+
"base"
|
|
6104
|
+
],
|
|
5428
6105
|
"default": "base"
|
|
5429
6106
|
},
|
|
5430
6107
|
"label": {
|
|
@@ -5463,7 +6140,12 @@
|
|
|
5463
6140
|
"description": "Additional CSS classes merged via `cn()`."
|
|
5464
6141
|
}
|
|
5465
6142
|
},
|
|
5466
|
-
"examples": [
|
|
6143
|
+
"examples": [
|
|
6144
|
+
"<StatCard\n label=\"Active users\"\n value=\"12,384\"\n delta={{ value: 0.12, label: \"vs last week\" }}\n />",
|
|
6145
|
+
"<StatCard\n label=\"Error rate\"\n value=\"2.1%\"\n delta={{ value: -0.08, label: \"vs last week\", positiveDirection: \"down\" }}\n />",
|
|
6146
|
+
"<StatCard size=\"sm\" label=\"MRR\" value=\"$128,420\" hint=\"30-day avg\" />",
|
|
6147
|
+
"<StatCard label=\"Signups\" value=\"—\" loading />"
|
|
6148
|
+
],
|
|
5467
6149
|
"colors": [
|
|
5468
6150
|
"bg-sf-elevated",
|
|
5469
6151
|
"bg-sf-fill",
|
|
@@ -5497,8 +6179,15 @@
|
|
|
5497
6179
|
"description": "Content rendered inside the surface."
|
|
5498
6180
|
}
|
|
5499
6181
|
},
|
|
5500
|
-
"examples": [
|
|
5501
|
-
|
|
6182
|
+
"examples": [
|
|
6183
|
+
"<Surface className=\"rounded-lg p-6\">\n <Text size=\"lg\" bold>\n Surface Component\n </Text>\n <div className=\"mt-2\">\n <Text variant=\"secondary\">\n A container with consistent elevation and border styling.\n </Text>\n </div>\n </Surface>",
|
|
6184
|
+
"<div className=\"flex flex-col gap-4\">\n <Surface as=\"section\" className=\"rounded-lg p-4\">\n <Text bold>As section element</Text>\n </Surface>\n <Surface as=\"article\" className=\"rounded-lg p-4\">\n <Text bold>As article element</Text>\n </Surface>\n <Surface as=\"aside\" className=\"rounded-lg p-4\">\n <Text bold>As aside element</Text>\n </Surface>\n </div>",
|
|
6185
|
+
"<Surface className=\"rounded-lg p-6\">\n <Text bold>Outer Surface</Text>\n <Surface className=\"mt-4 rounded-md bg-sf-elevated p-4\">\n <Text variant=\"secondary\">Nested Surface</Text>\n </Surface>\n </Surface>"
|
|
6186
|
+
],
|
|
6187
|
+
"colors": [
|
|
6188
|
+
"bg-sf-base",
|
|
6189
|
+
"ring-sf-line"
|
|
6190
|
+
]
|
|
5502
6191
|
},
|
|
5503
6192
|
"Switch": {
|
|
5504
6193
|
"name": "Switch",
|
|
@@ -5511,7 +6200,10 @@
|
|
|
5511
6200
|
"type": "enum",
|
|
5512
6201
|
"optional": true,
|
|
5513
6202
|
"description": "Visual variant: \"default\" or \"error\" for validation failures (visual only, no error text)",
|
|
5514
|
-
"values": [
|
|
6203
|
+
"values": [
|
|
6204
|
+
"default",
|
|
6205
|
+
"error"
|
|
6206
|
+
],
|
|
5515
6207
|
"descriptions": {
|
|
5516
6208
|
"default": "Default switch appearance",
|
|
5517
6209
|
"error": "Error state for validation failures"
|
|
@@ -5544,7 +6236,11 @@
|
|
|
5544
6236
|
"size": {
|
|
5545
6237
|
"type": "enum",
|
|
5546
6238
|
"optional": true,
|
|
5547
|
-
"values": [
|
|
6239
|
+
"values": [
|
|
6240
|
+
"sm",
|
|
6241
|
+
"base",
|
|
6242
|
+
"lg"
|
|
6243
|
+
],
|
|
5548
6244
|
"descriptions": {
|
|
5549
6245
|
"sm": "Small switch for compact UIs",
|
|
5550
6246
|
"base": "Default switch size",
|
|
@@ -5576,7 +6272,11 @@
|
|
|
5576
6272
|
"type": {
|
|
5577
6273
|
"type": "enum",
|
|
5578
6274
|
"optional": true,
|
|
5579
|
-
"values": [
|
|
6275
|
+
"values": [
|
|
6276
|
+
"submit",
|
|
6277
|
+
"reset",
|
|
6278
|
+
"button"
|
|
6279
|
+
]
|
|
5580
6280
|
},
|
|
5581
6281
|
"value": {
|
|
5582
6282
|
"type": "string | string[] | number",
|
|
@@ -5604,7 +6304,12 @@
|
|
|
5604
6304
|
"description": "Callback when switch is clicked"
|
|
5605
6305
|
}
|
|
5606
6306
|
},
|
|
5607
|
-
"examples": [
|
|
6307
|
+
"examples": [
|
|
6308
|
+
"<Switch label=\"Switch\" checked={checked} onCheckedChange={setChecked} />",
|
|
6309
|
+
"<Switch label=\"Switch\" checked={false} onCheckedChange={() => {}} />",
|
|
6310
|
+
"<Switch label=\"Switch\" checked={true} onCheckedChange={() => {}} />",
|
|
6311
|
+
"<Switch label=\"Disabled\" checked={false} disabled />"
|
|
6312
|
+
],
|
|
5608
6313
|
"colors": [
|
|
5609
6314
|
"bg-sf-brand",
|
|
5610
6315
|
"bg-sf-brand-hover",
|
|
@@ -5668,7 +6373,10 @@
|
|
|
5668
6373
|
"props": {
|
|
5669
6374
|
"layout": {
|
|
5670
6375
|
"type": "enum",
|
|
5671
|
-
"values": [
|
|
6376
|
+
"values": [
|
|
6377
|
+
"auto",
|
|
6378
|
+
"fixed"
|
|
6379
|
+
],
|
|
5672
6380
|
"default": "auto",
|
|
5673
6381
|
"descriptions": {
|
|
5674
6382
|
"auto": "Auto table layout - columns resize based on content",
|
|
@@ -5677,7 +6385,10 @@
|
|
|
5677
6385
|
},
|
|
5678
6386
|
"variant": {
|
|
5679
6387
|
"type": "enum",
|
|
5680
|
-
"values": [
|
|
6388
|
+
"values": [
|
|
6389
|
+
"default",
|
|
6390
|
+
"selected"
|
|
6391
|
+
],
|
|
5681
6392
|
"default": "default",
|
|
5682
6393
|
"descriptions": {
|
|
5683
6394
|
"default": "Default row variant",
|
|
@@ -5693,7 +6404,13 @@
|
|
|
5693
6404
|
"description": "Child elements"
|
|
5694
6405
|
}
|
|
5695
6406
|
},
|
|
5696
|
-
"examples": [
|
|
6407
|
+
"examples": [
|
|
6408
|
+
"<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table>\n <Table.Header>\n <Table.Row>\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.slice(0, 3).map((row) => (\n <Table.Row key={row.id}>\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
|
|
6409
|
+
"<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table>\n <Table.Header>\n <Table.Row>\n <Table.CheckHead\n checked={selectedIds.size === rows.length}\n indeterminate={\n selectedIds.size > 0 && selectedIds.size < rows.length\n }\n onValueChange={toggleAll}\n aria-label=\"Select all rows\"\n />\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {rows.map((row) => (\n <Table.Row key={row.id}>\n <Table.CheckCell\n checked={selectedIds.has(row.id)}\n onValueChange={() => toggleRow(row.id)}\n aria-label={`Select ${row.subject}`}\n />\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
|
|
6410
|
+
"<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table>\n <Table.Header>\n <Table.Row>\n <Table.CheckHead\n checked={selectedIds.size === rows.length}\n indeterminate={\n selectedIds.size > 0 && selectedIds.size < rows.length\n }\n onValueChange={toggleAll}\n aria-label=\"Select all rows\"\n />\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {rows.map((row) => (\n <Table.Row\n key={row.id}\n variant={selectedIds.has(row.id) ? \"selected\" : \"default\"}\n >\n <Table.CheckCell\n checked={selectedIds.has(row.id)}\n onValueChange={() => toggleRow(row.id)}\n aria-label={`Select ${row.subject}`}\n />\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
|
|
6411
|
+
"<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table layout=\"fixed\">\n <colgroup>\n <col />\n <col className=\"w-[150px]\" />\n <col className=\"w-[150px]\" />\n </colgroup>\n <Table.Header>\n <Table.Row>\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.map((row) => (\n <Table.Row key={row.id}>\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
|
|
6412
|
+
"<LayerCard>\n <LayerCard.Primary className=\"w-full overflow-x-auto p-0\">\n <Table layout=\"fixed\">\n <colgroup>\n <col />{\" \"}\n {/* Checkbox column - width handled by Table.CheckHead/CheckCell */}\n <col />\n <col style={{ width: \"150px\" }} />\n <col style={{ width: \"120px\" }} />\n <col style={{ width: \"50px\" }} />\n </colgroup>\n <Table.Header>\n <Table.Row>\n <Table.CheckHead\n checked={selectedIds.size === emailData.length}\n indeterminate={\n selectedIds.size > 0 && selectedIds.size < emailData.length\n }\n onValueChange={toggleAll}\n aria-label=\"Select all rows\"\n />\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n <Table.Head />\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.map((row) => (\n <Table.Row\n key={row.id}\n variant={selectedIds.has(row.id) ? \"selected\" : \"default\"}\n >\n <Table.CheckCell\n checked={selectedIds.has(row.id)}\n onValueChange={() => toggleRow(row.id)}\n aria-label={`Select ${row.subject}`}\n />\n <Table.Cell>\n <div className=\"flex items-center gap-2\">\n <EnvelopeSimpleIcon size={16} />\n <span className=\"truncate\">{row.subject}</span>\n {row.tags && (\n <div className=\"ml-2 inline-flex gap-1\">\n {row.tags.map((tag) => (\n <Badge key={tag}>{tag}</Badge>\n ))}\n </div>\n )}\n </div>\n </Table.Cell>\n <Table.Cell>\n <span className=\"truncate\">{row.from}</span>\n </Table.Cell>\n <Table.Cell>\n <span className=\"truncate\">{row.date}</span>\n </Table.Cell>\n <Table.Cell className=\"text-right\">\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n shape=\"square\"\n aria-label=\"More options\"\n >\n <DotsThreeIcon weight=\"bold\" size={16} />\n </Button>\n }\n />\n <DropdownMenu.Content>\n <DropdownMenu.Item icon={EyeIcon}>View</DropdownMenu.Item>\n <DropdownMenu.Item icon={PencilSimpleIcon}>\n Edit\n </DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item icon={TrashIcon} variant=\"danger\">\n Delete\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>"
|
|
6413
|
+
],
|
|
5697
6414
|
"colors": [
|
|
5698
6415
|
"bg-sf-base",
|
|
5699
6416
|
"bg-sf-ring",
|
|
@@ -5795,7 +6512,11 @@
|
|
|
5795
6512
|
"type": "enum",
|
|
5796
6513
|
"optional": true,
|
|
5797
6514
|
"description": "Tab style.\n- `\"segmented\"` — Pill-shaped indicator on a filled track\n- `\"underline\"` — Underline indicator below tab text\n- `\"pill\"` — Fully rounded tabs, only selected has background",
|
|
5798
|
-
"values": [
|
|
6515
|
+
"values": [
|
|
6516
|
+
"segmented",
|
|
6517
|
+
"underline",
|
|
6518
|
+
"pill"
|
|
6519
|
+
],
|
|
5799
6520
|
"default": "segmented"
|
|
5800
6521
|
},
|
|
5801
6522
|
"onValueChange": {
|
|
@@ -5803,7 +6524,15 @@
|
|
|
5803
6524
|
"description": "Callback when active tab changes"
|
|
5804
6525
|
}
|
|
5805
6526
|
},
|
|
5806
|
-
"examples": [
|
|
6527
|
+
"examples": [
|
|
6528
|
+
"<div className=\"flex flex-col gap-6\">\n <div>\n <p className=\"mb-2 text-sm text-sf-subtle\">Segmented (default)</p>\n <Tabs\n variant=\"segmented\"\n tabs={[\n { label: \"Tab 1\", value: \"tab1\" },\n { label: \"Tab 2\", value: \"tab2\" },\n { label: \"Tab 3\", value: \"tab3\" },\n ]}\n selectedValue=\"tab1\"\n />\n </div>\n <div>\n <p className=\"mb-2 text-sm text-sf-subtle\">Underline</p>\n <Tabs\n variant=\"underline\"\n tabs={[\n { label: \"Tab 1\", value: \"tab1\" },\n { label: \"Tab 2\", value: \"tab2\" },\n { label: \"Tab 3\", value: \"tab3\" },\n ]}\n selectedValue=\"tab1\"\n />\n </div>\n <div>\n <p className=\"mb-2 text-sm text-sf-subtle\">Pill</p>\n <Tabs\n variant=\"pill\"\n tabs={[\n { label: \"Tab 1\", value: \"tab1\" },\n { label: \"Tab 2\", value: \"tab2\" },\n { label: \"Tab 3\", value: \"tab3\" },\n ]}\n selectedValue=\"tab1\"\n />\n </div>\n </div>",
|
|
6529
|
+
"<Tabs\n variant=\"segmented\"\n tabs={[\n { label: \"Tab 1\", value: \"tab1\" },\n { label: \"Tab 2\", value: \"tab2\" },\n { label: \"Tab 3\", value: \"tab3\" },\n ]}\n selectedValue=\"tab1\"\n />",
|
|
6530
|
+
"<Tabs\n variant=\"underline\"\n tabs={[\n { label: \"Tab 1\", value: \"tab1\" },\n { label: \"Tab 2\", value: \"tab2\" },\n { label: \"Tab 3\", value: \"tab3\" },\n ]}\n selectedValue=\"tab1\"\n />",
|
|
6531
|
+
"<div className=\"space-y-4\">\n <Tabs\n tabs={[\n { label: \"Tab 1\", value: \"tab1\" },\n { label: \"Tab 2\", value: \"tab2\" },\n { label: \"Tab 3\", value: \"tab3\" },\n ]}\n value={activeTab}\n onValueChange={setActiveTab}\n />\n <p className=\"text-sm text-sf-subtle\">\n Active tab: <code className=\"text-sm\">{activeTab}</code>\n </p>\n </div>",
|
|
6532
|
+
"<Tabs\n tabs={[\n { label: \"Overview\", value: \"overview\" },\n { label: \"Analytics\", value: \"analytics\" },\n { label: \"Reports\", value: \"reports\" },\n { label: \"Notifications\", value: \"notifications\" },\n { label: \"Settings\", value: \"settings\" },\n { label: \"Billing\", value: \"billing\" },\n ]}\n selectedValue=\"overview\"\n />",
|
|
6533
|
+
"<Tabs\n tabs={[\n {\n label: \"Regular Tab\",\n value: \"tab1\",\n },\n {\n label: \"Link Tab\",\n render: (props) => <a {...props} href=\"#tab2\" />,\n value: \"tab2\",\n },\n {\n label: \"Another Link\",\n render: (props) => <a {...props} href=\"#tab3\" />,\n value: \"tab3\",\n },\n ]}\n selectedValue=\"tab1\"\n />",
|
|
6534
|
+
"<Tabs\n variant=\"pill\"\n tabs={[\n { label: \"Overview\", value: \"overview\" },\n { label: \"Analytics\", value: \"analytics\" },\n { label: \"Reports\", value: \"reports\" },\n ]}\n selectedValue=\"overview\"\n />"
|
|
6535
|
+
],
|
|
5807
6536
|
"colors": [
|
|
5808
6537
|
"bg-sf-brand",
|
|
5809
6538
|
"bg-sf-overlay",
|
|
@@ -5890,7 +6619,12 @@
|
|
|
5890
6619
|
"type": "enum",
|
|
5891
6620
|
"optional": true,
|
|
5892
6621
|
"description": "Text size (only applies to body/secondary/success/error variants).\n- `\"xs\"` — 12px\n- `\"sm\"` — 14px\n- `\"base\"` — 16px\n- `\"lg\"` — 18px",
|
|
5893
|
-
"values": [
|
|
6622
|
+
"values": [
|
|
6623
|
+
"xs",
|
|
6624
|
+
"sm",
|
|
6625
|
+
"base",
|
|
6626
|
+
"lg"
|
|
6627
|
+
],
|
|
5894
6628
|
"descriptions": {
|
|
5895
6629
|
"xs": "Extra small text",
|
|
5896
6630
|
"sm": "Small text",
|
|
@@ -5919,9 +6653,21 @@
|
|
|
5919
6653
|
"type": "ReactNode",
|
|
5920
6654
|
"optional": true,
|
|
5921
6655
|
"description": "Text content."
|
|
6656
|
+
},
|
|
6657
|
+
"wrap": {
|
|
6658
|
+
"type": "MeasuredTextMode | boolean",
|
|
6659
|
+
"optional": true,
|
|
6660
|
+
"description": "Text layout strategy using pretext-driven measurement.\n- `\"natural\"` — No measurement, normal browser wrapping (default for body).\n- `\"balance\"` — Even wrapping, smallest maxWidth without adding lines (default for headings).\n- `\"shrink\"` — Hug widest natural line (maxWidth = line width). Good for chat bubbles.\n- `\"reserve\"` — Reserve height based on line count. Good for streaming text."
|
|
6661
|
+
},
|
|
6662
|
+
"reserveLines": {
|
|
6663
|
+
"type": "number",
|
|
6664
|
+
"optional": true,
|
|
6665
|
+
"description": "For `wrap=\"reserve\"`: reserve this many lines of height. If omitted, measures current content to determine line count."
|
|
5922
6666
|
}
|
|
5923
6667
|
},
|
|
5924
|
-
"examples": [
|
|
6668
|
+
"examples": [
|
|
6669
|
+
"<div className=\"grid w-full grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"heading1\">Heading 1</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-3xl (30px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"heading2\">Heading 2</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-2xl (24px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"heading3\">Heading 3</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-lg (16px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text>Body</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text bold>Body bold</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text size=\"lg\">Body lg</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-lg (16px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text size=\"sm\">Body sm</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-sm (13px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text size=\"xs\">Body xs</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-xs (12px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"secondary\">Body secondary</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"mono\">Monospace</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-sm (13px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"mono\" size=\"lg\">\n Monospace lg\n </Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"mono-secondary\">Monospace secondary</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-sm (13px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"success\">Success</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-sf-line bg-sf-base p-4\">\n <Text variant=\"error\">Error</Text>\n <p className=\"font-mono text-xs text-sf-subtle\">text-base (14px)</p>\n </div>\n </div>"
|
|
6670
|
+
],
|
|
5925
6671
|
"colors": [
|
|
5926
6672
|
"text-sf-danger",
|
|
5927
6673
|
"text-sf-default",
|
|
@@ -6017,7 +6763,11 @@
|
|
|
6017
6763
|
"type": "enum",
|
|
6018
6764
|
"optional": true,
|
|
6019
6765
|
"description": "Controlled mode. When provided the component acts as a controlled input — pair with `onModeChange`.",
|
|
6020
|
-
"values": [
|
|
6766
|
+
"values": [
|
|
6767
|
+
"light",
|
|
6768
|
+
"dark",
|
|
6769
|
+
"system"
|
|
6770
|
+
],
|
|
6021
6771
|
"descriptions": {
|
|
6022
6772
|
"light": "Light mode",
|
|
6023
6773
|
"dark": "Dark mode",
|
|
@@ -6037,7 +6787,10 @@
|
|
|
6037
6787
|
}
|
|
6038
6788
|
},
|
|
6039
6789
|
"examples": [],
|
|
6040
|
-
"colors": [
|
|
6790
|
+
"colors": [
|
|
6791
|
+
"text-sf-default",
|
|
6792
|
+
"text-sf-subtle"
|
|
6793
|
+
]
|
|
6041
6794
|
},
|
|
6042
6795
|
"Toasty": {
|
|
6043
6796
|
"name": "Toasty",
|
|
@@ -6048,7 +6801,11 @@
|
|
|
6048
6801
|
"props": {
|
|
6049
6802
|
"variant": {
|
|
6050
6803
|
"type": "enum",
|
|
6051
|
-
"values": [
|
|
6804
|
+
"values": [
|
|
6805
|
+
"default",
|
|
6806
|
+
"error",
|
|
6807
|
+
"warning"
|
|
6808
|
+
],
|
|
6052
6809
|
"default": "default",
|
|
6053
6810
|
"descriptions": {
|
|
6054
6811
|
"default": "Default toast style",
|
|
@@ -6115,7 +6872,12 @@
|
|
|
6115
6872
|
"props": {
|
|
6116
6873
|
"side": {
|
|
6117
6874
|
"type": "enum",
|
|
6118
|
-
"values": [
|
|
6875
|
+
"values": [
|
|
6876
|
+
"top",
|
|
6877
|
+
"bottom",
|
|
6878
|
+
"left",
|
|
6879
|
+
"right"
|
|
6880
|
+
],
|
|
6119
6881
|
"default": "top",
|
|
6120
6882
|
"descriptions": {
|
|
6121
6883
|
"top": "Tooltip appears above the trigger",
|
|
@@ -6138,7 +6900,11 @@
|
|
|
6138
6900
|
"description": "Content to display in the tooltip"
|
|
6139
6901
|
}
|
|
6140
6902
|
},
|
|
6141
|
-
"examples": [
|
|
6903
|
+
"examples": [
|
|
6904
|
+
"<TooltipProvider>\n <Tooltip content=\"Add new item\">\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add new item\" />\n </Tooltip>\n </TooltipProvider>",
|
|
6905
|
+
"<TooltipProvider>\n <Tooltip content=\"Add\">\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add\" />\n </Tooltip>\n </TooltipProvider>",
|
|
6906
|
+
"<TooltipProvider>\n <div className=\"flex gap-2\">\n <Tooltip content=\"Add\">\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add\" />\n </Tooltip>\n <Tooltip content=\"Change language\">\n <Button\n shape=\"square\"\n icon={TranslateIcon}\n aria-label=\"Change language\"\n />\n </Tooltip>\n </div>\n </TooltipProvider>"
|
|
6907
|
+
],
|
|
6142
6908
|
"colors": [
|
|
6143
6909
|
"bg-sf-elevated",
|
|
6144
6910
|
"fill-sf-elevated",
|
|
@@ -6221,7 +6987,11 @@
|
|
|
6221
6987
|
"type": "enum",
|
|
6222
6988
|
"optional": true,
|
|
6223
6989
|
"description": "Placement for interactive HITL elements (approvals, questions, plans).",
|
|
6224
|
-
"values": [
|
|
6990
|
+
"values": [
|
|
6991
|
+
"inline",
|
|
6992
|
+
"back-layer",
|
|
6993
|
+
"both"
|
|
6994
|
+
],
|
|
6225
6995
|
"descriptions": {
|
|
6226
6996
|
"inline": "Render approval/question cards inline in the conversation stream",
|
|
6227
6997
|
"back-layer": "Render approval/question cards in the PromptInput back layer",
|
|
@@ -6298,16 +7068,25 @@
|
|
|
6298
7068
|
"type": "enum",
|
|
6299
7069
|
"optional": true,
|
|
6300
7070
|
"description": "Rendering style for the mode picker.\n- `\"select\"` (default): compact dropdown\n- `\"cycle\"`: single click-to-cycle button",
|
|
6301
|
-
"values": [
|
|
7071
|
+
"values": [
|
|
7072
|
+
"select",
|
|
7073
|
+
"cycle"
|
|
7074
|
+
]
|
|
6302
7075
|
},
|
|
6303
7076
|
"modelVariant": {
|
|
6304
7077
|
"type": "enum",
|
|
6305
7078
|
"optional": true,
|
|
6306
7079
|
"description": "Rendering style for the model picker.\n- `\"select\"` (default): compact dropdown\n- `\"cycle\"`: single click-to-cycle button",
|
|
6307
|
-
"values": [
|
|
7080
|
+
"values": [
|
|
7081
|
+
"select",
|
|
7082
|
+
"cycle"
|
|
7083
|
+
]
|
|
6308
7084
|
}
|
|
6309
7085
|
},
|
|
6310
|
-
"examples": [
|
|
7086
|
+
"examples": [
|
|
7087
|
+
"<div className=\"flex flex-col gap-3 w-full\">\n {/* Controls */}\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs font-medium text-sf-subtle\">Scenario:</span>\n {([\"full\", \"question\", \"plan\"] as Scenario[]).map((s) => (\n <button\n key={s}\n type=\"button\"\n onClick={() => handleScenario(s)}\n className={[\n \"rounded-full px-2.5 py-1 text-xs font-medium transition-colors border\",\n scenario === s\n ? \"bg-sf-brand text-white border-sf-brand\"\n : \"border-sf-line bg-sf-elevated text-sf-strong hover:bg-sf-tint\",\n ].join(\" \")}\n >\n {SCENARIO_LABELS[s]}\n </button>\n ))}\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs font-medium text-sf-subtle\">HITL:</span>\n {([\"inline\", \"back-layer\"] as Placement[]).map((p) => (\n <button\n key={p}\n type=\"button\"\n onClick={() => handlePlacement(p)}\n className={[\n \"rounded-full px-2.5 py-1 text-xs font-medium transition-colors border\",\n placement === p\n ? \"bg-sf-brand text-white border-sf-brand\"\n : \"border-sf-line bg-sf-elevated text-sf-strong hover:bg-sf-tint\",\n ].join(\" \")}\n >\n {PLACEMENT_LABELS[p]}\n </button>\n ))}\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs font-medium text-sf-subtle\">Activity:</span>\n {(\n [\n { value: false, label: \"Stacked\" },\n { value: true, label: \"Grouped\" },\n ] as const\n ).map((opt) => (\n <button\n key={opt.label}\n type=\"button\"\n onClick={() => handleGroupActivity(opt.value)}\n className={[\n \"rounded-full px-2.5 py-1 text-xs font-medium transition-colors border\",\n groupActivity === opt.value\n ? \"bg-sf-brand text-white border-sf-brand\"\n : \"border-sf-line bg-sf-elevated text-sf-strong hover:bg-sf-tint\",\n ].join(\" \")}\n >\n {opt.label}\n </button>\n ))}\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs font-medium text-sf-subtle\">Pickers:</span>\n {([\"select\", \"cycle\"] as const).map((v) => (\n <button\n key={v}\n type=\"button\"\n onClick={() => setPickerVariant(v)}\n className={[\n \"rounded-full px-2.5 py-1 text-xs font-medium transition-colors border\",\n pickerVariant === v\n ? \"bg-sf-brand text-white border-sf-brand\"\n : \"border-sf-line bg-sf-elevated text-sf-strong hover:bg-sf-tint\",\n ].join(\" \")}\n >\n {v === \"select\" ? \"Dropdown\" : \"Cycle\"}\n </button>\n ))}\n </div>\n </div>\n\n {/* The block — key forces remount + clean state on every scenario/placement change */}\n <div style={{ height: 560 }}>\n <AgentHarness\n key={runKey}\n adapter={adapter}\n hitlPlacement={placement}\n groupActivity={groupActivity}\n showUsage\n showTaskList\n availableModes={[\n { modeId: \"build\", modeName: \"Build\" },\n { modeId: \"plan\", modeName: \"Plan\" },\n { modeId: \"research\", modeName: \"Research\" },\n ]}\n availableModels={[\n { value: \"anthropic/claude-sonnet-4\", label: \"Claude Sonnet 4\" },\n { value: \"anthropic/claude-opus-4\", label: \"Claude Opus 4\" },\n { value: \"openai/gpt-4o\", label: \"GPT-4o\" },\n ]}\n modeVariant={pickerVariant}\n modelVariant={pickerVariant}\n placeholder=\"Type a message…\"\n suggestions={[\n \"Refactor the auth module\",\n \"Explain the JWT flow\",\n \"Add refresh token rotation\",\n ]}\n footer=\"AI can make mistakes. Review changes before applying.\"\n />\n </div>\n </div>",
|
|
7088
|
+
"<div style={{ height: 400 }}>\n <AgentHarness\n adapter={adapter}\n hitlPlacement=\"inline\"\n showUsage={false}\n showTaskList={false}\n placeholder=\"Send a message…\"\n emptyState={\n <div className=\"flex flex-col items-center gap-2\">\n <span className=\"text-3xl\">🤖</span>\n <p className=\"text-sm text-sf-subtle\">Ready when you are.</p>\n </div>\n }\n />\n </div>"
|
|
7089
|
+
],
|
|
6311
7090
|
"colors": [
|
|
6312
7091
|
"bg-sf-base",
|
|
6313
7092
|
"bg-sf-elevated",
|
|
@@ -6370,7 +7149,11 @@
|
|
|
6370
7149
|
"type": "enum",
|
|
6371
7150
|
"optional": true,
|
|
6372
7151
|
"description": "Layout variant.",
|
|
6373
|
-
"values": [
|
|
7152
|
+
"values": [
|
|
7153
|
+
"timeline-cards",
|
|
7154
|
+
"timeline-only",
|
|
7155
|
+
"cards-only"
|
|
7156
|
+
],
|
|
6374
7157
|
"descriptions": {
|
|
6375
7158
|
"timeline-cards": "Mission header + timeline + agent card grid",
|
|
6376
7159
|
"timeline-only": "Mission header + timeline, no agent cards grid",
|
|
@@ -6399,9 +7182,20 @@
|
|
|
6399
7182
|
"description": "Empty state shown when no agents have run yet."
|
|
6400
7183
|
}
|
|
6401
7184
|
},
|
|
6402
|
-
"examples": [
|
|
6403
|
-
"
|
|
6404
|
-
|
|
7185
|
+
"examples": [
|
|
7186
|
+
"<div className=\"flex flex-col gap-3 w-full\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-sf-subtle\">\n Simulated multi-agent mission\n </span>\n <button\n type=\"button\"\n onClick={replay}\n className=\"rounded-full border border-sf-line bg-sf-elevated px-2.5 py-1 text-xs text-sf-strong hover:bg-sf-tint transition-colors\"\n >\n ↺ Replay\n </button>\n </div>\n <div style={{ height: 520 }}>\n <Commander\n key={runKey}\n adapter={adapter}\n title=\"Refactor auth module\"\n pixelsPerSecond={20}\n layout=\"timeline-cards\"\n />\n </div>\n </div>",
|
|
7187
|
+
"<div style={{ height: 300 }}>\n <Commander\n adapter={adapter}\n title=\"Refactor auth module\"\n pixelsPerSecond={20}\n layout=\"timeline-only\"\n />\n </div>",
|
|
7188
|
+
"<div style={{ height: 280 }}>\n <Commander\n adapter={adapter}\n title=\"Refactor auth module\"\n pixelsPerSecond={20}\n layout=\"cards-only\"\n />\n </div>"
|
|
7189
|
+
],
|
|
7190
|
+
"colors": [
|
|
7191
|
+
"bg-sf-base",
|
|
7192
|
+
"border-sf-line",
|
|
7193
|
+
"text-sf-subtle"
|
|
7194
|
+
],
|
|
7195
|
+
"files": [
|
|
7196
|
+
"commander/commander.tsx",
|
|
7197
|
+
"commander/commander.stories.tsx"
|
|
7198
|
+
],
|
|
6405
7199
|
"dependencies": []
|
|
6406
7200
|
},
|
|
6407
7201
|
"DashboardGrid": {
|
|
@@ -6434,7 +7228,9 @@
|
|
|
6434
7228
|
"optional": true
|
|
6435
7229
|
}
|
|
6436
7230
|
},
|
|
6437
|
-
"examples": [
|
|
7231
|
+
"examples": [
|
|
7232
|
+
"<DashboardGrid>\n <DashboardGrid.Cell span={3}>\n <StatCard\n label=\"Active users\"\n value=\"12,384\"\n delta={{ value: 0.12, label: \"vs last week\" }}\n />\n </DashboardGrid.Cell>\n <DashboardGrid.Cell span={3}>\n <StatCard\n label=\"MRR\"\n value=\"$128,420\"\n delta={{ value: 0.04, label: \"vs last month\" }}\n />\n </DashboardGrid.Cell>\n <DashboardGrid.Cell span={3}>\n <StatCard\n label=\"Error rate\"\n value=\"2.1%\"\n delta={{\n value: -0.08,\n label: \"vs last week\",\n positiveDirection: \"down\",\n }}\n />\n </DashboardGrid.Cell>\n <DashboardGrid.Cell span={3}>\n <StatCard label=\"Signups\" value=\"1,284\" hint=\"30-day total\" />\n </DashboardGrid.Cell>\n <DashboardGrid.Cell span={8}>\n <Surface className=\"flex h-48 items-center justify-center p-4 text-sm text-sf-subtle\">\n Primary chart area (span=8)\n </Surface>\n </DashboardGrid.Cell>\n <DashboardGrid.Cell span={4}>\n <Surface className=\"flex h-48 items-center justify-center p-4 text-sm text-sf-subtle\">\n Secondary (span=4)\n </Surface>\n </DashboardGrid.Cell>\n </DashboardGrid>"
|
|
7233
|
+
],
|
|
6438
7234
|
"colors": [],
|
|
6439
7235
|
"subComponents": {
|
|
6440
7236
|
"Row": {
|
|
@@ -6486,7 +7282,10 @@
|
|
|
6486
7282
|
"size": {
|
|
6487
7283
|
"type": "enum",
|
|
6488
7284
|
"optional": true,
|
|
6489
|
-
"values": [
|
|
7285
|
+
"values": [
|
|
7286
|
+
"sm",
|
|
7287
|
+
"base"
|
|
7288
|
+
],
|
|
6490
7289
|
"descriptions": {
|
|
6491
7290
|
"sm": "Small dialog for simple delete confirmations",
|
|
6492
7291
|
"base": "Default delete confirmation dialog size"
|
|
@@ -6534,7 +7333,11 @@
|
|
|
6534
7333
|
"description": "Error message to display if the delete action fails"
|
|
6535
7334
|
}
|
|
6536
7335
|
},
|
|
6537
|
-
"examples": [
|
|
7336
|
+
"examples": [
|
|
7337
|
+
"<>\n <Button variant=\"destructive\" onClick={() => setOpen(true)}>\n Delete Zone\n </Button>\n <DeleteResource\n open={open}\n onOpenChange={setOpen}\n resourceType=\"Zone\"\n resourceName=\"example.com\"\n onDelete={handleDelete}\n isDeleting={isDeleting}\n />\n </>",
|
|
7338
|
+
"<>\n <Button variant=\"destructive\" onClick={() => setOpen(true)}>\n Delete Worker\n </Button>\n <DeleteResource\n open={open}\n onOpenChange={setOpen}\n resourceType=\"Worker\"\n resourceName=\"api-gateway-worker\"\n onDelete={handleDelete}\n isDeleting={isDeleting}\n />\n </>",
|
|
7339
|
+
"<>\n <Button variant=\"destructive\" onClick={() => setOpen(true)}>\n Delete Zone\n </Button>\n <DeleteResource\n open={open}\n onOpenChange={setOpen}\n resourceType=\"Zone\"\n resourceName=\"example.com\"\n onDelete={handleDelete}\n isDeleting={isDeleting}\n errorMessage={errorMsg}\n />\n </>"
|
|
7340
|
+
],
|
|
6538
7341
|
"colors": [
|
|
6539
7342
|
"bg-sf-fill",
|
|
6540
7343
|
"bg-sf-tint",
|
|
@@ -6581,8 +7384,16 @@
|
|
|
6581
7384
|
"text-sf-default",
|
|
6582
7385
|
"text-sf-subtle"
|
|
6583
7386
|
],
|
|
6584
|
-
"files": [
|
|
6585
|
-
|
|
7387
|
+
"files": [
|
|
7388
|
+
"map-block/map-block.tsx",
|
|
7389
|
+
"map-block/map-block.stories.tsx"
|
|
7390
|
+
],
|
|
7391
|
+
"dependencies": [
|
|
7392
|
+
"Badge",
|
|
7393
|
+
"Button",
|
|
7394
|
+
"Loader",
|
|
7395
|
+
"Tooltip"
|
|
7396
|
+
]
|
|
6586
7397
|
},
|
|
6587
7398
|
"MetricsOverview": {
|
|
6588
7399
|
"name": "MetricsOverview",
|
|
@@ -6632,13 +7443,22 @@
|
|
|
6632
7443
|
"description": "Additional CSS classes merged via `cn()`."
|
|
6633
7444
|
}
|
|
6634
7445
|
},
|
|
6635
|
-
"examples": [
|
|
6636
|
-
"
|
|
7446
|
+
"examples": [
|
|
7447
|
+
"<MetricsOverview\n title=\"Revenue overview\"\n description=\"Last 72 hours · hourly granularity\"\n kpis={[\n {\n id: \"mrr\",\n label: \"MRR\",\n value: \"$128,420\",\n delta: { value: 0.12, label: \"vs last month\" },\n trend: (\n <Sparkline\n echarts={echarts}\n data={sparkData}\n variant=\"area\"\n isDarkMode={isDarkMode}\n />\n ),\n },\n {\n id: \"arpu\",\n label: \"ARPU\",\n value: \"$42.10\",\n delta: { value: 0.03, label: \"vs last month\" },\n },\n {\n id: \"churn\",\n label: \"Churn\",\n value: \"1.4%\",\n delta: {\n value: -0.01,\n label: \"vs last month\",\n positiveDirection: \"down\",\n },\n },\n {\n id: \"users\",\n label: \"Active users\",\n value: \"12,384\",\n delta: { value: 0.08, label: \"vs last week\" },\n },\n ]}\n chart={\n <TimeseriesChart\n echarts={echarts}\n data={[\n series(\"Revenue\", 0, ChartPalette.semantic(\"Neutral\", isDarkMode)),\n series(\"Cost\", 20, ChartPalette.semantic(\"Attention\", isDarkMode)),\n ]}\n height={260}\n gradient\n isDarkMode={isDarkMode}\n />\n }\n />",
|
|
7448
|
+
"<MetricsOverview\n title=\"Revenue overview\"\n loading\n kpis={[\n { id: \"mrr\", label: \"MRR\", value: \"—\" },\n { id: \"arpu\", label: \"ARPU\", value: \"—\" },\n { id: \"churn\", label: \"Churn\", value: \"—\" },\n { id: \"users\", label: \"Active users\", value: \"—\" },\n ]}\n />"
|
|
7449
|
+
],
|
|
7450
|
+
"colors": [
|
|
7451
|
+
"bg-sf-elevated",
|
|
7452
|
+
"text-sf-strong",
|
|
7453
|
+
"text-sf-subtle"
|
|
7454
|
+
],
|
|
6637
7455
|
"files": [
|
|
6638
7456
|
"metrics-overview/metrics-overview.tsx",
|
|
6639
7457
|
"metrics-overview/metrics-overview.stories.tsx"
|
|
6640
7458
|
],
|
|
6641
|
-
"dependencies": [
|
|
7459
|
+
"dependencies": [
|
|
7460
|
+
"StatCard"
|
|
7461
|
+
]
|
|
6642
7462
|
},
|
|
6643
7463
|
"PageHeader": {
|
|
6644
7464
|
"name": "PageHeader",
|
|
@@ -6650,7 +7470,11 @@
|
|
|
6650
7470
|
"spacing": {
|
|
6651
7471
|
"type": "enum",
|
|
6652
7472
|
"optional": true,
|
|
6653
|
-
"values": [
|
|
7473
|
+
"values": [
|
|
7474
|
+
"compact",
|
|
7475
|
+
"base",
|
|
7476
|
+
"relaxed"
|
|
7477
|
+
],
|
|
6654
7478
|
"descriptions": {
|
|
6655
7479
|
"compact": "Compact spacing between header elements",
|
|
6656
7480
|
"base": "Default spacing between header elements",
|
|
@@ -6692,13 +7516,28 @@
|
|
|
6692
7516
|
"optional": true
|
|
6693
7517
|
}
|
|
6694
7518
|
},
|
|
6695
|
-
"examples": [
|
|
6696
|
-
"
|
|
7519
|
+
"examples": [
|
|
7520
|
+
"<PageHeader\n className=\"w-full\"\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link icon={<HouseIcon size={16} />} href=\"#\">\n Workers & Pages\n </Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>cloudflare-dev-platform</Breadcrumbs.Current>\n </Breadcrumbs>\n }\n tabs={[\n { label: \"Overview\", value: \"overview\" },\n { label: \"Metrics\", value: \"metrics\" },\n { label: \"Deployments\", value: \"deployments\" },\n { label: \"Bindings\", value: \"bindings\" },\n { label: \"Observability\", value: \"observability\" },\n { label: \"Settings\", value: \"settings\" },\n ]}\n defaultTab=\"overview\"\n onValueChange={(v) => console.log(v)}\n >\n <Button icon={<CodeIcon />} className=\"h-8\">\n Edit code\n </Button>\n <Button icon={<GlobeIcon />} variant=\"primary\" className=\"h-8\">\n Visit\n </Button>\n </PageHeader>",
|
|
7521
|
+
"<PageHeader\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Dashboard</Breadcrumbs.Current>\n </Breadcrumbs>\n }\n />",
|
|
7522
|
+
"<PageHeader\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link icon={<HouseIcon size={16} />} href=\"#\">\n Home\n </Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current icon={<GearIcon size={16} />}>\n Settings\n </Breadcrumbs.Current>\n </Breadcrumbs>\n }\n />",
|
|
7523
|
+
"<PageHeader\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Settings</Breadcrumbs.Current>\n </Breadcrumbs>\n }\n tabs={[\n { label: \"General\", value: \"general\" },\n { label: \"Security\", value: \"security\" },\n { label: \"Notifications\", value: \"notifications\" },\n ]}\n defaultTab=\"general\"\n />",
|
|
7524
|
+
"<PageHeader\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Link href=\"#\">Projects</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>My Project</Breadcrumbs.Current>\n </Breadcrumbs>\n }\n tabs={[\n { label: \"Overview\", value: \"overview\" },\n { label: \"Settings\", value: \"settings\" },\n ]}\n defaultTab=\"overview\"\n >\n <Button variant=\"primary\" size=\"base\">\n Deploy\n </Button>\n </PageHeader>",
|
|
7525
|
+
"<PageHeader\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Link href=\"#\">Products</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Page title</Breadcrumbs.Current>\n </Breadcrumbs>\n }\n title=\"Page title\"\n />",
|
|
7526
|
+
"<PageHeader\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Link href=\"#\">Products</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Page title</Breadcrumbs.Current>\n </Breadcrumbs>\n }\n title=\"Page title\"\n description=\"Action-led, value-oriented description of what this page does. Optional second sentence with use cases or prerequisites.\"\n />",
|
|
7527
|
+
"<PageHeader\n breadcrumbs={\n <Breadcrumbs>\n <Breadcrumbs.Link href=\"#\">Home</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Link href=\"#\">Products</Breadcrumbs.Link>\n <Breadcrumbs.Separator />\n <Breadcrumbs.Current>Page title</Breadcrumbs.Current>\n </Breadcrumbs>\n }\n title=\"Page title\"\n description=\"Action-led, value-oriented description of what this page does.\"\n tabs={[\n { label: \"Overview\", value: \"overview\" },\n { label: \"Analytics\", value: \"analytics\" },\n { label: \"Settings\", value: \"settings\" },\n ]}\n defaultTab=\"overview\"\n >\n <Button variant=\"outline\" size=\"sm\">\n Export\n </Button>\n <Button variant=\"primary\" size=\"sm\" icon={<PlusIcon size={16} />}>\n New Item\n </Button>\n </PageHeader>"
|
|
7528
|
+
],
|
|
7529
|
+
"colors": [
|
|
7530
|
+
"border-sf-line",
|
|
7531
|
+
"text-sf-default",
|
|
7532
|
+
"text-sf-subtle"
|
|
7533
|
+
],
|
|
6697
7534
|
"files": [
|
|
6698
7535
|
"page-header/page-header.tsx",
|
|
6699
7536
|
"page-header/page-header.stories.tsx"
|
|
6700
7537
|
],
|
|
6701
|
-
"dependencies": [
|
|
7538
|
+
"dependencies": [
|
|
7539
|
+
"Tabs"
|
|
7540
|
+
]
|
|
6702
7541
|
},
|
|
6703
7542
|
"ResourceListPage": {
|
|
6704
7543
|
"name": "ResourceListPage",
|
|
@@ -6737,7 +7576,10 @@
|
|
|
6737
7576
|
}
|
|
6738
7577
|
},
|
|
6739
7578
|
"examples": [],
|
|
6740
|
-
"colors": [
|
|
7579
|
+
"colors": [
|
|
7580
|
+
"bg-sf-overlay",
|
|
7581
|
+
"text-sf-strong"
|
|
7582
|
+
],
|
|
6741
7583
|
"files": [
|
|
6742
7584
|
"resource-list/resource-list.tsx",
|
|
6743
7585
|
"resource-list/resource-list.stories.tsx",
|
|
@@ -6801,8 +7643,15 @@
|
|
|
6801
7643
|
"Meter",
|
|
6802
7644
|
"Text"
|
|
6803
7645
|
],
|
|
6804
|
-
"Feedback": [
|
|
6805
|
-
|
|
7646
|
+
"Feedback": [
|
|
7647
|
+
"Banner",
|
|
7648
|
+
"Loader",
|
|
7649
|
+
"Toasty"
|
|
7650
|
+
],
|
|
7651
|
+
"Action": [
|
|
7652
|
+
"Button",
|
|
7653
|
+
"ClipboardText"
|
|
7654
|
+
],
|
|
6806
7655
|
"Input": [
|
|
6807
7656
|
"Checkbox",
|
|
6808
7657
|
"Combobox",
|
|
@@ -6813,9 +7662,24 @@
|
|
|
6813
7662
|
"Select",
|
|
6814
7663
|
"Switch"
|
|
6815
7664
|
],
|
|
6816
|
-
"Navigation": [
|
|
6817
|
-
|
|
6818
|
-
|
|
7665
|
+
"Navigation": [
|
|
7666
|
+
"CommandPalette",
|
|
7667
|
+
"MenuBar",
|
|
7668
|
+
"Pagination",
|
|
7669
|
+
"Tabs"
|
|
7670
|
+
],
|
|
7671
|
+
"Overlay": [
|
|
7672
|
+
"Dialog",
|
|
7673
|
+
"DropdownMenu",
|
|
7674
|
+
"Popover",
|
|
7675
|
+
"Tooltip"
|
|
7676
|
+
],
|
|
7677
|
+
"Layout": [
|
|
7678
|
+
"Grid",
|
|
7679
|
+
"Surface",
|
|
7680
|
+
"PageHeader",
|
|
7681
|
+
"ResourceListPage"
|
|
7682
|
+
]
|
|
6819
7683
|
},
|
|
6820
7684
|
"byName": [
|
|
6821
7685
|
"AgentHarness",
|
|
@@ -6974,4 +7838,4 @@
|
|
|
6974
7838
|
]
|
|
6975
7839
|
}
|
|
6976
7840
|
}
|
|
6977
|
-
}
|
|
7841
|
+
}
|