@nadicodeai/ui 12.1.165 → 12.1.166
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/AGENTS.md +8 -9
- package/README.md +2 -17
- package/dist/components/accordion.d.ts.map +1 -1
- package/dist/components/accordion.js +2 -1
- package/dist/components/account-menu.d.ts.map +1 -1
- package/dist/components/account-menu.js +5 -3
- package/dist/components/activity-calendar.d.ts.map +1 -1
- package/dist/components/activity-calendar.js +3 -2
- package/dist/components/agent-card.js +1 -1
- package/dist/components/agent-orb.d.ts.map +1 -1
- package/dist/components/agent-orb.js +1 -0
- package/dist/components/agent-profile.d.ts.map +1 -1
- package/dist/components/agent-profile.js +7 -4
- package/dist/components/alert-dialog.d.ts +1 -1
- package/dist/components/alert-dialog.d.ts.map +1 -1
- package/dist/components/alert-dialog.js +3 -3
- package/dist/components/app-mark.js +1 -1
- package/dist/components/avatar.js +8 -8
- package/dist/components/badge.d.ts +11 -16
- package/dist/components/badge.d.ts.map +1 -1
- package/dist/components/badge.js +7 -43
- package/dist/components/breadcrumb.d.ts.map +1 -1
- package/dist/components/breadcrumb.js +3 -2
- package/dist/components/button.d.ts +5 -21
- package/dist/components/button.d.ts.map +1 -1
- package/dist/components/button.js +6 -76
- package/dist/components/calendar.d.ts +1 -1
- package/dist/components/calendar.d.ts.map +1 -1
- package/dist/components/calendar.js +3 -3
- package/dist/components/card-row.js +1 -1
- package/dist/components/card.d.ts +4 -1
- package/dist/components/card.d.ts.map +1 -1
- package/dist/components/card.js +3 -2
- package/dist/components/catalog-drawer.d.ts.map +1 -1
- package/dist/components/catalog-drawer.js +3 -2
- package/dist/components/chart-axis.d.ts.map +1 -1
- package/dist/components/chart-axis.js +0 -2
- package/dist/components/chart-bar-horizontal.d.ts.map +1 -1
- package/dist/components/chart-bar-horizontal.js +16 -14
- package/dist/components/chart-card.d.ts.map +1 -1
- package/dist/components/chart-card.js +0 -1
- package/dist/components/chart.d.ts.map +1 -1
- package/dist/components/chart.js +18 -32
- package/dist/components/checkbox.d.ts +3 -2
- package/dist/components/checkbox.d.ts.map +1 -1
- package/dist/components/checkbox.js +4 -3
- package/dist/components/choicebox.d.ts +5 -5
- package/dist/components/choicebox.d.ts.map +1 -1
- package/dist/components/choicebox.js +6 -5
- package/dist/components/clearable-input.d.ts.map +1 -1
- package/dist/components/clearable-input.js +2 -2
- package/dist/components/code-block.d.ts.map +1 -1
- package/dist/components/code-block.js +4 -2
- package/dist/components/collapsible.js +1 -1
- package/dist/components/collection-filters.d.ts.map +1 -1
- package/dist/components/collection-filters.js +1 -0
- package/dist/components/collection-page.js +1 -1
- package/dist/components/collection-sort.d.ts.map +1 -1
- package/dist/components/collection-sort.js +1 -4
- package/dist/components/collection-toolbar.js +1 -1
- package/dist/components/combobox.js +4 -4
- package/dist/components/command.d.ts.map +1 -1
- package/dist/components/command.js +1 -1
- package/dist/components/confirm-dialog.js +2 -2
- package/dist/components/context-menu.d.ts +1 -1
- package/dist/components/context-menu.d.ts.map +1 -1
- package/dist/components/copy-button.js +1 -1
- package/dist/components/data-table.d.ts +11 -3
- package/dist/components/data-table.d.ts.map +1 -1
- package/dist/components/data-table.js +12 -4
- package/dist/components/dialog.d.ts +1 -1
- package/dist/components/dialog.d.ts.map +1 -1
- package/dist/components/dialog.js +2 -2
- package/dist/components/drawer.d.ts +4 -4
- package/dist/components/drawer.d.ts.map +1 -1
- package/dist/components/drawer.js +14 -15
- package/dist/components/dropdown-menu.d.ts +1 -1
- package/dist/components/dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu.js +9 -5
- package/dist/components/empty-art.js +1 -1
- package/dist/components/empty-state.js +2 -2
- package/dist/components/entry-scene.d.ts.map +1 -1
- package/dist/components/entry-scene.js +2 -3
- package/dist/components/field.js +3 -3
- package/dist/components/file-diff.d.ts.map +1 -1
- package/dist/components/file-diff.js +5 -2
- package/dist/components/footer.d.ts +1 -1
- package/dist/components/footer.d.ts.map +1 -1
- package/dist/components/footer.js +3 -3
- package/dist/components/form-dialog.d.ts.map +1 -1
- package/dist/components/form-dialog.js +2 -1
- package/dist/components/form-drawer.d.ts +7 -9
- package/dist/components/form-drawer.d.ts.map +1 -1
- package/dist/components/form-drawer.js +5 -5
- package/dist/components/form.d.ts +26 -0
- package/dist/components/form.d.ts.map +1 -0
- package/dist/components/form.js +29 -0
- package/dist/components/gauge.js +2 -2
- package/dist/components/heatmap/calendar-heatmap.d.ts.map +1 -1
- package/dist/components/heatmap/calendar-heatmap.js +15 -13
- package/dist/components/hive-scene.d.ts.map +1 -1
- package/dist/components/hive-scene.js +3 -1
- package/dist/components/hover-card.d.ts +1 -1
- package/dist/components/hover-card.d.ts.map +1 -1
- package/dist/components/hover-card.js +1 -1
- package/dist/components/input-group.d.ts +5 -6
- package/dist/components/input-group.d.ts.map +1 -1
- package/dist/components/input-group.js +8 -11
- package/dist/components/input-otp.d.ts.map +1 -1
- package/dist/components/input-otp.js +2 -2
- package/dist/components/item.d.ts +1 -1
- package/dist/components/item.js +2 -2
- package/dist/components/kbd.d.ts +6 -9
- package/dist/components/kbd.d.ts.map +1 -1
- package/dist/components/kbd.js +7 -3
- package/dist/components/message-notice.js +1 -1
- package/dist/components/middle-truncate.d.ts.map +1 -1
- package/dist/components/middle-truncate.js +1 -0
- package/dist/components/model-identity.d.ts +4 -4
- package/dist/components/model-identity.d.ts.map +1 -1
- package/dist/components/model-identity.js +2 -2
- package/dist/components/model-mark.d.ts.map +1 -1
- package/dist/components/model-mark.js +4 -2
- package/dist/components/multi-select.js +2 -2
- package/dist/components/native-select.d.ts.map +1 -1
- package/dist/components/native-select.js +2 -6
- package/dist/components/notice-banner.js +1 -1
- package/dist/components/object-page.js +2 -2
- package/dist/components/object-workspace.d.ts.map +1 -1
- package/dist/components/object-workspace.js +1 -3
- package/dist/components/overview-page.d.ts +1 -1
- package/dist/components/overview-page.d.ts.map +1 -1
- package/dist/components/overview-page.js +2 -1
- package/dist/components/page-actions.d.ts.map +1 -1
- package/dist/components/page-actions.js +9 -4
- package/dist/components/pairing-code.js +1 -1
- package/dist/components/pending-label.d.ts.map +1 -1
- package/dist/components/pending-label.js +0 -1
- package/dist/components/popover.d.ts +1 -1
- package/dist/components/popover.d.ts.map +1 -1
- package/dist/components/portal-sidebar-frame.d.ts.map +1 -1
- package/dist/components/portal-sidebar-frame.js +1 -1
- package/dist/components/product-message.d.ts.map +1 -1
- package/dist/components/product-message.js +1 -0
- package/dist/components/progress-checklist.d.ts.map +1 -1
- package/dist/components/progress-checklist.js +2 -2
- package/dist/components/progress.d.ts.map +1 -1
- package/dist/components/progress.js +5 -4
- package/dist/components/radio-group.js +2 -2
- package/dist/components/reading-column.js +1 -1
- package/dist/components/record-identity.d.ts.map +1 -1
- package/dist/components/record-identity.js +2 -5
- package/dist/components/record-list.d.ts.map +1 -1
- package/dist/components/record-list.js +4 -3
- package/dist/components/record-sheet.js +1 -1
- package/dist/components/record-time.d.ts.map +1 -1
- package/dist/components/record-time.js +2 -1
- package/dist/components/resizable.d.ts.map +1 -1
- package/dist/components/resizable.js +1 -1
- package/dist/components/row-edit-form.d.ts +2 -1
- package/dist/components/row-edit-form.d.ts.map +1 -1
- package/dist/components/row-edit-form.js +2 -1
- package/dist/components/run-timeline.js +1 -1
- package/dist/components/scope-switcher.js +1 -1
- package/dist/components/segmented-control.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/settings-facts.js +1 -1
- package/dist/components/settings-section.js +1 -1
- package/dist/components/sheet.d.ts +1 -1
- package/dist/components/sheet.d.ts.map +1 -1
- package/dist/components/sheet.js +1 -1
- package/dist/components/sidebar.d.ts +2 -2
- package/dist/components/sidebar.d.ts.map +1 -1
- package/dist/components/sidebar.js +16 -18
- package/dist/components/site-menu.d.ts +28 -0
- package/dist/components/site-menu.d.ts.map +1 -0
- package/dist/components/site-menu.js +23 -0
- package/dist/components/slider.d.ts.map +1 -1
- package/dist/components/slider.js +2 -1
- package/dist/components/snippet.d.ts +2 -0
- package/dist/components/snippet.d.ts.map +1 -1
- package/dist/components/snippet.js +13 -6
- package/dist/components/sonner.d.ts.map +1 -1
- package/dist/components/sonner.js +3 -4
- package/dist/components/status-badge.d.ts +1 -1
- package/dist/components/status-badge.d.ts.map +1 -1
- package/dist/components/switch.js +1 -1
- package/dist/components/table-card.js +1 -1
- package/dist/components/table.js +4 -4
- package/dist/components/tabs-nav.d.ts +52 -0
- package/dist/components/tabs-nav.d.ts.map +1 -0
- package/dist/components/tabs-nav.js +95 -0
- package/dist/components/tabs.d.ts +2 -56
- package/dist/components/tabs.d.ts.map +1 -1
- package/dist/components/tabs.js +2 -91
- package/dist/components/text-link.d.ts +1 -2
- package/dist/components/text-link.d.ts.map +1 -1
- package/dist/components/text-link.js +1 -2
- package/dist/components/textarea.d.ts +5 -2
- package/dist/components/textarea.d.ts.map +1 -1
- package/dist/components/textarea.js +12 -4
- package/dist/components/toast.d.ts +2 -0
- package/dist/components/toast.d.ts.map +1 -1
- package/dist/components/toast.js +4 -0
- package/dist/components/toggle-group.d.ts +3 -1
- package/dist/components/toggle-group.d.ts.map +1 -1
- package/dist/components/toggle-group.js +3 -6
- package/dist/components/toggle.js +1 -1
- package/dist/components/tooltip.d.ts +12 -12
- package/dist/components/tooltip.d.ts.map +1 -1
- package/dist/components/tooltip.js +9 -9
- package/dist/components/trend-badge.js +2 -2
- package/dist/components/update-card.js +1 -1
- package/dist/components/usage-meter.d.ts +1 -1
- package/dist/components/usage-meter.d.ts.map +1 -1
- package/dist/components/usage-meter.js +9 -7
- package/dist/components/waiting-line.js +1 -1
- package/dist/index.d.ts +3 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -7
- package/dist/internal/agent-orb-motion.d.ts +4 -1
- package/dist/internal/agent-orb-motion.d.ts.map +1 -1
- package/dist/internal/agent-orb-motion.js +9 -7
- package/dist/internal/agent-orb.d.ts +4 -1
- package/dist/internal/agent-orb.d.ts.map +1 -1
- package/dist/internal/agent-orb.js +7 -1
- package/dist/internal/assistant-ui/attachment.d.ts.map +1 -1
- package/dist/internal/assistant-ui/attachment.js +15 -15
- package/dist/internal/assistant-ui/follow-up-suggestions.js +1 -1
- package/dist/internal/assistant-ui/markdown-text.js +26 -25
- package/dist/internal/assistant-ui/reasoning.d.ts.map +1 -1
- package/dist/internal/assistant-ui/reasoning.js +13 -16
- package/dist/internal/assistant-ui/thread.d.ts.map +1 -1
- package/dist/internal/assistant-ui/thread.js +22 -16
- package/dist/internal/assistant-ui/tool-fallback.d.ts.map +1 -1
- package/dist/internal/assistant-ui/tool-fallback.js +29 -21
- package/dist/internal/assistant-ui/tool-group.d.ts.map +1 -1
- package/dist/internal/assistant-ui/tool-group.js +6 -7
- package/dist/internal/assistant-ui/tooltip-icon-button.js +1 -1
- package/dist/internal/badge-frame.d.ts +15 -0
- package/dist/internal/badge-frame.d.ts.map +1 -0
- package/dist/internal/badge-frame.js +44 -0
- package/dist/internal/button-classes.d.ts +20 -0
- package/dist/internal/button-classes.d.ts.map +1 -0
- package/dist/internal/button-classes.js +74 -0
- package/dist/internal/catalog-list.d.ts.map +1 -1
- package/dist/internal/catalog-list.js +8 -4
- package/dist/internal/collection-rail.js +3 -3
- package/dist/internal/form-drawer-frame.d.ts +10 -0
- package/dist/internal/form-drawer-frame.d.ts.map +1 -0
- package/dist/internal/form-drawer-frame.js +9 -0
- package/dist/internal/form-submit.d.ts +2 -1
- package/dist/internal/form-submit.d.ts.map +1 -1
- package/dist/internal/settings-save.d.ts.map +1 -1
- package/dist/internal/settings-save.js +4 -2
- package/dist/internal/status-mark.d.ts.map +1 -1
- package/dist/internal/status-mark.js +4 -1
- package/dist/internal/tab-row.d.ts +10 -0
- package/dist/internal/tab-row.d.ts.map +1 -0
- package/dist/internal/tab-row.js +2 -0
- package/dist/internal/table-compact-line.d.ts +1 -1
- package/dist/internal/table-compact-line.d.ts.map +1 -1
- package/dist/internal/table-compact-line.js +1 -1
- package/dist/internal/tooltip-content-frame.d.ts +14 -0
- package/dist/internal/tooltip-content-frame.d.ts.map +1 -0
- package/dist/internal/tooltip-content-frame.js +11 -0
- package/dist/lib/css-variables.d.ts +8 -0
- package/dist/lib/css-variables.d.ts.map +1 -0
- package/dist/lib/css-variables.js +4 -0
- package/dist/lib/merge-tokens.generated.js +1 -1
- package/dist/lib/use-copy-to-clipboard.d.ts.map +1 -1
- package/dist/lib/use-copy-to-clipboard.js +1 -2
- package/dist/showcase/samples.js +1 -1
- package/dist/showcase/specimens/choices.d.ts.map +1 -1
- package/dist/showcase/specimens/choices.js +3 -2
- package/dist/showcase/specimens/compositions.d.ts.map +1 -1
- package/dist/showcase/specimens/compositions.js +7 -5
- package/dist/showcase/specimens/data.d.ts.map +1 -1
- package/dist/showcase/specimens/data.js +1 -1
- package/dist/showcase/specimens/feedback.d.ts.map +1 -1
- package/dist/showcase/specimens/feedback.js +1 -2
- package/dist/showcase/specimens/index.d.ts +2 -0
- package/dist/showcase/specimens/index.d.ts.map +1 -1
- package/dist/showcase/specimens/inputs.d.ts +1 -0
- package/dist/showcase/specimens/inputs.d.ts.map +1 -1
- package/dist/showcase/specimens/inputs.js +5 -2
- package/dist/showcase/specimens/menus.d.ts +1 -0
- package/dist/showcase/specimens/menus.d.ts.map +1 -1
- package/dist/showcase/specimens/menus.js +7 -2
- package/dist/showcase/specimens/navigation.d.ts.map +1 -1
- package/dist/showcase/specimens/navigation.js +6 -5
- package/dist/showcase/specimens/status.d.ts.map +1 -1
- package/dist/showcase/specimens/status.js +4 -4
- package/dist/showcase/usage.generated.d.ts +1 -1
- package/dist/showcase/usage.generated.d.ts.map +1 -1
- package/dist/showcase/usage.generated.js +38 -16
- package/dist/standalone/index.js +1 -1
- package/dist/standalone/orb-page.js +10 -8
- package/dist/styles/components.css +1 -1
- package/package.json +32 -33
- package/dist/eslint/index.js +0 -224
- package/dist/eslint/rules/badge-is-static-label.js +0 -93
- package/dist/eslint/rules/button-icon-slot.js +0 -102
- package/dist/eslint/rules/button-link-for-navigation.js +0 -146
- package/dist/eslint/rules/button-no-aria-label-with-text.js +0 -75
- package/dist/eslint/rules/button-type-roles-only-in-buttons.js +0 -83
- package/dist/eslint/rules/choice-control-has-a-name.js +0 -98
- package/dist/eslint/rules/choice-group-in-fieldset.js +0 -86
- package/dist/eslint/rules/command-shortcut-single-owner.js +0 -118
- package/dist/eslint/rules/confirm-dialog-words.js +0 -63
- package/dist/eslint/rules/data-table-one-unsized-column.js +0 -96
- package/dist/eslint/rules/destructive-action-placement.js +0 -69
- package/dist/eslint/rules/disabled-choice-says-why.js +0 -71
- package/dist/eslint/rules/disabled-control-appearance.js +0 -75
- package/dist/eslint/rules/ellipsis-opens-a-dialog.js +0 -110
- package/dist/eslint/rules/empty-state-owner.js +0 -145
- package/dist/eslint/rules/input-group-owners.js +0 -155
- package/dist/eslint/rules/jsx-class-utility.js +0 -200
- package/dist/eslint/rules/kbd-children-no-modifier-text.js +0 -128
- package/dist/eslint/rules/literal-text.js +0 -41
- package/dist/eslint/rules/menu-owner.js +0 -75
- package/dist/eslint/rules/middle-truncate-placement.js +0 -69
- package/dist/eslint/rules/no-app-feature-component.js +0 -100
- package/dist/eslint/rules/no-bare-button-label.js +0 -55
- package/dist/eslint/rules/no-choice-control-wrapper.js +0 -97
- package/dist/eslint/rules/no-comment.js +0 -77
- package/dist/eslint/rules/no-control-in-read-only-surface.js +0 -106
- package/dist/eslint/rules/no-decorative-icon.js +0 -164
- package/dist/eslint/rules/no-deprecated-zod-api.js +0 -215
- package/dist/eslint/rules/no-global-patch.js +0 -115
- package/dist/eslint/rules/no-hand-built-busy.js +0 -104
- package/dist/eslint/rules/no-hand-built-theme-picker.js +0 -144
- package/dist/eslint/rules/no-hand-built-tile.js +0 -41
- package/dist/eslint/rules/no-hand-formatted-date.js +0 -87
- package/dist/eslint/rules/no-hand-stacked-avatars.js +0 -67
- package/dist/eslint/rules/no-nested-collapse.js +0 -60
- package/dist/eslint/rules/no-package-component-redefinition.js +0 -175
- package/dist/eslint/rules/no-search-in-form.js +0 -47
- package/dist/eslint/rules/no-shadcn-appearance-override.js +0 -305
- package/dist/eslint/rules/no-shell-prompt-in-snippet.js +0 -74
- package/dist/eslint/rules/no-stock-error-words.js +0 -56
- package/dist/eslint/rules/no-subject-derived-expectation.js +0 -183
- package/dist/eslint/rules/no-tooltip-around-labelled-field.js +0 -72
- package/dist/eslint/rules/no-weight-class-on-strong-in-type-role.js +0 -57
- package/dist/eslint/rules/no-write-in-subscription.js +0 -140
- package/dist/eslint/rules/one-submenu-level.js +0 -43
- package/dist/eslint/rules/one-toast-per-flow.js +0 -91
- package/dist/eslint/rules/option-count.js +0 -167
- package/dist/eslint/rules/page-command-link-not-render.js +0 -43
- package/dist/eslint/rules/page-composition.js +0 -232
- package/dist/eslint/rules/progress-needs-name.js +0 -57
- package/dist/eslint/rules/rendered-import.js +0 -121
- package/dist/eslint/rules/server-action-discipline.js +0 -233
- package/dist/eslint/rules/settings-limit-in-footer.js +0 -94
- package/dist/eslint/rules/skeleton-in-region.js +0 -80
- package/dist/eslint/rules/sortable-heading-uses-sort.js +0 -79
- package/dist/eslint/rules/table-cell-inset-owner.js +0 -107
- package/dist/eslint/rules/tabs-selection-is-controlled.js +0 -47
- package/dist/eslint/rules/test-files-from-one-definition.js +0 -67
- package/dist/eslint/rules/tooltip-only-arrow.js +0 -38
- package/dist/eslint/rules/tooltip-trigger-accessible-name.js +0 -114
- package/dist/eslint/rules/workspace-declares-imports.js +0 -163
- package/dist/eslint/strict-design-system.js +0 -250
|
@@ -7,9 +7,10 @@ import { useScrollLock } from "@assistant-ui/react";
|
|
|
7
7
|
import { MarkdownText } from "./markdown-text.js";
|
|
8
8
|
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../../components/collapsible.js";
|
|
9
9
|
import { cn } from "../../lib/utils.js";
|
|
10
|
+
import { cssVariables } from "../../lib/css-variables.js";
|
|
10
11
|
import { disclosureDuration, disclosureDurationMs } from "../../lib/motion.js";
|
|
11
12
|
const ReasoningPreviewContext = createContext(false);
|
|
12
|
-
const reasoningVariants = cva("
|
|
13
|
+
const reasoningVariants = cva("mb-4 w-full", {
|
|
13
14
|
variants: {
|
|
14
15
|
variant: {
|
|
15
16
|
outline: "rounded-md border px-3 py-2",
|
|
@@ -23,13 +24,11 @@ const reasoningVariants = cva("aui-reasoning-root mb-4 w-full", {
|
|
|
23
24
|
});
|
|
24
25
|
function ReasoningRoot({ className, variant, open: controlledOpen, onOpenChange: controlledOnOpenChange, defaultOpen = false, streaming, children, ...props }) {
|
|
25
26
|
const collapsibleRef = useRef(null);
|
|
26
|
-
const
|
|
27
|
+
const [initialOpen] = useState(defaultOpen);
|
|
27
28
|
const [userOpen, setUserOpen] = useState(null);
|
|
28
29
|
const lockScroll = useScrollLock(collapsibleRef, disclosureDurationMs);
|
|
29
30
|
const isControlled = controlledOpen !== undefined;
|
|
30
|
-
const isOpen = isControlled
|
|
31
|
-
? controlledOpen
|
|
32
|
-
: (userOpen ?? (streaming || initialOpenRef.current));
|
|
31
|
+
const isOpen = isControlled ? controlledOpen : (userOpen ?? (streaming === true || initialOpen));
|
|
33
32
|
const isPreview = streaming === true && isOpen;
|
|
34
33
|
const prevStreamingRef = useRef(streaming);
|
|
35
34
|
useLayoutEffect(() => {
|
|
@@ -38,10 +37,10 @@ function ReasoningRoot({ className, variant, open: controlledOpen, onOpenChange:
|
|
|
38
37
|
prevStreamingRef.current = streaming;
|
|
39
38
|
// A streaming transition only animates the panel when the resting state
|
|
40
39
|
// is collapsed; with `defaultOpen` the disclosure stays open across it.
|
|
41
|
-
if (!isControlled && userOpen === null && !
|
|
40
|
+
if (!isControlled && userOpen === null && !initialOpen) {
|
|
42
41
|
lockScroll();
|
|
43
42
|
}
|
|
44
|
-
}, [streaming, isControlled, userOpen, lockScroll]);
|
|
43
|
+
}, [streaming, isControlled, userOpen, initialOpen, lockScroll]);
|
|
45
44
|
const handleOpenChange = useCallback((open) => {
|
|
46
45
|
lockScroll();
|
|
47
46
|
if (!isControlled) {
|
|
@@ -49,25 +48,23 @@ function ReasoningRoot({ className, variant, open: controlledOpen, onOpenChange:
|
|
|
49
48
|
}
|
|
50
49
|
controlledOnOpenChange?.(open);
|
|
51
50
|
}, [lockScroll, isControlled, controlledOnOpenChange]);
|
|
52
|
-
return (_jsx(Collapsible, { ref: collapsibleRef, "data-slot": "reasoning-root", "data-variant": variant, open: isOpen, onOpenChange: handleOpenChange, className: cn("group/reasoning-root", reasoningVariants({ variant, className })),
|
|
53
|
-
// SAFETY: CSSProperties lists only standard properties; React sets each `--` custom property key here through style.setProperty.
|
|
54
|
-
style: {
|
|
51
|
+
return (_jsx(Collapsible, { ref: collapsibleRef, "data-slot": "reasoning-root", "data-variant": variant, open: isOpen, onOpenChange: handleOpenChange, className: cn("group/reasoning-root", reasoningVariants({ variant, className })), style: cssVariables({
|
|
55
52
|
"--animation-duration": disclosureDuration,
|
|
56
|
-
}, ...props, children: _jsx(ReasoningPreviewContext.Provider, { value: isPreview, children: children }) }));
|
|
53
|
+
}), ...props, children: _jsx(ReasoningPreviewContext.Provider, { value: isPreview, children: children }) }));
|
|
57
54
|
}
|
|
58
55
|
function ReasoningFade({ side = "bottom", className, ...props }) {
|
|
59
56
|
if (side === "top") {
|
|
60
|
-
return (_jsx("div", { "data-slot": "reasoning-fade", className: cn("
|
|
57
|
+
return (_jsx("div", { "data-slot": "reasoning-fade", className: cn("pointer-events-none absolute inset-x-0 top-0 z-10 h-8", "bg-background/90 group-data-[variant=muted]/reasoning-root:bg-muted/90", className), ...props }));
|
|
61
58
|
}
|
|
62
|
-
return (_jsx("div", { "data-slot": "reasoning-fade", className: cn("
|
|
59
|
+
return (_jsx("div", { "data-slot": "reasoning-fade", className: cn("pointer-events-none absolute inset-x-0 bottom-0 z-10 h-8", "bg-background/90 group-data-[variant=muted]/reasoning-root:bg-muted/90", className), ...props }));
|
|
63
60
|
}
|
|
64
61
|
function ReasoningTrigger({ active, duration, className, ...props }) {
|
|
65
62
|
const durationText = duration ? ` (${duration}s)` : "";
|
|
66
|
-
return (_jsxs(CollapsibleTrigger, { "aria-busy": active
|
|
63
|
+
return (_jsxs(CollapsibleTrigger, { "aria-busy": active ? true : undefined, "data-slot": "reasoning-trigger", className: cn("nc-transition-paint group/trigger flex max-w-[75%] origin-left items-center gap-2 py-1.5 text-sm text-muted-foreground hover:text-foreground", className), ...props, children: [_jsx(BrainIcon, { "data-slot": "reasoning-trigger-icon", className: "size-4 shrink-0" }), _jsx("span", { "data-slot": "reasoning-trigger-label", className: "relative inline-block leading-none tabular-nums", children: _jsxs("span", { children: ["Reasoning", durationText] }) }), _jsx(ChevronDownIcon, { "data-slot": "reasoning-trigger-chevron", className: cn("mt-0.5 size-4 shrink-0", "transition-transform duration-(--animation-duration) ease-(--nc-ease-out-strong) motion-reduce:transition-none", "-rotate-90", "group-data-open/trigger:rotate-0", "group-data-panel-open/trigger:rotate-0") })] }));
|
|
67
64
|
}
|
|
68
65
|
function ReasoningContent({ className, children, ...props }) {
|
|
69
66
|
const isPreview = useContext(ReasoningPreviewContext);
|
|
70
|
-
return (_jsxs(CollapsibleContent, { "data-slot": "reasoning-content", className: cn("
|
|
67
|
+
return (_jsxs(CollapsibleContent, { "data-slot": "reasoning-content", className: cn("text-muted-foreground relative overflow-hidden text-sm outline-none", "group/collapsible-content", "data-closed:pointer-events-none", className), ...props, children: [_jsx(ReasoningFade, { side: "top" }), children, isPreview ? _jsx(ReasoningFade, {}) : null] }));
|
|
71
68
|
}
|
|
72
69
|
function ReasoningText({ className, children, ...props }) {
|
|
73
70
|
const isPreview = useContext(ReasoningPreviewContext);
|
|
@@ -112,7 +109,7 @@ function ReasoningText({ className, children, ...props }) {
|
|
|
112
109
|
observer.disconnect();
|
|
113
110
|
};
|
|
114
111
|
}, [isPreview]);
|
|
115
|
-
return (_jsx("div", { ref: scrollRef, "data-slot": "reasoning-text", className: cn("
|
|
112
|
+
return (_jsx("div", { ref: scrollRef, "data-slot": "reasoning-text", className: cn("relative z-0 max-h-64 overflow-y-auto ps-6 py-2 leading-relaxed text-pretty", "nc-transition-opacity", className), ...props, children: _jsx("div", { ref: contentRef, className: "space-y-4", children: children }) }));
|
|
116
113
|
}
|
|
117
114
|
const ReasoningImpl = () => _jsx(MarkdownText, {});
|
|
118
115
|
const Reasoning = memo(ReasoningImpl);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/thread.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,uCAAuC,CAAC;AAW/C,OAAO,EASL,gBAAgB,EAGhB,KAAK,4BAA4B,EAElC,MAAM,qBAAqB,CAAC;AAe7B,OAAO,
|
|
1
|
+
{"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/thread.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,uCAAuC,CAAC;AAW/C,OAAO,EASL,gBAAgB,EAGhB,KAAK,4BAA4B,EAElC,MAAM,qBAAqB,CAAC;AAe7B,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,EAAE,EACP,KAAK,iBAAiB,EACvB,MAAM,OAAO,CAAC;AAEf,MAAM,MAAM,eAAe,GAAG,gBAAgB,CAAC,YAAY,CAAC,SAAS,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gBAAgB,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC7C,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,6GAA6G;IAC7G,SAAS,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IACtC,YAAY,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;IACxD,SAAS,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC;QAAE,KAAK,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC,GAAG,SAAS,CAAC;IACrF,cAAc,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC;QAAE,KAAK,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC,GAAG,SAAS,CAAC;CAC3F,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IAC3C,iGAAiG;IACjG,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACnC,CAAC;AAWF,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,CAelC,CAAC"}
|
|
@@ -14,25 +14,26 @@ import { Alert } from "../../components/alert.js";
|
|
|
14
14
|
import { cn } from "../../lib/utils.js";
|
|
15
15
|
import { ActionBarMorePrimitive, ActionBarPrimitive, AuiIf, BranchPickerPrimitive, ComposerPrimitive, ErrorPrimitive, groupPartByType, MessagePrimitive, SuggestionPrimitive, ThreadPrimitive, useAuiState, } from "@assistant-ui/react";
|
|
16
16
|
import { ArrowDownIcon, ArrowUpIcon, CheckIcon, ChevronLeftIcon, ChevronRightIcon, CopyIcon, DownloadIcon, MicIcon, MoreHorizontalIcon, PencilIcon, RefreshCwIcon, SquareIcon, } from "lucide-react";
|
|
17
|
-
import { createContext, useContext, useState, } from "react";
|
|
17
|
+
import { createContext, useContext, useMemo, useState, } from "react";
|
|
18
18
|
const EMPTY_COMPONENTS = {};
|
|
19
19
|
const ThreadComponentsContext = createContext(EMPTY_COMPONENTS);
|
|
20
20
|
// Startup exposes a loading placeholder thread; treat it as a new chat so the
|
|
21
21
|
// welcome shows from the first frame. Loads after startup keep the messages.
|
|
22
22
|
const isNewChatView = (s) => s.thread.messages.length === 0 && (!s.thread.isLoading || s.threads.isLoading);
|
|
23
23
|
export const Thread = ({ components = EMPTY_COMPONENTS, labels, toolDetails = true, }) => {
|
|
24
|
-
|
|
24
|
+
const threadLabels = useMemo(() => ({ ...defaultThreadLabels, ...labels }), [labels]);
|
|
25
|
+
return (_jsx(ThreadComponentsContext.Provider, { value: components, children: _jsx(ThreadLabelsContext.Provider, { value: threadLabels, children: _jsx(ToolDetailsContext.Provider, { value: toolDetails, children: _jsx(ThreadRoot, {}) }) }) }));
|
|
25
26
|
};
|
|
26
27
|
const ThreadRoot = () => {
|
|
27
28
|
const { Welcome = ThreadWelcome } = useContext(ThreadComponentsContext);
|
|
28
|
-
return (_jsx(ThreadPrimitive.Root, { className: "
|
|
29
|
+
return (_jsx(ThreadPrimitive.Root, { className: "bg-background @container flex h-full flex-col",
|
|
29
30
|
// SAFETY: CSSProperties lists only standard properties; widening each `--` key to string lets the literal pass as a style object, and React sets each through style.setProperty.
|
|
30
31
|
style: {
|
|
31
32
|
["--thread-max-width"]: "44rem",
|
|
32
33
|
["--composer-bg"]: "var(--color-muted)",
|
|
33
34
|
["--composer-radius"]: "var(--radius-md)",
|
|
34
35
|
["--composer-padding"]: "8px",
|
|
35
|
-
}, children: _jsx(ThreadPrimitive.Viewport, { turnAnchor: "top", "data-slot": "aui_thread-viewport", className: "relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll scroll-smooth", children: _jsxs("div", { className: "mx-auto flex w-full max-w-(--thread-max-width) flex-1 flex-col px-4 pt-4", children: [_jsx(AuiIf, { condition: isNewChatView, children: _jsx("div", { className: "flex flex-1 flex-col justify-center", children: _jsx(Welcome, {}) }) }), _jsx("div", { "data-slot": "aui_message-group", className: "mb-14 flex flex-col gap-y-6 empty:hidden", children: _jsx(ThreadPrimitive.Messages, { children: () => _jsx(ThreadMessage, {}) }) }), _jsxs(ThreadPrimitive.ViewportFooter, { className: "
|
|
36
|
+
}, children: _jsx(ThreadPrimitive.Viewport, { turnAnchor: "top", "data-slot": "aui_thread-viewport", className: "relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll scroll-smooth", children: _jsxs("div", { className: "mx-auto flex w-full max-w-(--thread-max-width) flex-1 flex-col px-4 pt-4", children: [_jsx(AuiIf, { condition: isNewChatView, children: _jsx("div", { className: "flex flex-1 flex-col justify-center", children: _jsx(Welcome, {}) }) }), _jsx("div", { "data-slot": "aui_message-group", className: "mb-14 flex flex-col gap-y-6 empty:hidden", children: _jsx(ThreadPrimitive.Messages, { children: () => _jsx(ThreadMessage, {}) }) }), _jsxs(ThreadPrimitive.ViewportFooter, { className: "bg-background sticky bottom-0 mt-auto flex flex-col gap-4 overflow-visible rounded-t-(--composer-radius) pb-4 md:pb-6", children: [_jsx(ThreadScrollToBottom, {}), _jsx(ThreadFollowupSuggestions, {}), _jsx(AuiIf, { condition: isNewChatView, children: _jsx(ThreadSuggestions, {}) }), _jsx(Composer, {})] })] }) }) }));
|
|
36
37
|
};
|
|
37
38
|
const DefaultToolGroup = ({ group, children, }) => {
|
|
38
39
|
const waiting = group.status.type === "requires-action";
|
|
@@ -57,27 +58,27 @@ const ThreadMessage = () => {
|
|
|
57
58
|
};
|
|
58
59
|
const ThreadScrollToBottom = () => {
|
|
59
60
|
const labels = useThreadLabels();
|
|
60
|
-
return (_jsx(ThreadPrimitive.ScrollToBottom, { render: _jsx(TooltipIconButton, { tooltip: labels.scrollToBottom, variant: "outline", className: "
|
|
61
|
+
return (_jsx(ThreadPrimitive.ScrollToBottom, { render: _jsx(TooltipIconButton, { tooltip: labels.scrollToBottom, variant: "outline", className: "absolute -top-12 z-10 self-center rounded-md p-4 disabled:invisible" }), children: _jsx(ArrowDownIcon, {}) }));
|
|
61
62
|
};
|
|
62
63
|
const ThreadWelcome = () => {
|
|
63
|
-
return (_jsx("div", { className: "
|
|
64
|
+
return (_jsx("div", { className: "mb-6 flex flex-col items-center px-4 text-center", children: _jsx("h1", { className: "text-2xl font-semibold", children: "How can I help you today?" }) }));
|
|
64
65
|
};
|
|
65
66
|
const ThreadSuggestions = () => {
|
|
66
|
-
return (_jsx("div", { className: "
|
|
67
|
+
return (_jsx("div", { className: "flex w-full flex-wrap items-center justify-center gap-2 px-4", children: _jsx(ThreadPrimitive.Suggestions, { children: () => _jsx(ThreadSuggestionItem, {}) }) }));
|
|
67
68
|
};
|
|
68
69
|
const ThreadSuggestionItem = () => {
|
|
69
|
-
return (_jsx("div", {
|
|
70
|
+
return (_jsx("div", { children: _jsxs(SuggestionPrimitive.Trigger, { send: true, render: _jsx(Button, { variant: "ghost", className: "text-foreground hover:bg-muted border-border gap-1.5 rounded-md border py-1.5 text-sm font-normal whitespace-nowrap transition-colors" }), children: [_jsx(SuggestionPrimitive.Title, {}), _jsx(SuggestionPrimitive.Description, { className: "empty:hidden" })] }) }));
|
|
70
71
|
};
|
|
71
72
|
const Composer = () => {
|
|
72
73
|
const labels = useThreadLabels();
|
|
73
|
-
return (_jsx(ComposerPrimitive.Root, { className: "
|
|
74
|
+
return (_jsx(ComposerPrimitive.Root, { className: "relative flex w-full flex-col", children: _jsxs(ComposerPrimitive.AttachmentDropzone, { render: _jsx("div", { "data-slot": "aui_composer-shell", className: "nc-transition-paint flex w-full flex-col gap-2 rounded-(--composer-radius) border border-border bg-(--composer-bg) p-(--composer-padding) focus-within:border-ring data-[dragging=true]:border-dashed data-[dragging=true]:border-ring data-[dragging=true]:bg-accent" }), children: [_jsx(ComposerAttachments, {}), _jsx(ComposerPrimitive.Input, { placeholder: labels.composerPlaceholder, className: "caret-primary placeholder:text-muted-foreground/80 max-h-32 min-h-10 w-full resize-none bg-transparent px-2.5 py-1 text-base outline-none", rows: 1, autoFocus: true, enterKeyHint: "send", "aria-label": labels.composerInput }), _jsx(ComposerAction, {})] }) }));
|
|
74
75
|
};
|
|
75
76
|
const ComposerAction = () => {
|
|
76
77
|
const labels = useThreadLabels();
|
|
77
|
-
return (_jsxs("div", { className: "
|
|
78
|
+
return (_jsxs("div", { className: "relative flex items-center justify-between", children: [_jsx(ComposerAddAttachment, {}), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsxs(AuiIf, { condition: (s) => s.thread.capabilities.dictation, children: [_jsx(AuiIf, { condition: (s) => s.composer.dictation === null || s.composer.dictation === undefined, children: _jsx(ComposerPrimitive.Dictate, { render: _jsx(TooltipIconButton, { tooltip: "Voice input", side: "bottom", type: "button", variant: "ghost", size: "icon", className: "rounded-md", "aria-label": "Start voice input" }), children: _jsx(MicIcon, { className: "size-4" }) }) }), _jsx(AuiIf, { condition: (s) => s.composer.dictation !== null && s.composer.dictation !== undefined, children: _jsx(ComposerPrimitive.StopDictation, { render: _jsx(TooltipIconButton, { tooltip: "Stop dictation", side: "bottom", type: "button", variant: "ghost", size: "icon", className: "text-destructive rounded-md", "aria-label": "Stop voice input" }), children: _jsx(SquareIcon, { className: "size-3.5 fill-current" }) }) })] }), _jsx(AuiIf, { condition: (s) => !s.thread.isRunning, children: _jsx(ComposerPrimitive.Send, { render: _jsx(TooltipIconButton, { tooltip: labels.send, side: "bottom", type: "button", variant: "default", size: "icon", className: "rounded-md", "aria-label": labels.send }), children: _jsx(ArrowUpIcon, { className: "size-4.5" }) }) }), _jsx(AuiIf, { condition: (s) => s.thread.isRunning, children: _jsx(ComposerPrimitive.Cancel, { render: _jsx(Button, { type: "button", variant: "default", size: "icon", className: "rounded-md", "aria-label": labels.stop }), children: _jsx(SquareIcon, { className: "size-3.5 fill-current" }) }) })] })] }));
|
|
78
79
|
};
|
|
79
80
|
const MessageError = () => {
|
|
80
|
-
return (_jsx(MessagePrimitive.Error, { children: _jsx(ErrorPrimitive.Root, { render: _jsx(Alert, { className: "
|
|
81
|
+
return (_jsx(MessagePrimitive.Error, { children: _jsx(ErrorPrimitive.Root, { render: _jsx(Alert, { className: "mt-2", variant: "destructive" }), children: _jsx(ErrorPrimitive.Message, { className: "line-clamp-2" }) }) }));
|
|
81
82
|
};
|
|
82
83
|
const ThreadIndicator = () => (_jsx(AgentOrb, { form: "orbit", size: 20, state: "working", label: "Assistant is working" }));
|
|
83
84
|
const AssistantMessage = () => {
|
|
@@ -115,6 +116,11 @@ const AssistantMessage = () => {
|
|
|
115
116
|
return part.dataRendererUI;
|
|
116
117
|
case "indicator":
|
|
117
118
|
return (_jsx("span", { "data-slot": "aui_assistant-message-indicator", className: "inline-flex", children: _jsx(Indicator, {}) }));
|
|
119
|
+
case "audio":
|
|
120
|
+
case "file":
|
|
121
|
+
case "generative-ui":
|
|
122
|
+
case "image":
|
|
123
|
+
case "source":
|
|
118
124
|
default:
|
|
119
125
|
return null;
|
|
120
126
|
}
|
|
@@ -122,17 +128,17 @@ const AssistantMessage = () => {
|
|
|
122
128
|
};
|
|
123
129
|
const AssistantActionBar = () => {
|
|
124
130
|
const labels = useThreadLabels();
|
|
125
|
-
return (_jsxs(ActionBarPrimitive.Root, { hideWhenRunning: true, autohide: "not-last", className: "
|
|
131
|
+
return (_jsxs(ActionBarPrimitive.Root, { hideWhenRunning: true, autohide: "not-last", className: "nc-transition-opacity col-start-3 row-start-2 -ms-1 flex gap-1 text-muted-foreground", children: [_jsxs(ActionBarPrimitive.Copy, { render: _jsx(TooltipIconButton, { tooltip: labels.copy }), children: [_jsx(AuiIf, { condition: (s) => s.message.isCopied, children: _jsx(CheckIcon, {}) }), _jsx(AuiIf, { condition: (s) => !s.message.isCopied, children: _jsx(CopyIcon, {}) })] }), _jsx(ActionBarPrimitive.Reload, { render: _jsx(TooltipIconButton, { tooltip: labels.refresh }), children: _jsx(RefreshCwIcon, {}) }), _jsxs(ActionBarMorePrimitive.Root, { children: [_jsx(ActionBarMorePrimitive.Trigger, { render: _jsx(TooltipIconButton, { tooltip: labels.more, className: "data-[state=open]:bg-accent" }), children: _jsx(MoreHorizontalIcon, {}) }), _jsx(ActionBarMorePrimitive.Content, { side: "bottom", align: "start", sideOffset: 6, className: "nc-transition-opacity z-50 min-w-32 overflow-hidden rounded-md border-0 bg-popover p-1.5 text-popover-foreground nc-elevation-floating data-[state=closed]:opacity-0 data-[state=open]:opacity-100", children: _jsxs(ActionBarPrimitive.ExportMarkdown, { render: _jsx(ActionBarMorePrimitive.Item, { className: "hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground flex cursor-pointer items-center gap-2 rounded-md px-2.5 py-1.5 text-sm outline-none select-none" }), children: [_jsx(DownloadIcon, { className: "size-4" }), labels.exportMarkdown] }) })] })] }));
|
|
126
132
|
};
|
|
127
133
|
const UserMessage = () => {
|
|
128
|
-
return (_jsxs(MessagePrimitive.Root, { "data-slot": "aui_user-message-root", className: "grid auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] content-start gap-y-2 px-2 [contain-intrinsic-size:auto_200px] [content-visibility:auto] [&:where(>*)]:col-start-2", "data-role": "user", children: [_jsx(UserMessageAttachments, {}), _jsxs("div", { className: "
|
|
134
|
+
return (_jsxs(MessagePrimitive.Root, { "data-slot": "aui_user-message-root", className: "grid auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] content-start gap-y-2 px-2 [contain-intrinsic-size:auto_200px] [content-visibility:auto] [&:where(>*)]:col-start-2", "data-role": "user", children: [_jsx(UserMessageAttachments, {}), _jsxs("div", { className: "relative col-start-2 min-w-0", children: [_jsx("div", { className: "peer bg-muted text-foreground rounded-md px-4 py-2 wrap-break-word empty:hidden", children: _jsx(MessagePrimitive.Parts, {}) }), _jsx("div", { className: "absolute inset-s-0 top-1/2 -translate-x-full -translate-y-1/2 pe-2 peer-empty:hidden rtl:translate-x-full", children: _jsx(UserActionBar, {}) })] }), _jsx(BranchPicker, { "data-slot": "aui_user-branch-picker", className: "col-span-full col-start-1 row-start-3 -me-1 justify-end" })] }));
|
|
129
135
|
};
|
|
130
136
|
const UserActionBar = () => {
|
|
131
|
-
return (_jsx(ActionBarPrimitive.Root, { hideWhenRunning: true, autohide: "not-last", className: "
|
|
137
|
+
return (_jsx(ActionBarPrimitive.Root, { hideWhenRunning: true, autohide: "not-last", className: "flex flex-col items-end", children: _jsx(ActionBarPrimitive.Edit, { render: _jsx(TooltipIconButton, { tooltip: "Edit" }), children: _jsx(PencilIcon, {}) }) }));
|
|
132
138
|
};
|
|
133
139
|
const EditComposer = () => {
|
|
134
|
-
return (_jsx(MessagePrimitive.Root, { "data-slot": "aui_edit-composer-wrapper", className: "flex flex-col px-2 [contain-intrinsic-size:auto_200px] [content-visibility:auto]", children: _jsxs(ComposerPrimitive.Root, { className: "
|
|
140
|
+
return (_jsx(MessagePrimitive.Root, { "data-slot": "aui_edit-composer-wrapper", className: "flex flex-col px-2 [contain-intrinsic-size:auto_200px] [content-visibility:auto]", children: _jsxs(ComposerPrimitive.Root, { className: "ms-auto flex w-full max-w-[85%] flex-col rounded-(--composer-radius) border border-border bg-(--composer-bg)", children: [_jsx(ComposerPrimitive.Input, { className: "text-foreground min-h-14 w-full resize-none bg-transparent px-4 pt-3 pb-1 text-base outline-none", autoFocus: true }), _jsxs("div", { className: "mx-2.5 mb-2.5 flex items-center gap-1.5 self-end", children: [_jsx(ComposerPrimitive.Cancel, { render: _jsx(Button, { variant: "ghost", size: "sm", className: "h-8" }), children: "Cancel" }), _jsx(ComposerPrimitive.Send, { render: _jsx(Button, { size: "sm", className: "h-8" }), children: "Update" })] })] }) }));
|
|
135
141
|
};
|
|
136
142
|
const BranchPicker = ({ className, ...rest }) => {
|
|
137
|
-
return (_jsxs(BranchPickerPrimitive.Root, { hideWhenSingleBranch: true, className: cn("
|
|
143
|
+
return (_jsxs(BranchPickerPrimitive.Root, { hideWhenSingleBranch: true, className: cn("text-muted-foreground -ms-2 me-2 inline-flex items-center text-xs", className), ...rest, children: [_jsx(BranchPickerPrimitive.Previous, { render: _jsx(TooltipIconButton, { tooltip: "Previous" }), children: _jsx(ChevronLeftIcon, {}) }), _jsxs("span", { className: "font-medium", children: [_jsx(BranchPickerPrimitive.Number, {}), " / ", _jsx(BranchPickerPrimitive.Count, {})] }), _jsx(BranchPickerPrimitive.Next, { render: _jsx(TooltipIconButton, { tooltip: "Next" }), children: _jsx(ChevronRightIcon, {}) })] }));
|
|
138
144
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-fallback.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/tool-fallback.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool-fallback.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/tool-fallback.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAOL,KAAK,4BAA4B,EAClC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAA0C,MAAM,0BAA0B,CAAC;AAS/F,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACtC,KAAK,CAAC,cAAc,CAAC,OAAO,WAAW,CAAC,EACxC,MAAM,GAAG,cAAc,CACxB,GAAG;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAwaF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,kCAAsB,CAAC;AA+CtD,QAAA,MAAM,YAAY,EAAE,4BAAqD,CAAC;AAI1E,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { createContext, memo, useCallback, useContext, useRef, useState } from "react";
|
|
3
|
+
import { createContext, memo, startTransition, useCallback, useContext, useRef, useState, } from "react";
|
|
4
4
|
import { AlertCircleIcon, CheckIcon, ChevronDownIcon, CircleDotIcon, XCircleIcon, } from "lucide-react";
|
|
5
5
|
import { useScrollLock, useToolCallElapsed, } from "@assistant-ui/react";
|
|
6
6
|
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../../components/collapsible.js";
|
|
7
7
|
import { cn } from "../../lib/utils.js";
|
|
8
|
+
import { cssVariables } from "../../lib/css-variables.js";
|
|
8
9
|
import { disclosureDuration, disclosureDurationMs } from "../../lib/motion.js";
|
|
9
10
|
import { Button } from "../../components/button.js";
|
|
10
11
|
import { useThreadLabels } from "./thread-labels.js";
|
|
@@ -22,11 +23,9 @@ function ToolFallbackRoot({ className, open: controlledOpen, onOpenChange: contr
|
|
|
22
23
|
}
|
|
23
24
|
controlledOnOpenChange?.(open);
|
|
24
25
|
}, [lockScroll, isControlled, controlledOnOpenChange]);
|
|
25
|
-
return (_jsx(Collapsible, { ref: collapsibleRef, "data-slot": "tool-fallback-root", open: isOpen, onOpenChange: handleOpenChange, className: cn("
|
|
26
|
-
// SAFETY: CSSProperties lists only standard properties; React sets each `--` custom property key here through style.setProperty.
|
|
27
|
-
style: {
|
|
26
|
+
return (_jsx(Collapsible, { ref: collapsibleRef, "data-slot": "tool-fallback-root", open: isOpen, onOpenChange: handleOpenChange, className: cn("group/tool-fallback-root w-full", className), style: cssVariables({
|
|
28
27
|
"--animation-duration": disclosureDuration,
|
|
29
|
-
}, ...props, children: children }));
|
|
28
|
+
}), ...props, children: children }));
|
|
30
29
|
}
|
|
31
30
|
const statusIconMap = {
|
|
32
31
|
running: CircleDotIcon,
|
|
@@ -48,7 +47,7 @@ function ToolFallbackDuration({ className, ...props }) {
|
|
|
48
47
|
const elapsedMs = useToolCallElapsed();
|
|
49
48
|
if (elapsedMs === undefined)
|
|
50
49
|
return null;
|
|
51
|
-
return (_jsx("span", { "data-slot": "tool-fallback-duration", className: cn("
|
|
50
|
+
return (_jsx("span", { "data-slot": "tool-fallback-duration", className: cn("text-muted-foreground text-xs tabular-nums", className), ...props, children: formatToolDuration(elapsedMs) }));
|
|
52
51
|
}
|
|
53
52
|
function ToolFallbackTrigger({ toolName, status, className, ...props }) {
|
|
54
53
|
const statusType = status?.type ?? "complete";
|
|
@@ -64,32 +63,31 @@ function ToolFallbackTrigger({ toolName, status, className, ...props }) {
|
|
|
64
63
|
: statusType === "requires-action"
|
|
65
64
|
? labels.waitingTool
|
|
66
65
|
: labels.usedTool;
|
|
67
|
-
return (_jsxs(CollapsibleTrigger, { "aria-busy": isRunning || undefined, "data-slot": "tool-fallback-trigger", className: cn("
|
|
66
|
+
return (_jsxs(CollapsibleTrigger, { "aria-busy": isRunning || undefined, "data-slot": "tool-fallback-trigger", className: cn("nc-transition-paint group/trigger flex w-fit origin-left items-center gap-2 py-1.5 text-sm text-muted-foreground hover:text-foreground", className), ...props, children: [_jsx(Icon, { "data-slot": "tool-fallback-trigger-icon", className: cn("size-4 shrink-0", isCancelled && "text-muted-foreground") }), _jsx("span", { "data-slot": "tool-fallback-trigger-label", className: cn("relative inline-block text-start leading-none", isCancelled && "text-muted-foreground line-through"), children: _jsxs("span", { children: [label, ": ", _jsx("b", { children: toolName })] }) }), _jsx(ToolFallbackDuration, {}), _jsx(ChevronDownIcon, { "data-slot": "tool-fallback-trigger-chevron", className: cn("size-4 shrink-0", "transition-transform duration-(--animation-duration) ease-(--nc-ease-out-strong) motion-reduce:transition-none", "-rotate-90", "group-data-open/trigger:rotate-0", "group-data-panel-open/trigger:rotate-0") })] }));
|
|
68
67
|
}
|
|
69
68
|
function ToolFallbackContent({ className, children, ...props }) {
|
|
70
|
-
return (_jsx(CollapsibleContent, { "data-slot": "tool-fallback-content", className: cn("
|
|
69
|
+
return (_jsx(CollapsibleContent, { "data-slot": "tool-fallback-content", className: cn("relative overflow-hidden text-sm outline-none", "group/collapsible-content", "data-closed:pointer-events-none", className), ...props, children: _jsx("div", { className: cn("nc-transition-opacity flex flex-col gap-2 ps-6 pt-1 pb-2"), children: children }) }));
|
|
71
70
|
}
|
|
72
71
|
function ToolFallbackArgs({ argsText, className, ...props }) {
|
|
73
72
|
if (!argsText)
|
|
74
73
|
return null;
|
|
75
|
-
return (_jsx("div", { "data-slot": "tool-fallback-args", className:
|
|
74
|
+
return (_jsx("div", { "data-slot": "tool-fallback-args", className: className, ...props, children: _jsx("pre", { className: "bg-muted/50 text-foreground/90 rounded-md p-2.5 text-xs whitespace-pre-wrap", children: argsText }) }));
|
|
76
75
|
}
|
|
77
76
|
function ToolFallbackResult({ result, className, ...props }) {
|
|
78
77
|
if (result === undefined)
|
|
79
78
|
return null;
|
|
80
|
-
return (_jsxs("div", { "data-slot": "tool-fallback-result", className:
|
|
79
|
+
return (_jsxs("div", { "data-slot": "tool-fallback-result", className: className, ...props, children: [_jsx("p", { className: "text-muted-foreground text-xs font-medium", children: "Result:" }), _jsx("pre", { className: "bg-muted/50 text-foreground/90 mt-1 rounded-md p-2.5 text-xs whitespace-pre-wrap", children: typeof result === "string" ? result : JSON.stringify(result, null, 2) })] }));
|
|
81
80
|
}
|
|
82
81
|
function ToolFallbackError({ status, className, ...props }) {
|
|
83
82
|
if (status?.type !== "incomplete")
|
|
84
83
|
return null;
|
|
85
84
|
const error = status.error;
|
|
86
|
-
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- assistant-ui types a tool error as unknown; a string shows as is and anything else as JSON.
|
|
87
85
|
const errorText = error ? (typeof error === "string" ? error : JSON.stringify(error)) : null;
|
|
88
86
|
if (!errorText)
|
|
89
87
|
return null;
|
|
90
88
|
const isCancelled = status.reason === "cancelled";
|
|
91
89
|
const headerText = isCancelled ? "Cancelled reason:" : "Error:";
|
|
92
|
-
return (_jsxs("div", { "data-slot": "tool-fallback-error", className:
|
|
90
|
+
return (_jsxs("div", { "data-slot": "tool-fallback-error", className: className, ...props, children: [_jsx("p", { className: "text-muted-foreground font-semibold", children: headerText }), _jsx("p", { className: "text-muted-foreground", children: errorText })] }));
|
|
93
91
|
}
|
|
94
92
|
const APPROVED_RESULT = "Approved by user";
|
|
95
93
|
const DENIED_RESULT = "User denied tool execution";
|
|
@@ -105,7 +103,9 @@ function ToolFallbackApproval({ className, addResult, resume, interrupt, approva
|
|
|
105
103
|
const [submitted, setSubmitted] = useState(false);
|
|
106
104
|
const [confirmingId, setConfirmingId] = useState(null);
|
|
107
105
|
const labels = useThreadLabels();
|
|
108
|
-
if (approval
|
|
106
|
+
if (approval !== null &&
|
|
107
|
+
approval !== undefined &&
|
|
108
|
+
(approval.approved !== undefined || approval.resolution !== undefined))
|
|
109
109
|
return null;
|
|
110
110
|
// Custom (`_`-prefixed) kinds cannot be resolved to a boolean by the kit;
|
|
111
111
|
// hosts using custom kinds render their own bar. A declared option list is
|
|
@@ -116,8 +116,13 @@ function ToolFallbackApproval({ className, addResult, resume, interrupt, approva
|
|
|
116
116
|
const respond = (approved) => {
|
|
117
117
|
if (submitted)
|
|
118
118
|
return;
|
|
119
|
-
if (approval
|
|
120
|
-
|
|
119
|
+
if (approval !== null &&
|
|
120
|
+
approval !== undefined &&
|
|
121
|
+
approval.approved === undefined &&
|
|
122
|
+
respondToApproval) {
|
|
123
|
+
startTransition(async () => {
|
|
124
|
+
await respondToApproval({ approved });
|
|
125
|
+
});
|
|
121
126
|
}
|
|
122
127
|
else if (interrupt) {
|
|
123
128
|
resume?.({ approved });
|
|
@@ -130,7 +135,9 @@ function ToolFallbackApproval({ className, addResult, resume, interrupt, approva
|
|
|
130
135
|
const respondWithOption = (option) => {
|
|
131
136
|
if (submitted)
|
|
132
137
|
return;
|
|
133
|
-
|
|
138
|
+
startTransition(async () => {
|
|
139
|
+
await respondToApproval?.({ optionId: option.id });
|
|
140
|
+
});
|
|
134
141
|
setSubmitted(true);
|
|
135
142
|
setConfirmingId(null);
|
|
136
143
|
};
|
|
@@ -142,19 +149,20 @@ function ToolFallbackApproval({ className, addResult, resume, interrupt, approva
|
|
|
142
149
|
respondWithOption(option);
|
|
143
150
|
}
|
|
144
151
|
};
|
|
145
|
-
const confirming = confirmingId
|
|
152
|
+
const confirming = confirmingId !== null && confirmingId !== undefined
|
|
153
|
+
? options?.find((o) => o.id === confirmingId)
|
|
154
|
+
: undefined;
|
|
146
155
|
if (confirming) {
|
|
147
|
-
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- an approval option's confirm is a boolean or a details object; only typeof tells them apart.
|
|
148
156
|
const confirmMeta = typeof confirming.confirm === "object" ? confirming.confirm : undefined;
|
|
149
157
|
const confirmDescription = confirmMeta?.description ?? confirming.description;
|
|
150
|
-
return (_jsxs("div", { "data-slot": "tool-fallback-approval-confirm", className: cn("
|
|
158
|
+
return (_jsxs("div", { "data-slot": "tool-fallback-approval-confirm", className: cn("flex flex-col gap-2 pt-1", className), ...props, children: [_jsx("p", { className: "font-semibold", children: confirmMeta?.title ?? `${approvalOptionLabel(confirming)}?` }), confirmDescription && _jsx("p", { className: "text-muted-foreground", children: confirmDescription }), confirming.grants && confirming.grants.length > 0 && (_jsx("ul", { className: "flex flex-col gap-1", children: confirming.grants.map((grant) => (_jsx("li", { children: _jsx("code", { className: "bg-muted rounded px-1.5 py-0.5 text-xs", children: grant }) }, grant))) })), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { size: "sm", className: pressable, onClick: () => respondWithOption(confirming), disabled: submitted, children: approvalOptionLabel(confirming) }), _jsx(Button, { size: "sm", variant: "outline", className: pressable, onClick: () => setConfirmingId(null), disabled: submitted, children: "Back" })] })] }));
|
|
151
159
|
}
|
|
152
160
|
if (declaredOptions && declaredOptions.length > 0) {
|
|
153
161
|
const allowOptions = options?.filter((o) => isAllowKind(o.kind)) ?? [];
|
|
154
162
|
const rejectOptions = options?.filter((o) => !isAllowKind(o.kind)) ?? [];
|
|
155
|
-
return (_jsxs("div", { "data-slot": "tool-fallback-approval", className: cn("
|
|
163
|
+
return (_jsxs("div", { "data-slot": "tool-fallback-approval", className: cn("flex flex-wrap items-center gap-2 pt-1", className), ...props, children: [[...allowOptions, ...rejectOptions].map((option) => (_jsx(Button, { size: "sm", variant: option === allowOptions[0] ? "default" : "outline", className: pressable, onClick: () => handleOption(option), disabled: submitted, children: approvalOptionLabel(option) }, option.id))), rejectOptions.length === 0 && (_jsx(Button, { size: "sm", variant: "outline", className: pressable, onClick: () => respond(false), disabled: submitted, children: labels.deny }))] }));
|
|
156
164
|
}
|
|
157
|
-
return (_jsxs("div", { "data-slot": "tool-fallback-approval", className: cn("
|
|
165
|
+
return (_jsxs("div", { "data-slot": "tool-fallback-approval", className: cn("flex flex-wrap items-center gap-2 pt-1", className), ...props, children: [approval?.prompt ? (_jsx("p", { "data-slot": "tool-fallback-approval-prompt", className: "min-w-0 basis-full text-sm wrap-break-word", children: approval.prompt })) : null, _jsx(Button, { size: "sm", className: pressable, onClick: () => respond(true), disabled: submitted, children: labels.allow }), _jsx(Button, { size: "sm", variant: "outline", className: pressable, onClick: () => respond(false), disabled: submitted, children: labels.deny })] }));
|
|
158
166
|
}
|
|
159
167
|
/**
|
|
160
168
|
* Whether a call shows its input and its result. A thread for people who are
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-group.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/tool-group.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-group.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/tool-group.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAK/F,QAAA,MAAM,iBAAiB;;8EASrB,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,KAAK,CAAC,cAAc,CAAC,OAAO,WAAW,CAAC,EACxC,MAAM,GAAG,cAAc,CACxB,GACC,YAAY,CAAC,OAAO,iBAAiB,CAAC,GAAG;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEJ,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,OAAO,EACP,IAAI,EAAE,cAAc,EACpB,YAAY,EAAE,sBAAsB,EACpC,WAAmB,EACnB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,kBAAkB,+BAmCpB;AAED,iBAAS,gBAAgB,CAAC,EACxB,KAAK,EACL,MAAc,EACd,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,EAAE,UAAU,CAAC,GAAG;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,+BAwCA;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,+BAyBjD;AAED,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -6,8 +6,9 @@ import { cva } from "class-variance-authority";
|
|
|
6
6
|
import { useScrollLock } from "@assistant-ui/react";
|
|
7
7
|
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../../components/collapsible.js";
|
|
8
8
|
import { cn } from "../../lib/utils.js";
|
|
9
|
+
import { cssVariables } from "../../lib/css-variables.js";
|
|
9
10
|
import { disclosureDuration, disclosureDurationMs } from "../../lib/motion.js";
|
|
10
|
-
const toolGroupVariants = cva("
|
|
11
|
+
const toolGroupVariants = cva("group/tool-group w-full", {
|
|
11
12
|
variants: {
|
|
12
13
|
variant: {
|
|
13
14
|
outline: "rounded-md border py-3",
|
|
@@ -30,18 +31,16 @@ function ToolGroupRoot({ className, variant, open: controlledOpen, onOpenChange:
|
|
|
30
31
|
}
|
|
31
32
|
controlledOnOpenChange?.(open);
|
|
32
33
|
}, [lockScroll, isControlled, controlledOnOpenChange]);
|
|
33
|
-
return (_jsx(Collapsible, { ref: collapsibleRef, "data-slot": "tool-group-root", "data-variant": variant ?? "outline", open: isOpen, onOpenChange: handleOpenChange, className: cn(toolGroupVariants({ variant }), "group/tool-group-root", className),
|
|
34
|
-
// SAFETY: CSSProperties lists only standard properties; React sets each `--` custom property key here through style.setProperty.
|
|
35
|
-
style: {
|
|
34
|
+
return (_jsx(Collapsible, { ref: collapsibleRef, "data-slot": "tool-group-root", "data-variant": variant ?? "outline", open: isOpen, onOpenChange: handleOpenChange, className: cn(toolGroupVariants({ variant }), "group/tool-group-root", className), style: cssVariables({
|
|
36
35
|
"--animation-duration": disclosureDuration,
|
|
37
|
-
}, ...props, children: children }));
|
|
36
|
+
}), ...props, children: children }));
|
|
38
37
|
}
|
|
39
38
|
function ToolGroupTrigger({ count, active = false, className, ...props }) {
|
|
40
39
|
// A group still running says so in its own label; nothing spins or shimmers.
|
|
41
40
|
const label = `${count} tool ${count === 1 ? "call" : "calls"}${active ? ", running" : ""}`;
|
|
42
|
-
return (_jsxs(CollapsibleTrigger, { "aria-busy": active || undefined, "data-slot": "tool-group-trigger", className: cn("
|
|
41
|
+
return (_jsxs(CollapsibleTrigger, { "aria-busy": active || undefined, "data-slot": "tool-group-trigger", className: cn("nc-transition-paint group/trigger flex origin-left items-center gap-2 text-sm", "group-data-[variant=ghost]/tool-group-root:text-muted-foreground group-data-[variant=ghost]/tool-group-root:hover:text-foreground group-data-[variant=ghost]/tool-group-root:py-1.5", "group-data-[variant=outline]/tool-group-root:w-full group-data-[variant=outline]/tool-group-root:px-4", "group-data-[variant=muted]/tool-group-root:w-full group-data-[variant=muted]/tool-group-root:px-4", className), ...props, children: [_jsx("span", { "data-slot": "tool-group-trigger-label", className: cn("relative inline-block text-start leading-none font-medium", "group-data-[variant=ghost]/tool-group-root:font-normal", "group-data-[variant=outline]/tool-group-root:grow", "group-data-[variant=muted]/tool-group-root:grow"), children: _jsx("span", { className: "text-xs", children: label }) }), _jsx(ChevronDownIcon, { "data-slot": "tool-group-trigger-chevron", className: cn("size-3 shrink-0", "transition-transform duration-(--animation-duration) ease-(--nc-ease-out-strong) motion-reduce:transition-none", "-rotate-90", "group-data-open/trigger:rotate-0", "group-data-panel-open/trigger:rotate-0") })] }));
|
|
43
42
|
}
|
|
44
43
|
function ToolGroupContent({ className, children, ...props }) {
|
|
45
|
-
return (_jsx(CollapsibleContent, { "data-slot": "tool-group-content", className: cn("
|
|
44
|
+
return (_jsx(CollapsibleContent, { "data-slot": "tool-group-content", className: cn("relative overflow-hidden text-sm outline-none", "group/collapsible-content", "data-closed:pointer-events-none", className), ...props, children: _jsx("div", { className: cn("mt-2 flex flex-col gap-2", "group-data-[variant=ghost]/tool-group-root:mt-1 group-data-[variant=ghost]/tool-group-root:gap-1", "group-data-[variant=outline]/tool-group-root:mt-3 group-data-[variant=outline]/tool-group-root:border-t group-data-[variant=outline]/tool-group-root:px-4 group-data-[variant=outline]/tool-group-root:pt-3", "group-data-[variant=muted]/tool-group-root:mt-3 group-data-[variant=muted]/tool-group-root:border-t group-data-[variant=muted]/tool-group-root:px-4 group-data-[variant=muted]/tool-group-root:pt-3", "*:nc-transition-opacity"), children: children }) }));
|
|
46
45
|
}
|
|
47
46
|
export { ToolGroupRoot, ToolGroupTrigger, ToolGroupContent };
|
|
@@ -5,6 +5,6 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../../
|
|
|
5
5
|
import { Button } from "../../components/button.js";
|
|
6
6
|
import { cn } from "../../lib/utils.js";
|
|
7
7
|
export const TooltipIconButton = forwardRef(({ children, tooltip, side = "bottom", className, ...rest }, ref) => {
|
|
8
|
-
return (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { render: _jsx(Button, { variant: "ghost", size: "icon", ...rest, "aria-label": tooltip, className: cn("
|
|
8
|
+
return (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { render: _jsx(Button, { variant: "ghost", size: "icon", ...rest, "aria-label": tooltip, className: cn("p-1", className), ref: ref }), children: children }), _jsx(TooltipContent, { side: side, children: tooltip })] }) }));
|
|
9
9
|
});
|
|
10
10
|
TooltipIconButton.displayName = "TooltipIconButton";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { useRender } from "@base-ui/react/use-render";
|
|
3
|
+
import { type VariantProps } from "class-variance-authority";
|
|
4
|
+
declare const badgeVariants: (props?: ({
|
|
5
|
+
variant?: "default" | "outline" | "secondary" | "pink" | "purple" | "teal" | null | undefined;
|
|
6
|
+
size?: "sm" | "lg" | "md" | null | undefined;
|
|
7
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
8
|
+
type BadgeSize = NonNullable<VariantProps<typeof badgeVariants>["size"]>;
|
|
9
|
+
type BadgeFrameProps = Omit<useRender.ComponentProps<"span">, "onClick" | "tabIndex" | "role" | "aria-pressed" | "onKeyDown" | "onKeyUp"> & VariantProps<typeof badgeVariants> & {
|
|
10
|
+
icon?: ReactNode;
|
|
11
|
+
};
|
|
12
|
+
/** The pill `Badge` and `TrendBadge` both draw; only the package passes it content other than a word. */
|
|
13
|
+
declare function BadgeFrame({ className, variant, size, icon, children, render, ...props }: BadgeFrameProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
|
|
14
|
+
export { BadgeFrame, type BadgeFrameProps, type BadgeSize };
|
|
15
|
+
//# sourceMappingURL=badge-frame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge-frame.d.ts","sourceRoot":"","sources":["../../src/internal/badge-frame.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIlE,QAAA,MAAM,aAAa;;;8EAuBlB,CAAC;AAEF,KAAK,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAEzE,KAAK,eAAe,GAAG,IAAI,CACzB,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,EAChC,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,cAAc,GAAG,WAAW,GAAG,SAAS,CAC3E,GACC,YAAY,CAAC,OAAO,aAAa,CAAC,GAAG;IACnC,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,CAAC;AAEJ,yGAAyG;AACzG,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,OAAmB,EACnB,IAAW,EACX,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,GAAG,KAAK,EACT,EAAE,eAAe,8FA2BjB;AAED,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { mergeProps } from "@base-ui/react/merge-props";
|
|
3
|
+
import { useRender } from "@base-ui/react/use-render";
|
|
4
|
+
import { cva } from "class-variance-authority";
|
|
5
|
+
import { cn } from "../lib/utils.js";
|
|
6
|
+
const badgeVariants = cva("group/badge inline-flex w-fit max-w-full shrink-0 items-center justify-center overflow-hidden rounded-full font-medium whitespace-nowrap tabular-nums transition-[background-color,box-shadow,color,opacity] duration-(--nc-duration-confirm) ease-(--nc-ease-out-strong)", {
|
|
7
|
+
variants: {
|
|
8
|
+
variant: {
|
|
9
|
+
default: "bg-primary text-primary-foreground",
|
|
10
|
+
secondary: "bg-secondary text-secondary-foreground",
|
|
11
|
+
outline: "bg-background text-foreground ring-1 ring-inset ring-border [a]:hover:bg-accent",
|
|
12
|
+
teal: "bg-category-teal text-category-teal-foreground",
|
|
13
|
+
purple: "bg-category-purple text-category-purple-foreground",
|
|
14
|
+
pink: "bg-category-pink text-category-pink-foreground",
|
|
15
|
+
},
|
|
16
|
+
size: {
|
|
17
|
+
sm: "h-5 gap-1 px-2 text-[11px]/5 tracking-[0.2px] has-data-[icon=inline-start]:pl-1.5 [&>[data-icon]>svg]:size-3",
|
|
18
|
+
md: "h-6 gap-1.25 px-3 text-xs/6 has-data-[icon=inline-start]:pl-2 [&>[data-icon]>svg]:size-3.5",
|
|
19
|
+
lg: "h-8 gap-1.5 px-3 text-sm/5 [&>[data-icon]>svg]:size-4",
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
defaultVariants: {
|
|
23
|
+
variant: "default",
|
|
24
|
+
size: "md",
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
/** The pill `Badge` and `TrendBadge` both draw; only the package passes it content other than a word. */
|
|
28
|
+
function BadgeFrame({ className, variant = "default", size = "md", icon, children, render, ...props }) {
|
|
29
|
+
return useRender({
|
|
30
|
+
defaultTagName: "span",
|
|
31
|
+
props: mergeProps({
|
|
32
|
+
className: cn(badgeVariants({ variant, size }), className),
|
|
33
|
+
children: icon ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "pointer-events-none inline-flex shrink-0", "data-icon": "inline-start", children: icon }), children] })) : (children),
|
|
34
|
+
}, props),
|
|
35
|
+
render,
|
|
36
|
+
state: {
|
|
37
|
+
slot: "badge",
|
|
38
|
+
"nc-ui": true,
|
|
39
|
+
variant,
|
|
40
|
+
size,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export { BadgeFrame };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
declare const buttonClasses: (props?: ({
|
|
3
|
+
variant?: "link" | "default" | "outline" | "secondary" | "ghost" | "brandGhost" | "brandSolid" | "destructive" | "warning" | null | undefined;
|
|
4
|
+
size?: "default" | "xs" | "sm" | "lg" | "inline" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
|
|
5
|
+
shape?: "square" | "rounded" | "circle" | null | undefined;
|
|
6
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
|
+
export type ButtonVariant = NonNullable<VariantProps<typeof buttonClasses>["variant"]>;
|
|
8
|
+
export type ButtonSize = NonNullable<VariantProps<typeof buttonClasses>["size"]>;
|
|
9
|
+
export type IconSize = Extract<ButtonSize, `icon${string}`>;
|
|
10
|
+
export type TextSize = Exclude<ButtonSize, IconSize>;
|
|
11
|
+
/**
|
|
12
|
+
* The button classes for an element that is not a `Button`, such as a calendar's
|
|
13
|
+
* day arrows. They pass through `cn` as `Button`'s do, so a variant's border,
|
|
14
|
+
* fill or text replaces the base one instead of losing to it in the stylesheet:
|
|
15
|
+
* unmerged, the base `border-transparent` hides every outline edge. A link
|
|
16
|
+
* drawn as a button is a `ButtonLink`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function buttonVariants(props?: Parameters<typeof buttonClasses>[0]): string;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=button-classes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-classes.d.ts","sourceRoot":"","sources":["../../src/internal/button-classes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AASlE,QAAA,MAAM,aAAa;;;;8EAiElB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACvF,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACjF,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,MAAM,EAAE,CAAC,CAAC;AAC5D,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAErD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAElF"}
|