@gntik-ai/templates 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- import { ActiveFilter, ActivityItem, ApiKeyExpiry, ApiKeyScope, AppSidebarFooterProps, AppSidebarHeaderProps, AppTopbarProps, BillingCycle, BillingPlan, ChartCardProps, ChartCardRange, CodeFile, CodePanelProps, CodeProblem, CommentAuthor, ConsoleEntry, CostPoint, CreateApiKeyInput, DangerZoneAction, DataTableColumn, DeploymentRow, DescriptionItem, DeviceSession, EvalMetric, EvalRow, FaqItem, Feature, FeedbackAction, FilterField, FlowBuilderProps, FlowEdge, FlowNode, FlowNodeKind, ForgotPasswordFormProps, Invitation as Invitation$1, InvitePayload, Invoice, KpiItem, LogLine, MarketingAction, Member, MfaMethod, ModelKey, NotificationChannel, NotificationEvent, NotificationMatrixValue, PageChromeAction, PageHeaderMetaItem, PaletteItem, PaymentMethod, PricingCycle, PricingTier, Profile, PromptRunInput, Quota, ResourceAction, ResourceCard, RoleOption, SavedView, SignInFormProps, SignInValues, SignUpValues, SsoProvider, StatusEvent, ThreadComment, TokenUsagePeriod, TraceSpan } from "@gntik-ai/blocks";
2
+ import { ActiveFilter, ActivityItem, ApiKeyExpiry, ApiKeyScope, AppSidebarFooterProps, AppSidebarHeaderProps, AppTopbarProps, BillingCycle, BillingPlan, ChartCardProps, ChartCardRange, CodeFile, CodePanelProps, CodeProblem, CommentAuthor, ConsoleEntry, CostPoint, CreateApiKeyInput, DangerZoneAction, DataTableColumn, DeploymentRow, DescriptionItem, DeviceSession, EvalMetric, EvalRow, FaqItem, Feature, FeedbackAction, FilterField, FlowBuilderProps, FlowEdge, FlowGraph, FlowNode, FlowNodeKind, ForgotPasswordFormProps, Invitation as Invitation$1, InvitePayload, Invoice, KpiItem, LogLine, MarketingAction, Member, MfaMethod, ModelKey, NotificationChannel, NotificationEvent, NotificationMatrixValue, PageChromeAction, PageHeaderMetaItem, PaletteItem, PaymentMethod, PricingCycle, PricingTier, Profile, PromptRunInput, Quota, ResourceAction, ResourceCard, RoleOption, SavedView, SignInFormProps, SignInValues, SignUpValues, SsoProvider, StatusEvent, ThreadComment, TokenUsagePeriod, TraceSpan } from "@gntik-ai/blocks";
3
3
  import { BreadcrumbItem, DateRange, KanbanCard, KanbanColumn, KanbanMove, ListInputPair, MegaMenuItem, NavGroup, NavItem, NotificationItem, OutlineItem, PowerSearchField, PowerSearchQuery, SettingsLayoutProps, SidebarLayoutProps, StatusDotTone, StepItem, StepStatus, TransferListItem, UserMenuUser, WizardLayoutProps, Workspace } from "@gntik-ai/ui";
4
4
  import { MouseEventHandler, ReactElement, ReactNode } from "react";
5
5
  import { ChatFeedback, CitationSource, Suggestion } from "@gntik-ai/chat";
