@keboola/design 11.2.0 → 11.4.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/AGENTS.md +42 -14
- package/CHANGELOG.md +424 -0
- package/COMPONENT-API.md +33 -32
- package/dist/{AIKit-DiS0CVOW.js → AIKit-DDg5DBCG.js} +156 -76
- package/dist/AIKit-DDg5DBCG.js.map +1 -0
- package/dist/{Alert-DfZq9kGe.js → Alert-DHJFrWnS.js} +3 -3
- package/dist/{Alert-DfZq9kGe.js.map → Alert-DHJFrWnS.js.map} +1 -1
- package/dist/{AlertModal-Dp_XuJBW.js → AlertModal-BGJdaRRj.js} +3 -3
- package/dist/{AlertModal-Dp_XuJBW.js.map → AlertModal-BGJdaRRj.js.map} +1 -1
- package/dist/{AppShell-B5GQN6Zs.js → AppShell-DRgJxpXW.js} +29 -10
- package/dist/AppShell-DRgJxpXW.js.map +1 -0
- package/dist/{BrandEditor-DyzgfVkl.js → BrandEditor-Go7w8Zj2.js} +7 -7
- package/dist/{BrandEditor-DyzgfVkl.js.map → BrandEditor-Go7w8Zj2.js.map} +1 -1
- package/dist/{BrandLogo-CJkRd0F8.js → BrandLogo-Dmi7jo21.js} +2 -2
- package/dist/{BrandLogo-CJkRd0F8.js.map → BrandLogo-Dmi7jo21.js.map} +1 -1
- package/dist/{Breadcrumb-Frst8MTA.js → Breadcrumb-uEkM6adI.js} +3 -3
- package/dist/{Breadcrumb-Frst8MTA.js.map → Breadcrumb-uEkM6adI.js.map} +1 -1
- package/dist/{Button-6xBX0nNl.js → Button-DsRrU5F1.js} +6 -5
- package/dist/Button-DsRrU5F1.js.map +1 -0
- package/dist/{Card-BAoZ35CV.js → Card-Dyo7055Q.js} +2 -2
- package/dist/{Card-BAoZ35CV.js.map → Card-Dyo7055Q.js.map} +1 -1
- package/dist/{Checkbox-GJ8-srt4.js → Checkbox-fC0BuO2B.js} +3 -3
- package/dist/{Checkbox-GJ8-srt4.js.map → Checkbox-fC0BuO2B.js.map} +1 -1
- package/dist/{Clipboard-CBJZiviP.js → Clipboard-ChPdiUy3.js} +2 -2
- package/dist/{Clipboard-CBJZiviP.js.map → Clipboard-ChPdiUy3.js.map} +1 -1
- package/dist/{ClipboardButton-ClcluT0C.js → ClipboardButton-D9pDjgkB.js} +3 -3
- package/dist/{ClipboardButton-ClcluT0C.js.map → ClipboardButton-D9pDjgkB.js.map} +1 -1
- package/dist/{CodeEditor-DyaN-Ij2.js → CodeEditor-Cxy3HnKH.js} +244 -113
- package/dist/CodeEditor-Cxy3HnKH.js.map +1 -0
- package/dist/{ColorInput-B8z4j4Y_.js → ColorInput-Bxj-1eLT.js} +3 -3
- package/dist/{ColorInput-B8z4j4Y_.js.map → ColorInput-Bxj-1eLT.js.map} +1 -1
- package/dist/{ColorModeSwitch-dZFZyqy1.js → ColorModeSwitch-CsWLiTBX.js} +3 -3
- package/dist/{ColorModeSwitch-dZFZyqy1.js.map → ColorModeSwitch-CsWLiTBX.js.map} +1 -1
- package/dist/{Combobox-Dgm6Z4ib.js → Combobox-Cs_1pj2q.js} +31 -24
- package/dist/Combobox-Cs_1pj2q.js.map +1 -0
- package/dist/{Command-C0aZfVTq.js → Command-B7ML9YMv.js} +6 -6
- package/dist/{Command-C0aZfVTq.js.map → Command-B7ML9YMv.js.map} +1 -1
- package/dist/{CopyField-BJ96zvXs.js → CopyField-BO_sh-HO.js} +2 -2
- package/dist/{CopyField-BJ96zvXs.js.map → CopyField-BO_sh-HO.js.map} +1 -1
- package/dist/{DateInput-B3UdzRfW.js → DateInput-ZdaMQo5i.js} +4 -4
- package/dist/{DateInput-B3UdzRfW.js.map → DateInput-ZdaMQo5i.js.map} +1 -1
- package/dist/{DatePicker-Dw3DpbUh.js → DatePicker-nA8YdE84.js} +2 -2
- package/dist/{DatePicker-Dw3DpbUh.js.map → DatePicker-nA8YdE84.js.map} +1 -1
- package/dist/{DateRangeInput-DTuySEiq.js → DateRangeInput-DkvNh_sT.js} +4 -4
- package/dist/{DateRangeInput-DTuySEiq.js.map → DateRangeInput-DkvNh_sT.js.map} +1 -1
- package/dist/{DateRangePicker-DCmMHg4s.js → DateRangePicker-DjSUFjh4.js} +6 -6
- package/dist/{DateRangePicker-DCmMHg4s.js.map → DateRangePicker-DjSUFjh4.js.map} +1 -1
- package/dist/{DropdownMenu-t90tVw6l.js → DropdownMenu-CASr-jgl.js} +2 -2
- package/dist/{DropdownMenu-t90tVw6l.js.map → DropdownMenu-CASr-jgl.js.map} +1 -1
- package/dist/{FieldItem-D-h1NeBo.js → FieldItem-CCd9-xnp.js} +3 -3
- package/dist/{FieldItem-D-h1NeBo.js.map → FieldItem-CCd9-xnp.js.map} +1 -1
- package/dist/{FieldItem-CAPj9lj3.d.ts → FieldItem-vhIJW4pj.d.ts} +2 -10
- package/dist/{FileUpload-BRv0TaZk.js → FileUpload-ABThVZyg.js} +2 -2
- package/dist/{FileUpload-BRv0TaZk.js.map → FileUpload-ABThVZyg.js.map} +1 -1
- package/dist/{Form-DHvcFoEi.js → Form-k6PH-em3.js} +8 -8
- package/dist/{Form-DHvcFoEi.js.map → Form-k6PH-em3.js.map} +1 -1
- package/dist/{FormGroup-C41n65cE.js → FormGroup-DbcDtrgU.js} +3 -3
- package/dist/{FormGroup-C41n65cE.js.map → FormGroup-DbcDtrgU.js.map} +1 -1
- package/dist/{FullScreenModal-Cb3PGgh4.js → FullScreenModal-BvPuYibe.js} +3 -3
- package/dist/{FullScreenModal-Cb3PGgh4.js.map → FullScreenModal-BvPuYibe.js.map} +1 -1
- package/dist/{HoverCard-WfDkLK1s.js → HoverCard-B9ZMJxjn.js} +2 -2
- package/dist/{HoverCard-WfDkLK1s.js.map → HoverCard-B9ZMJxjn.js.map} +1 -1
- package/dist/{InputGroup-CdTq8H7c.js → InputGroup-BnLHY0eq.js} +3 -3
- package/dist/{InputGroup-CdTq8H7c.js.map → InputGroup-BnLHY0eq.js.map} +1 -1
- package/dist/{Kbd-CxHAo1oo.js → Kbd-CvSM3D3-.js} +2 -2
- package/dist/{Kbd-CxHAo1oo.js.map → Kbd-CvSM3D3-.js.map} +1 -1
- package/dist/MarkedText-DNGEUVWc.js +67 -0
- package/dist/MarkedText-DNGEUVWc.js.map +1 -0
- package/dist/{MermaidDiagram-ChL3WIQT.js → MermaidDiagram-WkonYErO.js} +6 -87
- package/dist/MermaidDiagram-WkonYErO.js.map +1 -0
- package/dist/{Modal-wqG8nJiK.js → Modal-Coj-H02o.js} +16 -4
- package/dist/Modal-Coj-H02o.js.map +1 -0
- package/dist/{MultiActionButtonGroup-BiIIubiL.js → MultiActionButtonGroup-CxWH7yWK.js} +3 -3
- package/dist/{MultiActionButtonGroup-BiIIubiL.js.map → MultiActionButtonGroup-CxWH7yWK.js.map} +1 -1
- package/dist/{Navbar-BfaPeLUL.js → Navbar-B2UsolVU.js} +3 -3
- package/dist/{Navbar-BfaPeLUL.js.map → Navbar-B2UsolVU.js.map} +1 -1
- package/dist/{PageToolbar-OQg3mPF-.js → PageToolbar-DnbFt14Q.js} +3 -3
- package/dist/{PageToolbar-OQg3mPF-.js.map → PageToolbar-DnbFt14Q.js.map} +1 -1
- package/dist/{Pagination-Cjfda8KG.js → Pagination-C_b7Xhey.js} +2 -2
- package/dist/{Pagination-Cjfda8KG.js.map → Pagination-C_b7Xhey.js.map} +1 -1
- package/dist/{Popconfirm-D7_vfxFd.js → Popconfirm-CILjmzKI.js} +3 -3
- package/dist/{Popconfirm-D7_vfxFd.js.map → Popconfirm-CILjmzKI.js.map} +1 -1
- package/dist/{Popover-CzeHjvrB.js → Popover-BEbQrC_P.js} +22 -19
- package/dist/Popover-BEbQrC_P.js.map +1 -0
- package/dist/{RadioGroup-sIveSsNa.js → RadioGroup-XFzFd1ti.js} +3 -3
- package/dist/{RadioGroup-sIveSsNa.js.map → RadioGroup-XFzFd1ti.js.map} +1 -1
- package/dist/{Search-3UiqNZRj.js → Search-4Bxtt8hS.js} +2 -2
- package/dist/{Search-3UiqNZRj.js.map → Search-4Bxtt8hS.js.map} +1 -1
- package/dist/{SearchInput-C7dF_Ir-.js → SearchInput-f_oY9T4Z.js} +3 -3
- package/dist/{SearchInput-C7dF_Ir-.js.map → SearchInput-f_oY9T4Z.js.map} +1 -1
- package/dist/{SectionNav-8NoTOKO8.js → SectionNav-BpJlisbT.js} +4 -4
- package/dist/{SectionNav-8NoTOKO8.js.map → SectionNav-BpJlisbT.js.map} +1 -1
- package/dist/{Select-Is0VkePH.js → Select-DpcgKqKB.js} +32 -21
- package/dist/Select-DpcgKqKB.js.map +1 -0
- package/dist/{Sheet-Dw9BDvjI.js → Sheet-Chf0kX1E.js} +3 -3
- package/dist/{Sheet-Dw9BDvjI.js.map → Sheet-Chf0kX1E.js.map} +1 -1
- package/dist/{Sidebar-Dcb4rinA.js → Sidebar-Cm6I4dE1.js} +9 -7
- package/dist/{Sidebar-Dcb4rinA.js.map → Sidebar-Cm6I4dE1.js.map} +1 -1
- package/dist/{Slider-BOPfMOMm.js → Slider-pPC_3gz9.js} +3 -3
- package/dist/{Slider-BOPfMOMm.js.map → Slider-pPC_3gz9.js.map} +1 -1
- package/dist/{Switch-CX2A0v50.js → Switch-ChfPKcTE.js} +2 -2
- package/dist/{Switch-CX2A0v50.js.map → Switch-ChfPKcTE.js.map} +1 -1
- package/dist/{Tabs-UMQuDoW8.js → Tabs-eB974xJf.js} +2 -2
- package/dist/{Tabs-UMQuDoW8.js.map → Tabs-eB974xJf.js.map} +1 -1
- package/dist/{TextInput-CMuN1WfY.js → TextInput-DHM6dHmn.js} +3 -3
- package/dist/{TextInput-CMuN1WfY.js.map → TextInput-DHM6dHmn.js.map} +1 -1
- package/dist/{ThemeProvider-QncUrfJn.js → ThemeProvider-DrQJtzpd.js} +90 -14
- package/dist/ThemeProvider-DrQJtzpd.js.map +1 -0
- package/dist/{TimePicker-D9zktB8A.js → TimePicker-BGeqc-Ed.js} +2 -2
- package/dist/{TimePicker-D9zktB8A.js.map → TimePicker-BGeqc-Ed.js.map} +1 -1
- package/dist/{Toast-DQSbs3oA.js → Toast-Dr6Uw7ao.js} +2 -2
- package/dist/{Toast-DQSbs3oA.js.map → Toast-Dr6Uw7ao.js.map} +1 -1
- package/dist/{ZoomableSvg-CZEu6sAq.js → ZoomableSvg-BWnDkR61.js} +4 -4
- package/dist/{ZoomableSvg-CZEu6sAq.js.map → ZoomableSvg-BWnDkR61.js.map} +1 -1
- package/dist/{context-KxxeMHbR.js → context-D7X470dy.js} +5 -34
- package/dist/context-D7X470dy.js.map +1 -0
- package/dist/defaults-i_xG2F_1.js +32 -0
- package/dist/defaults-i_xG2F_1.js.map +1 -0
- package/dist/editors.d.ts +12 -2
- package/dist/editors.js +20 -12
- package/dist/editors.js.map +1 -1
- package/dist/findLiteralMatches-BGBw8Vbl.js +62 -0
- package/dist/findLiteralMatches-BGBw8Vbl.js.map +1 -0
- package/dist/flint.d.ts +15 -0
- package/dist/flint.js +212 -0
- package/dist/flint.js.map +1 -0
- package/dist/index.d.ts +725 -533
- package/dist/index.js +60 -57
- package/dist/internal/blocks/AIKit.js +2 -2
- package/dist/internal/blocks/AppShell.js +2 -2
- package/dist/internal/blocks/BrandEditor.js +1 -1
- package/dist/internal/blocks/ChartPanel.js +1 -1
- package/dist/internal/blocks/ClipboardButton.js +1 -1
- package/dist/internal/blocks/ColorInput.js +1 -1
- package/dist/internal/blocks/ColorModeSwitch.js +1 -1
- package/dist/internal/blocks/Command.js +1 -1
- package/dist/internal/blocks/CopyField.js +1 -1
- package/dist/internal/blocks/DateInput.js +1 -1
- package/dist/internal/blocks/DateRangeInput.js +1 -1
- package/dist/{DiagramSkeleton-lwBS2YBa.js → internal/blocks/DiagramShared/DiagramSkeleton.js} +3 -3
- package/dist/internal/blocks/DiagramShared/DiagramSkeleton.js.map +1 -0
- package/dist/internal/blocks/EmptyConfigurationActionCard.js +1 -1
- package/dist/internal/blocks/ErrorState.js +1 -1
- package/dist/internal/blocks/ExportMenu.js +5 -5
- package/dist/internal/blocks/ExportMenu.js.map +1 -1
- package/dist/internal/blocks/Form/connectors/MultiComboboxField.js +1 -1
- package/dist/internal/blocks/Form.js +1 -1
- package/dist/internal/blocks/FormGroup.js +1 -1
- package/dist/internal/blocks/MultiActionButtonGroup.js +1 -1
- package/dist/internal/blocks/MultiCombobox.js +15 -11
- package/dist/internal/blocks/MultiCombobox.js.map +1 -1
- package/dist/internal/blocks/NumberInput.js +1 -1
- package/dist/internal/blocks/PageToolbar.js +1 -1
- package/dist/internal/blocks/PasswordInput.js +2 -2
- package/dist/internal/blocks/SearchInput.js +1 -1
- package/dist/internal/blocks/SearchInputWithNavigation.js +3 -3
- package/dist/internal/blocks/SectionNav.js +1 -1
- package/dist/internal/blocks/SplitButton.js +2 -2
- package/dist/internal/blocks/StatCard.js +1 -1
- package/dist/internal/blocks/TextInput.js +1 -1
- package/dist/internal/blocks/Textarea.js +1 -1
- package/dist/internal/blocks/TimeInput.js +3 -3
- package/dist/internal/components/Alert.js +1 -1
- package/dist/internal/components/AlertModal.js +1 -1
- package/dist/internal/components/Avatar.js +1 -1
- package/dist/internal/components/BrandLogo.js +1 -1
- package/dist/internal/components/Breadcrumb.js +1 -1
- package/dist/internal/components/Button.js +1 -1
- package/dist/internal/components/Card.js +1 -1
- package/dist/internal/components/Checkbox.js +1 -1
- package/dist/internal/components/Clipboard.js +1 -1
- package/dist/internal/components/CollapsiblePanel.js +1 -1
- package/dist/internal/components/Combobox.js +1 -1
- package/dist/internal/components/DatePicker.js +1 -1
- package/dist/internal/components/DateRangePicker.js +1 -1
- package/dist/internal/components/DropdownMenu.js +1 -1
- package/dist/internal/components/FileUpload.js +1 -1
- package/dist/internal/components/FullScreenModal.js +1 -1
- package/dist/internal/components/HoverCard.js +1 -1
- package/dist/internal/components/InputGroup.js +1 -1
- package/dist/internal/components/Kbd.js +1 -1
- package/dist/internal/components/MarkedText.js +1 -1
- package/dist/internal/components/Modal.js +1 -1
- package/dist/internal/components/Navbar.js +1 -1
- package/dist/internal/components/Pagination.js +1 -1
- package/dist/internal/components/Popconfirm.js +1 -1
- package/dist/internal/components/Popover.js +1 -1
- package/dist/internal/components/RadioGroup.js +1 -1
- package/dist/internal/components/Search.js +1 -1
- package/dist/internal/components/Select.js +1 -1
- package/dist/internal/components/Sheet.js +1 -1
- package/dist/internal/components/Sidebar.js +1 -1
- package/dist/internal/components/Slider.js +1 -1
- package/dist/internal/components/Switch.js +1 -1
- package/dist/internal/components/Tabs.js +1 -1
- package/dist/internal/components/ThemeProvider.js +4 -3
- package/dist/internal/components/TimePicker.js +1 -1
- package/dist/internal/components/Toast.js +2 -2
- package/dist/internal/components/Toggle.js +3 -3
- package/dist/internal/components/Toggle.js.map +1 -1
- package/dist/internal/components/Tooltip.js +1 -1
- package/dist/internal/components/Truncated.js +16 -8
- package/dist/internal/components/Truncated.js.map +1 -1
- package/dist/internal/components/ZoomableSvg.js +1 -1
- package/dist/internal/utils.js +3 -3
- package/dist/markdown-editor.js +7 -7
- package/dist/mermaid.js +1 -1
- package/dist/rjsf.js +11 -11
- package/dist/{styles-DSUP_-9Z.js → styles-BAFscjSV.js} +4 -3
- package/dist/styles-BAFscjSV.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/svgTransforms-C9njt92h.js +89 -0
- package/dist/svgTransforms-C9njt92h.js.map +1 -0
- package/dist/testing.js +4 -3
- package/dist/testing.js.map +1 -1
- package/dist/{themeTokens-BNg98Mu9.js → themeTokens-D70HeNVF.js} +13 -6
- package/dist/{themeTokens-BNg98Mu9.js.map → themeTokens-D70HeNVF.js.map} +1 -1
- package/dist/{toast-CjkURw0M.js → toast-DIC0iNRf.js} +3 -3
- package/dist/toast-DIC0iNRf.js.map +1 -0
- package/dist/types-BPcAjMG0.d.ts +10 -0
- package/dist/{useColorSchemeState-CYqcUfSH.js → useColorSchemeState-klihG9-i.js} +2 -2
- package/dist/{useColorSchemeState-CYqcUfSH.js.map → useColorSchemeState-klihG9-i.js.map} +1 -1
- package/dist/{utils-D0c5VAyF.js → utils-B5Z52hYs.js} +2 -2
- package/dist/{utils-D0c5VAyF.js.map → utils-B5Z52hYs.js.map} +1 -1
- package/dist/vega.d.ts +46 -0
- package/dist/vega.js +26 -0
- package/dist/vega.js.map +1 -0
- package/dist/vegaTheme-DfoEQhOy.js +146 -0
- package/dist/vegaTheme-DfoEQhOy.js.map +1 -0
- package/package.json +28 -9
- package/src/styles.css +27 -4
- package/dist/AIKit-DiS0CVOW.js.map +0 -1
- package/dist/AppShell-B5GQN6Zs.js.map +0 -1
- package/dist/Button-6xBX0nNl.js.map +0 -1
- package/dist/CodeEditor-DyaN-Ij2.js.map +0 -1
- package/dist/Combobox-Dgm6Z4ib.js.map +0 -1
- package/dist/DiagramSkeleton-lwBS2YBa.js.map +0 -1
- package/dist/MarkedText-Ckbft5mw.js +0 -44
- package/dist/MarkedText-Ckbft5mw.js.map +0 -1
- package/dist/MermaidDiagram-ChL3WIQT.js.map +0 -1
- package/dist/Modal-wqG8nJiK.js.map +0 -1
- package/dist/Popover-CzeHjvrB.js.map +0 -1
- package/dist/Select-Is0VkePH.js.map +0 -1
- package/dist/ThemeProvider-QncUrfJn.js.map +0 -1
- package/dist/context-KxxeMHbR.js.map +0 -1
- package/dist/escapeStringRegexp-8MxP2knR.js +0 -6
- package/dist/escapeStringRegexp-8MxP2knR.js.map +0 -1
- package/dist/styles-DSUP_-9Z.js.map +0 -1
- package/dist/toast-CjkURw0M.js.map +0 -1
package/COMPONENT-API.md
CHANGED
|
@@ -319,37 +319,38 @@ Source: `src/blocks/Form/connectors/MultiComboboxField.tsx`
|
|
|
319
319
|
|
|
320
320
|
> Several values from a searchable list — state is `string[]`, never objects, so the form value stays what gets submitted. Project labels with `itemToLabel`; add `allowCreate` for an enum the user may extend. Imported by name from `@keboola/design`, composed inside `form.AppField` — NOT reachable as `field.MultiComboboxField`.
|
|
321
321
|
|
|
322
|
-
| Prop | Type
|
|
323
|
-
| -------------------- |
|
|
324
|
-
| `action` | `ReactNode`
|
|
325
|
-
| `allowClear` | `boolean`
|
|
326
|
-
| `allowCreate` | `boolean`
|
|
327
|
-
| `allowSelectAll` | `boolean`
|
|
328
|
-
| `aria-describedby` | `string`
|
|
329
|
-
| `className` | `string`
|
|
330
|
-
| `empty` | `ReactNode`
|
|
331
|
-
| `focusVariant` | `"off" \| "on" \| "default" \| null`
|
|
332
|
-
| `groupToLabel` | `((group: Group<string>) => ReactNode)`
|
|
333
|
-
| `help` | `ReactNode`
|
|
334
|
-
| `indicator` | `Indicator`
|
|
335
|
-
| `inputClassName` | `string`
|
|
336
|
-
| `items` | `readonly (string \| Group<string>)[]`
|
|
337
|
-
| `itemToChipColor` | `((item:
|
|
338
|
-
| `itemToChipLabel` | `((item:
|
|
339
|
-
| `itemToDisabled` | `((item: string) => boolean)`
|
|
340
|
-
| `itemToIcon` | `((item: string) => ReactNode)`
|
|
341
|
-
| `itemToLabel` | `((item: string) => ReactNode)`
|
|
342
|
-
| `itemToStringLabel` | `((itemValue: string) => string)`
|
|
343
|
-
| `itemToStringValue` | `((itemValue: string) => string)`
|
|
344
|
-
| `label` | `ReactNode`
|
|
345
|
-
| `maxVisible` | `number`
|
|
346
|
-
| `
|
|
347
|
-
| `
|
|
348
|
-
| `
|
|
349
|
-
| `
|
|
350
|
-
| `
|
|
351
|
-
| `
|
|
352
|
-
| `
|
|
322
|
+
| Prop | Type | Required | Default | Description |
|
|
323
|
+
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
324
|
+
| `action` | `ReactNode` | no | — | Optional node rendered at the trailing edge of the label row (opposite the label) — e.g. a "Forgot password?" link beside a Password label. Presentational placement only; it is a sibling of the `<Label>`, not part of the field's accessible name. Provide an interactive element (`ButtonInline` / `Link`). |
|
|
325
|
+
| `allowClear` | `boolean` | no | — | |
|
|
326
|
+
| `allowCreate` | `boolean` | no | — | |
|
|
327
|
+
| `allowSelectAll` | `boolean` | no | — | |
|
|
328
|
+
| `aria-describedby` | `string` | no | — | |
|
|
329
|
+
| `className` | `string` | no | — | |
|
|
330
|
+
| `empty` | `ReactNode` | no | — | |
|
|
331
|
+
| `focusVariant` | `"off" \| "on" \| "default" \| null` | no | — | |
|
|
332
|
+
| `groupToLabel` | `((group: Group<string>) => ReactNode)` | no | — | |
|
|
333
|
+
| `help` | `ReactNode` | no | — | |
|
|
334
|
+
| `indicator` | `Indicator` | no | — | |
|
|
335
|
+
| `inputClassName` | `string` | no | — | |
|
|
336
|
+
| `items` | `readonly (string \| Group<string>)[]` | no | — | |
|
|
337
|
+
| `itemToChipColor` | `((item: string) => "gray" \| "gray-darker" \| "gray-inverse" \| "green" \| "green-darker" \| "green-inverse" \| "blue" \| "blue-inverse" \| "red" \| "orange" \| "orange-inverse" \| "amber" \| ... 9 more ...)` | no | — | |
|
|
338
|
+
| `itemToChipLabel` | `((item: string) => ReactNode)` | no | — | |
|
|
339
|
+
| `itemToDisabled` | `((item: string) => boolean)` | no | — | |
|
|
340
|
+
| `itemToIcon` | `((item: string) => ReactNode)` | no | — | |
|
|
341
|
+
| `itemToLabel` | `((item: string) => ReactNode)` | no | — | |
|
|
342
|
+
| `itemToStringLabel` | `((itemValue: string) => string)` | no | — | When the item values are objects (`<Combobox.Item value={object}>`), this function converts the object value to a string representation for display in the input. If the shape of the object is `{ value, label }`, the label will be used automatically without needing to specify this prop. |
|
|
343
|
+
| `itemToStringValue` | `((itemValue: string) => string)` | no | — | When the item values are objects (`<Combobox.Item value={object}>`), this function converts the object value to a string representation for form submission. If the shape of the object is `{ value, label }`, the value will be used automatically without needing to specify this prop. |
|
|
344
|
+
| `label` | `ReactNode` | no | — | |
|
|
345
|
+
| `maxVisible` | `number` | no | — | |
|
|
346
|
+
| `pinnedChipLabels` | `ReactNode[]` | no | — | Labels for chips the control shows but the user does not own — a pinned set the caller keeps. - Each label gets a chip of its own, ahead of the values and outside the `maxVisible` slice. - No remove button, and no entry in `value` — there is nothing for a removal to report. |
|
|
347
|
+
| `queryToCreateLabel` | `((query: string) => ReactNode)` | no | — | |
|
|
348
|
+
| `queryToCreateValue` | `((query: string) => string)` | no | — | |
|
|
349
|
+
| `required` | `boolean` | no | — | |
|
|
350
|
+
| `requiredMark` | `RequiredMark` | no | — | Which marker to show beside the label — gated by `required` so it never lies: `'required'` renders `*` only when the field is `required`; `'optional'` renders `(optional)` only when it is not; `'hidden'` renders neither. Defaults to `'required'`. |
|
|
351
|
+
| `sizing` | `"small" \| "medium" \| "default" \| null` | no | — | |
|
|
352
|
+
| `tooltip` | `ReactNode` | no | — | |
|
|
353
|
+
| `variant` | `"primary" \| "secondary" \| null` | no | — | |
|
|
353
354
|
|
|
354
355
|
### `field.CheckboxField`
|
|
355
356
|
|
|
@@ -483,7 +484,7 @@ Source: `src/components/BrandLogo/BrandLogo.tsx`
|
|
|
483
484
|
|
|
484
485
|
Source: `src/blocks/AppShell/AppShell.tsx`
|
|
485
486
|
|
|
486
|
-
> Compound app-root shell that follows the active brand (sidebar vs top-nav). Subcomponents: `AppShell.Sidebar`, `AppShell.Header`, `AppShell.Aside`, `AppShell.Main`. `AppShell.Main` owns the default page gutter (`tw:p-6`) — override with `
|
|
487
|
+
> Compound app-root shell that follows the active brand (sidebar vs top-nav). Subcomponents: `AppShell.Sidebar`, `AppShell.Header`, `AppShell.Aside`, `AppShell.Main`. `AppShell.Main` owns the default page gutter (`tw:p-6`) on a wrapper inside its scroll container — override with `contentClassName="tw:p-0"`, never a `p-*` in `className` (that sits on the scrollport and breaks every sticky header below it, `Table.Header` included). `Main` is also the scrollport by default and its content wrapper grows with the content; pass `clampContent` when the page runs its own `overflow-auto` scroller, so a `flex-1` descendant clamps to the shell instead of resolving against the content. `AppShell.Header` and `AppShell.Aside` take `flush` — pass it when the slot hosts a chrome component that paints itself (`Navbar`, `Sidebar side="right"`), so the slot drops its own padding, background and border instead of insetting the child. Native `<div>` attributes.
|
|
487
488
|
|
|
488
489
|
| Prop | Type | Required | Default | Description |
|
|
489
490
|
| ------------ | -------------------- | -------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
import { cn } from "./classNames-BzrkDnOD.js";
|
|
2
|
-
import { Tooltip, TooltipProvider } from "./utils-
|
|
3
|
-
import { AlertCircle, ChevronDown, ChevronLeft, ChevronRight, CircleCheck, CirclePause, CircleX,
|
|
4
|
-
import { Button } from "./Button-
|
|
5
|
-
import { ClipboardButton } from "./ClipboardButton-
|
|
6
|
-
import { FullScreenModal, FullScreenModalBody, FullScreenModalHeader } from "./FullScreenModal-
|
|
2
|
+
import { Tooltip, TooltipProvider } from "./utils-B5Z52hYs.js";
|
|
3
|
+
import { AlertCircle, ChevronDown, ChevronLeft, ChevronRight, ChevronUp, CircleCheck, CirclePause, CircleX, Loader2, Maximize2, Minimize2, Play, Send, Sparkles, TriangleAlert, X, XCircle } from "./icons-Cek151jC.js";
|
|
4
|
+
import { Button } from "./Button-DsRrU5F1.js";
|
|
5
|
+
import { ClipboardButton } from "./ClipboardButton-D9pDjgkB.js";
|
|
6
|
+
import { FullScreenModal, FullScreenModalBody, FullScreenModalHeader } from "./FullScreenModal-BvPuYibe.js";
|
|
7
7
|
import { Truncated } from "./internal/components/Truncated.js";
|
|
8
|
-
import { HoverCard } from "./HoverCard-
|
|
9
|
-
import { Command } from "./Command-
|
|
10
|
-
import { TextInput } from "./TextInput-
|
|
11
|
-
import { Checkbox } from "./Checkbox-
|
|
8
|
+
import { HoverCard } from "./HoverCard-B9ZMJxjn.js";
|
|
9
|
+
import { Command } from "./Command-B7ML9YMv.js";
|
|
10
|
+
import { TextInput } from "./TextInput-DHM6dHmn.js";
|
|
11
|
+
import { Checkbox } from "./Checkbox-fC0BuO2B.js";
|
|
12
12
|
import { Badge } from "./Badge-Ch26CXoP.js";
|
|
13
13
|
import { Textarea } from "./internal/blocks/Textarea.js";
|
|
14
14
|
import { Table } from "./Table-CvYuTuNU.js";
|
|
15
|
-
import { DiagramSkeleton } from "./DiagramSkeleton
|
|
16
|
-
import { Avatar } from "./internal/components/Avatar.js";
|
|
15
|
+
import { DiagramSkeleton } from "./internal/blocks/DiagramShared/DiagramSkeleton.js";
|
|
17
16
|
import { Progress } from "./internal/components/Progress.js";
|
|
18
17
|
import { Slot } from "@radix-ui/react-slot";
|
|
19
18
|
import { Suspense, isValidElement, lazy, useEffect, useId, useRef, useState } from "react";
|
|
@@ -24,12 +23,12 @@ import ReactMarkdown from "react-markdown";
|
|
|
24
23
|
import remarkGfm from "remark-gfm";
|
|
25
24
|
//#region src/blocks/AIKit/CollapsibleStepHeader.tsx
|
|
26
25
|
const variantClasses = {
|
|
27
|
-
success: "tw:text-
|
|
28
|
-
error: "tw:text-
|
|
29
|
-
processing: "tw:text-
|
|
30
|
-
dismissed: "tw:text-
|
|
26
|
+
success: "tw:text-muted-foreground tw:focus-visible:outline-ring tw:not-disabled:hover:text-foreground",
|
|
27
|
+
error: "tw:text-destructive tw:focus-visible:outline-destructive tw:not-disabled:hover:text-destructive",
|
|
28
|
+
processing: "tw:text-muted-foreground tw:focus-visible:outline-ring tw:not-disabled:hover:text-foreground",
|
|
29
|
+
dismissed: "tw:text-muted-foreground tw:focus-visible:outline-ring tw:not-disabled:hover:text-foreground"
|
|
31
30
|
};
|
|
32
|
-
const iconClasses = "tw:size-
|
|
31
|
+
const iconClasses = "tw:size-3.5 tw:shrink-0 tw:basis-3.5 tw:opacity-70";
|
|
33
32
|
const renderVariantIcon$1 = (variant) => {
|
|
34
33
|
if (variant === "processing") return /* @__PURE__ */ jsx(Loader2, { className: cn(iconClasses, "tw:animate-spin") });
|
|
35
34
|
if (variant === "error") return /* @__PURE__ */ jsx(XCircle, { className: iconClasses });
|
|
@@ -41,12 +40,12 @@ const CollapsibleStepHeader = ({ isExpanded, onToggle, label, variant = "success
|
|
|
41
40
|
type: "button",
|
|
42
41
|
"aria-expanded": isExpanded,
|
|
43
42
|
onClick: onToggle,
|
|
44
|
-
className: cn("tw:flex tw:w-fit tw:items-
|
|
43
|
+
className: cn("tw:flex tw:w-fit tw:items-center tw:gap-1.5 tw:text-left tw:text-xs tw:font-medium tw:transition-colors tw:focus-visible:outline tw:focus-visible:outline-2 tw:focus-visible:outline-offset-2 tw:disabled:opacity-40", variantClasses[variant]),
|
|
45
44
|
children: [renderVariantIcon$1(variant), /* @__PURE__ */ jsxs("span", {
|
|
46
45
|
className: "tw:min-w-0",
|
|
47
46
|
children: [label, /* @__PURE__ */ jsxs("span", {
|
|
48
47
|
className: "tw:whitespace-nowrap",
|
|
49
|
-
children: ["", /* @__PURE__ */ jsx(ChevronDown, { className: cn("tw:ml-
|
|
48
|
+
children: ["", /* @__PURE__ */ jsx(ChevronDown, { className: cn("tw:ml-1.5 tw:inline-block tw:size-3.5 tw:align-middle tw:transition-transform", isExpanded && "tw:rotate-180") })]
|
|
50
49
|
})]
|
|
51
50
|
})]
|
|
52
51
|
});
|
|
@@ -54,24 +53,24 @@ const CollapsibleStepHeader = ({ isExpanded, onToggle, label, variant = "success
|
|
|
54
53
|
//#endregion
|
|
55
54
|
//#region src/blocks/AIKit/InlineStepDetail.tsx
|
|
56
55
|
const InlineStepDetail = ({ children }) => /* @__PURE__ */ jsx("div", {
|
|
57
|
-
className: "tw:ml-2.5 tw:whitespace-pre-wrap tw:border-l tw:border-
|
|
56
|
+
className: "tw:ml-2.5 tw:whitespace-pre-wrap tw:border-l tw:border-border tw:pl-3 tw:text-xs tw:text-muted-foreground",
|
|
58
57
|
children
|
|
59
58
|
});
|
|
60
59
|
//#endregion
|
|
61
60
|
//#region src/blocks/AIKit/InlineStepLabel.tsx
|
|
62
61
|
const renderVariantIcon = (variant) => {
|
|
63
|
-
if (variant === "processing") return /* @__PURE__ */ jsx(Loader2, { className: "tw:size-
|
|
64
|
-
if (variant === "error") return /* @__PURE__ */ jsx(XCircle, { className: "tw:size-
|
|
65
|
-
if (variant === "dismissed") return /* @__PURE__ */ jsx(XCircle, { className: "tw:size-
|
|
66
|
-
return /* @__PURE__ */ jsx(CircleCheck, { className: "tw:size-
|
|
62
|
+
if (variant === "processing") return /* @__PURE__ */ jsx(Loader2, { className: "tw:size-3.5 tw:animate-spin tw:text-muted-foreground" });
|
|
63
|
+
if (variant === "error") return /* @__PURE__ */ jsx(XCircle, { className: "tw:size-3.5 tw:text-destructive" });
|
|
64
|
+
if (variant === "dismissed") return /* @__PURE__ */ jsx(XCircle, { className: "tw:size-3.5 tw:text-muted-foreground/50" });
|
|
65
|
+
return /* @__PURE__ */ jsx(CircleCheck, { className: "tw:size-3.5 tw:text-muted-foreground/50" });
|
|
67
66
|
};
|
|
68
67
|
const InlineStepLabel = ({ variant, children }) => /* @__PURE__ */ jsxs("div", {
|
|
69
68
|
className: "tw:flex tw:min-w-0 tw:items-center tw:gap-1",
|
|
70
69
|
children: [/* @__PURE__ */ jsx("div", {
|
|
71
|
-
className: "tw:flex tw:size-5 tw:shrink-0 tw:items-center tw:justify-center",
|
|
70
|
+
className: "tw:relative tw:flex tw:size-5 tw:shrink-0 tw:items-center tw:justify-center tw:[background:var(--inline-step-surface,transparent)]",
|
|
72
71
|
children: renderVariantIcon(variant)
|
|
73
72
|
}), /* @__PURE__ */ jsx("div", {
|
|
74
|
-
className: "tw:flex tw:min-w-0 tw:flex-wrap tw:items-center tw:gap-x-1.5 tw:gap-y-1 tw:text-
|
|
73
|
+
className: "tw:flex tw:min-w-0 tw:flex-wrap tw:items-center tw:gap-x-1.5 tw:gap-y-1 tw:text-xs tw:font-medium tw:text-muted-foreground",
|
|
75
74
|
children
|
|
76
75
|
})]
|
|
77
76
|
});
|
|
@@ -113,7 +112,7 @@ const MermaidDiagram = lazy(() => import("@keboola/design/mermaid").then((module
|
|
|
113
112
|
console.error("[AIKit] failed to load the MermaidDiagram chunk", error);
|
|
114
113
|
return { default: ({ code }) => /* @__PURE__ */ jsx("pre", { children: /* @__PURE__ */ jsx("code", { children: code }) }) };
|
|
115
114
|
}));
|
|
116
|
-
const proseClass = "tw:prose tw:prose-sm tw:max-w-none tw:break-words tw:[&_pre]:bg-
|
|
115
|
+
const proseClass = "tw:prose tw:prose-sm tw:max-w-none tw:break-words tw:[&_pre]:bg-muted tw:[&_pre]:text-foreground tw:[&_:not(pre)>code]:bg-muted tw:[&_:not(pre)>code]:text-foreground tw:[&_:not(pre)>code]:rounded tw:[&_:not(pre)>code]:px-1 tw:[&_:not(pre)>code]:py-0.5 tw:[&_:not(pre)>code]:before:content-none tw:[&_:not(pre)>code]:after:content-none";
|
|
117
116
|
const getText = (node) => {
|
|
118
117
|
if (typeof node === "string") return node;
|
|
119
118
|
if (typeof node === "number") return String(node);
|
|
@@ -128,7 +127,15 @@ const getLanguage = (element) => {
|
|
|
128
127
|
if (typeof props.className !== "string") return void 0;
|
|
129
128
|
return props.className.match(/language-(\S+)/)?.[1];
|
|
130
129
|
};
|
|
131
|
-
|
|
130
|
+
/**
|
|
131
|
+
* The plugins this renderer always runs.
|
|
132
|
+
*
|
|
133
|
+
* - GFM is part of its contract: tables route through the design `Table`, and autolinks and
|
|
134
|
+
* task lists are what an assistant answer is written in.
|
|
135
|
+
* - A caller's own plugins are appended to these, never substituted for them.
|
|
136
|
+
*/
|
|
137
|
+
const baseRemarkPlugins = [remarkGfm];
|
|
138
|
+
const baseComponents = {
|
|
132
139
|
pre({ children, ...props }) {
|
|
133
140
|
const child = Array.isArray(children) ? children[0] : children;
|
|
134
141
|
if (getLanguage(child) === "mermaid") {
|
|
@@ -207,13 +214,16 @@ const components = {
|
|
|
207
214
|
* `MessageBubble` to render an assistant message body. Code blocks expose a
|
|
208
215
|
* copy button, so mount a `TooltipProvider` once at the app root.
|
|
209
216
|
*/
|
|
210
|
-
const Markdown = ({ children, className }) => {
|
|
217
|
+
const Markdown = ({ children, className, remarkPlugins, components: componentOverrides }) => {
|
|
211
218
|
return /* @__PURE__ */ jsx("div", {
|
|
212
219
|
"data-prose": true,
|
|
213
220
|
className: cn(proseClass, className),
|
|
214
221
|
children: /* @__PURE__ */ jsx(ReactMarkdown, {
|
|
215
|
-
remarkPlugins: [
|
|
216
|
-
components
|
|
222
|
+
remarkPlugins: remarkPlugins === void 0 ? baseRemarkPlugins : [...baseRemarkPlugins, ...remarkPlugins],
|
|
223
|
+
components: componentOverrides === void 0 ? baseComponents : {
|
|
224
|
+
...baseComponents,
|
|
225
|
+
...componentOverrides
|
|
226
|
+
},
|
|
217
227
|
children
|
|
218
228
|
})
|
|
219
229
|
});
|
|
@@ -223,22 +233,31 @@ const Markdown = ({ children, className }) => {
|
|
|
223
233
|
const containerClasses = cva([
|
|
224
234
|
"tw:flex",
|
|
225
235
|
"tw:max-w-full",
|
|
226
|
-
"tw:gap-
|
|
236
|
+
"tw:gap-3"
|
|
227
237
|
], {
|
|
228
238
|
variants: { variant: {
|
|
229
|
-
user: ["tw:justify-
|
|
230
|
-
assistant: [
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
239
|
+
user: ["tw:justify-end"],
|
|
240
|
+
assistant: ["tw:justify-start", "tw:w-full"]
|
|
241
|
+
} },
|
|
242
|
+
defaultVariants: { variant: "assistant" }
|
|
243
|
+
});
|
|
244
|
+
const stackClasses = cva([
|
|
245
|
+
"tw:flex",
|
|
246
|
+
"tw:min-w-0",
|
|
247
|
+
"tw:flex-1",
|
|
248
|
+
"tw:flex-col",
|
|
249
|
+
"tw:gap-2"
|
|
250
|
+
], {
|
|
251
|
+
variants: { variant: {
|
|
252
|
+
user: ["tw:items-end"],
|
|
253
|
+
assistant: []
|
|
235
254
|
} },
|
|
236
255
|
defaultVariants: { variant: "assistant" }
|
|
237
256
|
});
|
|
238
257
|
const contentClasses = cva([
|
|
239
258
|
"tw:flex",
|
|
240
259
|
"tw:flex-col",
|
|
241
|
-
"tw:gap-
|
|
260
|
+
"tw:gap-3",
|
|
242
261
|
"tw:break-words",
|
|
243
262
|
"tw:leading-relaxed",
|
|
244
263
|
"tw:text-foreground",
|
|
@@ -252,33 +271,30 @@ const contentClasses = cva([
|
|
|
252
271
|
"tw:[&>*]:min-w-0"
|
|
253
272
|
],
|
|
254
273
|
user: [
|
|
255
|
-
"tw:max-w-
|
|
274
|
+
"tw:max-w-[min(85%,40rem)]",
|
|
256
275
|
"tw:w-fit",
|
|
257
276
|
"tw:bg-muted",
|
|
258
|
-
"tw:
|
|
259
|
-
"tw:
|
|
260
|
-
"tw:
|
|
277
|
+
"tw:px-3",
|
|
278
|
+
"tw:py-2",
|
|
279
|
+
"tw:rounded-xl",
|
|
261
280
|
"tw:overflow-hidden",
|
|
262
281
|
"tw:break-anywhere"
|
|
263
282
|
]
|
|
264
283
|
} },
|
|
265
284
|
defaultVariants: { variant: "assistant" }
|
|
266
285
|
});
|
|
267
|
-
const MessageBubble = ({ variant, children,
|
|
268
|
-
return /* @__PURE__ */
|
|
286
|
+
const MessageBubble = ({ variant, children, actions, createdAt }) => {
|
|
287
|
+
return /* @__PURE__ */ jsx("div", {
|
|
269
288
|
className: containerClasses({ variant }),
|
|
270
289
|
"data-testid": `chat-message-${variant}`,
|
|
271
|
-
children:
|
|
272
|
-
|
|
273
|
-
size: 30,
|
|
274
|
-
title: createdAt
|
|
275
|
-
}), /* @__PURE__ */ jsxs("div", {
|
|
276
|
-
className: "tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:gap-2",
|
|
290
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
291
|
+
className: stackClasses({ variant }),
|
|
277
292
|
children: [/* @__PURE__ */ jsx("div", {
|
|
278
293
|
className: contentClasses({ variant }),
|
|
294
|
+
title: variant === "user" ? createdAt : void 0,
|
|
279
295
|
children
|
|
280
296
|
}), actions]
|
|
281
|
-
})
|
|
297
|
+
})
|
|
282
298
|
});
|
|
283
299
|
};
|
|
284
300
|
//#endregion
|
|
@@ -665,7 +681,7 @@ const PromptInputSubmit = ({ ref, disabled, status = "ready" }) => {
|
|
|
665
681
|
const icon = (() => {
|
|
666
682
|
if (status === "streaming") return /* @__PURE__ */ jsx(CirclePause, { className: "tw:size-4" });
|
|
667
683
|
if (status === "interrupted") return /* @__PURE__ */ jsx(Play, { className: "tw:size-4" });
|
|
668
|
-
return /* @__PURE__ */ jsx(Send, { className: "tw:size-4" });
|
|
684
|
+
return /* @__PURE__ */ jsx(Send, { className: "tw:size-4 tw:translate-x-[-1px] tw:translate-y-[1px]" });
|
|
669
685
|
})();
|
|
670
686
|
const getTooltipText = () => {
|
|
671
687
|
if (status === "streaming") return "Stop";
|
|
@@ -679,9 +695,9 @@ const PromptInputSubmit = ({ ref, disabled, status = "ready" }) => {
|
|
|
679
695
|
disabled,
|
|
680
696
|
"aria-label": ARIA_LABEL_BY_STATUS[status],
|
|
681
697
|
size: "icon-sm",
|
|
682
|
-
variant: "
|
|
698
|
+
variant: "primary",
|
|
683
699
|
isLoading: status === "submitted",
|
|
684
|
-
className: "tw:ml-auto tw:flex tw:items-center tw:rounded-
|
|
700
|
+
className: cn("tw:ml-auto tw:flex tw:items-center tw:rounded-full", "tw:bg-gradient-to-br tw:from-[#61E4FF] tw:via-[#1F8FFF] tw:to-[#7C5CFF]", "tw:hover:not-disabled:brightness-110"),
|
|
685
701
|
children: status !== "submitted" && icon
|
|
686
702
|
}) })
|
|
687
703
|
}), getTooltipText() && /* @__PURE__ */ jsx(Tooltip.Content, {
|
|
@@ -742,12 +758,16 @@ const wrapperVariants = cva(null, {
|
|
|
742
758
|
inline: ""
|
|
743
759
|
} }
|
|
744
760
|
});
|
|
745
|
-
const PromptInput = ({ onSend, onAbort, onContinue, prefix, variant, suffix, disabled, disableSubmit, value = "", onValueChange, status = "ready", maxRows = 6, minRows, commands, ...textareaProps }) => {
|
|
761
|
+
const PromptInput = ({ onSend, onAbort, onContinue, prefix, variant, suffix, disabled, disableSubmit, value = "", onValueChange, status = "ready", maxRows = 6, minRows, commands, autoFocus, ...textareaProps }) => {
|
|
746
762
|
const defaultMinRows = variant === "inline" ? 1 : 2;
|
|
747
763
|
const isDisabled = (disabled || disableSubmit || !value.trim()) && status !== "streaming" && status !== "interrupted";
|
|
748
764
|
const textareaId = useId();
|
|
749
765
|
const textareaRef = useRef(null);
|
|
750
766
|
const [dismissedValue, setDismissedValue] = useState(null);
|
|
767
|
+
const autoFocusRef = useRef(autoFocus);
|
|
768
|
+
useEffect(() => {
|
|
769
|
+
if (autoFocusRef.current) textareaRef.current?.focus({ preventScroll: true });
|
|
770
|
+
}, []);
|
|
751
771
|
if (dismissedValue !== null && value !== dismissedValue) setDismissedValue(null);
|
|
752
772
|
const hasCommands = !!commands && commands.length > 0;
|
|
753
773
|
const valueLooksLikeSlashCommand = value.startsWith("/") && !/\s/.test(value);
|
|
@@ -878,7 +898,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
|
|
|
878
898
|
else handleCustomFocus();
|
|
879
899
|
};
|
|
880
900
|
return /* @__PURE__ */ jsxs("div", {
|
|
881
|
-
className: cn("tw:flex tw:max-w-[800px] tw:flex-col tw:gap-4 tw:overflow-hidden tw:rounded-xl tw:border tw:border-solid tw:border-border tw:bg-
|
|
901
|
+
className: cn("tw:flex tw:max-w-[800px] tw:flex-col tw:gap-4 tw:overflow-hidden tw:rounded-xl tw:border tw:border-solid tw:border-border tw:bg-card tw:text-card-foreground tw:shadow-lg", className),
|
|
882
902
|
"data-testid": "question-root",
|
|
883
903
|
"data-question-step": currentStep,
|
|
884
904
|
"data-question-total-steps": totalSteps,
|
|
@@ -889,10 +909,10 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
|
|
|
889
909
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
890
910
|
className: "tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:gap-1",
|
|
891
911
|
children: [/* @__PURE__ */ jsx("p", {
|
|
892
|
-
className: "tw:m-0 tw:text-base tw:font-semibold tw:leading-6
|
|
912
|
+
className: "tw:m-0 tw:text-base tw:font-semibold tw:leading-6",
|
|
893
913
|
children: question
|
|
894
914
|
}), header && /* @__PURE__ */ jsx("p", {
|
|
895
|
-
className: "tw:m-0 tw:text-xs tw:leading-4 tw:text-
|
|
915
|
+
className: "tw:m-0 tw:text-xs tw:leading-4 tw:text-muted-foreground",
|
|
896
916
|
children: header
|
|
897
917
|
})]
|
|
898
918
|
}), onClose && /* @__PURE__ */ jsx(Button, {
|
|
@@ -909,7 +929,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
|
|
|
909
929
|
children: /* @__PURE__ */ jsxs("div", {
|
|
910
930
|
className: "tw:flex tw:flex-col tw:gap-4 tw:border-0 tw:border-l tw:border-solid tw:border-primary tw:px-4 tw:py-2",
|
|
911
931
|
children: [options.map((option) => /* @__PURE__ */ jsxs("div", {
|
|
912
|
-
className: "tw:-mx-2 tw:-my-1.5 tw:flex tw:cursor-pointer tw:items-start tw:gap-2 tw:rounded-md tw:px-2 tw:py-1.5 tw:hover:bg-
|
|
932
|
+
className: "tw:-mx-2 tw:-my-1.5 tw:flex tw:cursor-pointer tw:items-start tw:gap-2 tw:rounded-md tw:px-2 tw:py-1.5 tw:hover:bg-accent",
|
|
913
933
|
onClick: () => handleOptionToggle(option.id),
|
|
914
934
|
onKeyDown: handleKeyDown(() => handleOptionToggle(option.id)),
|
|
915
935
|
role: "button",
|
|
@@ -925,16 +945,17 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
|
|
|
925
945
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
926
946
|
className: "tw:flex tw:flex-col tw:gap-1.5",
|
|
927
947
|
children: [/* @__PURE__ */ jsx("span", {
|
|
928
|
-
className: "tw:text-sm tw:font-medium tw:leading-none
|
|
948
|
+
className: "tw:text-sm tw:font-medium tw:leading-none",
|
|
929
949
|
children: option.label
|
|
930
950
|
}), option.description && /* @__PURE__ */ jsx("span", {
|
|
931
951
|
className: "tw:text-sm tw:font-normal tw:leading-5 tw:text-muted-foreground",
|
|
932
952
|
children: option.description
|
|
933
953
|
})]
|
|
934
954
|
}), option.preview && /* @__PURE__ */ jsx("div", {
|
|
935
|
-
|
|
955
|
+
"data-testid": "question-option-preview",
|
|
956
|
+
className: cn("tw:ml-auto tw:flex tw:max-h-40 tw:min-w-0 tw:max-w-[50%] tw:flex-col tw:overflow-hidden tw:rounded-md", !renderPreview && "tw:overflow-auto tw:border tw:border-solid tw:border-border tw:bg-muted tw:p-2 tw:text-foreground"),
|
|
936
957
|
children: renderPreview ? renderPreview(option.preview) : /* @__PURE__ */ jsx("pre", {
|
|
937
|
-
className: "tw:m-0 tw:overflow-visible tw:border-0 tw:bg-transparent tw:p-0 tw:font-mono tw:text-xs tw:leading-5 tw:text-
|
|
958
|
+
className: "tw:m-0 tw:overflow-visible tw:border-0 tw:bg-transparent tw:p-0 tw:font-mono tw:text-xs tw:leading-5 tw:text-foreground",
|
|
938
959
|
children: option.preview
|
|
939
960
|
})
|
|
940
961
|
})]
|
|
@@ -942,7 +963,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
|
|
|
942
963
|
}, option.id)), showCustomAnswer && /* @__PURE__ */ jsxs("div", {
|
|
943
964
|
className: "tw:flex tw:flex-col tw:gap-2",
|
|
944
965
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
945
|
-
className: "tw:-mx-2 tw:-my-1.5 tw:flex tw:cursor-pointer tw:items-start tw:gap-2 tw:rounded-md tw:px-2 tw:py-1.5 tw:hover:bg-
|
|
966
|
+
className: "tw:-mx-2 tw:-my-1.5 tw:flex tw:cursor-pointer tw:items-start tw:gap-2 tw:rounded-md tw:px-2 tw:py-1.5 tw:hover:bg-accent",
|
|
946
967
|
onClick: handleCustomRowClick,
|
|
947
968
|
onKeyDown: handleKeyDown(handleCustomRowClick),
|
|
948
969
|
role: "button",
|
|
@@ -953,7 +974,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
|
|
|
953
974
|
onClick: (e) => e.stopPropagation(),
|
|
954
975
|
className: "tw:shrink-0"
|
|
955
976
|
}), /* @__PURE__ */ jsx("span", {
|
|
956
|
-
className: cn("tw:text-sm tw:font-medium tw:leading-none", !multiSelect && isCustomSelected
|
|
977
|
+
className: cn("tw:text-sm tw:font-medium tw:leading-none", !multiSelect && isCustomSelected && "tw:text-primary"),
|
|
957
978
|
children: "Other"
|
|
958
979
|
})]
|
|
959
980
|
}), /* @__PURE__ */ jsx(TextInput, {
|
|
@@ -980,7 +1001,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
|
|
|
980
1001
|
value: progressValue,
|
|
981
1002
|
className: "tw:rounded-none"
|
|
982
1003
|
}), /* @__PURE__ */ jsxs("div", {
|
|
983
|
-
className: cn("tw:flex tw:items-center tw:justify-end tw:gap-4 tw:px-4 tw:py-3", !hasSteps && "tw:border-0 tw:border-t tw:border-solid tw:border-
|
|
1004
|
+
className: cn("tw:flex tw:items-center tw:justify-end tw:gap-4 tw:px-4 tw:py-3", !hasSteps && "tw:border-0 tw:border-t tw:border-solid tw:border-border"),
|
|
984
1005
|
children: [
|
|
985
1006
|
hasSteps && /* @__PURE__ */ jsxs("div", {
|
|
986
1007
|
className: "tw:flex tw:items-center tw:gap-2",
|
|
@@ -994,7 +1015,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
|
|
|
994
1015
|
children: /* @__PURE__ */ jsx(ChevronLeft, { className: cn("tw:size-5", isFirstStep ? "tw:text-primary/25" : "tw:text-primary") })
|
|
995
1016
|
}),
|
|
996
1017
|
/* @__PURE__ */ jsxs("span", {
|
|
997
|
-
className: "tw:text-xs tw:leading-4 tw:text-
|
|
1018
|
+
className: "tw:text-xs tw:leading-4 tw:text-muted-foreground",
|
|
998
1019
|
children: [
|
|
999
1020
|
currentStep,
|
|
1000
1021
|
" of ",
|
|
@@ -1092,9 +1113,9 @@ const SuggestedPrompt = ({ label, disabled, onClick, icon, className }) => {
|
|
|
1092
1113
|
return /* @__PURE__ */ jsxs("button", {
|
|
1093
1114
|
type: "button",
|
|
1094
1115
|
disabled,
|
|
1095
|
-
className: cn("tailwindcss-preflight tw:flex tw:items-center tw:justify-start tw:gap-2 tw:whitespace-nowrap tw:rounded-lg tw:
|
|
1116
|
+
className: cn("tailwindcss-preflight tw:flex tw:items-center tw:justify-start tw:gap-2.5 tw:whitespace-nowrap", "tw:rounded-lg tw:px-3 tw:py-2", "tw:text-left tw:text-sm tw:font-medium tw:text-foreground", "tw:transition-colors tw:not-disabled:hover:bg-accent", "tw:focus-visible:outline-none tw:focus-visible:ring-2 tw:focus-visible:ring-ring tw:focus-visible:ring-offset-1", "tw:disabled:cursor-not-allowed tw:disabled:opacity-50", className),
|
|
1096
1117
|
onClick,
|
|
1097
|
-
children: [icon ?? /* @__PURE__ */ jsx(
|
|
1118
|
+
children: [icon ?? /* @__PURE__ */ jsx(Sparkles, { className: "tw:size-4 tw:shrink-0 tw:basis-4 tw:[&_*]:stroke-aigradient-600" }), /* @__PURE__ */ jsx("div", {
|
|
1098
1119
|
className: "tw:whitespace-normal tw:text-left",
|
|
1099
1120
|
children: label
|
|
1100
1121
|
})]
|
|
@@ -1104,10 +1125,10 @@ const SuggestedPrompt = ({ label, disabled, onClick, icon, className }) => {
|
|
|
1104
1125
|
//#region src/blocks/AIKit/ThinkingIndicator.tsx
|
|
1105
1126
|
const ThinkingIndicator = ({ label = "Thinking..." }) => {
|
|
1106
1127
|
return /* @__PURE__ */ jsxs("div", {
|
|
1107
|
-
className: "tw:flex tw:items-center tw:gap-
|
|
1128
|
+
className: "tw:flex tw:items-center tw:gap-1.5",
|
|
1108
1129
|
"data-testid": "chat-thinking-indicator",
|
|
1109
|
-
children: [/* @__PURE__ */ jsx(Loader2, { className: "tw:size-
|
|
1110
|
-
className: "tw:text-
|
|
1130
|
+
children: [/* @__PURE__ */ jsx(Loader2, { className: "tw:size-3.5 tw:animate-spin tw:text-muted-foreground" }), /* @__PURE__ */ jsx("span", {
|
|
1131
|
+
className: "tw:text-xs tw:font-medium tw:text-muted-foreground",
|
|
1111
1132
|
children: label
|
|
1112
1133
|
})]
|
|
1113
1134
|
});
|
|
@@ -1258,6 +1279,63 @@ const ToolCallChip = ({ label, state, icon, trailing, onClick, className }) => {
|
|
|
1258
1279
|
});
|
|
1259
1280
|
};
|
|
1260
1281
|
//#endregion
|
|
1282
|
+
//#region src/blocks/AIKit/ToolCallStatusHeader.tsx
|
|
1283
|
+
const headerVariants = cva("tw:flex tw:items-center tw:justify-between tw:gap-2 tw:px-2.5 tw:py-1.5", {
|
|
1284
|
+
variants: { status: {
|
|
1285
|
+
processing: "tw:border-b tw:border-border/60",
|
|
1286
|
+
warning: "tw:bg-warning/10",
|
|
1287
|
+
success: "tw:border-b tw:border-border/60",
|
|
1288
|
+
error: "tw:bg-destructive/10"
|
|
1289
|
+
} },
|
|
1290
|
+
defaultVariants: { status: "success" }
|
|
1291
|
+
});
|
|
1292
|
+
const statusInk = {
|
|
1293
|
+
processing: "tw:text-muted-foreground",
|
|
1294
|
+
warning: "tw:text-warning",
|
|
1295
|
+
success: "tw:text-muted-foreground",
|
|
1296
|
+
error: "tw:text-destructive"
|
|
1297
|
+
};
|
|
1298
|
+
const statusIconInk = {
|
|
1299
|
+
processing: "tw:text-muted-foreground",
|
|
1300
|
+
warning: "tw:text-warning",
|
|
1301
|
+
success: "tw:text-success/70",
|
|
1302
|
+
error: "tw:text-destructive"
|
|
1303
|
+
};
|
|
1304
|
+
const ToolCallStatusHeader = ({ icon: IconComponent, iconSpin, status, text, needsConfirmation, isCollapsible, isCollapsed, onToggleCollapse }) => {
|
|
1305
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
1306
|
+
role: isCollapsible ? "button" : void 0,
|
|
1307
|
+
tabIndex: isCollapsible ? 0 : void 0,
|
|
1308
|
+
"aria-expanded": isCollapsible ? !isCollapsed : void 0,
|
|
1309
|
+
"data-status": status,
|
|
1310
|
+
className: cn(headerVariants({ status }), isCollapsible && "tw:cursor-pointer"),
|
|
1311
|
+
onClick: isCollapsible ? onToggleCollapse : void 0,
|
|
1312
|
+
onKeyDown: isCollapsible ? (e) => {
|
|
1313
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
1314
|
+
e.preventDefault();
|
|
1315
|
+
onToggleCollapse?.();
|
|
1316
|
+
}
|
|
1317
|
+
} : void 0,
|
|
1318
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
1319
|
+
className: "tw:flex tw:min-w-0 tw:flex-1 tw:items-center tw:gap-1.5",
|
|
1320
|
+
children: [/* @__PURE__ */ jsx(IconComponent, { className: cn("tw:size-3.5 tw:shrink-0", statusIconInk[status], iconSpin && "tw:animate-spin") }), /* @__PURE__ */ jsx("span", {
|
|
1321
|
+
"data-testid": "tool-status-text",
|
|
1322
|
+
className: cn("tw:truncate tw:pr-0.5 tw:text-xs tw:font-medium", statusInk[status]),
|
|
1323
|
+
children: text
|
|
1324
|
+
})]
|
|
1325
|
+
}), (needsConfirmation || isCollapsible) && /* @__PURE__ */ jsxs("div", {
|
|
1326
|
+
className: "tw:flex tw:shrink-0 tw:items-center tw:gap-2",
|
|
1327
|
+
children: [needsConfirmation && /* @__PURE__ */ jsxs("div", {
|
|
1328
|
+
className: "tw:flex tw:items-center tw:gap-1",
|
|
1329
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
1330
|
+
"data-testid": "tool-confirmation-required",
|
|
1331
|
+
className: "tw:text-xs tw:font-medium tw:text-warning",
|
|
1332
|
+
children: "Confirmation required"
|
|
1333
|
+
}), /* @__PURE__ */ jsx(TriangleAlert, { className: "tw:size-3.5 tw:text-warning" })]
|
|
1334
|
+
}), isCollapsible && (isCollapsed ? /* @__PURE__ */ jsx(ChevronDown, { className: "tw:size-3.5 tw:shrink-0 tw:text-muted-foreground" }) : /* @__PURE__ */ jsx(ChevronUp, { className: "tw:size-3.5 tw:shrink-0 tw:text-muted-foreground" }))]
|
|
1335
|
+
})]
|
|
1336
|
+
});
|
|
1337
|
+
};
|
|
1338
|
+
//#endregion
|
|
1261
1339
|
//#region src/blocks/AIKit/usageStatsHelpers.ts
|
|
1262
1340
|
/** Clamp a percentage to 0–100 and normalize non-finite input to 0. */
|
|
1263
1341
|
const clampPercentage = (value) => Number.isFinite(value) ? Math.min(100, Math.max(0, value)) : 0;
|
|
@@ -1296,15 +1374,17 @@ const UsageStatsRing = ({ value, size = 16, strokeWidth = 2.5, className }) => {
|
|
|
1296
1374
|
//#endregion
|
|
1297
1375
|
//#region src/blocks/AIKit/UsageStats.tsx
|
|
1298
1376
|
const UsageStats = ({ value, alert = false, children, className, ariaLabel, align = "end", side = "top", sideOffset = 8 }) => {
|
|
1299
|
-
const
|
|
1377
|
+
const hasAlert = Boolean(alert);
|
|
1378
|
+
const isWarning = alert === "warning";
|
|
1379
|
+
const defaultLabel = `Usage: ${Math.round(clampPercentage(value))}%${hasAlert ? " (usage alert)" : ""}`;
|
|
1300
1380
|
return /* @__PURE__ */ jsxs(HoverCard, { children: [/* @__PURE__ */ jsx(HoverCard.Trigger, {
|
|
1301
1381
|
asChild: true,
|
|
1302
1382
|
children: /* @__PURE__ */ jsxs("span", {
|
|
1303
1383
|
"aria-label": ariaLabel ?? defaultLabel,
|
|
1304
1384
|
className: cn("tw:relative tw:inline-flex tw:size-8 tw:items-center tw:justify-center", className),
|
|
1305
|
-
children: [/* @__PURE__ */ jsx(UsageStatsRing, { value }),
|
|
1385
|
+
children: [/* @__PURE__ */ jsx(UsageStatsRing, { value }), hasAlert && /* @__PURE__ */ jsx(AlertCircle, {
|
|
1306
1386
|
"data-testid": "usage-stats-alert",
|
|
1307
|
-
className: "tw:absolute tw:-right-0.5 tw:-top-0.5 tw:size-3 tw:text-error-500"
|
|
1387
|
+
className: cn("tw:absolute tw:-right-0.5 tw:-top-0.5 tw:size-3", isWarning ? "tw:text-warning-500" : "tw:text-error-500")
|
|
1308
1388
|
})]
|
|
1309
1389
|
})
|
|
1310
1390
|
}), /* @__PURE__ */ jsx(HoverCard.Content, {
|
|
@@ -1315,6 +1395,6 @@ const UsageStats = ({ value, alert = false, children, className, ariaLabel, alig
|
|
|
1315
1395
|
})] });
|
|
1316
1396
|
};
|
|
1317
1397
|
//#endregion
|
|
1318
|
-
export { AnswerSummary, CollapsibleStepHeader, InlineStepDetail, InlineStepLabel, Markdown, MessageBubble, PlanApproval, PlanRewritingIndicator, PromptInput, Question, QuestionBlock, SuggestedPrompt, ThinkingIndicator, ToolCallApproval, ToolCallChip, UsageStats, UsageStatsRing };
|
|
1398
|
+
export { AnswerSummary, CollapsibleStepHeader, InlineStepDetail, InlineStepLabel, Markdown, MessageBubble, PlanApproval, PlanRewritingIndicator, PromptInput, Question, QuestionBlock, SuggestedPrompt, ThinkingIndicator, ToolCallApproval, ToolCallChip, ToolCallStatusHeader, UsageStats, UsageStatsRing };
|
|
1319
1399
|
|
|
1320
|
-
//# sourceMappingURL=AIKit-
|
|
1400
|
+
//# sourceMappingURL=AIKit-DDg5DBCG.js.map
|