@signalflare-ai/ui 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +102 -5
- package/README.md +1 -1
- package/ai/component-registry.json +531 -79
- package/ai/component-registry.md +4067 -6
- package/ai/schemas.ts +6 -1
- 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-CBfz5XEf.js} +4 -4
- package/dist/{ai-actions-DSVeQn4e.js.map → ai-actions-CBfz5XEf.js.map} +1 -1
- package/dist/{ai-agent-card-BXHwhWAU.js → ai-agent-card-CByAUe0q.js} +3 -3
- package/dist/ai-agent-card-CByAUe0q.js.map +1 -0
- package/dist/{ai-approval-aa0qvjFN.js → ai-approval-Ci8N70a7.js} +4 -3
- package/dist/{ai-approval-aa0qvjFN.js.map → ai-approval-Ci8N70a7.js.map} +1 -1
- package/dist/{ai-code-block-BgtIxtZZ.js → ai-code-block-P9TJHvaC.js} +37 -39
- package/dist/ai-code-block-P9TJHvaC.js.map +1 -0
- package/dist/ai-conversation-Qslfdi1t.js +228 -0
- package/dist/ai-conversation-Qslfdi1t.js.map +1 -0
- package/dist/{ai-info-banner-uFxHHwBA.js → ai-info-banner-B_9vtGK3.js} +8 -4
- package/dist/ai-info-banner-B_9vtGK3.js.map +1 -0
- package/dist/{ai-message-BjnFznXy.js → ai-message-Ci3gwM7G.js} +29 -10
- package/dist/ai-message-Ci3gwM7G.js.map +1 -0
- package/dist/{ai-mission-header-08__gULL.js → ai-mission-header-CaBc19-t.js} +2 -2
- package/dist/{ai-mission-header-08__gULL.js.map → ai-mission-header-CaBc19-t.js.map} +1 -1
- package/dist/{ai-part-group-DBtgTgAn.js → ai-part-group-Dx1Mr92B.js} +5 -4
- package/dist/ai-part-group-Dx1Mr92B.js.map +1 -0
- package/dist/{ai-prompt-input-CuluUzpf.js → ai-prompt-input-Bm4XoSj2.js} +44 -55
- package/dist/ai-prompt-input-Bm4XoSj2.js.map +1 -0
- package/dist/{ai-question-CHHoDJMg.js → ai-question-OyJovxGe.js} +4 -3
- package/dist/{ai-question-CHHoDJMg.js.map → ai-question-OyJovxGe.js.map} +1 -1
- package/dist/{ai-reasoning-CnL6ZSr5.js → ai-reasoning-BLfBXx3F.js} +9 -5
- package/dist/ai-reasoning-BLfBXx3F.js.map +1 -0
- package/dist/{ai-response-BEUg3xvd.js → ai-response-hbVCZJmo.js} +9 -4
- package/dist/ai-response-hbVCZJmo.js.map +1 -0
- package/dist/{ai-shimmer-By5_L05p.js → ai-shimmer-BamNMNK3.js} +2 -2
- package/dist/{ai-shimmer-By5_L05p.js.map → ai-shimmer-BamNMNK3.js.map} +1 -1
- package/dist/{ai-status-badge-BGYGWYF6.js → ai-status-badge-BZLczdkI.js} +2 -2
- package/dist/{ai-status-badge-BGYGWYF6.js.map → ai-status-badge-BZLczdkI.js.map} +1 -1
- package/dist/{ai-streaming-text-CMfoThV0.js → ai-streaming-text-DgYu64UH.js} +44 -16
- package/dist/ai-streaming-text-DgYu64UH.js.map +1 -0
- package/dist/{ai-subagent-DcPRqkAA.js → ai-subagent-p97AI1h9.js} +14 -6
- package/dist/ai-subagent-p97AI1h9.js.map +1 -0
- package/dist/{ai-suggestion-MgeCg5Ar.js → ai-suggestion-Bj6vF7CT.js} +3 -3
- package/dist/{ai-suggestion-MgeCg5Ar.js.map → ai-suggestion-Bj6vF7CT.js.map} +1 -1
- package/dist/{ai-task-list-Da9zIm00.js → ai-task-list-C_UQYpk9.js} +15 -6
- package/dist/ai-task-list-C_UQYpk9.js.map +1 -0
- package/dist/{ai-timeline-Cwu045IR.js → ai-timeline-CePL1LOU.js} +3 -3
- package/dist/ai-timeline-CePL1LOU.js.map +1 -0
- package/dist/{ai-tool-Cn1O4xjP.js → ai-tool-CfRcwmHT.js} +35 -16
- package/dist/ai-tool-CfRcwmHT.js.map +1 -0
- package/dist/{ai-usage-bar-DjS12DMp.js → ai-usage-bar-45pVRCGA.js} +2 -2
- package/dist/{ai-usage-bar-DjS12DMp.js.map → ai-usage-bar-45pVRCGA.js.map} +1 -1
- package/dist/{badge-D_eaA6wv.js → badge-Beb-6uut.js} +5 -5
- package/dist/{badge-D_eaA6wv.js.map → badge-Beb-6uut.js.map} +1 -1
- package/dist/{banner-B_6oBrsu.js → banner-CCEksxPg.js} +8 -3
- package/dist/banner-CCEksxPg.js.map +1 -0
- package/dist/{breadcrumbs-BlmeYfgq.js → breadcrumbs-HiTmgaZ4.js} +5 -5
- package/dist/{breadcrumbs-BlmeYfgq.js.map → breadcrumbs-HiTmgaZ4.js.map} +1 -1
- package/dist/{button-De0267YU.js → button-BHOgXJRU.js} +4 -4
- package/dist/{button-De0267YU.js.map → button-BHOgXJRU.js.map} +1 -1
- package/dist/catalog.js +1 -1
- package/dist/catalog.js.map +1 -1
- package/dist/{chart-BK3sVPnD.js → chart-B9FfZdKs.js} +7 -7
- package/dist/chart-B9FfZdKs.js.map +1 -0
- package/dist/{checkbox-DYhUmZNw.js → checkbox-Cy_OCyay.js} +3 -3
- package/dist/{checkbox-DYhUmZNw.js.map → checkbox-Cy_OCyay.js.map} +1 -1
- package/dist/{clipboard-text-ssybngLw.js → clipboard-text-CKSvNp9L.js} +6 -5
- package/dist/clipboard-text-CKSvNp9L.js.map +1 -0
- package/dist/{cn-YROP2_ox.js → cn-CmAOpn49.js} +2 -2
- package/dist/{cn-YROP2_ox.js.map → cn-CmAOpn49.js.map} +1 -1
- package/dist/{code-Cx-QSoOT.js → code-JsQz-0G_.js} +4 -4
- package/dist/{code-Cx-QSoOT.js.map → code-JsQz-0G_.js.map} +1 -1
- package/dist/{collapsible-DWsXeXmS.js → collapsible-1kOZ-89L.js} +2 -2
- package/dist/{collapsible-DWsXeXmS.js.map → collapsible-1kOZ-89L.js.map} +1 -1
- package/dist/{combobox-C0iW6a0r.js → combobox-CQwDmqgA.js} +4 -4
- package/dist/{combobox-C0iW6a0r.js.map → combobox-CQwDmqgA.js.map} +1 -1
- package/dist/command-line/cli.js +3 -3
- package/dist/{command-palette-DGzioeki.js → command-palette-Bkuv3e6o.js} +20 -5
- package/dist/command-palette-Bkuv3e6o.js.map +1 -0
- package/dist/components/ai-actions.js +1 -1
- package/dist/components/ai-agent-card.js +1 -1
- package/dist/components/ai-approval.js +1 -1
- package/dist/components/ai-code-block.js +1 -1
- package/dist/components/ai-conversation.js +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 +1 -1
- 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/link.js +3 -3
- package/dist/components/link.js.map +1 -1
- package/dist/components/loader.js +2 -2
- 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-DDSFMHud.js} +136 -53
- package/dist/data-grid-DDSFMHud.js.map +1 -0
- package/dist/{date-picker-Dqg9L4xu.js → date-picker-O34AqG3f.js} +2 -2
- package/dist/{date-picker-Dqg9L4xu.js.map → date-picker-O34AqG3f.js.map} +1 -1
- package/dist/{date-range-picker-D75LLINc.js → date-range-picker-YKYvum_r.js} +29 -39
- package/dist/{date-range-picker-D75LLINc.js.map → date-range-picker-YKYvum_r.js.map} +1 -1
- package/dist/{dialog-CyHEQXEY.js → dialog-DYqu4aDO.js} +3 -3
- package/dist/{dialog-CyHEQXEY.js.map → dialog-DYqu4aDO.js.map} +1 -1
- package/dist/{dist-1-gcEL2L.js → dist-6AtBsaJE.js} +153 -47
- package/dist/dist-6AtBsaJE.js.map +1 -0
- package/dist/{dropdown-qnEYRFXZ.js → dropdown-XzbnRLYR.js} +15 -5
- package/dist/dropdown-XzbnRLYR.js.map +1 -0
- package/dist/{echart-DURZEyai.js → echart-DGBIVAv1.js} +23 -57
- package/dist/{echart-DURZEyai.js.map → echart-DGBIVAv1.js.map} +1 -1
- package/dist/{empty-D2TypIId.js → empty-C1tAkawe.js} +12 -7
- package/dist/empty-C1tAkawe.js.map +1 -0
- package/dist/{field-Y_UK1_Cg.js → field-DBpFzzBS.js} +3 -3
- package/dist/{field-Y_UK1_Cg.js.map → field-DBpFzzBS.js.map} +1 -1
- package/dist/{filters-Bw_U6ZTx.js → filters-SmEl93za.js} +10 -10
- package/dist/filters-SmEl93za.js.map +1 -0
- package/dist/{flow-BRsYUCJa.js → flow-BLzgbq1T.js} +6 -6
- package/dist/flow-BLzgbq1T.js.map +1 -0
- package/dist/genui.js +2 -2
- package/dist/genui.js.map +1 -1
- package/dist/{grid-qUAN9hFx.js → grid-CifjQL-5.js} +2 -2
- package/dist/{grid-qUAN9hFx.js.map → grid-CifjQL-5.js.map} +1 -1
- package/dist/{highlight-to-react-ClEfL81q.js → highlight-to-react-DN9dUCS2.js} +9 -15
- package/dist/highlight-to-react-DN9dUCS2.js.map +1 -0
- package/dist/index.js +72 -72
- package/dist/index.js.map +1 -1
- package/dist/{input-DddtBN-g.js → input-COmx2M_R.js} +5 -5
- package/dist/{input-DddtBN-g.js.map → input-COmx2M_R.js.map} +1 -1
- package/dist/{input-DXYUjGgD.js → input-GkfMQZC_.js} +3 -3
- package/dist/{input-DXYUjGgD.js.map → input-GkfMQZC_.js.map} +1 -1
- package/dist/{label-QtJxtJ4u.js → label-CiGZ464N.js} +3 -3
- package/dist/{label-QtJxtJ4u.js.map → label-CiGZ464N.js.map} +1 -1
- package/dist/{layer-card-BME0eljh.js → layer-card-8l8GuLQr.js} +2 -2
- package/dist/{layer-card-BME0eljh.js.map → layer-card-8l8GuLQr.js.map} +1 -1
- package/dist/layout-CWBE0qwx.js +6207 -0
- package/dist/layout-CWBE0qwx.js.map +1 -0
- package/dist/{link-provider-BUZKXaNE.js → link-provider-BSn8YJon.js} +2 -2
- package/dist/link-provider-BSn8YJon.js.map +1 -0
- package/dist/{loader-DAcc-Uag.js → loader-BEMz8pJO.js} +1 -1
- package/dist/{loader-DAcc-Uag.js.map → loader-BEMz8pJO.js.map} +1 -1
- package/dist/measured-text-CXkdw9Yr.js +305 -0
- package/dist/measured-text-CXkdw9Yr.js.map +1 -0
- package/dist/{menubar-C8NzAjfd.js → menubar-CoOr4ocj.js} +3 -3
- package/dist/{menubar-C8NzAjfd.js.map → menubar-CoOr4ocj.js.map} +1 -1
- package/dist/{meter-CpmTenEr.js → meter-Pf_VOl59.js} +2 -2
- package/dist/{meter-CpmTenEr.js.map → meter-Pf_VOl59.js.map} +1 -1
- package/dist/{pagination-BVqdlONY.js → pagination-DSY279Ta.js} +2 -2
- package/dist/{pagination-BVqdlONY.js.map → pagination-DSY279Ta.js.map} +1 -1
- package/dist/{popover-BRQZ2b6z.js → popover-BY-e9co1.js} +2 -2
- package/dist/{popover-BRQZ2b6z.js.map → popover-BY-e9co1.js.map} +1 -1
- package/dist/{radio-BNSwOt3B.js → radio-DZwL13j0.js} +2 -2
- package/dist/{radio-BNSwOt3B.js.map → radio-DZwL13j0.js.map} +1 -1
- package/dist/{select-1w2aebGQ.js → select-BFifYqHA.js} +6 -6
- package/dist/{select-1w2aebGQ.js.map → select-BFifYqHA.js.map} +1 -1
- package/dist/{sensitive-input-82Cez3vj.js → sensitive-input-DHLZcM73.js} +4 -4
- package/dist/{sensitive-input-82Cez3vj.js.map → sensitive-input-DHLZcM73.js.map} +1 -1
- package/dist/{sidebar-CAsCmSpM.js → sidebar-odGsdvG4.js} +6 -7
- package/dist/sidebar-odGsdvG4.js.map +1 -0
- package/dist/{signalflare-ai-logo-DDhxMJD6.js → signalflare-ai-logo-CNaDT_w8.js} +2 -2
- package/dist/{signalflare-ai-logo-DDhxMJD6.js.map → signalflare-ai-logo-CNaDT_w8.js.map} +1 -1
- package/dist/{skeleton-line-Do3UmGk9.js → skeleton-line-CxxYVTO2.js} +2 -2
- package/dist/{skeleton-line-Do3UmGk9.js.map → skeleton-line-CxxYVTO2.js.map} +1 -1
- package/dist/{sparkline-DdbeM4Ai.js → sparkline-BQ-4j2W2.js} +2 -2
- package/dist/{sparkline-DdbeM4Ai.js.map → sparkline-BQ-4j2W2.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 +40 -16
- package/dist/src/blocks/commander/commander.tsx +15 -15
- package/dist/src/blocks/map-block/map-block.d.ts.map +1 -1
- package/dist/src/blocks/map-block/map-block.tsx +11 -7
- package/dist/src/components/ai-approval/ai-approval.d.ts.map +1 -1
- package/dist/src/components/ai-code-block/ai-code-block.d.ts +14 -13
- package/dist/src/components/ai-code-block/ai-code-block.d.ts.map +1 -1
- 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-part-group/ai-part-group.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts +13 -3
- 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.map +1 -1
- package/dist/src/components/ai-prompt-input/index.d.ts +1 -1
- package/dist/src/components/ai-prompt-input/index.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/types.d.ts.map +1 -1
- package/dist/src/components/ai-question/ai-question.d.ts.map +1 -1
- package/dist/src/components/ai-reasoning/ai-reasoning.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/chart/echart.d.ts.map +1 -1
- package/dist/src/components/clipboard-text/clipboard-text.d.ts.map +1 -1
- package/dist/src/components/data-grid/data-grid.d.ts +2 -1
- package/dist/src/components/data-grid/data-grid.d.ts.map +1 -1
- package/dist/src/components/data-grid/features.d.ts +20 -0
- package/dist/src/components/data-grid/features.d.ts.map +1 -0
- package/dist/src/components/data-grid/types.d.ts +38 -7
- package/dist/src/components/data-grid/types.d.ts.map +1 -1
- package/dist/src/components/empty/empty.d.ts.map +1 -1
- package/dist/src/components/filters/filters.d.ts.map +1 -1
- package/dist/src/components/flow/use-children.d.ts +1 -1
- package/dist/src/components/link/link.d.ts.map +1 -1
- package/dist/src/components/sidebar/sidebar.d.ts +1 -1
- package/dist/src/components/signalflare-ai-logo/signalflare-ai-logo.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 +36 -1
- package/dist/src/components/text/text.d.ts.map +1 -1
- package/dist/src/components/text-roll/text-roll.d.ts.map +1 -1
- package/dist/src/components/theme-toggle/theme-toggle.d.ts.map +1 -1
- package/dist/src/components/toast/toast.d.ts.map +1 -1
- package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/utils/highlight-to-react.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-Bspk4XFr.js} +30 -12
- package/dist/stat-card-Bspk4XFr.js.map +1 -0
- package/dist/styles/sf-binding.css +1 -1
- package/dist/styles/sf-standalone.css +2 -2
- package/dist/styles/shadcn.css +1 -1
- package/dist/styles/theme-minimal.css +9 -9
- package/dist/styles/theme-sf.css +14 -20
- package/dist/styles/theme-vesper.css +91 -0
- package/dist/{surface-BduI7Ehl.js → surface-CWdSFVUx.js} +3 -3
- package/dist/{surface-BduI7Ehl.js.map → surface-CWdSFVUx.js.map} +1 -1
- package/dist/{switch-CzZBRBL7.js → switch-TA4cByCJ.js} +5 -5
- package/dist/switch-TA4cByCJ.js.map +1 -0
- package/dist/{table-Rv4JMy0B.js → table-BM8JBGBs.js} +3 -3
- package/dist/{table-Rv4JMy0B.js.map → table-BM8JBGBs.js.map} +1 -1
- package/dist/{tabs-1cHrYoel.js → tabs-bnH2vGLv.js} +2 -2
- package/dist/{tabs-1cHrYoel.js.map → tabs-bnH2vGLv.js.map} +1 -1
- package/dist/{text-KJmGkwnf.js → text-iQ0YUFNg.js} +27 -6
- package/dist/text-iQ0YUFNg.js.map +1 -0
- package/dist/{text-roll-BZ3I1umc.js → text-roll-C3U2jd2u.js} +5 -2
- package/dist/text-roll-C3U2jd2u.js.map +1 -0
- package/dist/{theme-toggle-Bhu681D7.js → theme-toggle-BTVxD-fD.js} +10 -9
- package/dist/theme-toggle-BTVxD-fD.js.map +1 -0
- package/dist/{toast-Nw28a5Cx.js → toast-CgZVaAkw.js} +3 -3
- package/dist/{toast-Nw28a5Cx.js.map → toast-CgZVaAkw.js.map} +1 -1
- package/dist/{tooltip-Cb7QW-7H.js → tooltip-uobk6Oh-.js} +9 -3
- package/dist/tooltip-uobk6Oh-.js.map +1 -0
- package/dist/{use-agent-harness-BMyF8pTq.js → use-agent-harness-Dl8w6X5O.js} +3 -3
- package/dist/{use-agent-harness-BMyF8pTq.js.map → use-agent-harness-Dl8w6X5O.js.map} +1 -1
- package/dist/utils.js +4 -3
- package/package.json +27 -24
- package/scripts/component-registry/discovery.ts +11 -10
- package/scripts/component-registry/example-cleanup.ts +8 -8
- package/scripts/component-registry/index.ts +6 -6
- package/scripts/component-registry/schema-generator.ts +1 -1
- package/scripts/component-registry/sub-components.ts +35 -23
- package/scripts/component-registry/utils.ts +11 -11
- package/scripts/component-registry/variant-parser.ts +17 -15
- package/scripts/convert-demos-to-stories.ts +5 -5
- package/scripts/css-build.ts +1 -1
- package/scripts/theme-generator/config.ts +28 -146
- package/scripts/theme-generator/generate-css.ts +1 -2
- package/scripts/theme-generator/index.ts +0 -1
- package/scripts/theme-generator/migrate.ts +3 -3
- package/dist/ai-agent-card-BXHwhWAU.js.map +0 -1
- package/dist/ai-code-block-BgtIxtZZ.js.map +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-part-group-DBtgTgAn.js.map +0 -1
- package/dist/ai-prompt-input-CuluUzpf.js.map +0 -1
- package/dist/ai-reasoning-CnL6ZSr5.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-timeline-Cwu045IR.js.map +0 -1
- package/dist/ai-tool-Cn1O4xjP.js.map +0 -1
- package/dist/banner-B_6oBrsu.js.map +0 -1
- package/dist/chart-BK3sVPnD.js.map +0 -1
- package/dist/clipboard-text-ssybngLw.js.map +0 -1
- package/dist/command-palette-DGzioeki.js.map +0 -1
- package/dist/data-grid-CG76N_hK.js.map +0 -1
- package/dist/dist-1-gcEL2L.js.map +0 -1
- package/dist/dropdown-qnEYRFXZ.js.map +0 -1
- package/dist/empty-D2TypIId.js.map +0 -1
- package/dist/filters-Bw_U6ZTx.js.map +0 -1
- package/dist/flow-BRsYUCJa.js.map +0 -1
- package/dist/highlight-to-react-ClEfL81q.js.map +0 -1
- package/dist/link-provider-BUZKXaNE.js.map +0 -1
- package/dist/sidebar-CAsCmSpM.js.map +0 -1
- package/dist/stat-card-CEZscNh8.js.map +0 -1
- package/dist/styles/theme-blue-tint.css +0 -98
- package/dist/switch-CzZBRBL7.js.map +0 -1
- package/dist/text-KJmGkwnf.js.map +0 -1
- package/dist/text-roll-BZ3I1umc.js.map +0 -1
- package/dist/theme-toggle-Bhu681D7.js.map +0 -1
- package/dist/tooltip-Cb7QW-7H.js.map +0 -1
|
@@ -113,13 +113,13 @@ function collectEntries(): Entry[] {
|
|
|
113
113
|
function extractExportedDemoFunctions(source: string): string[] {
|
|
114
114
|
// Strip template literal contents so we don't match `export function`
|
|
115
115
|
// inside code strings.
|
|
116
|
-
const cleaned = source.replace(/`(?:\\.|[^`\\])*`/
|
|
116
|
+
const cleaned = source.replace(/`(?:\\.|[^`\\])*`/gu, "``");
|
|
117
117
|
|
|
118
118
|
const names = new Set<string>();
|
|
119
119
|
|
|
120
120
|
// Only match at start of a line (after optional whitespace) to avoid
|
|
121
121
|
// matching inside expressions/strings.
|
|
122
|
-
const fnRegex = /^\s*export\s+function\s+([A-Z][A-Za-z0-9_]*)\s*\(/
|
|
122
|
+
const fnRegex = /^\s*export\s+function\s+([A-Z][A-Za-z0-9_]*)\s*\(/gmu;
|
|
123
123
|
let m: RegExpExecArray | null = fnRegex.exec(cleaned);
|
|
124
124
|
while (m) {
|
|
125
125
|
names.add(m[1]);
|
|
@@ -127,7 +127,7 @@ function extractExportedDemoFunctions(source: string): string[] {
|
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
const constRegex =
|
|
130
|
-
/^\s*export\s+const\s+([A-Z][A-Za-z0-9_]*)\s*(?::\s*[^=]+)?=\s*(?:\([^)]*\)\s*=>|function)/
|
|
130
|
+
/^\s*export\s+const\s+([A-Z][A-Za-z0-9_]*)\s*(?::\s*[^=]+)?=\s*(?:\([^)]*\)\s*=>|function)/gmu;
|
|
131
131
|
m = constRegex.exec(cleaned);
|
|
132
132
|
while (m) {
|
|
133
133
|
names.add(m[1]);
|
|
@@ -161,7 +161,7 @@ function demoImportPath(entry: Entry): string {
|
|
|
161
161
|
const up = "../".repeat(depth);
|
|
162
162
|
const relFromRegistry = path.relative(
|
|
163
163
|
REGISTRY_ROOT,
|
|
164
|
-
entry.demoFile.replace(/\.tsx
|
|
164
|
+
entry.demoFile.replace(/\.tsx$/u, "")
|
|
165
165
|
);
|
|
166
166
|
return `${up}docs/${relFromRegistry.replace("../", "")}`;
|
|
167
167
|
}
|
|
@@ -170,7 +170,7 @@ function buildDemoImportPath(entry: Entry): string {
|
|
|
170
170
|
// Story lives at packages/registry/src/{components|blocks}/{name}/{name}.stories.tsx
|
|
171
171
|
// Demo lives at packages/docs/src/components/demos/{Name}Demo.tsx
|
|
172
172
|
// Relative path: ../../../../docs/src/components/demos/{Name}Demo
|
|
173
|
-
const demoBase = path.basename(entry.demoFile).replace(/\.tsx
|
|
173
|
+
const demoBase = path.basename(entry.demoFile).replace(/\.tsx$/u, "");
|
|
174
174
|
return `../../../../docs/src/components/demos/${demoBase}`;
|
|
175
175
|
}
|
|
176
176
|
|
package/scripts/css-build.ts
CHANGED
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
* - theme-sf.css (base theme — neutral, WCAG-tuned)
|
|
7
7
|
* - theme-fedramp.css (fedramp overrides)
|
|
8
8
|
* - theme-minimal.css (minimal overrides)
|
|
9
|
-
* - theme-blue-tint.css (prior sf look — blue-tinted dark surfaces)
|
|
10
9
|
*
|
|
11
10
|
* Token naming:
|
|
12
11
|
* - Key = current token name used in codebase
|
|
@@ -32,10 +31,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
32
31
|
light: "oklch(0.145 0 0)",
|
|
33
32
|
dark: "oklch(0.985 0 0)",
|
|
34
33
|
},
|
|
35
|
-
blueTint: {
|
|
36
|
-
light: "oklch(0.145 0 0)",
|
|
37
|
-
dark: "oklch(0.985 0 0)",
|
|
38
|
-
},
|
|
39
34
|
},
|
|
40
35
|
},
|
|
41
36
|
"sf-inverse": {
|
|
@@ -58,10 +53,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
58
53
|
light: "oklch(0.50 0 0)",
|
|
59
54
|
dark: "oklch(0.55 0 0)",
|
|
60
55
|
},
|
|
61
|
-
blueTint: {
|
|
62
|
-
light: "oklch(0.556 0 0)",
|
|
63
|
-
dark: "oklch(0.65 0 0)",
|
|
64
|
-
},
|
|
65
56
|
},
|
|
66
57
|
},
|
|
67
58
|
"sf-subtle": {
|
|
@@ -75,10 +66,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
75
66
|
light: "oklch(0.55 0 0)",
|
|
76
67
|
dark: "oklch(0.45 0 0)",
|
|
77
68
|
},
|
|
78
|
-
blueTint: {
|
|
79
|
-
light: "var(--color-neutral-500, oklch(55.6% 0 0))",
|
|
80
|
-
dark: "var(--color-neutral-50, oklch(98.5% 0 0))",
|
|
81
|
-
},
|
|
82
69
|
},
|
|
83
70
|
},
|
|
84
71
|
"sf-inactive": {
|
|
@@ -92,10 +79,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
92
79
|
light: "oklch(0.65 0 0)",
|
|
93
80
|
dark: "oklch(0.35 0 0)",
|
|
94
81
|
},
|
|
95
|
-
blueTint: {
|
|
96
|
-
light: "var(--color-neutral-400, oklch(70.8% 0 0))",
|
|
97
|
-
dark: "var(--color-neutral-600, oklch(70.8% 0 0))",
|
|
98
|
-
},
|
|
99
82
|
},
|
|
100
83
|
},
|
|
101
84
|
"sf-brand": {
|
|
@@ -120,8 +103,8 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
120
103
|
newName: "",
|
|
121
104
|
theme: {
|
|
122
105
|
sf: {
|
|
123
|
-
light: "
|
|
124
|
-
dark: "
|
|
106
|
+
light: "#99ffe4",
|
|
107
|
+
dark: "#99ffe4",
|
|
125
108
|
},
|
|
126
109
|
},
|
|
127
110
|
},
|
|
@@ -136,10 +119,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
136
119
|
light: "oklch(0.55 0.12 25)",
|
|
137
120
|
dark: "oklch(0.55 0.10 25)",
|
|
138
121
|
},
|
|
139
|
-
blueTint: {
|
|
140
|
-
light: "oklch(0.577 0.245 27.325)",
|
|
141
|
-
dark: "oklch(0.55 0.18 25)",
|
|
142
|
-
},
|
|
143
122
|
},
|
|
144
123
|
},
|
|
145
124
|
"sf-warning": {
|
|
@@ -153,10 +132,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
153
132
|
light: "oklch(0.55 0.08 66)",
|
|
154
133
|
dark: "oklch(0.65 0.08 66)",
|
|
155
134
|
},
|
|
156
|
-
blueTint: {
|
|
157
|
-
light: "var(--color-yellow-800, oklch(47.6% 0.114 61.907))",
|
|
158
|
-
dark: "var(--color-yellow-400, oklch(85.2% 0.199 91.936))",
|
|
159
|
-
},
|
|
160
135
|
},
|
|
161
136
|
},
|
|
162
137
|
},
|
|
@@ -172,7 +147,7 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
172
147
|
theme: {
|
|
173
148
|
sf: {
|
|
174
149
|
light: "oklch(0.95 0 0)",
|
|
175
|
-
dark: "oklch(0.
|
|
150
|
+
dark: "oklch(0.173 0 0)",
|
|
176
151
|
},
|
|
177
152
|
fedramp: {
|
|
178
153
|
light: "#5b697c",
|
|
@@ -180,11 +155,7 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
180
155
|
},
|
|
181
156
|
minimal: {
|
|
182
157
|
light: "oklch(0.95 0 0)",
|
|
183
|
-
dark: "oklch(0.
|
|
184
|
-
},
|
|
185
|
-
blueTint: {
|
|
186
|
-
light: "var(--color-neutral-50, oklch(0.985 0 0))",
|
|
187
|
-
dark: "var(--color-neutral-950, oklch(0.14 0 0))",
|
|
158
|
+
dark: "oklch(0.173 0 0)",
|
|
188
159
|
},
|
|
189
160
|
},
|
|
190
161
|
},
|
|
@@ -193,7 +164,7 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
193
164
|
theme: {
|
|
194
165
|
sf: {
|
|
195
166
|
light: "oklch(0.97 0 0)",
|
|
196
|
-
dark: "oklch(0.
|
|
167
|
+
dark: "oklch(0.1913 0 0)",
|
|
197
168
|
},
|
|
198
169
|
fedramp: {
|
|
199
170
|
light: "#5b697c",
|
|
@@ -201,11 +172,7 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
201
172
|
},
|
|
202
173
|
minimal: {
|
|
203
174
|
light: "oklch(0.97 0 0)",
|
|
204
|
-
dark: "oklch(0.
|
|
205
|
-
},
|
|
206
|
-
blueTint: {
|
|
207
|
-
light: "oklch(1 0 0)",
|
|
208
|
-
dark: "oklch(0.21 0.005 252)",
|
|
175
|
+
dark: "oklch(0.1913 0 0)",
|
|
209
176
|
},
|
|
210
177
|
},
|
|
211
178
|
},
|
|
@@ -214,15 +181,11 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
214
181
|
theme: {
|
|
215
182
|
sf: {
|
|
216
183
|
light: "oklch(1 0 0)",
|
|
217
|
-
dark: "oklch(0.
|
|
184
|
+
dark: "oklch(0.2002 0 0)",
|
|
218
185
|
},
|
|
219
186
|
minimal: {
|
|
220
187
|
light: "oklch(1 0 0)",
|
|
221
|
-
dark: "oklch(0.
|
|
222
|
-
},
|
|
223
|
-
blueTint: {
|
|
224
|
-
light: "oklch(0.99 0 0)",
|
|
225
|
-
dark: "oklch(0.24 0.005 252)",
|
|
188
|
+
dark: "oklch(0.2002 0 0)",
|
|
226
189
|
},
|
|
227
190
|
},
|
|
228
191
|
},
|
|
@@ -231,15 +194,11 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
231
194
|
theme: {
|
|
232
195
|
sf: {
|
|
233
196
|
light: "oklch(0.92 0 0)",
|
|
234
|
-
dark: "oklch(0.
|
|
197
|
+
dark: "oklch(0.173 0 0)",
|
|
235
198
|
},
|
|
236
199
|
minimal: {
|
|
237
200
|
light: "oklch(0.92 0 0)",
|
|
238
|
-
dark: "oklch(0.
|
|
239
|
-
},
|
|
240
|
-
blueTint: {
|
|
241
|
-
light: "var(--color-neutral-250, oklch(0.9 0 0))",
|
|
242
|
-
dark: "var(--color-neutral-750, oklch(0.31 0 0))",
|
|
201
|
+
dark: "oklch(0.173 0 0)",
|
|
243
202
|
},
|
|
244
203
|
},
|
|
245
204
|
},
|
|
@@ -248,15 +207,11 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
248
207
|
theme: {
|
|
249
208
|
sf: {
|
|
250
209
|
light: "oklch(0.93 0 0)",
|
|
251
|
-
dark: "oklch(0.
|
|
210
|
+
dark: "oklch(0.173 0 0)",
|
|
252
211
|
},
|
|
253
212
|
minimal: {
|
|
254
213
|
light: "oklch(0.93 0 0)",
|
|
255
|
-
dark: "oklch(0.
|
|
256
|
-
},
|
|
257
|
-
blueTint: {
|
|
258
|
-
light: "var(--color-neutral-50, oklch(98.5% 0 0))",
|
|
259
|
-
dark: "var(--color-neutral-950, oklch(0.10 0 0))",
|
|
214
|
+
dark: "oklch(0.173 0 0)",
|
|
260
215
|
},
|
|
261
216
|
},
|
|
262
217
|
},
|
|
@@ -271,10 +226,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
271
226
|
light: "oklch(0.35 0 0)",
|
|
272
227
|
dark: "oklch(0.75 0 0)",
|
|
273
228
|
},
|
|
274
|
-
blueTint: {
|
|
275
|
-
light: "oklch(0.205 0 0)",
|
|
276
|
-
dark: "oklch(0.55 0.01 40)",
|
|
277
|
-
},
|
|
278
229
|
},
|
|
279
230
|
},
|
|
280
231
|
"sf-control": {
|
|
@@ -282,15 +233,11 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
282
233
|
theme: {
|
|
283
234
|
sf: {
|
|
284
235
|
light: "oklch(0.95 0 0)",
|
|
285
|
-
dark: "oklch(0.
|
|
236
|
+
dark: "oklch(0.2264 0 0)",
|
|
286
237
|
},
|
|
287
238
|
minimal: {
|
|
288
239
|
light: "oklch(0.95 0 0)",
|
|
289
|
-
dark: "oklch(0.
|
|
290
|
-
},
|
|
291
|
-
blueTint: {
|
|
292
|
-
light: "var(--color-white, #fff)",
|
|
293
|
-
dark: "var(--color-neutral-900, oklch(21% 0.006 285.885))",
|
|
240
|
+
dark: "oklch(0.2264 0 0)",
|
|
294
241
|
},
|
|
295
242
|
},
|
|
296
243
|
},
|
|
@@ -299,15 +246,11 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
299
246
|
theme: {
|
|
300
247
|
sf: {
|
|
301
248
|
light: "oklch(0.94 0 0)",
|
|
302
|
-
dark: "oklch(0.
|
|
249
|
+
dark: "oklch(0.2562 0 0)",
|
|
303
250
|
},
|
|
304
251
|
minimal: {
|
|
305
252
|
light: "oklch(0.94 0 0)",
|
|
306
|
-
dark: "oklch(0.
|
|
307
|
-
},
|
|
308
|
-
blueTint: {
|
|
309
|
-
light: "var(--color-neutral-150, oklch(0.96 0 0))",
|
|
310
|
-
dark: "var(--color-neutral-850, oklch(0.23 0 0))",
|
|
253
|
+
dark: "oklch(0.2562 0 0)",
|
|
311
254
|
},
|
|
312
255
|
},
|
|
313
256
|
},
|
|
@@ -318,7 +261,7 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
318
261
|
/* Interactive boundary (form controls, checkbox/radio idle).
|
|
319
262
|
More visible than sf-line so controls read as actionable. */
|
|
320
263
|
light: "oklch(0.80 0 0)",
|
|
321
|
-
dark: "oklch(0.
|
|
264
|
+
dark: "oklch(0.2768 0 0)",
|
|
322
265
|
},
|
|
323
266
|
},
|
|
324
267
|
},
|
|
@@ -327,15 +270,11 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
327
270
|
theme: {
|
|
328
271
|
sf: {
|
|
329
272
|
light: "oklch(0.91 0 0)",
|
|
330
|
-
dark: "oklch(0.
|
|
273
|
+
dark: "oklch(0.2562 0 0)",
|
|
331
274
|
},
|
|
332
275
|
minimal: {
|
|
333
276
|
light: "oklch(0.91 0 0)",
|
|
334
|
-
dark: "oklch(0.
|
|
335
|
-
},
|
|
336
|
-
blueTint: {
|
|
337
|
-
light: "var(--color-neutral-200, oklch(92.2% 0 0))",
|
|
338
|
-
dark: "var(--color-neutral-800, oklch(26.9% 0 0))",
|
|
277
|
+
dark: "oklch(0.2562 0 0)",
|
|
339
278
|
},
|
|
340
279
|
},
|
|
341
280
|
},
|
|
@@ -344,15 +283,11 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
344
283
|
theme: {
|
|
345
284
|
sf: {
|
|
346
285
|
light: "oklch(0.88 0 0)",
|
|
347
|
-
dark: "oklch(0.
|
|
286
|
+
dark: "oklch(0.2768 0 0)",
|
|
348
287
|
},
|
|
349
288
|
minimal: {
|
|
350
289
|
light: "oklch(0.88 0 0)",
|
|
351
|
-
dark: "oklch(0.
|
|
352
|
-
},
|
|
353
|
-
blueTint: {
|
|
354
|
-
light: "var(--color-neutral-200, oklch(92.2% 0 0))",
|
|
355
|
-
dark: "var(--color-neutral-700, oklch(37.1% 0 0))",
|
|
290
|
+
dark: "oklch(0.2768 0 0)",
|
|
356
291
|
},
|
|
357
292
|
},
|
|
358
293
|
},
|
|
@@ -367,10 +302,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
367
302
|
light: "oklch(0.55 0.06 260)",
|
|
368
303
|
dark: "oklch(0.55 0.06 260)",
|
|
369
304
|
},
|
|
370
|
-
blueTint: {
|
|
371
|
-
light: "oklch(0.5772 0.2324 260)",
|
|
372
|
-
dark: "oklch(0.5772 0.2324 260)",
|
|
373
|
-
},
|
|
374
305
|
},
|
|
375
306
|
},
|
|
376
307
|
"sf-brand-hover": {
|
|
@@ -384,29 +315,21 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
384
315
|
light: "oklch(0.48 0.05 264)",
|
|
385
316
|
dark: "oklch(0.48 0.05 264)",
|
|
386
317
|
},
|
|
387
|
-
blueTint: {
|
|
388
|
-
light: "var(--color-blue-700, oklch(48.8% 0.243 264.376))",
|
|
389
|
-
dark: "var(--color-blue-700, oklch(48.8% 0.243 264.376))",
|
|
390
|
-
},
|
|
391
318
|
},
|
|
392
319
|
},
|
|
393
320
|
"sf-line": {
|
|
394
321
|
newName: "",
|
|
395
322
|
theme: {
|
|
396
323
|
sf: {
|
|
397
|
-
/*
|
|
398
|
-
|
|
324
|
+
/* Vesper-inspired dark boundary; subtle but visible against the default
|
|
325
|
+
dark surface ramp. */
|
|
399
326
|
light: "oklch(0.85 0 0 / 0.5)",
|
|
400
|
-
dark: "
|
|
327
|
+
dark: "#282828",
|
|
401
328
|
},
|
|
402
329
|
minimal: {
|
|
403
330
|
light: "oklch(0.85 0 0 / 0.5)",
|
|
404
331
|
dark: "oklch(0.25 0 0 / 0.5)",
|
|
405
332
|
},
|
|
406
|
-
blueTint: {
|
|
407
|
-
light: "oklch(0.922 0 0)",
|
|
408
|
-
dark: "oklch(0.3 0.015 250)",
|
|
409
|
-
},
|
|
410
333
|
},
|
|
411
334
|
},
|
|
412
335
|
"sf-ring": {
|
|
@@ -424,10 +347,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
424
347
|
light: "oklch(0.65 0 0)",
|
|
425
348
|
dark: "oklch(0.45 0 0)",
|
|
426
349
|
},
|
|
427
|
-
blueTint: {
|
|
428
|
-
light: "oklch(0.708 0 0)",
|
|
429
|
-
dark: "oklch(0.465 0.015 250)",
|
|
430
|
-
},
|
|
431
350
|
},
|
|
432
351
|
},
|
|
433
352
|
"sf-tip-shadow": {
|
|
@@ -441,10 +360,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
441
360
|
light: "transparent",
|
|
442
361
|
dark: "transparent",
|
|
443
362
|
},
|
|
444
|
-
blueTint: {
|
|
445
|
-
light: "var(--color-gray-200, oklch(92.8% 0.006 264.531))",
|
|
446
|
-
dark: "transparent",
|
|
447
|
-
},
|
|
448
363
|
},
|
|
449
364
|
},
|
|
450
365
|
"sf-tip-stroke": {
|
|
@@ -452,16 +367,12 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
452
367
|
theme: {
|
|
453
368
|
sf: {
|
|
454
369
|
light: "transparent",
|
|
455
|
-
dark: "
|
|
370
|
+
dark: "#282828",
|
|
456
371
|
},
|
|
457
372
|
minimal: {
|
|
458
373
|
light: "transparent",
|
|
459
374
|
dark: "transparent",
|
|
460
375
|
},
|
|
461
|
-
blueTint: {
|
|
462
|
-
light: "transparent",
|
|
463
|
-
dark: "var(--color-neutral-800, oklch(26.9% 0 0))",
|
|
464
|
-
},
|
|
465
376
|
},
|
|
466
377
|
},
|
|
467
378
|
"sf-info": {
|
|
@@ -475,10 +386,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
475
386
|
light: "oklch(0.55 0.06 260)",
|
|
476
387
|
dark: "oklch(0.55 0.06 260)",
|
|
477
388
|
},
|
|
478
|
-
blueTint: {
|
|
479
|
-
light: "var(--color-blue-500, oklch(62.3% 0.214 259.815))",
|
|
480
|
-
dark: "var(--color-blue-700, oklch(48.8% 0.243 264.376))",
|
|
481
|
-
},
|
|
482
389
|
},
|
|
483
390
|
},
|
|
484
391
|
"sf-info-tint": {
|
|
@@ -492,10 +399,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
492
399
|
light: "oklch(0.94 0.01 260)",
|
|
493
400
|
dark: "oklch(0.20 0.02 260)",
|
|
494
401
|
},
|
|
495
|
-
blueTint: {
|
|
496
|
-
light: "var(--color-blue-300, oklch(80.9% 0.105 251.813))",
|
|
497
|
-
dark: "var(--color-blue-900, oklch(37.9% 0.146 265.522))",
|
|
498
|
-
},
|
|
499
402
|
},
|
|
500
403
|
},
|
|
501
404
|
"sf-warning": {
|
|
@@ -509,10 +412,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
509
412
|
light: "oklch(0.55 0.08 66)",
|
|
510
413
|
dark: "oklch(0.65 0.08 66)",
|
|
511
414
|
},
|
|
512
|
-
blueTint: {
|
|
513
|
-
light: "var(--color-yellow-500, oklch(79.5% 0.184 86.047))",
|
|
514
|
-
dark: "var(--color-yellow-700, oklch(55.4% 0.135 66.442))",
|
|
515
|
-
},
|
|
516
415
|
},
|
|
517
416
|
},
|
|
518
417
|
"sf-warning-tint": {
|
|
@@ -526,10 +425,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
526
425
|
light: "oklch(0.94 0.02 60)",
|
|
527
426
|
dark: "oklch(0.22 0.03 60)",
|
|
528
427
|
},
|
|
529
|
-
blueTint: {
|
|
530
|
-
light: "var(--color-yellow-300, oklch(90.5% 0.182 98.111))",
|
|
531
|
-
dark: "var(--color-yellow-900, oklch(42.1% 0.095 57.708))",
|
|
532
|
-
},
|
|
533
428
|
},
|
|
534
429
|
},
|
|
535
430
|
"sf-danger": {
|
|
@@ -543,10 +438,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
543
438
|
light: "oklch(0.55 0.12 25)",
|
|
544
439
|
dark: "oklch(0.55 0.10 25)",
|
|
545
440
|
},
|
|
546
|
-
blueTint: {
|
|
547
|
-
light: "oklch(0.577 0.245 27.325)",
|
|
548
|
-
dark: "oklch(0.55 0.18 25)",
|
|
549
|
-
},
|
|
550
441
|
},
|
|
551
442
|
},
|
|
552
443
|
"sf-danger-tint": {
|
|
@@ -560,10 +451,6 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
560
451
|
light: "oklch(0.94 0.02 25)",
|
|
561
452
|
dark: "oklch(0.20 0.04 25)",
|
|
562
453
|
},
|
|
563
|
-
blueTint: {
|
|
564
|
-
light: "var(--color-red-300, oklch(80.8% 0.114 19.571))",
|
|
565
|
-
dark: "var(--color-red-900, oklch(39.6% 0.141 25.723))",
|
|
566
|
-
},
|
|
567
454
|
},
|
|
568
455
|
},
|
|
569
456
|
"sf-success": {
|
|
@@ -572,8 +459,8 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
572
459
|
"Success signal color (previously hardcoded in the shadcn bridge)",
|
|
573
460
|
theme: {
|
|
574
461
|
sf: {
|
|
575
|
-
light: "
|
|
576
|
-
dark: "
|
|
462
|
+
light: "#99ffe4",
|
|
463
|
+
dark: "#99ffe4",
|
|
577
464
|
},
|
|
578
465
|
},
|
|
579
466
|
},
|
|
@@ -769,12 +656,7 @@ export const THEME_CONFIG: ThemeConfig = {
|
|
|
769
656
|
};
|
|
770
657
|
|
|
771
658
|
/** List of all available themes */
|
|
772
|
-
export const AVAILABLE_THEMES = [
|
|
773
|
-
"sf",
|
|
774
|
-
"fedramp",
|
|
775
|
-
"minimal",
|
|
776
|
-
"blueTint",
|
|
777
|
-
] as const;
|
|
659
|
+
export const AVAILABLE_THEMES = ["sf", "fedramp", "minimal"] as const;
|
|
778
660
|
export type AvailableTheme = (typeof AVAILABLE_THEMES)[number];
|
|
779
661
|
|
|
780
662
|
/**
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* Outputs:
|
|
6
6
|
* - theme-sf.css: Base theme with all tokens
|
|
7
7
|
* - theme-fedramp.css: Override layer for fedramp theme
|
|
8
|
-
* - theme-blue-tint.css: Override layer for blue-tint theme
|
|
9
8
|
* - (future themes as needed)
|
|
10
9
|
*/
|
|
11
10
|
|
|
@@ -33,7 +32,7 @@ function lightDark(light: string, dark: string): string {
|
|
|
33
32
|
}
|
|
34
33
|
|
|
35
34
|
function toThemeFileName(themeName: string): string {
|
|
36
|
-
return themeName.replace(/([a-z])([A-Z])/
|
|
35
|
+
return themeName.replace(/([a-z])([A-Z])/gu, "$1-$2").toLowerCase();
|
|
37
36
|
}
|
|
38
37
|
|
|
39
38
|
/**
|
|
@@ -116,7 +116,7 @@ function buildPatterns(renameMap: TokenRenameMap): Array<{
|
|
|
116
116
|
patterns.push({
|
|
117
117
|
pattern: new RegExp(
|
|
118
118
|
`(${variants})(${prefix}-${escapeRegex(oldName)})(${opacity})(?=\\s|"|'|\`|$|\\))`,
|
|
119
|
-
"
|
|
119
|
+
"gu"
|
|
120
120
|
),
|
|
121
121
|
replacement: `$1${prefix}-${newName}$3`,
|
|
122
122
|
});
|
|
@@ -129,7 +129,7 @@ function buildPatterns(renameMap: TokenRenameMap): Array<{
|
|
|
129
129
|
patterns.push({
|
|
130
130
|
pattern: new RegExp(
|
|
131
131
|
`(${variants})(${prefix}-${escapeRegex(oldName)})(${opacity})(?=\\s|"|'|\`|$|\\))`,
|
|
132
|
-
"
|
|
132
|
+
"gu"
|
|
133
133
|
),
|
|
134
134
|
replacement: `$1${prefix}-${newName}$3`,
|
|
135
135
|
});
|
|
@@ -140,7 +140,7 @@ function buildPatterns(renameMap: TokenRenameMap): Array<{
|
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
function escapeRegex(str: string): string {
|
|
143
|
-
return str.replace(/[.*+?^${}()|[\]\\]/
|
|
143
|
+
return str.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
/**
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai-agent-card-BXHwhWAU.js","names":[],"sources":["../src/components/ai-agent-card/ai-agent-card.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n BrainIcon,\n CheckCircleIcon,\n CircleIcon,\n CodeIcon,\n MagnifyingGlassIcon,\n RobotIcon,\n SpinnerGapIcon,\n WrenchIcon,\n XCircleIcon,\n} from \"@phosphor-icons/react\";\nimport type { ComponentProps, ElementType } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\n\n// ─── Variants ────────────────────────────────────────────────────────────────\n\nexport const SF_AI_AGENT_CARD_VARIANTS = {\n status: {\n idle: { classes: \"\", description: \"Agent is idle, not yet started\" },\n running: { classes: \"\", description: \"Agent is actively working\" },\n completed: { classes: \"\", description: \"Agent finished successfully\" },\n error: { classes: \"\", description: \"Agent encountered an error\" },\n },\n size: {\n sm: { classes: \"\", description: \"Compact card for dense grids\" },\n md: { classes: \"\", description: \"Default card size\" },\n },\n} as const;\n\nexport const SF_AI_AGENT_CARD_DEFAULT_VARIANTS = {\n status: \"idle\",\n size: \"md\",\n} as const;\n\nexport type SFAiAgentCardStatus = keyof typeof SF_AI_AGENT_CARD_VARIANTS.status;\nexport type SFAiAgentCardSize = keyof typeof SF_AI_AGENT_CARD_VARIANTS.size;\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type AiAgentCardProps = Omit<ComponentProps<\"button\">, \"children\"> & {\n /** Human-readable agent name (e.g. \"Explore\", \"Execute\"). */\n name: string;\n /** Agent type ID — used for icon mapping. */\n agentType?: string;\n /** Current status. @default \"idle\" */\n status?: SFAiAgentCardStatus;\n /** Model ID being used (e.g. \"claude-haiku-3.5\"). */\n modelId?: string;\n /** What the agent is currently doing. */\n currentTask?: string;\n /** Total elapsed duration in ms. */\n duration?: number;\n /** Number of tool calls made. */\n toolCallCount?: number;\n /** Whether this card is currently selected/active. */\n selected?: boolean;\n /** Custom icon override. */\n icon?: ElementType;\n /** Card size. @default \"md\" */\n size?: SFAiAgentCardSize;\n};\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nconst AGENT_TYPE_ICONS: Record<string, ElementType> = {\n explore: MagnifyingGlassIcon,\n search: MagnifyingGlassIcon,\n execute: CodeIcon,\n code: CodeIcon,\n plan: BrainIcon,\n think: BrainIcon,\n tool: WrenchIcon,\n build: WrenchIcon,\n};\n\nfunction getAgentIcon(\n agentType?: string,\n customIcon?: ElementType\n): ElementType {\n if (customIcon) return customIcon;\n if (agentType) {\n const lower = agentType.toLowerCase();\n for (const [key, icon] of Object.entries(AGENT_TYPE_ICONS)) {\n if (lower.includes(key)) return icon;\n }\n }\n return RobotIcon;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const s = Math.round(ms / 100) / 10;\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n const rem = Math.round(s % 60);\n return `${m}m ${rem}s`;\n}\n\nfunction getModelShortName(modelId?: string): string {\n if (!modelId) return \"\";\n return (\n modelId\n .split(\"/\")\n .pop()\n ?.replace(/^claude-/, \"\")\n .replace(/-\\d+$/, \"\") ?? modelId\n );\n}\n\n// ─── Status decorations ───────────────────────────────────────────────────────\n\nconst STATUS_DOT: Record<SFAiAgentCardStatus, string> = {\n idle: \"bg-sf-fill\",\n running: \"bg-sf-brand animate-pulse\",\n completed: \"bg-sf-success\",\n error: \"bg-sf-danger\",\n};\n\nfunction StatusIcon({\n status,\n size = 14,\n}: {\n status: SFAiAgentCardStatus;\n size?: number;\n}) {\n switch (status) {\n case \"running\":\n return (\n <SpinnerGapIcon size={size} className=\"animate-spin text-sf-brand\" />\n );\n case \"completed\":\n return <CheckCircleIcon size={size} className=\"text-sf-success\" />;\n case \"error\":\n return <XCircleIcon size={size} className=\"text-sf-danger\" />;\n default:\n return <CircleIcon size={size} className=\"text-sf-inactive\" />;\n }\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * `AiAgentCard` — compact card showing one agent's status in a commander dashboard.\n *\n * Displays: agent icon, name, status indicator, current task, model, duration,\n * and tool call count. Clickable for selection.\n *\n * @example\n * ```tsx\n * <AiAgentCard\n * name=\"Explore\"\n * agentType=\"explore\"\n * status=\"running\"\n * modelId=\"claude-haiku-3.5\"\n * currentTask=\"Scanning auth files...\"\n * duration={4200}\n * toolCallCount={3}\n * selected\n * onClick={handleSelect}\n * />\n * ```\n */\nexport const AiAgentCard = forwardRef<HTMLButtonElement, AiAgentCardProps>(\n (\n {\n name,\n agentType,\n status = SF_AI_AGENT_CARD_DEFAULT_VARIANTS.status,\n modelId,\n currentTask,\n duration,\n toolCallCount,\n selected,\n icon,\n size = SF_AI_AGENT_CARD_DEFAULT_VARIANTS.size,\n className,\n onClick,\n ...props\n },\n ref\n ) => {\n const Icon = getAgentIcon(agentType, icon);\n const modelShort = getModelShortName(modelId);\n const isSm = size === \"sm\";\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={selected}\n onClick={onClick}\n className={cn(\n \"group flex flex-col gap-2 rounded-xl border text-left transition-all\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sf-ring focus-visible:ring-offset-1\",\n isSm ? \"p-2.5\" : \"p-3.5\",\n selected\n ? \"border-sf-line bg-sf-recessed shadow-sm\"\n : \"border-sf-line bg-sf-elevated hover:border-sf-line hover:bg-sf-tint\",\n !onClick && \"cursor-default\",\n className\n )}\n {...props}\n >\n {/* Header row */}\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {/* Agent icon */}\n <div\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-lg\",\n isSm ? \"size-6\" : \"size-8\",\n status === \"running\"\n ? \"bg-sf-brand/10 text-sf-brand\"\n : status === \"completed\"\n ? \"bg-sf-tint text-sf-success\"\n : status === \"error\"\n ? \"bg-sf-tint text-sf-danger\"\n : \"bg-sf-fill text-sf-subtle\"\n )}\n >\n <Icon size={isSm ? 12 : 16} />\n </div>\n\n {/* Name */}\n <span\n className={cn(\n \"truncate font-medium text-sf-default\",\n isSm ? \"text-xs\" : \"text-sm\"\n )}\n >\n {name}\n </span>\n </div>\n\n {/* Status icon */}\n <StatusIcon status={status} size={isSm ? 12 : 14} />\n </div>\n\n {/* Current task */}\n {currentTask && (\n <p\n className={cn(\n \"truncate text-sf-subtle leading-snug\",\n isSm ? \"text-[10px]\" : \"text-xs\"\n )}\n >\n {currentTask}\n </p>\n )}\n\n {/* Footer row: model + stats */}\n {!isSm && (\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-1.5\">\n {/* Status dot + model */}\n <span\n className={cn(\n \"size-1.5 shrink-0 rounded-full\",\n STATUS_DOT[status]\n )}\n />\n {modelShort && (\n <span className=\"font-mono text-[10px] text-sf-inactive\">\n {modelShort}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2 text-[10px] text-sf-subtle\">\n {typeof toolCallCount === \"number\" && toolCallCount > 0 && (\n <span className=\"flex items-center gap-0.5\">\n <WrenchIcon size={9} />\n {toolCallCount}\n </span>\n )}\n {typeof duration === \"number\" && (\n <span>{formatDuration(duration)}</span>\n )}\n </div>\n </div>\n )}\n </button>\n );\n }\n);\n\nAiAgentCard.displayName = \"AiAgentCard\";\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai-code-block-BgtIxtZZ.js","names":[],"sources":["../src/components/ai-code-block/ai-code-block.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentProps, HTMLAttributes, ReactNode } from \"react\";\nimport { createContext, memo, useContext, useState } from \"react\";\nimport { highlight } from \"sugar-high\";\n\nimport { cn } from \"../../utils/cn\";\nimport { highlightToLines } from \"../../utils/highlight-to-react\";\nimport { Button } from \"../button\";\n\n// ─── Variants ────────────────────────────────────────────────────────────────\n\nexport const SF_AI_CODE_BLOCK_VARIANTS = {} as const;\nexport const SF_AI_CODE_BLOCK_DEFAULT_VARIANTS = {} as const;\n\n// ─── Context ─────────────────────────────────────────────────────────────────\n\ninterface AiCodeBlockContextValue {\n code: string;\n}\n\nconst AiCodeBlockContext = createContext<AiCodeBlockContextValue>({ code: \"\" });\n\n// ─── AiCodeBlock ─────────────────────────────────────────────────────────────\n\nexport type AiCodeBlockProps = HTMLAttributes<HTMLDivElement> & {\n /** The raw code string to display and make copyable. */\n code: string;\n /** Language identifier for syntax highlighting (display only, no highlighting applied). */\n language?: string;\n /** Show line numbers. @default false */\n showLineNumbers?: boolean;\n /** Extra content rendered in the top-right overlay (e.g. copy button). */\n children?: ReactNode;\n};\n\n/**\n * Displays a code block with monospace formatting and an optional copy button.\n * Does not include a syntax highlighter — avoids the heavy `react-syntax-highlighter`\n * dependency. Wrap with `AiCodeBlockCopyButton` for clipboard support.\n *\n * @example\n * ```tsx\n * <AiCodeBlock code={`const x = 1;`} language=\"ts\">\n * <AiCodeBlockCopyButton />\n * </AiCodeBlock>\n * ```\n */\nexport const AiCodeBlock = memo(\n ({\n code,\n language,\n showLineNumbers = false,\n className,\n children,\n ...props\n }: AiCodeBlockProps) => {\n const highlightedLines = highlightToLines(highlight(code));\n\n return (\n <AiCodeBlockContext.Provider value={{ code }}>\n <div\n className={cn(\n \"relative w-full overflow-hidden rounded-lg border border-sf-line bg-sf-recessed font-mono text-sm text-sf-default\",\n className\n )}\n {...props}\n >\n {language && (\n <div className=\"flex items-center justify-between border-b border-sf-line px-4 py-2\">\n <span className=\"text-sf-subtle text-xs\">{language}</span>\n {children && (\n <div className=\"flex items-center gap-2\">{children}</div>\n )}\n </div>\n )}\n <div className=\"overflow-x-auto\">\n <table className=\"w-full border-collapse\">\n <tbody>\n {highlightedLines.map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: line index is stable\n <tr key={i} className=\"leading-6\">\n {showLineNumbers && (\n <td className=\"select-none pr-4 pl-4 text-right text-sf-inactive\">\n {i + 1}\n </td>\n )}\n <td className={cn(\"pr-4\", !showLineNumbers && \"px-4\")}>\n <pre className=\"whitespace-pre\">{line}</pre>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {!language && children && (\n <div className=\"absolute top-2 right-2 flex items-center gap-2\">\n {children}\n </div>\n )}\n </div>\n </AiCodeBlockContext.Provider>\n );\n },\n (prev, next) =>\n prev.code === next.code &&\n prev.language === next.language &&\n prev.showLineNumbers === next.showLineNumbers\n);\n\nAiCodeBlock.displayName = \"AiCodeBlock\";\n\n// ─── AiCodeBlockCopyButton ───────────────────────────────────────────────────\n\nexport type AiCodeBlockCopyButtonProps = ComponentProps<typeof Button> & {\n /** Called after a successful copy. */\n onCopy?: () => void;\n /** Called if the clipboard API is unavailable or errors. */\n onError?: (error: Error) => void;\n /** How long (ms) to show the \"copied\" state. @default 2000 */\n timeout?: number;\n};\n\n/**\n * Copy-to-clipboard button for use inside `AiCodeBlock`.\n * Must be a descendant of `AiCodeBlock` to access the code via context.\n *\n * @example\n * ```tsx\n * <AiCodeBlock code=\"const x = 1;\" language=\"ts\">\n * <AiCodeBlockCopyButton />\n * </AiCodeBlock>\n * ```\n */\nexport function AiCodeBlockCopyButton({\n onCopy,\n onError,\n timeout = 2000,\n children,\n className,\n size = \"sm\",\n variant = \"ghost\",\n ...props\n}: AiCodeBlockCopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const { code } = useContext(AiCodeBlockContext);\n\n const handleCopy = async () => {\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.writeText) {\n onError?.(new Error(\"Clipboard API not available\"));\n return;\n }\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n onCopy?.();\n setTimeout(() => setCopied(false), timeout);\n } catch (err) {\n onError?.(err as Error);\n }\n };\n\n return (\n <Button\n className={cn(\"shrink-0\", className)}\n onClick={handleCopy}\n size={size}\n variant={variant}\n {...props}\n >\n {children ?? (copied ? \"Copied\" : \"Copy\")}\n </Button>\n );\n}\n"],"mappings":";;;;;;;;AAYA,IAAa,4BAA4B,EAAE;AAC3C,IAAa,oCAAoC,EAAE;AAQnD,IAAM,qBAAqB,cAAuC,EAAE,MAAM,IAAI,CAAC;;;;;;;;;;;;;AA2B/E,IAAa,cAAc,MACxB,EACC,MACA,UACA,kBAAkB,OAClB,WACA,UACA,GAAG,YACmB;CACtB,MAAM,mBAAmB,iBAAiB,UAAU,KAAK,CAAC;AAE1D,QACE,oBAAC,mBAAmB,UAApB;EAA6B,OAAO,EAAE,MAAM;YAC1C,qBAAC,OAAD;GACE,WAAW,GACT,qHACA,UACD;GACD,GAAI;aALN;IAOG,YACC,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,QAAD;MAAM,WAAU;gBAA0B;MAAgB,CAAA,EACzD,YACC,oBAAC,OAAD;MAAK,WAAU;MAA2B;MAAe,CAAA,CAEvD;;IAER,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,SAAD;MAAO,WAAU;gBACf,oBAAC,SAAD,EAAA,UACG,iBAAiB,KAAK,MAAM,MAE3B,qBAAC,MAAD;OAAY,WAAU;iBAAtB,CACG,mBACC,oBAAC,MAAD;QAAI,WAAU;kBACX,IAAI;QACF,CAAA,EAEP,oBAAC,MAAD;QAAI,WAAW,GAAG,QAAQ,CAAC,mBAAmB,OAAO;kBACnD,oBAAC,OAAD;SAAK,WAAU;mBAAkB;SAAW,CAAA;QACzC,CAAA,CACF;SATI,EASJ,CACL,EACI,CAAA;MACF,CAAA;KACJ,CAAA;IACL,CAAC,YAAY,YACZ,oBAAC,OAAD;KAAK,WAAU;KACZ;KACG,CAAA;IAEJ;;EACsB,CAAA;IAGjC,MAAM,SACL,KAAK,SAAS,KAAK,QACnB,KAAK,aAAa,KAAK,YACvB,KAAK,oBAAoB,KAAK,gBACjC;AAED,YAAY,cAAc;;;;;;;;;;;;AAwB1B,SAAgB,sBAAsB,EACpC,QACA,SACA,UAAU,KACV,UACA,WACA,OAAO,MACP,UAAU,SACV,GAAG,SAC0B;CAC7B,MAAM,CAAC,QAAQ,aAAa,SAAS,MAAM;CAC3C,MAAM,EAAE,SAAS,WAAW,mBAAmB;CAE/C,MAAM,aAAa,YAAY;AAC7B,MAAI,OAAO,cAAc,eAAe,CAAC,UAAU,WAAW,WAAW;AACvE,6BAAU,IAAI,MAAM,8BAA8B,CAAC;AACnD;;AAEF,MAAI;AACF,SAAM,UAAU,UAAU,UAAU,KAAK;AACzC,aAAU,KAAK;AACf,aAAU;AACV,oBAAiB,UAAU,MAAM,EAAE,QAAQ;WACpC,KAAK;AACZ,aAAU,IAAa;;;AAI3B,QACE,oBAAC,QAAD;EACE,WAAW,GAAG,YAAY,UAAU;EACpC,SAAS;EACH;EACG;EACT,GAAI;YAEH,aAAa,SAAS,WAAW;EAC3B,CAAA"}
|