@adea-ai/ui 0.119.1 → 0.121.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/components/conversation/composer-menu.d.ts +31 -0
- package/dist/components/conversation/composer-menu.d.ts.map +1 -0
- package/dist/components/conversation/composer-menu.js +63 -0
- package/dist/components/conversation/composer-menu.js.map +1 -0
- package/dist/components/conversation/conversation-pane.d.ts +38 -0
- package/dist/components/conversation/conversation-pane.d.ts.map +1 -0
- package/dist/components/conversation/conversation-pane.js +83 -0
- package/dist/components/conversation/conversation-pane.js.map +1 -0
- package/dist/components/conversation/conversation-surface.d.ts +6 -0
- package/dist/components/conversation/conversation-surface.d.ts.map +1 -1
- package/dist/components/conversation/conversation-surface.js +10 -4
- package/dist/components/conversation/conversation-surface.js.map +1 -1
- package/dist/components/conversation/index.d.ts +2 -0
- package/dist/components/conversation/index.d.ts.map +1 -1
- package/dist/components/conversation/index.js +3 -1
- package/dist/components/conversation/message-composer.d.ts +6 -0
- package/dist/components/conversation/message-composer.d.ts.map +1 -1
- package/dist/components/conversation/message-composer.js +10 -1
- package/dist/components/conversation/message-composer.js.map +1 -1
- package/dist/components/ui/button/button.d.ts +1 -1
- package/dist/components/ui/button/button.d.ts.map +1 -1
- package/dist/components/ui/button/button.js +7 -0
- package/dist/components/ui/button/button.js.map +1 -1
- package/dist/components/ui/kbd/index.d.ts +1 -0
- package/dist/components/ui/kbd/index.d.ts.map +1 -1
- package/dist/components/ui/kbd/index.js +2 -1
- package/dist/components/ui/kbd/platform-modifier.d.ts +28 -0
- package/dist/components/ui/kbd/platform-modifier.d.ts.map +1 -0
- package/dist/components/ui/kbd/platform-modifier.js +37 -0
- package/dist/components/ui/kbd/platform-modifier.js.map +1 -0
- package/dist/index.js +4 -1
- package/dist/r/conversation.json +10 -0
- package/dist/r/kbd.json +5 -0
- package/dist/r/registry.json +15 -0
- package/dist/r/src/components/conversation/composer-menu.tsx +67 -0
- package/dist/r/src/components/conversation/conversation-pane.tsx +111 -0
- package/dist/r/src/components/conversation/conversation-surface.tsx +12 -1
- package/dist/r/src/components/conversation/index.ts +7 -0
- package/dist/r/src/components/conversation/message-composer.tsx +8 -0
- package/dist/r/src/components/ui/button/button.tsx +7 -0
- package/dist/r/src/components/ui/kbd/index.ts +5 -0
- package/dist/r/src/components/ui/kbd/platform-modifier.ts +37 -0
- package/package.json +1 -1
- package/registry.json +15 -0
- package/src/components/conversation/composer-menu.tsx +67 -0
- package/src/components/conversation/conversation-pane.tsx +111 -0
- package/src/components/conversation/conversation-surface.tsx +12 -1
- package/src/components/conversation/index.ts +7 -0
- package/src/components/conversation/message-composer.tsx +8 -0
- package/src/components/ui/button/button.tsx +7 -0
- package/src/components/ui/kbd/index.ts +5 -0
- package/src/components/ui/kbd/platform-modifier.ts +37 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.js","names":["Polymorphic","PolymorphicProps","ComponentProps","splitProps","ValidComponent","cva","controlInteractive","controlSize","VariantProps","cn","buttonVariants","variants","variant","default","secondary","destructive","outline","ghost","subtle","success","link","size","xs","sm","md","lg","xl","touchTarget","comfortable","defaultVariants","ButtonVariantProps","ButtonProps","T","class","Button","props","local","rest","_$createComponent","_$mergeProps","as","type","_$createComponent","_$mergeProps"],"sources":["../../../../src/components/ui/button/button.tsx"],"sourcesContent":["import { Polymorphic, type PolymorphicProps } from '@kobalte/core/polymorphic'\nimport { type ComponentProps, splitProps, type ValidComponent } from 'solid-js'\nimport { cva, controlInteractive, controlSize, type VariantProps } from '#lib/variants'\nimport { cn } from '#lib/utils'\n\n/**\n * Button.\n *\n * One appearance ladder shared by every pressable thing in the system: a\n * button, a toolbar control, a dialog action, and a menu row all draw from the\n * same tokens, so a row of them cannot drift apart.\n *\n * The variants answer \"what is this for\", never \"what colour is it\". A caller\n * that wants a red button writes `variant=\"destructive\"`; the red lives here.\n * That is also what lets the design-system linter tell a caller which variant\n * to use instead of only which class was wrong.\n *\n * Polymorphic: pass `as=\"a\"` (or any component) and the button becomes it\n * while keeping the same styling contract. This replaces the React-era\n * `asChild` primitive, which has no Solid equivalent that preserves props.\n */\nexport const buttonVariants = cva(\n `${controlInteractive} inline-flex shrink-0 items-center justify-center rounded-md font-medium whitespace-nowrap select-none [&_svg]:pointer-events-none [&_svg]:shrink-0`,\n {\n variants: {\n variant: {\n /** The one primary action in a view. */\n default: 'bg-primary text-primary-foreground hover:bg-primary-hover',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-surface-hover',\n /** For the action that destroys something. Never the default. */\n destructive:\n 'bg-destructive-action text-destructive-action-foreground hover:bg-destructive-action/90 focus-visible:ring-destructive-subtle',\n /** A bordered button for a surface that already has a fill. */\n outline:\n 'border border-border bg-transparent text-foreground hover:bg-surface-hover hover:border-input',\n /** No chrome until hover. The default for toolbar and row actions. */\n ghost: 'text-foreground hover:bg-surface-hover',\n /** A tinted primary, for a secondary action inside a primary flow. */\n subtle: 'bg-primary-subtle text-primary hover:bg-primary-subtle/80',\n success: 'bg-success text-success-foreground hover:bg-success/90',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n '2xs': `${controlSize['2xs']} [&_svg]:size-3`,\n xs: `${controlSize.xs} [&_svg]:size-3.5`,\n sm: `${controlSize.sm} [&_svg]:size-3.5`,\n md: `${controlSize.md} [&_svg]:size-4`,\n lg: `${controlSize.lg} [&_svg]:size-4`,\n xl: `${controlSize.xl} [&_svg]:size-5`,\n '2xl': `${controlSize['2xl']} [&_svg]:size-6`,\n /* Square, for an icon with no label. The accessible name then has to\n come from `aria-label` or a visually hidden label — an icon-only\n button with neither is the accessibility finding the Storybook lane\n catches on every story. */\n 'icon-2xs': 'size-control-2xs p-0 [&_svg]:size-3',\n 'icon-xs': 'size-control-xs p-0 [&_svg]:size-3.5',\n 'icon-sm': 'size-control-sm p-0 [&_svg]:size-3.5',\n 'icon-md': 'size-control-md p-0 [&_svg]:size-4',\n 'icon-lg': 'size-control-lg p-0 [&_svg]:size-4',\n 'icon-xl': 'size-control-xl p-0 [&_svg]:size-5',\n 'icon-2xl': 'size-control-2xl p-0 [&_svg]:size-6',\n },\n /** Opt in to a stable touch target on devices with any coarse pointer. */\n touchTarget: {\n comfortable: 'touch-target-comfortable',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n }\n)\n\ntype ButtonVariantProps = VariantProps<typeof buttonVariants>\n\nexport type ButtonProps<T extends ValidComponent = 'button'> = PolymorphicProps<\n T,\n ButtonVariantProps & {\n class?: string\n }\n>\n\nexport function Button<T extends ValidComponent = 'button'>(props: ButtonProps<T>) {\n const [local, rest] = splitProps(props as ButtonProps, [\n 'variant',\n 'size',\n 'touchTarget',\n 'class',\n ])\n\n return (\n <Polymorphic\n as=\"button\"\n type=\"button\"\n data-slot=\"button\"\n class={cn(\n buttonVariants({\n variant: local.variant,\n size: local.size,\n touchTarget: local.touchTarget,\n }),\n local.class\n )}\n {...(rest as ComponentProps<'button'>)}\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAqBA,IAAaU,iBAAiBL,IAC5B,GAAGC,mBAAkB,sJACrB;CACEK,UAAU;EACRC,SAAS;;GAEPC,SAAS;GACTC,WAAW;;GAEXC,aACE;;GAEFC,SACE;;GAEFC,OAAO;;
|
|
1
|
+
{"version":3,"file":"button.js","names":["Polymorphic","PolymorphicProps","ComponentProps","splitProps","ValidComponent","cva","controlInteractive","controlSize","VariantProps","cn","buttonVariants","variants","variant","default","secondary","destructive","outline","ghost","toolbar","subtle","success","link","size","xs","sm","md","lg","xl","touchTarget","comfortable","defaultVariants","ButtonVariantProps","ButtonProps","T","class","Button","props","local","rest","_$createComponent","_$mergeProps","as","type","_$createComponent","_$mergeProps"],"sources":["../../../../src/components/ui/button/button.tsx"],"sourcesContent":["import { Polymorphic, type PolymorphicProps } from '@kobalte/core/polymorphic'\nimport { type ComponentProps, splitProps, type ValidComponent } from 'solid-js'\nimport { cva, controlInteractive, controlSize, type VariantProps } from '#lib/variants'\nimport { cn } from '#lib/utils'\n\n/**\n * Button.\n *\n * One appearance ladder shared by every pressable thing in the system: a\n * button, a toolbar control, a dialog action, and a menu row all draw from the\n * same tokens, so a row of them cannot drift apart.\n *\n * The variants answer \"what is this for\", never \"what colour is it\". A caller\n * that wants a red button writes `variant=\"destructive\"`; the red lives here.\n * That is also what lets the design-system linter tell a caller which variant\n * to use instead of only which class was wrong.\n *\n * Polymorphic: pass `as=\"a\"` (or any component) and the button becomes it\n * while keeping the same styling contract. This replaces the React-era\n * `asChild` primitive, which has no Solid equivalent that preserves props.\n */\nexport const buttonVariants = cva(\n `${controlInteractive} inline-flex shrink-0 items-center justify-center rounded-md font-medium whitespace-nowrap select-none [&_svg]:pointer-events-none [&_svg]:shrink-0`,\n {\n variants: {\n variant: {\n /** The one primary action in a view. */\n default: 'bg-primary text-primary-foreground hover:bg-primary-hover',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-surface-hover',\n /** For the action that destroys something. Never the default. */\n destructive:\n 'bg-destructive-action text-destructive-action-foreground hover:bg-destructive-action/90 focus-visible:ring-destructive-subtle',\n /** A bordered button for a surface that already has a fill. */\n outline:\n 'border border-border bg-transparent text-foreground hover:bg-surface-hover hover:border-input',\n /** No chrome until hover. The default for toolbar and row actions. */\n ghost: 'text-foreground hover:bg-surface-hover',\n /**\n * A ghost that opens something: a sheet, menu or popover trigger in a\n * toolbar. While its surface is open it holds the menubar's pressed\n * rung, so the open control never reads identical to its closed\n * neighbours.\n */\n toolbar: 'text-foreground hover:bg-surface-hover data-[expanded]:bg-surface-active',\n /** A tinted primary, for a secondary action inside a primary flow. */\n subtle: 'bg-primary-subtle text-primary hover:bg-primary-subtle/80',\n success: 'bg-success text-success-foreground hover:bg-success/90',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n '2xs': `${controlSize['2xs']} [&_svg]:size-3`,\n xs: `${controlSize.xs} [&_svg]:size-3.5`,\n sm: `${controlSize.sm} [&_svg]:size-3.5`,\n md: `${controlSize.md} [&_svg]:size-4`,\n lg: `${controlSize.lg} [&_svg]:size-4`,\n xl: `${controlSize.xl} [&_svg]:size-5`,\n '2xl': `${controlSize['2xl']} [&_svg]:size-6`,\n /* Square, for an icon with no label. The accessible name then has to\n come from `aria-label` or a visually hidden label — an icon-only\n button with neither is the accessibility finding the Storybook lane\n catches on every story. */\n 'icon-2xs': 'size-control-2xs p-0 [&_svg]:size-3',\n 'icon-xs': 'size-control-xs p-0 [&_svg]:size-3.5',\n 'icon-sm': 'size-control-sm p-0 [&_svg]:size-3.5',\n 'icon-md': 'size-control-md p-0 [&_svg]:size-4',\n 'icon-lg': 'size-control-lg p-0 [&_svg]:size-4',\n 'icon-xl': 'size-control-xl p-0 [&_svg]:size-5',\n 'icon-2xl': 'size-control-2xl p-0 [&_svg]:size-6',\n },\n /** Opt in to a stable touch target on devices with any coarse pointer. */\n touchTarget: {\n comfortable: 'touch-target-comfortable',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n }\n)\n\ntype ButtonVariantProps = VariantProps<typeof buttonVariants>\n\nexport type ButtonProps<T extends ValidComponent = 'button'> = PolymorphicProps<\n T,\n ButtonVariantProps & {\n class?: string\n }\n>\n\nexport function Button<T extends ValidComponent = 'button'>(props: ButtonProps<T>) {\n const [local, rest] = splitProps(props as ButtonProps, [\n 'variant',\n 'size',\n 'touchTarget',\n 'class',\n ])\n\n return (\n <Polymorphic\n as=\"button\"\n type=\"button\"\n data-slot=\"button\"\n class={cn(\n buttonVariants({\n variant: local.variant,\n size: local.size,\n touchTarget: local.touchTarget,\n }),\n local.class\n )}\n {...(rest as ComponentProps<'button'>)}\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAqBA,IAAaU,iBAAiBL,IAC5B,GAAGC,mBAAkB,sJACrB;CACEK,UAAU;EACRC,SAAS;;GAEPC,SAAS;GACTC,WAAW;;GAEXC,aACE;;GAEFC,SACE;;GAEFC,OAAO;;;;;;;GAOPC,SAAS;;GAETC,QAAQ;GACRC,SAAS;GACTC,MAAM;EACR;EACAC,MAAM;GACJ,OAAO,GAAGf,YAAY,OAAM;GAC5BgB,IAAI,GAAGhB,YAAYgB,GAAE;GACrBC,IAAI,GAAGjB,YAAYiB,GAAE;GACrBC,IAAI,GAAGlB,YAAYkB,GAAE;GACrBC,IAAI,GAAGnB,YAAYmB,GAAE;GACrBC,IAAI,GAAGpB,YAAYoB,GAAE;GACrB,OAAO,GAAGpB,YAAY,OAAM;GAK5B,YAAY;GACZ,WAAW;GACX,WAAW;GACX,WAAW;GACX,WAAW;GACX,WAAW;GACX,YAAY;EACd;;EAEAqB,aAAa,EACXC,aAAa,2BACf;CACF;CACAC,iBAAiB;EACflB,SAAS;EACTU,MAAM;CACR;AACF,CACF;AAWA,SAAgBa,OAA4CC,OAAuB;CACjF,MAAM,CAACC,OAAOC,QAAQnC,WAAWiC,OAAsB;EACrD;EACA;EACA;EACA;CAAO,CACR;CAED,OAAAG,gBACGvC,aAAWwC,WAAA;EACVC,IAAE;EACFC,MAAI;EAAA,aAAA;EAAA,KAAA,WAAA;GAAA,OAEGjC,GACLC,eAAe;IACbE,SAASyB,MAAMzB;IACfU,MAAMe,MAAMf;IACZM,aAAaS,MAAMT;GACrB,CAAC,GACDS,MAAMH,KACR;EAAC;CAAA,GACII,IAAgC,CAAA;AAG3C"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { Kbd, KbdChord, KbdGroup, kbdChordKeys, kbdGroupVariants, kbdVariants, type KbdChordProps, type KbdSize, } from './kbd';
|
|
2
|
+
export { platformModifierKey, searchShortcutKeyshortcuts, searchShortcutLabel, } from './platform-modifier';
|
|
2
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/kbd/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,OAAO,GACb,MAAM,OAAO,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/kbd/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,OAAO,GACb,MAAM,OAAO,CAAA;AACd,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,qBAAqB,CAAA"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import { Kbd, KbdChord, KbdGroup, kbdChordKeys, kbdGroupVariants, kbdVariants } from "./kbd.js";
|
|
2
|
-
|
|
2
|
+
import { platformModifierKey, searchShortcutKeyshortcuts, searchShortcutLabel } from "./platform-modifier.js";
|
|
3
|
+
export { Kbd, KbdChord, KbdGroup, kbdChordKeys, kbdGroupVariants, kbdVariants, platformModifierKey, searchShortcutKeyshortcuts, searchShortcutLabel };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which modifier a chord should advertise.
|
|
3
|
+
*
|
|
4
|
+
* Every global chord in the product binds `(metaKey || ctrlKey)`, so the
|
|
5
|
+
* working key is the platform's command modifier wherever the app runs — but
|
|
6
|
+
* Apple platforms draw it as ⌘ and everyone else spells it Ctrl. A chord
|
|
7
|
+
* label drawn from anything else (a hardcoded ⌘, say) advertises a key that
|
|
8
|
+
* does not work as drawn on Windows and Linux.
|
|
9
|
+
*
|
|
10
|
+
* These helpers are the one place that decides the glyph, so every surface
|
|
11
|
+
* that draws or announces a shortcut — rail rows, menus, a pane's search
|
|
12
|
+
* field — draws the same one. They sit next to the `Kbd` caps because the
|
|
13
|
+
* glyph is a property of the drawing, not of the feature that shows it: a
|
|
14
|
+
* spelled-out `Ctrl` needs one cap per word (a `KbdGroup`), while `⌘K` can
|
|
15
|
+
* ride `KbdChord`'s one-cap-per-character split.
|
|
16
|
+
*/
|
|
17
|
+
/** The modifier glyph the running OS renders for Meta: ⌘ on Apple platforms, Ctrl elsewhere. */
|
|
18
|
+
export declare function platformModifierKey(platform?: string): '⌘' | 'Ctrl';
|
|
19
|
+
/** The workspace search chord label as the rail's hover text draws it: the
|
|
20
|
+
* platform modifier plus K (`⌘K`, or `Ctrl+K` where ⌘ does not exist). */
|
|
21
|
+
export declare function searchShortcutLabel(platform?: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* The `aria-keyshortcuts` for the search chord. The binding accepts Meta and
|
|
24
|
+
* Ctrl alike, so the announced shortcuts name both: a hardcoded `Meta+K`
|
|
25
|
+
* would promise a key the row does not keep on non-Apple platforms.
|
|
26
|
+
*/
|
|
27
|
+
export declare const searchShortcutKeyshortcuts = "Meta+K Control+K";
|
|
28
|
+
//# sourceMappingURL=platform-modifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-modifier.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/kbd/platform-modifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,gGAAgG;AAChG,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,MAAM,CAKnE;AAED;2EAC2E;AAC3E,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
//#region src/components/ui/kbd/platform-modifier.ts
|
|
2
|
+
/**
|
|
3
|
+
* Which modifier a chord should advertise.
|
|
4
|
+
*
|
|
5
|
+
* Every global chord in the product binds `(metaKey || ctrlKey)`, so the
|
|
6
|
+
* working key is the platform's command modifier wherever the app runs — but
|
|
7
|
+
* Apple platforms draw it as ⌘ and everyone else spells it Ctrl. A chord
|
|
8
|
+
* label drawn from anything else (a hardcoded ⌘, say) advertises a key that
|
|
9
|
+
* does not work as drawn on Windows and Linux.
|
|
10
|
+
*
|
|
11
|
+
* These helpers are the one place that decides the glyph, so every surface
|
|
12
|
+
* that draws or announces a shortcut — rail rows, menus, a pane's search
|
|
13
|
+
* field — draws the same one. They sit next to the `Kbd` caps because the
|
|
14
|
+
* glyph is a property of the drawing, not of the feature that shows it: a
|
|
15
|
+
* spelled-out `Ctrl` needs one cap per word (a `KbdGroup`), while `⌘K` can
|
|
16
|
+
* ride `KbdChord`'s one-cap-per-character split.
|
|
17
|
+
*/
|
|
18
|
+
/** The modifier glyph the running OS renders for Meta: ⌘ on Apple platforms, Ctrl elsewhere. */
|
|
19
|
+
function platformModifierKey(platform) {
|
|
20
|
+
const browserPlatform = platform ?? (typeof navigator === "undefined" ? "" : navigator.platform);
|
|
21
|
+
return /Mac|iPhone|iPad|iPod/i.test(browserPlatform) ? "⌘" : "Ctrl";
|
|
22
|
+
}
|
|
23
|
+
/** The workspace search chord label as the rail's hover text draws it: the
|
|
24
|
+
* platform modifier plus K (`⌘K`, or `Ctrl+K` where ⌘ does not exist). */
|
|
25
|
+
function searchShortcutLabel(platform) {
|
|
26
|
+
return platformModifierKey(platform) === "⌘" ? "⌘K" : "Ctrl+K";
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The `aria-keyshortcuts` for the search chord. The binding accepts Meta and
|
|
30
|
+
* Ctrl alike, so the announced shortcuts name both: a hardcoded `Meta+K`
|
|
31
|
+
* would promise a key the row does not keep on non-Apple platforms.
|
|
32
|
+
*/
|
|
33
|
+
var searchShortcutKeyshortcuts = "Meta+K Control+K";
|
|
34
|
+
//#endregion
|
|
35
|
+
export { platformModifierKey, searchShortcutKeyshortcuts, searchShortcutLabel };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=platform-modifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-modifier.js","names":[],"sources":["../../../../src/components/ui/kbd/platform-modifier.ts"],"sourcesContent":["/**\n * Which modifier a chord should advertise.\n *\n * Every global chord in the product binds `(metaKey || ctrlKey)`, so the\n * working key is the platform's command modifier wherever the app runs — but\n * Apple platforms draw it as ⌘ and everyone else spells it Ctrl. A chord\n * label drawn from anything else (a hardcoded ⌘, say) advertises a key that\n * does not work as drawn on Windows and Linux.\n *\n * These helpers are the one place that decides the glyph, so every surface\n * that draws or announces a shortcut — rail rows, menus, a pane's search\n * field — draws the same one. They sit next to the `Kbd` caps because the\n * glyph is a property of the drawing, not of the feature that shows it: a\n * spelled-out `Ctrl` needs one cap per word (a `KbdGroup`), while `⌘K` can\n * ride `KbdChord`'s one-cap-per-character split.\n */\n\n/** The modifier glyph the running OS renders for Meta: ⌘ on Apple platforms, Ctrl elsewhere. */\nexport function platformModifierKey(platform?: string): '⌘' | 'Ctrl' {\n // The guard keeps server renders honest: no navigator means no Apple\n // platform string, so they fall back to the spelled-out modifier.\n const browserPlatform = platform ?? (typeof navigator === 'undefined' ? '' : navigator.platform)\n return /Mac|iPhone|iPad|iPod/i.test(browserPlatform) ? '⌘' : 'Ctrl'\n}\n\n/** The workspace search chord label as the rail's hover text draws it: the\n * platform modifier plus K (`⌘K`, or `Ctrl+K` where ⌘ does not exist). */\nexport function searchShortcutLabel(platform?: string): string {\n return platformModifierKey(platform) === '⌘' ? '⌘K' : 'Ctrl+K'\n}\n\n/**\n * The `aria-keyshortcuts` for the search chord. The binding accepts Meta and\n * Ctrl alike, so the announced shortcuts name both: a hardcoded `Meta+K`\n * would promise a key the row does not keep on non-Apple platforms.\n */\nexport const searchShortcutKeyshortcuts = 'Meta+K Control+K'\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,SAAgB,oBAAoB,UAAiC;CAGnE,MAAM,kBAAkB,aAAa,OAAO,cAAc,cAAc,KAAK,UAAU;CACvF,OAAO,wBAAwB,KAAK,eAAe,IAAI,MAAM;AAC/D;;;AAIA,SAAgB,oBAAoB,UAA2B;CAC7D,OAAO,oBAAoB,QAAQ,MAAM,MAAM,OAAO;AACxD;;;;;;AAOA,IAAa,6BAA6B"}
|
package/dist/index.js
CHANGED
|
@@ -44,6 +44,7 @@ import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGr
|
|
|
44
44
|
import { SecretInputGroup } from "./components/ui/input-group/secret-input-group.js";
|
|
45
45
|
import { InputOtp, InputOtpCaret } from "./components/ui/input-otp/input-otp.js";
|
|
46
46
|
import { Kbd, KbdChord, KbdGroup, kbdChordKeys, kbdGroupVariants, kbdVariants } from "./components/ui/kbd/kbd.js";
|
|
47
|
+
import { platformModifierKey, searchShortcutKeyshortcuts, searchShortcutLabel } from "./components/ui/kbd/platform-modifier.js";
|
|
47
48
|
import { Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger } from "./components/ui/menubar/menubar.js";
|
|
48
49
|
import { ModalDialog } from "./components/ui/modal-dialog/modal-dialog.js";
|
|
49
50
|
import { NavigationMenu, NavigationMenuContent, NavigationMenuGroup, NavigationMenuGroupLabel, NavigationMenuItem, NavigationMenuMenu, NavigationMenuSeparator, NavigationMenuTrigger, NavigationMenuViewport } from "./components/ui/navigation-menu/navigation-menu.js";
|
|
@@ -93,6 +94,8 @@ import { BusySendButton } from "./components/conversation/busy-send-button.js";
|
|
|
93
94
|
import { ChatComposer } from "./components/conversation/chat-composer.js";
|
|
94
95
|
import { ConversationAvatar } from "./components/conversation/conversation-avatar.js";
|
|
95
96
|
import { ConversationSurface } from "./components/conversation/conversation-surface.js";
|
|
97
|
+
import { ConversationPane } from "./components/conversation/conversation-pane.js";
|
|
98
|
+
import { ComposerMenu, ComposerMenuItem } from "./components/conversation/composer-menu.js";
|
|
96
99
|
import { ComposerAttachmentButton, ComposerHint, MessageComposer } from "./components/conversation/message-composer.js";
|
|
97
100
|
import { MessageBody, MessageDayDivider, MessageGroup, MessageRow } from "./components/conversation/message-row.js";
|
|
98
101
|
import { TranscriptComposition, transcriptDisclosureKey } from "./components/conversation/transcript-composition.js";
|
|
@@ -130,4 +133,4 @@ import { AboutDialog } from "./components/composites/about-dialog/about-dialog.j
|
|
|
130
133
|
import { HelpCenter } from "./components/composites/help-center/help-center.js";
|
|
131
134
|
import { WorkspaceMark } from "./components/composites/workspace-mark/workspace-mark.js";
|
|
132
135
|
import { writeClipboardText } from "./lib/clipboard.js";
|
|
133
|
-
export { APPEARANCE_EDITOR_FONT_AXES, APPEARANCE_EDITOR_FONT_SIZE_MAX, APPEARANCE_EDITOR_FONT_SIZE_MIN, AboutDialog, Accordion, AccordionContent, AccordionItem, AccordionTrigger, AccountMenu, ActionButton, Alert, AlertAction, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AnnotationSurface, AppShell, AppShellBody, AppShellContent, AppShellMain, AppearanceEditor, AppearanceEditorActions, AppearanceFontSettingsGroup, AppearancePanel, AppearancePopover, AspectRatio, AttachmentCard, Avatar, AvatarFallback, AvatarImage, Badge, Board, BoardCardBody, BoardCardTitle, BoardCardTrigger, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BusySendButton, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, CalendarSurface, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CatalogBrowser, CatalogDetail, CatalogDetailSection, ChatComposer, Checkbox, CheckboxDescription, CheckboxLabel, CodeBlock, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxClear, ComboboxContent, ComboboxControl, ComboboxInput, ComboboxItem, ComboboxSection, ComboboxTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandLoading, CommandSeparator, CommandShortcut, ComposerAttachmentButton, ComposerHint, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, ContextualSidebar, ConversationAvatar, ConversationSurface, DEFAULT_APPEARANCE_EDITOR_FONT_SETTINGS, DatePicker, DetailPanel, DetailPanelBody, DetailPanelField, DetailPanelHeader, DetailPanelSection, Dialog, DialogClose, DialogCloseButton, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DiffBlock, DiffSummary, Drawer, DrawerBody, DrawerCloseButton, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyState, EmptyTitle, EntityIcon, FLOATING_PREVIEW_CORNER_RADIUS, FLOATING_PREVIEW_EDGE_GAP, Field, FieldDescription, FieldError, FieldGroup, FieldInput, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTextArea, FloatingPreview, FormField, Heading, HelpCenter, HoverCard, HoverCardContent, HoverCardTrigger, InlineCode, Input, InputControl, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputOtp, InputOtpCaret, Item, ItemDescription, ItemEmpty, ItemGroup, ItemGroupEntry, ItemTitle, Kbd, KbdChord, KbdGroup, Label, ListGroup, ListRow, ListRowControl, MAX_LAYOUT_DEPTH, MAX_LAYOUT_LEAVES, MAX_SPLIT_RATIO, MIN_SPLIT_RATIO, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, MessageBody, MessageComposer, MessageDayDivider, MessageGroup, MessageRow, ModalDialog, Motion, NO_FLOATING_PREVIEW_OBSTACLES, NO_PREVIEW_MINI_PLAYER_OBSTACLES, NativeSelect, NavigationMenu, NavigationMenuContent, NavigationMenuGroup, NavigationMenuGroupLabel, NavigationMenuItem, NavigationMenuMenu, NavigationMenuSeparator, NavigationMenuTrigger, NavigationMenuViewport, NumberField, OrbitItem, OrbitLayout, PASTE_THRESHOLD_CHARS, PASTE_THRESHOLD_LINES, PASTE_TOKEN_REGEX, PREVIEW_MINI_PLAYER_CORNER_RADIUS, PREVIEW_MINI_PLAYER_EDGE_GAP, Page, PageHeader, PageHeaderActions, PageHeaderContent, PageHeaderDescription, PageHeaderTitle, PageSection, Pagination, PaginationEllipsis, PaginationItem, PaginationNext, PaginationPrevious, PalettePreview, Panel, PanelActions, PanelBody, PanelCard, PanelDescription, PanelFooter, PanelHeader, PanelPlaceholder, PanelTitle, PanelToolbar, PixelResizeHandle, Popover, PopoverAnchor, PopoverCloseButton, PopoverContent, PopoverDescription, PopoverTitle, PopoverTrigger, Presence, Progress, PropertyList, PropertyRow, PropertyTerm, PropertyValue, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, SceneControls, ScrollArea, SecretInputGroup, Select, SelectChevronsUpDown, SelectContent, SelectItem, SelectLabel, SelectSection, SelectTrigger, SelectValue, Separator, SettingsField, SettingsLayout, SettingsNavigation, SettingsPage, SettingsRow, SettingsSection, Sheet, SheetBody, SheetCloseButton, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, SideRail, SideRailButton, SideRailContent, SideRailFooter, SideRailHeader, SideRailItem, SideRailSection, SidebarNav, SidebarNavButton, SidebarNavContent, SidebarNavFooter, SidebarNavHeader, SidebarNavItem, SidebarNavLabel, SidebarNavResizeHandle, SidebarNavRow, SidebarNavSection, SidebarNavTitle, Skeleton, SkipLink, Slider, Spinner, SplitLayout, Stat, StatGroup, StatusBar, StatusBarItem, StatusBarSpacer, StatusChip, StatusList, Switch, SwitchDescription, SwitchLabel, TALL_CODE_BLOCK_PX, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableNumericCell, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Text, TextLink, Textarea, ThemeMiniature, ThemeMiniatureSplit, ThemeModeToggle, ThemePicker, ThemePreview, ThemeProvider, ThemeSwatch, ThemeToggle, ThreadPanel, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TopBar, TopBarBreadcrumb, TopBarPill, TopBarSearch, TopBarSection, TopBarTitle, TranscriptComposition, Tree, TreeRow, TreeRowActions, UpdateChannelControl, UpdateDialog, ValueCombobox, VirtualWindow, WorkspaceMark, accentPresets, alertVariants, allTokens, appearancePreviewThemes, applyAppearanceFontSettings, badgeVariants, boardCardTitleVariants, builtinThemes, buttonVariants, cardVariants, clampFloatingPreviewPosition, clampPreviewMiniPlayerPosition, closePane, cn, colorTokens, computeLayoutFrames, contrastRatio, controlInteractive, controlSize, controlSizeIcon, controlSizes, countLeaves, countLines, createAppMenuItems, createLayoutState, cva, defaultDarkThemeId, defaultLightThemeId, defaultThemeSelection, densityTokens, designTokens, diffLineVariants, diffStats, diffTargetPath, elevationTokens, entityIconVariants, expandAll, findTokenRanges, focusPane, fontOptions, fontSettingsBootstrapScript, formatBytes, formatReleaseDate, formatToken, headingElement, headingVariants, initialsFrom, inlineScriptLiteral, isPasteBlock, isThemeAccentId, itemVariants, kbdChordKeys, kbdGroupVariants, kbdVariants, keyedRows, layoutDepth, listLeaves, monogram, motionTokens, movePane, neighborLeaf, nextSeq, normalizeAppearanceEditorFontSettings, normalizeAppearanceEditorFontSize, normalizeLayout, parseDiff, plainTextFromMarkdown, pruneBlocks, radiusTokens, recollapsePastes, remapCarriedBlocks, resizeFloatingPreview, resizePreviewMiniPlayer, resizeSplit, resolveAccentPreset, resolveFloatingPreviewFrame, resolvePreviewMiniPlayerFrame, resolvedDensity, sheetVariants, shouldCollapse, sidebarNavItemClass, sidebarNavItemStateClass, splitPane, splitPaneBalanced, statusDotVariants, stripTrailingBlankLines, surfaceInteractive, swapPanes, textElement, textVariants, textareaVariants, themeAccentsFor, themeById, themeCssVariables, themeFamilies, themeRecordById, themeRecords, themeScript, themesForAppearance, toast, toaster, toggleVariants, tokenRangeAt, transcriptDisclosureKey, typographyTokens, undoClosePane, undocumentedTokenAliases, useSideRail, useTheme, validateTheme, validateThemeRegistry, withAccent, writeClipboardText, zIndexTokens };
|
|
136
|
+
export { APPEARANCE_EDITOR_FONT_AXES, APPEARANCE_EDITOR_FONT_SIZE_MAX, APPEARANCE_EDITOR_FONT_SIZE_MIN, AboutDialog, Accordion, AccordionContent, AccordionItem, AccordionTrigger, AccountMenu, ActionButton, Alert, AlertAction, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AnnotationSurface, AppShell, AppShellBody, AppShellContent, AppShellMain, AppearanceEditor, AppearanceEditorActions, AppearanceFontSettingsGroup, AppearancePanel, AppearancePopover, AspectRatio, AttachmentCard, Avatar, AvatarFallback, AvatarImage, Badge, Board, BoardCardBody, BoardCardTitle, BoardCardTrigger, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BusySendButton, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, CalendarSurface, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CatalogBrowser, CatalogDetail, CatalogDetailSection, ChatComposer, Checkbox, CheckboxDescription, CheckboxLabel, CodeBlock, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxClear, ComboboxContent, ComboboxControl, ComboboxInput, ComboboxItem, ComboboxSection, ComboboxTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandLoading, CommandSeparator, CommandShortcut, ComposerAttachmentButton, ComposerHint, ComposerMenu, ComposerMenuItem, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, ContextualSidebar, ConversationAvatar, ConversationPane, ConversationSurface, DEFAULT_APPEARANCE_EDITOR_FONT_SETTINGS, DatePicker, DetailPanel, DetailPanelBody, DetailPanelField, DetailPanelHeader, DetailPanelSection, Dialog, DialogClose, DialogCloseButton, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DiffBlock, DiffSummary, Drawer, DrawerBody, DrawerCloseButton, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyState, EmptyTitle, EntityIcon, FLOATING_PREVIEW_CORNER_RADIUS, FLOATING_PREVIEW_EDGE_GAP, Field, FieldDescription, FieldError, FieldGroup, FieldInput, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTextArea, FloatingPreview, FormField, Heading, HelpCenter, HoverCard, HoverCardContent, HoverCardTrigger, InlineCode, Input, InputControl, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputOtp, InputOtpCaret, Item, ItemDescription, ItemEmpty, ItemGroup, ItemGroupEntry, ItemTitle, Kbd, KbdChord, KbdGroup, Label, ListGroup, ListRow, ListRowControl, MAX_LAYOUT_DEPTH, MAX_LAYOUT_LEAVES, MAX_SPLIT_RATIO, MIN_SPLIT_RATIO, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, MessageBody, MessageComposer, MessageDayDivider, MessageGroup, MessageRow, ModalDialog, Motion, NO_FLOATING_PREVIEW_OBSTACLES, NO_PREVIEW_MINI_PLAYER_OBSTACLES, NativeSelect, NavigationMenu, NavigationMenuContent, NavigationMenuGroup, NavigationMenuGroupLabel, NavigationMenuItem, NavigationMenuMenu, NavigationMenuSeparator, NavigationMenuTrigger, NavigationMenuViewport, NumberField, OrbitItem, OrbitLayout, PASTE_THRESHOLD_CHARS, PASTE_THRESHOLD_LINES, PASTE_TOKEN_REGEX, PREVIEW_MINI_PLAYER_CORNER_RADIUS, PREVIEW_MINI_PLAYER_EDGE_GAP, Page, PageHeader, PageHeaderActions, PageHeaderContent, PageHeaderDescription, PageHeaderTitle, PageSection, Pagination, PaginationEllipsis, PaginationItem, PaginationNext, PaginationPrevious, PalettePreview, Panel, PanelActions, PanelBody, PanelCard, PanelDescription, PanelFooter, PanelHeader, PanelPlaceholder, PanelTitle, PanelToolbar, PixelResizeHandle, Popover, PopoverAnchor, PopoverCloseButton, PopoverContent, PopoverDescription, PopoverTitle, PopoverTrigger, Presence, Progress, PropertyList, PropertyRow, PropertyTerm, PropertyValue, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, SceneControls, ScrollArea, SecretInputGroup, Select, SelectChevronsUpDown, SelectContent, SelectItem, SelectLabel, SelectSection, SelectTrigger, SelectValue, Separator, SettingsField, SettingsLayout, SettingsNavigation, SettingsPage, SettingsRow, SettingsSection, Sheet, SheetBody, SheetCloseButton, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, SideRail, SideRailButton, SideRailContent, SideRailFooter, SideRailHeader, SideRailItem, SideRailSection, SidebarNav, SidebarNavButton, SidebarNavContent, SidebarNavFooter, SidebarNavHeader, SidebarNavItem, SidebarNavLabel, SidebarNavResizeHandle, SidebarNavRow, SidebarNavSection, SidebarNavTitle, Skeleton, SkipLink, Slider, Spinner, SplitLayout, Stat, StatGroup, StatusBar, StatusBarItem, StatusBarSpacer, StatusChip, StatusList, Switch, SwitchDescription, SwitchLabel, TALL_CODE_BLOCK_PX, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableNumericCell, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Text, TextLink, Textarea, ThemeMiniature, ThemeMiniatureSplit, ThemeModeToggle, ThemePicker, ThemePreview, ThemeProvider, ThemeSwatch, ThemeToggle, ThreadPanel, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TopBar, TopBarBreadcrumb, TopBarPill, TopBarSearch, TopBarSection, TopBarTitle, TranscriptComposition, Tree, TreeRow, TreeRowActions, UpdateChannelControl, UpdateDialog, ValueCombobox, VirtualWindow, WorkspaceMark, accentPresets, alertVariants, allTokens, appearancePreviewThemes, applyAppearanceFontSettings, badgeVariants, boardCardTitleVariants, builtinThemes, buttonVariants, cardVariants, clampFloatingPreviewPosition, clampPreviewMiniPlayerPosition, closePane, cn, colorTokens, computeLayoutFrames, contrastRatio, controlInteractive, controlSize, controlSizeIcon, controlSizes, countLeaves, countLines, createAppMenuItems, createLayoutState, cva, defaultDarkThemeId, defaultLightThemeId, defaultThemeSelection, densityTokens, designTokens, diffLineVariants, diffStats, diffTargetPath, elevationTokens, entityIconVariants, expandAll, findTokenRanges, focusPane, fontOptions, fontSettingsBootstrapScript, formatBytes, formatReleaseDate, formatToken, headingElement, headingVariants, initialsFrom, inlineScriptLiteral, isPasteBlock, isThemeAccentId, itemVariants, kbdChordKeys, kbdGroupVariants, kbdVariants, keyedRows, layoutDepth, listLeaves, monogram, motionTokens, movePane, neighborLeaf, nextSeq, normalizeAppearanceEditorFontSettings, normalizeAppearanceEditorFontSize, normalizeLayout, parseDiff, plainTextFromMarkdown, platformModifierKey, pruneBlocks, radiusTokens, recollapsePastes, remapCarriedBlocks, resizeFloatingPreview, resizePreviewMiniPlayer, resizeSplit, resolveAccentPreset, resolveFloatingPreviewFrame, resolvePreviewMiniPlayerFrame, resolvedDensity, searchShortcutKeyshortcuts, searchShortcutLabel, sheetVariants, shouldCollapse, sidebarNavItemClass, sidebarNavItemStateClass, splitPane, splitPaneBalanced, statusDotVariants, stripTrailingBlankLines, surfaceInteractive, swapPanes, textElement, textVariants, textareaVariants, themeAccentsFor, themeById, themeCssVariables, themeFamilies, themeRecordById, themeRecords, themeScript, themesForAppearance, toast, toaster, toggleVariants, tokenRangeAt, transcriptDisclosureKey, typographyTokens, undoClosePane, undocumentedTokenAliases, useSideRail, useTheme, validateTheme, validateThemeRegistry, withAccent, writeClipboardText, zIndexTokens };
|
package/dist/r/conversation.json
CHANGED
|
@@ -40,11 +40,21 @@
|
|
|
40
40
|
"type": "registry:ui",
|
|
41
41
|
"target": "components/conversation/chat-composer.tsx"
|
|
42
42
|
},
|
|
43
|
+
{
|
|
44
|
+
"path": "src/components/conversation/composer-menu.tsx",
|
|
45
|
+
"type": "registry:ui",
|
|
46
|
+
"target": "components/conversation/composer-menu.tsx"
|
|
47
|
+
},
|
|
43
48
|
{
|
|
44
49
|
"path": "src/components/conversation/conversation-avatar.tsx",
|
|
45
50
|
"type": "registry:ui",
|
|
46
51
|
"target": "components/conversation/conversation-avatar.tsx"
|
|
47
52
|
},
|
|
53
|
+
{
|
|
54
|
+
"path": "src/components/conversation/conversation-pane.tsx",
|
|
55
|
+
"type": "registry:ui",
|
|
56
|
+
"target": "components/conversation/conversation-pane.tsx"
|
|
57
|
+
},
|
|
48
58
|
{
|
|
49
59
|
"path": "src/components/conversation/conversation-surface.tsx",
|
|
50
60
|
"type": "registry:ui",
|
package/dist/r/kbd.json
CHANGED
|
@@ -17,6 +17,11 @@
|
|
|
17
17
|
"path": "src/components/ui/kbd/kbd.tsx",
|
|
18
18
|
"type": "registry:ui",
|
|
19
19
|
"target": "components/ui/kbd/kbd.tsx"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"path": "src/components/ui/kbd/platform-modifier.ts",
|
|
23
|
+
"type": "registry:ui",
|
|
24
|
+
"target": "components/ui/kbd/platform-modifier.ts"
|
|
20
25
|
}
|
|
21
26
|
]
|
|
22
27
|
}
|
package/dist/r/registry.json
CHANGED
|
@@ -885,6 +885,11 @@
|
|
|
885
885
|
"path": "src/components/ui/kbd/kbd.tsx",
|
|
886
886
|
"type": "registry:ui",
|
|
887
887
|
"target": "components/ui/kbd/kbd.tsx"
|
|
888
|
+
},
|
|
889
|
+
{
|
|
890
|
+
"path": "src/components/ui/kbd/platform-modifier.ts",
|
|
891
|
+
"type": "registry:ui",
|
|
892
|
+
"target": "components/ui/kbd/platform-modifier.ts"
|
|
888
893
|
}
|
|
889
894
|
]
|
|
890
895
|
},
|
|
@@ -2374,11 +2379,21 @@
|
|
|
2374
2379
|
"type": "registry:ui",
|
|
2375
2380
|
"target": "components/conversation/chat-composer.tsx"
|
|
2376
2381
|
},
|
|
2382
|
+
{
|
|
2383
|
+
"path": "src/components/conversation/composer-menu.tsx",
|
|
2384
|
+
"type": "registry:ui",
|
|
2385
|
+
"target": "components/conversation/composer-menu.tsx"
|
|
2386
|
+
},
|
|
2377
2387
|
{
|
|
2378
2388
|
"path": "src/components/conversation/conversation-avatar.tsx",
|
|
2379
2389
|
"type": "registry:ui",
|
|
2380
2390
|
"target": "components/conversation/conversation-avatar.tsx"
|
|
2381
2391
|
},
|
|
2392
|
+
{
|
|
2393
|
+
"path": "src/components/conversation/conversation-pane.tsx",
|
|
2394
|
+
"type": "registry:ui",
|
|
2395
|
+
"target": "components/conversation/conversation-pane.tsx"
|
|
2396
|
+
},
|
|
2382
2397
|
{
|
|
2383
2398
|
"path": "src/components/conversation/conversation-surface.tsx",
|
|
2384
2399
|
"type": "registry:ui",
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { ComponentProps } from 'solid-js'
|
|
2
|
+
import { splitProps } from 'solid-js'
|
|
3
|
+
import { cn } from '../../lib/utils'
|
|
4
|
+
import { overlaySurface } from '../../lib/overlay'
|
|
5
|
+
import { Button } from '../ui/button/button'
|
|
6
|
+
|
|
7
|
+
export type ComposerMenuProps = ComponentProps<'div'> & {
|
|
8
|
+
/** A name for what the menu offers, e.g. "Mention an Agent". */
|
|
9
|
+
label?: string
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* ComposerMenu.
|
|
14
|
+
*
|
|
15
|
+
* The panel a composer raises above the field: mention suggestions while the
|
|
16
|
+
* reader types a name, the picker of what can be attached, follow-up prompts.
|
|
17
|
+
* It is deliberately *not* a `Menu`: there is no trigger and no focus trap —
|
|
18
|
+
* the reader keeps typing while it is open, and it opens and closes on the
|
|
19
|
+
* draft's own grammar rather than on a button press.
|
|
20
|
+
*
|
|
21
|
+
* Rows are `ComposerMenuItem`s; anything else a caller renders (a checkbox
|
|
22
|
+
* list, a heading) sits inside the same panel. Placement stays with the host —
|
|
23
|
+
* a suggestion menu renders in the composer's `menu` slot, a picker anchors to
|
|
24
|
+
* its own control.
|
|
25
|
+
*/
|
|
26
|
+
export function ComposerMenu(props: ComposerMenuProps) {
|
|
27
|
+
const [local, rest] = splitProps(props, ['class', 'label', 'children'])
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<div
|
|
31
|
+
role="group"
|
|
32
|
+
aria-label={local.label}
|
|
33
|
+
data-slot="composer-menu"
|
|
34
|
+
class={cn(
|
|
35
|
+
overlaySurface,
|
|
36
|
+
'flex max-h-56 min-w-60 flex-col gap-0.5 overflow-y-auto p-1',
|
|
37
|
+
local.class
|
|
38
|
+
)}
|
|
39
|
+
{...rest}
|
|
40
|
+
>
|
|
41
|
+
{local.children}
|
|
42
|
+
</div>
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export type ComposerMenuItemProps = ComponentProps<typeof Button>
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* ComposerMenuItem.
|
|
50
|
+
*
|
|
51
|
+
* One row of a `ComposerMenu`. A ghost button stretched across the panel —
|
|
52
|
+
* the same row every menu in the library draws, so a suggestion never reads as
|
|
53
|
+
* a stray button floating over the draft.
|
|
54
|
+
*/
|
|
55
|
+
export function ComposerMenuItem(props: ComposerMenuItemProps) {
|
|
56
|
+
const [local, rest] = splitProps(props, ['class', 'children'])
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
<Button
|
|
60
|
+
variant="ghost"
|
|
61
|
+
class={cn('w-full justify-start gap-2 text-start font-normal', local.class)}
|
|
62
|
+
{...rest}
|
|
63
|
+
>
|
|
64
|
+
{local.children}
|
|
65
|
+
</Button>
|
|
66
|
+
)
|
|
67
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { ComponentProps, JSX } from 'solid-js'
|
|
2
|
+
import { Show, splitProps } from 'solid-js'
|
|
3
|
+
import { cn } from '../../lib/utils'
|
|
4
|
+
|
|
5
|
+
export type ConversationPaneProps = ComponentProps<'section'> & {
|
|
6
|
+
/** Above the transcript: the conversation's identity and its actions. */
|
|
7
|
+
header?: JSX.Element
|
|
8
|
+
/** The transcript — typically a `ConversationSurface` with `gutter`. */
|
|
9
|
+
children: JSX.Element
|
|
10
|
+
/** Below the transcript: the composer. */
|
|
11
|
+
composer?: JSX.Element
|
|
12
|
+
/**
|
|
13
|
+
* The thread side panel. Its presence opens the second column; at narrow
|
|
14
|
+
* widths the panel overlays the conversation instead of squeezing it, and
|
|
15
|
+
* the conversation chrome steps aside — out of the accessibility tree with
|
|
16
|
+
* it, which is why the overlay hides with `visibility` rather than paint.
|
|
17
|
+
*/
|
|
18
|
+
thread?: JSX.Element
|
|
19
|
+
/**
|
|
20
|
+
* Apply the shared page gutters to the composer, tracking the transcript's
|
|
21
|
+
* own gutter (`ConversationSurface`'s `gutter`) so the two read as one pane.
|
|
22
|
+
*/
|
|
23
|
+
gutter?: boolean
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* ConversationPane.
|
|
28
|
+
*
|
|
29
|
+
* The frame a conversation lives in: a header above, the transcript, a composer
|
|
30
|
+
* below, and — while a thread is open — the thread panel beside all of it.
|
|
31
|
+
*
|
|
32
|
+
* The layout earns its place in the library because the thread is where
|
|
33
|
+
* applications get it wrong. Two impulses both fail: shrinking the transcript
|
|
34
|
+
* to make room turns a busy thread into a one-word-per-line stripe, and
|
|
35
|
+
* *hiding* the transcript with `display: none` unmounts it, losing scroll
|
|
36
|
+
* position and DOM. So the desktop layout gives the thread a fixed column and
|
|
37
|
+
* leaves the transcript fluid; below the collapse width the panel overlays the
|
|
38
|
+
* conversation in full and the conversation steps aside invisibly — still
|
|
39
|
+
* mounted, still in the DOM, gone from the accessibility tree.
|
|
40
|
+
*/
|
|
41
|
+
export function ConversationPane(props: ConversationPaneProps) {
|
|
42
|
+
const [local, rest] = splitProps(props, [
|
|
43
|
+
'class',
|
|
44
|
+
'header',
|
|
45
|
+
'composer',
|
|
46
|
+
'thread',
|
|
47
|
+
'gutter',
|
|
48
|
+
'children',
|
|
49
|
+
])
|
|
50
|
+
const threadOpen = () => local.thread !== undefined
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<section
|
|
54
|
+
data-slot="conversation-pane"
|
|
55
|
+
data-conversation-thread-open={threadOpen() || undefined}
|
|
56
|
+
class={cn(
|
|
57
|
+
'relative grid h-full min-h-0 grid-rows-[auto_minmax(0,1fr)_auto]',
|
|
58
|
+
threadOpen()
|
|
59
|
+
? 'grid-cols-1 md:grid-cols-[minmax(20rem,1fr)_minmax(18rem,22rem)] lg:grid-cols-[minmax(24rem,1fr)_minmax(20rem,26rem)]'
|
|
60
|
+
: 'grid-cols-1',
|
|
61
|
+
local.class
|
|
62
|
+
)}
|
|
63
|
+
{...rest}
|
|
64
|
+
>
|
|
65
|
+
<Show when={local.header}>
|
|
66
|
+
{(header) => (
|
|
67
|
+
<div class={cn('col-start-1 row-start-1 min-w-0', threadOpen() && 'max-md:invisible')}>
|
|
68
|
+
{header()}
|
|
69
|
+
</div>
|
|
70
|
+
)}
|
|
71
|
+
</Show>
|
|
72
|
+
|
|
73
|
+
<div
|
|
74
|
+
class={cn(
|
|
75
|
+
'col-start-1 row-start-2 flex min-h-0 min-w-0 flex-col',
|
|
76
|
+
threadOpen() && 'max-md:invisible'
|
|
77
|
+
)}
|
|
78
|
+
>
|
|
79
|
+
{local.children}
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
<Show when={local.composer}>
|
|
83
|
+
{(composer) => (
|
|
84
|
+
<div
|
|
85
|
+
class={cn(
|
|
86
|
+
'col-start-1 row-start-3 min-w-0',
|
|
87
|
+
local.gutter && 'mx-[clamp(0.8rem,3vw,2.5rem)] mb-[1.15rem] max-[30rem]:mx-2',
|
|
88
|
+
threadOpen() && 'max-md:invisible'
|
|
89
|
+
)}
|
|
90
|
+
>
|
|
91
|
+
{composer()}
|
|
92
|
+
</div>
|
|
93
|
+
)}
|
|
94
|
+
</Show>
|
|
95
|
+
|
|
96
|
+
<Show when={local.thread}>
|
|
97
|
+
{(thread) => (
|
|
98
|
+
<div
|
|
99
|
+
class={cn(
|
|
100
|
+
'min-h-0 min-w-0',
|
|
101
|
+
threadOpen() &&
|
|
102
|
+
'max-md:absolute max-md:inset-0 max-md:z-(--z-docked) max-md:*:border-s-0 md:col-start-2 md:row-span-3 md:row-start-1'
|
|
103
|
+
)}
|
|
104
|
+
>
|
|
105
|
+
{thread()}
|
|
106
|
+
</div>
|
|
107
|
+
)}
|
|
108
|
+
</Show>
|
|
109
|
+
</section>
|
|
110
|
+
)
|
|
111
|
+
}
|
|
@@ -38,6 +38,12 @@ export type ConversationSurfaceProps = ComponentProps<'div'> & {
|
|
|
38
38
|
empty?: JSX.Element
|
|
39
39
|
/** A header that scrolls with the transcript, e.g. a day divider or a banner. */
|
|
40
40
|
header?: JSX.Element
|
|
41
|
+
/**
|
|
42
|
+
* The shared page gutter: reading padding inside the scroller plus a stable
|
|
43
|
+
* gutter, so the scrollbar never shifts the text when it appears. The page
|
|
44
|
+
* frame around the surface is `ConversationPane`'s job.
|
|
45
|
+
*/
|
|
46
|
+
gutter?: boolean
|
|
41
47
|
}
|
|
42
48
|
|
|
43
49
|
export function ConversationSurface(props: ConversationSurfaceProps) {
|
|
@@ -50,6 +56,7 @@ export function ConversationSurface(props: ConversationSurfaceProps) {
|
|
|
50
56
|
'onReadingPositionChange',
|
|
51
57
|
'empty',
|
|
52
58
|
'header',
|
|
59
|
+
'gutter',
|
|
53
60
|
'children',
|
|
54
61
|
'onScroll',
|
|
55
62
|
'ref',
|
|
@@ -84,7 +91,11 @@ export function ConversationSurface(props: ConversationSurfaceProps) {
|
|
|
84
91
|
}}
|
|
85
92
|
onScroll={onScroll}
|
|
86
93
|
tabindex={local.tabindex ?? 0}
|
|
87
|
-
class=
|
|
94
|
+
class={cn(
|
|
95
|
+
'min-h-0 flex-1 overflow-y-auto overscroll-contain',
|
|
96
|
+
local.gutter &&
|
|
97
|
+
'px-[clamp(0.8rem,3vw,2.5rem)] pt-[1.35rem] pb-[1.1rem] [scrollbar-gutter:stable] max-[30rem]:px-2'
|
|
98
|
+
)}
|
|
88
99
|
{...rest}
|
|
89
100
|
>
|
|
90
101
|
<div ref={follow.bindContent} data-slot="conversation-content">
|
|
@@ -10,6 +10,13 @@ export {
|
|
|
10
10
|
type ConversationSurfaceProps,
|
|
11
11
|
type ConversationReadingPosition,
|
|
12
12
|
} from './conversation-surface'
|
|
13
|
+
export { ConversationPane, type ConversationPaneProps } from './conversation-pane'
|
|
14
|
+
export {
|
|
15
|
+
ComposerMenu,
|
|
16
|
+
ComposerMenuItem,
|
|
17
|
+
type ComposerMenuProps,
|
|
18
|
+
type ComposerMenuItemProps,
|
|
19
|
+
} from './composer-menu'
|
|
13
20
|
export {
|
|
14
21
|
ComposerAttachmentButton,
|
|
15
22
|
ComposerHint,
|
|
@@ -71,6 +71,12 @@ export type MessageComposerProps = Omit<ComponentProps<'form'>, 'onSubmit'> & {
|
|
|
71
71
|
trailing?: JSX.Element
|
|
72
72
|
/** A menu rendered above the field, e.g. mention suggestions. */
|
|
73
73
|
menu?: JSX.Element
|
|
74
|
+
/**
|
|
75
|
+
* Host progress rendered in the composer's own live region, e.g. dictation
|
|
76
|
+
* state — plain paragraphs are progress, a `role="alert"` paragraph is a
|
|
77
|
+
* failure. Sending and send-failure copy stays the composer's own.
|
|
78
|
+
*/
|
|
79
|
+
status?: JSX.Element
|
|
74
80
|
/** The reply target, drawn as a strip above the field. */
|
|
75
81
|
replyTo?: { label: string; onDismiss: () => void }
|
|
76
82
|
/** Ref to the actual message textarea, for host focus and selection behavior. */
|
|
@@ -102,6 +108,7 @@ export function MessageComposer(props: MessageComposerProps) {
|
|
|
102
108
|
'leading',
|
|
103
109
|
'trailing',
|
|
104
110
|
'menu',
|
|
111
|
+
'status',
|
|
105
112
|
'replyTo',
|
|
106
113
|
'inputRef',
|
|
107
114
|
'inputId',
|
|
@@ -281,6 +288,7 @@ export function MessageComposer(props: MessageComposerProps) {
|
|
|
281
288
|
>
|
|
282
289
|
{pendingLabel()}…
|
|
283
290
|
</Show>
|
|
291
|
+
<Show when={local.status}>{local.status}</Show>
|
|
284
292
|
</div>
|
|
285
293
|
</form>
|
|
286
294
|
)
|
|
@@ -35,6 +35,13 @@ export const buttonVariants = cva(
|
|
|
35
35
|
'border border-border bg-transparent text-foreground hover:bg-surface-hover hover:border-input',
|
|
36
36
|
/** No chrome until hover. The default for toolbar and row actions. */
|
|
37
37
|
ghost: 'text-foreground hover:bg-surface-hover',
|
|
38
|
+
/**
|
|
39
|
+
* A ghost that opens something: a sheet, menu or popover trigger in a
|
|
40
|
+
* toolbar. While its surface is open it holds the menubar's pressed
|
|
41
|
+
* rung, so the open control never reads identical to its closed
|
|
42
|
+
* neighbours.
|
|
43
|
+
*/
|
|
44
|
+
toolbar: 'text-foreground hover:bg-surface-hover data-[expanded]:bg-surface-active',
|
|
38
45
|
/** A tinted primary, for a secondary action inside a primary flow. */
|
|
39
46
|
subtle: 'bg-primary-subtle text-primary hover:bg-primary-subtle/80',
|
|
40
47
|
success: 'bg-success text-success-foreground hover:bg-success/90',
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which modifier a chord should advertise.
|
|
3
|
+
*
|
|
4
|
+
* Every global chord in the product binds `(metaKey || ctrlKey)`, so the
|
|
5
|
+
* working key is the platform's command modifier wherever the app runs — but
|
|
6
|
+
* Apple platforms draw it as ⌘ and everyone else spells it Ctrl. A chord
|
|
7
|
+
* label drawn from anything else (a hardcoded ⌘, say) advertises a key that
|
|
8
|
+
* does not work as drawn on Windows and Linux.
|
|
9
|
+
*
|
|
10
|
+
* These helpers are the one place that decides the glyph, so every surface
|
|
11
|
+
* that draws or announces a shortcut — rail rows, menus, a pane's search
|
|
12
|
+
* field — draws the same one. They sit next to the `Kbd` caps because the
|
|
13
|
+
* glyph is a property of the drawing, not of the feature that shows it: a
|
|
14
|
+
* spelled-out `Ctrl` needs one cap per word (a `KbdGroup`), while `⌘K` can
|
|
15
|
+
* ride `KbdChord`'s one-cap-per-character split.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/** The modifier glyph the running OS renders for Meta: ⌘ on Apple platforms, Ctrl elsewhere. */
|
|
19
|
+
export function platformModifierKey(platform?: string): '⌘' | 'Ctrl' {
|
|
20
|
+
// The guard keeps server renders honest: no navigator means no Apple
|
|
21
|
+
// platform string, so they fall back to the spelled-out modifier.
|
|
22
|
+
const browserPlatform = platform ?? (typeof navigator === 'undefined' ? '' : navigator.platform)
|
|
23
|
+
return /Mac|iPhone|iPad|iPod/i.test(browserPlatform) ? '⌘' : 'Ctrl'
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** The workspace search chord label as the rail's hover text draws it: the
|
|
27
|
+
* platform modifier plus K (`⌘K`, or `Ctrl+K` where ⌘ does not exist). */
|
|
28
|
+
export function searchShortcutLabel(platform?: string): string {
|
|
29
|
+
return platformModifierKey(platform) === '⌘' ? '⌘K' : 'Ctrl+K'
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The `aria-keyshortcuts` for the search chord. The binding accepts Meta and
|
|
34
|
+
* Ctrl alike, so the announced shortcuts name both: a hardcoded `Meta+K`
|
|
35
|
+
* would promise a key the row does not keep on non-Apple platforms.
|
|
36
|
+
*/
|
|
37
|
+
export const searchShortcutKeyshortcuts = 'Meta+K Control+K'
|
package/package.json
CHANGED
package/registry.json
CHANGED
|
@@ -885,6 +885,11 @@
|
|
|
885
885
|
"path": "src/components/ui/kbd/kbd.tsx",
|
|
886
886
|
"type": "registry:ui",
|
|
887
887
|
"target": "components/ui/kbd/kbd.tsx"
|
|
888
|
+
},
|
|
889
|
+
{
|
|
890
|
+
"path": "src/components/ui/kbd/platform-modifier.ts",
|
|
891
|
+
"type": "registry:ui",
|
|
892
|
+
"target": "components/ui/kbd/platform-modifier.ts"
|
|
888
893
|
}
|
|
889
894
|
]
|
|
890
895
|
},
|
|
@@ -2374,11 +2379,21 @@
|
|
|
2374
2379
|
"type": "registry:ui",
|
|
2375
2380
|
"target": "components/conversation/chat-composer.tsx"
|
|
2376
2381
|
},
|
|
2382
|
+
{
|
|
2383
|
+
"path": "src/components/conversation/composer-menu.tsx",
|
|
2384
|
+
"type": "registry:ui",
|
|
2385
|
+
"target": "components/conversation/composer-menu.tsx"
|
|
2386
|
+
},
|
|
2377
2387
|
{
|
|
2378
2388
|
"path": "src/components/conversation/conversation-avatar.tsx",
|
|
2379
2389
|
"type": "registry:ui",
|
|
2380
2390
|
"target": "components/conversation/conversation-avatar.tsx"
|
|
2381
2391
|
},
|
|
2392
|
+
{
|
|
2393
|
+
"path": "src/components/conversation/conversation-pane.tsx",
|
|
2394
|
+
"type": "registry:ui",
|
|
2395
|
+
"target": "components/conversation/conversation-pane.tsx"
|
|
2396
|
+
},
|
|
2382
2397
|
{
|
|
2383
2398
|
"path": "src/components/conversation/conversation-surface.tsx",
|
|
2384
2399
|
"type": "registry:ui",
|