collabmd 0.1.21 → 0.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +94 -7
  2. package/bin/collabmd.js +3 -2
  3. package/docker-compose.yml +13 -1
  4. package/package.json +2 -1
  5. package/public/assets/css/style.css +1 -1
  6. package/public/assets/js/chunks/{chunk-HEWVH67U.js → chunk-CYK7KO7W.js} +8 -8
  7. package/public/assets/js/chunks/editor-session-S5AT7BMV.js +22 -0
  8. package/public/assets/js/{excalidraw-editor-TCIH6GJL.js → excalidraw-editor-5YWMGLKF.js} +145 -62
  9. package/public/assets/js/excalidraw-editor.js +1 -1
  10. package/public/assets/js/main.js +503 -182
  11. package/public/index.html +104 -84
  12. package/src/client/application/app-shell/git-feature.js +247 -9
  13. package/src/client/application/app-shell/ui-feature.js +65 -7
  14. package/src/client/application/app-shell/workspace-feature.js +46 -0
  15. package/src/client/application/app-shell-elements.js +2 -0
  16. package/src/client/application/mermaid-preview-hydrator.js +1 -1
  17. package/src/client/application/plantuml-preview-hydrator.js +1 -1
  18. package/src/client/application/workspace-coordinator.js +147 -18
  19. package/src/client/application/workspace-preview-controller.js +34 -0
  20. package/src/client/application/workspace-route-controller.js +104 -0
  21. package/src/client/bootstrap/collabmd-app-shell.js +95 -0
  22. package/src/client/domain/runtime-paths.js +5 -0
  23. package/src/client/excalidraw-editor.js +50 -2
  24. package/src/client/infrastructure/auth-client.js +219 -52
  25. package/src/client/infrastructure/browser-navigation-port.js +20 -0
  26. package/src/client/infrastructure/editor-collaboration-client.js +4 -0
  27. package/src/client/infrastructure/editor-session.js +47 -7
  28. package/src/client/infrastructure/editor-view-adapter.js +122 -58
  29. package/src/client/infrastructure/runtime-config.js +66 -0
  30. package/src/client/presentation/comment-ui-controller.js +82 -26
  31. package/src/client/presentation/comments-panel.js +2 -2
  32. package/src/client/presentation/excalidraw-embed-controller.js +60 -2
  33. package/src/client/presentation/file-history-view-controller.js +806 -0
  34. package/src/client/presentation/git-diff-view-controller.js +718 -121
  35. package/src/client/presentation/git-panel-controller.js +458 -66
  36. package/src/client/presentation/layout-controller.js +1 -1
  37. package/src/client/styles/components/actions.css +89 -0
  38. package/src/client/styles/components/feedback.css +43 -0
  39. package/src/client/styles/components/navigation.css +68 -0
  40. package/src/client/styles/components/scrollbars.css +104 -0
  41. package/src/client/styles/components/states.css +289 -0
  42. package/src/client/styles/components/surfaces.css +155 -0
  43. package/src/client/styles/features/backlinks.css +213 -0
  44. package/src/client/styles/features/collaboration-chat.css +228 -0
  45. package/src/client/styles/features/collaboration-dialogs.css +154 -0
  46. package/src/client/styles/features/collaboration-presence.css +103 -0
  47. package/src/client/styles/features/collaboration-ui.css +3 -0
  48. package/src/client/styles/features/comment-card.css +236 -0
  49. package/src/client/styles/features/comment-markdown.css +127 -0
  50. package/src/client/styles/features/comment-overlays.css +60 -0
  51. package/src/client/styles/features/comments-drawer.css +120 -0
  52. package/src/client/styles/features/comments.css +4 -0
  53. package/src/client/styles/features/diagram-preview.css +227 -0
  54. package/src/client/styles/features/diff-commit.css +268 -0
  55. package/src/client/styles/features/diff-lines.css +160 -0
  56. package/src/client/styles/features/diff-toolbar.css +98 -0
  57. package/src/client/styles/features/diff.css +3 -0
  58. package/src/client/styles/features/embedded-preview.css +218 -0
  59. package/src/client/styles/features/git-branch.css +155 -0
  60. package/src/client/styles/features/git-files.css +105 -0
  61. package/src/client/styles/features/git-history.css +339 -0
  62. package/src/client/styles/features/git.css +3 -0
  63. package/src/client/styles/features/media-lightbox.css +157 -0
  64. package/src/client/styles/features/outline.css +115 -0
  65. package/src/client/styles/features/preview-content.css +3 -0
  66. package/src/client/styles/features/preview-markdown.css +201 -0
  67. package/src/client/styles/features/preview-sidebars.css +2 -0
  68. package/src/client/styles/features/quick-switcher.css +167 -0
  69. package/src/client/styles/foundation/themes.css +347 -0
  70. package/src/client/styles/foundation/tokens.css +66 -0
  71. package/src/client/styles/foundation/utilities.css +36 -0
  72. package/src/client/styles/layout/editor-page.css +203 -0
  73. package/src/client/styles/layout/overlays.css +132 -0
  74. package/src/client/styles/layout/responsive.css +251 -0
  75. package/src/client/styles/layout/shell.css +314 -0
  76. package/src/client/styles/layout/sidebar.css +176 -0
  77. package/src/client/styles/layout/view-modes.css +92 -0
  78. package/src/client/styles/overrides/codemirror.css +53 -0
  79. package/src/client/styles/overrides/highlightjs.css +7 -0
  80. package/src/client/styles/overrides/vendor.css +2 -0
  81. package/src/client/styles/primitives/controls.css +276 -0
  82. package/src/client/styles/style.css +25 -4945
  83. package/src/server/auth/create-auth-service.js +373 -15
  84. package/src/server/auth/session-cookie.js +30 -4
  85. package/src/server/config/env.js +121 -5
  86. package/src/server/create-app-server.js +8 -0
  87. package/src/server/domain/collaboration/collaboration-room.js +90 -47
  88. package/src/server/index.js +3 -1
  89. package/src/server/infrastructure/git/command-runner.js +2 -1
  90. package/src/server/infrastructure/git/git-service.js +48 -2
  91. package/src/server/infrastructure/git/history-service.js +683 -0
  92. package/src/server/infrastructure/git/parsers.js +30 -0
  93. package/src/server/infrastructure/git/responses.js +73 -0
  94. package/src/server/infrastructure/http/create-auth-api-handler.js +30 -2
  95. package/src/server/infrastructure/http/create-git-api-command-handler.js +2 -0
  96. package/src/server/infrastructure/http/create-git-api-handler.js +2 -0
  97. package/src/server/infrastructure/http/create-git-api-query-handler.js +61 -0
  98. package/src/server/infrastructure/http/create-request-handler.js +15 -0
  99. package/public/assets/js/chunks/editor-session-EAUBJCHH.js +0 -22
