@shane_donnelly/dsi-internal-react-utils 0.2.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Palette de couleurs personnalisée pour les composants chatbot.
3
+ * Toutes les propriétés sont optionnelles : seules les couleurs fournies
4
+ * surchargent les valeurs par défaut.
5
+ */
6
+ export interface ColorPalette {
7
+ /** Couleur de fond principale */
8
+ background?: string;
9
+ /** Couleur de fond secondaire (bulles, cartes) */
10
+ backgroundSecondary?: string;
11
+ /** Couleur de fond de la bulle utilisateur */
12
+ userBubbleBg?: string;
13
+ /** Couleur du texte dans la bulle utilisateur */
14
+ userBubbleText?: string;
15
+ /** Couleur du texte principal */
16
+ textPrimary?: string;
17
+ /** Couleur du texte secondaire (timestamps, hints) */
18
+ textSecondary?: string;
19
+ /** Couleur de bordure */
20
+ border?: string;
21
+ /** Couleur d'accentuation (boutons actifs) */
22
+ accent?: string;
23
+ /** Couleur d'accentuation au hover */
24
+ accentHover?: string;
25
+ /** Couleur de fond de la barre d'input */
26
+ inputBg?: string;
27
+ /** Couleur de fond des blocs de code */
28
+ codeBg?: string;
29
+ /** Couleur du texte dans les blocs de code */
30
+ codeText?: string;
31
+ /** Couleur de fond de l'élément de raisonnement */
32
+ reasoningBg?: string;
33
+ /** Couleur de bordure de l'élément de raisonnement */
34
+ reasoningBorder?: string;
35
+ /** Couleur du texte de l'élément de raisonnement */
36
+ reasoningText?: string;
37
+ /** Couleur de fond de l'élément tool/search */
38
+ toolBg?: string;
39
+ /** Couleur de bordure de l'élément tool/search */
40
+ toolBorder?: string;
41
+ /** Couleur de fond des boutons */
42
+ buttonBg?: string;
43
+ /** Couleur des boutons au hover */
44
+ buttonHoverBg?: string;
45
+ /** Couleur de fond du bouton d'action (envoi, stop…) */
46
+ actionButtonBg?: string;
47
+ /** Couleur de fond du bouton d'action au hover */
48
+ actionButtonHoverBg?: string;
49
+ /** Couleur de l'icône du bouton d'action */
50
+ actionButtonIcon?: string;
51
+ }
52
+ /** Thème prédéfini ou palette personnalisée */
53
+ export type Theme = "light" | "dark" | ColorPalette;
54
+ /**
55
+ * Définit le thème global des composants chatbot.
56
+ *
57
+ * @param theme - "light" | "dark" ou un objet ColorPalette personnalisé
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * setTheme("dark");
62
+ * setTheme({ userBubbleBg: "#4a90e2", userBubbleText: "#fff" });
63
+ * ```
64
+ */
65
+ export declare function setTheme(theme: Theme): void;
66
+ /** Retourne la palette de couleurs actuellement appliquée */
67
+ export declare function getTheme(): Required<ColorPalette>;
68
+ /** Retourne le thème actif ("light", "dark" ou ColorPalette) */
69
+ export declare function getCurrentTheme(): Theme;
70
+ /** @internal — abonnement aux changements de thème */
71
+ export declare function subscribeTheme(callback: () => void): () => void;
@@ -0,0 +1,65 @@
1
+ //#region lib/chatbot/theme/types.ts
2
+ var e = {
3
+ background: "#ffffff",
4
+ backgroundSecondary: "#f7f7f8",
5
+ userBubbleBg: "#f0f0f0",
6
+ userBubbleText: "#111111",
7
+ textPrimary: "#111111",
8
+ textSecondary: "#888888",
9
+ border: "#e5e5e5",
10
+ accent: "#0066cc",
11
+ accentHover: "#0052a3",
12
+ inputBg: "#ffffff",
13
+ codeBg: "#f6f8fa",
14
+ codeText: "#24292e",
15
+ reasoningBg: "#fafafa",
16
+ reasoningBorder: "#d1d5db",
17
+ reasoningText: "#4b5563",
18
+ toolBg: "#f9f9f9",
19
+ toolBorder: "#d1d5db",
20
+ buttonBg: "transparent",
21
+ buttonHoverBg: "#f0f0f0",
22
+ actionButtonBg: "#111111",
23
+ actionButtonHoverBg: "#333333",
24
+ actionButtonIcon: "#ffffff"
25
+ }, t = {
26
+ background: "#212121",
27
+ backgroundSecondary: "#2d2d2d",
28
+ userBubbleBg: "#303030",
29
+ userBubbleText: "#ececec",
30
+ textPrimary: "#ececec",
31
+ textSecondary: "#888888",
32
+ border: "#3d3d3d",
33
+ accent: "#60a5fa",
34
+ accentHover: "#93c5fd",
35
+ inputBg: "#2d2d2d",
36
+ codeBg: "#1e1e1e",
37
+ codeText: "#d4d4d4",
38
+ reasoningBg: "#282828",
39
+ reasoningBorder: "#4b4b4b",
40
+ reasoningText: "#b0b8c4",
41
+ toolBg: "#282828",
42
+ toolBorder: "#3d3d3d",
43
+ buttonBg: "transparent",
44
+ buttonHoverBg: "#3d3d3d",
45
+ actionButtonBg: "#ececec",
46
+ actionButtonHoverBg: "#d0d0d0",
47
+ actionButtonIcon: "#111111"
48
+ }, n = e, r = "light", i = /* @__PURE__ */ new Set();
49
+ function a(a) {
50
+ r = a, n = a === "light" ? e : a === "dark" ? t : {
51
+ ...e,
52
+ ...a
53
+ }, i.forEach((e) => e());
54
+ }
55
+ function o() {
56
+ return n;
57
+ }
58
+ function s() {
59
+ return r;
60
+ }
61
+ function c(e) {
62
+ return i.add(e), () => i.delete(e);
63
+ }
64
+ //#endregion
65
+ export { s as getCurrentTheme, o as getTheme, a as setTheme, c as subscribeTheme };
@@ -0,0 +1,6 @@
1
+ import { ColorPalette } from './types';
2
+ /**
3
+ * Hook React qui expose la palette de couleurs courante et se ré-abonne
4
+ * automatiquement quand `setTheme()` est appelé.
5
+ */
6
+ export declare function useTheme(): Required<ColorPalette>;
@@ -0,0 +1,9 @@
1
+ import { getTheme as e, subscribeTheme as t } from "./types.js";
2
+ import { useEffect as n, useState as r } from "react";
3
+ //#region lib/chatbot/theme/useTheme.ts
4
+ function i() {
5
+ let [i, a] = r(e);
6
+ return n(() => t(() => a(e())), []), i;
7
+ }
8
+ //#endregion
9
+ export { i as useTheme };
@@ -0,0 +1,108 @@
1
+ import e from "react";
2
+ //#region node_modules/react-icons/lib/iconContext.mjs
3
+ var t = {
4
+ color: void 0,
5
+ size: void 0,
6
+ className: void 0,
7
+ style: void 0,
8
+ attr: void 0
9
+ }, n = e.createContext && /* @__PURE__ */ e.createContext(t), r = [
10
+ "attr",
11
+ "size",
12
+ "title"
13
+ ];
14
+ function i(e, t) {
15
+ if (e == null) return {};
16
+ var n, r, i = a(e, t);
17
+ if (Object.getOwnPropertySymbols) {
18
+ var o = Object.getOwnPropertySymbols(e);
19
+ for (r = 0; r < o.length; r++) n = o[r], t.indexOf(n) === -1 && {}.propertyIsEnumerable.call(e, n) && (i[n] = e[n]);
20
+ }
21
+ return i;
22
+ }
23
+ function a(e, t) {
24
+ if (e == null) return {};
25
+ var n = {};
26
+ for (var r in e) if ({}.hasOwnProperty.call(e, r)) {
27
+ if (t.indexOf(r) !== -1) continue;
28
+ n[r] = e[r];
29
+ }
30
+ return n;
31
+ }
32
+ function o() {
33
+ return o = Object.assign ? Object.assign.bind() : function(e) {
34
+ for (var t = 1; t < arguments.length; t++) {
35
+ var n = arguments[t];
36
+ for (var r in n) ({}).hasOwnProperty.call(n, r) && (e[r] = n[r]);
37
+ }
38
+ return e;
39
+ }, o.apply(null, arguments);
40
+ }
41
+ function s(e, t) {
42
+ var n = Object.keys(e);
43
+ if (Object.getOwnPropertySymbols) {
44
+ var r = Object.getOwnPropertySymbols(e);
45
+ t && (r = r.filter(function(t) {
46
+ return Object.getOwnPropertyDescriptor(e, t).enumerable;
47
+ })), n.push.apply(n, r);
48
+ }
49
+ return n;
50
+ }
51
+ function c(e) {
52
+ for (var t = 1; t < arguments.length; t++) {
53
+ var n = arguments[t] == null ? {} : arguments[t];
54
+ t % 2 ? s(Object(n), !0).forEach(function(t) {
55
+ l(e, t, n[t]);
56
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : s(Object(n)).forEach(function(t) {
57
+ Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));
58
+ });
59
+ }
60
+ return e;
61
+ }
62
+ function l(e, t, n) {
63
+ return (t = u(t)) in e ? Object.defineProperty(e, t, {
64
+ value: n,
65
+ enumerable: !0,
66
+ configurable: !0,
67
+ writable: !0
68
+ }) : e[t] = n, e;
69
+ }
70
+ function u(e) {
71
+ var t = d(e, "string");
72
+ return typeof t == "symbol" ? t : t + "";
73
+ }
74
+ function d(e, t) {
75
+ if (typeof e != "object" || !e) return e;
76
+ var n = e[Symbol.toPrimitive];
77
+ if (n !== void 0) {
78
+ var r = n.call(e, t || "default");
79
+ if (typeof r != "object") return r;
80
+ throw TypeError("@@toPrimitive must return a primitive value.");
81
+ }
82
+ return (t === "string" ? String : Number)(e);
83
+ }
84
+ function f(t) {
85
+ return t && t.map((t, n) => /* @__PURE__ */ e.createElement(t.tag, c({ key: n }, t.attr), f(t.child)));
86
+ }
87
+ function p(t) {
88
+ return (n) => /* @__PURE__ */ e.createElement(m, o({ attr: c({}, t.attr) }, n), f(t.child));
89
+ }
90
+ function m(a) {
91
+ var s = (t) => {
92
+ var { attr: n, size: s, title: l } = a, u = i(a, r), d = s || t.size || "1em", f;
93
+ return t.className && (f = t.className), a.className && (f = (f ? f + " " : "") + a.className), /* @__PURE__ */ e.createElement("svg", o({
94
+ stroke: "currentColor",
95
+ fill: "currentColor",
96
+ strokeWidth: "0"
97
+ }, t.attr, n, u, {
98
+ className: f,
99
+ style: c(c({ color: a.color || t.color }, t.style), a.style),
100
+ height: d,
101
+ width: d,
102
+ xmlns: "http://www.w3.org/2000/svg"
103
+ }), l && /* @__PURE__ */ e.createElement("title", null, l), a.children);
104
+ };
105
+ return n === void 0 ? s(t) : /* @__PURE__ */ e.createElement(n.Consumer, null, (e) => s(e));
106
+ }
107
+ //#endregion
108
+ export { p as t };
package/dist/main.d.ts CHANGED
@@ -1,2 +1,4 @@
1
1
  export { KeycloakProvider, useKeycloakAuth, logoutKeycloak, refreshTokenKeycloak, } from './keycloak';