@@ -395,7 +395,7 @@ declare function CreateWorkspacePage({ steps, initialValues, regions, plans, rol
395
395
  declare const meta$8: TemplateMeta;
396
396
  //#endregion
397
397
  //#region src/workflow-builder/Page.d.ts
398
- interface FlowBuilderPageProps<Kind extends string = FlowNodeKind> extends Pick<FlowBuilderProps<Kind>, 'nodeTypes' | 'onConnectEdge' | 'onConnect' | 'isValidConnection' | 'onConnectionRejected' | 'validationIssues' | 'mode' | 'nodeStatus' | 'onNodeSelect'> {
398
+ interface FlowBuilderPageProps<Kind extends string = FlowNodeKind> extends Pick<FlowBuilderProps<Kind>, 'nodeTypes' | 'onConnectEdge' | 'onConnect' | 'isValidConnection' | 'onConnectionRejected' | 'validationIssues' | 'mode' | 'nodeStatus' | 'onNodeSelect' | 'graph' | 'onGraphChange'> {
399
399
  /** Optional companion code panel; run mode forces readOnly. */
400
400
  codePanel?: CodePanelProps;
401
401
  title: string;
@@ -413,7 +413,7 @@ interface FlowBuilderPageProps<Kind extends string = FlowNodeKind> extends Pick<
413
413
  defaultConsoleEntries: ConsoleEntry[];
414
414
  onConsoleChange: (entries: ConsoleEntry[]) => void;
415
415
  onConsoleClear: () => void;
416
- onSave: () => void | Promise<void>;
416
+ onSave: (graph: FlowGraph<Kind>) => void | Promise<void>;
417
417
  onPublish: () => void;
418
418
  breadcrumbs: BreadcrumbItem[];
419
419
  /** Builder height in px on wide screens. */
@@ -657,7 +657,15 @@ interface ResourceSettings {
657
657
  //#endregion
658
658
  //#region src/resource-detail/Page.d.ts
659
659
  type ResourceDetailTab = 'overview' | 'activity' | 'settings';
660
+ interface ResourceDetailLabels {
661
+ overview: string;
662
+ activity: string;
663
+ settings: string;
664
+ sections: string;
665
+ }
660
666
  interface ResourceDetailProps {
667
+ /** Per-key copy overrides; explicit props take precedence, then labels, then the active catalog. */
668
+ labels?: Partial<ResourceDetailLabels>;
661
669
  /**
662
670
  * Optional boolean, default false. Shows only the keyboard-accessible Overview tab in
663
671
  * the "Resource sections" tablist, using explicit resource props without sample defaults.
@@ -2353,7 +2361,7 @@ interface Shortcut {
2353
2361
  id: string;
2354
2362
  /** What the shortcut does. */
2355
2363
  description: string;
2356
- /** Keys pressed together, e.g. ['⌘', 'K']. */
2364
+ /** Keys pressed together, e.g. ['mod', 'K']. */
2357
2365
  keys: string[];
2358
2366
  /** A second combination that does the same (e.g. a sequence "G then P"). */
2359
2367
  then?: string[];
@@ -2529,5 +2537,5 @@ declare function IncidentBoardPage(props: Partial<IncidentBoardProps>): import("
2529
2537
  //#region src/incident-board/template.meta.d.ts
2530
2538
  declare const meta$16: TemplateMeta;
2531
2539
  //#endregion
2532
- export { AcceptInvitationPage, type AcceptInvitationPageProps, type ApiKey, type ArticleFeedbackValue, type ArticleLink, AssistantChatPage, type AssistantChatProps, type AssistantTool, type AuditEvent, AuditLogPage, type AuditLogProps, type AuditResult, type BoardCard, type BoardColumn, BoardPage, type BoardProps, type BoardState, type ChangelogEntry, ChangelogPage, type ChangelogProps, type ChangelogTag, CodeEditorPage, type CodeEditorPageProps, type ComparisonRow, type ComparisonSection, type ComparisonValue, type Connector, type ConsoleShellProps, ContactPage, type ContactProps, type ContactTopic, type ContactValues, type Conversation, type CreateWizardCopy, type CreateWizardFieldErrors, type CreateWizardFlowLabels, type CreateWizardFlowProps, type CreateWizardFlowStep, CreateWizardPage, type CreateWizardProps, type CreateWizardSubmitState, CreateWorkspacePage, type CreateWorkspaceProps, DataExplorerPage, type DataExplorerProps, type Density, type DirectMessage, type DocLink, DocsArticlePage, type DocsArticleProps, type EvalRegression, type EvalSample, EvaluationsPage, type EvaluationsProps, type ExplorerField, type ExplorerRow, type FlowBuilderPageProps, ForgotPasswordPage, type ForgotPasswordPageProps, type GalleryView, GettingStartedPage, type GettingStartedProps, type HelpArticle, type HelpCategory, HelpHomePage, type HelpHomeProps, HomeDashboardPage, type HomeDashboardProps, type HomeSecondaryChart, type InboxCategory, type InboxFilter, type InboxNotification, type Incident, IncidentBoardPage, type IncidentBoardProps, IncidentConsolePage, type IncidentConsoleProps, type IncidentField, type IncidentSeverity, type IncidentStatus, type Invitation, type KeyboardShortcutsDialogProps, KeyboardShortcutsPage, type KeyboardShortcutsProps, LandingPage, type LandingProps, type LanguageOption, type LiveEvent, LiveEventStreamPage, type LiveEventStreamProps, type LiveEventStreamStatus, type MessageAttachment, MessagingPage, type MessagingProps, type MfaChallengePageProps, MfaChallengePage as MfaPage, ModelProvidersPage, type ModelProvidersProps, type NewModelKeyInput, type WorkspaceValues as NewWorkspaceValues, NotificationInboxPage, type NotificationInboxProps, type Office, type PasswordChange, type PendingActivationAction, type PendingActivationLink, PendingActivationPage, type PendingActivationPageProps, type PlaygroundModel, type PlaygroundOutput, PricingPage, type PricingProps, type ProfileDetail, type ProfileFormValues, PromptPlaygroundPage, type PromptPlaygroundProps, type ProviderUsageLimit, type PublicHubAction, PublicHubPage, type PublicHubPageProps, type QuickAction, type RadarPoint, type RegionOption, type RequestPoint, ResetPasswordPage, type ResetPasswordPageProps, type ResourceBulkAction, ResourceDetailPage, type ResourceDetailProps, type ResourceDetailTab, ResourceFormPage, type ResourceFormProps, type ResourceFormValues, ResourceGalleryPage, type ResourceGalleryProps, type ResourceGroupBy, ResourceIndexPage, type ResourceIndexProps, type ResourceKind, type RegionOption$1 as ResourceRegionOption, type ResourceRow, type ResourceSettings, ResourceTreePage, type ResourceTreeProps, type RolePermission, RunTracePage, type RunTraceProps, type ScorecardMetric, ScorecardPage, type ScorecardProps, type SearchFacet, type SearchHit, type SearchResultType, SearchResultsPage, type SearchResultsProps, type SearchSelection, type SelectOption, SettingsApiKeysPage, type SettingsApiKeysProps, SettingsAppearancePage, type SettingsAppearanceProps, SettingsBillingPage, type SettingsBillingProps, type SettingsFrameOptions, type SettingsFrameProps, SettingsIntegrationsPage, type SettingsIntegrationsProps, SettingsMembersPage, type SettingsMembersProps, type SettingsNavExtraItem, SettingsNotificationsPage, type SettingsNotificationsProps, type SettingsPageId, SettingsProfilePage, type SettingsProfileProps, SettingsSecurityPage, type SettingsSecurityProps, SettingsWorkspacePage, type SettingsWorkspaceProps, type SetupTask, ShellSidebarPage, type ShellSidebarPageProps, ShellTopnavPage, type ShellTopnavPageProps, type Shortcut, type ShortcutGroup, SignInCardPage, type SignInCardPageProps, SignInPage, type SignInPageProps, SignUpPage, type SignUpPageProps, type SignatureHeader, type SourceOption, type SpanDetail, SsoLoginPage, type SsoLoginPageProps, Status403Page, type Status403Props, Status404Page, type Status404Props, Status500Page, type Status500Props, StatusMaintenancePage, type StatusMaintenanceProps, type TemplateMeta, type TraceRun, type TrafficPoint, type TreeResource, type TriageIncident, type TriageSeverity, type TriageStage, UpgradeRequiredPage, type UpgradeRequiredProps, UsageAnalyticsPage, type UsageAnalyticsProps, type UsageExportRequest, type UsageRow, VerifyEmailPage, type VerifyEmailPageProps, type WebhookDelivery, type WebhookEndpoint, type WizardRegion, type WizardValues, FlowBuilderPage as WorkflowBuilderPage, type WorkspaceRegion, type WorkspaceValues$1 as WorkspaceValues, meta as acceptInvitationTemplateMeta, meta$1 as assistantChatTemplateMeta, meta$2 as auditLogTemplateMeta, meta$3 as boardTemplateMeta, meta$4 as changelogTemplateMeta, meta$5 as codeEditorTemplateMeta, meta$6 as contactTemplateMeta, meta$7 as createWizardTemplateMeta, meta$8 as createWorkspaceTemplateMeta, meta$9 as dataExplorerTemplateMeta, meta$10 as docsArticleTemplateMeta, meta$11 as evaluationsTemplateMeta, meta$12 as forgotPasswordTemplateMeta, formatAge as formatIncidentAge, meta$13 as gettingStartedTemplateMeta, meta$14 as helpHomeTemplateMeta, meta$15 as homeDashboardTemplateMeta, meta$16 as incidentBoardTemplateMeta, meta$17 as incidentConsoleTemplateMeta, meta$18 as keyboardShortcutsTemplateMeta, meta$19 as landingTemplateMeta, meta$20 as liveEventStreamTemplateMeta, meta$21 as messagingTemplateMeta, meta$22 as mfaTemplateMeta, meta$23 as modelProvidersTemplateMeta, meta$24 as notificationInboxTemplateMeta, meta$25 as pendingActivationTemplateMeta, meta$26 as pricingTemplateMeta, meta$27 as promptPlaygroundTemplateMeta, meta$28 as publicHubTemplateMeta, meta$29 as resetPasswordTemplateMeta, meta$30 as resourceDetailTemplateMeta, meta$31 as resourceFormTemplateMeta, meta$32 as resourceGalleryTemplateMeta, meta$33 as resourceIndexTemplateMeta, meta$34 as resourceTreeTemplateMeta, meta$35 as runTraceTemplateMeta, meta$36 as scorecardTemplateMeta, meta$37 as searchResultsTemplateMeta, meta$38 as settingsApiKeysTemplateMeta, meta$39 as settingsAppearanceTemplateMeta, meta$40 as settingsBillingTemplateMeta, meta$41 as settingsIntegrationsTemplateMeta, meta$42 as settingsMembersTemplateMeta, meta$43 as settingsNotificationsTemplateMeta, meta$44 as settingsProfileTemplateMeta, meta$45 as settingsSecurityTemplateMeta, meta$46 as settingsWorkspaceTemplateMeta, meta$47 as shellSidebarTemplateMeta, meta$48 as shellTopnavTemplateMeta, meta$49 as signInCardTemplateMeta, meta$50 as signInTemplateMeta, meta$51 as signUpTemplateMeta, meta$52 as ssoLoginTemplateMeta, meta$53 as status403TemplateMeta, meta$54 as status404TemplateMeta, meta$55 as status500TemplateMeta, meta$56 as statusMaintenanceTemplateMeta, meta$57 as upgradeRequiredTemplateMeta, meta$58 as usageAnalyticsTemplateMeta, meta$59 as verifyEmailTemplateMeta, meta$60 as workflowBuilderTemplateMeta };
2540
+ export { AcceptInvitationPage, type AcceptInvitationPageProps, type ApiKey, type ArticleFeedbackValue, type ArticleLink, AssistantChatPage, type AssistantChatProps, type AssistantTool, type AuditEvent, AuditLogPage, type AuditLogProps, type AuditResult, type BoardCard, type BoardColumn, BoardPage, type BoardProps, type BoardState, type ChangelogEntry, ChangelogPage, type ChangelogProps, type ChangelogTag, CodeEditorPage, type CodeEditorPageProps, type ComparisonRow, type ComparisonSection, type ComparisonValue, type Connector, type ConsoleShellProps, ContactPage, type ContactProps, type ContactTopic, type ContactValues, type Conversation, type CreateWizardCopy, type CreateWizardFieldErrors, type CreateWizardFlowLabels, type CreateWizardFlowProps, type CreateWizardFlowStep, CreateWizardPage, type CreateWizardProps, type CreateWizardSubmitState, CreateWorkspacePage, type CreateWorkspaceProps, DataExplorerPage, type DataExplorerProps, type Density, type DirectMessage, type DocLink, DocsArticlePage, type DocsArticleProps, type EvalRegression, type EvalSample, EvaluationsPage, type EvaluationsProps, type ExplorerField, type ExplorerRow, type FlowBuilderPageProps, ForgotPasswordPage, type ForgotPasswordPageProps, type GalleryView, GettingStartedPage, type GettingStartedProps, type HelpArticle, type HelpCategory, HelpHomePage, type HelpHomeProps, HomeDashboardPage, type HomeDashboardProps, type HomeSecondaryChart, type InboxCategory, type InboxFilter, type InboxNotification, type Incident, IncidentBoardPage, type IncidentBoardProps, IncidentConsolePage, type IncidentConsoleProps, type IncidentField, type IncidentSeverity, type IncidentStatus, type Invitation, type KeyboardShortcutsDialogProps, KeyboardShortcutsPage, type KeyboardShortcutsProps, LandingPage, type LandingProps, type LanguageOption, type LiveEvent, LiveEventStreamPage, type LiveEventStreamProps, type LiveEventStreamStatus, type MessageAttachment, MessagingPage, type MessagingProps, type MfaChallengePageProps, MfaChallengePage as MfaPage, ModelProvidersPage, type ModelProvidersProps, type NewModelKeyInput, type WorkspaceValues as NewWorkspaceValues, NotificationInboxPage, type NotificationInboxProps, type Office, type PasswordChange, type PendingActivationAction, type PendingActivationLink, PendingActivationPage, type PendingActivationPageProps, type PlaygroundModel, type PlaygroundOutput, PricingPage, type PricingProps, type ProfileDetail, type ProfileFormValues, PromptPlaygroundPage, type PromptPlaygroundProps, type ProviderUsageLimit, type PublicHubAction, PublicHubPage, type PublicHubPageProps, type QuickAction, type RadarPoint, type RegionOption, type RequestPoint, ResetPasswordPage, type ResetPasswordPageProps, type ResourceBulkAction, type ResourceDetailLabels, ResourceDetailPage, type ResourceDetailProps, type ResourceDetailTab, ResourceFormPage, type ResourceFormProps, type ResourceFormValues, ResourceGalleryPage, type ResourceGalleryProps, type ResourceGroupBy, ResourceIndexPage, type ResourceIndexProps, type ResourceKind, type RegionOption$1 as ResourceRegionOption, type ResourceRow, type ResourceSettings, ResourceTreePage, type ResourceTreeProps, type RolePermission, RunTracePage, type RunTraceProps, type ScorecardMetric, ScorecardPage, type ScorecardProps, type SearchFacet, type SearchHit, type SearchResultType, SearchResultsPage, type SearchResultsProps, type SearchSelection, type SelectOption, SettingsApiKeysPage, type SettingsApiKeysProps, SettingsAppearancePage, type SettingsAppearanceProps, SettingsBillingPage, type SettingsBillingProps, type SettingsFrameOptions, type SettingsFrameProps, SettingsIntegrationsPage, type SettingsIntegrationsProps, SettingsMembersPage, type SettingsMembersProps, type SettingsNavExtraItem, SettingsNotificationsPage, type SettingsNotificationsProps, type SettingsPageId, SettingsProfilePage, type SettingsProfileProps, SettingsSecurityPage, type SettingsSecurityProps, SettingsWorkspacePage, type SettingsWorkspaceProps, type SetupTask, ShellSidebarPage, type ShellSidebarPageProps, ShellTopnavPage, type ShellTopnavPageProps, type Shortcut, type ShortcutGroup, SignInCardPage, type SignInCardPageProps, SignInPage, type SignInPageProps, SignUpPage, type SignUpPageProps, type SignatureHeader, type SourceOption, type SpanDetail, SsoLoginPage, type SsoLoginPageProps, Status403Page, type Status403Props, Status404Page, type Status404Props, Status500Page, type Status500Props, StatusMaintenancePage, type StatusMaintenanceProps, type TemplateMeta, type TraceRun, type TrafficPoint, type TreeResource, type TriageIncident, type TriageSeverity, type TriageStage, UpgradeRequiredPage, type UpgradeRequiredProps, UsageAnalyticsPage, type UsageAnalyticsProps, type UsageExportRequest, type UsageRow, VerifyEmailPage, type VerifyEmailPageProps, type WebhookDelivery, type WebhookEndpoint, type WizardRegion, type WizardValues, FlowBuilderPage as WorkflowBuilderPage, type WorkspaceRegion, type WorkspaceValues$1 as WorkspaceValues, meta as acceptInvitationTemplateMeta, meta$1 as assistantChatTemplateMeta, meta$2 as auditLogTemplateMeta, meta$3 as boardTemplateMeta, meta$4 as changelogTemplateMeta, meta$5 as codeEditorTemplateMeta, meta$6 as contactTemplateMeta, meta$7 as createWizardTemplateMeta, meta$8 as createWorkspaceTemplateMeta, meta$9 as dataExplorerTemplateMeta, meta$10 as docsArticleTemplateMeta, meta$11 as evaluationsTemplateMeta, meta$12 as forgotPasswordTemplateMeta, formatAge as formatIncidentAge, meta$13 as gettingStartedTemplateMeta, meta$14 as helpHomeTemplateMeta, meta$15 as homeDashboardTemplateMeta, meta$16 as incidentBoardTemplateMeta, meta$17 as incidentConsoleTemplateMeta, meta$18 as keyboardShortcutsTemplateMeta, meta$19 as landingTemplateMeta, meta$20 as liveEventStreamTemplateMeta, meta$21 as messagingTemplateMeta, meta$22 as mfaTemplateMeta, meta$23 as modelProvidersTemplateMeta, meta$24 as notificationInboxTemplateMeta, meta$25 as pendingActivationTemplateMeta, meta$26 as pricingTemplateMeta, meta$27 as promptPlaygroundTemplateMeta, meta$28 as publicHubTemplateMeta, meta$29 as resetPasswordTemplateMeta, meta$30 as resourceDetailTemplateMeta, meta$31 as resourceFormTemplateMeta, meta$32 as resourceGalleryTemplateMeta, meta$33 as resourceIndexTemplateMeta, meta$34 as resourceTreeTemplateMeta, meta$35 as runTraceTemplateMeta, meta$36 as scorecardTemplateMeta, meta$37 as searchResultsTemplateMeta, meta$38 as settingsApiKeysTemplateMeta, meta$39 as settingsAppearanceTemplateMeta, meta$40 as settingsBillingTemplateMeta, meta$41 as settingsIntegrationsTemplateMeta, meta$42 as settingsMembersTemplateMeta, meta$43 as settingsNotificationsTemplateMeta, meta$44 as settingsProfileTemplateMeta, meta$45 as settingsSecurityTemplateMeta, meta$46 as settingsWorkspaceTemplateMeta, meta$47 as shellSidebarTemplateMeta, meta$48 as shellTopnavTemplateMeta, meta$49 as signInCardTemplateMeta, meta$50 as signInTemplateMeta, meta$51 as signUpTemplateMeta, meta$52 as ssoLoginTemplateMeta, meta$53 as status403TemplateMeta, meta$54 as status404TemplateMeta, meta$55 as status500TemplateMeta, meta$56 as statusMaintenanceTemplateMeta, meta$57 as upgradeRequiredTemplateMeta, meta$58 as usageAnalyticsTemplateMeta, meta$59 as verifyEmailTemplateMeta, meta$60 as workflowBuilderTemplateMeta };
2533
2541
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  'use client';
2
- import { ActivityFeed, AppSidebarFooter, AppSidebarHeader, AppSidebarNav, AppTopbar, AuthHeader, BulkActionBar, ChartCard, CodePanel, CommentThread, ConfirmDestructive, CreateApiKeyDialog, DEPLOYMENT_COLUMNS, DEPLOYMENT_DETAILS, DEPLOYMENT_EVENTS, DEPLOYMENT_ROWS, DangerZone, DataTable, DateRangeFilter, DescriptionListCard, ErrorPanel, EvaluationScorecard, Faq, FeatureGrid, FileUploadPanel, FilterBar, FirstRunEmpty, FlowBuilder, ForgotPasswordForm, FormSection, Hero, InlineCallout, InviteMembersDialog, InvoiceTable, KPI_ITEMS, KpiRow, ListSkeleton, LogViewer, MembersTable, MfaChallenge, ModelKeysList, NoResultsEmpty, NotificationMatrix, PROJECT_ACTIVITY, PageHeader, PageToolbar, PaymentMethodCard, PendingInvitations, PlanCard, PricingTable, ProfileHeader, PromptEditor, QuotaMeters, RESOURCE_CARDS, ResetPasswordForm, ResourceCardGrid, SectionHeader, SessionsDevices, SettingsRow, SignInForm, SignUpForm, SsoButtons, StatusTimeline, StickyActionBar, SystemBanner, TokenCostCard, TraceWaterfall, TrendDelta, ValidationSummary, apiKeyExpiries, apiKeyScopes, appSidebarNavGroups, appSidebarUser, appSidebarUser as appSidebarUser$1, appSidebarWorkspaces, appTopbarNotifications, firstRunSteps, formatSpanDuration, generateDemoSecret, memberRoles, noAccessSample, notificationChannels, notificationDefaults, notificationEvents, sampleDeviceSessions, sampleInvitations, sampleInvoices, sampleMembers, samplePaymentMethod, samplePlan, samplePricingTiers, sampleProfile, sampleQuotas, ssoProviders, ssoProviders as ssoProviders$1 } from "@gntik-ai/blocks";
3
- import { Alert, AuthLayout, Avatar, AvatarGroup, Badge, Blockquote, Breadcrumbs, Button, CanvasLayout, Card, CardBody, CardDescription, CardHeader, CardTitle, Checkbox, CheckboxGroup, ClickableCard, CodeBlock, ContextMenu, ContextMenuContent, ContextMenuTrigger, Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DocsLayout, Drawer, DrawerBody, DrawerContent, DrawerDescription, DrawerHeader, DrawerTitle, EmptyState, Field, FieldDescription, FieldError, FieldLabel, Grid, GridItem, HStack, Heading, IconButton, Input, InspectorLayout, InspectorToggle, JsonViewer, KanbanBoard, Kbd, KbdCombo, Link, ListInput, LiveAnnouncer, Logo, MegaMenu, MenuItem, MenuSeparator, Meter, MobileNav, NavList, OtpInput, OverflowList, Page, PasswordInput, PowerSearch, Progress, Section, Select, SelectContent, SelectItem, SelectTrigger, SelectableCard, SelectableCardGroup, Separator, SettingsLayout, SidebarLayout, SimpleSelect, Skeleton, Spinner, SplitLayout, Stack, StackedLayout, StatusDot, StatusLayout, StatusTag, Switch, Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow, Tabs, TabsList, TabsPanel, TabsTab, Text, Textarea, ThemeSwitcher, Thumbnail, ThumbnailList, Timer, Timestamp, Toggle, ToggleGroup, TokenInput, TooltipProvider, TransferList, TreeList, VisuallyHidden, WizardLayout, cn, emptyPowerSearchQuery, formatPowerSearch, matchPowerSearch, matchText, megaMenuNavItems, moveKanbanCard, parsePowerSearch, useAnnounce, useHasLiveAnnouncer, useI18n, useInspectorLayout, useTheme } from "@gntik-ai/ui";
2
+ import { ChartLocaleProvider, Heatmap, MiniBar, RadarChart, chartFmt } from "@gntik-ai/charts";
3
+ import { ActivityFeed, AppSidebarFooter, AppSidebarHeader, AppSidebarNav, AppTopbar, AuthHeader, BulkActionBar, ChartCard, CodePanel, CommentThread, ConfirmDestructive, CreateApiKeyDialog, DEPLOYMENT_COLUMNS, DEPLOYMENT_DETAILS, DEPLOYMENT_EVENTS, DEPLOYMENT_ROWS, DangerZone, DataTable, DateRangeFilter, DescriptionListCard, ErrorPanel, EvaluationScorecard, Faq, FeatureGrid, FileUploadPanel, FilterBar, FirstRunEmpty, FlowBuilder, ForgotPasswordForm, FormSection, Hero, InlineCallout, InviteMembersDialog, InvoiceTable, KPI_ITEMS, KpiRow, ListSkeleton, LogViewer, MembersTable, MfaChallenge, ModelKeysList, NoResultsEmpty, NotificationMatrix, PROJECT_ACTIVITY, PageHeader, PageToolbar, PaymentMethodCard, PendingInvitations, PlanCard, PricingTable, ProfileHeader, PromptEditor, QuotaMeters, RESOURCE_CARDS, ResetPasswordForm, ResourceCardGrid, SectionHeader, SessionsDevices, SettingsRow, SignInForm, SignUpForm, SsoButtons, StatusTimeline, StickyActionBar, SystemBanner, TokenCostCard, TraceWaterfall, TrendDelta, ValidationSummary, apiKeyExpiries, apiKeyScopes, appSidebarNavGroups, appSidebarUser, appSidebarUser as appSidebarUser$1, appSidebarWorkspaces, appTopbarNotifications, builderEdges, builderNodes, cleanFlowGraph, firstRunSteps, formatSpanDuration, generateDemoSecret, memberRoles, noAccessSample, notificationChannels, notificationDefaults, notificationEvents, sampleDeviceSessions, sampleInvitations, sampleInvoices, sampleMembers, samplePaymentMethod, samplePlan, samplePricingTiers, sampleProfile, sampleQuotas, ssoProviders, ssoProviders as ssoProviders$1 } from "@gntik-ai/blocks";
4
+ import { Alert, AuthLayout, Avatar, AvatarGroup, Badge, Blockquote, Breadcrumbs, Button, CanvasLayout, Card, CardBody, CardDescription, CardHeader, CardTitle, Checkbox, CheckboxGroup, ClickableCard, CodeBlock, ContextMenu, ContextMenuContent, ContextMenuTrigger, Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DocsLayout, Drawer, DrawerBody, DrawerContent, DrawerDescription, DrawerHeader, DrawerTitle, EmptyState, Field, FieldDescription, FieldError, FieldLabel, Grid, GridItem, HStack, Heading, IconButton, Input, InspectorLayout, InspectorToggle, JsonViewer, KanbanBoard, Kbd, KbdCombo, Link, ListInput, LiveAnnouncer, Logo, MegaMenu, MenuItem, MenuSeparator, Meter, MobileNav, NavList, OtpInput, OverflowList, Page, PasswordInput, PowerSearch, Progress, Section, Select, SelectContent, SelectItem, SelectTrigger, SelectableCard, SelectableCardGroup, Separator, SettingsLayout, SidebarLayout, SimpleSelect, Skeleton, Spinner, SplitLayout, Stack, StackedLayout, StatusDot, StatusLayout, StatusTag, Switch, Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow, Tabs, TabsList, TabsPanel, TabsTab, Text, Textarea, ThemeSwitcher, Thumbnail, ThumbnailList, Timer, Timestamp, Toggle, ToggleGroup, TokenInput, TooltipProvider, TransferList, TreeList, VisuallyHidden, WizardLayout, cn, emptyPowerSearchQuery, formatPowerSearch, matchPowerSearch, matchText, megaMenuNavItems, moveKanbanCard, parsePowerSearch, useAnnounce, useHasLiveAnnouncer, useI18n, useInspectorLayout, useOs, useTheme } from "@gntik-ai/ui";
4
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
6
  import { Fragment as Fragment$1, createElement, useEffect, useEffectEvent, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
6
7
  import { ChatAnnouncer, ChatComposer, ChatLayout, ChatMessage, CitationList, Markdown, SuggestionChips, ToolCallCard } from "@gntik-ai/chat";
7
8
  import { Archive, ArrowLeft, ArrowRight, BarChart3, Bell, BellOff, BellRing, BookOpen, Braces, Building2, CalendarClock, Check, CheckCheck, CircleCheck, Clock, Code2, Columns3, Copy, Cpu, CreditCard, Database, Download, ExternalLink, FileCode, FileDiff, FileJson, FileQuestion, FileSearch, FileText, Folder, FolderKanban, FolderOpen, GitBranch, Globe, GripVertical, Hand, HardDrive, Home, KeyRound, Keyboard, LayoutGrid, LayoutTemplate, LifeBuoy, ListOrdered, ListTodo, Lock, Mail, MailOpen, MapPin, MessageSquare, MessagesSquare, Minus, Palette, Phone, Play, PlayCircle, Plug, Plus, RefreshCw, Rocket, RotateCcw, RotateCw, Rss, Save, Search, SearchX, Send, Server, ServerCrash, Shield, ShieldCheck, Square, SquarePen, Table2, ThumbsDown, ThumbsUp, Trash2, Upload, User, UserPlus, Users, Wrench, X } from "@gntik-ai/icons";
8
- import { Heatmap, MiniBar, RadarChart, chartFmt } from "@gntik-ai/charts";
9
9
  import { DiffEditor } from "@gntik-ai/editor";
10
10
  import { flushSync } from "react-dom";
11
11
  //#region src/shared/ConsoleShell.tsx
@@ -16,38 +16,42 @@ import { flushSync } from "react-dom";
16
16
  * link and user-menu items.
17
17
  */
18
18
  function ConsoleShell({ children, nav, currentHref, breadcrumbs, workspaces, currentWorkspaceId, onWorkspaceChange, onCreateWorkspace, user, usage, helpHref, helpLabel, userMenuItems, onSignOut, topbar, storageKey, sidebarLabel, collapseMode }) {
19
- return /* @__PURE__ */ jsx(SidebarLayout, {
20
- fullScreen: true,
21
- storageKey,
22
- sidebarLabel,
23
- collapseMode,
24
- sidebarHeader: ({ collapsed }) => /* @__PURE__ */ jsx(AppSidebarHeader, {
25
- collapsed,
26
- workspaces,
27
- currentWorkspaceId,
28
- onWorkspaceChange,
29
- onCreateWorkspace
30
- }),
31
- sidebar: ({ collapsed }) => /* @__PURE__ */ jsx(AppSidebarNav, {
32
- groups: nav,
33
- currentHref,
34
- collapsed
35
- }),
36
- sidebarFooter: ({ collapsed }) => /* @__PURE__ */ jsx(AppSidebarFooter, {
37
- collapsed,
38
- user,
39
- usage,
40
- helpHref,
41
- helpLabel,
42
- userMenuItems,
43
- onSignOut
44
- }),
45
- topbar: /* @__PURE__ */ jsx(AppTopbar, {
46
- breadcrumbs,
47
- user,
48
- ...topbar
49
- }),
50
- children
19
+ const { locale } = useI18n();
20
+ return /* @__PURE__ */ jsx(ChartLocaleProvider, {
21
+ locale,
22
+ children: /* @__PURE__ */ jsx(SidebarLayout, {
23
+ fullScreen: true,
24
+ storageKey,
25
+ sidebarLabel,
26
+ collapseMode,
27
+ sidebarHeader: ({ collapsed }) => /* @__PURE__ */ jsx(AppSidebarHeader, {
28
+ collapsed,
29
+ workspaces,
30
+ currentWorkspaceId,
31
+ onWorkspaceChange,
32
+ onCreateWorkspace
33
+ }),
34
+ sidebar: ({ collapsed }) => /* @__PURE__ */ jsx(AppSidebarNav, {
35
+ groups: nav,
36
+ currentHref,
37
+ collapsed
38
+ }),
39
+ sidebarFooter: ({ collapsed }) => /* @__PURE__ */ jsx(AppSidebarFooter, {
40
+ collapsed,
41
+ user,
42
+ usage,
43
+ helpHref,
44
+ helpLabel,
45
+ userMenuItems,
46
+ onSignOut
47
+ }),
48
+ topbar: /* @__PURE__ */ jsx(AppTopbar, {
49
+ breadcrumbs,
50
+ user,
51
+ ...topbar
52
+ }),
53
+ children
54
+ })
51
55
  });
52
56
  }
53
57
  //#endregion
@@ -1938,15 +1942,24 @@ const flowBuilderBreadcrumbs = [{
1938
1942
  * '@gntik-ai/flow/styles.css' once for the React Flow canvas.
1939
1943
  */
1940
1944
  function FlowBuilderPage(props) {
1941
- const { title = flowBuilderContent.title, status = flowBuilderContent.status, nodes, edges, palette, onRun, consoleEntries, defaultConsoleEntries, onConsoleChange, onConsoleClear, onSave, onPublish, nodeTypes, onConnectEdge, onConnect, isValidConnection, onConnectionRejected, validationIssues, mode, nodeStatus, onNodeSelect, codePanel, breadcrumbs = flowBuilderBreadcrumbs, height = 640, fullScreen = true } = props;
1945
+ const { title = flowBuilderContent.title, status = flowBuilderContent.status, nodes = builderNodes, edges = builderEdges, palette, onRun, consoleEntries, defaultConsoleEntries, onConsoleChange, onConsoleClear, onSave, onPublish, nodeTypes, onConnectEdge, onConnect, isValidConnection, onConnectionRejected, validationIssues, mode, nodeStatus, onNodeSelect, graph, onGraphChange, codePanel, breadcrumbs = flowBuilderBreadcrumbs, height = 640, fullScreen = true } = props;
1942
1946
  const [saving, setSaving] = useState(false);
1943
- const [savedNote, setSavedNote] = useState(flowBuilderContent.lastSaved);
1947
+ const [initialGraph] = useState(() => ({
1948
+ nodes,
1949
+ edges
1950
+ }));
1951
+ const [latestGraph, setLatestGraph] = useState();
1952
+ const [saveState, setSaveState] = useState("initial");
1953
+ const revision = useRef(0);
1954
+ const { t } = useI18n();
1955
+ const savedNote = saveState === "initial" ? flowBuilderContent.lastSaved : t(saveState === "unsaved" ? "actionBar.unsaved" : "actionBar.saved");
1944
1956
  const save = async () => {
1945
1957
  setSaving(true);
1958
+ const savedRevision = revision.current;
1946
1959
  try {
1947
- await onSave?.();
1948
- setSavedNote("All changes saved");
1949
- } finally {
1960
+ await onSave?.(cleanFlowGraph(graph ?? latestGraph ?? initialGraph));
1961
+ if (revision.current === savedRevision) setSaveState("saved");
1962
+ } catch {} finally {
1950
1963
  setSaving(false);
1951
1964
  }
1952
1965
  };
@@ -1994,6 +2007,13 @@ function FlowBuilderPage(props) {
1994
2007
  title,
1995
2008
  nodes,
1996
2009
  edges,
2010
+ graph,
2011
+ onGraphChange: (next, change) => {
2012
+ revision.current += 1;
2013
+ setLatestGraph(next);
2014
+ setSaveState("unsaved");
2015
+ onGraphChange?.(next, change);
2016
+ },
1997
2017
  palette,
1998
2018
  onRun,
1999
2019
  consoleEntries,
@@ -2025,7 +2045,7 @@ const meta$60 = {
2025
2045
  family: "Builders",
2026
2046
  priority: "P3",
2027
2047
  status: "experimental",
2028
- description: "Full-screen workflow editor with optional nodeTypes, onConnectEdge, onConnect, isValidConnection, onConnectionRejected, validationIssues, mode=\"run\", nodeStatus and onNodeSelect passed to FlowBuilder; codePanel passes readOnly, markers, onValidityChange, onMonacoReady and loader to an optional CodePanel (branch, parallel, sequence and worker-backed YAML examples). The app must import '@gntik-ai/flow/styles.css' once for the canvas styles. Optional nodeTypes, onConnectEdge, onConnect, isValidConnection, onConnectionRejected, validationIssues, mode, nodeStatus and onNodeSelect pass to FlowBuilder unchanged (see its branch, parallel and sequence examples). mode=\"run\" hides Save, Publish and the saved notice, and preserves focus and node selection. Optional codePanel renders a companion CodePanel and passes all its extensions: readOnly, markers, onValidityChange, onMonacoReady and loader; run mode forces its readOnly to true. For example, WorkflowBuilderPage mode=\"run\" nodeStatus={{step:\"running\"}} onNodeSelect={openDetails}; codePanel={{files,problems:[],loader:yamlLoader,markers}} uses consumer-owned same-origin YAML workers and inline schemas.",
2048
+ description: "onSave(graph) receives the graph on screen (controlled graph, latest reported edit, or initial starter graph), without selected, dragging or measured node fields. Zero-argument handlers remain valid. Optional graph and onGraphChange pass through to FlowBuilder. Committed edits show actionBar.unsaved, a resolved save shows actionBar.saved, and a rejected save retains unsaved status and releases loading. Edits during a pending save remain unsaved. examples/SaveGraph.tsx shows a controlled graph and onSave={(graph) => localStorage.setItem(\"workflow-builder-example\", JSON.stringify(graph))}; hosts own persistence. Full-screen workflow editor with optional nodeTypes, onConnectEdge, onConnect, isValidConnection, onConnectionRejected, validationIssues, mode=\"run\", nodeStatus and onNodeSelect passed to FlowBuilder; codePanel passes readOnly, markers, onValidityChange, onMonacoReady and loader to an optional CodePanel (branch, parallel, sequence and worker-backed YAML examples). The app must import '@gntik-ai/flow/styles.css' once for the canvas styles. Optional nodeTypes, onConnectEdge, onConnect, isValidConnection, onConnectionRejected, validationIssues, mode, nodeStatus and onNodeSelect pass to FlowBuilder unchanged (see its branch, parallel and sequence examples). mode=\"run\" hides Save, Publish and the saved notice, and preserves focus and node selection. Optional codePanel renders a companion CodePanel and passes all its extensions: readOnly, markers, onValidityChange, onMonacoReady and loader; run mode forces its readOnly to true. For example, WorkflowBuilderPage mode=\"run\" nodeStatus={{step:\"running\"}} onNodeSelect={openDetails}; codePanel={{files,problems:[],loader:yamlLoader,markers}} uses consumer-owned same-origin YAML workers and inline schemas.",
2029
2049
  layout: "CanvasLayout",
2030
2050
  blocks: ["flow-builder", "code-panel"]
2031
2051
  };
@@ -3034,23 +3054,15 @@ const detailDangerActions = [{
3034
3054
  //#endregion
3035
3055
  //#region src/resource-detail/Page.tsx
3036
3056
  const TABS = [
3037
- {
3038
- value: "overview",
3039
- label: "Overview"
3040
- },
3041
- {
3042
- value: "activity",
3043
- label: "Activity"
3044
- },
3045
- {
3046
- value: "settings",
3047
- label: "Settings"
3048
- }
3057
+ "overview",
3058
+ "activity",
3059
+ "settings"
3049
3060
  ];
3050
3061
  /** Resource detail: editable tabs by default, or explicit-only Overview when readOnly is true. */
3051
3062
  function ResourceDetailPage(props) {
3063
+ const { t } = useI18n();
3052
3064
  const readOnly = props.readOnly ?? false;
3053
- const { name = readOnly ? "" : detailResource.name, description = readOnly ? "" : detailResource.description, status = readOnly ? "" : detailResource.status, breadcrumbs = readOnly ? [] : detailBreadcrumbs, meta: metaProp, actions: actionsProp, details: detailsProp, overviewTitle = "Configuration", overviewDescription = readOnly ? "" : "Settings of this resource.", historyTitle = "Status history", events = readOnly ? [] : detailEvents, activity = readOnly ? [] : detailActivity, dangerActions = readOnly ? [] : detailDangerActions, defaultTab = "overview", onTabChange, onEditDetails, onSaveSettings, onDangerAction, shell } = props;
3065
+ const { name = readOnly ? "" : detailResource.name, description = readOnly ? "" : detailResource.description, status = readOnly ? "" : detailResource.status, breadcrumbs = readOnly ? [] : detailBreadcrumbs, meta: metaProp, actions: actionsProp, details: detailsProp, overviewTitle = "Configuration", overviewDescription = readOnly ? "" : "Settings of this resource.", historyTitle = "Status history", events = readOnly ? [] : detailEvents, activity = readOnly ? [] : detailActivity, dangerActions = readOnly ? [] : detailDangerActions, defaultTab = "overview", onTabChange, onEditDetails, onSaveSettings, onDangerAction, shell, labels } = props;
3054
3066
  const meta = metaProp ?? (readOnly ? [] : detailMeta);
3055
3067
  const actions = actionsProp ?? (readOnly ? [] : [{
3056
3068
  label: "View logs",
@@ -3073,7 +3085,10 @@ function ResourceDetailPage(props) {
3073
3085
  description
3074
3086
  });
3075
3087
  const dirty = settings.name !== saved.name || settings.description !== saved.description;
3076
- const tabs = readOnly ? TABS.filter((t) => t.value === "overview") : TABS;
3088
+ const tabs = (readOnly ? TABS.filter((value) => value === "overview") : TABS).map((value) => ({
3089
+ value,
3090
+ label: labels?.[value] ?? t(`resourceDetail.${value}`)
3091
+ }));
3077
3092
  return /* @__PURE__ */ jsx(ConsoleShell, {
3078
3093
  currentHref: "/deployments",
3079
3094
  breadcrumbs,
@@ -3098,7 +3113,7 @@ function ResourceDetailPage(props) {
3098
3113
  },
3099
3114
  children: [
3100
3115
  /* @__PURE__ */ jsx(TabsList, {
3101
- "aria-label": "Resource sections",
3116
+ "aria-label": labels?.sections ?? t("resourceDetail.sections"),
3102
3117
  children: tabs.map((t) => /* @__PURE__ */ jsx(TabsTab, {
3103
3118
  value: t.value,
3104
3119
  children: t.label
@@ -3215,7 +3230,7 @@ const meta$30 = {
3215
3230
  family: "Resources",
3216
3231
  priority: "P1",
3217
3232
  status: "beta",
3218
- description: "Resource detail with editable Overview, Activity and Settings tabs by default; optional readOnly (boolean, default false) uses only explicit header and detail props and one Overview tab, with optional history (readonly StatusEvent[], default undefined): omitted hides the history card, [] shows the named empty state, and events render exactly as supplied without invented actors. Read-only ignores activity, events, dangerActions, defaultTab, onSaveSettings and onDangerAction; explicit actions and onEditDetails are honored. The Resource sections tablist retains Tab, arrow, Home/End and Enter/Space keyboard navigation; history is a named group containing the Status history list or empty-state region. Uses token styling in dark (default), light and high_contrast. Examples: runtime-with-transition maps state and lastTransitionAt to one actor-free event, runtime-without-transition maps null to [], and realtime-configuration and postgres-table-detail omit history. ConsoleShell retains sample frame defaults unless explicit shell props are supplied, as in the examples.",
3233
+ description: "Resource detail with editable Overview, Activity and Settings tabs by default; optional readOnly (boolean, default false) uses only explicit header and detail props and one Overview tab, with optional history (readonly StatusEvent[], default undefined): omitted hides the history card, [] shows the named empty state, and events render exactly as supplied without invented actors. Read-only ignores activity, events, dangerActions, defaultTab, onSaveSettings and onDangerAction; explicit actions and onEditDetails are honored. The Resource sections tablist retains Tab, arrow, Home/End and Enter/Space keyboard navigation; history is a named group containing the Status history list or empty-state region. Uses token styling in dark (default), light and high_contrast. Examples: runtime-with-transition maps state and lastTransitionAt to one actor-free event, runtime-without-transition maps null to [], and realtime-configuration and postgres-table-detail omit history. Optional labels?: Partial<ResourceDetailLabels> overrides overview, activity, settings and sections (all strings). Unset keys use I18nProvider (en/es); no provider keeps English. Only the tabs and tablist are localized by this template; fixtures and other section text are unchanged. readOnly keeps only the localized overview tab. See the Catalog labels live preview. ConsoleShell retains sample frame defaults unless explicit shell props are supplied, as in the examples.",
3219
3234
  layout: "SidebarLayout + Page",
3220
3235
  blocks: [
3221
3236
  "app-sidebar",
@@ -13264,7 +13279,7 @@ const shortcutGroups = [
13264
13279
  {
13265
13280
  id: "palette",
13266
13281
  description: "Open the command palette",
13267
- keys: ["⌘", "K"]
13282
+ keys: ["mod", "K"]
13268
13283
  },
13269
13284
  {
13270
13285
  id: "help",
@@ -13274,13 +13289,13 @@ const shortcutGroups = [
13274
13289
  {
13275
13290
  id: "sidebar",
13276
13291
  description: "Collapse or expand the sidebar",
13277
- keys: ["⌘", "B"]
13292
+ keys: ["mod", "B"]
13278
13293
  },
13279
13294
  {
13280
13295
  id: "theme",
13281
13296
  description: "Switch theme",
13282
13297
  keys: [
13283
- "⌘",
13298
+ "mod",
13284
13299
  "⇧",
13285
13300
  "L"
13286
13301
  ]
@@ -13355,12 +13370,12 @@ const shortcutGroups = [
13355
13370
  {
13356
13371
  id: "save",
13357
13372
  description: "Save changes",
13358
- keys: ["⌘", "S"]
13373
+ keys: ["mod", "S"]
13359
13374
  },
13360
13375
  {
13361
13376
  id: "submit",
13362
13377
  description: "Submit a form or comment",
13363
- keys: ["⌘", "↵"]
13378
+ keys: ["mod", "↵"]
13364
13379
  },
13365
13380
  {
13366
13381
  id: "cancel",
@@ -13370,18 +13385,28 @@ const shortcutGroups = [
13370
13385
  {
13371
13386
  id: "undo",
13372
13387
  description: "Undo",
13373
- keys: ["⌘", "Z"]
13388
+ keys: ["mod", "Z"]
13374
13389
  }
13375
13390
  ]
13376
13391
  }
13377
13392
  ];
13378
- /** Groups with only the shortcuts whose description or keys match the query. */
13379
- function filterShortcuts(groups, query, locale) {
13393
+ /** Groups matching descriptions, titles or keys; mod accepts both Command and Ctrl spellings. */
13394
+ function filterShortcuts(groups, query, locale, os = "undetermined") {
13380
13395
  const q = query.trim().toLowerCase();
13381
13396
  if (!q) return [...groups];
13397
+ const modifier = os === "macos" || os === "ios" ? "⌘" : "Ctrl";
13398
+ const alias = modifier === "⌘" ? "Ctrl" : "⌘";
13399
+ const matchesKeys = (shortcut) => {
13400
+ const keys = [...shortcut.keys, ...shortcut.then ?? []];
13401
+ return [
13402
+ "mod",
13403
+ modifier,
13404
+ alias
13405
+ ].some((mod) => keys.map((key) => key === "mod" ? mod : key).join(" ").toLowerCase() === q);
13406
+ };
13382
13407
  return groups.map((g) => ({
13383
13408
  ...g,
13384
- shortcuts: g.shortcuts.filter((s) => matchText(s.description, query, { locale }) || matchText(g.title, query, { locale }) || [...s.keys, ...s.then ?? []].join(" ").toLowerCase() === q)
13409
+ shortcuts: g.shortcuts.filter((s) => matchText(s.description, query, { locale }) || matchText(g.title, query, { locale }) || matchesKeys(s))
13385
13410
  })).filter((g) => g.shortcuts.length > 0);
13386
13411
  }
13387
13412
  //#endregion
@@ -13389,9 +13414,10 @@ function filterShortcuts(groups, query, locale) {
13389
13414
  /** Searchable shortcut sheet shared by the page and the dialog. */
13390
13415
  function ShortcutSheet({ groups, headingLevel = 2, columns = 2, autoFocus }) {
13391
13416
  const { locale } = useI18n();
13417
+ const os = useOs();
13392
13418
  const [query, setQuery] = useState("");
13393
13419
  const countId = useId();
13394
- const visible = filterShortcuts(groups, query, locale);
13420
+ const visible = filterShortcuts(groups, query, locale, os);
13395
13421
  const total = visible.reduce((n, g) => n + g.shortcuts.length, 0);
13396
13422
  return /* @__PURE__ */ jsxs(Stack, {
13397
13423
  gap: 5,