@sybilion/uilib 1.2.22 → 1.2.24

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 (42) hide show
  1. package/dist/esm/components/icons/CsvIcon/CsvIcon.js +8 -0
  2. package/dist/esm/components/icons/CsvIcon/csv.svg.js +24 -0
  3. package/dist/esm/components/ui/AppHeader/AppHeader.styl.js +1 -1
  4. package/dist/esm/components/ui/Card/Card.styl.js +1 -1
  5. package/dist/esm/components/ui/Chat/ChatChrome/ChatChrome.js +1 -1
  6. package/dist/esm/components/ui/Chat/ChatMessage/ChatMessage.styl.js +1 -1
  7. package/dist/esm/components/ui/Chat/ChatMessage/UserCsvAttachmentBubble.js +1 -1
  8. package/dist/esm/components/ui/Chat/ChatPrompt/ChatPrompt.helpers.js +31 -0
  9. package/dist/esm/components/ui/Chat/ChatPrompt/ChatPrompt.js +11 -3
  10. package/dist/esm/components/ui/Chat/ChatPrompt/ChatPrompt.styl.js +2 -2
  11. package/dist/esm/components/ui/NavUserHeader/NavUserHeader.js +5 -2
  12. package/dist/esm/components/ui/WorkspaceAppSwitcher/WorkspaceAppSwitcher.js +1 -1
  13. package/dist/esm/components/ui/WorkspaceAppSwitcher/WorkspaceAppSwitcher.styl.js +2 -2
  14. package/dist/esm/index.js +1 -0
  15. package/dist/esm/types/src/components/ui/Chat/Chat.types.d.ts +2 -0
  16. package/dist/esm/types/src/components/ui/Chat/ChatPrompt/ChatPrompt.d.ts +1 -1
  17. package/dist/esm/types/src/components/ui/Chat/ChatPrompt/ChatPrompt.helpers.d.ts +6 -0
  18. package/dist/esm/types/src/components/ui/Chat/index.d.ts +1 -0
  19. package/dist/esm/types/src/sybilion-auth/SybilionAuthProvider.d.ts +1 -1
  20. package/package.json +4 -4
  21. package/src/components/icons/CsvIcon/CsvIcon.tsx +5 -0
  22. package/src/components/icons/CsvIcon/csv.svg +4 -0
  23. package/src/components/ui/AppHeader/AppHeader.styl +4 -0
  24. package/src/components/ui/Card/Card.styl +1 -0
  25. package/src/components/ui/Chat/Chat.types.ts +2 -0
  26. package/src/components/ui/Chat/ChatChrome/ChatChrome.tsx +1 -0
  27. package/src/components/ui/Chat/ChatMessage/ChatMessage.styl +6 -11
  28. package/src/components/ui/Chat/ChatMessage/UserCsvAttachmentBubble.tsx +2 -2
  29. package/src/components/ui/Chat/ChatPrompt/ChatPrompt.helpers.ts +43 -0
  30. package/src/components/ui/Chat/ChatPrompt/ChatPrompt.styl +36 -20
  31. package/src/components/ui/Chat/ChatPrompt/ChatPrompt.styl.d.ts +2 -1
  32. package/src/components/ui/Chat/ChatPrompt/ChatPrompt.tsx +28 -13
  33. package/src/components/ui/Chat/index.ts +1 -0
  34. package/src/components/ui/NavUserHeader/NavUserHeader.tsx +9 -3
  35. package/src/components/ui/WorkspaceAppSwitcher/WorkspaceAppSwitcher.styl +12 -0
  36. package/src/components/ui/WorkspaceAppSwitcher/WorkspaceAppSwitcher.styl.d.ts +1 -0
  37. package/src/components/ui/WorkspaceAppSwitcher/WorkspaceAppSwitcher.tsx +1 -1
  38. package/src/docs/pages/StandaloneAppLayoutPage/StandaloneAppLayoutPage.tsx +5 -7
  39. package/src/sybilion-auth/SybilionAuthProvider.tsx +1 -1
  40. package/dist/esm/components/ui/Chat/ChatMessage/icons/CsvIcon.js +0 -8
  41. package/src/components/ui/Chat/ChatMessage/icons/CsvIcon.tsx +0 -7
  42. /package/dist/esm/types/src/components/{ui/Chat/ChatMessage/icons → icons/CsvIcon}/CsvIcon.d.ts +0 -0
@@ -0,0 +1,8 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import CsvSvg from './csv.svg.js';
3
+
4
+ function CsvIcon({ size = 32 }) {
5
+ return jsx(CsvSvg, { width: size, height: size, "aria-hidden": true });
6
+ }
7
+
8
+ export { CsvIcon };
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+
3
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
4
+ var SvgCsv = function SvgCsv(props) {
5
+ return /*#__PURE__*/React.createElement("svg", _extends({
6
+ xmlns: "http://www.w3.org/2000/svg",
7
+ viewBox: "0 0 24 24"
8
+ }, props), /*#__PURE__*/React.createElement("path", {
9
+ fill: "#00a04e",
10
+ d: "M4.433 1.174c25.194-.106-5.93.182 14.987-.001.405.004.405.004.61.129.109.19.116.352.112.566-.01 3.297-.015 6.595-.029 9.893l.112-.004c.562-.017-.045.002 1.004-.024.197.038.266.11.385.27.062 2.563.035 5.128.03 7.692-.039.197-.117.27-.272.394-.415.043-.841.014-1.259 0q.017 1.22.03 2.44a.56.56 0 0 1-.18.317c-1.942.17-14.937.077-15.717.084-.46-.005-.46-.005-.61-.148a.57.57 0 0 1-.11-.39c.009-.767.014-1.535.027-2.303-.372.013-.744.019-1.116.028-.196-.038-.26-.117-.385-.27-.074-2.558-.034-5.13-.03-7.693.04-.2.109-.272.272-.393.415-.044.842-.014 1.26 0-.062-3.337.028-6.676-.032-10.013a.8.8 0 0 1 .114-.446c.255-.155.505-.13.797-.128m-.008.903v9.684h14.817V2.077Zm2.19 12.183c-.49.664-.597 1.45-.48 2.25.143.74.644 1.272 1.34 1.497.75.238 2.112-.06 2.325-1.356-.66-.237-.696-.242-.841-.24-.34.863-1 1.085-1.484.676-.693-.587-.45-1.823-.145-2.373.124-.08.559-.318 1.077-.139.22.15.358.334.473.575.297-.028.58-.074.871-.145a1.35 1.35 0 0 0-.445-.935c-.785-.619-1.99-.479-2.69.19m4.068-.15c-.435.461-.303 1.023-.228 1.24.175.395.463.552.854.706.438.217 1.085.13 1.395.547.067.145.076.4-.142.548-.343.114-.711.156-1.048.003-.202-.197-.303-.386-.408-.648l-.872.048c.014.416.138.806.431 1.114.512.406 1.123.425 1.748.387.366-.05.696-.181.969-.435.268-.37.323-.713.29-1.162-.06-.317-.238-.57-.484-.775-.376-.221-.821-.317-1.24-.425-.252-.067-.58-.19-.648-.301-.069-.112-.027-.257.048-.34.075-.082.363-.112.581-.114a.67.67 0 0 1 .581.211c.066.111.1.217.145.34.31.01.615.008.92-.05-.048-.39-.115-.724-.422-.991-.71-.491-1.818-.481-2.47.098m3.231-.365c.386 1.447.95 2.848 1.453 4.261h.968c.239-.644 1.51-4.082 1.501-4.261h-.92c-.356.876-.657 2.013-.968 2.808l-.145.049-.037-.182c-.255-.903-.578-1.787-.883-2.675zm-9.49 6.343v1.937h14.817v-1.937z",
11
+ style: {
12
+ strokeWidth: 0.0484209
13
+ }
14
+ }), /*#__PURE__*/React.createElement("path", {
15
+ fill: "#009649",
16
+ d: "M6.402 9.406c3.535-.028 7.565.04 11-.002.29.005.619.093.61.468-.036.436-.435.468-.63.467-3.155.025-9.165-.022-11.117.001-.29-.004-.594-.13-.612-.468.02-.426.433-.468.749-.466m-.112-2.71c3.536-.028 7.565.04 11-.002.29.004.62.092.612.468-.037.436-.436.468-.63.467-3.156.024-9.166-.022-11.118.001-.291-.004-.594-.13-.612-.468.02-.426.433-.468.749-.466m-.075-2.822c3.536-.027 7.565.04 11-.001.29.004.619.092.611.468-.036.436-.436.467-.63.466-3.155.025-9.165-.021-11.117.002-.292-.004-.595-.13-.612-.468.019-.427.433-.469.748-.467",
17
+ style: {
18
+ strokeWidth: 0.0484209
19
+ }
20
+ }));
21
+ };
22
+ var CsvSvg = SvgCsv;
23
+
24
+ export { CsvSvg as default };
@@ -1,6 +1,6 @@
1
1
  import styleInject from 'style-inject';
2
2
 
