@aleph-alpha/chat-kit 1.9.1 → 1.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.
Files changed (29) hide show
  1. package/dist/{CkInput.vue_vue_type_script_setup_true_lang-CHPs-R5p.js → CkInput.vue_vue_type_script_setup_true_lang-CR3lzV0q.js} +251 -56
  2. package/dist/components/base/CkFileItemsList/CkFileItemRow.vue.d.ts +33 -0
  3. package/dist/components/base/CkFileItemsList/CkFileItemRow.vue.d.ts.map +1 -0
  4. package/dist/components/base/CkFileItemsList/CkFileItemsList.stories.d.ts +42 -0
  5. package/dist/components/base/CkFileItemsList/CkFileItemsList.stories.d.ts.map +1 -0
  6. package/dist/components/base/CkFileItemsList/CkFileItemsList.vue.d.ts +38 -0
  7. package/dist/components/base/CkFileItemsList/CkFileItemsList.vue.d.ts.map +1 -0
  8. package/dist/components/base/CkFileItemsList/index.d.ts +3 -0
  9. package/dist/components/base/CkFileItemsList/index.d.ts.map +1 -0
  10. package/dist/components/base/CkFileItemsList/types.d.ts +59 -0
  11. package/dist/components/base/CkFileItemsList/types.d.ts.map +1 -0
  12. package/dist/components/base/index.d.ts +2 -0
  13. package/dist/components/base/index.d.ts.map +1 -1
  14. package/dist/components/index.d.ts +2 -2
  15. package/dist/components/index.d.ts.map +1 -1
  16. package/dist/components/index.js +15 -14
  17. package/dist/index.d.ts +2 -2
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +15 -14
  20. package/package.json +3 -3
  21. package/src/components/base/CkFileItemsList/CkFileItemRow.vue +61 -0
  22. package/src/components/base/CkFileItemsList/CkFileItemsList.spec.ts +96 -0
  23. package/src/components/base/CkFileItemsList/CkFileItemsList.stories.ts +307 -0
  24. package/src/components/base/CkFileItemsList/CkFileItemsList.vue +168 -0
  25. package/src/components/base/CkFileItemsList/index.ts +2 -0
  26. package/src/components/base/CkFileItemsList/types.ts +64 -0
  27. package/src/components/base/index.ts +6 -0
  28. package/src/components/index.ts +4 -0
  29. package/src/index.ts +4 -0
