@nadicodeai/ui 12.1.165 → 12.1.167
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 +14 -7
- package/dist/components/data-table.d.ts.map +1 -1
- package/dist/components/data-table.js +24 -15
- 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 +5 -4
- package/dist/components/record-list.d.ts.map +1 -1
- package/dist/components/record-list.js +31 -17
- 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-layouts.d.ts +24 -9
- package/dist/components/table-layouts.d.ts.map +1 -1
- package/dist/components/table-layouts.js +27 -10
- 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 +40 -18
- package/dist/standalone/index.js +2 -2
- package/dist/standalone/orb-page.js +10 -8
- package/dist/styles/components.css +14 -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
|
@@ -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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { cva } from "class-variance-authority";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
const heldNeutral = "disabled:border-border disabled:bg-muted disabled:text-muted-foreground aria-disabled:border-border aria-disabled:bg-muted aria-disabled:text-muted-foreground";
|
|
4
|
+
const heldDim = "disabled:opacity-50 aria-disabled:not-aria-busy:opacity-50";
|
|
5
|
+
const buttonClasses = cva("group/button inline-flex min-h-touch-target min-w-touch-target shrink-0 items-center justify-center rounded-sm border border-transparent bg-clip-padding text-button font-medium whitespace-nowrap transition-[background-color,border-color,color] duration-(--nc-duration-confirm) ease-(--nc-ease-out-strong) select-none disabled:pointer-events-none aria-disabled:pointer-events-none aria-invalid:border-destructive [@media(hover:hover)_and_(pointer:fine)]:min-h-0 [@media(hover:hover)_and_(pointer:fine)]:min-w-0 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
|
|
6
|
+
variants: {
|
|
7
|
+
variant: {
|
|
8
|
+
default: [
|
|
9
|
+
"bg-primary text-primary-foreground hover:bg-primary-hover active:bg-primary-hover aria-expanded:bg-primary-hover",
|
|
10
|
+
heldNeutral,
|
|
11
|
+
],
|
|
12
|
+
outline: [
|
|
13
|
+
"border-border bg-(--nc-field,var(--background)) text-foreground hover:bg-muted hover:text-foreground active:bg-muted aria-expanded:bg-muted aria-expanded:text-foreground",
|
|
14
|
+
heldNeutral,
|
|
15
|
+
],
|
|
16
|
+
secondary: [
|
|
17
|
+
"border-border bg-secondary text-secondary-foreground hover:bg-accent active:bg-accent aria-expanded:bg-accent aria-expanded:text-accent-foreground",
|
|
18
|
+
heldNeutral,
|
|
19
|
+
],
|
|
20
|
+
ghost: [
|
|
21
|
+
"hover:bg-muted hover:text-foreground active:bg-muted aria-expanded:bg-muted aria-expanded:text-foreground",
|
|
22
|
+
heldDim,
|
|
23
|
+
],
|
|
24
|
+
brandGhost: [
|
|
25
|
+
"text-nc-identity-white hover:bg-nc-identity-white/10 hover:text-nc-identity-white aria-expanded:bg-nc-identity-white/10 aria-expanded:text-nc-identity-white",
|
|
26
|
+
heldDim,
|
|
27
|
+
],
|
|
28
|
+
brandSolid: [
|
|
29
|
+
"bg-nc-identity-white text-nc-identity-ink hover:bg-nc-identity-white/90 hover:text-nc-identity-ink active:bg-nc-identity-white/90 active:text-nc-identity-ink",
|
|
30
|
+
heldDim,
|
|
31
|
+
],
|
|
32
|
+
destructive: [
|
|
33
|
+
"bg-destructive text-destructive-foreground hover:brightness-90 active:brightness-90",
|
|
34
|
+
heldNeutral,
|
|
35
|
+
],
|
|
36
|
+
warning: [
|
|
37
|
+
"bg-warning text-warning-foreground hover:brightness-90 active:brightness-90",
|
|
38
|
+
heldNeutral,
|
|
39
|
+
],
|
|
40
|
+
link: ["text-(--nc-link) underline-offset-4 hover:underline", heldDim],
|
|
41
|
+
},
|
|
42
|
+
size: {
|
|
43
|
+
default: "h-control-height gap-0.75 px-button-padding-inline [@media(hover:hover)_and_(pointer:fine)]:min-h-control-height [&_[data-icon]_svg:not([class*='size-'])]:size-3.5",
|
|
44
|
+
xs: "h-nadicode-control-height-xs gap-1 px-2 text-button-xs in-data-[slot=button-group]:rounded-sm has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
|
|
45
|
+
sm: "h-nadicode-control-height-sm gap-0.75 px-button-padding-inline-sm in-data-[slot=button-group]:rounded-sm [&_svg:not([class*='size-'])]:size-3.5",
|
|
46
|
+
lg: "h-nadicode-control-height-lg gap-0.75 rounded-md px-button-padding-inline-lg text-button-lg",
|
|
47
|
+
inline: "h-auto gap-0.75 p-0 [@media(hover:hover)_and_(pointer:fine)]:min-h-control-height [&_[data-icon]_svg:not([class*='size-'])]:size-3.5",
|
|
48
|
+
icon: "size-control-height",
|
|
49
|
+
"icon-xs": "size-nadicode-control-height-xs rounded-xs-plus in-data-[slot=button-group]:rounded-sm",
|
|
50
|
+
"icon-sm": "size-nadicode-control-height-sm in-data-[slot=button-group]:rounded-sm",
|
|
51
|
+
"icon-lg": "size-nadicode-control-height-lg rounded-md",
|
|
52
|
+
},
|
|
53
|
+
shape: {
|
|
54
|
+
square: "",
|
|
55
|
+
rounded: "rounded-full px-3",
|
|
56
|
+
circle: "rounded-full",
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
defaultVariants: {
|
|
60
|
+
variant: "default",
|
|
61
|
+
size: "default",
|
|
62
|
+
shape: "square",
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
/**
|
|
66
|
+
* The button classes for an element that is not a `Button`, such as a calendar's
|
|
67
|
+
* day arrows. They pass through `cn` as `Button`'s do, so a variant's border,
|
|
68
|
+
* fill or text replaces the base one instead of losing to it in the stylesheet:
|
|
69
|
+
* unmerged, the base `border-transparent` hides every outline edge. A link
|
|
70
|
+
* drawn as a button is a `ButtonLink`.
|
|
71
|
+
*/
|
|
72
|
+
export function buttonVariants(props) {
|
|
73
|
+
return cn(buttonClasses(props));
|
|
74
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-list.d.ts","sourceRoot":"","sources":["../../src/internal/catalog-list.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,4BAA4B,CAAC;AASpF,KAAK,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC;AAqG5B,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,YAAgB,EAChB,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,cAAc,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACrB,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CACrC,+
|
|
1
|
+
{"version":3,"file":"catalog-list.d.ts","sourceRoot":"","sources":["../../src/internal/catalog-list.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,4BAA4B,CAAC;AASpF,KAAK,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC;AAqG5B,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,YAAgB,EAChB,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,cAAc,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACrB,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CACrC,+BAsBA;AAED,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,+BAoB7F;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,OAAO,CAE3E"}
|
|
@@ -19,7 +19,7 @@ function EntryName({ link, name }) {
|
|
|
19
19
|
children: name,
|
|
20
20
|
className: textLinkVariants({ kind: "plain" }),
|
|
21
21
|
};
|
|
22
|
-
return link.renderLink ? link.renderLink(anchor) : _jsx("a", { ...anchor });
|
|
22
|
+
return link.renderLink ? link.renderLink(anchor) : _jsx("a", { ...anchor, children: name });
|
|
23
23
|
}
|
|
24
24
|
function EntryAdd({ add }) {
|
|
25
25
|
const { added, ...command } = add;
|
|
@@ -41,9 +41,13 @@ function TitledSection({ columns, entries, headingLevel, title, }) {
|
|
|
41
41
|
return (_jsxs("section", { "aria-labelledby": headingId, className: "grid min-w-0 gap-3", children: [_jsx(Heading, { className: "text-heading-sm text-foreground", id: headingId, children: title }), _jsx(EntryList, { columns: columns, entries: entries })] }));
|
|
42
42
|
}
|
|
43
43
|
export function CatalogList({ columns, headingLevel = 3, sections, }) {
|
|
44
|
-
return (_jsx("div", { className: "grid min-w-0 gap-8", children: sections
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
return (_jsx("div", { className: "grid min-w-0 gap-8", children: sections.flatMap(({ id, title, entries }) => {
|
|
45
|
+
if (entries.length === 0)
|
|
46
|
+
return [];
|
|
47
|
+
return [
|
|
48
|
+
title ? (_jsx(TitledSection, { columns: columns, entries: entries, headingLevel: headingLevel, id: id, title: title }, id)) : (_jsx(EntryList, { columns: columns, entries: entries }, id)),
|
|
49
|
+
];
|
|
50
|
+
}) }));
|
|
47
51
|
}
|
|
48
52
|
export function CatalogSkeleton({ columns, label }) {
|
|
49
53
|
return (_jsx(SkeletonRegion, { "aria-label": label, busy: true, className: cn("grid gap-3", columns === 2 && "md:grid-cols-2"), role: "status", children: Array.from({ length: columns * 3 }, (_, index) => (_jsxs("div", { "aria-hidden": "true", className: ENTRY_FRAME, children: [_jsx(Skeleton, { className: "size-10 shrink-0" }), _jsxs("div", { className: "grid flex-1 gap-1.5 pt-0.5", children: [_jsx(Skeleton, { className: "h-4 w-32" }), _jsx(Skeleton, { className: "h-3.5 w-full" })] }), _jsx(Skeleton, { className: "h-control-height w-16 shrink-0" })] }, index))) }));
|
|
@@ -8,11 +8,11 @@ import { PageCommandButton } from "../components/page-actions.js";
|
|
|
8
8
|
import { Skeleton, SkeletonRegion } from "../components/skeleton.js";
|
|
9
9
|
import { StatusBadge } from "../components/status-badge.js";
|
|
10
10
|
import { cn } from "../lib/utils.js";
|
|
11
|
-
function defaultLink(props) {
|
|
12
|
-
return _jsx("a", { ...props });
|
|
11
|
+
function defaultLink({ children, ...props }) {
|
|
12
|
+
return _jsx("a", { ...props, children: children });
|
|
13
13
|
}
|
|
14
14
|
function RailItem({ item, renderLink, }) {
|
|
15
|
-
const body = (_jsxs(_Fragment, { children: [item.mark ? _jsx(IdentityMark, { ...item.mark, size: 24 }) : null, _jsxs("span", { className: "grid min-w-0 flex-1", children: [_jsx("span", { className: "truncate font-medium text-foreground", title: item.title, children: item.title }), item.detail ? (_jsx("span", { className: "line-clamp-2 text-body-sm break-
|
|
15
|
+
const body = (_jsxs(_Fragment, { children: [item.mark ? _jsx(IdentityMark, { ...item.mark, size: 24 }) : null, _jsxs("span", { className: "grid min-w-0 flex-1", children: [_jsx("span", { className: "truncate font-medium text-foreground", title: item.title, children: item.title }), item.detail ? (_jsx("span", { className: "line-clamp-2 text-body-sm wrap-break-word text-muted-foreground", children: item.detail })) : null] }), item.status ? _jsx(StatusBadge, { label: item.status.label, tone: item.status.tone }) : null, item.value === undefined ? null : (_jsx("span", { className: "shrink-0 text-right text-foreground tabular-nums", children: item.value }))] }));
|
|
16
16
|
const row = "flex min-h-9 min-w-0 items-center gap-3 px-4 py-2 text-sm";
|
|
17
17
|
return (_jsx("li", { "data-slot": "collection-rail-item", children: item.href ? (renderLink({
|
|
18
18
|
href: item.href,
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FormSurfaceProps } from "../components/form-drawer.js";
|
|
2
|
+
export type FormDrawerFrameProps = FormSurfaceProps & ({
|
|
3
|
+
job: "catalog";
|
|
4
|
+
} | {
|
|
5
|
+
job: "steps";
|
|
6
|
+
progress: string;
|
|
7
|
+
});
|
|
8
|
+
/** The right-side sheet that `FormDrawer` and `CatalogDrawer` both draw. */
|
|
9
|
+
export declare function FormDrawerFrame(props: FormDrawerFrameProps): import("react").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=form-drawer-frame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-drawer-frame.d.ts","sourceRoot":"","sources":["../../src/internal/form-drawer-frame.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GACjD,CAAC;IAAE,GAAG,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE5D,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,+BA0C1D"}
|