@pheem49/mint 1.8.2 → 1.10.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.
Files changed (106) hide show
  1. package/Cargo.lock +55 -3
  2. package/Cargo.toml +2 -1
  3. package/Release_Note.md +297 -107
  4. package/bin/mint +0 -0
  5. package/crates/mint-cli/Cargo.toml +1 -0
  6. package/crates/mint-cli/src/actions.rs +233 -0
  7. package/crates/mint-cli/src/agent.rs +382 -127
  8. package/crates/mint-cli/src/gmail.rs +22 -2
  9. package/crates/mint-cli/src/image.rs +8 -8
  10. package/crates/mint-cli/src/interactive.rs +2888 -0
  11. package/crates/mint-cli/src/main.rs +391 -2506
  12. package/crates/mint-cli/src/markdown.rs +294 -0
  13. package/crates/mint-cli/src/onboard.rs +152 -109
  14. package/crates/mint-cli/src/setup.rs +143 -143
  15. package/crates/mint-cli/src/updater.rs +48 -6
  16. package/crates/mint-core/Cargo.toml +1 -0
  17. package/crates/mint-core/src/agent_loop.rs +1 -0
  18. package/crates/mint-core/src/api_server.rs +431 -65
  19. package/crates/mint-core/src/browser.rs +630 -102
  20. package/crates/mint-core/src/channels.rs +105 -6
  21. package/crates/mint-core/src/chat.rs +174 -11
  22. package/crates/mint-core/src/code_tools.rs +47 -31
  23. package/crates/mint-core/src/config.rs +302 -17
  24. package/crates/mint-core/src/image_gen.rs +299 -38
  25. package/crates/mint-core/src/lib.rs +10 -7
  26. package/crates/mint-core/src/mcp.rs +119 -6
  27. package/crates/mint-core/src/memory.rs +6 -1
  28. package/crates/mint-core/src/orchestration.rs +237 -96
  29. package/crates/mint-core/src/pictures.rs +67 -5
  30. package/crates/mint-core/src/semantic.rs +1 -1
  31. package/crates/mint-core/src/shell.rs +1 -1
  32. package/crates/mint-core/src/skills.rs +128 -25
  33. package/crates/mint-core/src/video_gen.rs +235 -0
  34. package/package.json +8 -2
  35. package/shared-modules/linux-audio/fluidsynth2-static.json +9 -3
  36. package/shared-modules/linux-audio/fluidsynth2.json +8 -2
  37. package/shared-modules/linux-audio/lilv.json +26 -19
  38. package/shared-modules/linux-audio/lv2.json +0 -1
  39. package/shared-modules/luajit/luajit.json +2 -2
  40. package/skills-lock.json +41 -0
  41. package/src/renderer/index-web.html +1 -1
  42. package/src/renderer/index.html +1 -1
  43. package/src/renderer/shared/components/AgentActivityTable.tsx +25 -6
  44. package/src/renderer/shared/constants/slashCommands.ts +27 -0
  45. package/src/renderer/shared/platform.ts +3 -0
  46. package/src/renderer/shared/types.ts +4 -0
  47. package/src/renderer/shared/utils/approval.tsx +86 -7
  48. package/src/renderer/shared/utils/fileIcons.ts +135 -0
  49. package/src/renderer/shared/utils/markdown.tsx +217 -88
  50. package/src/renderer/shared/utils/slashCommandProcessor.ts +239 -0
  51. package/src/renderer/src/components/ChatPanel.tsx +486 -69
  52. package/src/renderer/src/components/DashboardSidebar.tsx +11 -2
  53. package/src/renderer/src/components/ImageStudioPanel.tsx +87 -4
  54. package/src/renderer/src/components/MintDashboard.tsx +195 -7
  55. package/src/renderer/src/components/PicturesLibrary.tsx +156 -15
  56. package/src/renderer/src/components/Settings/AgentsTab.tsx +21 -2
  57. package/src/renderer/src/components/Settings/AutomationTab.tsx +316 -18
  58. package/src/renderer/src/components/Settings/GeneralTab.tsx +795 -413
  59. package/src/renderer/src/components/Settings/PluginsTab.tsx +304 -70
  60. package/src/renderer/src/components/Settings/ThemeTab.tsx +6 -1
  61. package/src/renderer/src/components/SettingsWindow.tsx +106 -3
  62. package/src/renderer/src/components/VeoStudioPanel.tsx +549 -0
  63. package/src/renderer/src/components/WorkspacePanel.tsx +7 -125
  64. package/src/renderer/src/css/image-studio.css +106 -0
  65. package/src/renderer/src/css/settings.css +158 -0
  66. package/src/renderer/src/css/styles.css +368 -1
  67. package/src/renderer/src/css/veo-studio.css +626 -0
  68. package/src/renderer/src/index.css +1 -0
  69. package/src/renderer/src/tauri.ts +144 -17
  70. package/src/renderer/src-web/components/ChatPanel.tsx +385 -93
  71. package/src/renderer/src-web/components/DashboardSidebar.tsx +16 -1
  72. package/src/renderer/src-web/components/ImageStudioPanel.tsx +87 -4
  73. package/src/renderer/src-web/components/MintDashboard.tsx +156 -5
  74. package/src/renderer/src-web/components/PicturesLibrary.tsx +155 -15
  75. package/src/renderer/src-web/components/Settings/AgentsTab.tsx +21 -2
  76. package/src/renderer/src-web/components/Settings/AutomationTab.tsx +316 -18
  77. package/src/renderer/src-web/components/Settings/GeneralTab.tsx +795 -411
  78. package/src/renderer/src-web/components/Settings/PluginsTab.tsx +304 -70
  79. package/src/renderer/src-web/components/Settings/ThemeTab.tsx +6 -1
  80. package/src/renderer/src-web/components/SettingsWindow.tsx +110 -3
  81. package/src/renderer/src-web/components/VeoStudioPanel.tsx +549 -0
  82. package/src/renderer/src-web/css/image-studio.css +106 -0
  83. package/src/renderer/src-web/css/settings.css +158 -0
  84. package/src/renderer/src-web/css/styles.css +369 -1
  85. package/src/renderer/src-web/css/veo-studio.css +650 -0
  86. package/src/renderer/src-web/index.css +1 -0
  87. package/src/renderer/src-web/tauri.ts +135 -16
  88. package/src-tauri/src/desktop.rs +18 -16
  89. package/src-tauri/src/discord_rpc.rs +1 -1
  90. package/src-tauri/src/lib.rs +155 -25
  91. package/src-tauri/src/webhooks.rs +45 -31
  92. package/src-tauri/src/workflows.rs +1 -0
  93. package/src-tauri/tauri.conf.json +1 -1
  94. package/temp_gridgeist/AGENTS.md +8 -0
  95. package/temp_gridgeist/CHANGELOG.md +130 -0
  96. package/temp_gridgeist/LICENSE +21 -0
  97. package/temp_gridgeist/README.md +323 -0
  98. package/temp_gridgeist/README.th.md +325 -0
  99. package/temp_gridgeist/skills/gridgeist/SKILL.md +88 -0
  100. package/temp_gridgeist/skills/gridgeist/agents/openai.yaml +9 -0
  101. package/temp_gridgeist/skills/gridgeist/assets/gridgeist-small.svg +10 -0
  102. package/temp_gridgeist/skills/gridgeist/assets/gridgeist.png +0 -0
  103. package/temp_gridgeist/skills/gridgeist/assets/gridgeist.svg +18 -0
  104. package/temp_gridgeist/skills/gridgeist/references/design-language.md +88 -0
  105. package/temp_gridgeist/skills/gridgeist/references/review-checklist.md +128 -0
  106. package/temp_gridgeist/skills/gridgeist/references/system-contract.md +109 -0