@@ -0,0 +1,307 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3-vite';
2
+ import { ref } from 'vue';
3
+ import CkFileItemsList from './CkFileItemsList.vue';
4
+ import type { CkFileEntry } from './types';
5
+
6
+ const meta: Meta<typeof CkFileItemsList> = {
7
+ title: 'Base/CkFileItemsList',
8
+ component: CkFileItemsList,
9
+ tags: ['autodocs'],
10
+ parameters: {
11
+ layout: 'padded',
12
+ docs: {
13
+ description: {
14
+ component:
15
+ 'Compact horizontal row of file attachments. Renders up to `maxInline` `UiFileItem`s side-by-side; once that threshold is exceeded, the full list collapses into a single popover trigger.',
16
+ },
17
+ },
18
+ },
19
+ argTypes: {
20
+ maxInline: { control: { type: 'number', min: 1, max: 6, step: 1 } },
21
+ size: { control: { type: 'inline-radio' }, options: ['default', 'small'] },
22
+ isRemovable: { control: 'boolean' },
23
+ disabled: { control: 'boolean' },
24
+ listLabel: { control: 'text' },
25
+ },
26
+ };
27
+
28
+ export default meta;
29
+
30
+ type Story = StoryObj<typeof CkFileItemsList>;
31
+
32
+ const baseFiles: CkFileEntry[] = [
33
+ {
34
+ id: 1,
35
+ filename: 'project-proposal.pdf',
36
+ typeLabel: 'PDF',
37
+ sizeLabel: '1.2 MB',
38
+ },
39
+ { id: 2, filename: 'meeting-notes.md', typeLabel: 'MD', sizeLabel: '14 KB' },
40
+ { id: 3, filename: 'q3-revenue.csv', typeLabel: 'CSV', sizeLabel: '320 KB' },
41
+ ];
42
+
43
+ const overflowFiles: CkFileEntry[] = [
44
+ ...baseFiles,
45
+ {
46
+ id: 4,
47
+ filename: 'design-spec.docx',
48
+ typeLabel: 'DOCX',
49
+ sizeLabel: '880 KB',
50
+ },
51
+ { id: 5, filename: 'readme.txt', typeLabel: 'TXT', sizeLabel: '4 KB' },
52
+ ];
53
+
54
+ const inlineTemplateSource = `<script setup lang="ts">
55
+ import { CkFileItemsList, type CkFileEntry } from '@aleph-alpha/chat-kit';
56
+
57
+ const files: CkFileEntry[] = [
58
+ { id: 1, filename: 'project-proposal.pdf', typeLabel: 'PDF', sizeLabel: '1.2 MB' },
59
+ { id: 2, filename: 'meeting-notes.md', typeLabel: 'MD', sizeLabel: '14 KB' },
60
+ { id: 3, filename: 'q3-revenue.csv', typeLabel: 'CSV', sizeLabel: '320 KB' },
61
+ ];
62
+ </script>
63
+
64
+ <template>
65
+ <CkFileItemsList :files="files" />
66
+ </template>`;
67
+
68
+ const collapsedTemplateSource = `<script setup lang="ts">
69
+ import { CkFileItemsList, type CkFileEntry } from '@aleph-alpha/chat-kit';
70
+
71
+ const files: CkFileEntry[] = [
72
+ /* … five entries … */
73
+ ];
74
+ </script>
75
+
76
+ <template>
77
+ <CkFileItemsList :files="files" />
78
+ </template>`;
79
+
80
+ const removableTemplateSource = `<script setup lang="ts">
81
+ import { ref } from 'vue';
82
+ import { CkFileItemsList, type CkFileEntry } from '@aleph-alpha/chat-kit';
83
+
84
+ const files = ref<CkFileEntry[]>([
85
+ { id: 1, filename: 'project-proposal.pdf', typeLabel: 'PDF', sizeLabel: '1.2 MB' },
86
+ { id: 2, filename: 'meeting-notes.md', typeLabel: 'MD', sizeLabel: '14 KB' },
87
+ { id: 3, filename: 'q3-revenue.csv', typeLabel: 'CSV', sizeLabel: '320 KB' },
88
+ ]);
89
+
90
+ function handleRemove(id: CkFileEntry['id']) {
91
+ files.value = files.value.filter((f) => f.id !== id);
92
+ }
93
+ </script>
94
+
95
+ <template>
96
+ <CkFileItemsList :files="files" is-removable @remove="handleRemove" />
97
+ </template>`;
98
+
99
+ /**
100
+ * Up to `maxInline` (default `3`) files are rendered inline as a horizontal
101
+ * row of `UiFileItem`s.
102
+ */
103
+ export const Inline: Story = {
104
+ render: () => ({
105
+ components: { CkFileItemsList },
106
+ setup: () => ({ files: baseFiles }),
107
+ template: `
108
+ <div class="bg-background-surface-primary p-4 w-[36rem]">
109
+ <CkFileItemsList :files="files" />
110
+ </div>
111
+ `,
112
+ }),
113
+ parameters: { docs: { source: { code: inlineTemplateSource } } },
114
+ };
115
+
116
+ /**
117
+ * When the list overflows `maxInline`, the component collapses to a single
118
+ * popover trigger. Click it to reveal the full vertical list of files.
119
+ */
120
+ export const Collapsed: Story = {
121
+ render: () => ({
122
+ components: { CkFileItemsList },
123
+ setup: () => ({ files: overflowFiles }),
124
+ template: `
125
+ <div class="bg-background-surface-primary p-4 w-[36rem]">
126
+ <CkFileItemsList :files="files" />
127
+ </div>
128
+ `,
129
+ }),
130
+ parameters: { docs: { source: { code: collapsedTemplateSource } } },
131
+ };
132
+
133
+ /**
134
+ * Each row exposes a remove control when `isRemovable` is `true`. The component
135
+ * emits `remove` with the corresponding file `id`.
136
+ */
137
+ export const Removable: Story = {
138
+ render: () => ({
139
+ components: { CkFileItemsList },
140
+ setup() {
141
+ const files = ref<CkFileEntry[]>([...baseFiles]);
142
+ function handleRemove(id: CkFileEntry['id']) {
143
+ files.value = files.value.filter((f) => f.id !== id);
144
+ }
145
+ return { files, handleRemove };
146
+ },
147
+ template: `
148
+ <div class="bg-background-surface-primary p-4 w-[36rem]">
149
+ <CkFileItemsList :files="files" is-removable @remove="handleRemove" />
150
+ </div>
151
+ `,
152
+ }),
153
+ parameters: { docs: { source: { code: removableTemplateSource } } },
154
+ };
155
+
156
+ const customItemTemplateSource = `<script setup lang="ts">
157
+ import { CkFileItemsList, type CkFileEntry } from '@aleph-alpha/chat-kit';
158
+
159
+ const files: CkFileEntry[] = [
160
+ { id: 1, filename: 'project-proposal.pdf' },
161
+ { id: 2, filename: 'meeting-notes.md' },
162
+ { id: 3, filename: 'q3-revenue.csv' },
163
+ ];
164
+ </script>
165
+
166
+ <template>
167
+ <CkFileItemsList :files="files">
168
+ <template #item="{ file, remove }">
169
+ <a :href="\`/files/\${file.id}\`" class="…custom row…">
170
+ {{ file.filename }}
171
+ </a>
172
+ </template>
173
+ </CkFileItemsList>
174
+ </template>`;
175
+
176
+ /**
177
+ * Use the `item` scoped slot to replace the row rendering entirely. The
178
+ * default renders `UiFileItem`; overriding it lets consumers render any
179
+ * component (router links, custom chips, project-specific file rows, …)
180
+ * while still receiving the file data and a pre-bound `remove` handler.
181
+ */
182
+ export const CustomItem: Story = {
183
+ render: () => ({
184
+ components: { CkFileItemsList },
185
+ setup: () => ({ files: baseFiles }),
186
+ template: `
187
+ <div class="bg-background-surface-primary p-4 w-[36rem]">
188
+ <CkFileItemsList :files="files">
189
+ <template #item="{ file }">
190
+ <a
191
+ :href="'#/files/' + file.id"
192
+ class="block truncate rounded-lg bg-background-surface-secondary px-3 py-2 body-14-medium text-content-on-surface-primary hover:underline"
193
+ >
194
+ {{ file.filename }}
195
+ </a>
196
+ </template>
197
+ </CkFileItemsList>
198
+ </div>
199
+ `,
200
+ }),
201
+ parameters: { docs: { source: { code: customItemTemplateSource } } },
202
+ };
203
+
204
+ const clickableTemplateSource = `<script setup lang="ts">
205
+ import { CkFileItemsList, type CkFileEntry } from '@aleph-alpha/chat-kit';
206
+
207
+ const files: CkFileEntry[] = [
208
+ /* … */
209
+ ];
210
+
211
+ function openFile(file: CkFileEntry) {
212
+ // open viewer, navigate, etc.
213
+ console.log('open', file.id);
214
+ }
215
+ </script>
216
+
217
+ <template>
218
+ <CkFileItemsList :files="files" @item-click="openFile" />
219
+ </template>`;
220
+
221
+ /**
222
+ * Listen for `item-click` to make rows actionable (open a file viewer,
223
+ * navigate, etc.). Clicks on the remove button — or on any `<button>` /
224
+ * `<a>` rendered via the `#item` slot — are excluded so they don't double
225
+ * fire. The popover auto-closes after a click in the collapsed state.
226
+ */
227
+ export const Clickable: Story = {
228
+ render: () => ({
229
+ components: { CkFileItemsList },
230
+ setup() {
231
+ const lastClicked = ref<string>('');
232
+ function openFile(file: CkFileEntry) {
233
+ lastClicked.value = String(file.id);
234
+ }
235
+ return { files: overflowFiles, openFile, lastClicked };
236
+ },
237
+ template: `
238
+ <div class="bg-background-surface-primary p-4 w-[36rem]">
239
+ <CkFileItemsList
240
+ :files="files"
241
+ list-label="Attached files"
242
+ @item-click="openFile"
243
+ />
244
+ <p class="label-12-regular mt-3 text-content-on-surface-muted">
245
+ Last clicked id: {{ lastClicked || '—' }}
246
+ </p>
247
+ </div>
248
+ `,
249
+ }),
250
+ parameters: { docs: { source: { code: clickableTemplateSource } } },
251
+ };
252
+
253
+ const disabledTemplateSource = `<script setup lang="ts">
254
+ import { CkFileItemsList, type CkFileEntry } from '@aleph-alpha/chat-kit';
255
+
256
+ const files: CkFileEntry[] = [
257
+ /* one entry has its own \`disabled: true\` */
258
+ ];
259
+
260
+ const isStreaming = true;
261
+ </script>
262
+
263
+ <template>
264
+ <!-- whole-list disabled while a response is streaming -->
265
+ <CkFileItemsList :files="files" :disabled="isStreaming" is-removable />
266
+ </template>`;
267
+
268
+ /**
269
+ * Set `disabled` on the list (or `disabled: true` on individual `CkFileEntry`)
270
+ * to make rows `inert` while a response streams or a network request is in
271
+ * flight. Disabled rows do not emit `remove` or `item-click`, and the
272
+ * collapsed trigger button itself is `disabled`.
273
+ */
274
+ export const Disabled: Story = {
275
+ render: () => ({
276
+ components: { CkFileItemsList },
277
+ setup: () => ({
278
+ files: [
279
+ ...baseFiles,
280
+ {
281
+ id: 4,
282
+ filename: 'archive.zip',
283
+ typeLabel: 'ZIP',
284
+ sizeLabel: '2 MB',
285
+ disabled: true,
286
+ },
287
+ ] as CkFileEntry[],
288
+ }),
289
+ template: `
290
+ <div class="flex flex-col gap-6 bg-background-surface-primary p-4 w-[36rem]">
291
+ <div>
292
+ <p class="label-12-medium text-content-on-surface-muted mb-2">
293
+ Whole list disabled
294
+ </p>
295
+ <CkFileItemsList :files="files.slice(0, 3)" disabled is-removable />
296
+ </div>
297
+ <div>
298
+ <p class="label-12-medium text-content-on-surface-muted mb-2">
299
+ Per-row disabled (the .zip)
300
+ </p>
301
+ <CkFileItemsList :files="files" is-removable />
302
+ </div>
303
+ </div>
304
+ `,
305
+ }),
306
+ parameters: { docs: { source: { code: disabledTemplateSource } } },
307
+ };
@@ -0,0 +1,168 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ UiFileType,
4
+ UiIcon,
5
+ UiPopover,
6
+ UiPopoverContent,
7
+ UiPopoverTrigger,
8
+ type UiFileItemSize,
9
+ } from '@aleph-alpha/ui-library';
10
+ import { computed, ref } from 'vue';
11
+ import CkFileItemRow from './CkFileItemRow.vue';
12
+ import type {
13
+ CkFileEntry,
14
+ CkFileItemsListEmits,
15
+ CkFileItemsListProps,
16
+ } from './types';
17
+
18
+ defineOptions({
19
+ name: 'CkFileItemsList',
20
+ });
21
+
22
+ const props = withDefaults(defineProps<CkFileItemsListProps>(), {
23
+ maxInline: 3,
24
+ size: 'small',
25
+ isRemovable: false,
26
+ removeLabel: 'Remove file',
27
+ disabled: false,
28
+ triggerLabel: undefined,
29
+ triggerAriaLabel: undefined,
30
+ listLabel: undefined,
31
+ popoverClass: undefined,
32
+ });
33
+
34
+ const emit = defineEmits<CkFileItemsListEmits>();
35
+
36
+ // Replace the default `UiFileItem` row. `remove()` is pre-bound and
37
+ // `disabled` reflects list-level + per-row disable.
38
+ defineSlots<{
39
+ item: (props: {
40
+ file: CkFileEntry;
41
+ remove: () => void;
42
+ size: UiFileItemSize;
43
+ isRemovable: boolean;
44
+ removeLabel: string;
45
+ disabled: boolean;
46
+ }) => unknown;
47
+ }>();
48
+
49
+ const isCollapsed = computed(() => props.files.length > props.maxInline);
50
+ const isOpen = ref(false);
51
+
52
+ function isRowDisabled(file: CkFileEntry): boolean {
53
+ return props.disabled || file.disabled === true;
54
+ }
55
+
56
+ const defaultTriggerLabel = computed(() => `${props.files.length} files`);
57
+ const resolvedTriggerLabel = computed(
58
+ () => props.triggerLabel ?? defaultTriggerLabel.value,
59
+ );
60
+ const resolvedTriggerAriaLabel = computed(
61
+ () =>
62
+ props.triggerAriaLabel ?? props.triggerLabel ?? defaultTriggerLabel.value,
63
+ );
64
+
65
+ function handleRemove(file: CkFileEntry) {
66
+ if (isRowDisabled(file)) return;
67
+ emit('remove', file.id);
68
+ }
69
+
70
+ function handleRowClick(file: CkFileEntry, event: MouseEvent) {
71
+ if (isRowDisabled(file)) return;
72
+ // Skip clicks originating from any interactive child (remove button,
73
+ // links/buttons supplied via #item) so they don't double-fire.
74
+ const target = event.target as HTMLElement | null;
75
+ if (target?.closest('button, a, [role="button"]')) return;
76
+ emit('item-click', file, event);
77
+ if (isOpen.value) isOpen.value = false;
78
+ }
79
+ </script>
80
+
81
+ <template>
82
+ <ul
83
+ v-if="!isCollapsed"
84
+ data-slot="file-items-list"
85
+ class="m-0 flex w-full min-w-0 list-none flex-wrap items-center gap-2 p-0"
86
+ :aria-label="listLabel"
87
+ >
88
+ <li
89
+ v-for="file in files"
90
+ :key="file.id"
91
+ class="min-w-0 max-w-full flex-1 basis-0"
92
+ @click="handleRowClick(file, $event)"
93
+ >
94
+ <CkFileItemRow
95
+ :file="file"
96
+ :size="size"
97
+ :is-removable="isRemovable"
98
+ :remove-label="removeLabel"
99
+ :disabled="isRowDisabled(file)"
100
+ @remove="handleRemove(file)"
101
+ >
102
+ <template #default="bindings">
103
+ <slot name="item" v-bind="bindings" />
104
+ </template>
105
+ </CkFileItemRow>
106
+ </li>
107
+ </ul>
108
+
109
+ <UiPopover v-else v-model:open="isOpen">
110
+ <UiPopoverTrigger as-child>
111
+ <button
112
+ type="button"
113
+ data-slot="file-items-list-trigger"
114
+ :disabled="disabled"
115
+ class="relative flex w-full max-w-full min-w-0 items-center gap-3 rounded-xl bg-background-surface-muted-subtle text-left transition-colors hover:bg-background-surface-muted focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-background-surface-muted-subtle"
116
+ :class="size === 'small' ? 'p-2' : 'p-3'"
117
+ :aria-label="resolvedTriggerAriaLabel"
118
+ >
119
+ <UiFileType icon="paperclip" tone="default" />
120
+ <span
121
+ class="min-w-0 flex-1 truncate text-content-on-surface-primary"
122
+ :class="size === 'small' ? 'label-12-medium' : 'body-14-medium'"
123
+ >
124
+ {{ resolvedTriggerLabel }}
125
+ </span>
126
+ <UiIcon
127
+ name="chevron-down"
128
+ :size="16"
129
+ aria-hidden="true"
130
+ class="shrink-0 text-content-on-surface-muted transition-transform"
131
+ :class="isOpen && 'rotate-180'"
132
+ />
133
+ </button>
134
+ </UiPopoverTrigger>
135
+
136
+ <UiPopoverContent
137
+ align="start"
138
+ :side-offset="4"
139
+ :class="['w-64 p-2', popoverClass]"
140
+ >
141
+ <ul
142
+ data-slot="file-items-list-collapsed"
143
+ class="m-0 flex list-none flex-col gap-2 p-0"
144
+ :aria-label="listLabel"
145
+ >
146
+ <li
147
+ v-for="file in files"
148
+ :key="file.id"
149
+ class="min-w-0"
150
+ @click="handleRowClick(file, $event)"
151
+ >
152
+ <CkFileItemRow
153
+ :file="file"
154
+ :size="size"
155
+ :is-removable="isRemovable"
156
+ :remove-label="removeLabel"
157
+ :disabled="isRowDisabled(file)"
158
+ @remove="handleRemove(file)"
159
+ >
160
+ <template #default="bindings">
161
+ <slot name="item" v-bind="bindings" />
162
+ </template>
163
+ </CkFileItemRow>
164
+ </li>
165
+ </ul>
166
+ </UiPopoverContent>
167
+ </UiPopover>
168
+ </template>
@@ -0,0 +1,2 @@
1
+ export { default as CkFileItemsList } from './CkFileItemsList.vue';
2
+ export type * from './types';
@@ -0,0 +1,64 @@
1
+ import type {
2
+ UiFileItemMediaTone,
3
+ UiFileItemSize,
4
+ } from '@aleph-alpha/ui-library';
5
+
6
+ export interface CkFileEntry {
7
+ /** Stable id used as the `:key` and emitted with `remove`. */
8
+ id: string | number;
9
+ /** Full file name. */
10
+ filename: string;
11
+ /** Short type label, e.g. `PDF`. */
12
+ typeLabel?: string;
13
+ /** Size label, e.g. `1.2 MB`. */
14
+ sizeLabel?: string;
15
+ /** Upload progress 0–100; `< 100` shows a progress bar. */
16
+ progress?: number | null;
17
+ /** Error message; non-empty enters the error state. */
18
+ error?: string | null;
19
+ /** Lucide icon override for the media badge. */
20
+ mediaIcon?: string;
21
+ /** Media badge tone override. */
22
+ mediaTone?: UiFileItemMediaTone;
23
+ /** Per-row disable. */
24
+ disabled?: boolean;
25
+ }
26
+
27
+ /**
28
+ * Horizontal list of file attachments; collapses to a popover once the
29
+ * count exceeds `maxInline`.
30
+ *
31
+ * @category Inputs
32
+ * @useCases user message attachments, prompt input previews, chat file row
33
+ * @keywords files, attachments, file list, popover, chat
34
+ * @related UiFileItem, UiPopover
35
+ */
36
+ export interface CkFileItemsListProps {
37
+ /** Files to render. Order is preserved. */
38
+ files: CkFileEntry[];
39
+ /** @default 3 */
40
+ maxInline?: number;
41
+ /** @default 'small' */
42
+ size?: UiFileItemSize;
43
+ /** Show a remove control on every row. @default false */
44
+ isRemovable?: boolean;
45
+ /** Remove control label, forwarded to `UiFileItem`. */
46
+ removeLabel?: string;
47
+ /** Disable every row + the collapsed trigger. @default false */
48
+ disabled?: boolean;
49
+ /** Visible label on the collapsed trigger. Defaults to `"{n} files"`. */
50
+ triggerLabel?: string;
51
+ /** A11y label for the trigger. Falls back to `triggerLabel`, then count. */
52
+ triggerAriaLabel?: string;
53
+ /** `aria-label` for the `<ul>` (e.g. `"Attached files"`). */
54
+ listLabel?: string;
55
+ /** Extra classes for the popover content (override the default `w-64`). */
56
+ popoverClass?: string;
57
+ }
58
+
59
+ export interface CkFileItemsListEmits {
60
+ /** Remove control activated. Suppressed for disabled rows. */
61
+ (event: 'remove', id: CkFileEntry['id']): void;
62
+ /** Row clicked outside any interactive child. Suppressed for disabled rows. */
63
+ (event: 'item-click', file: CkFileEntry, originalEvent: MouseEvent): void;
64
+ }
@@ -8,6 +8,12 @@ export type {
8
8
  CkFeedbackButtonProps,
9
9
  CkFeedbackValue,
10
10
  } from './CkFeedbackButton';