3
- var css_248z = "@media (max-width:768px){:root{--page-x-padding:var(--p-6);--page-y-padding:var(--p-6)}}.AppHeader_root__SdbDv{align-items:center;align-self:flex-end;background-color:var(--color-background);display:flex;max-width:calc(100vw - var(--sidebar-width) - var(--p-3));min-height:var(--header-height);padding-right:var(--p-2);width:100%}@media (min-width:768px){[data-slot=sidebar-wrapper][data-state=collapsed] .AppHeader_root__SdbDv{max-width:100%;padding-left:200px}}.AppHeader_content__kyxem{align-items:center;display:flex;gap:2rem;justify-content:flex-end;padding:0 var(--p-9);width:100%}.AppHeader_logo__v31FX{align-items:center;color:var(--color-foreground);display:flex;font-size:1.5rem;font-weight:400;gap:.5rem;text-decoration:none;white-space:nowrap}.AppHeader_logo__v31FX svg{display:inline-flex;height:32px;transition:transform .1s ease-in-out;width:auto}.AppHeader_logo__v31FX:hover svg{transform:scale(1.05)}.AppHeader_nav__ahN1p{align-items:center;display:flex;flex:1;gap:1.5rem;justify-content:center}@media (max-width:units(768px,\"px\")){.AppHeader_nav__ahN1p{display:none}}.AppHeader_navLink__z43jY{color:var(--color-muted-foreground);font-size:.875rem;font-weight:400;text-decoration:none;transition:color .2s ease}.AppHeader_navLink__z43jY:hover{color:var(--color-foreground)}.AppHeader_actions__QuxEF{align-items:center;display:flex;gap:var(--p-4);margin-right:var(--p-2)}@media (max-width:units(768px,\"px\")){.AppHeader_actions__QuxEF{gap:var(--p-1)}}.AppHeader_pageHeaderActionsAnchor__qzQMs{align-items:center;display:flex;flex-shrink:0;gap:var(--p-4)}";
3
+ var css_248z = "@media (max-width:768px){:root{--page-x-padding:var(--p-6);--page-y-padding:var(--p-6)}}.AppHeader_root__SdbDv{align-items:center;align-self:flex-end;background-color:var(--color-background);display:flex;max-width:calc(100vw - var(--sidebar-width) - var(--p-3));min-height:var(--header-height);padding-right:var(--p-2);width:100%}@media (max-width:768px){.AppHeader_root__SdbDv{max-width:100%;padding-left:200px}}@media (min-width:768px){[data-slot=sidebar-wrapper][data-state=collapsed] .AppHeader_root__SdbDv{max-width:100%;padding-left:200px}}.AppHeader_content__kyxem{align-items:center;display:flex;gap:2rem;justify-content:flex-end;padding:0 var(--p-9);width:100%}.AppHeader_logo__v31FX{align-items:center;color:var(--color-foreground);display:flex;font-size:1.5rem;font-weight:400;gap:.5rem;text-decoration:none;white-space:nowrap}.AppHeader_logo__v31FX svg{display:inline-flex;height:32px;transition:transform .1s ease-in-out;width:auto}.AppHeader_logo__v31FX:hover svg{transform:scale(1.05)}.AppHeader_nav__ahN1p{align-items:center;display:flex;flex:1;gap:1.5rem;justify-content:center}@media (max-width:units(768px,\"px\")){.AppHeader_nav__ahN1p{display:none}}.AppHeader_navLink__z43jY{color:var(--color-muted-foreground);font-size:.875rem;font-weight:400;text-decoration:none;transition:color .2s ease}.AppHeader_navLink__z43jY:hover{color:var(--color-foreground)}.AppHeader_actions__QuxEF{align-items:center;display:flex;gap:var(--p-4);margin-right:var(--p-2)}@media (max-width:units(768px,\"px\")){.AppHeader_actions__QuxEF{gap:var(--p-1)}}.AppHeader_pageHeaderActionsAnchor__qzQMs{align-items:center;display:flex;flex-shrink:0;gap:var(--p-4)}";
4
4
  var S = {"root":"AppHeader_root__SdbDv","content":"AppHeader_content__kyxem","logo":"AppHeader_logo__v31FX","nav":"AppHeader_nav__ahN1p","navLink":"AppHeader_navLink__z43jY","actions":"AppHeader_actions__QuxEF","pageHeaderActionsAnchor":"AppHeader_pageHeaderActionsAnchor__qzQMs"};
5
5
  styleInject(css_248z);
6
6
 
@@ -1,6 +1,6 @@
1
1
  import styleInject from 'style-inject';
2
2
 
3
- var css_248z = "@media (max-width:768px){:root{--page-x-padding:var(--p-6);--page-y-padding:var(--p-6)}}.Card_root__8q1qb{background-color:var(--card);border-radius:20px;color:var(--card-foreground);display:flex;flex-direction:column;gap:var(--p-4);max-height:100%;position:relative}.Card_root__8q1qb.Card_padding-s__lpLdw{padding:var(--p-4)}.Card_root__8q1qb.Card_padding-m__TvrUr{padding:var(--p-6)}.Card_root__8q1qb.Card_padding-l__lRXKf{padding:var(--p-8)}.Card_header__5P3LR{align-items:flex-start;display:flex;flex-direction:column;font-size:var(--text-base);justify-content:space-between}.Card_header__5P3LR:has([data-slot=card-action]){grid-template-columns:1fr auto}.Card_icon__-gwqq{align-items:center;border-radius:calc(var(--p-4) - 2px);box-shadow:inset 0 0 0 1px var(--border);display:flex;flex-shrink:0;height:var(--p-12);justify-content:center;width:var(--p-12)}.Card_icon__-gwqq.Card_withBackground__v0pKJ{background:var(--page-color);box-shadow:none}.Card_icon__-gwqq>img,.Card_icon__-gwqq>svg{height:var(--p-5);width:var(--p-5)}.Card_headerText__GEqp9{flex-grow:1;overflow:hidden}.Card_scroll__iUPCa{max-height:100%;overflow:hidden;padding-right:var(--p-6);width:calc(100% + var(--p-6))}.Card_scroll__iUPCa [data-slot=card-content]{padding-right:1px}.Card_centered__BIpG2,.Card_fullHeight__EU9J4{display:flex;flex-direction:column}.Card_centered__BIpG2{align-items:center;justify-content:center}.Card_fullHeight__EU9J4{flex-grow:1}.Card_description__gjvqz,.Card_title__wDAJw{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.Card_title__wDAJw{font-size:var(--text-lg);font-weight:500;line-height:var(--p-7);overflow:hidden}.Card_description__gjvqz{color:var(--muted-foreground);font-size:var(--text-sm);max-width:100%;word-break:break-word}.Card_action__Y2YHY{grid-column-start:2;grid-row-span:2;align-self:start;grid-row-start:1;justify-self:end}.Card_footer__T0BW7{align-items:center;display:flex;flex-shrink:0;justify-content:space-between;overflow:hidden}.Card_footer__T0BW7.border-t{padding-top:24px}";
3
+ var css_248z = "@media (max-width:768px){:root{--page-x-padding:var(--p-6);--page-y-padding:var(--p-6)}}.Card_root__8q1qb{background-color:var(--card);border-radius:20px;color:var(--card-foreground);display:flex;flex-direction:column;gap:var(--p-4);max-height:100%;position:relative}.Card_root__8q1qb.Card_padding-s__lpLdw{padding:var(--p-4)}.Card_root__8q1qb.Card_padding-m__TvrUr{padding:var(--p-6)}.Card_root__8q1qb.Card_padding-l__lRXKf{padding:var(--p-8)}.Card_header__5P3LR{align-items:flex-start;display:flex;flex-direction:column;font-size:var(--text-base);justify-content:space-between}.Card_header__5P3LR:has([data-slot=card-action]){grid-template-columns:1fr auto}.Card_icon__-gwqq{align-items:center;border-radius:calc(var(--p-4) - 2px);box-shadow:inset 0 0 0 1px var(--border);display:flex;flex-shrink:0;height:var(--p-12);justify-content:center;width:var(--p-12)}.Card_icon__-gwqq.Card_withBackground__v0pKJ{background:var(--page-color);box-shadow:none}.Card_icon__-gwqq>img,.Card_icon__-gwqq>svg{height:var(--p-5);width:var(--p-5)}.Card_headerText__GEqp9{flex-grow:1;overflow:hidden;width:100%}.Card_scroll__iUPCa{max-height:100%;overflow:hidden;padding-right:var(--p-6);width:calc(100% + var(--p-6))}.Card_scroll__iUPCa [data-slot=card-content]{padding-right:1px}.Card_centered__BIpG2,.Card_fullHeight__EU9J4{display:flex;flex-direction:column}.Card_centered__BIpG2{align-items:center;justify-content:center}.Card_fullHeight__EU9J4{flex-grow:1}.Card_description__gjvqz,.Card_title__wDAJw{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.Card_title__wDAJw{font-size:var(--text-lg);font-weight:500;line-height:var(--p-7);overflow:hidden}.Card_description__gjvqz{color:var(--muted-foreground);font-size:var(--text-sm);max-width:100%;word-break:break-word}.Card_action__Y2YHY{grid-column-start:2;grid-row-span:2;align-self:start;grid-row-start:1;justify-self:end}.Card_footer__T0BW7{align-items:center;display:flex;flex-shrink:0;justify-content:space-between;overflow:hidden}.Card_footer__T0BW7.border-t{padding-top:24px}";
4
4
  var S = {"root":"Card_root__8q1qb","padding-s":"Card_padding-s__lpLdw","padding-m":"Card_padding-m__TvrUr","padding-l":"Card_padding-l__lRXKf","header":"Card_header__5P3LR","icon":"Card_icon__-gwqq","withBackground":"Card_withBackground__v0pKJ","headerText":"Card_headerText__GEqp9","scroll":"Card_scroll__iUPCa","centered":"Card_centered__BIpG2","fullHeight":"Card_fullHeight__EU9J4","title":"Card_title__wDAJw","description":"Card_description__gjvqz","action":"Card_action__Y2YHY","footer":"Card_footer__T0BW7"};
5
5
  styleInject(css_248z);
6
6
 
@@ -42,7 +42,7 @@ function ChatChrome({ showResizeHandle, resizeHandle, onClose, isEmpty, renderPr
42
42
  })
43
43
  : null, isScriptComplete &&
44
44
  onGenerateDashboard &&
45
- !generatingDashboard ? (jsxs(Button, { type: "button", variant: "default", size: "lg", disabled: isLoading, onClick: onGenerateDashboardClick, children: [jsx(ChartLineIcon, {}), "Generate Dashboard"] })) : null] })), showInlinePresets && renderPresets('inline'), isLoading && isLastMessageFromUser && (jsx(TextShimmer, { duration: 1, spread: 5, className: S.loader, children: "Thinking..." }))] }) })), jsx("div", { className: cn(S.footer, footerClassName), children: jsx(Chat.Prompt, { onSubmit: onPromptSubmit, disabled: isLoading, prefillMessage: promptPrefill ?? undefined }) })] }) })] }));
45
+ !generatingDashboard ? (jsxs(Button, { type: "button", variant: "default", size: "lg", disabled: isLoading, onClick: onGenerateDashboardClick, children: [jsx(ChartLineIcon, {}), "Generate Dashboard"] })) : null] })), showInlinePresets && renderPresets('inline'), isLoading && isLastMessageFromUser && (jsx(TextShimmer, { duration: 1, spread: 5, className: S.loader, children: "Thinking..." }))] }) })), jsx("div", { className: cn(S.footer, footerClassName), children: jsx(Chat.Prompt, { onSubmit: onPromptSubmit, disabled: isLoading, prefillMessage: promptPrefill ?? undefined, showNotice: isEmpty }) })] }) })] }));
46
46
  }
47
47
 
48
48
  export { ChatChrome };
@@ -1,6 +1,6 @@
1
1
  import styleInject from 'style-inject';
2
2
 
