@wallarm-org/claude-design 0.0.0-stage → 4.8.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/README.md +114 -2
- package/bin/claude-design.js +347 -0
- package/dist/SETUP.md +130 -0
- package/dist/UPDATE.md +84 -0
- package/dist/assets/Icons/activity.svg +1 -0
- package/dist/assets/Icons/alt.svg +1 -0
- package/dist/assets/Icons/android-neutral.svg +1 -0
- package/dist/assets/Icons/android.svg +1 -0
- package/dist/assets/Icons/api.svg +1 -0
- package/dist/assets/Icons/apple-music-neutral.svg +1 -0
- package/dist/assets/Icons/apple-music.svg +1 -0
- package/dist/assets/Icons/apple-neutral.svg +1 -0
- package/dist/assets/Icons/apple-podcasts-neutral.svg +1 -0
- package/dist/assets/Icons/apple-podcasts.svg +1 -0
- package/dist/assets/Icons/apple.svg +1 -0
- package/dist/assets/Icons/archive.svg +1 -0
- package/dist/assets/Icons/arrow-big-up-dash.svg +1 -0
- package/dist/assets/Icons/arrow-big-up.svg +1 -0
- package/dist/assets/Icons/arrow-down-left.svg +1 -0
- package/dist/assets/Icons/arrow-down-right.svg +1 -0
- package/dist/assets/Icons/arrow-down.svg +1 -0
- package/dist/assets/Icons/arrow-left.svg +1 -0
- package/dist/assets/Icons/arrow-right-alt.svg +1 -0
- package/dist/assets/Icons/arrow-right.svg +1 -0
- package/dist/assets/Icons/arrow-up-down.svg +1 -0
- package/dist/assets/Icons/arrow-up-left.svg +1 -0
- package/dist/assets/Icons/arrow-up-right.svg +1 -0
- package/dist/assets/Icons/arrow-up.svg +1 -0
- package/dist/assets/Icons/artstation-neutral.svg +1 -0
- package/dist/assets/Icons/artstation.svg +1 -0
- package/dist/assets/Icons/asterisk.svg +1 -0
- package/dist/assets/Icons/audio-waveform.svg +1 -0
- package/dist/assets/Icons/aws-neutral.svg +1 -0
- package/dist/assets/Icons/aws.svg +1 -0
- package/dist/assets/Icons/badge-check.svg +1 -0
- package/dist/assets/Icons/baidu-neutral.svg +1 -0
- package/dist/assets/Icons/baidu.svg +1 -0
- package/dist/assets/Icons/bandage.svg +1 -0
- package/dist/assets/Icons/behance-neutral.svg +1 -0
- package/dist/assets/Icons/behance.svg +1 -0
- package/dist/assets/Icons/bell-cog.svg +1 -0
- package/dist/assets/Icons/bell.svg +1 -0
- package/dist/assets/Icons/binary.svg +1 -0
- package/dist/assets/Icons/book-open.svg +1 -0
- package/dist/assets/Icons/book.svg +1 -0
- package/dist/assets/Icons/boosty-neutral.svg +1 -0
- package/dist/assets/Icons/boosty.svg +1 -0
- package/dist/assets/Icons/bot.svg +1 -0
- package/dist/assets/Icons/brain.svg +1 -0
- package/dist/assets/Icons/braze-neutral.svg +1 -0
- package/dist/assets/Icons/braze.svg +1 -0
- package/dist/assets/Icons/brevo-neutral.svg +1 -0
- package/dist/assets/Icons/brevo.svg +1 -0
- package/dist/assets/Icons/bug-off.svg +1 -0
- package/dist/assets/Icons/bug-play.svg +1 -0
- package/dist/assets/Icons/bug.svg +1 -0
- package/dist/assets/Icons/building.svg +1 -0
- package/dist/assets/Icons/building2.svg +1 -0
- package/dist/assets/Icons/calendar-check.svg +1 -0
- package/dist/assets/Icons/calendar-check2.svg +1 -0
- package/dist/assets/Icons/calendar-clock.svg +1 -0
- package/dist/assets/Icons/calendar-cog.svg +1 -0
- package/dist/assets/Icons/calendar-days.svg +1 -0
- package/dist/assets/Icons/calendar-fold.svg +1 -0
- package/dist/assets/Icons/calendar-heart.svg +1 -0
- package/dist/assets/Icons/calendar-minus.svg +1 -0
- package/dist/assets/Icons/calendar-minus2.svg +1 -0
- package/dist/assets/Icons/calendar-off.svg +1 -0
- package/dist/assets/Icons/calendar-plus.svg +1 -0
- package/dist/assets/Icons/calendar-plus2.svg +1 -0
- package/dist/assets/Icons/calendar-range.svg +1 -0
- package/dist/assets/Icons/calendar-search.svg +1 -0
- package/dist/assets/Icons/calendar-x.svg +1 -0
- package/dist/assets/Icons/calendar-x2.svg +1 -0
- package/dist/assets/Icons/calendar.svg +1 -0
- package/dist/assets/Icons/chart-area.svg +1 -0
- package/dist/assets/Icons/chart-bar.svg +1 -0
- package/dist/assets/Icons/chart-column.svg +1 -0
- package/dist/assets/Icons/chart-no-axes-column.svg +1 -0
- package/dist/assets/Icons/check-check.svg +1 -0
- package/dist/assets/Icons/check.svg +1 -0
- package/dist/assets/Icons/checkbox-indeterminate.svg +1 -0
- package/dist/assets/Icons/chevron-down.svg +1 -0
- package/dist/assets/Icons/chevron-first.svg +1 -0
- package/dist/assets/Icons/chevron-last.svg +1 -0
- package/dist/assets/Icons/chevron-left.svg +1 -0
- package/dist/assets/Icons/chevron-right.svg +1 -0
- package/dist/assets/Icons/chevron-up-down.svg +1 -0
- package/dist/assets/Icons/chevron-up.svg +1 -0
- package/dist/assets/Icons/chevrons-down-up.svg +1 -0
- package/dist/assets/Icons/chevrons-down.svg +1 -0
- package/dist/assets/Icons/chevrons-left-right.svg +1 -0
- package/dist/assets/Icons/chevrons-left.svg +1 -0
- package/dist/assets/Icons/chevrons-right-left.svg +1 -0
- package/dist/assets/Icons/chevrons-right.svg +1 -0
- package/dist/assets/Icons/chevrons-up-down.svg +1 -0
- package/dist/assets/Icons/chevrons-up.svg +1 -0
- package/dist/assets/Icons/circle-arrow-down.svg +1 -0
- package/dist/assets/Icons/circle-arrow-left.svg +1 -0
- package/dist/assets/Icons/circle-arrow-out-down-left.svg +1 -0
- package/dist/assets/Icons/circle-arrow-out-down-right.svg +1 -0
- package/dist/assets/Icons/circle-arrow-out-up-left.svg +1 -0
- package/dist/assets/Icons/circle-arrow-out-up-right.svg +1 -0
- package/dist/assets/Icons/circle-arrow-right.svg +1 -0
- package/dist/assets/Icons/circle-arrow-up.svg +1 -0
- package/dist/assets/Icons/circle-check-big.svg +1 -0
- package/dist/assets/Icons/circle-check.svg +1 -0
- package/dist/assets/Icons/circle-chevron-down.svg +1 -0
- package/dist/assets/Icons/circle-chevron-left.svg +1 -0
- package/dist/assets/Icons/circle-chevron-right.svg +1 -0
- package/dist/assets/Icons/circle-chevron-up.svg +1 -0
- package/dist/assets/Icons/circle-dashed.svg +1 -0
- package/dist/assets/Icons/circle-dot-dashed.svg +1 -0
- package/dist/assets/Icons/circle-ellipsis.svg +1 -0
- package/dist/assets/Icons/circle-gauge.svg +1 -0
- package/dist/assets/Icons/circle-help.svg +1 -0
- package/dist/assets/Icons/circle-minus.svg +1 -0
- package/dist/assets/Icons/circle-plus.svg +1 -0
- package/dist/assets/Icons/circle-slash.svg +1 -0
- package/dist/assets/Icons/circle-slash2.svg +1 -0
- package/dist/assets/Icons/circle-stop.svg +1 -0
- package/dist/assets/Icons/circle.svg +1 -0
- package/dist/assets/Icons/clipboard-check.svg +1 -0
- package/dist/assets/Icons/clipboard-x.svg +1 -0
- package/dist/assets/Icons/clipboard.svg +1 -0
- package/dist/assets/Icons/clock-fading.svg +1 -0
- package/dist/assets/Icons/clock.svg +1 -0
- package/dist/assets/Icons/cloud-off.svg +1 -0
- package/dist/assets/Icons/cloud-sync.svg +1 -0
- package/dist/assets/Icons/cloud.svg +1 -0
- package/dist/assets/Icons/code.svg +1 -0
- package/dist/assets/Icons/collapse.svg +1 -0
- package/dist/assets/Icons/columns3-cog.svg +1 -0
- package/dist/assets/Icons/command.svg +1 -0
- package/dist/assets/Icons/compass.svg +1 -0
- package/dist/assets/Icons/copy-slash.svg +1 -0
- package/dist/assets/Icons/copy.svg +1 -0
- package/dist/assets/Icons/corner-down-left.svg +1 -0
- package/dist/assets/Icons/corner-down-right.svg +1 -0
- package/dist/assets/Icons/corner-left-down.svg +1 -0
- package/dist/assets/Icons/corner-left-up.svg +1 -0
- package/dist/assets/Icons/corner-right-down.svg +1 -0
- package/dist/assets/Icons/corner-right-up.svg +1 -0
- package/dist/assets/Icons/corner-up-left.svg +1 -0
- package/dist/assets/Icons/corner-up-right.svg +1 -0
- package/dist/assets/Icons/cpu.svg +1 -0
- package/dist/assets/Icons/credit-card.svg +1 -0
- package/dist/assets/Icons/crosshair.svg +1 -0
- package/dist/assets/Icons/ctrl.svg +1 -0
- package/dist/assets/Icons/database.svg +1 -0
- package/dist/assets/Icons/devianart-neutral.svg +1 -0
- package/dist/assets/Icons/devianart.svg +1 -0
- package/dist/assets/Icons/discord-neutral.svg +1 -0
- package/dist/assets/Icons/discord.svg +1 -0
- package/dist/assets/Icons/dollar-sign.svg +1 -0
- package/dist/assets/Icons/dot.svg +1 -0
- package/dist/assets/Icons/download.svg +1 -0
- package/dist/assets/Icons/dprofile-neutral.svg +1 -0
- package/dist/assets/Icons/dprofile.svg +1 -0
- package/dist/assets/Icons/dribbble-neutral.svg +1 -0
- package/dist/assets/Icons/dribbble.svg +1 -0
- package/dist/assets/Icons/droplet.svg +1 -0
- package/dist/assets/Icons/duplicate.svg +1 -0
- package/dist/assets/Icons/dzen-neutral.svg +1 -0
- package/dist/assets/Icons/dzen.svg +1 -0
- package/dist/assets/Icons/earth-lock.svg +1 -0
- package/dist/assets/Icons/earth.svg +1 -0
- package/dist/assets/Icons/ellipsis.svg +1 -0
- package/dist/assets/Icons/expand.svg +1 -0
- package/dist/assets/Icons/external-link.svg +1 -0
- package/dist/assets/Icons/eye-off.svg +1 -0
- package/dist/assets/Icons/eye.svg +1 -0
- package/dist/assets/Icons/facebook-neutral.svg +1 -0
- package/dist/assets/Icons/facebook.svg +1 -0
- package/dist/assets/Icons/fast-forward.svg +1 -0
- package/dist/assets/Icons/figma-neutral.svg +1 -0
- package/dist/assets/Icons/figma.svg +1 -0
- package/dist/assets/Icons/file-down.svg +1 -0
- package/dist/assets/Icons/file-plus.svg +1 -0
- package/dist/assets/Icons/file-text.svg +1 -0
- package/dist/assets/Icons/file.svg +1 -0
- package/dist/assets/Icons/film.svg +1 -0
- package/dist/assets/Icons/filter-x.svg +1 -0
- package/dist/assets/Icons/filter.svg +1 -0
- package/dist/assets/Icons/fingerprint-pattern.svg +1 -0
- package/dist/assets/Icons/flag.svg +1 -0
- package/dist/assets/Icons/flask-conical.svg +1 -0
- package/dist/assets/Icons/folder.svg +1 -0
- package/dist/assets/Icons/funnel-plus.svg +1 -0
- package/dist/assets/Icons/ghost.svg +1 -0
- package/dist/assets/Icons/git-branch.svg +1 -0
- package/dist/assets/Icons/git-commit-horizontal.svg +1 -0
- package/dist/assets/Icons/git-commit-vertical.svg +1 -0
- package/dist/assets/Icons/git-compare-arrows-alt.svg +1 -0
- package/dist/assets/Icons/git-compare-arrows.svg +1 -0
- package/dist/assets/Icons/git-compare.svg +1 -0
- package/dist/assets/Icons/git-fork.svg +1 -0
- package/dist/assets/Icons/git-graph.svg +1 -0
- package/dist/assets/Icons/git-merge.svg +1 -0
- package/dist/assets/Icons/git-pull-request-arrow.svg +1 -0
- package/dist/assets/Icons/git-pull-request-closed.svg +1 -0
- package/dist/assets/Icons/git-pull-request-create-arrow.svg +1 -0
- package/dist/assets/Icons/git-pull-request-create.svg +1 -0
- package/dist/assets/Icons/git-pull-request-draft.svg +1 -0
- package/dist/assets/Icons/git-pull-request.svg +1 -0
- package/dist/assets/Icons/github-neutral.svg +1 -0
- package/dist/assets/Icons/github.svg +1 -0
- package/dist/assets/Icons/globe-lock.svg +1 -0
- package/dist/assets/Icons/globe.svg +1 -0
- package/dist/assets/Icons/gmail-neutral.svg +1 -0
- package/dist/assets/Icons/gmail.svg +1 -0
- package/dist/assets/Icons/google-meet-neutral.svg +1 -0
- package/dist/assets/Icons/google-meet.svg +1 -0
- package/dist/assets/Icons/google-neutral.svg +1 -0
- package/dist/assets/Icons/google-play-neutral.svg +1 -0
- package/dist/assets/Icons/google-play.svg +1 -0
- package/dist/assets/Icons/google-podcast-neutral.svg +1 -0
- package/dist/assets/Icons/google-podcast.svg +1 -0
- package/dist/assets/Icons/google.svg +1 -0
- package/dist/assets/Icons/grip-horizontal.svg +1 -0
- package/dist/assets/Icons/grip-vertical.svg +1 -0
- package/dist/assets/Icons/hammer.svg +1 -0
- package/dist/assets/Icons/heart-pulse.svg +1 -0
- package/dist/assets/Icons/history.svg +1 -0
- package/dist/assets/Icons/home.svg +1 -0
- package/dist/assets/Icons/imo-neutral.svg +1 -0
- package/dist/assets/Icons/imo.svg +1 -0
- package/dist/assets/Icons/infinity.svg +1 -0
- package/dist/assets/Icons/info.svg +1 -0
- package/dist/assets/Icons/infobip-neutral.svg +1 -0
- package/dist/assets/Icons/infobip.svg +1 -0
- package/dist/assets/Icons/instagram-neutral.svg +1 -0
- package/dist/assets/Icons/instagram.svg +1 -0
- package/dist/assets/Icons/key-round.svg +1 -0
- package/dist/assets/Icons/key-square.svg +1 -0
- package/dist/assets/Icons/keyboard.svg +1 -0
- package/dist/assets/Icons/kickstarter-neutral.svg +1 -0
- package/dist/assets/Icons/kickstarter.svg +1 -0
- package/dist/assets/Icons/laptop.svg +1 -0
- package/dist/assets/Icons/layers.svg +1 -0
- package/dist/assets/Icons/layers2.svg +1 -0
- package/dist/assets/Icons/layers3.svg +1 -0
- package/dist/assets/Icons/layout-dashboard.svg +1 -0
- package/dist/assets/Icons/layout-grid.svg +1 -0
- package/dist/assets/Icons/layout-list.svg +1 -0
- package/dist/assets/Icons/layout-panel-left.svg +1 -0
- package/dist/assets/Icons/layout-panel-top.svg +1 -0
- package/dist/assets/Icons/layout-template.svg +1 -0
- package/dist/assets/Icons/library-big.svg +1 -0
- package/dist/assets/Icons/life-buoy.svg +1 -0
- package/dist/assets/Icons/lightbulb-off.svg +1 -0
- package/dist/assets/Icons/lightbulb.svg +1 -0
- package/dist/assets/Icons/line-neutral.svg +1 -0
- package/dist/assets/Icons/line.svg +1 -0
- package/dist/assets/Icons/link.svg +1 -0
- package/dist/assets/Icons/link2-off.svg +1 -0
- package/dist/assets/Icons/link2.svg +1 -0
- package/dist/assets/Icons/linkedin-neutral.svg +1 -0
- package/dist/assets/Icons/linkedin.svg +1 -0
- package/dist/assets/Icons/list-checks.svg +1 -0
- package/dist/assets/Icons/list-collapse.svg +1 -0
- package/dist/assets/Icons/list-filter.svg +1 -0
- package/dist/assets/Icons/list-minus.svg +1 -0
- package/dist/assets/Icons/list-ordered.svg +1 -0
- package/dist/assets/Icons/list-plus.svg +1 -0
- package/dist/assets/Icons/list-restart.svg +1 -0
- package/dist/assets/Icons/list-start.svg +1 -0
- package/dist/assets/Icons/list-todo.svg +1 -0
- package/dist/assets/Icons/list-tree.svg +1 -0
- package/dist/assets/Icons/list-video.svg +1 -0
- package/dist/assets/Icons/list-x.svg +1 -0
- package/dist/assets/Icons/list.svg +1 -0
- package/dist/assets/Icons/loader-circle.svg +1 -0
- package/dist/assets/Icons/loader.svg +1 -0
- package/dist/assets/Icons/lock-open.svg +1 -0
- package/dist/assets/Icons/lock.svg +1 -0
- package/dist/assets/Icons/log-in.svg +1 -0
- package/dist/assets/Icons/log-out.svg +1 -0
- package/dist/assets/Icons/mail-check.svg +1 -0
- package/dist/assets/Icons/mail-minus.svg +1 -0
- package/dist/assets/Icons/mail-open.svg +1 -0
- package/dist/assets/Icons/mail-plus.svg +1 -0
- package/dist/assets/Icons/mail-question.svg +1 -0
- package/dist/assets/Icons/mail-search.svg +1 -0
- package/dist/assets/Icons/mail-warning.svg +1 -0
- package/dist/assets/Icons/mail-x.svg +1 -0
- package/dist/assets/Icons/mail.svg +1 -0
- package/dist/assets/Icons/mailbox.svg +1 -0
- package/dist/assets/Icons/mailersend-neutral.svg +1 -0
- package/dist/assets/Icons/mailersend.svg +1 -0
- package/dist/assets/Icons/mailgun-neutral.svg +1 -0
- package/dist/assets/Icons/mailgun.svg +1 -0
- package/dist/assets/Icons/mailjet-neutral.svg +1 -0
- package/dist/assets/Icons/mailjet.svg +1 -0
- package/dist/assets/Icons/mails.svg +1 -0
- package/dist/assets/Icons/mailtrap-neutral.svg +1 -0
- package/dist/assets/Icons/mailtrap.svg +1 -0
- package/dist/assets/Icons/mandrill-neutral.svg +1 -0
- package/dist/assets/Icons/mandrill.svg +1 -0
- package/dist/assets/Icons/map-pin.svg +1 -0
- package/dist/assets/Icons/maqsam-neutral.svg +1 -0
- package/dist/assets/Icons/maqsam.svg +1 -0
- package/dist/assets/Icons/mattermost-neutral.svg +1 -0
- package/dist/assets/Icons/mattermost.svg +1 -0
- package/dist/assets/Icons/maximize.svg +1 -0
- package/dist/assets/Icons/maximize2.svg +1 -0
- package/dist/assets/Icons/medium-neutral.svg +1 -0
- package/dist/assets/Icons/medium.svg +1 -0
- package/dist/assets/Icons/megaphone-off.svg +1 -0
- package/dist/assets/Icons/megaphone.svg +1 -0
- package/dist/assets/Icons/menu.svg +1 -0
- package/dist/assets/Icons/merge.svg +1 -0
- package/dist/assets/Icons/message-square-code.svg +1 -0
- package/dist/assets/Icons/message-square-dashed.svg +1 -0
- package/dist/assets/Icons/message-square-diff.svg +1 -0
- package/dist/assets/Icons/message-square-dot.svg +1 -0
- package/dist/assets/Icons/message-square-heart.svg +1 -0
- package/dist/assets/Icons/message-square-off.svg +1 -0
- package/dist/assets/Icons/message-square-plus.svg +1 -0
- package/dist/assets/Icons/message-square-quote.svg +1 -0
- package/dist/assets/Icons/message-square-reply.svg +1 -0
- package/dist/assets/Icons/message-square-share.svg +1 -0
- package/dist/assets/Icons/message-square-text.svg +1 -0
- package/dist/assets/Icons/message-square-warning.svg +1 -0
- package/dist/assets/Icons/message-square-x.svg +1 -0
- package/dist/assets/Icons/message-square.svg +1 -0
- package/dist/assets/Icons/messages-square.svg +1 -0
- package/dist/assets/Icons/messenger-neutral.svg +1 -0
- package/dist/assets/Icons/messenger.svg +1 -0
- package/dist/assets/Icons/microsoft-neutral.svg +1 -0
- package/dist/assets/Icons/microsoft-teams-neutral.svg +1 -0
- package/dist/assets/Icons/microsoft-teams.svg +1 -0
- package/dist/assets/Icons/microsoft.svg +1 -0
- package/dist/assets/Icons/minimize.svg +1 -0
- package/dist/assets/Icons/minimize2.svg +1 -0
- package/dist/assets/Icons/minus.svg +1 -0
- package/dist/assets/Icons/moon.svg +1 -0
- package/dist/assets/Icons/mouse-pointer-ban.svg +1 -0
- package/dist/assets/Icons/mouse-pointer-click.svg +1 -0
- package/dist/assets/Icons/mouse-pointer.svg +1 -0
- package/dist/assets/Icons/mouse-pointer2.svg +1 -0
- package/dist/assets/Icons/mouse.svg +1 -0
- package/dist/assets/Icons/move-diagonal.svg +1 -0
- package/dist/assets/Icons/move-diagonal2.svg +1 -0
- package/dist/assets/Icons/move-down-left.svg +1 -0
- package/dist/assets/Icons/move-down-right.svg +1 -0
- package/dist/assets/Icons/move-down.svg +1 -0
- package/dist/assets/Icons/move-horizontal.svg +1 -0
- package/dist/assets/Icons/move-left.svg +1 -0
- package/dist/assets/Icons/move-right.svg +1 -0
- package/dist/assets/Icons/move-up-left.svg +1 -0
- package/dist/assets/Icons/move-up-right.svg +1 -0
- package/dist/assets/Icons/move-up.svg +1 -0
- package/dist/assets/Icons/move-vertical.svg +1 -0
- package/dist/assets/Icons/move3-d.svg +1 -0
- package/dist/assets/Icons/netcore-neutral.svg +1 -0
- package/dist/assets/Icons/netcore.svg +1 -0
- package/dist/assets/Icons/notebook-pen.svg +1 -0
- package/dist/assets/Icons/notebook-tabs.svg +1 -0
- package/dist/assets/Icons/notebook-text.svg +1 -0
- package/dist/assets/Icons/notebook.svg +1 -0
- package/dist/assets/Icons/notepad-text-dashed.svg +1 -0
- package/dist/assets/Icons/notepad-text.svg +1 -0
- package/dist/assets/Icons/notion-neutral.svg +1 -0
- package/dist/assets/Icons/notion.svg +1 -0
- package/dist/assets/Icons/octagon-alert.svg +1 -0
- package/dist/assets/Icons/octagon-pause.svg +1 -0
- package/dist/assets/Icons/octagon-x.svg +1 -0
- package/dist/assets/Icons/octagon.svg +1 -0
- package/dist/assets/Icons/ok-neutral.svg +1 -0
- package/dist/assets/Icons/ok-only-sign-neutral.svg +1 -0
- package/dist/assets/Icons/ok-only-sign.svg +1 -0
- package/dist/assets/Icons/ok.svg +1 -0
- package/dist/assets/Icons/onlyfans-neutral.svg +1 -0
- package/dist/assets/Icons/onlyfans.svg +1 -0
- package/dist/assets/Icons/option.svg +1 -0
- package/dist/assets/Icons/outlook365-neutral.svg +1 -0
- package/dist/assets/Icons/outlook365.svg +1 -0
- package/dist/assets/Icons/paintbrush.svg +1 -0
- package/dist/assets/Icons/panel-bottom-open.svg +1 -0
- package/dist/assets/Icons/panel-bottom.svg +1 -0
- package/dist/assets/Icons/panel-left-close.svg +1 -0
- package/dist/assets/Icons/panel-left-dashed.svg +1 -0
- package/dist/assets/Icons/panel-left-open.svg +1 -0
- package/dist/assets/Icons/panel-left.svg +1 -0
- package/dist/assets/Icons/panel-right-animated.svg +1 -0
- package/dist/assets/Icons/panel-right-close.svg +1 -0
- package/dist/assets/Icons/panel-right-dashed.svg +1 -0
- package/dist/assets/Icons/panel-right-open.svg +1 -0
- package/dist/assets/Icons/panel-right.svg +1 -0
- package/dist/assets/Icons/panel-top-bottom-dashed.svg +1 -0
- package/dist/assets/Icons/panel-top-close.svg +1 -0
- package/dist/assets/Icons/panel-top-open.svg +1 -0
- package/dist/assets/Icons/panel-top.svg +1 -0
- package/dist/assets/Icons/panels-left-bottom.svg +1 -0
- package/dist/assets/Icons/panels-right-bottom.svg +1 -0
- package/dist/assets/Icons/panels-top-left.svg +1 -0
- package/dist/assets/Icons/paperclip.svg +1 -0
- package/dist/assets/Icons/patreon-neutral.svg +1 -0
- package/dist/assets/Icons/patreon.svg +1 -0
- package/dist/assets/Icons/paypal-neutral.svg +1 -0
- package/dist/assets/Icons/paypal.svg +1 -0
- package/dist/assets/Icons/pen-line.svg +1 -0
- package/dist/assets/Icons/pen-off.svg +1 -0
- package/dist/assets/Icons/pen-tool.svg +1 -0
- package/dist/assets/Icons/pen.svg +1 -0
- package/dist/assets/Icons/pencil-line.svg +1 -0
- package/dist/assets/Icons/pencil-off.svg +1 -0
- package/dist/assets/Icons/pencil-ruler.svg +1 -0
- package/dist/assets/Icons/pencil.svg +1 -0
- package/dist/assets/Icons/pentagon.svg +1 -0
- package/dist/assets/Icons/percentage.svg +1 -0
- package/dist/assets/Icons/phone.svg +1 -0
- package/dist/assets/Icons/pin-off.svg +1 -0
- package/dist/assets/Icons/pin.svg +1 -0
- package/dist/assets/Icons/pinterest-neutral.svg +1 -0
- package/dist/assets/Icons/pinterest.svg +1 -0
- package/dist/assets/Icons/play.svg +1 -0
- package/dist/assets/Icons/plug.svg +1 -0
- package/dist/assets/Icons/plunk-neutral.svg +1 -0
- package/dist/assets/Icons/plunk.svg +1 -0
- package/dist/assets/Icons/plus.svg +1 -0
- package/dist/assets/Icons/postmark-neutral.svg +1 -0
- package/dist/assets/Icons/postmark.svg +1 -0
- package/dist/assets/Icons/product-hunt-neutral.svg +1 -0
- package/dist/assets/Icons/product-hunt.svg +1 -0
- package/dist/assets/Icons/quora-neutral.svg +1 -0
- package/dist/assets/Icons/quora.svg +1 -0
- package/dist/assets/Icons/quote.svg +1 -0
- package/dist/assets/Icons/radar.svg +1 -0
- package/dist/assets/Icons/reddit-neutral.svg +1 -0
- package/dist/assets/Icons/reddit.svg +1 -0
- package/dist/assets/Icons/redo-dot.svg +1 -0
- package/dist/assets/Icons/redo.svg +1 -0
- package/dist/assets/Icons/redo2.svg +1 -0
- package/dist/assets/Icons/refresh-ccw.svg +1 -0
- package/dist/assets/Icons/refresh-cw-off.svg +1 -0
- package/dist/assets/Icons/resend-neutral.svg +1 -0
- package/dist/assets/Icons/resend.svg +1 -0
- package/dist/assets/Icons/rss.svg +1 -0
- package/dist/assets/Icons/rules.svg +1 -0
- package/dist/assets/Icons/scan-line.svg +1 -0
- package/dist/assets/Icons/scroll-text.svg +1 -0
- package/dist/assets/Icons/search-hint.svg +1 -0
- package/dist/assets/Icons/search-x.svg +1 -0
- package/dist/assets/Icons/search.svg +1 -0
- package/dist/assets/Icons/sendgrid-neutral.svg +1 -0
- package/dist/assets/Icons/sendgrid.svg +1 -0
- package/dist/assets/Icons/server.svg +1 -0
- package/dist/assets/Icons/ses-neutral.svg +1 -0
- package/dist/assets/Icons/ses.svg +1 -0
- package/dist/assets/Icons/settings.svg +1 -0
- package/dist/assets/Icons/settings2.svg +1 -0
- package/dist/assets/Icons/shapes.svg +1 -0
- package/dist/assets/Icons/share.svg +1 -0
- package/dist/assets/Icons/sheet.svg +1 -0
- package/dist/assets/Icons/shield-alert.svg +1 -0
- package/dist/assets/Icons/shield-ban.svg +1 -0
- package/dist/assets/Icons/shield-check.svg +1 -0
- package/dist/assets/Icons/shield-ellipsis.svg +1 -0
- package/dist/assets/Icons/shield-half.svg +1 -0
- package/dist/assets/Icons/shield-minus.svg +1 -0
- package/dist/assets/Icons/shield-off.svg +1 -0
- package/dist/assets/Icons/shield-plus.svg +1 -0
- package/dist/assets/Icons/shield-question.svg +1 -0
- package/dist/assets/Icons/shield-user.svg +1 -0
- package/dist/assets/Icons/shield-x.svg +1 -0
- package/dist/assets/Icons/shield.svg +1 -0
- package/dist/assets/Icons/shift.svg +1 -0
- package/dist/assets/Icons/signal-neutral.svg +1 -0
- package/dist/assets/Icons/signal.svg +1 -0
- package/dist/assets/Icons/signpost.svg +1 -0
- package/dist/assets/Icons/sina-weibo-neutral.svg +1 -0
- package/dist/assets/Icons/sina-weibo.svg +1 -0
- package/dist/assets/Icons/skull.svg +1 -0
- package/dist/assets/Icons/skype-neutral.svg +1 -0
- package/dist/assets/Icons/skype.svg +1 -0
- package/dist/assets/Icons/slack-neutral.svg +1 -0
- package/dist/assets/Icons/slack.svg +1 -0
- package/dist/assets/Icons/sliders-horizontal.svg +1 -0
- package/dist/assets/Icons/sliders-vertical.svg +1 -0
- package/dist/assets/Icons/smtp-neutral.svg +1 -0
- package/dist/assets/Icons/smtp.svg +1 -0
- package/dist/assets/Icons/snapchat-neutral.svg +1 -0
- package/dist/assets/Icons/snapchat.svg +1 -0
- package/dist/assets/Icons/soundcloud-neutral.svg +1 -0
- package/dist/assets/Icons/soundcloud.svg +1 -0
- package/dist/assets/Icons/space.svg +1 -0
- package/dist/assets/Icons/sparkpost-neutral.svg +1 -0
- package/dist/assets/Icons/sparkpost.svg +1 -0
- package/dist/assets/Icons/speed.svg +1 -0
- package/dist/assets/Icons/split.svg +1 -0
- package/dist/assets/Icons/spotify-neutral.svg +1 -0
- package/dist/assets/Icons/spotify.svg +1 -0
- package/dist/assets/Icons/square-arrow-out-up-right.svg +1 -0
- package/dist/assets/Icons/square-minus.svg +1 -0
- package/dist/assets/Icons/square-pen.svg +1 -0
- package/dist/assets/Icons/square-plus.svg +1 -0
- package/dist/assets/Icons/square-user-round.svg +1 -0
- package/dist/assets/Icons/stack-overflow-neutral.svg +1 -0
- package/dist/assets/Icons/stack-overflow.svg +1 -0
- package/dist/assets/Icons/star.svg +1 -0
- package/dist/assets/Icons/sun.svg +1 -0
- package/dist/assets/Icons/syringe.svg +1 -0
- package/dist/assets/Icons/tag.svg +1 -0
- package/dist/assets/Icons/target.svg +1 -0
- package/dist/assets/Icons/teams-neutral.svg +1 -0
- package/dist/assets/Icons/teams.svg +1 -0
- package/dist/assets/Icons/telegram-neutral.svg +1 -0
- package/dist/assets/Icons/telegram-only-sign-neutral.svg +1 -0
- package/dist/assets/Icons/telegram-only-sign.svg +1 -0
- package/dist/assets/Icons/telegram.svg +1 -0
- package/dist/assets/Icons/terminal.svg +1 -0
- package/dist/assets/Icons/test-policies.svg +1 -0
- package/dist/assets/Icons/threads-neutral.svg +1 -0
- package/dist/assets/Icons/threads.svg +1 -0
- package/dist/assets/Icons/thumbs-down.svg +1 -0
- package/dist/assets/Icons/thumbs-up.svg +1 -0
- package/dist/assets/Icons/tiktok-neutral.svg +1 -0
- package/dist/assets/Icons/tiktok.svg +1 -0
- package/dist/assets/Icons/tinder-neutral.svg +1 -0
- package/dist/assets/Icons/tinder.svg +1 -0
- package/dist/assets/Icons/trash.svg +1 -0
- package/dist/assets/Icons/trash2.svg +1 -0
- package/dist/assets/Icons/triangle-alert.svg +1 -0
- package/dist/assets/Icons/tumblr-neutral.svg +1 -0
- package/dist/assets/Icons/tumblr.svg +1 -0
- package/dist/assets/Icons/twitch-neutral.svg +1 -0
- package/dist/assets/Icons/twitch.svg +1 -0
- package/dist/assets/Icons/undo-dot.svg +1 -0
- package/dist/assets/Icons/undo.svg +1 -0
- package/dist/assets/Icons/undo2.svg +1 -0
- package/dist/assets/Icons/unplug.svg +1 -0
- package/dist/assets/Icons/user-check.svg +1 -0
- package/dist/assets/Icons/user-minus.svg +1 -0
- package/dist/assets/Icons/user-plus.svg +1 -0
- package/dist/assets/Icons/user-round-x.svg +1 -0
- package/dist/assets/Icons/user-round.svg +1 -0
- package/dist/assets/Icons/user.svg +1 -0
- package/dist/assets/Icons/username.svg +1 -0
- package/dist/assets/Icons/users-round.svg +1 -0
- package/dist/assets/Icons/users.svg +1 -0
- package/dist/assets/Icons/viber-neutral.svg +1 -0
- package/dist/assets/Icons/viber.svg +1 -0
- package/dist/assets/Icons/video.svg +1 -0
- package/dist/assets/Icons/vimeo-neutral.svg +1 -0
- package/dist/assets/Icons/vimeo.svg +1 -0
- package/dist/assets/Icons/vk-music-neutral.svg +1 -0
- package/dist/assets/Icons/vk-music.svg +1 -0
- package/dist/assets/Icons/vk-neutral.svg +1 -0
- package/dist/assets/Icons/vk-only-sign-neutral.svg +1 -0
- package/dist/assets/Icons/vk-only-sign.svg +1 -0
- package/dist/assets/Icons/vk.svg +1 -0
- package/dist/assets/Icons/webhook-neutral.svg +1 -0
- package/dist/assets/Icons/webhook.svg +1 -0
- package/dist/assets/Icons/wechat-neutral.svg +1 -0
- package/dist/assets/Icons/wechat.svg +1 -0
- package/dist/assets/Icons/whatsapp-badge-neutral.svg +1 -0
- package/dist/assets/Icons/whatsapp-badge.svg +1 -0
- package/dist/assets/Icons/whatsapp-neutral.svg +1 -0
- package/dist/assets/Icons/whatsapp.svg +1 -0
- package/dist/assets/Icons/workflow.svg +1 -0
- package/dist/assets/Icons/wrap-text.svg +1 -0
- package/dist/assets/Icons/wrench.svg +1 -0
- package/dist/assets/Icons/x-ex-twitter-neutral.svg +1 -0
- package/dist/assets/Icons/x-ex-twitter.svg +1 -0
- package/dist/assets/Icons/x.svg +1 -0
- package/dist/assets/Icons/xing-neutral.svg +1 -0
- package/dist/assets/Icons/xing.svg +1 -0
- package/dist/assets/Icons/yandex-music-neutral.svg +1 -0
- package/dist/assets/Icons/yandex-music.svg +1 -0
- package/dist/assets/Icons/yelp-neutral.svg +1 -0
- package/dist/assets/Icons/yelp.svg +1 -0
- package/dist/assets/Icons/youtube-music-neutral.svg +1 -0
- package/dist/assets/Icons/youtube-music.svg +1 -0
- package/dist/assets/Icons/youtube-neutral.svg +1 -0
- package/dist/assets/Icons/youtube-shorts-neutral.svg +1 -0
- package/dist/assets/Icons/youtube-shorts.svg +1 -0
- package/dist/assets/Icons/youtube.svg +1 -0
- package/dist/assets/Icons/zap.svg +1 -0
- package/dist/assets/Icons/zoom-in.svg +1 -0
- package/dist/assets/Icons/zoom-neutral.svg +1 -0
- package/dist/assets/Icons/zoom-out.svg +1 -0
- package/dist/assets/Icons/zoom.svg +1 -0
- package/dist/assets/Icons/zulip-neutral.svg +1 -0
- package/dist/assets/Icons/zulip.svg +1 -0
- package/dist/assets/Logos/wallarm.svg +1 -0
- package/dist/assets.json +4666 -0
- package/dist/project/README.md +265 -0
- package/dist/project/components/Accordion/README.md +354 -0
- package/dist/project/components/Accordion/preview.html +2 -0
- package/dist/project/components/Accordion/stories.js +12 -0
- package/dist/project/components/AgentAvatar/README.md +127 -0
- package/dist/project/components/AgentAvatar/preview.html +2 -0
- package/dist/project/components/AgentAvatar/stories.js +12 -0
- package/dist/project/components/AgentAvatar/stories.md +1805 -0
- package/dist/project/components/AgentGlyph/README.md +1182 -0
- package/dist/project/components/AgentGlyph/preview.html +2 -0
- package/dist/project/components/AgentGlyph/stories.js +12 -0
- package/dist/project/components/AgentLookBuilder/README.md +269 -0
- package/dist/project/components/AgentLookBuilder/preview.html +2 -0
- package/dist/project/components/AgentLookBuilder/stories.js +12 -0
- package/dist/project/components/Alert/README.md +492 -0
- package/dist/project/components/Alert/preview.html +2 -0
- package/dist/project/components/Alert/stories.js +12 -0
- package/dist/project/components/AnimatedBackground/README.md +124 -0
- package/dist/project/components/AnimatedBackground/preview.html +2 -0
- package/dist/project/components/AnimatedBackground/stories.js +12 -0
- package/dist/project/components/AppShell/README.md +75 -0
- package/dist/project/components/AppShell/preview.html +2 -0
- package/dist/project/components/AppShell/stories.js +28 -0
- package/dist/project/components/AppShell/stories.md +2878 -0
- package/dist/project/components/ApprovalCard/README.md +353 -0
- package/dist/project/components/ApprovalCard/preview.html +2 -0
- package/dist/project/components/ApprovalCard/stories.js +12 -0
- package/dist/project/components/AreaChart/README.md +673 -0
- package/dist/project/components/AreaChart/preview.html +2 -0
- package/dist/project/components/AreaChart/stories.js +12 -0
- package/dist/project/components/AssistantMessage/README.md +724 -0
- package/dist/project/components/AssistantMessage/preview.html +2 -0
- package/dist/project/components/AssistantMessage/stories.js +55 -0
- package/dist/project/components/Attribute/README.md +1174 -0
- package/dist/project/components/Attribute/preview.html +2 -0
- package/dist/project/components/Attribute/stories.js +12 -0
- package/dist/project/components/Avatar/README.md +416 -0
- package/dist/project/components/Avatar/preview.html +2 -0
- package/dist/project/components/Avatar/stories.js +12 -0
- package/dist/project/components/Badge/README.md +853 -0
- package/dist/project/components/Badge/preview.html +2 -0
- package/dist/project/components/Badge/stories.js +12 -0
- package/dist/project/components/Banner/README.md +341 -0
- package/dist/project/components/Banner/preview.html +2 -0
- package/dist/project/components/Banner/stories.js +12 -0
- package/dist/project/components/BarList/README.md +757 -0
- package/dist/project/components/BarList/preview.html +2 -0
- package/dist/project/components/BarList/stories.js +12 -0
- package/dist/project/components/Breadcrumbs/README.md +274 -0
- package/dist/project/components/Breadcrumbs/preview.html +2 -0
- package/dist/project/components/Breadcrumbs/stories.js +12 -0
- package/dist/project/components/BulkBar/README.md +19 -0
- package/dist/project/components/Button/README.md +467 -0
- package/dist/project/components/Button/preview.html +2 -0
- package/dist/project/components/Button/stories.js +12 -0
- package/dist/project/components/Calendar/README.md +654 -0
- package/dist/project/components/Calendar/preview.html +2 -0
- package/dist/project/components/Calendar/stories.js +12 -0
- package/dist/project/components/Card/README.md +367 -0
- package/dist/project/components/Card/preview.html +2 -0
- package/dist/project/components/Card/stories.js +12 -0
- package/dist/project/components/ChainOfThought/README.md +412 -0
- package/dist/project/components/ChainOfThought/preview.html +2 -0
- package/dist/project/components/ChainOfThought/stories.js +12 -0
- package/dist/project/components/Chart/README.md +224 -0
- package/dist/project/components/Chart/preview.html +2 -0
- package/dist/project/components/Chart/stories.js +12 -0
- package/dist/project/components/Chat/README.md +1244 -0
- package/dist/project/components/Chat/preview.html +2 -0
- package/dist/project/components/Chat/stories.js +12 -0
- package/dist/project/components/ChatInput/README.md +378 -0
- package/dist/project/components/ChatInput/preview.html +2 -0
- package/dist/project/components/ChatInput/stories.js +12 -0
- package/dist/project/components/ChatPermissions/README.md +218 -0
- package/dist/project/components/ChatPermissions/preview.html +2 -0
- package/dist/project/components/ChatPermissions/stories.js +12 -0
- package/dist/project/components/Checkbox/README.md +367 -0
- package/dist/project/components/Checkbox/preview.html +2 -0
- package/dist/project/components/Checkbox/stories.js +12 -0
- package/dist/project/components/Code/README.md +243 -0
- package/dist/project/components/Code/preview.html +2 -0
- package/dist/project/components/Code/stories.js +12 -0
- package/dist/project/components/CodeEditor/README.md +280 -0
- package/dist/project/components/CodeEditor/preview.html +2 -0
- package/dist/project/components/CodeEditor/stories.js +162 -0
- package/dist/project/components/CodeEditor/stories.md +1533 -0
- package/dist/project/components/CodeSnippet/README.md +1352 -0
- package/dist/project/components/CodeSnippet/preview.html +2 -0
- package/dist/project/components/CodeSnippet/stories.js +156 -0
- package/dist/project/components/ColumnChart/README.md +521 -0
- package/dist/project/components/ColumnChart/preview.html +2 -0
- package/dist/project/components/ColumnChart/stories.js +12 -0
- package/dist/project/components/Conversation/README.md +314 -0
- package/dist/project/components/Conversation/preview.html +2 -0
- package/dist/project/components/Conversation/stories.js +12 -0
- package/dist/project/components/Copyable/README.md +406 -0
- package/dist/project/components/Copyable/preview.html +2 -0
- package/dist/project/components/Copyable/stories.js +12 -0
- package/dist/project/components/Country/README.md +226 -0
- package/dist/project/components/Country/preview.html +2 -0
- package/dist/project/components/Country/stories.js +12 -0
- package/dist/project/components/Cover/preview.html +43 -0
- package/dist/project/components/DateInput/README.md +458 -0
- package/dist/project/components/DateInput/preview.html +2 -0
- package/dist/project/components/DateInput/stories.js +12 -0
- package/dist/project/components/DateRangeInput/README.md +412 -0
- package/dist/project/components/DateRangeInput/preview.html +2 -0
- package/dist/project/components/DateRangeInput/stories.js +12 -0
- package/dist/project/components/Dialog/README.md +1140 -0
- package/dist/project/components/Dialog/preview.html +2 -0
- package/dist/project/components/Dialog/stories.js +12 -0
- package/dist/project/components/Drawer/README.md +1163 -0
- package/dist/project/components/Drawer/preview.html +2 -0
- package/dist/project/components/Drawer/stories.js +12 -0
- package/dist/project/components/DropdownMenu/README.md +678 -0
- package/dist/project/components/DropdownMenu/preview.html +2 -0
- package/dist/project/components/DropdownMenu/stories.js +12 -0
- package/dist/project/components/EmptyState/README.md +276 -0
- package/dist/project/components/EmptyState/preview.html +2 -0
- package/dist/project/components/EmptyState/stories.js +12 -0
- package/dist/project/components/FeedbackPulse/README.md +125 -0
- package/dist/project/components/FeedbackPulse/preview.html +2 -0
- package/dist/project/components/FeedbackPulse/stories.js +12 -0
- package/dist/project/components/Field/README.md +676 -0
- package/dist/project/components/Field/preview.html +2 -0
- package/dist/project/components/Field/stories.js +12 -0
- package/dist/project/components/FileUpload/README.md +544 -0
- package/dist/project/components/FileUpload/preview.html +2 -0
- package/dist/project/components/FileUpload/stories.js +12 -0
- package/dist/project/components/FilterCascade/README.md +348 -0
- package/dist/project/components/FilterCascade/preview.html +2 -0
- package/dist/project/components/FilterCascade/stories.js +12 -0
- package/dist/project/components/FilterDropdown/README.md +542 -0
- package/dist/project/components/FilterDropdown/preview.html +2 -0
- package/dist/project/components/FilterDropdown/stories.js +12 -0
- package/dist/project/components/FilterInput/README.md +416 -0
- package/dist/project/components/FilterInput/preview.html +2 -0
- package/dist/project/components/FilterInput/stories.js +12 -0
- package/dist/project/components/FilterInput/stories.md +6682 -0
- package/dist/project/components/Flex/README.md +225 -0
- package/dist/project/components/Flex/preview.html +2 -0
- package/dist/project/components/Flex/stories.js +12 -0
- package/dist/project/components/FormatDateTime/README.md +315 -0
- package/dist/project/components/FormatDateTime/preview.html +2 -0
- package/dist/project/components/FormatDateTime/stories.js +12 -0
- package/dist/project/components/FormatNumber/README.md +317 -0
- package/dist/project/components/FormatNumber/preview.html +2 -0
- package/dist/project/components/FormatNumber/stories.js +12 -0
- package/dist/project/components/Heading/README.md +240 -0
- package/dist/project/components/Heading/preview.html +2 -0
- package/dist/project/components/Heading/stories.js +12 -0
- package/dist/project/components/HorizontalBarStack/README.md +281 -0
- package/dist/project/components/HorizontalBarStack/preview.html +2 -0
- package/dist/project/components/HorizontalBarStack/stories.js +12 -0
- package/dist/project/components/HttpMethod/README.md +137 -0
- package/dist/project/components/HttpMethod/preview.html +2 -0
- package/dist/project/components/HttpMethod/stories.js +12 -0
- package/dist/project/components/ImageCropper/README.md +332 -0
- package/dist/project/components/ImageCropper/preview.html +2 -0
- package/dist/project/components/ImageCropper/stories.js +33 -0
- package/dist/project/components/Indicator/README.md +110 -0
- package/dist/project/components/Indicator/preview.html +2 -0
- package/dist/project/components/Indicator/stories.js +12 -0
- package/dist/project/components/InlineEdit/README.md +977 -0
- package/dist/project/components/InlineEdit/preview.html +2 -0
- package/dist/project/components/InlineEdit/stories.js +12 -0
- package/dist/project/components/Input/README.md +187 -0
- package/dist/project/components/Input/preview.html +2 -0
- package/dist/project/components/Input/stories.js +12 -0
- package/dist/project/components/InputGroup/README.md +423 -0
- package/dist/project/components/InputGroup/preview.html +2 -0
- package/dist/project/components/InputGroup/stories.js +12 -0
- package/dist/project/components/InputOTP/README.md +201 -0
- package/dist/project/components/InputOTP/preview.html +2 -0
- package/dist/project/components/InputOTP/stories.js +12 -0
- package/dist/project/components/Ip/README.md +226 -0
- package/dist/project/components/Ip/preview.html +2 -0
- package/dist/project/components/Ip/stories.js +12 -0
- package/dist/project/components/Kbd/README.md +126 -0
- package/dist/project/components/Kbd/preview.html +2 -0
- package/dist/project/components/Kbd/stories.js +12 -0
- package/dist/project/components/LineChart/README.md +1479 -0
- package/dist/project/components/LineChart/preview.html +2 -0
- package/dist/project/components/LineChart/stories.js +12 -0
- package/dist/project/components/Link/README.md +160 -0
- package/dist/project/components/Link/preview.html +2 -0
- package/dist/project/components/Link/stories.js +12 -0
- package/dist/project/components/List/README.md +181 -0
- package/dist/project/components/List/preview.html +2 -0
- package/dist/project/components/List/stories.js +12 -0
- package/dist/project/components/Loader/README.md +145 -0
- package/dist/project/components/Loader/preview.html +2 -0
- package/dist/project/components/Loader/stories.js +12 -0
- package/dist/project/components/Logo/README.md +183 -0
- package/dist/project/components/Logo/preview.html +2 -0
- package/dist/project/components/Logo/stories.js +12 -0
- package/dist/project/components/MessageActions/README.md +255 -0
- package/dist/project/components/MessageActions/preview.html +2 -0
- package/dist/project/components/MessageActions/stories.js +12 -0
- package/dist/project/components/Metric/README.md +324 -0
- package/dist/project/components/Metric/preview.html +2 -0
- package/dist/project/components/Metric/stories.js +12 -0
- package/dist/project/components/NavRail/README.md +25 -0
- package/dist/project/components/NotificationCenter/README.md +91 -0
- package/dist/project/components/NotificationCenter/preview.html +2 -0
- package/dist/project/components/NotificationCenter/stories.js +12 -0
- package/dist/project/components/NotificationCenter/stories.md +2170 -0
- package/dist/project/components/NumberInput/README.md +177 -0
- package/dist/project/components/NumberInput/preview.html +2 -0
- package/dist/project/components/NumberInput/stories.js +12 -0
- package/dist/project/components/NumericBadge/README.md +252 -0
- package/dist/project/components/NumericBadge/preview.html +2 -0
- package/dist/project/components/NumericBadge/stories.js +12 -0
- package/dist/project/components/OverflowList/README.md +324 -0
- package/dist/project/components/OverflowList/preview.html +2 -0
- package/dist/project/components/OverflowList/stories.js +12 -0
- package/dist/project/components/OverflowTooltip/README.md +421 -0
- package/dist/project/components/OverflowTooltip/preview.html +2 -0
- package/dist/project/components/OverflowTooltip/stories.js +12 -0
- package/dist/project/components/Overlay/README.md +95 -0
- package/dist/project/components/Overlay/preview.html +2 -0
- package/dist/project/components/Overlay/stories.js +12 -0
- package/dist/project/components/Overview/README.md +445 -0
- package/dist/project/components/Overview/preview.html +2 -0
- package/dist/project/components/Overview/stories.js +12 -0
- package/dist/project/components/Page/README.md +215 -0
- package/dist/project/components/Page/preview.html +2 -0
- package/dist/project/components/Page/stories.js +12 -0
- package/dist/project/components/Pagination/README.md +302 -0
- package/dist/project/components/Pagination/preview.html +2 -0
- package/dist/project/components/Pagination/stories.js +12 -0
- package/dist/project/components/ParameterPath/README.md +284 -0
- package/dist/project/components/ParameterPath/preview.html +2 -0
- package/dist/project/components/ParameterPath/stories.js +12 -0
- package/dist/project/components/PasswordComplexity/README.md +171 -0
- package/dist/project/components/PasswordComplexity/preview.html +2 -0
- package/dist/project/components/PasswordComplexity/stories.js +12 -0
- package/dist/project/components/PasswordInput/README.md +254 -0
- package/dist/project/components/PasswordInput/preview.html +2 -0
- package/dist/project/components/PasswordInput/stories.js +12 -0
- package/dist/project/components/PieChart/README.md +895 -0
- package/dist/project/components/PieChart/preview.html +2 -0
- package/dist/project/components/PieChart/stories.js +12 -0
- package/dist/project/components/Popover/README.md +282 -0
- package/dist/project/components/Popover/preview.html +2 -0
- package/dist/project/components/Popover/stories.js +12 -0
- package/dist/project/components/Progress/README.md +174 -0
- package/dist/project/components/Progress/preview.html +2 -0
- package/dist/project/components/Progress/stories.js +12 -0
- package/dist/project/components/Radio/README.md +264 -0
- package/dist/project/components/Radio/preview.html +2 -0
- package/dist/project/components/Radio/stories.js +12 -0
- package/dist/project/components/RemoteShell/README.md +1758 -0
- package/dist/project/components/RemoteShell/preview.html +2 -0
- package/dist/project/components/RemoteShell/stories.js +28 -0
- package/dist/project/components/Resizable/README.md +290 -0
- package/dist/project/components/Resizable/preview.html +2 -0
- package/dist/project/components/Resizable/stories.js +12 -0
- package/dist/project/components/ResponseCode/README.md +205 -0
- package/dist/project/components/ResponseCode/preview.html +2 -0
- package/dist/project/components/ResponseCode/stories.js +12 -0
- package/dist/project/components/ScrollArea/README.md +234 -0
- package/dist/project/components/ScrollArea/preview.html +2 -0
- package/dist/project/components/ScrollArea/stories.js +12 -0
- package/dist/project/components/SearchInput/README.md +158 -0
- package/dist/project/components/SearchInput/preview.html +2 -0
- package/dist/project/components/SearchInput/stories.js +12 -0
- package/dist/project/components/SearchModal/README.md +836 -0
- package/dist/project/components/SearchModal/preview.html +2 -0
- package/dist/project/components/SearchModal/stories.js +12 -0
- package/dist/project/components/SegmentedControl/README.md +382 -0
- package/dist/project/components/SegmentedControl/preview.html +2 -0
- package/dist/project/components/SegmentedControl/stories.js +12 -0
- package/dist/project/components/SegmentedTabs/README.md +390 -0
- package/dist/project/components/SegmentedTabs/preview.html +2 -0
- package/dist/project/components/SegmentedTabs/stories.js +12 -0
- package/dist/project/components/Select/README.md +1311 -0
- package/dist/project/components/Select/preview.html +2 -0
- package/dist/project/components/Select/stories.js +12 -0
- package/dist/project/components/Selection/README.md +648 -0
- package/dist/project/components/Selection/preview.html +2 -0
- package/dist/project/components/Selection/stories.js +12 -0
- package/dist/project/components/Separator/README.md +77 -0
- package/dist/project/components/Separator/preview.html +2 -0
- package/dist/project/components/Separator/stories.js +12 -0
- package/dist/project/components/Skeleton/README.md +358 -0
- package/dist/project/components/Skeleton/preview.html +2 -0
- package/dist/project/components/Skeleton/stories.js +12 -0
- package/dist/project/components/Slider/README.md +433 -0
- package/dist/project/components/Slider/preview.html +2 -0
- package/dist/project/components/Slider/stories.js +12 -0
- package/dist/project/components/SplashScreen/README.md +192 -0
- package/dist/project/components/SplashScreen/preview.html +2 -0
- package/dist/project/components/SplashScreen/stories.js +12 -0
- package/dist/project/components/SplitButton/README.md +402 -0
- package/dist/project/components/SplitButton/preview.html +2 -0
- package/dist/project/components/SplitButton/stories.js +12 -0
- package/dist/project/components/Stack/README.md +269 -0
- package/dist/project/components/Stack/preview.html +2 -0
- package/dist/project/components/Stack/stories.js +12 -0
- package/dist/project/components/Stepper/README.md +682 -0
- package/dist/project/components/Stepper/preview.html +2 -0
- package/dist/project/components/Stepper/stories.js +12 -0
- package/dist/project/components/Switch/README.md +236 -0
- package/dist/project/components/Switch/preview.html +2 -0
- package/dist/project/components/Switch/stories.js +12 -0
- package/dist/project/components/Table/README.md +471 -0
- package/dist/project/components/Table/preview.html +2 -0
- package/dist/project/components/Table/stories.js +12 -0
- package/dist/project/components/Table/stories.md +3697 -0
- package/dist/project/components/Tabs/README.md +443 -0
- package/dist/project/components/Tabs/preview.html +2 -0
- package/dist/project/components/Tabs/stories.js +12 -0
- package/dist/project/components/Tag/README.md +324 -0
- package/dist/project/components/Tag/preview.html +2 -0
- package/dist/project/components/Tag/stories.js +12 -0
- package/dist/project/components/Text/README.md +200 -0
- package/dist/project/components/Text/preview.html +2 -0
- package/dist/project/components/Text/stories.js +12 -0
- package/dist/project/components/Textarea/README.md +273 -0
- package/dist/project/components/Textarea/preview.html +2 -0
- package/dist/project/components/Textarea/stories.js +12 -0
- package/dist/project/components/TimeInput/README.md +359 -0
- package/dist/project/components/TimeInput/preview.html +2 -0
- package/dist/project/components/TimeInput/stories.js +12 -0
- package/dist/project/components/Timeline/README.md +204 -0
- package/dist/project/components/Timeline/preview.html +2 -0
- package/dist/project/components/Timeline/stories.js +12 -0
- package/dist/project/components/Toast/README.md +718 -0
- package/dist/project/components/Toast/preview.html +2 -0
- package/dist/project/components/Toast/stories.js +12 -0
- package/dist/project/components/ToggleButton/README.md +292 -0
- package/dist/project/components/ToggleButton/preview.html +2 -0
- package/dist/project/components/ToggleButton/stories.js +12 -0
- package/dist/project/components/Tooltip/README.md +199 -0
- package/dist/project/components/Tooltip/preview.html +2 -0
- package/dist/project/components/Tooltip/stories.js +12 -0
- package/dist/project/components/TopHeader/README.md +21 -0
- package/dist/project/components/Tour/README.md +532 -0
- package/dist/project/components/Tour/preview.html +2 -0
- package/dist/project/components/Tour/stories.js +12 -0
- package/dist/project/components/Tree/README.md +450 -0
- package/dist/project/components/Tree/preview.html +2 -0
- package/dist/project/components/Tree/stories.js +12 -0
- package/dist/project/components/TreeView/README.md +531 -0
- package/dist/project/components/TreeView/preview.html +2 -0
- package/dist/project/components/TreeView/stories.js +12 -0
- package/dist/project/components/UTILITIES.md +647 -0
- package/dist/project/components/UserMessage/README.md +166 -0
- package/dist/project/components/UserMessage/preview.html +2 -0
- package/dist/project/components/UserMessage/stories.js +12 -0
- package/dist/project/components/UtilityPage/README.md +147 -0
- package/dist/project/components/UtilityPage/preview.html +2 -0
- package/dist/project/components/UtilityPage/stories.js +12 -0
- package/dist/project/components/WallyAssistant/README.md +1380 -0
- package/dist/project/components/WallyAssistant/preview.html +2 -0
- package/dist/project/components/WallyAssistant/stories.js +12 -0
- package/dist/project/components/WallyIcon/README.md +130 -0
- package/dist/project/components/WallyIcon/preview.html +2 -0
- package/dist/project/components/WallyIcon/stories.js +12 -0
- package/dist/project/components/WallySkeleton/README.md +96 -0
- package/dist/project/components/WallySkeleton/preview.html +2 -0
- package/dist/project/components/WallySkeleton/stories.js +12 -0
- package/dist/project/components/bundle.css +18734 -0
- package/dist/project/components/bundle.js +167 -0
- package/dist/project/components/index.d.ts +27226 -0
- package/dist/project/design-system.json +35 -0
- package/dist/project/fonts/Geist-Variable.woff2 +0 -0
- package/dist/project/fonts/GeistMono-Variable.woff2 +0 -0
- package/dist/project/fonts/GeistPixel-Square.woff2 +0 -0
- package/dist/project/sampler.dc.html +238 -0
- package/dist/project/tokens.css +1395 -0
- package/dist/project/tokens.json +5235 -0
- package/dist/wallarm-sampler.dc.html +239 -0
- package/package.json +67 -3
|
@@ -0,0 +1,1244 @@
|
|
|
1
|
+
The Wally assistant panel: a header, a scrolling message log, and a footer gutter for suggestions, a docked approval card and the input. `Chat` is layout only — it holds no messages or agent state; the app renders `UserMessage`, `AssistantMessage` and `ChatInput` into `ChatBody` and `ChatFooter` from its own data. Header actions are composed from plain ghost `Button`s and vertical `Separator`s, so each one keeps its own `aria-label` and analytics attributes. `background` picks the decorative mesh: `strong` for an empty chat, `subtle` (default) once a conversation is running, `none` to drop it. Host the panel in a right-hand `Drawer` about 480px wide; `ChatBody` exposes its scroll element through `ref` for stick-to-bottom.
|
|
2
|
+
|
|
3
|
+
## Props as canvas attributes
|
|
4
|
+
|
|
5
|
+
Use kebab-case attribute names. Pass non-string values through renderVals holes, including booleans. The full emitted API is in `components/index.d.ts`.
|
|
6
|
+
|
|
7
|
+
| Attribute | Type | Required | Default | Description |
|
|
8
|
+
| --- | --- | --- | --- | --- |
|
|
9
|
+
| `background` | `"strong" \| "subtle"` | no | `subtle` | Decorative mesh behind the panel (Figma chat-bg 67:1254). `'strong'` is Main (12%, for an empty chat), `'subtle'` is Chat (5%, for a running conversation), `'none'` renders nothing. |
|
|
10
|
+
| `default-checked` | `boolean \| undefined` | no | — | |
|
|
11
|
+
| `default-value` | `string \| number \| readonly string[] \| undefined` | no | — | |
|
|
12
|
+
| `auto-focus` | `boolean \| undefined` | no | — | |
|
|
13
|
+
| `id` | `string \| undefined` | no | — | |
|
|
14
|
+
| `tab-index` | `number \| undefined` | no | — | |
|
|
15
|
+
| `title` | `string \| undefined` | no | — | |
|
|
16
|
+
| `rel` | `string \| undefined` | no | — | |
|
|
17
|
+
| `on-change` | `ChangeEventHandler<T, Element> \| undefined` | no | — | |
|
|
18
|
+
| `data-testid` | `string \| undefined` | no | — | |
|
|
19
|
+
|
|
20
|
+
## Sub-components
|
|
21
|
+
|
|
22
|
+
- `WallarmDS.ChatBody` — `ChatBodyProps` in the declaration bundle.
|
|
23
|
+
- `WallarmDS.ChatFooter` — `ChatFooterProps` in the declaration bundle.
|
|
24
|
+
- `WallarmDS.ChatGreeting` — `ChatGreetingProps` in the declaration bundle.
|
|
25
|
+
- `WallarmDS.ChatHeader` — `ChatHeaderProps` in the declaration bundle.
|
|
26
|
+
- `WallarmDS.ChatHeaderActions` — `ChatHeaderActionsProps` in the declaration bundle.
|
|
27
|
+
- `WallarmDS.ChatHeaderTitle` — `ChatHeaderTitleProps` in the declaration bundle.
|
|
28
|
+
- `WallarmDS.ChatSuggestion` — `ChatSuggestionProps` in the declaration bundle.
|
|
29
|
+
- `WallarmDS.ChatSuggestions` — `ChatSuggestionsProps` in the declaration bundle.
|
|
30
|
+
- `WallarmDS.ChatTrigger` — `ChatTriggerProps` in the declaration bundle.
|
|
31
|
+
|
|
32
|
+
## Stories
|
|
33
|
+
|
|
34
|
+
### HeaderDefault
|
|
35
|
+
|
|
36
|
+
Figma Default (2:42): Wally's 24 px glyph and the "Ask Wally" title with History, a More menu, a separator and Close.
|
|
37
|
+
Every action is a ghost neutral small `Button` with an `aria-label`.
|
|
38
|
+
|
|
39
|
+
Source: Chat/Chat.stories.tsx#HeaderDefault
|
|
40
|
+
|
|
41
|
+
### HeaderWithThreadSelect
|
|
42
|
+
|
|
43
|
+
Figma Variant2 (44:1465): children of `ChatHeaderTitle` follow a "/" joint — here a ghost thread
|
|
44
|
+
`Select` — and a New chat action leads the toolbar.
|
|
45
|
+
|
|
46
|
+
Source: Chat/Chat.stories.tsx#HeaderWithThreadSelect
|
|
47
|
+
|
|
48
|
+
### Greeting
|
|
49
|
+
|
|
50
|
+
The empty state (Figma 44:1464): Wally as its live 120 px character with a contact shadow, then a
|
|
51
|
+
heading, with Large suggestion pills centered under it, over the `strong` background. Wally says
|
|
52
|
+
Hello once, 250 ms after the empty chat comes into view; under reduced motion it stays still.
|
|
53
|
+
|
|
54
|
+
Source: Chat/Chat.stories.tsx#Greeting
|
|
55
|
+
|
|
56
|
+
### Suggestions
|
|
57
|
+
|
|
58
|
+
Both placements: `footer` (Figma 91:1167) right-aligns Medium pills under a visible label,
|
|
59
|
+
`greeting` (Figma 44:1706) centers Large pills. The pill size follows the placement.
|
|
60
|
+
|
|
61
|
+
Source: Chat/Chat.stories.tsx#Suggestions
|
|
62
|
+
|
|
63
|
+
### Backgrounds
|
|
64
|
+
|
|
65
|
+
The three `background` values side by side: `strong` (Figma Main, 12%), `subtle` (Figma Chat,
|
|
66
|
+
5%, the default) and `none`. The mesh is decorative and sits under every part.
|
|
67
|
+
|
|
68
|
+
Source: Chat/Chat.stories.tsx#Backgrounds
|
|
69
|
+
|
|
70
|
+
### Analytics
|
|
71
|
+
|
|
72
|
+
Analytics attributes go on the interactive parts only: `data-analytics-id` on a `ChatSuggestion`
|
|
73
|
+
lands on its `<button>`; header actions are plain DS `Button`s and carry their own. Keep them off
|
|
74
|
+
the `Chat` root — a click anywhere inside would resolve to it.
|
|
75
|
+
|
|
76
|
+
Source: Chat/Chat.stories.tsx#Analytics
|
|
77
|
+
|
|
78
|
+
### Trigger
|
|
79
|
+
|
|
80
|
+
The app-header button that opens the panel (Figma 101:1034): the Wally mascot in a ghost small
|
|
81
|
+
`Button`, with an "Ask Wally" tooltip that doubles as its accessible name (`label`).
|
|
82
|
+
|
|
83
|
+
Source: Chat/Chat.stories.tsx#Trigger
|
|
84
|
+
|
|
85
|
+
### TriggerWithDrawer
|
|
86
|
+
|
|
87
|
+
`ChatTrigger` under `DrawerTrigger asChild`: the drawer owns the open state and `aria-expanded`,
|
|
88
|
+
the tooltip keeps its anchor through the shared trigger id.
|
|
89
|
+
|
|
90
|
+
Source: Chat/Chat.stories.tsx#TriggerWithDrawer
|
|
91
|
+
|
|
92
|
+
### EmptyPanel
|
|
93
|
+
|
|
94
|
+
The full empty panel: the greeting with Large suggestion pills over the `strong` background,
|
|
95
|
+
and the composer in the footer. A pill click would send its text as the first message.
|
|
96
|
+
|
|
97
|
+
Source: Chat/Chat.stories.tsx#EmptyPanel
|
|
98
|
+
|
|
99
|
+
### Conversation
|
|
100
|
+
|
|
101
|
+
A finished turn: the user's question, then Wally's answer with collapsed reasoning, rendered
|
|
102
|
+
markdown and a visible actions row; follow-up suggestions sit above the composer.
|
|
103
|
+
|
|
104
|
+
Source: Chat/Chat.stories.tsx#Conversation
|
|
105
|
+
|
|
106
|
+
### Streaming
|
|
107
|
+
|
|
108
|
+
A reply in flight: `ChatBody` and the message carry `aria-busy`, the running step shimmers,
|
|
109
|
+
and the submit is Stop. Stop (or Esc in the textarea) ends the run in this demo.
|
|
110
|
+
|
|
111
|
+
Source: Chat/Chat.stories.tsx#Streaming
|
|
112
|
+
|
|
113
|
+
### ApprovalDocked
|
|
114
|
+
|
|
115
|
+
Human-in-the-loop: the pending `ApprovalCard` is docked in `ChatFooter` above the composer
|
|
116
|
+
while the run waits. Allow or Reject resolves it in place (so its live region and focus work)
|
|
117
|
+
and the answer continues.
|
|
118
|
+
|
|
119
|
+
Source: Chat/Chat.stories.tsx#ApprovalDocked
|
|
120
|
+
|
|
121
|
+
### ApprovalResolved
|
|
122
|
+
|
|
123
|
+
After the decision the docked card collapses to a one-line status and the answer completes.
|
|
124
|
+
|
|
125
|
+
Source: Chat/Chat.stories.tsx#ApprovalResolved
|
|
126
|
+
|
|
127
|
+
### Permissions
|
|
128
|
+
|
|
129
|
+
The per-conversation tool permissions sit inside the composer, between textarea and submit.
|
|
130
|
+
|
|
131
|
+
Source: Chat/Chat.stories.tsx#Permissions
|
|
132
|
+
|
|
133
|
+
### InDrawer
|
|
134
|
+
|
|
135
|
+
The real host: `ChatTrigger` opens a 480px right-hand `Drawer` holding the conversation, and
|
|
136
|
+
Close is a `DrawerClose`. Esc in the textarea while running stops the reply instead of closing
|
|
137
|
+
the drawer; ChatInput handles that itself, so the host needs no `onEscapeKeyDown`.
|
|
138
|
+
|
|
139
|
+
Source: Chat/Chat.stories.tsx#InDrawer
|
|
140
|
+
|
|
141
|
+
## Story sources
|
|
142
|
+
|
|
143
|
+
### Chat/Chat.stories.tsx
|
|
144
|
+
|
|
145
|
+
```tsx
|
|
146
|
+
import { type MouseEvent, useState } from 'react';
|
|
147
|
+
import type { Meta, StoryFn } from 'storybook-react-rsbuild';
|
|
148
|
+
import {
|
|
149
|
+
Brain,
|
|
150
|
+
Database,
|
|
151
|
+
Ellipsis,
|
|
152
|
+
History,
|
|
153
|
+
Plus,
|
|
154
|
+
Search,
|
|
155
|
+
ShieldBan,
|
|
156
|
+
ThumbsDown,
|
|
157
|
+
ThumbsUp,
|
|
158
|
+
X,
|
|
159
|
+
} from '../../icons';
|
|
160
|
+
import {
|
|
161
|
+
ApprovalCard,
|
|
162
|
+
ApprovalCardActions,
|
|
163
|
+
ApprovalCardContent,
|
|
164
|
+
type ApprovalCardStatus,
|
|
165
|
+
} from '../ApprovalCard';
|
|
166
|
+
import { AssistantMessage, AssistantMessageContent } from '../AssistantMessage';
|
|
167
|
+
import { Button } from '../Button';
|
|
168
|
+
import { ChainOfThought, ChainOfThoughtStep } from '../ChainOfThought';
|
|
169
|
+
import { ChatInput, ChatInputSubmit, ChatInputTextarea } from '../ChatInput';
|
|
170
|
+
import {
|
|
171
|
+
ChatPermissions,
|
|
172
|
+
ChatPermissionsContent,
|
|
173
|
+
ChatPermissionsItem,
|
|
174
|
+
type ChatPermissionsItemCheckedChangeDetails,
|
|
175
|
+
ChatPermissionsTrigger,
|
|
176
|
+
} from '../ChatPermissions';
|
|
177
|
+
import { InlineCodeSnippet } from '../CodeSnippet';
|
|
178
|
+
import { Copyable, CopyableIcon } from '../Copyable';
|
|
179
|
+
import { Drawer, DrawerClose, DrawerContent, DrawerTrigger } from '../Drawer';
|
|
180
|
+
import {
|
|
181
|
+
DropdownMenu,
|
|
182
|
+
DropdownMenuContent,
|
|
183
|
+
DropdownMenuItem,
|
|
184
|
+
DropdownMenuTrigger,
|
|
185
|
+
} from '../DropdownMenu';
|
|
186
|
+
import { MessageAction, MessageActions, MessageTimestamp } from '../MessageActions';
|
|
187
|
+
import {
|
|
188
|
+
createListCollection,
|
|
189
|
+
Select,
|
|
190
|
+
SelectButton,
|
|
191
|
+
SelectContent,
|
|
192
|
+
SelectOption,
|
|
193
|
+
SelectOptionIndicator,
|
|
194
|
+
SelectOptionText,
|
|
195
|
+
SelectPositioner,
|
|
196
|
+
} from '../Select';
|
|
197
|
+
import { Separator } from '../Separator';
|
|
198
|
+
import { HStack } from '../Stack';
|
|
199
|
+
import { UserMessage, UserMessageBubble } from '../UserMessage';
|
|
200
|
+
import {
|
|
201
|
+
Chat,
|
|
202
|
+
type ChatBackground,
|
|
203
|
+
ChatBody,
|
|
204
|
+
ChatFooter,
|
|
205
|
+
ChatGreeting,
|
|
206
|
+
ChatHeader,
|
|
207
|
+
ChatHeaderActions,
|
|
208
|
+
ChatHeaderTitle,
|
|
209
|
+
ChatSuggestion,
|
|
210
|
+
ChatSuggestions,
|
|
211
|
+
ChatTrigger,
|
|
212
|
+
} from '.';
|
|
213
|
+
|
|
214
|
+
const DESCRIPTION = [
|
|
215
|
+
'The Wally assistant panel: a header, a scrolling message log, and a footer gutter for suggestions, a docked approval card and the input.',
|
|
216
|
+
'`Chat` is layout only — it holds no messages or agent state; the app renders `UserMessage`, `AssistantMessage` and `ChatInput` into `ChatBody` and `ChatFooter` from its own data.',
|
|
217
|
+
'Header actions are composed from plain ghost `Button`s and vertical `Separator`s, so each one keeps its own `aria-label` and analytics attributes.',
|
|
218
|
+
'`background` picks the decorative mesh: `strong` for an empty chat, `subtle` (default) once a conversation is running, `none` to drop it.',
|
|
219
|
+
'Host the panel in a right-hand `Drawer` about 480px wide; `ChatBody` exposes its scroll element through `ref` for stick-to-bottom.',
|
|
220
|
+
].join(' ');
|
|
221
|
+
|
|
222
|
+
const meta = {
|
|
223
|
+
title: 'AI/Chat',
|
|
224
|
+
component: Chat,
|
|
225
|
+
subcomponents: {
|
|
226
|
+
ChatHeader,
|
|
227
|
+
ChatHeaderTitle,
|
|
228
|
+
ChatHeaderActions,
|
|
229
|
+
ChatBody,
|
|
230
|
+
ChatFooter,
|
|
231
|
+
ChatGreeting,
|
|
232
|
+
ChatSuggestions,
|
|
233
|
+
ChatSuggestion,
|
|
234
|
+
ChatTrigger,
|
|
235
|
+
},
|
|
236
|
+
parameters: {
|
|
237
|
+
layout: 'centered',
|
|
238
|
+
docs: { description: { component: DESCRIPTION } },
|
|
239
|
+
},
|
|
240
|
+
} satisfies Meta<typeof Chat>;
|
|
241
|
+
|
|
242
|
+
export default meta;
|
|
243
|
+
|
|
244
|
+
const SUGGESTIONS = [
|
|
245
|
+
'Why was this request blocked?',
|
|
246
|
+
'Show top attacked endpoints',
|
|
247
|
+
'Explain this rule',
|
|
248
|
+
];
|
|
249
|
+
|
|
250
|
+
const threads = createListCollection({
|
|
251
|
+
items: [
|
|
252
|
+
{ value: 'blocked', label: 'Blocked requests on /login' },
|
|
253
|
+
{ value: 'rules', label: 'Rule tuning for API v2' },
|
|
254
|
+
],
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Figma Default (2:42): Wally's 24 px glyph and the "Ask Wally" title with History, a More menu, a separator and Close.
|
|
259
|
+
* Every action is a ghost neutral small `Button` with an `aria-label`.
|
|
260
|
+
*/
|
|
261
|
+
export const HeaderDefault: StoryFn<typeof meta> = () => (
|
|
262
|
+
<div className='h-200 w-480'>
|
|
263
|
+
<Chat data-testid='chat' background='none'>
|
|
264
|
+
<ChatHeader>
|
|
265
|
+
<ChatHeaderTitle />
|
|
266
|
+
<ChatHeaderActions>
|
|
267
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>
|
|
268
|
+
<History />
|
|
269
|
+
</Button>
|
|
270
|
+
<DropdownMenu positioning={{ placement: 'bottom-end' }}>
|
|
271
|
+
<DropdownMenuTrigger asChild>
|
|
272
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='More actions'>
|
|
273
|
+
<Ellipsis />
|
|
274
|
+
</Button>
|
|
275
|
+
</DropdownMenuTrigger>
|
|
276
|
+
<DropdownMenuContent>
|
|
277
|
+
<DropdownMenuItem>Rename chat</DropdownMenuItem>
|
|
278
|
+
<DropdownMenuItem>Delete chat</DropdownMenuItem>
|
|
279
|
+
</DropdownMenuContent>
|
|
280
|
+
</DropdownMenu>
|
|
281
|
+
<Separator orientation='vertical' />
|
|
282
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>
|
|
283
|
+
<X />
|
|
284
|
+
</Button>
|
|
285
|
+
</ChatHeaderActions>
|
|
286
|
+
</ChatHeader>
|
|
287
|
+
<ChatBody />
|
|
288
|
+
</Chat>
|
|
289
|
+
</div>
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Figma Variant2 (44:1465): children of `ChatHeaderTitle` follow a "/" joint — here a ghost thread
|
|
294
|
+
* `Select` — and a New chat action leads the toolbar.
|
|
295
|
+
*/
|
|
296
|
+
export const HeaderWithThreadSelect: StoryFn<typeof meta> = () => (
|
|
297
|
+
<div className='h-200 w-480'>
|
|
298
|
+
<Chat data-testid='chat' background='none'>
|
|
299
|
+
<ChatHeader>
|
|
300
|
+
<ChatHeaderTitle>
|
|
301
|
+
<Select collection={threads} defaultValue={['blocked']}>
|
|
302
|
+
<SelectButton variant='ghost' size='small' placeholder='New chat' />
|
|
303
|
+
<SelectPositioner>
|
|
304
|
+
<SelectContent>
|
|
305
|
+
{threads.items.map(item => (
|
|
306
|
+
<SelectOption key={item.value} item={item}>
|
|
307
|
+
<SelectOptionText>{item.label}</SelectOptionText>
|
|
308
|
+
<SelectOptionIndicator />
|
|
309
|
+
</SelectOption>
|
|
310
|
+
))}
|
|
311
|
+
</SelectContent>
|
|
312
|
+
</SelectPositioner>
|
|
313
|
+
</Select>
|
|
314
|
+
</ChatHeaderTitle>
|
|
315
|
+
<ChatHeaderActions>
|
|
316
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='New chat'>
|
|
317
|
+
<Plus />
|
|
318
|
+
</Button>
|
|
319
|
+
<Separator orientation='vertical' />
|
|
320
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>
|
|
321
|
+
<History />
|
|
322
|
+
</Button>
|
|
323
|
+
<DropdownMenu positioning={{ placement: 'bottom-end' }}>
|
|
324
|
+
<DropdownMenuTrigger asChild>
|
|
325
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='More actions'>
|
|
326
|
+
<Ellipsis />
|
|
327
|
+
</Button>
|
|
328
|
+
</DropdownMenuTrigger>
|
|
329
|
+
<DropdownMenuContent>
|
|
330
|
+
<DropdownMenuItem>Rename chat</DropdownMenuItem>
|
|
331
|
+
<DropdownMenuItem>Delete chat</DropdownMenuItem>
|
|
332
|
+
</DropdownMenuContent>
|
|
333
|
+
</DropdownMenu>
|
|
334
|
+
<Separator orientation='vertical' />
|
|
335
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>
|
|
336
|
+
<X />
|
|
337
|
+
</Button>
|
|
338
|
+
</ChatHeaderActions>
|
|
339
|
+
</ChatHeader>
|
|
340
|
+
<ChatBody />
|
|
341
|
+
</Chat>
|
|
342
|
+
</div>
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* The empty state (Figma 44:1464): Wally as its live 120 px character with a contact shadow, then a
|
|
347
|
+
* heading, with Large suggestion pills centered under it, over the `strong` background. Wally says
|
|
348
|
+
* Hello once, 250 ms after the empty chat comes into view; under reduced motion it stays still.
|
|
349
|
+
*/
|
|
350
|
+
export const Greeting: StoryFn<typeof meta> = () => {
|
|
351
|
+
const [picked, setPicked] = useState<string>();
|
|
352
|
+
const handleSuggestionClick = (event: MouseEvent<HTMLButtonElement>) =>
|
|
353
|
+
setPicked(event.currentTarget.value);
|
|
354
|
+
|
|
355
|
+
return (
|
|
356
|
+
<div className='h-640 w-480'>
|
|
357
|
+
<Chat data-testid='chat' background='strong'>
|
|
358
|
+
<ChatHeader>
|
|
359
|
+
<ChatHeaderTitle />
|
|
360
|
+
<ChatHeaderActions>
|
|
361
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>
|
|
362
|
+
<History />
|
|
363
|
+
</Button>
|
|
364
|
+
<DropdownMenu positioning={{ placement: 'bottom-end' }}>
|
|
365
|
+
<DropdownMenuTrigger asChild>
|
|
366
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='More actions'>
|
|
367
|
+
<Ellipsis />
|
|
368
|
+
</Button>
|
|
369
|
+
</DropdownMenuTrigger>
|
|
370
|
+
<DropdownMenuContent>
|
|
371
|
+
<DropdownMenuItem>Rename chat</DropdownMenuItem>
|
|
372
|
+
<DropdownMenuItem>Delete chat</DropdownMenuItem>
|
|
373
|
+
</DropdownMenuContent>
|
|
374
|
+
</DropdownMenu>
|
|
375
|
+
<Separator orientation='vertical' />
|
|
376
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>
|
|
377
|
+
<X />
|
|
378
|
+
</Button>
|
|
379
|
+
</ChatHeaderActions>
|
|
380
|
+
</ChatHeader>
|
|
381
|
+
<ChatBody>
|
|
382
|
+
<ChatGreeting title='How can I help you today?'>
|
|
383
|
+
<ChatSuggestions placement='greeting' label='Suggestions'>
|
|
384
|
+
{SUGGESTIONS.map((text, index) => (
|
|
385
|
+
<ChatSuggestion
|
|
386
|
+
key={text}
|
|
387
|
+
data-testid={`chat--suggestion-${index}`}
|
|
388
|
+
value={text}
|
|
389
|
+
onClick={handleSuggestionClick}
|
|
390
|
+
>
|
|
391
|
+
{text}
|
|
392
|
+
</ChatSuggestion>
|
|
393
|
+
))}
|
|
394
|
+
</ChatSuggestions>
|
|
395
|
+
</ChatGreeting>
|
|
396
|
+
{picked && (
|
|
397
|
+
<p data-testid='chat--picked' className='sr-only'>
|
|
398
|
+
Picked: {picked}
|
|
399
|
+
</p>
|
|
400
|
+
)}
|
|
401
|
+
</ChatBody>
|
|
402
|
+
</Chat>
|
|
403
|
+
</div>
|
|
404
|
+
);
|
|
405
|
+
};
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Both placements: `footer` (Figma 91:1167) right-aligns Medium pills under a visible label,
|
|
409
|
+
* `greeting` (Figma 44:1706) centers Large pills. The pill size follows the placement.
|
|
410
|
+
*/
|
|
411
|
+
export const Suggestions: StoryFn<typeof meta> = () => (
|
|
412
|
+
<HStack gap={24} align='start'>
|
|
413
|
+
<div className='h-640 w-480'>
|
|
414
|
+
<Chat data-testid='chat-footer-suggestions'>
|
|
415
|
+
<ChatHeader>
|
|
416
|
+
<ChatHeaderTitle />
|
|
417
|
+
<ChatHeaderActions>
|
|
418
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>
|
|
419
|
+
<History />
|
|
420
|
+
</Button>
|
|
421
|
+
<DropdownMenu positioning={{ placement: 'bottom-end' }}>
|
|
422
|
+
<DropdownMenuTrigger asChild>
|
|
423
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='More actions'>
|
|
424
|
+
<Ellipsis />
|
|
425
|
+
</Button>
|
|
426
|
+
</DropdownMenuTrigger>
|
|
427
|
+
<DropdownMenuContent>
|
|
428
|
+
<DropdownMenuItem>Rename chat</DropdownMenuItem>
|
|
429
|
+
<DropdownMenuItem>Delete chat</DropdownMenuItem>
|
|
430
|
+
</DropdownMenuContent>
|
|
431
|
+
</DropdownMenu>
|
|
432
|
+
<Separator orientation='vertical' />
|
|
433
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>
|
|
434
|
+
<X />
|
|
435
|
+
</Button>
|
|
436
|
+
</ChatHeaderActions>
|
|
437
|
+
</ChatHeader>
|
|
438
|
+
<ChatBody />
|
|
439
|
+
<ChatFooter>
|
|
440
|
+
<ChatSuggestions label='Suggestions'>
|
|
441
|
+
{SUGGESTIONS.map((text, index) => (
|
|
442
|
+
<ChatSuggestion
|
|
443
|
+
key={text}
|
|
444
|
+
data-testid={`chat-footer-suggestions--suggestion-${index}`}
|
|
445
|
+
>
|
|
446
|
+
{text}
|
|
447
|
+
</ChatSuggestion>
|
|
448
|
+
))}
|
|
449
|
+
</ChatSuggestions>
|
|
450
|
+
</ChatFooter>
|
|
451
|
+
</Chat>
|
|
452
|
+
</div>
|
|
453
|
+
<div className='h-640 w-480'>
|
|
454
|
+
<Chat data-testid='chat-greeting-suggestions' background='strong'>
|
|
455
|
+
<ChatHeader>
|
|
456
|
+
<ChatHeaderTitle />
|
|
457
|
+
<ChatHeaderActions>
|
|
458
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>
|
|
459
|
+
<History />
|
|
460
|
+
</Button>
|
|
461
|
+
<DropdownMenu positioning={{ placement: 'bottom-end' }}>
|
|
462
|
+
<DropdownMenuTrigger asChild>
|
|
463
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='More actions'>
|
|
464
|
+
<Ellipsis />
|
|
465
|
+
</Button>
|
|
466
|
+
</DropdownMenuTrigger>
|
|
467
|
+
<DropdownMenuContent>
|
|
468
|
+
<DropdownMenuItem>Rename chat</DropdownMenuItem>
|
|
469
|
+
<DropdownMenuItem>Delete chat</DropdownMenuItem>
|
|
470
|
+
</DropdownMenuContent>
|
|
471
|
+
</DropdownMenu>
|
|
472
|
+
<Separator orientation='vertical' />
|
|
473
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>
|
|
474
|
+
<X />
|
|
475
|
+
</Button>
|
|
476
|
+
</ChatHeaderActions>
|
|
477
|
+
</ChatHeader>
|
|
478
|
+
<ChatBody>
|
|
479
|
+
<ChatGreeting title='How can I help you today?'>
|
|
480
|
+
<ChatSuggestions placement='greeting'>
|
|
481
|
+
{SUGGESTIONS.map((text, index) => (
|
|
482
|
+
<ChatSuggestion
|
|
483
|
+
key={text}
|
|
484
|
+
data-testid={`chat-greeting-suggestions--suggestion-${index}`}
|
|
485
|
+
>
|
|
486
|
+
{text}
|
|
487
|
+
</ChatSuggestion>
|
|
488
|
+
))}
|
|
489
|
+
</ChatSuggestions>
|
|
490
|
+
</ChatGreeting>
|
|
491
|
+
</ChatBody>
|
|
492
|
+
</Chat>
|
|
493
|
+
</div>
|
|
494
|
+
</HStack>
|
|
495
|
+
);
|
|
496
|
+
|
|
497
|
+
const BACKGROUNDS: ChatBackground[] = ['strong', 'subtle', 'none'];
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* The three `background` values side by side: `strong` (Figma Main, 12%), `subtle` (Figma Chat,
|
|
501
|
+
* 5%, the default) and `none`. The mesh is decorative and sits under every part.
|
|
502
|
+
*/
|
|
503
|
+
export const Backgrounds: StoryFn<typeof meta> = () => (
|
|
504
|
+
<HStack gap={24} align='start'>
|
|
505
|
+
{BACKGROUNDS.map(background => (
|
|
506
|
+
<div key={background} className='h-640 w-360'>
|
|
507
|
+
<Chat data-testid={`chat-${background}`} background={background}>
|
|
508
|
+
<ChatHeader>
|
|
509
|
+
<ChatHeaderTitle />
|
|
510
|
+
<ChatHeaderActions>
|
|
511
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>
|
|
512
|
+
<History />
|
|
513
|
+
</Button>
|
|
514
|
+
<DropdownMenu positioning={{ placement: 'bottom-end' }}>
|
|
515
|
+
<DropdownMenuTrigger asChild>
|
|
516
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='More actions'>
|
|
517
|
+
<Ellipsis />
|
|
518
|
+
</Button>
|
|
519
|
+
</DropdownMenuTrigger>
|
|
520
|
+
<DropdownMenuContent>
|
|
521
|
+
<DropdownMenuItem>Rename chat</DropdownMenuItem>
|
|
522
|
+
<DropdownMenuItem>Delete chat</DropdownMenuItem>
|
|
523
|
+
</DropdownMenuContent>
|
|
524
|
+
</DropdownMenu>
|
|
525
|
+
<Separator orientation='vertical' />
|
|
526
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>
|
|
527
|
+
<X />
|
|
528
|
+
</Button>
|
|
529
|
+
</ChatHeaderActions>
|
|
530
|
+
</ChatHeader>
|
|
531
|
+
<ChatBody />
|
|
532
|
+
</Chat>
|
|
533
|
+
</div>
|
|
534
|
+
))}
|
|
535
|
+
</HStack>
|
|
536
|
+
);
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Analytics attributes go on the interactive parts only: `data-analytics-id` on a `ChatSuggestion`
|
|
540
|
+
* lands on its `<button>`; header actions are plain DS `Button`s and carry their own. Keep them off
|
|
541
|
+
* the `Chat` root — a click anywhere inside would resolve to it.
|
|
542
|
+
*/
|
|
543
|
+
export const Analytics: StoryFn<typeof meta> = () => (
|
|
544
|
+
<div className='h-640 w-480'>
|
|
545
|
+
<Chat data-testid='chat'>
|
|
546
|
+
<ChatHeader>
|
|
547
|
+
<ChatHeaderTitle />
|
|
548
|
+
<ChatHeaderActions>
|
|
549
|
+
<Button
|
|
550
|
+
variant='ghost'
|
|
551
|
+
color='neutral'
|
|
552
|
+
size='small'
|
|
553
|
+
aria-label='Close chat'
|
|
554
|
+
data-analytics-id='AI_CHAT_CLOSE'
|
|
555
|
+
>
|
|
556
|
+
<X />
|
|
557
|
+
</Button>
|
|
558
|
+
</ChatHeaderActions>
|
|
559
|
+
</ChatHeader>
|
|
560
|
+
<ChatBody />
|
|
561
|
+
<ChatFooter>
|
|
562
|
+
<ChatSuggestions label='Suggestions'>
|
|
563
|
+
{SUGGESTIONS.map((text, index) => (
|
|
564
|
+
<ChatSuggestion
|
|
565
|
+
key={text}
|
|
566
|
+
data-testid={`chat--suggestion-${index}`}
|
|
567
|
+
data-analytics-id='AI_CHAT_SUGGESTION'
|
|
568
|
+
data-analytics-props={JSON.stringify({ index })}
|
|
569
|
+
>
|
|
570
|
+
{text}
|
|
571
|
+
</ChatSuggestion>
|
|
572
|
+
))}
|
|
573
|
+
</ChatSuggestions>
|
|
574
|
+
</ChatFooter>
|
|
575
|
+
</Chat>
|
|
576
|
+
</div>
|
|
577
|
+
);
|
|
578
|
+
|
|
579
|
+
/**
|
|
580
|
+
* The app-header button that opens the panel (Figma 101:1034): the Wally mascot in a ghost small
|
|
581
|
+
* `Button`, with an "Ask Wally" tooltip that doubles as its accessible name (`label`).
|
|
582
|
+
*/
|
|
583
|
+
export const Trigger: StoryFn<typeof meta> = () => <ChatTrigger data-testid='chat-trigger' />;
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* `ChatTrigger` under `DrawerTrigger asChild`: the drawer owns the open state and `aria-expanded`,
|
|
587
|
+
* the tooltip keeps its anchor through the shared trigger id.
|
|
588
|
+
*/
|
|
589
|
+
export const TriggerWithDrawer: StoryFn<typeof meta> = () => (
|
|
590
|
+
<Drawer width={480}>
|
|
591
|
+
<DrawerTrigger asChild>
|
|
592
|
+
<ChatTrigger data-testid='chat-trigger' data-analytics-id='AI_CHAT_OPEN' />
|
|
593
|
+
</DrawerTrigger>
|
|
594
|
+
<DrawerContent>
|
|
595
|
+
<Chat data-testid='chat'>
|
|
596
|
+
<ChatHeader>
|
|
597
|
+
<ChatHeaderTitle />
|
|
598
|
+
<ChatHeaderActions>
|
|
599
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>
|
|
600
|
+
<History />
|
|
601
|
+
</Button>
|
|
602
|
+
<DropdownMenu positioning={{ placement: 'bottom-end' }}>
|
|
603
|
+
<DropdownMenuTrigger asChild>
|
|
604
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='More actions'>
|
|
605
|
+
<Ellipsis />
|
|
606
|
+
</Button>
|
|
607
|
+
</DropdownMenuTrigger>
|
|
608
|
+
<DropdownMenuContent>
|
|
609
|
+
<DropdownMenuItem>Rename chat</DropdownMenuItem>
|
|
610
|
+
<DropdownMenuItem>Delete chat</DropdownMenuItem>
|
|
611
|
+
</DropdownMenuContent>
|
|
612
|
+
</DropdownMenu>
|
|
613
|
+
<Separator orientation='vertical' />
|
|
614
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>
|
|
615
|
+
<X />
|
|
616
|
+
</Button>
|
|
617
|
+
</ChatHeaderActions>
|
|
618
|
+
</ChatHeader>
|
|
619
|
+
<ChatBody />
|
|
620
|
+
</Chat>
|
|
621
|
+
</DrawerContent>
|
|
622
|
+
</Drawer>
|
|
623
|
+
);
|
|
624
|
+
|
|
625
|
+
// ---------------------------------------------------------------------------
|
|
626
|
+
// Composed panels: every AI part together, with mock data only.
|
|
627
|
+
// ---------------------------------------------------------------------------
|
|
628
|
+
|
|
629
|
+
const QUESTION = 'Why were requests to /api/login blocked last night?';
|
|
630
|
+
const ANSWER_TEXT =
|
|
631
|
+
'Wallarm blocked 1,204 SQL injection attempts against /api/login, mostly from 203.0.113.0/24.';
|
|
632
|
+
const FOLLOW_UPS = ['Deny 203.0.113.0/24', 'Show the matched rule'];
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* The full empty panel: the greeting with Large suggestion pills over the `strong` background,
|
|
636
|
+
* and the composer in the footer. A pill click would send its text as the first message.
|
|
637
|
+
*/
|
|
638
|
+
export const EmptyPanel: StoryFn<typeof meta> = () => {
|
|
639
|
+
const [value, setValue] = useState('');
|
|
640
|
+
const handleSubmit = () => setValue('');
|
|
641
|
+
|
|
642
|
+
return (
|
|
643
|
+
<div className='h-640 w-480'>
|
|
644
|
+
<Chat data-testid='chat' background='strong'>
|
|
645
|
+
<ChatHeader>
|
|
646
|
+
<ChatHeaderTitle />
|
|
647
|
+
<ChatHeaderActions>
|
|
648
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>
|
|
649
|
+
<History />
|
|
650
|
+
</Button>
|
|
651
|
+
<DropdownMenu positioning={{ placement: 'bottom-end' }}>
|
|
652
|
+
<DropdownMenuTrigger asChild>
|
|
653
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='More actions'>
|
|
654
|
+
<Ellipsis />
|
|
655
|
+
</Button>
|
|
656
|
+
</DropdownMenuTrigger>
|
|
657
|
+
<DropdownMenuContent>
|
|
658
|
+
<DropdownMenuItem>Rename chat</DropdownMenuItem>
|
|
659
|
+
<DropdownMenuItem>Delete chat</DropdownMenuItem>
|
|
660
|
+
</DropdownMenuContent>
|
|
661
|
+
</DropdownMenu>
|
|
662
|
+
<Separator orientation='vertical' />
|
|
663
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>
|
|
664
|
+
<X />
|
|
665
|
+
</Button>
|
|
666
|
+
</ChatHeaderActions>
|
|
667
|
+
</ChatHeader>
|
|
668
|
+
<ChatBody>
|
|
669
|
+
<ChatGreeting title='How can I help you today?'>
|
|
670
|
+
<ChatSuggestions placement='greeting' label='Suggestions'>
|
|
671
|
+
{SUGGESTIONS.map((text, index) => (
|
|
672
|
+
<ChatSuggestion key={text} data-testid={`chat--suggestion-${index}`}>
|
|
673
|
+
{text}
|
|
674
|
+
</ChatSuggestion>
|
|
675
|
+
))}
|
|
676
|
+
</ChatSuggestions>
|
|
677
|
+
</ChatGreeting>
|
|
678
|
+
</ChatBody>
|
|
679
|
+
<ChatFooter>
|
|
680
|
+
<ChatInput value={value} onValueChange={setValue} onSubmit={handleSubmit}>
|
|
681
|
+
<ChatInputTextarea />
|
|
682
|
+
<ChatInputSubmit />
|
|
683
|
+
</ChatInput>
|
|
684
|
+
</ChatFooter>
|
|
685
|
+
</Chat>
|
|
686
|
+
</div>
|
|
687
|
+
);
|
|
688
|
+
};
|
|
689
|
+
|
|
690
|
+
/**
|
|
691
|
+
* A finished turn: the user's question, then Wally's answer with collapsed reasoning, rendered
|
|
692
|
+
* markdown and a visible actions row; follow-up suggestions sit above the composer.
|
|
693
|
+
*/
|
|
694
|
+
export const Conversation: StoryFn<typeof meta> = () => {
|
|
695
|
+
const [value, setValue] = useState('');
|
|
696
|
+
const handleSubmit = () => setValue('');
|
|
697
|
+
|
|
698
|
+
return (
|
|
699
|
+
<div className='h-640 w-480'>
|
|
700
|
+
<Chat data-testid='chat'>
|
|
701
|
+
<ChatHeader>
|
|
702
|
+
<ChatHeaderTitle />
|
|
703
|
+
<ChatHeaderActions>
|
|
704
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>
|
|
705
|
+
<History />
|
|
706
|
+
</Button>
|
|
707
|
+
<DropdownMenu positioning={{ placement: 'bottom-end' }}>
|
|
708
|
+
<DropdownMenuTrigger asChild>
|
|
709
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='More actions'>
|
|
710
|
+
<Ellipsis />
|
|
711
|
+
</Button>
|
|
712
|
+
</DropdownMenuTrigger>
|
|
713
|
+
<DropdownMenuContent>
|
|
714
|
+
<DropdownMenuItem>Rename chat</DropdownMenuItem>
|
|
715
|
+
<DropdownMenuItem>Delete chat</DropdownMenuItem>
|
|
716
|
+
</DropdownMenuContent>
|
|
717
|
+
</DropdownMenu>
|
|
718
|
+
<Separator orientation='vertical' />
|
|
719
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>
|
|
720
|
+
<X />
|
|
721
|
+
</Button>
|
|
722
|
+
</ChatHeaderActions>
|
|
723
|
+
</ChatHeader>
|
|
724
|
+
<ChatBody>
|
|
725
|
+
<UserMessage data-testid='chat--user-message-0'>
|
|
726
|
+
<UserMessageBubble>{QUESTION}</UserMessageBubble>
|
|
727
|
+
<MessageActions>
|
|
728
|
+
<MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>
|
|
729
|
+
<Copyable text={QUESTION}>
|
|
730
|
+
<MessageAction aria-label='Copy'>
|
|
731
|
+
<CopyableIcon />
|
|
732
|
+
</MessageAction>
|
|
733
|
+
</Copyable>
|
|
734
|
+
</MessageActions>
|
|
735
|
+
</UserMessage>
|
|
736
|
+
<AssistantMessage data-testid='chat--assistant-message-0'>
|
|
737
|
+
<ChainOfThought>
|
|
738
|
+
<ChainOfThoughtStep icon={<Brain />} label='Thought for 5s'>
|
|
739
|
+
<p>
|
|
740
|
+
Look up blocked requests to /api/login for last night, then group them by source.
|
|
741
|
+
</p>
|
|
742
|
+
</ChainOfThoughtStep>
|
|
743
|
+
<ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />
|
|
744
|
+
<ChainOfThoughtStep
|
|
745
|
+
icon={<Database />}
|
|
746
|
+
label='Queried attack events'
|
|
747
|
+
metric='1,204'
|
|
748
|
+
/>
|
|
749
|
+
</ChainOfThought>
|
|
750
|
+
<AssistantMessageContent>
|
|
751
|
+
<h3>SQL injection on the login endpoint</h3>
|
|
752
|
+
<p>
|
|
753
|
+
Wallarm blocked 1,204 SQL injection attempts, almost all against{' '}
|
|
754
|
+
<InlineCodeSnippet code='/api/login' size='sm' />.
|
|
755
|
+
</p>
|
|
756
|
+
<ul>
|
|
757
|
+
<li>
|
|
758
|
+
Most came from <InlineCodeSnippet code='203.0.113.0/24' size='sm' />.
|
|
759
|
+
</li>
|
|
760
|
+
<li>The peak was at 03:00 UTC.</li>
|
|
761
|
+
<li>No request reached the application.</li>
|
|
762
|
+
</ul>
|
|
763
|
+
</AssistantMessageContent>
|
|
764
|
+
<MessageActions visible>
|
|
765
|
+
<Copyable text={ANSWER_TEXT}>
|
|
766
|
+
<MessageAction aria-label='Copy' data-testid='chat--answer-copy'>
|
|
767
|
+
<CopyableIcon />
|
|
768
|
+
</MessageAction>
|
|
769
|
+
</Copyable>
|
|
770
|
+
<MessageAction aria-label='Good response'>
|
|
771
|
+
<ThumbsUp />
|
|
772
|
+
</MessageAction>
|
|
773
|
+
<MessageAction aria-label='Bad response'>
|
|
774
|
+
<ThumbsDown />
|
|
775
|
+
</MessageAction>
|
|
776
|
+
<MessageTimestamp dateTime='2026-10-21T09:42:00Z'>1m ago</MessageTimestamp>
|
|
777
|
+
</MessageActions>
|
|
778
|
+
</AssistantMessage>
|
|
779
|
+
</ChatBody>
|
|
780
|
+
<ChatFooter>
|
|
781
|
+
<ChatSuggestions label='Suggestions'>
|
|
782
|
+
{FOLLOW_UPS.map((text, index) => (
|
|
783
|
+
<ChatSuggestion key={text} data-testid={`chat--suggestion-${index}`}>
|
|
784
|
+
{text}
|
|
785
|
+
</ChatSuggestion>
|
|
786
|
+
))}
|
|
787
|
+
</ChatSuggestions>
|
|
788
|
+
<ChatInput value={value} onValueChange={setValue} onSubmit={handleSubmit}>
|
|
789
|
+
<ChatInputTextarea />
|
|
790
|
+
<ChatInputSubmit />
|
|
791
|
+
</ChatInput>
|
|
792
|
+
</ChatFooter>
|
|
793
|
+
</Chat>
|
|
794
|
+
</div>
|
|
795
|
+
);
|
|
796
|
+
};
|
|
797
|
+
|
|
798
|
+
/**
|
|
799
|
+
* A reply in flight: `ChatBody` and the message carry `aria-busy`, the running step shimmers,
|
|
800
|
+
* and the submit is Stop. Stop (or Esc in the textarea) ends the run in this demo.
|
|
801
|
+
*/
|
|
802
|
+
export const Streaming: StoryFn<typeof meta> = () => {
|
|
803
|
+
const [value, setValue] = useState('');
|
|
804
|
+
const [isRunning, setIsRunning] = useState(true);
|
|
805
|
+
const handleSubmit = () => setValue('');
|
|
806
|
+
const handleStop = () => setIsRunning(false);
|
|
807
|
+
|
|
808
|
+
return (
|
|
809
|
+
<div className='h-640 w-480'>
|
|
810
|
+
<Chat data-testid='chat'>
|
|
811
|
+
<ChatHeader>
|
|
812
|
+
<ChatHeaderTitle />
|
|
813
|
+
<ChatHeaderActions>
|
|
814
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>
|
|
815
|
+
<History />
|
|
816
|
+
</Button>
|
|
817
|
+
<DropdownMenu positioning={{ placement: 'bottom-end' }}>
|
|
818
|
+
<DropdownMenuTrigger asChild>
|
|
819
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='More actions'>
|
|
820
|
+
<Ellipsis />
|
|
821
|
+
</Button>
|
|
822
|
+
</DropdownMenuTrigger>
|
|
823
|
+
<DropdownMenuContent>
|
|
824
|
+
<DropdownMenuItem>Rename chat</DropdownMenuItem>
|
|
825
|
+
<DropdownMenuItem>Delete chat</DropdownMenuItem>
|
|
826
|
+
</DropdownMenuContent>
|
|
827
|
+
</DropdownMenu>
|
|
828
|
+
<Separator orientation='vertical' />
|
|
829
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>
|
|
830
|
+
<X />
|
|
831
|
+
</Button>
|
|
832
|
+
</ChatHeaderActions>
|
|
833
|
+
</ChatHeader>
|
|
834
|
+
<ChatBody aria-busy={isRunning}>
|
|
835
|
+
<UserMessage data-testid='chat--user-message-0'>
|
|
836
|
+
<UserMessageBubble>{QUESTION}</UserMessageBubble>
|
|
837
|
+
<MessageActions>
|
|
838
|
+
<MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>
|
|
839
|
+
<Copyable text={QUESTION}>
|
|
840
|
+
<MessageAction aria-label='Copy'>
|
|
841
|
+
<CopyableIcon />
|
|
842
|
+
</MessageAction>
|
|
843
|
+
</Copyable>
|
|
844
|
+
</MessageActions>
|
|
845
|
+
</UserMessage>
|
|
846
|
+
<AssistantMessage data-testid='chat--assistant-message-0' aria-busy={isRunning}>
|
|
847
|
+
<ChainOfThought>
|
|
848
|
+
<ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />
|
|
849
|
+
<ChainOfThoughtStep
|
|
850
|
+
icon={<Database />}
|
|
851
|
+
label={isRunning ? 'Querying attack events...' : 'Stopped'}
|
|
852
|
+
status={isRunning ? 'running' : 'done'}
|
|
853
|
+
/>
|
|
854
|
+
</ChainOfThought>
|
|
855
|
+
<AssistantMessageContent>
|
|
856
|
+
<p>Wallarm blocked 1,204 SQL injection attempts, almost all against</p>
|
|
857
|
+
</AssistantMessageContent>
|
|
858
|
+
</AssistantMessage>
|
|
859
|
+
</ChatBody>
|
|
860
|
+
<ChatFooter>
|
|
861
|
+
<ChatInput
|
|
862
|
+
value={value}
|
|
863
|
+
onValueChange={setValue}
|
|
864
|
+
onSubmit={handleSubmit}
|
|
865
|
+
isRunning={isRunning}
|
|
866
|
+
onStop={handleStop}
|
|
867
|
+
>
|
|
868
|
+
<ChatInputTextarea />
|
|
869
|
+
<ChatInputSubmit />
|
|
870
|
+
</ChatInput>
|
|
871
|
+
</ChatFooter>
|
|
872
|
+
</Chat>
|
|
873
|
+
</div>
|
|
874
|
+
);
|
|
875
|
+
};
|
|
876
|
+
|
|
877
|
+
/**
|
|
878
|
+
* Human-in-the-loop: the pending `ApprovalCard` is docked in `ChatFooter` above the composer
|
|
879
|
+
* while the run waits. Allow or Reject resolves it in place (so its live region and focus work)
|
|
880
|
+
* and the answer continues.
|
|
881
|
+
*/
|
|
882
|
+
export const ApprovalDocked: StoryFn<typeof meta> = () => {
|
|
883
|
+
const [value, setValue] = useState('');
|
|
884
|
+
const [status, setStatus] = useState<ApprovalCardStatus>('pending');
|
|
885
|
+
const pending = status === 'pending';
|
|
886
|
+
const handleSubmit = () => setValue('');
|
|
887
|
+
const handleApprove = () => setStatus('approved');
|
|
888
|
+
const handleReject = () => setStatus('rejected');
|
|
889
|
+
|
|
890
|
+
return (
|
|
891
|
+
<div className='h-640 w-480'>
|
|
892
|
+
<Chat data-testid='chat'>
|
|
893
|
+
<ChatHeader>
|
|
894
|
+
<ChatHeaderTitle />
|
|
895
|
+
<ChatHeaderActions>
|
|
896
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>
|
|
897
|
+
<History />
|
|
898
|
+
</Button>
|
|
899
|
+
<DropdownMenu positioning={{ placement: 'bottom-end' }}>
|
|
900
|
+
<DropdownMenuTrigger asChild>
|
|
901
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='More actions'>
|
|
902
|
+
<Ellipsis />
|
|
903
|
+
</Button>
|
|
904
|
+
</DropdownMenuTrigger>
|
|
905
|
+
<DropdownMenuContent>
|
|
906
|
+
<DropdownMenuItem>Rename chat</DropdownMenuItem>
|
|
907
|
+
<DropdownMenuItem>Delete chat</DropdownMenuItem>
|
|
908
|
+
</DropdownMenuContent>
|
|
909
|
+
</DropdownMenu>
|
|
910
|
+
<Separator orientation='vertical' />
|
|
911
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>
|
|
912
|
+
<X />
|
|
913
|
+
</Button>
|
|
914
|
+
</ChatHeaderActions>
|
|
915
|
+
</ChatHeader>
|
|
916
|
+
<ChatBody aria-busy={pending}>
|
|
917
|
+
<UserMessage data-testid='chat--user-message-0'>
|
|
918
|
+
<UserMessageBubble>{QUESTION}</UserMessageBubble>
|
|
919
|
+
<MessageActions>
|
|
920
|
+
<MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>
|
|
921
|
+
<Copyable text={QUESTION}>
|
|
922
|
+
<MessageAction aria-label='Copy'>
|
|
923
|
+
<CopyableIcon />
|
|
924
|
+
</MessageAction>
|
|
925
|
+
</Copyable>
|
|
926
|
+
</MessageActions>
|
|
927
|
+
</UserMessage>
|
|
928
|
+
<AssistantMessage data-testid='chat--assistant-message-0'>
|
|
929
|
+
<ChainOfThought>
|
|
930
|
+
<ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />
|
|
931
|
+
<ChainOfThoughtStep
|
|
932
|
+
icon={<ShieldBan />}
|
|
933
|
+
label='Proposed a denylist entry'
|
|
934
|
+
status={pending ? 'running' : 'done'}
|
|
935
|
+
/>
|
|
936
|
+
</ChainOfThought>
|
|
937
|
+
{!pending && (
|
|
938
|
+
<AssistantMessageContent>
|
|
939
|
+
<p>
|
|
940
|
+
{status === 'approved'
|
|
941
|
+
? 'Done. 203.0.113.0/24 is now denied on all applications.'
|
|
942
|
+
: 'Okay, I left the denylist unchanged.'}
|
|
943
|
+
</p>
|
|
944
|
+
</AssistantMessageContent>
|
|
945
|
+
)}
|
|
946
|
+
</AssistantMessage>
|
|
947
|
+
</ChatBody>
|
|
948
|
+
<ChatFooter>
|
|
949
|
+
<ApprovalCard status={status}>
|
|
950
|
+
<ApprovalCardContent>
|
|
951
|
+
<p>
|
|
952
|
+
Add <InlineCodeSnippet code='203.0.113.0/24' size='sm' /> to the denylist on all
|
|
953
|
+
applications
|
|
954
|
+
</p>
|
|
955
|
+
</ApprovalCardContent>
|
|
956
|
+
<ApprovalCardActions>
|
|
957
|
+
<Button data-testid='chat--approve' onClick={handleApprove}>
|
|
958
|
+
Allow
|
|
959
|
+
</Button>
|
|
960
|
+
<Button
|
|
961
|
+
variant='secondary'
|
|
962
|
+
color='neutral'
|
|
963
|
+
data-testid='chat--reject'
|
|
964
|
+
onClick={handleReject}
|
|
965
|
+
>
|
|
966
|
+
Reject
|
|
967
|
+
</Button>
|
|
968
|
+
</ApprovalCardActions>
|
|
969
|
+
</ApprovalCard>
|
|
970
|
+
<ChatInput
|
|
971
|
+
value={value}
|
|
972
|
+
onValueChange={setValue}
|
|
973
|
+
onSubmit={handleSubmit}
|
|
974
|
+
isRunning={pending}
|
|
975
|
+
>
|
|
976
|
+
<ChatInputTextarea />
|
|
977
|
+
<ChatInputSubmit />
|
|
978
|
+
</ChatInput>
|
|
979
|
+
</ChatFooter>
|
|
980
|
+
</Chat>
|
|
981
|
+
</div>
|
|
982
|
+
);
|
|
983
|
+
};
|
|
984
|
+
|
|
985
|
+
/** After the decision the docked card collapses to a one-line status and the answer completes. */
|
|
986
|
+
export const ApprovalResolved: StoryFn<typeof meta> = () => {
|
|
987
|
+
const [value, setValue] = useState('');
|
|
988
|
+
const handleSubmit = () => setValue('');
|
|
989
|
+
|
|
990
|
+
return (
|
|
991
|
+
<div className='h-640 w-480'>
|
|
992
|
+
<Chat data-testid='chat'>
|
|
993
|
+
<ChatHeader>
|
|
994
|
+
<ChatHeaderTitle />
|
|
995
|
+
<ChatHeaderActions>
|
|
996
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>
|
|
997
|
+
<History />
|
|
998
|
+
</Button>
|
|
999
|
+
<DropdownMenu positioning={{ placement: 'bottom-end' }}>
|
|
1000
|
+
<DropdownMenuTrigger asChild>
|
|
1001
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='More actions'>
|
|
1002
|
+
<Ellipsis />
|
|
1003
|
+
</Button>
|
|
1004
|
+
</DropdownMenuTrigger>
|
|
1005
|
+
<DropdownMenuContent>
|
|
1006
|
+
<DropdownMenuItem>Rename chat</DropdownMenuItem>
|
|
1007
|
+
<DropdownMenuItem>Delete chat</DropdownMenuItem>
|
|
1008
|
+
</DropdownMenuContent>
|
|
1009
|
+
</DropdownMenu>
|
|
1010
|
+
<Separator orientation='vertical' />
|
|
1011
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>
|
|
1012
|
+
<X />
|
|
1013
|
+
</Button>
|
|
1014
|
+
</ChatHeaderActions>
|
|
1015
|
+
</ChatHeader>
|
|
1016
|
+
<ChatBody>
|
|
1017
|
+
<UserMessage data-testid='chat--user-message-0'>
|
|
1018
|
+
<UserMessageBubble>{QUESTION}</UserMessageBubble>
|
|
1019
|
+
<MessageActions>
|
|
1020
|
+
<MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>
|
|
1021
|
+
<Copyable text={QUESTION}>
|
|
1022
|
+
<MessageAction aria-label='Copy'>
|
|
1023
|
+
<CopyableIcon />
|
|
1024
|
+
</MessageAction>
|
|
1025
|
+
</Copyable>
|
|
1026
|
+
</MessageActions>
|
|
1027
|
+
</UserMessage>
|
|
1028
|
+
<AssistantMessage data-testid='chat--assistant-message-0'>
|
|
1029
|
+
<ChainOfThought>
|
|
1030
|
+
<ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />
|
|
1031
|
+
<ChainOfThoughtStep icon={<ShieldBan />} label='Proposed a denylist entry' />
|
|
1032
|
+
</ChainOfThought>
|
|
1033
|
+
<AssistantMessageContent>
|
|
1034
|
+
<p>Done. 203.0.113.0/24 is now denied on all applications.</p>
|
|
1035
|
+
</AssistantMessageContent>
|
|
1036
|
+
</AssistantMessage>
|
|
1037
|
+
</ChatBody>
|
|
1038
|
+
<ChatFooter>
|
|
1039
|
+
{/* Content and actions render only while pending; a resolved card shows just its status row. */}
|
|
1040
|
+
<ApprovalCard status='approved' />
|
|
1041
|
+
<ChatInput value={value} onValueChange={setValue} onSubmit={handleSubmit}>
|
|
1042
|
+
<ChatInputTextarea />
|
|
1043
|
+
<ChatInputSubmit />
|
|
1044
|
+
</ChatInput>
|
|
1045
|
+
</ChatFooter>
|
|
1046
|
+
</Chat>
|
|
1047
|
+
</div>
|
|
1048
|
+
);
|
|
1049
|
+
};
|
|
1050
|
+
|
|
1051
|
+
const TOOLS = [
|
|
1052
|
+
{ name: 'search_attacks', description: 'Search attacks and blocked requests' },
|
|
1053
|
+
{ name: 'get_api_inventory', description: 'Read the discovered API endpoints' },
|
|
1054
|
+
{ name: 'propose_add_to_denylist', description: 'Propose adding IPs to the denylist' },
|
|
1055
|
+
];
|
|
1056
|
+
|
|
1057
|
+
/** The per-conversation tool permissions sit inside the composer, between textarea and submit. */
|
|
1058
|
+
export const Permissions: StoryFn<typeof meta> = () => {
|
|
1059
|
+
const [value, setValue] = useState('');
|
|
1060
|
+
const [allowed, setAllowed] = useState<Record<string, boolean>>({
|
|
1061
|
+
search_attacks: true,
|
|
1062
|
+
get_api_inventory: true,
|
|
1063
|
+
propose_add_to_denylist: false,
|
|
1064
|
+
});
|
|
1065
|
+
const handleSubmit = () => setValue('');
|
|
1066
|
+
const handlePermissionChange = ({ checked, name }: ChatPermissionsItemCheckedChangeDetails) =>
|
|
1067
|
+
setAllowed(prev => ({ ...prev, [name]: checked }));
|
|
1068
|
+
|
|
1069
|
+
return (
|
|
1070
|
+
<div className='h-640 w-480'>
|
|
1071
|
+
<Chat data-testid='chat' background='strong'>
|
|
1072
|
+
<ChatHeader>
|
|
1073
|
+
<ChatHeaderTitle />
|
|
1074
|
+
<ChatHeaderActions>
|
|
1075
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>
|
|
1076
|
+
<History />
|
|
1077
|
+
</Button>
|
|
1078
|
+
<DropdownMenu positioning={{ placement: 'bottom-end' }}>
|
|
1079
|
+
<DropdownMenuTrigger asChild>
|
|
1080
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='More actions'>
|
|
1081
|
+
<Ellipsis />
|
|
1082
|
+
</Button>
|
|
1083
|
+
</DropdownMenuTrigger>
|
|
1084
|
+
<DropdownMenuContent>
|
|
1085
|
+
<DropdownMenuItem>Rename chat</DropdownMenuItem>
|
|
1086
|
+
<DropdownMenuItem>Delete chat</DropdownMenuItem>
|
|
1087
|
+
</DropdownMenuContent>
|
|
1088
|
+
</DropdownMenu>
|
|
1089
|
+
<Separator orientation='vertical' />
|
|
1090
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>
|
|
1091
|
+
<X />
|
|
1092
|
+
</Button>
|
|
1093
|
+
</ChatHeaderActions>
|
|
1094
|
+
</ChatHeader>
|
|
1095
|
+
<ChatBody>
|
|
1096
|
+
<ChatGreeting title='How can I help you today?' />
|
|
1097
|
+
</ChatBody>
|
|
1098
|
+
<ChatFooter>
|
|
1099
|
+
<ChatInput value={value} onValueChange={setValue} onSubmit={handleSubmit}>
|
|
1100
|
+
<ChatInputTextarea />
|
|
1101
|
+
<ChatPermissions>
|
|
1102
|
+
<ChatPermissionsTrigger />
|
|
1103
|
+
<ChatPermissionsContent>
|
|
1104
|
+
{TOOLS.map(tool => (
|
|
1105
|
+
<ChatPermissionsItem
|
|
1106
|
+
key={tool.name}
|
|
1107
|
+
name={tool.name}
|
|
1108
|
+
data-testid={`chat--permission-${tool.name}`}
|
|
1109
|
+
title={tool.name}
|
|
1110
|
+
description={tool.description}
|
|
1111
|
+
checked={allowed[tool.name]}
|
|
1112
|
+
onCheckedChange={handlePermissionChange}
|
|
1113
|
+
/>
|
|
1114
|
+
))}
|
|
1115
|
+
</ChatPermissionsContent>
|
|
1116
|
+
</ChatPermissions>
|
|
1117
|
+
<ChatInputSubmit />
|
|
1118
|
+
</ChatInput>
|
|
1119
|
+
</ChatFooter>
|
|
1120
|
+
</Chat>
|
|
1121
|
+
</div>
|
|
1122
|
+
);
|
|
1123
|
+
};
|
|
1124
|
+
|
|
1125
|
+
/**
|
|
1126
|
+
* The real host: `ChatTrigger` opens a 480px right-hand `Drawer` holding the conversation, and
|
|
1127
|
+
* Close is a `DrawerClose`. Esc in the textarea while running stops the reply instead of closing
|
|
1128
|
+
* the drawer; ChatInput handles that itself, so the host needs no `onEscapeKeyDown`.
|
|
1129
|
+
*/
|
|
1130
|
+
export const InDrawer: StoryFn<typeof meta> = () => {
|
|
1131
|
+
const [value, setValue] = useState('');
|
|
1132
|
+
const [isRunning, setIsRunning] = useState(true);
|
|
1133
|
+
const handleSubmit = () => setValue('');
|
|
1134
|
+
const handleStop = () => setIsRunning(false);
|
|
1135
|
+
|
|
1136
|
+
return (
|
|
1137
|
+
<Drawer width={480}>
|
|
1138
|
+
<DrawerTrigger asChild>
|
|
1139
|
+
<ChatTrigger data-testid='chat-trigger' />
|
|
1140
|
+
</DrawerTrigger>
|
|
1141
|
+
<DrawerContent>
|
|
1142
|
+
<Chat data-testid='chat'>
|
|
1143
|
+
<ChatHeader>
|
|
1144
|
+
<ChatHeaderTitle />
|
|
1145
|
+
<ChatHeaderActions>
|
|
1146
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>
|
|
1147
|
+
<History />
|
|
1148
|
+
</Button>
|
|
1149
|
+
<DropdownMenu positioning={{ placement: 'bottom-end' }}>
|
|
1150
|
+
<DropdownMenuTrigger asChild>
|
|
1151
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='More actions'>
|
|
1152
|
+
<Ellipsis />
|
|
1153
|
+
</Button>
|
|
1154
|
+
</DropdownMenuTrigger>
|
|
1155
|
+
<DropdownMenuContent>
|
|
1156
|
+
<DropdownMenuItem>Rename chat</DropdownMenuItem>
|
|
1157
|
+
<DropdownMenuItem>Delete chat</DropdownMenuItem>
|
|
1158
|
+
</DropdownMenuContent>
|
|
1159
|
+
</DropdownMenu>
|
|
1160
|
+
<Separator orientation='vertical' />
|
|
1161
|
+
<DrawerClose asChild>
|
|
1162
|
+
<Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>
|
|
1163
|
+
<X />
|
|
1164
|
+
</Button>
|
|
1165
|
+
</DrawerClose>
|
|
1166
|
+
</ChatHeaderActions>
|
|
1167
|
+
</ChatHeader>
|
|
1168
|
+
<ChatBody aria-busy={isRunning}>
|
|
1169
|
+
<UserMessage data-testid='chat--user-message-0'>
|
|
1170
|
+
<UserMessageBubble>{QUESTION}</UserMessageBubble>
|
|
1171
|
+
<MessageActions>
|
|
1172
|
+
<MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>
|
|
1173
|
+
<Copyable text={QUESTION}>
|
|
1174
|
+
<MessageAction aria-label='Copy'>
|
|
1175
|
+
<CopyableIcon />
|
|
1176
|
+
</MessageAction>
|
|
1177
|
+
</Copyable>
|
|
1178
|
+
</MessageActions>
|
|
1179
|
+
</UserMessage>
|
|
1180
|
+
<AssistantMessage data-testid='chat--assistant-message-0' aria-busy={isRunning}>
|
|
1181
|
+
<ChainOfThought>
|
|
1182
|
+
<ChainOfThoughtStep icon={<Brain />} label='Thought for 5s'>
|
|
1183
|
+
<p>
|
|
1184
|
+
Look up blocked requests to /api/login for last night, then group them by
|
|
1185
|
+
source.
|
|
1186
|
+
</p>
|
|
1187
|
+
</ChainOfThoughtStep>
|
|
1188
|
+
<ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />
|
|
1189
|
+
<ChainOfThoughtStep
|
|
1190
|
+
icon={<Database />}
|
|
1191
|
+
label='Queried attack events'
|
|
1192
|
+
metric='1,204'
|
|
1193
|
+
/>
|
|
1194
|
+
</ChainOfThought>
|
|
1195
|
+
<AssistantMessageContent>
|
|
1196
|
+
<h3>SQL injection on the login endpoint</h3>
|
|
1197
|
+
<p>
|
|
1198
|
+
Wallarm blocked 1,204 SQL injection attempts, almost all against{' '}
|
|
1199
|
+
<InlineCodeSnippet code='/api/login' size='sm' />.
|
|
1200
|
+
</p>
|
|
1201
|
+
<ul>
|
|
1202
|
+
<li>
|
|
1203
|
+
Most came from <InlineCodeSnippet code='203.0.113.0/24' size='sm' />.
|
|
1204
|
+
</li>
|
|
1205
|
+
<li>The peak was at 03:00 UTC.</li>
|
|
1206
|
+
<li>No request reached the application.</li>
|
|
1207
|
+
</ul>
|
|
1208
|
+
</AssistantMessageContent>
|
|
1209
|
+
{!isRunning && (
|
|
1210
|
+
<MessageActions visible>
|
|
1211
|
+
<Copyable text={ANSWER_TEXT}>
|
|
1212
|
+
<MessageAction aria-label='Copy' data-testid='chat--answer-copy'>
|
|
1213
|
+
<CopyableIcon />
|
|
1214
|
+
</MessageAction>
|
|
1215
|
+
</Copyable>
|
|
1216
|
+
<MessageAction aria-label='Good response'>
|
|
1217
|
+
<ThumbsUp />
|
|
1218
|
+
</MessageAction>
|
|
1219
|
+
<MessageAction aria-label='Bad response'>
|
|
1220
|
+
<ThumbsDown />
|
|
1221
|
+
</MessageAction>
|
|
1222
|
+
<MessageTimestamp dateTime='2026-10-21T09:42:00Z'>1m ago</MessageTimestamp>
|
|
1223
|
+
</MessageActions>
|
|
1224
|
+
)}
|
|
1225
|
+
</AssistantMessage>
|
|
1226
|
+
</ChatBody>
|
|
1227
|
+
<ChatFooter>
|
|
1228
|
+
<ChatInput
|
|
1229
|
+
value={value}
|
|
1230
|
+
onValueChange={setValue}
|
|
1231
|
+
onSubmit={handleSubmit}
|
|
1232
|
+
isRunning={isRunning}
|
|
1233
|
+
onStop={handleStop}
|
|
1234
|
+
>
|
|
1235
|
+
<ChatInputTextarea />
|
|
1236
|
+
<ChatInputSubmit />
|
|
1237
|
+
</ChatInput>
|
|
1238
|
+
</ChatFooter>
|
|
1239
|
+
</Chat>
|
|
1240
|
+
</DrawerContent>
|
|
1241
|
+
</Drawer>
|
|
1242
|
+
);
|
|
1243
|
+
};
|
|
1244
|
+
```
|