2
2
  export type { KeycloakProviderProps, KeycloakConfig, KeycloakAuthOptions, AuthStatus, AuthUser, AuthContextValue, LoginOptions, LogoutOptions, } from './keycloak';
3
+ export { setTheme, getTheme, getCurrentTheme, useTheme, MarkdownRenderer, UserMessage, BotMessage, defaultBotMessageRegistry, SessionHistory, InputBar, SessionContainer, } from './chatbot';
4
+ export type { ColorPalette, Theme, MarkdownRendererProps, UserMessageData, UserMessageProps, ElementData, TextElementData, ReasoningElementData, ToolElementData, SearchElementData, BotMessageData, BotMessageRegistry, BotMessageProps, SessionHistoryProps, SessionUserMessageSlots, InputBarProps, ActionButtonType, SessionContainerProps, } from './chatbot';
package/dist/main.js CHANGED
@@ -1,5 +1,14 @@
1
- import { logoutKeycloak as e, refreshTokenKeycloak as t } from "./keycloak/core/client.js";
2
- import { KeycloakProvider as n } from "./keycloak/react/KeycloakProvider/index.js";
3
- import { useKeycloakAuth as r } from "./keycloak/react/hooks/useKeycloakAuth.js";
1
+ import { t as e } from "./MarkdownRenderer-vU2aoyaG.js";
2
+ import { logoutKeycloak as t, refreshTokenKeycloak as n } from "./keycloak/core/client.js";
3
+ import { KeycloakProvider as r } from "./keycloak/react/KeycloakProvider/index.js";
4
+ import { useKeycloakAuth as i } from "./keycloak/react/hooks/useKeycloakAuth.js";
4
5
  import "./keycloak/index.js";