3
- var css_248z = ".ChatMessage_root__6rnsF{background:var(--bg-secondary);display:flex;flex-direction:column;gap:var(--p-1);padding:var(--p-6)}.ChatMessage_text__Y1XNR{color:var(--text-secondary);font-size:var(--text-sm);max-width:100%;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:-moz-fit-content;width:fit-content}.ChatMessage_role-user__u4JPV{align-items:flex-end}.ChatMessage_role-user__u4JPV .ChatMessage_userColumn__cQM6-{align-items:flex-end;display:flex;flex-direction:column;gap:var(--p-2);max-width:100%}.ChatMessage_role-user__u4JPV .ChatMessage_text__Y1XNR{background-color:var(--sb-slate-100);border-radius:var(--p-4);border-bottom-right-radius:0;padding:var(--p-3) var(--p-4);white-space:pre-wrap}.dark .ChatMessage_role-user__u4JPV .ChatMessage_text__Y1XNR{background-color:var(--sb-gray-800)}.ChatMessage_role-user__u4JPV .ChatMessage_userCsvCard__D1M7y{align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--sb-slate-100);border:0;border-radius:var(--p-4);border-bottom-right-radius:0;box-shadow:0 0 0 1px var(--border);color:var(--sb-green-600);cursor:pointer;display:flex;font:inherit;gap:var(--p-4);margin:0;max-width:100%;padding:var(--p-3);padding-right:var(--p-4);text-align:left;transition:background-color .15s;width:-moz-fit-content;width:fit-content}.ChatMessage_role-user__u4JPV .ChatMessage_userCsvCard__D1M7y:hover{background-color:var(--sb-gray-50)}.ChatMessage_role-user__u4JPV .ChatMessage_userCsvCard__D1M7y:focus-visible{outline:2px solid var(--ring);outline-offset:2px}.dark .ChatMessage_role-user__u4JPV .ChatMessage_userCsvCard__D1M7y{background-color:var(--sb-gray-800);color:var(--sb-green-400)}.dark .ChatMessage_role-user__u4JPV .ChatMessage_userCsvCard__D1M7y:hover{background-color:var(--sb-gray-900)}.ChatMessage_role-user__u4JPV .ChatMessage_userCsvCardIcon__0-KS6{align-items:center;display:flex;flex-shrink:0;height:32px;justify-content:center;width:32px}.ChatMessage_role-user__u4JPV .ChatMessage_userCsvCardContent__LoMGE{display:flex;flex:1;flex-direction:column;min-width:0}.ChatMessage_role-user__u4JPV .ChatMessage_userCsvCardTitle__9W76E{color:var(--text-secondary);font-size:var(--text-base);font-weight:600;line-height:1.4}.ChatMessage_role-user__u4JPV .ChatMessage_userCsvCardSubtitle__YZeHv{color:var(--muted-foreground);font-size:var(--text-sm);line-height:1.4}.ChatMessage_role-system__g13OP{align-items:center}.ChatMessage_role-system__g13OP .ChatMessage_text__Y1XNR{color:var(--muted-foreground);font-size:var(--text-xs);width:100%}.ChatMessage_role-assistant__wketE .ChatMessage_text__Y1XNR{width:100%}.ChatMessage_role-assistant__wketE h3{line-height:2.4}.ChatMessage_role-assistant__wketE h4{font-size:1.1em;font-weight:600;line-height:2.2}.ChatMessage_role-assistant__wketE .ChatMessage_bullet__6vAhq{display:inline-block;margin-left:4px;margin-right:6px}.ChatMessage_role-assistant__wketE .ChatMessage_bullet__6vAhq:before{color:var(--text-secondary);content:\"•\";display:inline-block}.ChatMessage_role-assistant__wketE .ChatMessage_scrollHorizontal__Rms9n{max-width:100%}.ChatMessage_role-assistant__wketE table{border:1px solid var(--border);border-collapse:collapse;border-radius:var(--p-2);border-spacing:0;margin:var(--p-4) 0;overflow:hidden}.ChatMessage_role-assistant__wketE table td,.ChatMessage_role-assistant__wketE table th{border:1px solid var(--border);min-width:100px;padding:var(--p-1)}.ChatMessage_role-assistant__wketE table th{text-align:left}.ChatMessage_role-assistant__wketE ol,.ChatMessage_role-assistant__wketE ul{padding-left:var(--p-4)}.ChatMessage_role-assistant__wketE ul{list-style-type:disc}.ChatMessage_role-assistant__wketE ol{list-style-type:decimal}.ChatMessage_role-assistant__wketE .ChatMessage_datasetAppLink__Pxy-T{align-items:center;border:1px dashed var(--sb-slate-300);border-radius:8px;color:var(--foreground);display:inline-flex;font-size:var(--text-xs);gap:6px;margin:1px;max-width:100%;padding:2px 6px 2px 4px;text-decoration:none;vertical-align:middle}.ChatMessage_role-assistant__wketE .ChatMessage_datasetAppLink__Pxy-T:hover{background-color:var(--sb-slate-50);border-color:var(--sb-slate-400);border-style:solid}.dark .ChatMessage_role-assistant__wketE .ChatMessage_datasetAppLink__Pxy-T{border-color:var(--sb-gray-600)}.dark .ChatMessage_role-assistant__wketE .ChatMessage_datasetAppLink__Pxy-T:hover{background-color:var(--sb-gray-900)}.ChatMessage_role-assistant__wketE .ChatMessage_datasetAppLinkLabel__PMU7e{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ChatMessage_role-assistant__wketE .ChatMessage_quickReplyWrap__1UFyD{display:inline-block;margin:var(--p-1) var(--p-1) var(--p-1) 0;vertical-align:middle}.ChatMessage_role-assistant__wketE .ChatMessage_downloadButtons__RygM-{display:flex;gap:var(--p-2);margin-top:var(--p-4)}.ChatMessage_role-assistant__wketE .ChatMessage_downloadCard__NsNRa{align-items:center;background-color:var(--background);border-radius:var(--p-3);box-shadow:0 0 0 1px var(--border);cursor:pointer;display:flex;gap:var(--p-4);margin-top:var(--p-3);padding:var(--p-3);padding-right:var(--p-4);transition:all .15s;width:-moz-fit-content;width:fit-content}.ChatMessage_role-assistant__wketE .ChatMessage_downloadCard__NsNRa:hover{background-color:var(--sb-gray-50);border-color:var(--border)}.dark .ChatMessage_role-assistant__wketE .ChatMessage_downloadCard__NsNRa{background-color:var(--sb-gray-900);border-color:var(--border)}.dark .ChatMessage_role-assistant__wketE .ChatMessage_downloadCard__NsNRa:hover{background-color:var(--sb-gray-800)}.ChatMessage_role-assistant__wketE .ChatMessage_downloadCardIcon__jkxDJ{align-items:center;border-radius:var(--p-2);display:flex;flex-shrink:0;height:32px;justify-content:center;width:32px}.ChatMessage_role-assistant__wketE .ChatMessage_downloadCardContent__PTPwz{display:flex;flex:1;flex-direction:column;min-width:0}.ChatMessage_role-assistant__wketE .ChatMessage_downloadCardTitle__K1wqr{font-size:var(--text-base);font-weight:600;line-height:1.4}.ChatMessage_role-assistant__wketE .ChatMessage_downloadCardSubtitle__fVeF2{color:var(--muted-foreground);font-size:var(--text-sm);line-height:1.4}";
3
+ var css_248z = ".ChatMessage_root__6rnsF{background:var(--bg-secondary);display:flex;flex-direction:column;gap:var(--p-1);padding:var(--p-6)}.ChatMessage_text__Y1XNR{color:var(--text-secondary);font-size:var(--text-sm);max-width:100%;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:-moz-fit-content;width:fit-content}.ChatMessage_role-user__u4JPV{align-items:flex-end}.ChatMessage_role-user__u4JPV .ChatMessage_userColumn__cQM6-{align-items:flex-end;display:flex;flex-direction:column;gap:var(--p-2);max-width:100%}.ChatMessage_role-user__u4JPV .ChatMessage_text__Y1XNR{background-color:var(--sb-slate-100);border-radius:var(--p-4);border-bottom-right-radius:0;padding:var(--p-3) var(--p-4);white-space:pre-wrap}.dark .ChatMessage_role-user__u4JPV .ChatMessage_text__Y1XNR{background-color:var(--sb-gray-800)}.ChatMessage_role-user__u4JPV .ChatMessage_userCsvCard__D1M7y{align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--background);border:0;border-radius:var(--p-3);box-shadow:0 0 0 1px var(--border);cursor:pointer;display:flex;font:inherit;gap:var(--p-2);margin:0;max-width:100%;padding:var(--p-3);padding-right:var(--p-4);text-align:left;transition:background-color .15s;width:-moz-fit-content;width:fit-content}.ChatMessage_role-user__u4JPV .ChatMessage_userCsvCard__D1M7y:hover{background-color:var(--sb-gray-50)}.ChatMessage_role-user__u4JPV .ChatMessage_userCsvCard__D1M7y:focus-visible{outline:2px solid var(--ring);outline-offset:2px}.dark .ChatMessage_role-user__u4JPV .ChatMessage_userCsvCard__D1M7y{background-color:var(--sb-gray-800)}.dark .ChatMessage_role-user__u4JPV .ChatMessage_userCsvCard__D1M7y:hover{background-color:var(--sb-gray-900)}.ChatMessage_role-user__u4JPV .ChatMessage_userCsvCardIcon__0-KS6{align-items:center;display:flex;flex-shrink:0;height:32px;justify-content:center;width:32px}.ChatMessage_role-user__u4JPV .ChatMessage_userCsvCardContent__LoMGE{display:flex;flex:1;flex-direction:column;min-width:0}.ChatMessage_role-user__u4JPV .ChatMessage_userCsvCardTitle__9W76E{font-size:var(--text-sm);font-weight:500;line-height:1.4}.ChatMessage_role-user__u4JPV .ChatMessage_userCsvCardSubtitle__YZeHv{color:var(--muted-foreground);font-size:var(--text-xs);line-height:1.4}.ChatMessage_role-system__g13OP{align-items:center}.ChatMessage_role-system__g13OP .ChatMessage_text__Y1XNR{color:var(--muted-foreground);font-size:var(--text-xs);width:100%}.ChatMessage_role-assistant__wketE .ChatMessage_text__Y1XNR{width:100%}.ChatMessage_role-assistant__wketE h3{line-height:2.4}.ChatMessage_role-assistant__wketE h4{font-size:1.1em;font-weight:600;line-height:2.2}.ChatMessage_role-assistant__wketE .ChatMessage_bullet__6vAhq{display:inline-block;margin-left:4px;margin-right:6px}.ChatMessage_role-assistant__wketE .ChatMessage_bullet__6vAhq:before{color:var(--text-secondary);content:\"•\";display:inline-block}.ChatMessage_role-assistant__wketE .ChatMessage_scrollHorizontal__Rms9n{max-width:100%}.ChatMessage_role-assistant__wketE table{border:1px solid var(--border);border-collapse:collapse;border-radius:var(--p-2);border-spacing:0;margin:var(--p-4) 0;overflow:hidden}.ChatMessage_role-assistant__wketE table td,.ChatMessage_role-assistant__wketE table th{border:1px solid var(--border);min-width:100px;padding:var(--p-1)}.ChatMessage_role-assistant__wketE table th{text-align:left}.ChatMessage_role-assistant__wketE ol,.ChatMessage_role-assistant__wketE ul{padding-left:var(--p-4)}.ChatMessage_role-assistant__wketE ul{list-style-type:disc}.ChatMessage_role-assistant__wketE ol{list-style-type:decimal}.ChatMessage_role-assistant__wketE .ChatMessage_datasetAppLink__Pxy-T{align-items:center;border:1px dashed var(--sb-slate-300);border-radius:8px;color:var(--foreground);display:inline-flex;font-size:var(--text-xs);gap:6px;margin:1px;max-width:100%;padding:2px 6px 2px 4px;text-decoration:none;vertical-align:middle}.ChatMessage_role-assistant__wketE .ChatMessage_datasetAppLink__Pxy-T:hover{background-color:var(--sb-slate-50);border-color:var(--sb-slate-400);border-style:solid}.dark .ChatMessage_role-assistant__wketE .ChatMessage_datasetAppLink__Pxy-T{border-color:var(--sb-gray-600)}.dark .ChatMessage_role-assistant__wketE .ChatMessage_datasetAppLink__Pxy-T:hover{background-color:var(--sb-gray-900)}.ChatMessage_role-assistant__wketE .ChatMessage_datasetAppLinkLabel__PMU7e{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ChatMessage_role-assistant__wketE .ChatMessage_quickReplyWrap__1UFyD{display:inline-block;margin:var(--p-1) var(--p-1) var(--p-1) 0;vertical-align:middle}.ChatMessage_role-assistant__wketE .ChatMessage_downloadButtons__RygM-{display:flex;gap:var(--p-2);margin-top:var(--p-4)}.ChatMessage_role-assistant__wketE .ChatMessage_downloadCard__NsNRa{align-items:center;background-color:var(--background);border-radius:var(--p-3);box-shadow:0 0 0 1px var(--border);cursor:pointer;display:flex;gap:var(--p-4);margin-top:var(--p-3);padding:var(--p-3);padding-right:var(--p-4);transition:all .15s;width:-moz-fit-content;width:fit-content}.ChatMessage_role-assistant__wketE .ChatMessage_downloadCard__NsNRa:hover{background-color:var(--sb-gray-50);border-color:var(--border)}.dark .ChatMessage_role-assistant__wketE .ChatMessage_downloadCard__NsNRa{background-color:var(--sb-gray-900);border-color:var(--border)}.dark .ChatMessage_role-assistant__wketE .ChatMessage_downloadCard__NsNRa:hover{background-color:var(--sb-gray-800)}.ChatMessage_role-assistant__wketE .ChatMessage_downloadCardIcon__jkxDJ{align-items:center;border-radius:var(--p-2);display:flex;flex-shrink:0;height:32px;justify-content:center;width:32px}.ChatMessage_role-assistant__wketE .ChatMessage_downloadCardContent__PTPwz{display:flex;flex:1;flex-direction:column;min-width:0}.ChatMessage_role-assistant__wketE .ChatMessage_downloadCardTitle__K1wqr{font-size:var(--text-base);font-weight:600;line-height:1.4}.ChatMessage_role-assistant__wketE .ChatMessage_downloadCardSubtitle__fVeF2{color:var(--muted-foreground);font-size:var(--text-sm);line-height:1.4}";
4
4
  var S = {"root":"ChatMessage_root__6rnsF","text":"ChatMessage_text__Y1XNR","role-user":"ChatMessage_role-user__u4JPV","userColumn":"ChatMessage_userColumn__cQM6-","userCsvCard":"ChatMessage_userCsvCard__D1M7y","userCsvCardIcon":"ChatMessage_userCsvCardIcon__0-KS6","userCsvCardContent":"ChatMessage_userCsvCardContent__LoMGE","userCsvCardTitle":"ChatMessage_userCsvCardTitle__9W76E","userCsvCardSubtitle":"ChatMessage_userCsvCardSubtitle__YZeHv","role-system":"ChatMessage_role-system__g13OP","role-assistant":"ChatMessage_role-assistant__wketE","bullet":"ChatMessage_bullet__6vAhq","scrollHorizontal":"ChatMessage_scrollHorizontal__Rms9n","datasetAppLink":"ChatMessage_datasetAppLink__Pxy-T","datasetAppLinkLabel":"ChatMessage_datasetAppLinkLabel__PMU7e","quickReplyWrap":"ChatMessage_quickReplyWrap__1UFyD","downloadButtons":"ChatMessage_downloadButtons__RygM-","downloadCard":"ChatMessage_downloadCard__NsNRa","downloadCardIcon":"ChatMessage_downloadCardIcon__jkxDJ","downloadCardContent":"ChatMessage_downloadCardContent__PTPwz","downloadCardTitle":"ChatMessage_downloadCardTitle__K1wqr","downloadCardSubtitle":"ChatMessage_downloadCardSubtitle__fVeF2"};
