@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.
- package/dist/esm/components/icons/CsvIcon/CsvIcon.js +8 -0
- package/dist/esm/components/icons/CsvIcon/csv.svg.js +24 -0
- package/dist/esm/components/ui/AppHeader/AppHeader.styl.js +1 -1
- package/dist/esm/components/ui/Card/Card.styl.js +1 -1
- package/dist/esm/components/ui/Chat/ChatChrome/ChatChrome.js +1 -1
- package/dist/esm/components/ui/Chat/ChatMessage/ChatMessage.styl.js +1 -1
- package/dist/esm/components/ui/Chat/ChatMessage/UserCsvAttachmentBubble.js +1 -1
- package/dist/esm/components/ui/Chat/ChatPrompt/ChatPrompt.helpers.js +31 -0
- package/dist/esm/components/ui/Chat/ChatPrompt/ChatPrompt.js +11 -3
- package/dist/esm/components/ui/Chat/ChatPrompt/ChatPrompt.styl.js +2 -2
- package/dist/esm/components/ui/NavUserHeader/NavUserHeader.js +5 -2
- package/dist/esm/components/ui/WorkspaceAppSwitcher/WorkspaceAppSwitcher.js +1 -1
- package/dist/esm/components/ui/WorkspaceAppSwitcher/WorkspaceAppSwitcher.styl.js +2 -2
- package/dist/esm/index.js +1 -0
- package/dist/esm/types/src/components/ui/Chat/Chat.types.d.ts +2 -0
- package/dist/esm/types/src/components/ui/Chat/ChatPrompt/ChatPrompt.d.ts +1 -1
- package/dist/esm/types/src/components/ui/Chat/ChatPrompt/ChatPrompt.helpers.d.ts +6 -0
- package/dist/esm/types/src/components/ui/Chat/index.d.ts +1 -0
- package/dist/esm/types/src/sybilion-auth/SybilionAuthProvider.d.ts +1 -1
- package/package.json +4 -4
- package/src/components/icons/CsvIcon/CsvIcon.tsx +5 -0
- package/src/components/icons/CsvIcon/csv.svg +4 -0
- package/src/components/ui/AppHeader/AppHeader.styl +4 -0
- package/src/components/ui/Card/Card.styl +1 -0
- package/src/components/ui/Chat/Chat.types.ts +2 -0
- package/src/components/ui/Chat/ChatChrome/ChatChrome.tsx +1 -0
- package/src/components/ui/Chat/ChatMessage/ChatMessage.styl +6 -11
- package/src/components/ui/Chat/ChatMessage/UserCsvAttachmentBubble.tsx +2 -2
- package/src/components/ui/Chat/ChatPrompt/ChatPrompt.helpers.ts +43 -0
- package/src/components/ui/Chat/ChatPrompt/ChatPrompt.styl +36 -20
- package/src/components/ui/Chat/ChatPrompt/ChatPrompt.styl.d.ts +2 -1
- package/src/components/ui/Chat/ChatPrompt/ChatPrompt.tsx +28 -13
- package/src/components/ui/Chat/index.ts +1 -0
- package/src/components/ui/NavUserHeader/NavUserHeader.tsx +9 -3
- package/src/components/ui/WorkspaceAppSwitcher/WorkspaceAppSwitcher.styl +12 -0
- package/src/components/ui/WorkspaceAppSwitcher/WorkspaceAppSwitcher.styl.d.ts +1 -0
- package/src/components/ui/WorkspaceAppSwitcher/WorkspaceAppSwitcher.tsx +1 -1
- package/src/docs/pages/StandaloneAppLayoutPage/StandaloneAppLayoutPage.tsx +5 -7
- package/src/sybilion-auth/SybilionAuthProvider.tsx +1 -1
- package/dist/esm/components/ui/Chat/ChatMessage/icons/CsvIcon.js +0 -8
- package/src/components/ui/Chat/ChatMessage/icons/CsvIcon.tsx +0 -7
- /package/dist/esm/types/src/components/{ui/Chat/ChatMessage/icons → icons/CsvIcon}/CsvIcon.d.ts +0 -0
|
@@ -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(--
|
|
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 '
|
|
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) }),
|
|
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:
|
|
4
|
-
var S = {"root":"ChatPrompt_root__5G5bq","
|
|
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
|
|
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,
|
|
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","
|
|
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.
|
|
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,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>
|
|
@@ -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 {
|
|
@@ -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-
|
|
45
|
+
gap var(--p-2)
|
|
47
46
|
padding var(--p-3)
|
|
48
47
|
padding-right var(--p-4)
|
|
49
|
-
background-color var(--
|
|
48
|
+
background-color var(--background)
|
|
50
49
|
box-shadow 0 0 0 1px var(--border)
|
|
51
|
-
border-radius var(--p-
|
|
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-
|
|
90
|
-
font-weight
|
|
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-
|
|
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 '
|
|
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
|
|
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-
|
|
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
|
-
.
|
|
52
|
+
.submitColumn
|
|
24
53
|
display flex
|
|
54
|
+
flex-direction column
|
|
55
|
+
flex-shrink 0
|
|
25
56
|
align-items center
|
|
26
|
-
|
|
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
|
-
<
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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.
|
|
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"
|
|
@@ -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
|
|
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(
|
|
112
|
+
className={cn(
|
|
113
|
+
S.userButton,
|
|
114
|
+
effectiveVariant === 'compact' && S.compact,
|
|
115
|
+
)}
|
|
110
116
|
>
|
|
111
117
|
{avatar}
|
|
112
|
-
{
|
|
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
|
|
@@ -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: '
|
|
161
|
-
email: '
|
|
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
|
-
<
|
|
196
|
-
|
|
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 };
|
/package/dist/esm/types/src/components/{ui/Chat/ChatMessage/icons → icons/CsvIcon}/CsvIcon.d.ts
RENAMED
|
File without changes
|