11
+ export { CkFileItemsList } from './CkFileItemsList';
12
+ export type {
13
+ CkFileEntry,
14
+ CkFileItemsListProps,
15
+ CkFileItemsListEmits,
16
+ } from './CkFileItemsList';
11
17
  export { CkHistoryItem } from './CkHistoryItem';
12
18
  export type { CkHistoryItemProps, CkHistoryItemEmits } from './CkHistoryItem';
13
19
  export { CkHistoryWrapper } from './CkHistoryWrapper';
@@ -4,6 +4,7 @@ export {
4
4
  CkConversationLayout,
5
5
  CkCopyMessageActionButton,
6
6
  CkFeedbackButton,
7
+ CkFileItemsList,
7
8
  CkHistoryItem,
8
9
  CkHistoryWrapper,
9
10
  CkMarkdownRenderer,
@@ -20,6 +21,9 @@ export type {
20
21
  CkConversationLayoutProps,
21
22
  CkFeedbackButtonProps,
22
23
  CkFeedbackValue,
24
+ CkFileEntry,
25
+ CkFileItemsListEmits,
26
+ CkFileItemsListProps,
23
27
  CkHistoryItemEmits,
24
28
  CkHistoryItemProps,
25
29
  CkHistoryWrapperProps,
package/src/index.ts CHANGED
@@ -67,6 +67,7 @@ export {
67
67
  CkConversationLayout,
68
68
  CkCopyMessageActionButton,
69
69
  CkFeedbackButton,
70
+ CkFileItemsList,
70
71
  CkHistory,
71
72
  CkHistoryItem,
72
73
  CkHistoryWrapper,
@@ -86,6 +87,9 @@ export type {
86
87
  CkConversationProps,
87
88
  CkFeedbackButtonProps,
88
89
  CkFeedbackValue,
90
+ CkFileEntry,
91
+ CkFileItemsListEmits,
92
+ CkFileItemsListProps,
89
93
  CkHistoryEmits,
90
94
  CkHistoryItemEmits,
91
95
  CkHistoryItemProps,