5
5
  styleInject(css_248z);
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { downloadTextFile } from '../../../../utils/downloadTextFile.js';
3
- import { CsvIcon } from './icons/CsvIcon.js';
3
+ import { CsvIcon } from '../../../icons/CsvIcon/CsvIcon.js';
4
4
  import S from './ChatMessage.styl.js';
5
5
 
6
6
  const CSV_DOWNLOAD_HINT = 'Download .CSV file';
@@ -0,0 +1,31 @@
1
+ /** Keep in sync with `ChatPrompt.styl` `INPUT_MAX_HEIGHT` / `min-height`. */
2
+ const PROMPT_INPUT_MAX_HEIGHT_PX = 200;
3
+ const PROMPT_INPUT_MIN_HEIGHT_PX = 40;
4
+ function chatPromptTextareaFloorPx(cs) {
5
+ const padY = (Number.parseFloat(cs.paddingTop) || 0) +
6
+ (Number.parseFloat(cs.paddingBottom) || 0);
7
+ const fs = Number.parseFloat(cs.fontSize) || 14;
8
+ const linePx = cs.lineHeight === 'normal'
9
+ ? fs * 1.25
10
+ : Number.parseFloat(cs.lineHeight) || fs * 1.25;
11
+ return Math.max(PROMPT_INPUT_MIN_HEIGHT_PX, Math.ceil(linePx + padY));
12
+ }
13
+ /** Autosizing textarea inside flex shells: empty → floor only; typed → collapse measure + clamp. */
14
+ function syncChatPromptTextareaHeight(el, message) {
15
+ const floor = chatPromptTextareaFloorPx(getComputedStyle(el));
16
+ el.style.overflowY = 'hidden';
17
+ let contentHeight;
18
+ if (message === '') {
19
+ contentHeight = floor;
20
+ }
21
+ else {
22
+ el.style.height = '0';
23
+ contentHeight = el.scrollHeight;
24
+ }
25
+ const h = Math.min(Math.max(contentHeight, floor), PROMPT_INPUT_MAX_HEIGHT_PX);
26
+ el.style.height = `${h}px`;
27
+ el.style.overflowY =
28
+ contentHeight > PROMPT_INPUT_MAX_HEIGHT_PX ? 'auto' : 'hidden';
29
+ }
30
+
31
+ export { PROMPT_INPUT_MAX_HEIGHT_PX, PROMPT_INPUT_MIN_HEIGHT_PX, chatPromptTextareaFloorPx, syncChatPromptTextareaHeight };
@@ -1,14 +1,22 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import cn from 'classnames';
3
- import { useState, useEffect } from 'react';
3
+ import { useState, useRef, useLayoutEffect, useEffect } from 'react';
4
4
  import useEvent from '../../../../hooks/useEvent.js';
5
5
  import { SendHorizontalIcon } from 'lucide-react';
6
6
  import { Button } from '../../Button/Button.js';
7
7
  import { Input } from '../../Input/Input.js';
8
+ import { syncChatPromptTextareaHeight } from './ChatPrompt.helpers.js';
8
9
  import S from './ChatPrompt.styl.js';
9
10
 