5
- export { n as KeycloakProvider, e as logoutKeycloak, t as refreshTokenKeycloak, r as useKeycloakAuth };
6
+ import { getCurrentTheme as a, getTheme as o, setTheme as s } from "./chatbot/theme/types.js";
7
+ import { useTheme as c } from "./chatbot/theme/useTheme.js";
8
+ import { t as l } from "./UserMessage-CkrDUpkQ.js";
9
+ import { n as u, t as d } from "./BotMessage-DegH8sM-.js";
10
+ import { t as f } from "./SessionHistory-BUYwbZjE.js";
11
+ import { t as p } from "./InputBar-CxSc2du6.js";
12
+ import { t as m } from "./SessionContainer-RrzUh_no.js";
13
+ import "./chatbot/index.js";
14
+ export { d as BotMessage, p as InputBar, r as KeycloakProvider, e as MarkdownRenderer, m as SessionContainer, f as SessionHistory, l as UserMessage, u as defaultBotMessageRegistry, a as getCurrentTheme, o as getTheme, t as logoutKeycloak, n as refreshTokenKeycloak, s as setTheme, i as useKeycloakAuth, c as useTheme };
package/dist/style.css ADDED
@@ -0,0 +1,2 @@
1
+ ._dsi-markdown_23cwi_1{color:inherit;word-break:break-word;font-family:inherit;font-size:1rem;line-height:1.7}._dsi-markdown_23cwi_1 h1,._dsi-markdown_23cwi_1 h2,._dsi-markdown_23cwi_1 h3,._dsi-markdown_23cwi_1 h4,._dsi-markdown_23cwi_1 h5,._dsi-markdown_23cwi_1 h6{margin:1.25em 0 .5em;font-weight:600;line-height:1.3}._dsi-markdown_23cwi_1 h1{font-size:1.6em}._dsi-markdown_23cwi_1 h2{font-size:1.35em}._dsi-markdown_23cwi_1 h3{font-size:1.15em}._dsi-markdown_23cwi_1 h4{font-size:1em}._dsi-markdown_23cwi_1 p{margin:.5em 0}._dsi-markdown_23cwi_1 a{color:var(--dsi-accent,#06c);text-underline-offset:2px;text-decoration:underline}._dsi-markdown_23cwi_1 a:hover{opacity:.8}._dsi-markdown_23cwi_1 ul,._dsi-markdown_23cwi_1 ol{margin:.5em 0;padding-left:1.5em}._dsi-markdown_23cwi_1 li{margin:.2em 0}._dsi-markdown_23cwi_1 li>p{margin:0}._dsi-markdown_23cwi_1 blockquote{border-left:3px solid var(--dsi-border,#e5e5e5);color:var(--dsi-text-secondary,#888);margin:.75em 0;padding:.4em 1em;font-style:italic}._dsi-markdown-table-wrapper_23cwi_64{width:100%;margin:.75em 0;display:inline-block;position:relative}._dsi-markdown-table-wrapper_23cwi_64 table{border-collapse:collapse;width:100%;margin:0;font-size:.9em}._dsi-markdown-table-wrapper_23cwi_64 th,._dsi-markdown-table-wrapper_23cwi_64 td{border:1px solid var(--dsi-border,#e5e5e5);text-align:left;padding:.45em .75em}._dsi-markdown-table-wrapper_23cwi_64 th{background:var(--dsi-bg-secondary,#f7f7f8);font-weight:600}._dsi-markdown-table-copy-btn_23cwi_86{background:var(--dsi-bg-secondary,#f7f7f8);border:1px solid var(--dsi-border,#e5e5e5);cursor:pointer;color:var(--dsi-text-secondary,#888);opacity:0;border-radius:4px;align-items:center;gap:4px;padding:4px 6px;font-family:inherit;font-size:.9em;transition:background .15s,color .15s,opacity .15s;display:flex;position:absolute;bottom:6px;right:6px}._dsi-markdown-table-wrapper_23cwi_64:hover ._dsi-markdown-table-copy-btn_23cwi_86{opacity:1}._dsi-markdown-table-copy-btn_23cwi_86:hover{color:var(--dsi-text-primary,#111);background:#0000000f}._dsi-markdown-table-copy-btn_23cwi_86 svg{font-size:1em}._dsi-markdown_23cwi_1 hr{border:none;border-top:1px solid var(--dsi-border,#e5e5e5);margin:1em 0}._dsi-markdown_23cwi_1 :not(pre)>code{background:var(--dsi-code-bg,#f6f8fa);color:var(--dsi-code-text,#24292e);border-radius:4px;padding:.15em .4em;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.875em}._dsi-markdown-code-block_23cwi_133{background:var(--dsi-code-bg,#f6f8fa);border:1px solid var(--dsi-border,#e5e5e5);border-radius:8px;margin:.75em 0;position:relative;overflow:hidden}._dsi-markdown-code-lang_23cwi_142{border-bottom:1px solid var(--dsi-border,#e5e5e5);color:var(--dsi-text-secondary,#888);letter-spacing:.03em;background:#0000000a;justify-content:space-between;align-items:center;padding:.35em .75em;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.75em;display:flex}._dsi-markdown-copy-btn_23cwi_155{cursor:pointer;color:var(--dsi-text-secondary,#888);background:0 0;border:none;border-radius:4px;align-items:center;gap:4px;padding:2px 6px;font-family:inherit;font-size:.9em;transition:background .15s,color .15s;display:flex}._dsi-markdown-copy-btn_23cwi_155:hover{color:var(--dsi-text-primary,#111);background:#0000000f}._dsi-markdown-copy-btn_23cwi_155 svg{font-size:.9em}._dsi-markdown-code-block_23cwi_133 pre{color:var(--dsi-code-text,#24292e);background:0 0;margin:0;padding:.9em 1em;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.875em;line-height:1.6;overflow-x:auto}._dsi-markdown-code-block_23cwi_133 pre code{font-size:inherit;color:inherit;background:0 0;border-radius:0;padding:0}._dsi-markdown_23cwi_1 input[type=checkbox]{accent-color:var(--dsi-accent,#06c);margin-right:.4em}._dsi-markdown_23cwi_1 img{border-radius:4px;max-width:100%}._dsi-markdown_23cwi_1 del{opacity:.7}._dsi-bot-msg_9iqvz_2{width:100%;color:var(--dsi-text-primary,#111);flex-direction:column;gap:.5em;padding-bottom:1.4em;font-size:.95rem;display:flex;position:relative}._dsi-bot-loading-dot_9iqvz_15{color:var(--dsi-text-primary,#111);margin-bottom:.1em;animation:1.4s ease-in-out infinite _dsi-bot-pulse_9iqvz_1;display:block}@keyframes _dsi-bot-pulse_9iqvz_1{0%,to{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(1.6)}}._dsi-bot-msg-footer_9iqvz_28{align-items:center;gap:.4em;height:1.2em;display:flex;position:absolute;bottom:0;left:0}._dsi-bot-copy-btn_9iqvz_39{cursor:pointer;color:var(--dsi-text-secondary,#888);background:0 0;border:none;border-radius:3px;align-items:center;gap:3px;padding:0;font-family:inherit;font-size:.85rem;line-height:1;transition:color .15s;display:flex}._dsi-bot-copy-btn_9iqvz_39:hover{color:var(--dsi-text-primary,#111)}._dsi-bot-copy-btn_9iqvz_39 svg{font-size:1em}._dsi-bot-msg-time_9iqvz_62{color:var(--dsi-text-secondary,#888);opacity:0;white-space:nowrap;font-size:.68rem;line-height:1;transition:opacity .15s}._dsi-bot-msg_9iqvz_2:hover ._dsi-bot-msg-time_9iqvz_62{opacity:1}._dsi-bot-reasoning_9iqvz_75,._dsi-bot-tool_9iqvz_76,._dsi-bot-search_9iqvz_77{color:var(--dsi-reasoning-text,#555);font-size:1em;font-style:italic}._dsi-bot-collapsible-header_9iqvz_84{cursor:pointer;-webkit-user-select:none;user-select:none;outline:none;align-items:center;gap:.4em;max-width:30%;padding:.25em 0;display:flex}._dsi-bot-collapsible-header_9iqvz_84:focus-visible{outline:2px solid var(--dsi-accent,#06c);border-radius:3px}._dsi-bot-collapsible-header-inner_9iqvz_99{flex:1;align-items:center;gap:.4em;min-width:0;display:flex;overflow:hidden}._dsi-bot-element-title_9iqvz_108{white-space:nowrap;text-overflow:ellipsis;font-size:.9em;overflow:hidden}._dsi-bot-collapse-chevron_9iqvz_115{opacity:.5;flex-shrink:0;font-size:1em;transition:opacity .15s,transform .2s}._dsi-bot-collapsible-header_9iqvz_84:hover ._dsi-bot-collapse-chevron_9iqvz_115{opacity:.8}._dsi-bot-collapsible-body_9iqvz_126{border-left:2px solid var(--dsi-reasoning-border,var(--dsi-tool-border,#d1d5db));max-width:90%;padding:.4em 0 .25em .75em}._dsi-bot-collapsible-content_9iqvz_132{white-space:pre-wrap;word-break:break-word;margin:0;font-size:.9em}._dsi-bot-search-icon_9iqvz_140{flex-shrink:0;font-size:1em}._dsi-bot-spinner_9iqvz_146{border:1.5px solid #00000026;border-top-color:var(--dsi-text-secondary,#888);border-radius:50%;flex-shrink:0;width:10px;height:10px;animation:.7s linear infinite _dsi-spin_9iqvz_1;display:inline-block}@keyframes _dsi-spin_9iqvz_1{to{transform:rotate(360deg)}}._dsi-inputbar_1ngbl_2{box-sizing:border-box;flex-direction:column;gap:0;width:100%;display:flex;position:relative}._dsi-inputbar-upper-slot_1ngbl_12{border:1px solid var(--dsi-border,#e5e5e5);background:var(--dsi-input-bg,#fff);box-sizing:border-box;border-bottom:none;border-radius:14px 14px 0 0;width:100%;padding:.5em .75em}._dsi-inputbar-plus-slot_1ngbl_23{z-index:100;background:var(--dsi-input-bg,#fff);border:1px solid var(--dsi-border,#e5e5e5);box-sizing:border-box;border-radius:12px;min-width:180px;padding:.4em 0;position:absolute;bottom:calc(100% + 4px);left:0;box-shadow:0 4px 20px #0000001a}._dsi-inputbar-row_1ngbl_38{background:var(--dsi-input-bg,#fff);border:1px solid var(--dsi-border,#e5e5e5);box-sizing:border-box;border-radius:14px;align-items:flex-end;gap:8px;padding:.55em .75em;transition:border-color .15s;display:flex}._dsi-inputbar-row_1ngbl_38:focus-within{border-color:var(--dsi-accent,#06c)}._dsi-inputbar-row--with-upper_1ngbl_55{border-radius:0 0 14px 14px}._dsi-inputbar-textarea_1ngbl_60{resize:none;color:var(--dsi-text-primary,#111);background:0 0;border:none;outline:none;flex:1;min-height:24px;max-height:200px;padding:0;font-family:inherit;font-size:.95rem;line-height:1.5;overflow-y:auto}._dsi-inputbar-textarea_1ngbl_60::placeholder{color:var(--dsi-text-secondary,#888)}._dsi-inputbar-plus-btn_1ngbl_81{border:1px solid var(--dsi-border,#e5e5e5);background:var(--dsi-button-bg,transparent);width:32px;height:32px;color:var(--dsi-text-primary,#111);cursor:pointer;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;padding:0;font-size:1.1em;transition:background .15s;display:flex}._dsi-inputbar-plus-btn_1ngbl_81:hover,._dsi-inputbar-plus-btn--open_1ngbl_100{background:var(--dsi-button-hover-bg,#f0f0f0)}._dsi-inputbar-action-btn_1ngbl_105{background:var(--dsi-action-btn-bg,#111);width:32px;height:32px;color:var(--dsi-action-btn-icon,#fff);cursor:pointer;border:none;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;padding:0;font-size:1em;transition:background .15s,opacity .15s;display:flex}._dsi-inputbar-action-btn_1ngbl_105:hover:not(:disabled){background:var(--dsi-action-btn-hover-bg,#333)}._dsi-inputbar-action-btn_1ngbl_105:disabled{opacity:.35;cursor:not-allowed}._dsi-user-msg-wrapper_e7uu3_1{flex-direction:column;align-items:flex-end;width:100%;padding-bottom:1.4em;display:flex;position:relative}._dsi-user-msg-top-slot_e7uu3_12{justify-content:flex-end;margin-bottom:4px;display:flex}._dsi-user-msg-row_e7uu3_19{align-items:center;gap:8px;max-width:70%;display:flex}._dsi-user-msg-left-slot_e7uu3_26,._dsi-user-msg-right-slot_e7uu3_27{flex-shrink:0;align-items:center;display:flex}._dsi-user-msg-bubble_e7uu3_34{background:var(--dsi-user-bubble-bg,#f0f0f0);color:var(--dsi-user-bubble-text,#111);word-break:break-word;border-radius:18px 18px 4px;min-width:40px;padding:10px 16px;font-size:.95rem;line-height:1.5}._dsi-user-msg-bottom-slot_e7uu3_46{justify-content:flex-end;margin-top:4px;display:flex}._dsi-user-msg-footer_e7uu3_53{opacity:0;align-items:center;gap:.35em;height:1.2em;transition:opacity .15s;display:flex;position:absolute;bottom:0;right:0}._dsi-user-msg-wrapper_e7uu3_1:hover ._dsi-user-msg-footer_e7uu3_53{opacity:1}._dsi-user-msg-copy-btn_e7uu3_69{cursor:pointer;color:var(--dsi-text-secondary,#888);background:0 0;border:none;border-radius:3px;align-items:center;gap:3px;padding:0;font-family:inherit;font-size:.85rem;line-height:1;transition:color .15s;display:flex}._dsi-user-msg-copy-btn_e7uu3_69:hover{color:var(--dsi-user-bubble-text,#111)}._dsi-user-msg-copy-btn_e7uu3_69 svg{font-size:.8em}._dsi-user-msg-time_e7uu3_92{color:var(--dsi-text-secondary,#888);white-space:nowrap;font-size:.68rem;line-height:1}._dsi-session-history_ju41j_1{box-sizing:border-box;flex-direction:column;gap:1.5em;width:100%;padding:1em 0;display:flex;overflow-y:auto}._dsi-session-container_1iida_1{box-sizing:border-box;background:var(--dsi-bg,#fff);flex-direction:column;width:100%;height:100%;display:flex;overflow:hidden}._dsi-session-container-history_1iida_11{box-sizing:border-box;flex:1;padding:0 1.5em;overflow-y:auto}._dsi-session-container-inputbar_1iida_18{box-sizing:border-box;flex-shrink:0;padding:.75em 1.5em 1em}
2
+ /*$vite$:1*/
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@shane_donnelly/dsi-internal-react-utils",
3
3
  "private": false,
4
- "version": "0.2.1",
4
+ "version": "1.0.0",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
@@ -22,14 +22,14 @@
22
22
  "eslint-plugin-react-refresh": "^0.5.2",
23
23
  "glob": "^13.0.6",
24
24
  "globals": "^17.4.0",
25
+ "keycloak-js": "^26.0.0",
26
+ "react": "^19.2.4",
27
+ "react-dom": "^19.2.4",
25
28
  "typescript": "~6.0.2",
26
29
  "typescript-eslint": "^8.58.0",
27
30
  "vite": "^8.0.4",
28
31
  "vite-plugin-dts": "^4.5.4",
29
- "vite-plugin-lib-inject-css": "^2.2.2",
30
- "react": "^19.2.4",
31
- "react-dom": "^19.2.4",
32
- "keycloak-js": "^26.0.0"
32
+ "vite-plugin-lib-inject-css": "^2.2.2"
33
33
  },
34
34
  "main": "dist/main.js",
35
35
  "types": "dist/main.d.ts",
@@ -44,8 +44,17 @@
44
44
  "dist"
45
45
  ],
46
46
  "peerDependencies": {
47
+ "keycloak-js": ">=25.0.0",
47
48
  "react": "^19.2.4",
48
- "react-dom": "^19.2.4",
49
- "keycloak-js": ">=25.0.0"
49
+ "react-dom": "^19.2.4"
50
+ },
51
+ "dependencies": {
52
+ "react-icons": "^5.6.0",
53
+ "react-markdown": "^10.1.0",
54
+ "rehype-highlight": "^7.0.2",
55
+ "rehype-katex": "^7.0.1",
56
+ "rehype-raw": "^7.0.0",
57
+ "remark-gfm": "^4.0.1",
58
+ "remark-math": "^6.0.0"
50
59
  }
51
60
  }