@@ -0,0 +1,155 @@
1
+ /* ===== COMPONENTS / SURFACES ===== */
2
+
3
+ .ui-record-surface {
4
+ --ui-record-padding: var(--space-3);
5
+ --ui-record-gap: var(--space-2);
6
+ --ui-record-radius: var(--radius-md);
7
+ --ui-record-border: var(--color-border);
8
+ --ui-record-bg: var(--color-surface-2);
9
+ --ui-record-color: var(--color-text-muted);
10
+ --ui-record-border-hover: var(--ui-record-border);
11
+ --ui-record-bg-hover: var(--color-surface-offset);
12
+ --ui-record-shadow: none;
13
+ --ui-record-shadow-hover: var(--ui-record-shadow);
14
+ --ui-record-border-active: var(--ui-record-border-hover);
15
+ --ui-record-bg-active: var(--ui-record-bg-hover);
16
+ --ui-record-shadow-active: var(--ui-record-shadow-hover);
17
+ --ui-record-hover-transform: none;
18
+ appearance: none;
19
+ display: flex;
20
+ flex-direction: column;
21
+ gap: var(--ui-record-gap);
22
+ width: 100%;
23
+ min-width: 0;
24
+ padding: var(--ui-record-padding);
25
+ border: 1px solid var(--ui-record-border);
26
+ border-radius: var(--ui-record-radius);
27
+ background: var(--ui-record-bg);
28
+ color: var(--ui-record-color);
29
+ text-align: left;
30
+ box-shadow: var(--ui-record-shadow);
31
+ transition:
32
+ transform 140ms ease,
33
+ border-color var(--transition-interactive),
34
+ background var(--transition-interactive),
35
+ box-shadow var(--transition-interactive),
36
+ color var(--transition-interactive);
37
+ }
38
+
39
+ .ui-record-surface:hover {
40
+ transform: var(--ui-record-hover-transform);
41
+ border-color: var(--ui-record-border-hover);
42
+ background: var(--ui-record-bg-hover);
43
+ box-shadow: var(--ui-record-shadow-hover);
44
+ color: var(--color-text);
45
+ }
46
+
47
+ .ui-record-surface.active,
48
+ .ui-record-surface.is-active,
49
+ .ui-record-surface[aria-current='true'] {
50
+ border-color: var(--ui-record-border-active);
51
+ background: var(--ui-record-bg-active);
52
+ box-shadow: var(--ui-record-shadow-active);
53
+ color: var(--color-text);
54
+ }
55
+
56
+ .ui-record-header,
57
+ .ui-record-meta {
58
+ display: flex;
59
+ align-items: center;
60
+ gap: var(--space-2);
61
+ min-width: 0;
62
+ }
63
+
64
+ .ui-record-header {
65
+ justify-content: space-between;
66
+ }
67
+
68
+ .ui-record-meta {
69
+ flex-wrap: wrap;
70
+ color: var(--color-text-faint);
71
+ }
72
+
73
+ .ui-record-copy {
74
+ display: flex;
75
+ flex: 1;
76
+ flex-direction: column;
77
+ min-width: 0;
78
+ }
79
+
80
+ .ui-record-title {
81
+ min-width: 0;
82
+ overflow: hidden;
83
+ text-overflow: ellipsis;
84
+ white-space: nowrap;
85
+ }
86
+
87
+ .ui-record-subtitle {
88
+ overflow: hidden;
89
+ color: var(--color-text-faint);
90
+ text-overflow: ellipsis;
91
+ white-space: nowrap;
92
+ }
93
+
94
+ .ui-record-actions {
95
+ display: inline-flex;
96
+ align-items: center;
97
+ gap: var(--space-1);
98
+ flex-wrap: wrap;
99
+ }
100
+
101
+ .ui-item-row {
102
+ --ui-item-row-bg-hover: var(--color-surface-offset);
103
+ --ui-item-row-bg-active: var(--color-primary-highlight);
104
+ display: flex;
105
+ align-items: center;
106
+ gap: var(--space-2);
107
+ padding: 2px;
108
+ border-radius: var(--radius-md);
109
+ transition: background var(--transition-interactive), color var(--transition-interactive);
110
+ }
111
+
112
+ .ui-item-row:hover {
113
+ background: var(--ui-item-row-bg-hover);
114
+ }
115
+
116
+ .ui-item-row.active,
117
+ .ui-item-row.is-active {
118
+ background: var(--ui-item-row-bg-active);
119
+ }
120
+
121
+ .ui-item-main {
122
+ display: flex;
123
+ align-items: center;
124
+ gap: var(--space-2);
125
+ min-width: 0;
126
+ flex: 1;
127
+ }
128
+
129
+ .ui-item-copy {
130
+ display: flex;
131
+ flex: 1;
132
+ flex-direction: column;
133
+ min-width: 0;
134
+ }
135
+
136
+ .ui-item-title {
137
+ overflow: hidden;
138
+ text-overflow: ellipsis;
139
+ white-space: nowrap;
140
+ }
141
+
142
+ .ui-item-subtitle {
143
+ overflow: hidden;
144
+ color: var(--color-text-faint);
145
+ text-overflow: ellipsis;
146
+ white-space: nowrap;
147
+ }
148
+
149
+ .ui-item-actions {
150
+ display: inline-flex;
151
+ align-items: center;
152
+ gap: 4px;
153
+ flex-shrink: 0;
154
+ flex-wrap: wrap;
155
+ }
@@ -0,0 +1,213 @@
1
+ /* ===== PREVIEW SIDEBARS / BACKLINKS ===== */
2
+
3
+ .backlinks-panel.hidden,
4
+ .backlinks-panel-layer.hidden {
5
+ display: none;
6
+ }
7
+
8
+ .backlinks-panel {
9
+ min-width: 0;
10
+ }
11
+
12
+ .backlinks-panel-layer {
13
+ position: absolute;
14
+ left: max(var(--space-4), calc((100% - min(var(--preview-content-max-width), 100%)) / 2));
15
+ bottom: calc(var(--space-5) + env(safe-area-inset-bottom, 0px));
16
+ z-index: 14;
17
+ width: min(320px, calc(min(var(--preview-content-max-width), 100%) - var(--space-8)));
18
+ pointer-events: none;
19
+ }
20
+
21
+ .backlinks-panel-dock {
22
+ display: flex;
23
+ flex-direction: column-reverse;
24
+ overflow: hidden;
25
+ border: 1px solid var(--color-divider);
26
+ border-radius: var(--radius-xl-plus);
27
+ background: var(--surface-overlay);
28
+ box-shadow: var(--shadow-floating-soft);
29
+ backdrop-filter: blur(16px);
30
+ pointer-events: auto;
31
+ transition: box-shadow 160ms ease, transform 160ms ease, background-color 160ms ease, border-color 160ms ease;
32
+ }
33
+
34
+ .backlinks-panel-dock:hover {
35
+ transform: translateY(-1px);
36
+ box-shadow: var(--shadow-floating-hover);
37
+ }
38
+
39
+ .backlinks-panel-inline {
40
+ margin-top: var(--space-6);
41
+ padding: 0 var(--space-4);
42
+ border-top: 1px solid var(--color-divider);
43
+ }
44
+
45
+ .backlinks-header {
46
+ display: flex;
47
+ align-items: center;
48
+ gap: var(--space-2);
49
+ padding: var(--space-3) 0;
50
+ cursor: pointer;
51
+ user-select: none;
52
+ color: var(--color-text-muted);
53
+ transition: color var(--transition-interactive);
54
+ font-size: var(--text-sm);
55
+ font-weight: 600;
56
+ }
57
+
58
+ .backlinks-header:hover {
59
+ color: var(--color-text);
60
+ }
61
+
62
+ .backlinks-panel-dock .backlinks-header {
63
+ padding: 11px 14px;
64
+ background: var(--surface-overlay-header);
65
+ }
66
+
67
+ .backlinks-header-empty {
68
+ cursor: default;
69
+ opacity: 0.5;
70
+ }
71
+
72
+ .backlinks-header-empty:hover {
73
+ color: var(--color-text-muted);
74
+ }
75
+
76
+ .backlinks-chevron {
77
+ flex-shrink: 0;
78
+ transition: transform var(--transition-interactive);
79
+ }
80
+
81
+ .backlinks-panel.expanded .backlinks-chevron {
82
+ transform: rotate(90deg);
83
+ }
84
+
85
+ .backlinks-toggle {
86
+ flex: 1;
87
+ min-width: 0;
88
+ overflow: hidden;
89
+ text-overflow: ellipsis;
90
+ white-space: nowrap;
91
+ }
92
+
93
+ .backlinks-count {
94
+ min-width: 22px;
95
+ padding: 1px 7px;
96
+ border-radius: var(--radius-full);
97
+ background: var(--interactive-surface);
98
+ color: var(--color-primary);
99
+ text-align: center;
100
+ font-size: var(--text-xs);
101
+ font-weight: 600;
102
+ }
103
+
104
+ .backlinks-count:empty {
105
+ display: none;
106
+ }
107
+
108
+ .backlinks-body {
109
+ overflow: hidden;
110
+ max-height: 0;
111
+ transition: max-height 200ms ease;
112
+ }
113
+
114
+ .backlinks-panel-inline.expanded .backlinks-body {
115
+ max-height: 600px;
116
+ overflow-y: auto;
117
+ }
118
+
119
+ .backlinks-panel-dock .backlinks-body {
120
+ background: var(--surface-overlay-raised);
121
+ }
122
+
123
+ .backlinks-panel-dock.expanded .backlinks-body {
124
+ max-height: min(44vh, 400px);
125
+ overflow-y: auto;
126
+ border-bottom: 1px solid var(--border-accent-soft);
127
+ }
128
+
129
+ .backlinks-panel-dock.expanded {
130
+ border-color: var(--border-accent-muted);
131
+ background: var(--surface-overlay-strong);
132
+ }
133
+
134
+ .backlinks-list {
135
+ display: flex;
136
+ flex-direction: column;
137
+ gap: var(--space-2);
138
+ padding-bottom: var(--space-4);
139
+ }
140
+
141
+ .backlinks-panel-dock .backlinks-list {
142
+ padding: 10px;
143
+ }
144
+
145
+ .backlink-item {
146
+ display: block;
147
+ width: 100%;
148
+ padding: var(--space-3);
149
+ border: 1px solid var(--color-divider);
150
+ border-radius: var(--radius-md);
151
+ background: var(--color-surface);
152
+ text-align: left;
153
+ cursor: pointer;
154
+ transition: border-color var(--transition-interactive), background var(--transition-interactive);
155
+ }
156
+
157
+ .backlinks-panel-dock .backlink-item {
158
+ border-radius: var(--radius-lg);
159
+ background: var(--surface-overlay-soft);
160
+ }
161
+
162
+ .backlink-item:hover {
163
+ border-color: var(--color-primary);
164
+ background: oklch(from var(--color-primary) l c h / 0.04);
165
+ }
166
+
167
+ .backlink-item:focus-visible {
168
+ outline: none;
169
+ box-shadow: var(--shadow-focus-compact);
170
+ }
171
+
172
+ .backlink-file-name {
173
+ display: flex;
174
+ align-items: center;
175
+ gap: var(--space-2);
176
+ margin-bottom: var(--space-1);
177
+ color: var(--color-text);
178
+ font-size: var(--text-sm);
179
+ font-weight: 600;
180
+ }
181
+
182
+ .backlink-icon {
183
+ flex-shrink: 0;
184
+ color: var(--color-text-muted);
185
+ }
186
+
187
+ .backlink-dir {
188
+ margin-left: auto;
189
+ color: var(--color-text-faint);
190
+ font-size: var(--text-xs);
191
+ font-weight: 400;
192
+ }
193
+
194
+ .backlink-context {
195
+ overflow: hidden;
196
+ padding-left: 22px;
197
+ color: var(--color-text-muted);
198
+ text-overflow: ellipsis;
199
+ white-space: nowrap;
200
+ font-size: var(--text-xs);
201
+ line-height: 1.6;
202
+ }
203
+
204
+ .backlink-more {
205
+ color: var(--color-text-faint);
206
+ font-style: italic;
207
+ }
208
+
209
+ @media (min-width: 769px) {
210
+ .backlinks-panel-inline {
211
+ display: none !important;
212
+ }
213
+ }
@@ -0,0 +1,228 @@
1
+ /* ===== COLLABORATION / CHAT ===== */
2
+
3
+ .chat-container {
4
+ position: relative;
5
+ }
6
+
7
+ .chat-toggle-btn {
8
+ position: relative;
9
+ }
10
+
11
+ .chat-toggle-btn.is-active {
12
+ color: var(--color-text);
13
+ background: var(--color-surface-offset);
14
+ }
15
+
16
+ .chat-toggle-btn.is-unread:not(.is-active) {
17
+ color: var(--color-primary);
18
+ background: var(--interactive-surface);
19
+ box-shadow: var(--shadow-accent-inset);
20
+ }
21
+
22
+ .chat-toggle-btn.is-unread:not(.is-active):hover {
23
+ background: var(--surface-accent-soft);
24
+ }
25
+
26
+ .chat-toggle-badge {
27
+ min-width: 18px;
28
+ min-height: 18px;
29
+ padding: 0 5px;
30
+ line-height: 18px;
31
+ }
32
+
33
+ .chat-toggle-btn.is-unread:not(.is-active) .chat-toggle-badge {
34
+ box-shadow: var(--shadow-accent-halo);
35
+ }
36
+
37
+ .chat-panel {
38
+ position: absolute;
39
+ top: calc(100% + var(--space-2));
40
+ right: 0;
41
+ z-index: 30;
42
+ display: flex;
43
+ flex-direction: column;
44
+ gap: var(--space-3);
45
+ width: min(360px, calc(100vw - var(--space-6)));
46
+ max-height: min(70vh, 520px);
47
+ padding: var(--space-3);
48
+ border: 1px solid var(--color-border);
49
+ border-radius: var(--radius-lg);
50
+ background: oklch(from var(--color-surface) l c h / 0.98);
51
+ box-shadow: var(--shadow-lg);
52
+ backdrop-filter: blur(14px);
53
+ }
54
+
55
+ .chat-container > .chat-toast-container {
56
+ position: fixed;
57
+ top: calc(var(--toolbar-h) + var(--space-2));
58
+ right: var(--space-3);
59
+ z-index: 60;
60
+ width: min(360px, calc(100vw - var(--space-6)));
61
+ align-items: flex-end;
62
+ }
63
+
64
+ .chat-toast-container .toast {
65
+ width: 100%;
66
+ max-width: 100%;
67
+ padding: 12px 14px;
68
+ border-width: 1px;
69
+ border-style: solid;
70
+ border-color: var(--border-warning-toast);
71
+ border-left-width: 4px;
72
+ background: var(--surface-warning-toast);
73
+ color: var(--text-warning-toast);
74
+ font-size: var(--text-ui-sm);
75
+ font-weight: 600;
76
+ box-shadow: var(--shadow-warning-toast);
77
+ }
78
+
79
+ .chat-panel-header {
80
+ display: flex;
81
+ align-items: flex-start;
82
+ justify-content: space-between;
83
+ gap: var(--space-3);
84
+ }
85
+
86
+ .chat-panel-title {
87
+ margin: 0;
88
+ font-size: var(--text-sm);
89
+ font-weight: 700;
90
+ }
91
+
92
+ .chat-panel-status {
93
+ margin: var(--space-1) 0 0;
94
+ color: var(--color-text-muted);
95
+ font-size: var(--text-meta);
96
+ }
97
+
98
+ .chat-notification-action {
99
+ flex-shrink: 0;
100
+ }
101
+
102
+ .chat-notification-action.is-enabled {
103
+ border-color: oklch(from var(--color-success) l c h / 0.45);
104
+ background: var(--surface-success-soft);
105
+ color: var(--color-success);
106
+ }
107
+
108
+ .chat-notification-action.is-blocked {
109
+ color: var(--color-warning);
110
+ }
111
+
112
+ .chat-empty-state {
113
+ padding: var(--space-4);
114
+ border: 1px dashed var(--color-border);
115
+ border-radius: var(--radius-md);
116
+ background: var(--color-surface-2);
117
+ color: var(--color-text-muted);
118
+ font-size: var(--text-label);
119
+ }
120
+
121
+ .chat-messages {
122
+ display: flex;
123
+ flex-direction: column;
124
+ gap: var(--space-3);
125
+ min-height: 140px;
126
+ max-height: 320px;
127
+ overflow-y: auto;
128
+ padding-right: var(--space-1);
129
+ }
130
+
131
+ .chat-message {
132
+ display: flex;
133
+ align-items: flex-start;
134
+ gap: var(--space-2);
135
+ }
136
+
137
+ .chat-message.is-local {
138
+ flex-direction: row-reverse;
139
+ }
140
+
141
+ .chat-message-avatar {
142
+ display: flex;
143
+ align-items: center;
144
+ justify-content: center;
145
+ width: 28px;
146
+ height: 28px;
147
+ border-radius: var(--radius-full);
148
+ color: var(--color-text-on-dark);
149
+ font-size: var(--text-label);
150
+ font-weight: 700;
151
+ flex-shrink: 0;
152
+ }
153
+
154
+ .chat-message-body {
155
+ min-width: 0;
156
+ flex: 1;
157
+ display: flex;
158
+ flex-direction: column;
159
+ align-items: flex-start;
160
+ }
161
+
162
+ .chat-message.is-local .chat-message-body {
163
+ align-items: flex-end;
164
+ }
165
+
166
+ .chat-message-meta {
167
+ display: flex;
168
+ flex-wrap: wrap;
169
+ align-items: center;
170
+ gap: 6px;
171
+ margin-bottom: 4px;
172
+ }
173
+
174
+ .chat-message.is-local .chat-message-meta {
175
+ justify-content: flex-end;
176
+ }
177
+
178
+ .chat-message-author {
179
+ color: var(--color-text);
180
+ font-size: var(--text-label);
181
+ font-weight: 600;
182
+ }
183
+
184
+ .chat-message-time,
185
+ .chat-message-file {
186
+ color: var(--color-text-muted);
187
+ font-size: var(--text-caption);
188
+ }
189
+
190
+ .chat-message-file {
191
+ padding: 2px 6px;
192
+ border-radius: var(--radius-full);
193
+ background: var(--color-surface-offset);
194
+ }
195
+
196
+ .chat-message-text {
197
+ width: fit-content;
198
+ max-width: 78%;
199
+ margin: 0;
200
+ padding: 10px 12px;
201
+ border: 1px solid var(--color-divider);
202
+ border-radius: var(--radius-md);
203
+ background: var(--color-surface-2);
204
+ color: var(--color-text);
205
+ font-size: var(--text-ui-sm);
206
+ line-height: 1.45;
207
+ word-break: break-word;
208
+ }
209
+
210
+ .chat-message.is-local .chat-message-text {
211
+ background: oklch(from var(--color-primary) l c h / 0.14);
212
+ border-color: oklch(from var(--color-primary) l c h / 0.25);
213
+ }
214
+
215
+ .chat-form {
216
+ display: flex;
217
+ align-items: center;
218
+ gap: var(--space-2);
219
+ }
220
+
221
+ .chat-input {
222
+ font-size: var(--text-ui-sm);
223
+ }
224
+
225
+ .chat-send-btn {
226
+ flex-shrink: 0;
227
+ padding-inline: var(--space-4);
228
+ }