@@ -1175,5 +1175,163 @@ kbd {
1175
1175
  grid-template-columns: 180px 1fr;
1176
1176
  }
1177
1177
 
1178
+ /* ─── Native Channel Bridges Cards Styling ────────────────── */
1179
+
1180
+ .bridge-cards-container {
1181
+ display: flex;
1182
+ flex-direction: column;
1183
+ gap: 14px;
1184
+ margin-top: 10px;
1185
+ }
1186
+
1187
+ .bridge-card {
1188
+ background: var(--surface-bg, rgba(255, 255, 255, 0.025));
1189
+ border: 1px solid var(--border, rgba(255, 255, 255, 0.08));
1190
+ border-radius: 12px;
1191
+ padding: 16px 18px;
1192
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
1193
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1194
+ }
1195
+
1196
+ .bridge-card:hover {
1197
+ border-color: var(--border-strong, rgba(255, 255, 255, 0.18));
1198
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);
1199
+ }
1200
+
1201
+ .bridge-card.active {
1202
+ background: var(--surface-strong, rgba(16, 185, 129, 0.04));
1203
+ border-color: rgba(16, 185, 129, 0.3);
1204
+ }
1205
+
1206
+ .bridge-card-header {
1207
+ display: flex;
1208
+ align-items: center;
1209
+ justify-content: space-between;
1210
+ gap: 12px;
1211
+ }
1212
+
1213
+ .bridge-info {
1214
+ display: flex;
1215
+ align-items: center;
1216
+ gap: 12px;
1217
+ }
1218
+
1219
+ .bridge-icon-badge {
1220
+ width: 38px;
1221
+ height: 38px;
1222
+ border-radius: 10px;
1223
+ display: flex;
1224
+ align-items: center;
1225
+ justify-content: center;
1226
+ font-size: 18px;
1227
+ color: #fff;
1228
+ box-shadow: 0 4px 10px rgba(0,0,0,0.25);
1229
+ flex-shrink: 0;
1230
+ }
1231
+
1232
+ .bridge-icon-telegram {
1233
+ background: linear-gradient(135deg, #0088cc 0%, #24a1de 100%);
1234
+ }
1235
+
1236
+ .bridge-icon-discord {
1237
+ background: linear-gradient(135deg, #5865F2 0%, #4752C4 100%);
1238
+ }
1239
+
1240
+ .bridge-icon-slack {
1241
+ background: linear-gradient(135deg, #4A154B 0%, #611f69 100%);
1242
+ }
1243
+
1244
+ .bridge-icon-line {
1245
+ background: linear-gradient(135deg, #00B900 0%, #00c300 100%);
1246
+ }
1247
+
1248
+ .bridge-icon-whatsapp {
1249
+ background: linear-gradient(135deg, #25D366 0%, #128C7E 100%);
1250
+ }
1251
+
1252
+ .bridge-title-group {
1253
+ display: flex;
1254
+ flex-direction: column;
1255
+ gap: 3px;
1256
+ }
1257
+
1258
+ .bridge-title {
1259
+ font-size: 14px;
1260
+ font-weight: 600;
1261
+ color: var(--text-main, #f8fafc);
1262
+ display: flex;
1263
+ align-items: center;
1264
+ gap: 8px;
1265
+ }
1266
+
1267
+ .bridge-status-pill {
1268
+ font-size: 10px;
1269
+ font-weight: 600;
1270
+ padding: 2px 8px;
1271
+ border-radius: 12px;
1272
+ text-transform: uppercase;
1273
+ letter-spacing: 0.5px;
1274
+ }
1275
+
1276
+ .bridge-status-pill.active {
1277
+ background: rgba(16, 185, 129, 0.15);
1278
+ color: #34d399;
1279
+ border: 1px solid rgba(16, 185, 129, 0.3);
1280
+ }
1281
+
1282
+ .bridge-status-pill.inactive {
1283
+ background: rgba(255, 255, 255, 0.05);
1284
+ color: var(--text-muted, #94a3b8);
1285
+ border: 1px solid rgba(255, 255, 255, 0.08);
1286
+ }
1287
+
1288
+ .bridge-subtitle {
1289
+ font-size: 12px;
1290
+ color: var(--text-muted, #94a3b8);
1291
+ }
1292
+
1293
+ .bridge-inputs {
1294
+ display: flex;
1295
+ flex-direction: column;
1296
+ gap: 10px;
1297
+ margin-top: 14px;
1298
+ padding-top: 12px;
1299
+ border-top: 1px dashed var(--border, rgba(255, 255, 255, 0.08));
1300
+ }
1301
+
1302
+ .bridge-input-row {
1303
+ display: flex;
1304
+ gap: 10px;
1305
+ }
1306
+
1307
+ .bridge-input {
1308
+ width: 100%;
1309
+ padding: 9px 12px;
1310
+ background: var(--input-bg, rgba(0, 0, 0, 0.35));
1311
+ border: 1px solid var(--border, rgba(255, 255, 255, 0.1));
1312
+ border-radius: 8px;
1313
+ color: var(--text-main, #f8fafc);
1314
+ font-size: 13px;
1315
+ transition: all 0.2s ease;
1316
+ }
1317
+
1318
+ .bridge-input:focus {
1319
+ outline: none;
1320
+ border-color: var(--accent, #10b981);
1321
+ background: var(--input-focus-bg, rgba(0, 0, 0, 0.5));
1322
+ box-shadow: 0 0 0 2px rgba(16, 185, 129, 0.2);
1323
+ }
1324
+
1325
+ .bridge-input[type="number"] {
1326
+ -moz-appearance: textfield;
1327
+ appearance: textfield;
1328
+ }
1329
+
1330
+ .bridge-input[type="number"]::-webkit-outer-spin-button,
1331
+ .bridge-input[type="number"]::-webkit-inner-spin-button {
1332
+ -webkit-appearance: none;
1333
+ margin: 0;
1334
+ }
1335
+
1178
1336
 
1179
1337
 
@@ -1171,6 +1171,132 @@ h1 {
1171
1171
  padding: 0 !important;
1172
1172
  }
1173
1173
 
1174
+ /* Thai Typography & Formatting Enhancement for Chat */
1175
+ .chat-formatted-body {
1176
+ display: flex;
1177
+ flex-direction: column;
1178
+ gap: 8px;
1179
+ width: 100%;
1180
+ font-family: 'Prompt', 'Sarabun', 'Noto Sans Thai', 'Kanit', Inter, ui-sans-serif, system-ui, -apple-system, sans-serif;
1181
+ font-size: 0.94rem;
1182
+ line-height: 1.7;
1183
+ letter-spacing: 0.01em;
1184
+ word-break: break-word;
1185
+ overflow-wrap: anywhere;
1186
+ line-break: relaxed;
1187
+ }
1188
+
1189
+ .chat-paragraph {
1190
+ margin: 0;
1191
+ margin-bottom: 6px;
1192
+ line-height: 1.7;
1193
+ white-space: pre-wrap;
1194
+ word-break: break-word;
1195
+ }
1196
+
1197
+ .chat-paragraph:last-child {
1198
+ margin-bottom: 0;
1199
+ }
1200
+
1201
+ .chat-heading {
1202
+ font-weight: 700;
1203
+ color: var(--text-main);
1204
+ margin-top: 14px;
1205
+ margin-bottom: 6px;
1206
+ line-height: 1.45;
1207
+ }
1208
+
1209
+ .chat-heading-1 { font-size: 1.25rem; color: var(--accent-hover, #34d399); }
1210
+ .chat-heading-2 { font-size: 1.15rem; color: var(--text-main); }
1211
+ .chat-heading-3 { font-size: 1.05rem; color: var(--text-main); }
1212
+
1213
+ .chat-section-title {
1214
+ font-size: 1.02rem;
1215
+ font-weight: 700;
1216
+ color: var(--accent-hover, #34d399);
1217
+ padding-bottom: 2px;
1218
+ margin-top: 12px;
1219
+ margin-bottom: 6px;
1220
+ }
1221
+
1222
+ .chat-list-item {
1223
+ display: flex;
1224
+ align-items: flex-start;
1225
+ gap: 8px;
1226
+ margin: 3px 0 3px 4px;
1227
+ line-height: 1.7;
1228
+ }
1229
+
1230
+ .chat-list-bullet {
1231
+ position: relative;
1232
+ display: inline-flex;
1233
+ align-items: center;
1234
+ justify-content: center;
1235
+ flex-shrink: 0;
1236
+ height: 1.7em;
1237
+ width: 14px;
1238
+ font-size: 0.94rem;
1239
+ line-height: 1.7;
1240
+ color: transparent;
1241
+ user-select: none;
1242
+ }
1243
+
1244
+ .chat-list-bullet::before {
1245
+ content: '';
1246
+ position: absolute;
1247
+ top: 50%;
1248
+ left: 50%;
1249
+ transform: translate(-50%, -50%);
1250
+ width: 7px;
1251
+ height: 7px;
1252
+ border-radius: 50%;
1253
+ background-color: var(--accent, #10b981);
1254
+ box-shadow: 0 0 5px color-mix(in srgb, var(--accent, #10b981) 35%, transparent);
1255
+ }
1256
+
1257
+ .chat-list-number {
1258
+ color: var(--accent-hover, #34d399);
1259
+ font-weight: 700;
1260
+ font-size: 0.9em;
1261
+ flex-shrink: 0;
1262
+ line-height: 1.7;
1263
+ min-width: 20px;
1264
+ }
1265
+
1266
+ .chat-list-text {
1267
+ flex: 1;
1268
+ min-width: 0;
1269
+ word-break: break-word;
1270
+ white-space: pre-wrap;
1271
+ }
1272
+
1273
+ .chat-link {
1274
+ color: var(--accent-hover, #34d399);
1275
+ text-decoration: underline;
1276
+ text-underline-offset: 3px;
1277
+ word-break: break-all;
1278
+ transition: opacity 0.15s ease;
1279
+ }
1280
+
1281
+ .chat-link:hover {
1282
+ opacity: 0.85;
1283
+ text-decoration: underline;
1284
+ }
1285
+
1286
+ .chat-bold-highlight {
1287
+ font-weight: 600;
1288
+ color: var(--text-main);
1289
+ }
1290
+
1291
+ .chat-inline-code {
1292
+ background: rgba(255, 255, 255, 0.08);
1293
+ padding: 2px 6px;
1294
+ border-radius: 4px;
1295
+ font-family: monospace;
1296
+ font-size: 0.88em;
1297
+ color: #38bdf8;
1298
+ }
1299
+
1174
1300
 
1175
1301
  /* Typing Indicator */
1176
1302
  .typing-indicator {
@@ -1217,6 +1343,7 @@ h1 {
1217
1343
 
1218
1344
  /* Input Area */
1219
1345
  .input-area {
1346
+ position: relative;
1220
1347
  padding: 16px 20px;
1221
1348
  background: color-mix(in srgb, var(--panel-bg) 60%, transparent);
1222
1349
  backdrop-filter: var(--glass-blur);
@@ -1225,6 +1352,113 @@ h1 {
1225
1352
  box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.1);
1226
1353
  }
1227
1354
 
1355
+ /* Slash Command Suggestions Popup */
1356
+ .slash-suggestions-popup {
1357
+ position: absolute;
1358
+ bottom: calc(100% + 12px);
1359
+ left: 20px;
1360
+ right: 20px;
1361
+ max-height: 250px;
1362
+ background: color-mix(in srgb, var(--card-bg, #18191c) 92%, #000 8%);
1363
+ border: 1px solid var(--border, rgba(255, 255, 255, 0.15));
1364
+ border-radius: 14px;
1365
+ box-shadow: 0 -12px 40px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(45, 212, 191, 0.15);
1366
+ display: flex;
1367
+ flex-direction: column;
1368
+ overflow: hidden;
1369
+ z-index: 100;
1370
+ backdrop-filter: blur(16px);
1371
+ -webkit-backdrop-filter: blur(16px);
1372
+ transform-origin: bottom center;
1373
+ animation: slashPopupFadeIn 0.22s cubic-bezier(0.16, 1, 0.3, 1);
1374
+ will-change: transform, opacity;
1375
+ }
1376
+
1377
+ @keyframes slashPopupFadeIn {
1378
+ from {
1379
+ opacity: 0;
1380
+ transform: translateY(8px) scale(0.97);
1381
+ }
1382
+ to {
1383
+ opacity: 1;
1384
+ transform: translateY(0) scale(1);
1385
+ }
1386
+ }
1387
+
1388
+ .slash-suggestions-header {
1389
+ padding: 9px 16px;
1390
+ font-size: 0.75rem;
1391
+ font-weight: 700;
1392
+ color: var(--accent, #2dd4bf);
1393
+ border-bottom: 1px solid var(--border, rgba(255, 255, 255, 0.08));
1394
+ background: rgba(0, 0, 0, 0.3);
1395
+ letter-spacing: 0.03em;
1396
+ text-transform: uppercase;
1397
+ }
1398
+
1399
+ .slash-suggestions-list {
1400
+ overflow-y: auto;
1401
+ padding: 6px;
1402
+ display: flex;
1403
+ flex-direction: column;
1404
+ gap: 3px;
1405
+ scroll-behavior: smooth;
1406
+ }
1407
+
1408
+ .slash-suggestion-item {
1409
+ display: flex;
1410
+ align-items: center;
1411
+ gap: 12px;
1412
+ padding: 9px 14px;
1413
+ border-radius: 10px;
1414
+ background: transparent;
1415
+ border: none;
1416
+ text-align: left;
1417
+ cursor: pointer;
1418
+ width: 100%;
1419
+ transition: transform 0.18s cubic-bezier(0.16, 1, 0.3, 1), background 0.18s ease, box-shadow 0.18s ease;
1420
+ will-change: transform, background;
1421
+ }
1422
+
1423
+ .slash-suggestion-item:hover,
1424
+ .slash-suggestion-item.active {
1425
+ background: rgba(45, 212, 191, 0.12);
1426
+ transform: translateX(4px);
1427
+ box-shadow: inset 2px 0 0 var(--accent, #2dd4bf);
1428
+ }
1429
+
1430
+ .slash-cmd-name {
1431
+ font-size: 0.86rem;
1432
+ font-weight: 600;
1433
+ font-family: var(--font-mono, monospace);
1434
+ color: var(--accent, #2dd4bf);
1435
+ min-width: 140px;
1436
+ flex-shrink: 0;
1437
+ transition: color 0.15s ease;
1438
+ }
1439
+
1440
+ .slash-suggestion-item.active .slash-cmd-name {
1441
+ color: #5eead4;
1442
+ }
1443
+
1444
+ .skill-badge {
1445
+ font-size: 0.72rem;
1446
+ font-weight: 600;
1447
+ color: var(--accent, #2dd4bf);
1448
+ background: rgba(45, 212, 191, 0.16);
1449
+ padding: 2px 7px;
1450
+ border-radius: 6px;
1451
+ flex-shrink: 0;
1452
+ }
1453
+
1454
+ .slash-cmd-desc {
1455
+ font-size: 0.8rem;
1456
+ color: var(--text-soft, rgba(255, 255, 255, 0.6));
1457
+ overflow: hidden;
1458
+ text-overflow: ellipsis;
1459
+ white-space: nowrap;
1460
+ }
1461
+
1228
1462
  #chat-form {
1229
1463
  display: flex;
1230
1464
  gap: 12px;
@@ -1683,12 +1917,28 @@ h1 {
1683
1917
  width: 15px;
1684
1918
  }
1685
1919
 
1920
+ .agent-activity-icon[data-has-img="true"]::before,
1921
+ .agent-activity-icon[data-has-img="true"]::after {
1922
+ display: none !important;
1923
+ }
1924
+
1925
+ .agent-activity-icon img {
1926
+ width: 14px;
1927
+ height: 14px;
1928
+ display: block;
1929
+ object-fit: contain;
1930
+ filter: drop-shadow(0 1px 0 rgba(0, 0, 0, 0.12));
1931
+ pointer-events: none;
1932
+ user-select: none;
1933
+ }
1934
+
1686
1935
  .agent-activity-icon::before,
1687
1936
  .agent-activity-icon::after {
1688
1937
  content: "";
1689
1938
  position: absolute;
1690
1939
  }
1691
1940
 
1941
+
1692
1942
  .agent-activity-item[data-kind="folder"] .agent-activity-icon::before {
1693
1943
  background: var(--text-muted);
1694
1944
  border-radius: 2px 2px 1px 1px;
@@ -2806,6 +3056,52 @@ input:checked + .slider:before {
2806
3056
  cursor: not-allowed;
2807
3057
  }
2808
3058
 
3059
+ /* ── Pictures Type Filter & Video Card Styles ── */
3060
+ .pictures-type-filter {
3061
+ display: flex;
3062
+ gap: 8px;
3063
+ max-width: 1120px;
3064
+ margin: 0 auto 20px;
3065
+ padding: 0 10px;
3066
+ }
3067
+
3068
+ .filter-tab-btn {
3069
+ display: inline-flex;
3070
+ align-items: center;
3071
+ gap: 6px;
3072
+ padding: 6px 14px;
3073
+ border-radius: 20px;
3074
+ background: rgba(255, 255, 255, 0.04);
3075
+ border: 1px solid var(--border);
3076
+ color: var(--text-soft);
3077
+ font-size: 0.8rem;
3078
+ font-weight: 500;
3079
+ cursor: pointer;
3080
+ transition: all 0.15s ease;
3081
+ outline: none;
3082
+ }
3083
+
3084
+ .filter-tab-btn:hover {
3085
+ background: rgba(255, 255, 255, 0.08);
3086
+ color: var(--text-main);
3087
+ border-color: var(--accent);
3088
+ }
3089
+
3090
+ .filter-tab-btn.active {
3091
+ background: color-mix(in srgb, var(--accent) 15%, transparent);
3092
+ border-color: var(--accent);
3093
+ color: var(--accent-hover);
3094
+ font-weight: 600;
3095
+ }
3096
+
3097
+ .picture-card video {
3098
+ display: block;
3099
+ width: 100%;
3100
+ aspect-ratio: 4 / 3;
3101
+ object-fit: cover;
3102
+ background: var(--panel-soft);
3103
+ }
3104
+
2809
3105
  .pictures-empty {
2810
3106
  max-width: 360px;
2811
3107
  margin: 18vh auto 0;
@@ -3396,9 +3692,32 @@ input:checked + .slider:before {
3396
3692
  transform: translate(-50%, -50%);
3397
3693
  }
3398
3694
 
3695
+ #chat-tool-btn,
3696
+ #send-btn,
3697
+ #mic-btn,
3698
+ #screen-capture-btn {
3699
+ transition: transform 0.18s cubic-bezier(0.16, 1, 0.3, 1), background 0.18s ease, color 0.18s ease, box-shadow 0.18s ease;
3700
+ will-change: transform;
3701
+ }
3702
+
3703
+ #chat-tool-btn:hover,
3704
+ #send-btn:hover:not(:disabled),
3705
+ #mic-btn:hover,
3706
+ #screen-capture-btn:hover {
3707
+ transform: scale(1.08);
3708
+ }
3709
+
3710
+ #chat-tool-btn:active,
3711
+ #send-btn:active:not(:disabled),
3712
+ #mic-btn:active,
3713
+ #screen-capture-btn:active {
3714
+ transform: scale(0.92);
3715
+ }
3716
+
3399
3717
  #chat-tool-btn[aria-expanded='true'] {
3400
3718
  background: var(--panel-raised);
3401
3719
  color: var(--text-main);
3720
+ transform: rotate(45deg);
3402
3721
  }
3403
3722
 
3404
3723
  .chat-tool-menu {
@@ -3411,9 +3730,23 @@ input:checked + .slider:before {
3411
3730
  background: color-mix(in srgb, var(--panel-raised) 92%, #000 8%);
3412
3731
  border: 1px solid var(--border);
3413
3732
  border-radius: 16px;
3414
- box-shadow: 0 18px 50px rgba(0, 0, 0, 0.28);
3733
+ box-shadow: 0 18px 50px rgba(0, 0, 0, 0.35), 0 0 0 1px rgba(45, 212, 191, 0.12);
3415
3734
  backdrop-filter: var(--glass-blur);
3416
3735
  -webkit-backdrop-filter: var(--glass-blur);
3736
+ transform-origin: bottom left;
3737
+ animation: toolMenuPopIn 0.22s cubic-bezier(0.16, 1, 0.3, 1);
3738
+ will-change: transform, opacity;
3739
+ }
3740
+
3741
+ @keyframes toolMenuPopIn {
3742
+ from {
3743
+ opacity: 0;
3744
+ transform: translateY(8px) scale(0.94);
3745
+ }
3746
+ to {
3747
+ opacity: 1;
3748
+ transform: translateY(0) scale(1);
3749
+ }
3417
3750
  }
3418
3751
 
3419
3752
  .chat-tool-menu button {
@@ -3432,10 +3765,12 @@ input:checked + .slider:before {
3432
3765
  font-size: 0.92rem;
3433
3766
  text-align: left;
3434
3767
  cursor: pointer;
3768
+ transition: transform 0.16s cubic-bezier(0.16, 1, 0.3, 1), background 0.16s ease;
3435
3769
  }
3436
3770
 
3437
3771
  .chat-tool-menu button:hover {
3438
3772
  background: var(--surface-strong);
3773
+ transform: translateX(4px);
3439
3774
  }
3440
3775
 
3441
3776
  .chat-tool-menu button span:first-child {
@@ -4250,4 +4585,37 @@ input:checked + .slider:before {
4250
4585
  transform: scale(0.98);
4251
4586
  }
4252
4587
 
4588
+ /* Message action buttons (Copy, Read Aloud, Like, Dislike) */
4589
+ .msg-action-btn {
4590
+ background: transparent;
4591
+ border: none;
4592
+ color: var(--text-soft, #94a3b8);
4593
+ padding: 4px 6px;
4594
+ border-radius: 6px;
4595
+ cursor: pointer;
4596
+ display: inline-flex;
4597
+ align-items: center;
4598
+ justify-content: center;
4599
+ transition: all 0.15s ease-in-out;
4600
+ opacity: 0.75;
4601
+ }
4602
+
4603
+ .msg-action-btn:hover {
4604
+ background: rgba(255, 255, 255, 0.08);
4605
+ color: var(--text-main, #f8fafc);
4606
+ opacity: 1;
4607
+ }
4608
+
4609
+ .msg-action-btn.is-copied {
4610
+ color: var(--accent, #10b981) !important;
4611
+ opacity: 1 !important;
4612
+ }
4613
+
4614
+ .msg-action-btn.is-speaking {
4615
+ color: var(--accent, #10b981) !important;
4616
+ opacity: 1 !important;
4617
+ }
4618
+
4619
+
4620
+
4253
4621