10
- function ChatPrompt({ onSubmit, placeholder, className, footer, prefillMessage, }) {
11
+ function ChatPrompt({ onSubmit, placeholder, className, footer, prefillMessage, showNotice = true, }) {
11
12
  const [message, setMessage] = useState('');
13
+ const inputRef = useRef(null);
14
+ useLayoutEffect(() => {
15
+ const el = inputRef.current;
16
+ if (!el)
17
+ return;
18
+ syncChatPromptTextareaHeight(el, message);
19
+ }, [message]);
12
20
  useEffect(() => {
13
21
  if (prefillMessage != null && prefillMessage !== '') {
14
22
  setMessage(prefillMessage);
@@ -32,7 +40,7 @@ function ChatPrompt({ onSubmit, placeholder, className, footer, prefillMessage,
32
40
  }
33
41
  },
34
42
  });
35
- return (jsxs("form", { onSubmit: handleSubmit, className: cn(S.root, className), children: [jsx(Input, { type: "textarea", value: message, onChange: e => setMessage(e.target.value), placeholder: placeholder || 'Type a message...', className: cn(S.input) }), jsxs("div", { className: S.actions, children: [jsx(Button, { type: "submit", size: "sm", disabled: !message.trim(), children: jsx(SendHorizontalIcon, { size: 16 }) }), jsx("div", { className: S.notice, children: "Forecast Assistant can make mistakes." })] }), footer] }));
43
+ return (jsxs("form", { onSubmit: handleSubmit, className: cn(S.root, className), children: [jsxs("div", { className: S.composer, children: [showNotice ? (jsx("div", { className: S.notice, children: "Forecast Assistant can make mistakes." })) : null, jsx(Input, { ref: inputRef, type: "textarea", rows: 1, value: message, onChange: e => setMessage(e.target.value), placeholder: placeholder || 'Type a message...', className: cn(S.input) }), jsx("div", { className: S.submitColumn, children: jsx(Button, { type: "submit", size: "sm", disabled: !message.trim(), children: jsx(SendHorizontalIcon, { size: 16 }) }) })] }), footer] }));
36
44
  }
37
45
 
38
46
  export { ChatPrompt };
@@ -1,7 +1,7 @@
1
1
  import styleInject from 'style-inject';
2
2
 
3
- var css_248z = "@media (max-width:768px){:root{--page-x-padding:var(--p-6);--page-y-padding:var(--p-6)}}.ChatPrompt_root__5G5bq{align-items:center;display:flex;flex-direction:column;gap:var(--p-2);padding:var(--p-6);position:relative}.ChatPrompt_input__QPKBV{border:none;border-radius:0!important;flex:1;min-height:70px;padding:0!important;resize:none}.ChatPrompt_input__QPKBV,.ChatPrompt_input__QPKBV:focus{box-shadow:none!important}.ChatPrompt_actions__pUtB-{align-items:center;display:flex;flex-direction:row-reverse;gap:var(--p-2);justify-content:space-between;width:100%}.ChatPrompt_actions__pUtB->button:focus{box-shadow:0 0 0 2px var(--brand-color-500)!important}.ChatPrompt_actions__pUtB->button:first-child{border:none;position:relative;transition:all .2s}.ChatPrompt_actions__pUtB->button:first-child:focus{transform:scale(1.2)}.ChatPrompt_actions__pUtB->button:first-child:before{bottom:-100%;content:\"\";left:-100%;position:absolute;right:-100%;top:-100%}.ChatPrompt_actions__pUtB- .ChatPrompt_attachButton__gi-qF{background-color:var(--page-color);box-shadow:0 0 20px var(--background)}.ChatPrompt_notice__B-RyW{color:var(--muted-foreground);font-size:var(--text-xs);text-align:center;width:100%}@media (max-width:768px){.ChatPrompt_notice__B-RyW{font-size:10px}}";
4
- var S = {"root":"ChatPrompt_root__5G5bq","input":"ChatPrompt_input__QPKBV","actions":"ChatPrompt_actions__pUtB-","attachButton":"ChatPrompt_attachButton__gi-qF","notice":"ChatPrompt_notice__B-RyW"};
3
+ var css_248z = "@media (max-width:768px){:root{--page-x-padding:var(--p-6);--page-y-padding:var(--p-6)}}.ChatPrompt_root__5G5bq{align-items:stretch;display:flex;flex-direction:column;gap:var(--p-2);padding:var(--p-6);padding-top:var(--p-5);position:relative}.ChatPrompt_composer__H3c3N{align-items:flex-end;display:flex;flex-direction:row;gap:var(--p-3);position:relative;width:100%}.ChatPrompt_notice__B-RyW{color:var(--muted-foreground);font-size:var(--text-xs);left:0;margin-bottom:var(--p-1);pointer-events:none;position:absolute;right:0;text-align:center;top:calc(var(--p-12)*-1)}@media (max-width:768px){.ChatPrompt_notice__B-RyW{font-size:10px}}.ChatPrompt_input__QPKBV{border:none;border-radius:0!important;flex:1;max-height:200px;min-height:40px;min-width:0;overflow-y:auto;padding:var(--p-2) 0 0!important;resize:none}.ChatPrompt_input__QPKBV,.ChatPrompt_input__QPKBV:focus{box-shadow:none!important}.ChatPrompt_submitColumn__0rY1R{align-items:center;display:flex;flex-direction:column;flex-shrink:0;justify-content:flex-end}.ChatPrompt_submitColumn__0rY1R>button:focus{box-shadow:0 0 0 2px var(--brand-color-500)!important}.ChatPrompt_submitColumn__0rY1R>button:first-child{border:none;position:relative;transition:all .2s}.ChatPrompt_submitColumn__0rY1R>button:first-child:focus{transform:scale(1.2)}.ChatPrompt_submitColumn__0rY1R>button:first-child:before{bottom:-100%;content:\"\";left:-100%;position:absolute;right:-100%;top:-100%}.ChatPrompt_submitColumn__0rY1R .ChatPrompt_attachButton__gi-qF{background-color:var(--page-color);box-shadow:0 0 20px var(--background)}";
4
+ var S = {"root":"ChatPrompt_root__5G5bq","composer":"ChatPrompt_composer__H3c3N","notice":"ChatPrompt_notice__B-RyW","input":"ChatPrompt_input__QPKBV","submitColumn":"ChatPrompt_submitColumn__0rY1R","attachButton":"ChatPrompt_attachButton__gi-qF"};
5
5
  styleInject(css_248z);
6
6
 
7
7
  export { S as default };
@@ -2,6 +2,7 @@ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import cn from 'classnames';
3
3
  import { useMemo } from 'react';
4
4
  import { useTheme } from '../../../contexts/theme-context.js';
5
+ import { useIsMobile } from '../../../hooks/useIsMobile.js';
5
6
  import { UserCircleIcon, SunIcon, MoonIcon, SignOutIcon } from '@phosphor-icons/react';
6
7
  import { ChevronDownIcon } from 'lucide-react';
7
8
  import { Avatar, AvatarImage, AvatarFallback } from '../Avatar/Avatar.js';
@@ -9,8 +10,10 @@ import { Button } from '../Button/Button.js';
9
10
  import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup, DropdownMenuItem } from '../DropdownMenu/DropdownMenu.js';
10
11
  import S from './NavUserHeader.styl.js';
11
12
 
12
- function NavUserHeader({ variant = 'default', isLoading = false, isAuthenticated, user = null, menuItems, onLogout, signInSlot, onSignInClick, theme: themeFromHost, onThemeToggle: onThemeToggleFromHost, }) {
13
+ function NavUserHeader({ variant, isLoading = false, isAuthenticated, user = null, menuItems, onLogout, signInSlot, onSignInClick, theme: themeFromHost, onThemeToggle: onThemeToggleFromHost, }) {
13
14
  const docsTheme = useTheme();
15
+ const isMobile = useIsMobile();
16
+ const effectiveVariant = variant ?? (isMobile ? 'compact' : 'default');
14
17
  const hostControlsTheme = themeFromHost !== undefined && onThemeToggleFromHost !== undefined;
15
18
  const theme = hostControlsTheme ? themeFromHost : docsTheme.theme;
16
19
  const toggleTheme = hostControlsTheme
@@ -37,7 +40,7 @@ function NavUserHeader({ variant = 'default', isLoading = false, isAuthenticated
37
40
  }
38
41
  return (jsxs(Button, { variant: "ghost", size: "sm", className: S.loginButton, type: "button", onClick: onSignInClick, children: [jsx(UserCircleIcon, { className: S.iconLg }), jsx("span", { children: "Log in" })] }));
39
42
  }
40
- return (jsxs(DropdownMenu, { children: [jsx(DropdownMenuTrigger, { asChild: true, children: jsxs(Button, { variant: "ghost", size: "sm", className: cn(S.userButton, variant === 'compact' && S.compact), children: [avatar, variant === 'default' && (jsxs(Fragment, { children: [userIdentity, jsx(ChevronDownIcon, { className: S.iconSm })] }))] }) }), jsxs(DropdownMenuContent, { className: S.dropdownContent, align: "end", elevation: "md", children: [jsx(DropdownMenuLabel, { className: S.userLabel, children: jsxs("div", { className: S.userLabelContent, children: [avatar, userIdentity] }) }), jsx(DropdownMenuSeparator, {}), jsxs(DropdownMenuGroup, { children: [menuItems, jsx(DropdownMenuItem, { onSelect: toggleTheme, children: theme === 'dark' ? (jsxs(Fragment, { children: [jsx(SunIcon, {}), "Light theme"] })) : (jsxs(Fragment, { children: [jsx(MoonIcon, {}), "Dark theme"] })) })] }), jsx(DropdownMenuSeparator, {}), jsxs(DropdownMenuItem, { variant: "destructive", onSelect: () => onLogout(), children: [jsx(SignOutIcon, {}), "Log out"] })] })] }));
43
+ return (jsxs(DropdownMenu, { children: [jsx(DropdownMenuTrigger, { asChild: true, children: jsxs(Button, { variant: "ghost", size: "sm", className: cn(S.userButton, effectiveVariant === 'compact' && S.compact), children: [avatar, effectiveVariant === 'default' && (jsxs(Fragment, { children: [userIdentity, jsx(ChevronDownIcon, { className: S.iconSm })] }))] }) }), jsxs(DropdownMenuContent, { className: S.dropdownContent, align: "end", elevation: "md", children: [jsx(DropdownMenuLabel, { className: S.userLabel, children: jsxs("div", { className: S.userLabelContent, children: [avatar, userIdentity] }) }), jsx(DropdownMenuSeparator, {}), jsxs(DropdownMenuGroup, { children: [menuItems, jsx(DropdownMenuItem, { onSelect: toggleTheme, children: theme === 'dark' ? (jsxs(Fragment, { children: [jsx(SunIcon, {}), "Light theme"] })) : (jsxs(Fragment, { children: [jsx(MoonIcon, {}), "Dark theme"] })) })] }), jsx(DropdownMenuSeparator, {}), jsxs(DropdownMenuItem, { variant: "destructive", onSelect: () => onLogout(), children: [jsx(SignOutIcon, {}), "Log out"] })] })] }));
41
44
  }
42
45
 
43
46
  export { NavUserHeader };
@@ -51,7 +51,7 @@ function WorkspaceAppSwitcher({ pathname, onNavigate, authenticated = true, defa
51
51
  if (!displayApp) {
52
52
  return null;
53
53
  }
54
- return (jsxs(DropdownMenu, { children: [jsx(DropdownMenuTrigger, { asChild: true, children: jsxs(Button, { variant: "ghost", className: S.trigger, "aria-label": "Select workspace app", children: [jsx(IconTile, { iconKey: displayApp.iconKey, accentMuted: displayApp.accentMuted, accent: displayApp.accent }), jsxs("span", { className: S.textCol, children: [jsx("span", { className: S.name, children: displayApp.displayName }), jsx("span", { className: S.sub, children: displayApp.subtitle })] }), jsx(ChevronDown, { size: 12 })] }) }), jsx(DropdownMenuContent, { className: S.menuContent, align: "start", sideOffset: 8, elevation: "md", children: apps.map(entry => {
54
+ return (jsxs(DropdownMenu, { children: [jsx(DropdownMenuTrigger, { asChild: true, children: jsxs(Button, { variant: "ghost", className: S.trigger, "aria-label": "Select workspace app", children: [jsx(IconTile, { iconKey: displayApp.iconKey, accentMuted: displayApp.accentMuted, accent: displayApp.accent }), jsxs("span", { className: S.textCol, children: [jsx("span", { className: S.name, children: displayApp.displayName }), jsx("span", { className: S.sub, children: displayApp.subtitle })] }), jsx(ChevronDown, { className: S.chevron, size: 12, "aria-hidden": true })] }) }), jsx(DropdownMenuContent, { className: S.menuContent, align: "start", sideOffset: 8, elevation: "md", children: apps.map(entry => {
55
55
  const active = current != null ? entryKey(entry) === entryKey(current) : false;
56
56
  return (jsxs(DropdownMenuItem, { className: cn(S.item, active && S.itemActive), onSelect: () => {
57
57
  onNavigate(entry.href);
@@ -1,7 +1,7 @@
1
1
  import styleInject from 'style-inject';
2
2
 
3
- var css_248z = "@media (max-width:768px){:root{--page-x-padding:var(--p-6);--page-y-padding:var(--p-6)}}.WorkspaceAppSwitcher_trigger__s6qYT{align-items:center;background:transparent;border:none;border-radius:12px;color:inherit;cursor:pointer;display:flex;font:inherit;gap:var(--p-2);height:auto;margin-left:var(--p-3)!important;max-width:320px;padding:var(--p-1)!important;padding-right:var(--p-3)!important;text-align:left}.WorkspaceAppSwitcher_trigger__s6qYT:hover{background-color:var(--muted)}.WorkspaceAppSwitcher_iconTile__tVDr8{align-items:center;border-radius:10px;color:var(--fg-color);display:flex;flex-shrink:0;height:40px;justify-content:center;position:relative;width:40px}.WorkspaceAppSwitcher_iconTile__tVDr8:after,.WorkspaceAppSwitcher_iconTile__tVDr8:before{border-radius:inherit;content:\"\";display:block;height:100%;position:absolute;width:100%}.WorkspaceAppSwitcher_iconTile__tVDr8:before{background-color:var(--background)}.WorkspaceAppSwitcher_iconTile__tVDr8:after{background-color:var(--bg-color)}.WorkspaceAppSwitcher_icon__Jgw14{color:var(--fg-color)!important;height:22px!important;width:22px!important;z-index:1}.WorkspaceAppSwitcher_textCol__K1gfI{display:flex;flex:1;flex-direction:column;gap:2px;min-width:0}.WorkspaceAppSwitcher_name__ewMYP{color:var(--foreground);font-size:var(--text-sm);font-weight:600}.WorkspaceAppSwitcher_name__ewMYP,.WorkspaceAppSwitcher_sub__b7w1p{line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.WorkspaceAppSwitcher_sub__b7w1p{color:var(--muted-foreground);font-size:var(--text-xs)}.WorkspaceAppSwitcher_menuContent__4-UNY{max-width:360px;min-width:280px}.WorkspaceAppSwitcher_item__nnufY{align-items:center;cursor:pointer;display:flex;gap:var(--p-3);outline:none;padding:var(--p-3)}.WorkspaceAppSwitcher_itemActive__3mPlO{background-color:var(--muted)}";
4
- var S = {"trigger":"WorkspaceAppSwitcher_trigger__s6qYT","iconTile":"WorkspaceAppSwitcher_iconTile__tVDr8","icon":"WorkspaceAppSwitcher_icon__Jgw14","textCol":"WorkspaceAppSwitcher_textCol__K1gfI","name":"WorkspaceAppSwitcher_name__ewMYP","sub":"WorkspaceAppSwitcher_sub__b7w1p","menuContent":"WorkspaceAppSwitcher_menuContent__4-UNY","item":"WorkspaceAppSwitcher_item__nnufY","itemActive":"WorkspaceAppSwitcher_itemActive__3mPlO"};
3
+ var css_248z = "@media (max-width:768px){:root{--page-x-padding:var(--p-6);--page-y-padding:var(--p-6)}}.WorkspaceAppSwitcher_trigger__s6qYT{align-items:center;background:transparent;border:none;border-radius:12px;color:inherit;cursor:pointer;display:flex;font:inherit;gap:var(--p-2);height:auto;margin-left:var(--p-3)!important;max-width:320px;padding:var(--p-1)!important;padding-right:var(--p-3)!important;text-align:left}.WorkspaceAppSwitcher_trigger__s6qYT:hover{background-color:var(--muted)}@media (max-width:768px){.WorkspaceAppSwitcher_trigger__s6qYT{gap:0;margin-left:0!important;max-width:none;padding-right:var(--p-1)!important}.WorkspaceAppSwitcher_trigger__s6qYT .WorkspaceAppSwitcher_chevron__7kAqO,.WorkspaceAppSwitcher_trigger__s6qYT .WorkspaceAppSwitcher_textCol__K1gfI{display:none}}.WorkspaceAppSwitcher_iconTile__tVDr8{align-items:center;border-radius:10px;color:var(--fg-color);display:flex;flex-shrink:0;height:40px;justify-content:center;position:relative;width:40px}.WorkspaceAppSwitcher_iconTile__tVDr8:after,.WorkspaceAppSwitcher_iconTile__tVDr8:before{border-radius:inherit;content:\"\";display:block;height:100%;position:absolute;width:100%}.WorkspaceAppSwitcher_iconTile__tVDr8:before{background-color:var(--background)}.WorkspaceAppSwitcher_iconTile__tVDr8:after{background-color:var(--bg-color)}.WorkspaceAppSwitcher_icon__Jgw14{color:var(--fg-color)!important;height:22px!important;width:22px!important;z-index:1}.WorkspaceAppSwitcher_textCol__K1gfI{display:flex;flex:1;flex-direction:column;gap:2px;min-width:0}.WorkspaceAppSwitcher_name__ewMYP{color:var(--foreground);font-size:var(--text-sm);font-weight:600}.WorkspaceAppSwitcher_name__ewMYP,.WorkspaceAppSwitcher_sub__b7w1p{line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.WorkspaceAppSwitcher_sub__b7w1p{color:var(--muted-foreground);font-size:var(--text-xs)}.WorkspaceAppSwitcher_menuContent__4-UNY{max-width:360px;min-width:280px}.WorkspaceAppSwitcher_item__nnufY{align-items:center;cursor:pointer;display:flex;gap:var(--p-3);outline:none;padding:var(--p-3)}.WorkspaceAppSwitcher_itemActive__3mPlO{background-color:var(--muted)}";
4
+ var S = {"trigger":"WorkspaceAppSwitcher_trigger__s6qYT","textCol":"WorkspaceAppSwitcher_textCol__K1gfI","chevron":"WorkspaceAppSwitcher_chevron__7kAqO","iconTile":"WorkspaceAppSwitcher_iconTile__tVDr8","icon":"WorkspaceAppSwitcher_icon__Jgw14","name":"WorkspaceAppSwitcher_name__ewMYP","sub":"WorkspaceAppSwitcher_sub__b7w1p","menuContent":"WorkspaceAppSwitcher_menuContent__4-UNY","item":"WorkspaceAppSwitcher_item__nnufY","itemActive":"WorkspaceAppSwitcher_itemActive__3mPlO"};
5
5
  styleInject(css_248z);
6
6
 
7
7
  export { S as default };
package/dist/esm/index.js CHANGED
@@ -26,6 +26,7 @@ export { ChatMessage } from './components/ui/Chat/ChatMessage/ChatMessage.js';
26
26
  export { ChatPrompt } from './components/ui/Chat/ChatPrompt/ChatPrompt.js';
27
27
  export { ChatPresets } from './components/ui/Chat/ChatPresets/ChatPresets.js';
28
28
  export { MessageRole } from './components/ui/Chat/Chat.types.js';
29
+ export { CsvIcon } from './components/icons/CsvIcon/CsvIcon.js';
29
30
  export { Checkbox } from './components/ui/Checkbox/Checkbox.js';
30
31
  export { Dialog } from './components/ui/Dialog/Dialog.js';
31
32
  export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger } from './components/ui/Drawer/Drawer.js';
@@ -66,6 +66,8 @@ export interface ChatPromptProps {
66
66
  footer?: ReactNode;
67
67
  /** Deep link `?prompt=` — one-shot composer pre-fill (see useChatPanelChromeModel). */
68
68
  prefillMessage?: string | null;
69
+ /** Disclaimer above composer; default true. ChatChrome sets false when thread has messages. */
70
+ showNotice?: boolean;
69
71
  }
70
72
  export interface ChatMessageProps {
71
73
  role: MessageRole;
@@ -1,2 +1,2 @@
1
1
  import type { ChatPromptProps } from '../Chat.types';
2
- export declare function ChatPrompt({ onSubmit, placeholder, className, footer, prefillMessage, }: ChatPromptProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function ChatPrompt({ onSubmit, placeholder, className, footer, prefillMessage, showNotice, }: ChatPromptProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ /** Keep in sync with `ChatPrompt.styl` `INPUT_MAX_HEIGHT` / `min-height`. */
2
+ export declare const PROMPT_INPUT_MAX_HEIGHT_PX = 200;
3
+ export declare const PROMPT_INPUT_MIN_HEIGHT_PX = 40;
4
+ export declare function chatPromptTextareaFloorPx(cs: CSSStyleDeclaration): number;
5
+ /** Autosizing textarea inside flex shells: empty → floor only; typed → collapse measure + clamp. */
6
+ export declare function syncChatPromptTextareaHeight(el: HTMLTextAreaElement, message: string): void;
@@ -11,3 +11,4 @@ export { ChatPrompt } from './ChatPrompt';
11
11
  export { ChatPresets } from './ChatPresets';
12
12
  export type { Chat as ChatType, ChatSendMessagePayload, ChatProps, ChatPreset as ChatPresetType, Message, UserCsvAttachment, } from './Chat.types';
13
13
  export { MessageRole } from './Chat.types';
14
+ export { CsvIcon } from '../../icons/CsvIcon/CsvIcon';
@@ -1,6 +1,6 @@
1
1
  import { type RedirectLoginOptions } from '@auth0/auth0-react';
2
2
  import type { JSX, ReactNode } from 'react';
3
- import type { SybilionSDK } from '@sybilion/sdk';
3
+ import type { SybilionSDK } from '@sybilion/platform-sdk';
4
4
  /** Origin (`scheme://host:port`) for paths like `/api/v1/...`; derived from SDK URL layout. */
5
5
  export declare function getSybilionApiOriginFromSdk(sdk: SybilionSDK): string;
6
6
  export type SybilionAuthProviderProps = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sybilion/uilib",
3
- "version": "1.2.22",
3
+ "version": "1.2.24",
4
4
  "description": "Sybilion Design System — React UI components (Webpack + Stylus)",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -111,7 +111,7 @@
111
111
  },
112
112
  "peerDependencies": {
113
113
  "@auth0/auth0-react": "^2.3.1",
114
- "@sybilion/sdk": ">=0.0.1",
114
+ "@sybilion/platform-sdk": ">=0.0.1",
115
115
  "react": ">=18.0.0",
116
116
  "react-dom": ">=18.0.0",
117
117
  "react-router-dom": ">=6.0.0",
@@ -121,7 +121,7 @@
121
121
  "@auth0/auth0-react": {
122
122
  "optional": true
123
123
  },
124
- "@sybilion/sdk": {
124
+ "@sybilion/platform-sdk": {
125
125
  "optional": true
126
126
  },
127
127
  "vite": {
@@ -130,7 +130,7 @@
130
130
  },
131
131
  "devDependencies": {
132
132
  "@auth0/auth0-react": "^2.3.1",
133
- "@sybilion/sdk": "file:../sdk",
133
+ "@sybilion/platform-sdk": "file:../sdk",
134
134
  "@babel/core": "^7.20.12",
135
135
  "@babel/preset-typescript": "^7.21.0",
136
136
  "@homecode/ui": "^4.30.6",
@@ -0,0 +1,5 @@
1
+ import CsvSvg from './csv.svg';
2
+
3
+ export function CsvIcon({ size = 32 }: { size?: number }) {
4
+ return <CsvSvg width={size} height={size} aria-hidden />;
5
+ }
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
2
+ <path fill="#00a04e" d="M4.433 1.174c25.194-.106-5.93.182 14.987-.001.405.004.405.004.61.129.109.19.116.352.112.566-.01 3.297-.015 6.595-.029 9.893l.112-.004c.562-.017-.045.002 1.004-.024.197.038.266.11.385.27.062 2.563.035 5.128.03 7.692-.039.197-.117.27-.272.394-.415.043-.841.014-1.259 0q.017 1.22.03 2.44a.56.56 0 0 1-.18.317c-1.942.17-14.937.077-15.717.084-.46-.005-.46-.005-.61-.148a.57.57 0 0 1-.11-.39c.009-.767.014-1.535.027-2.303-.372.013-.744.019-1.116.028-.196-.038-.26-.117-.385-.27-.074-2.558-.034-5.13-.03-7.693.04-.2.109-.272.272-.393.415-.044.842-.014 1.26 0-.062-3.337.028-6.676-.032-10.013a.8.8 0 0 1 .114-.446c.255-.155.505-.13.797-.128m-.008.903v9.684h14.817V2.077Zm2.19 12.183c-.49.664-.597 1.45-.48 2.25.143.74.644 1.272 1.34 1.497.75.238 2.112-.06 2.325-1.356-.66-.237-.696-.242-.841-.24-.34.863-1 1.085-1.484.676-.693-.587-.45-1.823-.145-2.373.124-.08.559-.318 1.077-.139.22.15.358.334.473.575.297-.028.58-.074.871-.145a1.35 1.35 0 0 0-.445-.935c-.785-.619-1.99-.479-2.69.19m4.068-.15c-.435.461-.303 1.023-.228 1.24.175.395.463.552.854.706.438.217 1.085.13 1.395.547.067.145.076.4-.142.548-.343.114-.711.156-1.048.003-.202-.197-.303-.386-.408-.648l-.872.048c.014.416.138.806.431 1.114.512.406 1.123.425 1.748.387.366-.05.696-.181.969-.435.268-.37.323-.713.29-1.162-.06-.317-.238-.57-.484-.775-.376-.221-.821-.317-1.24-.425-.252-.067-.58-.19-.648-.301-.069-.112-.027-.257.048-.34.075-.082.363-.112.581-.114a.67.67 0 0 1 .581.211c.066.111.1.217.145.34.31.01.615.008.92-.05-.048-.39-.115-.724-.422-.991-.71-.491-1.818-.481-2.47.098m3.231-.365c.386 1.447.95 2.848 1.453 4.261h.968c.239-.644 1.51-4.082 1.501-4.261h-.92c-.356.876-.657 2.013-.968 2.808l-.145.049-.037-.182c-.255-.903-.578-1.787-.883-2.675zm-9.49 6.343v1.937h14.817v-1.937z" style="stroke-width:.0484209" />
3
+ <path fill="#009649" d="M6.402 9.406c3.535-.028 7.565.04 11-.002.29.005.619.093.61.468-.036.436-.435.468-.63.467-3.155.025-9.165-.022-11.117.001-.29-.004-.594-.13-.612-.468.02-.426.433-.468.749-.466m-.112-2.71c3.536-.028 7.565.04 11-.002.29.004.62.092.612.468-.037.436-.436.468-.63.467-3.156.024-9.166-.022-11.118.001-.291-.004-.594-.13-.612-.468.02-.426.433-.468.749-.466m-.075-2.822c3.536-.027 7.565.04 11-.001.29.004.619.092.611.468-.036.436-.436.467-.63.466-3.155.025-9.165-.021-11.117.002-.292-.004-.595-.13-.612-.468.019-.427.433-.469.748-.467" style="stroke-width:.0484209" />
4
+ </svg>
@@ -11,6 +11,10 @@
11
11
 
12
12
  background-color var(--color-background)
13
13
 
14
+ @media (max-width MOBILE)
15
+ padding-left 200px
16
+ max-width 100%
17
+
14
18
  @media (min-width MOBILE)
15
19
  :global([data-slot='sidebar-wrapper'][data-state='collapsed']) &
16
20
  padding-left 200px
@@ -52,6 +52,7 @@
52
52
  .headerText
53
53
  flex-grow 1
54
54
  overflow hidden
55
+ width 100%
55
56
 
56
57
  .scroll
57
58
  max-height 100%
@@ -76,6 +76,8 @@ export interface ChatPromptProps {
76
76
  footer?: ReactNode;
77
77
  /** Deep link `?prompt=` — one-shot composer pre-fill (see useChatPanelChromeModel). */
78
78
  prefillMessage?: string | null;
79
+ /** Disclaimer above composer; default true. ChatChrome sets false when thread has messages. */
80
+ showNotice?: boolean;
79
81
  }
80
82
 
81
83
  export interface ChatMessageProps {
@@ -199,6 +199,7 @@ export function ChatChrome({
199
199
  onSubmit={onPromptSubmit}
200
200
  disabled={isLoading}
201
201
  prefillMessage={promptPrefill ?? undefined}
202
+ showNotice={isEmpty}
202
203
  />
203
204
  </div>
204
205
  </Chat>
@@ -8,7 +8,6 @@
8
8
 
9
9
  .text
10
10
  max-width 100%
11
- // padding 0 var(--p-4)
12
11
  font-size var(--text-sm)
13
12
  color var(--text-secondary)
14
13
  width fit-content
@@ -43,19 +42,17 @@
43
42
  font inherit
44
43
  display flex
45
44
  align-items center
46
- gap var(--p-4)
45
+ gap var(--p-2)
47
46
  padding var(--p-3)
48
47
  padding-right var(--p-4)
49
- background-color var(--sb-slate-100)
48
+ background-color var(--background)
50
49
  box-shadow 0 0 0 1px var(--border)
51
- border-radius var(--p-4)
52
- border-bottom-right-radius 0
50
+ border-radius var(--p-3)
53
51
  width fit-content
54
52
  max-width 100%
55
53
  text-align left
56
54
  cursor pointer
57
55
  transition background-color 150ms
58
- color var(--sb-green-600)
59
56
 
60
57
  &:hover
61
58
  background-color var(--sb-gray-50)
@@ -66,7 +63,6 @@
66
63
 
67
64
  :global(.dark) &
68
65
  background-color var(--sb-gray-800)
69
- color var(--sb-green-400)
70
66
 
71
67
  &:hover
72
68
  background-color var(--sb-gray-900)
@@ -86,13 +82,12 @@
86
82
  min-width 0
87
83
 
88
84
  .userCsvCardTitle
89
- font-size var(--text-base)
90
- font-weight 600
85
+ font-size var(--text-sm)
86
+ font-weight 500
91
87
  line-height 1.4
92
- color var(--text-secondary)
93
88
 
94
89
  .userCsvCardSubtitle
95
- font-size var(--text-sm)
90
+ font-size var(--text-xs)
96
91
  color var(--muted-foreground)
97
92
  line-height 1.4
98
93
 
@@ -1,7 +1,7 @@
1
- import type { UserCsvAttachment } from '../Chat.types';
2
1
  import { downloadTextFile } from '#uilib/utils/downloadTextFile';
3
2
 
4
- import { CsvIcon } from './icons/CsvIcon';
3
+ import { CsvIcon } from '../../../icons/CsvIcon/CsvIcon';
4
+ import type { UserCsvAttachment } from '../Chat.types';
5
5
  import S from './ChatMessage.styl';
6
6
 
7
7
  const CSV_DOWNLOAD_HINT = 'Download .CSV file';
@@ -0,0 +1,43 @@
1
+ /** Keep in sync with `ChatPrompt.styl` `INPUT_MAX_HEIGHT` / `min-height`. */
2
+ export const PROMPT_INPUT_MAX_HEIGHT_PX = 200;
3
+ export const PROMPT_INPUT_MIN_HEIGHT_PX = 40;
4
+
5
+ export function chatPromptTextareaFloorPx(cs: CSSStyleDeclaration): number {
6
+ const padY =
7
+ (Number.parseFloat(cs.paddingTop) || 0) +
8
+ (Number.parseFloat(cs.paddingBottom) || 0);
9
+ const fs = Number.parseFloat(cs.fontSize) || 14;
10
+ const linePx =
11
+ cs.lineHeight === 'normal'
12
+ ? fs * 1.25
13
+ : Number.parseFloat(cs.lineHeight) || fs * 1.25;
14
+
15
+ return Math.max(PROMPT_INPUT_MIN_HEIGHT_PX, Math.ceil(linePx + padY));
16
+ }
17
+
18
+ /** Autosizing textarea inside flex shells: empty → floor only; typed → collapse measure + clamp. */
19
+ export function syncChatPromptTextareaHeight(
20
+ el: HTMLTextAreaElement,
21
+ message: string,
22
+ ): void {
23
+ const floor = chatPromptTextareaFloorPx(getComputedStyle(el));
24
+
25
+ el.style.overflowY = 'hidden';
26
+
27
+ let contentHeight: number;
28
+ if (message === '') {
29
+ contentHeight = floor;
30
+ } else {
31
+ el.style.height = '0';
32
+ contentHeight = el.scrollHeight;
33
+ }
34
+
35
+ const h = Math.min(
36
+ Math.max(contentHeight, floor),
37
+ PROMPT_INPUT_MAX_HEIGHT_PX,
38
+ );
39
+
40
+ el.style.height = `${h}px`;
41
+ el.style.overflowY =
42
+ contentHeight > PROMPT_INPUT_MAX_HEIGHT_PX ? 'auto' : 'hidden';
43
+ }
@@ -1,33 +1,60 @@
1
1
  @import 'lib/theme.styl';
2
2
 
3
+ INPUT_MAX_HEIGHT = 200px
4
+
3
5
  .root
4
6
  position relative
5
7
  display flex
6
8
  flex-direction column
7
9
  gap var(--p-2)
8
- align-items center
10
+ align-items stretch
9
11
  padding var(--p-6)
12
+ padding-top var(--p-5)
13
+
14
+ .composer
15
+ position relative
16
+ display flex
17
+ flex-direction row
18
+ align-items flex-end
19
+ gap var(--p-3)
20
+ width 100%
21
+
22
+ .notice
23
+ position absolute
24
+ top calc(-1 * var(--p-12))
25
+ left 0
26
+ right 0
27
+ margin-bottom var(--p-1)
28
+
29
+ font-size var(--text-xs)
30
+ text-align center
31
+ color var(--muted-foreground)
32
+ pointer-events none
33
+
34
+ @media (max-width MOBILE)
35
+ font-size 10px
10
36
 
11
37
  .input
12
38
  flex 1
13
- min-height 70px
39
+ min-width 0
40
+ min-height 40px
41
+ max-height INPUT_MAX_HEIGHT
14
42
  resize none
43
+ overflow-y auto
15
44
  border none
16
- padding 0 !important
45
+ padding var(--p-2) 0 0 !important
17
46
  border-radius 0 !important
18
47
  box-shadow none !important
19
48
 
20
49
  &:focus
21
50
  box-shadow none !important
22
51
 
23
- .actions
52
+ .submitColumn
24
53
  display flex
54
+ flex-direction column
55
+ flex-shrink 0
25
56
  align-items center
26
- flex-direction row-reverse
27
- justify-content space-between
28
- gap var(--p-2)
29
-
30
- width 100%
57
+ justify-content flex-end
31
58
 
32
59
  & > button:focus
33
60
  box-shadow 0 0 0 2px var(--brand-color-500) !important
@@ -52,14 +79,3 @@
52
79
  .attachButton
53
80
  background-color var(--page-color)
54
81
  box-shadow 0 0 20px var(--background)
55
-
56
- .notice
57
- font-size var(--text-xs)
58
- text-align center
59
- color var(--muted-foreground)
60
- width 100%
61
- // padding 0 var(--p-9)
62
- // text-align center
63
-
64
- @media (max-width MOBILE)
65
- font-size 10px
@@ -1,11 +1,12 @@
1
1
  // This file is automatically generated.
2
2
  // Please do not change this file!
3
3
  interface CssExports {
4
- 'actions': string;
5
4
  'attachButton': string;
5
+ 'composer': string;
6
6
  'input': string;
7
7
  'notice': string;
8
8
  'root': string;
9
+ 'submitColumn': string;
9
10
  }
10
11
  export const cssExports: CssExports;
11
12
  export default cssExports;
@@ -1,5 +1,5 @@
1
1
  import cn from 'classnames';
2
- import { FormEvent, useEffect, useState } from 'react';
2
+ import { FormEvent, useEffect, useLayoutEffect, useRef, useState } from 'react';
3
3
 
4
4
  import useEvent from '#uilib/hooks/useEvent';
5
5
  import { SendHorizontalIcon } from 'lucide-react';
@@ -7,6 +7,7 @@ import { SendHorizontalIcon } from 'lucide-react';
7
7
  import { Button } from '../../Button';
8
8
  import { Input } from '../../Input';
9
9
  import type { ChatPromptProps } from '../Chat.types';
10
+ import { syncChatPromptTextareaHeight } from './ChatPrompt.helpers';
10
11
  import S from './ChatPrompt.styl';
11
12
 
12
13
  export function ChatPrompt({
@@ -15,8 +16,16 @@ export function ChatPrompt({
15
16
  className,
16
17
  footer,
17
18
  prefillMessage,
19
+ showNotice = true,
18
20
  }: ChatPromptProps) {
19
21
  const [message, setMessage] = useState('');
22
+ const inputRef = useRef<HTMLTextAreaElement>(null);
23
+
24
+ useLayoutEffect(() => {
25
+ const el = inputRef.current;
26
+ if (!el) return;
27
+ syncChatPromptTextareaHeight(el, message);
28
+ }, [message]);
20
29
 
21
30
  useEffect(() => {
22
31
  if (prefillMessage != null && prefillMessage !== '') {
@@ -47,20 +56,26 @@ export function ChatPrompt({
47
56
 
48
57
  return (
49
58
  <form onSubmit={handleSubmit} className={cn(S.root, className)}>
50
- <Input
51
- type="textarea"
52
- value={message}
53
- onChange={e => setMessage(e.target.value)}
54
- placeholder={placeholder || 'Type a message...'}
55
- className={cn(S.input)}
56
- />
59
+ <div className={S.composer}>
60
+ {showNotice ? (
61
+ <div className={S.notice}>Forecast Assistant can make mistakes.</div>
62
+ ) : null}
57
63
 
58
- <div className={S.actions}>
59
- <Button type="submit" size="sm" disabled={!message.trim()}>
60
- <SendHorizontalIcon size={16} />
61
- </Button>
64
+ <Input
65
+ ref={inputRef}
66
+ type="textarea"
67
+ rows={1}
68
+ value={message}
69
+ onChange={e => setMessage(e.target.value)}
70
+ placeholder={placeholder || 'Type a message...'}
71
+ className={cn(S.input)}
72
+ />
62
73
 
63
- <div className={S.notice}>Forecast Assistant can make mistakes.</div>
74
+ <div className={S.submitColumn}>
75
+ <Button type="submit" size="sm" disabled={!message.trim()}>
76
+ <SendHorizontalIcon size={16} />
77
+ </Button>
78
+ </div>
64
79
 
65
80
  {/* <Button
66
81
  variant="outline"
@@ -24,3 +24,4 @@ export type {
24
24
  UserCsvAttachment,
25
25
  } from './Chat.types';
26
26
  export { MessageRole } from './Chat.types';
27
+ export { CsvIcon } from '../../icons/CsvIcon/CsvIcon';
@@ -2,6 +2,7 @@ import cn from 'classnames';
2
2
  import { useMemo } from 'react';
3
3
 
4
4
  import { useTheme } from '#uilib/contexts/theme-context';
5
+ import { useIsMobile } from '#uilib/hooks/useIsMobile';
5
6
  import {
6
7
  MoonIcon,
7
8
  SignOutIcon,
@@ -25,7 +26,7 @@ import S from './NavUserHeader.styl';
25
26
  import type { NavUserHeaderProps } from './NavUserHeader.types';
26
27
 
27
28
  export function NavUserHeader({
28
- variant = 'default',
29
+ variant,
29
30
  isLoading = false,
30
31
  isAuthenticated,
31
32
  user = null,
@@ -37,6 +38,8 @@ export function NavUserHeader({
37
38
  onThemeToggle: onThemeToggleFromHost,
38
39
  }: NavUserHeaderProps) {
39
40
  const docsTheme = useTheme();
41
+ const isMobile = useIsMobile();
42
+ const effectiveVariant = variant ?? (isMobile ? 'compact' : 'default');
40
43
  const hostControlsTheme =
41
44
  themeFromHost !== undefined && onThemeToggleFromHost !== undefined;
42
45
  const theme = hostControlsTheme ? themeFromHost : docsTheme.theme;
@@ -106,10 +109,13 @@ export function NavUserHeader({
106
109
  <Button
107
110
  variant="ghost"
108
111
  size="sm"
109
- className={cn(S.userButton, variant === 'compact' && S.compact)}
112
+ className={cn(
113
+ S.userButton,
114
+ effectiveVariant === 'compact' && S.compact,
115
+ )}
110
116
  >
111
117
  {avatar}
112
- {variant === 'default' && (
118
+ {effectiveVariant === 'default' && (
113
119
  <>
114
120
  {userIdentity}
115
121
  <ChevronDownIcon className={S.iconSm} />
@@ -21,6 +21,18 @@
21
21
  &:hover
22
22
  background-color var(--muted)
23
23
 
24
+ @media (max-width MOBILE)
25
+ max-width none
26
+ margin-left 0 !important
27
+ padding-right var(--p-1) !important
28
+ gap 0
29
+
30
+ .textCol
31
+ display none
32
+
33
+ .chevron
34
+ display none
35
+
24
36
  .iconTile
25
37
  position relative
26
38
  display flex
@@ -1,6 +1,7 @@
1
1
  // This file is automatically generated.
2
2
  // Please do not change this file!
3
3
  interface CssExports {
4
+ 'chevron': string;
4
5
  'icon': string;
5
6
  'iconTile': string;
6
7
  'item': string;
@@ -124,7 +124,7 @@ export function WorkspaceAppSwitcher({
124
124
  <span className={S.name}>{displayApp.displayName}</span>
125
125
  <span className={S.sub}>{displayApp.subtitle}</span>
126
126
  </span>
127
- <ChevronDown size={12} />
127
+ <ChevronDown className={S.chevron} size={12} aria-hidden />
128
128
  </Button>
129
129
  </DropdownMenuTrigger>
130
130
  <DropdownMenuContent
@@ -157,8 +157,8 @@ function StandaloneLayoutPreview() {
157
157
  appsStorageKey={DOCS_WORKSPACE_APPS_LS_KEY}
158
158
  defaultApps={DOCS_PREVIEW_APPS}
159
159
  user={{
160
- name: 'Preview User',
161
- email: 'preview@example.com',
160
+ name: 'Example User',
161
+ email: 'user@example.com',
162
162
  avatar: '',
163
163
  }}
164
164
  onLogout={() => undefined}
@@ -191,11 +191,9 @@ export default function StandaloneAppLayoutPage() {
191
191
  title="Standalone app layout"
192
192
  subheader={
193
193
  <>
194
- Live preview of AppShell + Sidebar + main column.{' '}
195
- <br />
196
- Greenfield wiring: copy{' '}
197
- <code>mini/sybilion-app-template/</code> and follow its README — this
198
- page is layout only.
194
+ Live preview of AppShell + Sidebar + main column. <br />
195
+ Greenfield wiring: copy <code>mini/sybilion-app-template/</code> and
196
+ follow its README — this page is layout only.
199
197
  </>
200
198
  }
201
199
  actions={<DocsHeaderActions />}
@@ -15,7 +15,7 @@ import {
15
15
  } from 'react';
16
16
 
17
17
  import { normalizeApiBaseUrl } from '#uilib/sybilion-auth/authPaths';
18
- import type { LoginTokenResponse, SybilionSDK } from '@sybilion/sdk';
18
+ import type { LoginTokenResponse, SybilionSDK } from '@sybilion/platform-sdk';
19
19
 
20
20
  const DEFAULT_TOKEN_KEY = 'sybilion.standalone.jwt';
21
21
 
@@ -1,8 +0,0 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { FileSpreadsheet } from 'lucide-react';
3
-
4
- function CsvIcon({ size = 32 }) {
5
- return (jsx(FileSpreadsheet, { size: size, "aria-hidden": true, strokeWidth: 1.75, color: "currentColor" }));
6
- }
7
-
8
- export { CsvIcon };
@@ -1,7 +0,0 @@
1
- import { FileSpreadsheet } from 'lucide-react';
2
-
3
- export function CsvIcon({ size = 32 }: { size?: number }) {
4
- return (
5
- <FileSpreadsheet size={size} aria-hidden strokeWidth={1.75} color="currentColor" />
6
- );
7
- }