iris-chatbot 4.1.0 → 5.0.1
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/package.json +1 -1
- package/template/docs/plan-projects-sidebar-ui.md +11 -0
- package/template/next-env.d.ts +1 -1
- package/template/package-lock.json +2 -2
- package/template/package.json +1 -1
- package/template/src/app/globals.css +264 -10
- package/template/src/app/page.tsx +21 -6
- package/template/src/components/ChatView.tsx +178 -46
- package/template/src/components/Composer.tsx +84 -54
- package/template/src/components/MapView.tsx +21 -2
- package/template/src/components/MessageCard.tsx +1 -1
- package/template/src/components/SearchModal.tsx +1 -1
- package/template/src/components/SettingsModal.tsx +174 -104
- package/template/src/components/Sidebar.tsx +2 -4
- package/template/src/components/TopBar.tsx +4 -10
- package/template/src/lib/data.ts +5 -0
- package/template/src/lib/model-presets.ts +29 -0
package/package.json
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Projects plan – Sidebar UI addendum
|
|
2
|
+
|
|
3
|
+
When implementing the Sidebar for Projects, apply these UI details:
|
|
4
|
+
|
|
5
|
+
1. **Folder icon**
|
|
6
|
+
- **Remove** the folder icon from chat/thread rows (individual chats).
|
|
7
|
+
- **Add** the folder icon next to **project names** (each project in the project list, including "Inbox" if shown as a project).
|
|
8
|
+
|
|
9
|
+
2. **"Your Chats" label**
|
|
10
|
+
- Use the exact label **'Your Chats'** (title case).
|
|
11
|
+
- Do **not** render it in all caps: remove the `uppercase` class from the section heading (currently in Sidebar around line 86: `text-[11px] uppercase tracking-[0.18em]` → use the same size/tracking but drop `uppercase`) so it displays as **Your Chats**, not "YOUR CHATS".
|
package/template/next-env.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="next" />
|
|
2
2
|
/// <reference types="next/image-types/global" />
|
|
3
|
-
import "./.next/
|
|
3
|
+
import "./.next/types/routes.d.ts";
|
|
4
4
|
|
|
5
5
|
// NOTE: This file should not be edited
|
|
6
6
|
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iris",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "iris",
|
|
9
|
-
"version": "
|
|
9
|
+
"version": "5.0.1",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@anthropic-ai/sdk": "^0.72.1",
|
|
12
12
|
"clsx": "^2.1.1",
|
package/template/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
:root {
|
|
5
5
|
--topbar-height: 64px;
|
|
6
|
-
--bg: #
|
|
6
|
+
--bg: #212121;
|
|
7
7
|
--bg-alt: #1b1c1d;
|
|
8
8
|
--sidebar: #181818;
|
|
9
9
|
--sidebar-border: #202020;
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
--text-muted: #b1b7bf;
|
|
16
16
|
--accent: #10a37f;
|
|
17
17
|
--accent-2: #0e8e6f;
|
|
18
|
+
--accent-ring: var(--accent-2);
|
|
18
19
|
--danger: #ef4444;
|
|
19
20
|
--border: #2a2a2a;
|
|
20
21
|
--border-strong: #3a3a3a;
|
|
@@ -38,7 +39,7 @@
|
|
|
38
39
|
body {
|
|
39
40
|
background: var(--bg);
|
|
40
41
|
color: var(--text-primary);
|
|
41
|
-
font-family: var(--app-font, var(--font-
|
|
42
|
+
font-family: var(--app-font, var(--font-poppins));
|
|
42
43
|
min-height: 100vh;
|
|
43
44
|
-webkit-font-smoothing: antialiased;
|
|
44
45
|
text-rendering: optimizeLegibility;
|
|
@@ -48,6 +49,21 @@ a {
|
|
|
48
49
|
color: var(--accent);
|
|
49
50
|
}
|
|
50
51
|
|
|
52
|
+
input:focus,
|
|
53
|
+
select:focus,
|
|
54
|
+
textarea:focus,
|
|
55
|
+
button:focus {
|
|
56
|
+
outline: none;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
input:focus-visible,
|
|
60
|
+
select:focus-visible,
|
|
61
|
+
textarea:focus-visible,
|
|
62
|
+
button:focus-visible {
|
|
63
|
+
outline: none;
|
|
64
|
+
box-shadow: inset 0 0 0 1px var(--border-strong);
|
|
65
|
+
}
|
|
66
|
+
|
|
51
67
|
.chat-shell {
|
|
52
68
|
display: grid;
|
|
53
69
|
grid-template-columns: 248px minmax(0, 1fr);
|
|
@@ -82,10 +98,21 @@ a {
|
|
|
82
98
|
background: transparent !important;
|
|
83
99
|
backdrop-filter: none;
|
|
84
100
|
box-shadow: none;
|
|
85
|
-
position:
|
|
101
|
+
position: absolute;
|
|
86
102
|
top: 0;
|
|
103
|
+
left: 0;
|
|
104
|
+
right: 0;
|
|
87
105
|
z-index: 40;
|
|
88
106
|
height: var(--topbar-height);
|
|
107
|
+
pointer-events: none;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.topbar>*,
|
|
111
|
+
.topbar button,
|
|
112
|
+
.topbar a,
|
|
113
|
+
.topbar [role="listbox"],
|
|
114
|
+
.topbar [role="option"] {
|
|
115
|
+
pointer-events: auto;
|
|
89
116
|
}
|
|
90
117
|
|
|
91
118
|
|
|
@@ -249,7 +276,7 @@ a {
|
|
|
249
276
|
}
|
|
250
277
|
|
|
251
278
|
.assistant-card .message-content {
|
|
252
|
-
color:
|
|
279
|
+
color: var(--text-primary);
|
|
253
280
|
}
|
|
254
281
|
|
|
255
282
|
.message-loading-spinner {
|
|
@@ -271,7 +298,7 @@ a {
|
|
|
271
298
|
.composer-bar {
|
|
272
299
|
position: sticky;
|
|
273
300
|
bottom: 0;
|
|
274
|
-
background:
|
|
301
|
+
background: var(--bg);
|
|
275
302
|
z-index: 30;
|
|
276
303
|
}
|
|
277
304
|
|
|
@@ -299,13 +326,14 @@ a {
|
|
|
299
326
|
--sidebar: #ffffff;
|
|
300
327
|
--sidebar-border: #e5e5e5;
|
|
301
328
|
--panel: #ffffff;
|
|
302
|
-
--panel-2: #
|
|
303
|
-
--panel-3: #
|
|
329
|
+
--panel-2: #f6f6f6;
|
|
330
|
+
--panel-3: #f0f0f0;
|
|
304
331
|
--text-primary: #111111;
|
|
305
332
|
--text-secondary: #4a4a4a;
|
|
306
333
|
--text-muted: #6f6f6f;
|
|
307
334
|
--accent: #0e8e6f;
|
|
308
335
|
--accent-2: #0b7a5f;
|
|
336
|
+
--accent-ring: color-mix(in srgb, var(--accent) 55%, #000);
|
|
309
337
|
--danger: #dc2626;
|
|
310
338
|
--border: #d5d5d5;
|
|
311
339
|
--border-strong: #bdbdbd;
|
|
@@ -313,6 +341,51 @@ a {
|
|
|
313
341
|
--user-bubble: #d7f2ea;
|
|
314
342
|
}
|
|
315
343
|
|
|
344
|
+
/* Dark mode: white button background (no data-theme or data-theme="dark") */
|
|
345
|
+
:root .settings-tab-active,
|
|
346
|
+
:root .settings-btn-accent {
|
|
347
|
+
background: white !important;
|
|
348
|
+
color: #111111 !important;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
[data-theme="dark"] .settings-tab-active,
|
|
352
|
+
[data-theme="dark"] .settings-btn-accent {
|
|
353
|
+
background: white !important;
|
|
354
|
+
color: #111111 !important;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/* Light mode: black for selected tab and Save button */
|
|
358
|
+
[data-theme="light"] .settings-tab-active,
|
|
359
|
+
[data-theme="light"] .settings-btn-accent {
|
|
360
|
+
background: #111111 !important;
|
|
361
|
+
color: #ffffff !important;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
[data-theme="light"] .message-content pre,
|
|
365
|
+
[data-theme="light"] .message-content pre code {
|
|
366
|
+
color: #e5e7eb;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
[data-theme="light"] .message-content code {
|
|
370
|
+
background: rgba(0, 0, 0, 0.06);
|
|
371
|
+
color: var(--text-primary);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
[data-theme="light"] .message-loading-spinner {
|
|
375
|
+
border-color: rgba(0, 0, 0, 0.15);
|
|
376
|
+
border-top-color: #111111;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
[data-theme="light"] .send-button.active {
|
|
380
|
+
background: #111111;
|
|
381
|
+
color: #ffffff;
|
|
382
|
+
border-color: transparent;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
[data-theme="light"] .send-button.active svg {
|
|
386
|
+
color: #ffffff;
|
|
387
|
+
}
|
|
388
|
+
|
|
316
389
|
.message-content h1,
|
|
317
390
|
.message-content h2,
|
|
318
391
|
.message-content h3,
|
|
@@ -506,12 +579,16 @@ a {
|
|
|
506
579
|
}
|
|
507
580
|
|
|
508
581
|
.composer {
|
|
509
|
-
background:
|
|
582
|
+
background: #303030;
|
|
510
583
|
border: 1px solid var(--border);
|
|
511
584
|
border-radius: 18px;
|
|
512
585
|
padding: 10px 12px;
|
|
513
586
|
}
|
|
514
587
|
|
|
588
|
+
[data-theme="light"] .composer {
|
|
589
|
+
background: transparent;
|
|
590
|
+
}
|
|
591
|
+
|
|
515
592
|
.thread-shelf {
|
|
516
593
|
margin-top: 12px;
|
|
517
594
|
padding-top: 8px;
|
|
@@ -582,10 +659,22 @@ a {
|
|
|
582
659
|
line-height: 1.4;
|
|
583
660
|
padding-top: 7px;
|
|
584
661
|
padding-bottom: 9px;
|
|
662
|
+
padding-left: 6px;
|
|
585
663
|
/* One line by default; height grows with content in Composer.tsx */
|
|
586
664
|
min-height: calc(1.4em + 7px + 9px);
|
|
587
665
|
}
|
|
588
666
|
|
|
667
|
+
.composer-textarea:focus,
|
|
668
|
+
.composer-textarea:focus-visible {
|
|
669
|
+
box-shadow: none;
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
.search-modal-input:focus,
|
|
673
|
+
.search-modal-input:focus-visible {
|
|
674
|
+
outline: none;
|
|
675
|
+
box-shadow: none;
|
|
676
|
+
}
|
|
677
|
+
|
|
589
678
|
.send-button {
|
|
590
679
|
height: 40px;
|
|
591
680
|
width: 40px;
|
|
@@ -800,9 +889,174 @@ a {
|
|
|
800
889
|
}
|
|
801
890
|
|
|
802
891
|
.chat-scroll {
|
|
803
|
-
padding-top: calc(var(--topbar-height)
|
|
892
|
+
padding-top: calc(var(--topbar-height) + 24px);
|
|
893
|
+
position: relative;
|
|
804
894
|
}
|
|
805
895
|
|
|
806
896
|
.chat-scroll.empty {
|
|
807
|
-
padding-top: var(--topbar-height);
|
|
897
|
+
padding-top: calc(var(--topbar-height) + 24px);
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
/* ─── Ask Selection Button ─── */
|
|
901
|
+
|
|
902
|
+
.ask-selection-button {
|
|
903
|
+
position: absolute;
|
|
904
|
+
z-index: 50;
|
|
905
|
+
transform: translateX(-50%);
|
|
906
|
+
display: inline-flex;
|
|
907
|
+
align-items: center;
|
|
908
|
+
gap: 6px;
|
|
909
|
+
padding: 7px 14px;
|
|
910
|
+
border-radius: 10px;
|
|
911
|
+
border: 1px solid rgba(255, 255, 255, 0.15);
|
|
912
|
+
background: rgba(50, 50, 50, 0.92);
|
|
913
|
+
backdrop-filter: blur(12px);
|
|
914
|
+
-webkit-backdrop-filter: blur(12px);
|
|
915
|
+
color: #f0f0f0;
|
|
916
|
+
font-size: 13px;
|
|
917
|
+
font-weight: 600;
|
|
918
|
+
letter-spacing: 0.01em;
|
|
919
|
+
cursor: pointer;
|
|
920
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.35), 0 0 0 0.5px rgba(255, 255, 255, 0.06);
|
|
921
|
+
animation: ask-button-enter 0.18s ease-out;
|
|
922
|
+
transition: background 0.15s ease, border-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
|
|
923
|
+
white-space: nowrap;
|
|
924
|
+
user-select: none;
|
|
925
|
+
-webkit-user-select: none;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
.ask-selection-button:hover {
|
|
929
|
+
background: rgba(60, 60, 60, 0.95);
|
|
930
|
+
border-color: rgba(255, 255, 255, 0.22);
|
|
931
|
+
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.4), 0 0 0 0.5px rgba(255, 255, 255, 0.1);
|
|
932
|
+
transform: translateX(-50%) translateY(-1px);
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
.ask-selection-button:active {
|
|
936
|
+
transform: translateX(-50%) translateY(0);
|
|
937
|
+
background: rgba(70, 70, 70, 0.95);
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
@keyframes ask-button-enter {
|
|
941
|
+
from {
|
|
942
|
+
opacity: 0;
|
|
943
|
+
transform: translateX(-50%) translateY(6px) scale(0.92);
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
to {
|
|
947
|
+
opacity: 1;
|
|
948
|
+
transform: translateX(-50%) translateY(0) scale(1);
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
/* ─── Quoted Context Container ─── */
|
|
953
|
+
|
|
954
|
+
.composer-wrapper {
|
|
955
|
+
display: flex;
|
|
956
|
+
flex-direction: column;
|
|
957
|
+
gap: 0;
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
.quoted-context-container {
|
|
961
|
+
display: flex;
|
|
962
|
+
align-items: flex-start;
|
|
963
|
+
gap: 10px;
|
|
964
|
+
padding: 12px 14px;
|
|
965
|
+
margin-bottom: 0;
|
|
966
|
+
background: #2b2b2b;
|
|
967
|
+
border: 1px solid var(--border);
|
|
968
|
+
border-bottom: none;
|
|
969
|
+
border-radius: 18px 18px 0 0;
|
|
970
|
+
animation: quoted-context-enter 0.22s ease-out;
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
.quoted-context-container+.composer {
|
|
974
|
+
border-top-left-radius: 0;
|
|
975
|
+
border-top-right-radius: 0;
|
|
976
|
+
border-top-color: var(--border);
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
.quoted-context-content {
|
|
980
|
+
flex: 1;
|
|
981
|
+
display: flex;
|
|
982
|
+
align-items: flex-start;
|
|
983
|
+
gap: 10px;
|
|
984
|
+
min-width: 0;
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
.quoted-context-icon {
|
|
988
|
+
flex-shrink: 0;
|
|
989
|
+
width: 18px;
|
|
990
|
+
height: 18px;
|
|
991
|
+
color: var(--text-muted);
|
|
992
|
+
margin-top: 1px;
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
.quoted-context-text {
|
|
996
|
+
font-size: 13px;
|
|
997
|
+
line-height: 1.5;
|
|
998
|
+
color: var(--text-secondary);
|
|
999
|
+
overflow: hidden;
|
|
1000
|
+
display: -webkit-box;
|
|
1001
|
+
-webkit-line-clamp: 3;
|
|
1002
|
+
line-clamp: 3;
|
|
1003
|
+
-webkit-box-orient: vertical;
|
|
1004
|
+
word-break: break-word;
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
.quoted-context-dismiss {
|
|
1008
|
+
flex-shrink: 0;
|
|
1009
|
+
display: inline-flex;
|
|
1010
|
+
align-items: center;
|
|
1011
|
+
justify-content: center;
|
|
1012
|
+
width: 24px;
|
|
1013
|
+
height: 24px;
|
|
1014
|
+
border-radius: 999px;
|
|
1015
|
+
border: none;
|
|
1016
|
+
background: transparent;
|
|
1017
|
+
color: var(--text-muted);
|
|
1018
|
+
cursor: pointer;
|
|
1019
|
+
transition: color 0.15s ease, background 0.15s ease;
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
.quoted-context-dismiss:hover {
|
|
1023
|
+
color: var(--text-primary);
|
|
1024
|
+
background: rgba(255, 255, 255, 0.08);
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
@keyframes quoted-context-enter {
|
|
1028
|
+
from {
|
|
1029
|
+
opacity: 0;
|
|
1030
|
+
transform: translateY(6px);
|
|
1031
|
+
max-height: 0;
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
to {
|
|
1035
|
+
opacity: 1;
|
|
1036
|
+
transform: translateY(0);
|
|
1037
|
+
max-height: 200px;
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
/* ─── Light theme overrides ─── */
|
|
1042
|
+
|
|
1043
|
+
[data-theme="light"] .ask-selection-button {
|
|
1044
|
+
background: rgba(255, 255, 255, 0.94);
|
|
1045
|
+
border-color: rgba(0, 0, 0, 0.12);
|
|
1046
|
+
color: #111111;
|
|
1047
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12), 0 0 0 0.5px rgba(0, 0, 0, 0.05);
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
[data-theme="light"] .ask-selection-button:hover {
|
|
1051
|
+
background: #ffffff;
|
|
1052
|
+
border-color: rgba(0, 0, 0, 0.18);
|
|
1053
|
+
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15), 0 0 0 0.5px rgba(0, 0, 0, 0.08);
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1056
|
+
[data-theme="light"] .quoted-context-container {
|
|
1057
|
+
background: transparent;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
[data-theme="light"] .quoted-context-dismiss:hover {
|
|
1061
|
+
background: rgba(0, 0, 0, 0.06);
|
|
808
1062
|
}
|
|
@@ -12,6 +12,8 @@ import {
|
|
|
12
12
|
createNewThread,
|
|
13
13
|
deleteConversation,
|
|
14
14
|
deleteThread,
|
|
15
|
+
DEFAULT_ACCENT_DARK,
|
|
16
|
+
DEFAULT_ACCENT_LIGHT,
|
|
15
17
|
} from "../lib/data";
|
|
16
18
|
import { db } from "../lib/db";
|
|
17
19
|
import {
|
|
@@ -122,7 +124,7 @@ export default function Home() {
|
|
|
122
124
|
? "var(--font-sora)"
|
|
123
125
|
: settings.font === "space"
|
|
124
126
|
? "var(--font-space)"
|
|
125
|
-
: "var(--font-
|
|
127
|
+
: "var(--font-poppins)";
|
|
126
128
|
document.documentElement.style.setProperty("--app-font", fontVar);
|
|
127
129
|
document.body.style.fontFamily = fontVar;
|
|
128
130
|
}, [settings, connectionOverrideId, setConnectionOverrideId]);
|
|
@@ -331,10 +333,23 @@ export default function Home() {
|
|
|
331
333
|
<div
|
|
332
334
|
className={`chat-shell ${sidebarCollapsed ? "collapsed" : ""}`}
|
|
333
335
|
style={
|
|
334
|
-
{
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
336
|
+
(() => {
|
|
337
|
+
const stored = settings?.accentColor || DEFAULT_ACCENT_DARK;
|
|
338
|
+
const isDefaultGray = stored === DEFAULT_ACCENT_DARK;
|
|
339
|
+
const isLight =
|
|
340
|
+
settings?.theme === "light" ||
|
|
341
|
+
(typeof document !== "undefined" &&
|
|
342
|
+
document.documentElement.dataset.theme === "light");
|
|
343
|
+
const effective =
|
|
344
|
+
isDefaultGray && isLight ? DEFAULT_ACCENT_LIGHT : stored;
|
|
345
|
+
return {
|
|
346
|
+
"--accent": effective,
|
|
347
|
+
"--accent-2": effective,
|
|
348
|
+
...(isLight && {
|
|
349
|
+
"--accent-ring": "color-mix(in srgb, var(--accent) 55%, #000)",
|
|
350
|
+
}),
|
|
351
|
+
} as CSSProperties;
|
|
352
|
+
})()
|
|
338
353
|
}
|
|
339
354
|
>
|
|
340
355
|
<Sidebar
|
|
@@ -387,7 +402,7 @@ export default function Home() {
|
|
|
387
402
|
onOpenSearch={() => setSearchOpen(true)}
|
|
388
403
|
/>
|
|
389
404
|
|
|
390
|
-
<div className="flex h-screen min-w-0 flex-col overflow-hidden">
|
|
405
|
+
<div className="relative flex h-screen min-w-0 flex-col overflow-hidden">
|
|
391
406
|
<TopBar
|
|
392
407
|
connectionId={connection?.id ?? ""}
|
|
393
408
|
connectionName={connection?.name ?? "No connection"}
|