@olares/lares-mobile 0.15.5 → 0.15.6

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 (44) hide show
  1. package/README.md +6 -2
  2. package/package.json +2 -2
  3. package/src/App.vue +917 -178
  4. package/src/chat/ChatBar.vue +2 -2
  5. package/src/chat/Composer.vue +467 -16
  6. package/src/chat/Deliverables.vue +22 -10
  7. package/src/chat/HistoryPanel.vue +747 -55
  8. package/src/chat/MessageActions.vue +88 -34
  9. package/src/chat/QuestionCard.vue +5 -5
  10. package/src/chat/StageRow.vue +8 -5
  11. package/src/chat/Transcript.vue +20 -6
  12. package/src/chat/composer-tokens.js +32 -0
  13. package/src/chat/format.js +37 -0
  14. package/src/desktop/DesktopComposer.vue +871 -0
  15. package/src/desktop/DesktopContextMeter.vue +81 -0
  16. package/src/desktop/DesktopGoal.vue +88 -0
  17. package/src/desktop/DesktopPreview.vue +58 -0
  18. package/src/desktop/DesktopPreviewTabs.vue +82 -0
  19. package/src/desktop/DesktopQuestions.vue +118 -0
  20. package/src/desktop/DesktopQueue.vue +203 -0
  21. package/src/desktop/DesktopShell.vue +203 -0
  22. package/src/desktop/DesktopSidebar.vue +645 -0
  23. package/src/desktop/DesktopTodos.vue +52 -0
  24. package/src/desktop/DirectoryBrowser.vue +170 -0
  25. package/src/desktop/DirectoryNewFolder.vue +124 -0
  26. package/src/desktop/ui/PcDialog.vue +85 -0
  27. package/src/desktop/ui/PcPopover.vue +110 -0
  28. package/src/desktop/ui/PcTooltip.vue +95 -0
  29. package/src/desktop/ui/place.js +24 -0
  30. package/src/desktop/workspace-view.js +121 -0
  31. package/src/host.js +20 -2
  32. package/src/index.d.ts +2 -0
  33. package/src/mobile/MobileDirectoryNewFolder.vue +121 -0
  34. package/src/mobile/MobileDirectorySheet.vue +162 -0
  35. package/src/mobile/MobileNewSession.vue +217 -0
  36. package/src/mobile/MobileShell.vue +367 -0
  37. package/src/motion.css +166 -0
  38. package/src/preview/Preview.vue +91 -150
  39. package/src/preview/PreviewBody.vue +185 -0
  40. package/src/settings/AgentSettings.vue +126 -36
  41. package/src/settings/Select.vue +183 -0
  42. package/src/settings/SettingRow.vue +5 -4
  43. package/src/settings/Sheet.vue +4 -4
  44. package/src/styles.css +9 -0
@@ -47,9 +47,9 @@ export default {
47
47
  max-width: 100%;
48
48
  margin: 0;
49
49
  overflow: hidden;
50
- font-size: 16px;
50
+ font-size: 18px;
51
51
  font-weight: 600;
52
- line-height: 22px;
52
+ line-height: 24px;
53
53
  text-align: center;
54
54
  text-overflow: ellipsis;
55
55
  white-space: nowrap;
@@ -1,15 +1,97 @@
1
1
  <template>
2
- <form class="lares-composer" @submit.prevent="onSend">
3
- <div class="lares-composer__card" data-composer-card :data-holding="holding ? 'true' : 'false'">
2
+ <form class="lares-composer" :class="{ 'lares-composer--hero': hero }" @submit.prevent="onSend">
3
+ <div
4
+ class="lares-composer__card"
5
+ data-composer-card
6
+ :data-hero="hero ? 'true' : 'false'"
7
+ :data-holding="holding ? 'true' : 'false'"
8
+ >
9
+ <div v-if="referenceOpen" ref="referenceMenu" class="lares-composer__menu" role="listbox">
10
+ <p v-if="referencesError" class="lares-composer__menu-status">{{ referencesError }}</p>
11
+ <p v-else-if="referencesLoading" class="lares-composer__menu-status">{{ t("agent.loading") }}</p>
12
+ <p v-else-if="!references.length" class="lares-composer__menu-status">{{ t("references.empty") }}</p>
13
+ <div v-else class="lares-composer__menu-scroll">
14
+ <template v-for="(row, index) in referenceMenuRows" :key="row.id">
15
+ <p v-if="row.section" class="lares-composer__menu-section">{{ row.section }}</p>
16
+ <button
17
+ type="button"
18
+ class="lares-composer__menu-item"
19
+ role="option"
20
+ :aria-selected="index === referenceIndex"
21
+ :data-selected="index === referenceIndex"
22
+ @mousedown.prevent
23
+ @click="pickReference(row)"
24
+ >
25
+ <span class="lares-composer__menu-name">{{ row.name }}</span>
26
+ <span class="lares-composer__menu-path">{{ row.description }}</span>
27
+ </button>
28
+ </template>
29
+ </div>
30
+ </div>
31
+ <div v-if="commandsOpen" ref="commandsMenu" class="lares-composer__menu" role="listbox">
32
+ <p class="lares-composer__menu-section">{{ t("desktop.commands") }}</p>
33
+ <p v-if="commandsError" class="lares-composer__menu-status">{{ commandsError }}</p>
34
+ <p v-else-if="!commands" class="lares-composer__menu-status">{{ t("agent.loading") }}</p>
35
+ <div v-else-if="commandMenuRows.length" class="lares-composer__menu-scroll">
36
+ <button
37
+ v-for="(command, index) in commandMenuRows"
38
+ :key="command.name"
39
+ type="button"
40
+ class="lares-composer__menu-item lares-composer__menu-item--command"
41
+ role="option"
42
+ :aria-selected="index === commandIndex"
43
+ :data-selected="index === commandIndex"
44
+ @mousedown.prevent
45
+ @click="pickCommand(command)"
46
+ >
47
+ <span class="lares-composer__command-name">/{{ command.name }}</span>
48
+ <span class="lares-composer__command-hint">{{ command.description || command.hint }}</span>
49
+ </button>
50
+ </div>
51
+ </div>
52
+ <div v-if="draftImages.length" class="lares-composer__attachments">
53
+ <figure
54
+ v-for="image in draftImages"
55
+ :key="image.id"
56
+ :data-status="imageStatus(image)"
57
+ >
58
+ <img
59
+ :src="image.previewUrl"
60
+ :alt="image.file?.name || ''"
61
+ class="lares-composer__attachment-img"
62
+ />
63
+ <div v-if="imageStatus(image) === 'uploading'" class="lares-composer__attachment-overlay">
64
+ <svg class="lares-composer__spin" viewBox="0 0 16 16" aria-hidden="true">
65
+ <circle cx="8" cy="8" r="6" />
66
+ </svg>
67
+ </div>
68
+ <div v-else-if="imageStatus(image) === 'failed'" class="lares-composer__attachment-overlay" data-kind="error">
69
+ <span aria-hidden="true">!</span>
70
+ </div>
71
+ <button
72
+ type="button"
73
+ class="lares-composer__attachment-remove"
74
+ :aria-label="t('composer.removeAttachment', { name: image.file?.name || t('composer.attach') })"
75
+ @click="$emit('remove-image', image.id)"
76
+ >
77
+ <svg viewBox="0 0 16 16" aria-hidden="true">
78
+ <path d="m4.5 4.5 7 7m0-7-7 7" />
79
+ </svg>
80
+ </button>
81
+ </figure>
82
+ </div>
4
83
  <textarea
5
84
  ref="input"
6
85
  :value="draft"
7
86
  class="lares-composer__input"
8
87
  rows="1"
9
- :placeholder="t('chat.placeholder')"
88
+ :placeholder="placeholder"
10
89
  :disabled="sending"
11
90
  @input="onInput"
12
91
  @keydown="onKeydown"
92
+ @click="onCaretMove"
93
+ @keyup="onCaretMove"
94
+ @select="onCaretMove"
13
95
  @pointerdown="onHoldDown"
14
96
  @pointerup="onHoldUp"
15
97
  @pointercancel="onHoldUp"
@@ -17,7 +99,7 @@
17
99
  />
18
100
  <p v-if="holding" class="lares-composer__hold">{{ t("composer.hold") }} · {{ elapsed }}</p>
19
101
  <div class="lares-composer__bar">
20
- <div class="lares-composer__pills">
102
+ <div v-if="!hero" class="lares-composer__pills">
21
103
  <button
22
104
  type="button"
23
105
  class="lares-composer__pill"
@@ -112,6 +194,15 @@
112
194
 
113
195
  <script>
114
196
  import { formatElapsed } from "./voice.js";
197
+ import {
198
+ REFERENCE_DEBOUNCE_MS,
199
+ activeReference,
200
+ applyReference,
201
+ isCommandLine,
202
+ referenceRows,
203
+ visibleCommands,
204
+ } from "./composer-tokens.js";
205
+ import { draftImageStatus } from "@olares/lares-core/files/draft-images";
115
206
 
116
207
  const HOLD_MS = 240;
117
208
 
@@ -131,11 +222,31 @@ export default {
131
222
  voiceElapsed: { type: Number, default: 0 },
132
223
  voiceError: { type: String, default: "" },
133
224
  failures: { type: Array, default: () => [] },
225
+ draftImages: { type: Array, default: () => [] },
226
+ references: { type: Array, default: () => [] },
227
+ referencesLoading: { type: Boolean, default: false },
228
+ referencesError: { type: String, default: "" },
229
+ commands: { type: Array, default: null },
230
+ commandsError: { type: String, default: "" },
231
+ hero: { type: Boolean, default: false },
134
232
  t: { type: Function, required: true },
135
233
  },
136
- emits: ["update:draft", "send", "model", "effort", "files", "voice", "hold-start", "hold-end"],
234
+ emits: [
235
+ "update:draft", "send", "model", "effort", "files", "voice", "hold-start", "hold-end",
236
+ "open-commands", "open-references", "pick-command", "remove-image",
237
+ ],
137
238
  data() {
138
- return { holding: false, holdTimer: 0 };
239
+ return {
240
+ holding: false,
241
+ holdTimer: 0,
242
+ commandsOpen: false,
243
+ commandTyped: false,
244
+ commandIndex: 0,
245
+ referenceOpen: false,
246
+ referenceToken: null,
247
+ referenceIndex: 0,
248
+ referenceTimer: 0,
249
+ };
139
250
  },
140
251
  computed: {
141
252
  showSend() {
@@ -153,6 +264,10 @@ export default {
153
264
  attachLabel() {
154
265
  return this.attachPending ? this.t("button.uploading", { count: 1 }) : this.t("composer.attach");
155
266
  },
267
+ placeholder() {
268
+ if (this.hero) return this.t("chat.placeholderNewSession");
269
+ return this.t("chat.placeholder");
270
+ },
156
271
  voiceLabel() {
157
272
  if (this.voiceError) return this.voiceError;
158
273
  if (this.voicePhase === "recording") return this.t("mic.stop");
@@ -162,26 +277,156 @@ export default {
162
277
  voiceBlocked() {
163
278
  return this.voicePhase === "transcribing" || this.sending;
164
279
  },
280
+ referenceMenuRows() {
281
+ return referenceRows(this.references, this.t);
282
+ },
283
+ commandMenuRows() {
284
+ return visibleCommands(this.commands, this.draft, this.commandTyped);
285
+ },
286
+ overlayPointerActive() {
287
+ return this.referenceOpen || this.commandsOpen;
288
+ },
165
289
  },
166
290
  watch: {
167
291
  draft() {
168
292
  this.autosize();
169
293
  },
294
+ overlayPointerActive(active) {
295
+ if (active) window.addEventListener("pointerdown", this.onTokenPointer, true);
296
+ else window.removeEventListener("pointerdown", this.onTokenPointer, true);
297
+ },
170
298
  },
171
299
  mounted() {
172
300
  this.autosize();
173
301
  },
174
302
  beforeUnmount() {
175
303
  this.clearHold();
304
+ window.clearTimeout(this.referenceTimer);
305
+ window.removeEventListener("pointerdown", this.onTokenPointer, true);
176
306
  },
177
307
  methods: {
178
308
  onInput(event) {
179
- this.$emit("update:draft", event.target.value);
309
+ const value = event.target.value;
310
+ this.$emit("update:draft", value);
311
+ this.trackReference(value, event.target.selectionStart ?? value.length);
312
+ if (isCommandLine(value)) {
313
+ if (!this.commandsOpen) this.$emit("open-commands");
314
+ this.commandTyped = true;
315
+ this.commandIndex = 0;
316
+ this.commandsOpen = true;
317
+ } else if (this.commandTyped) {
318
+ this.commandTyped = false;
319
+ this.commandsOpen = false;
320
+ }
321
+ },
322
+ onCaretMove(event) {
323
+ window.setTimeout(() => {
324
+ if (this.referenceOpen) {
325
+ this.trackReference(this.draft, event.target.selectionStart ?? this.draft.length);
326
+ }
327
+ }, 0);
328
+ },
329
+ onTokenPointer(event) {
330
+ if (this.$refs.referenceMenu?.contains(event.target)) return;
331
+ if (this.$refs.commandsMenu?.contains(event.target)) return;
332
+ const input = this.$refs.input;
333
+ if (event.target !== input) {
334
+ this.closeReferences();
335
+ if (this.commandTyped) {
336
+ this.commandsOpen = false;
337
+ this.commandTyped = false;
338
+ }
339
+ return;
340
+ }
341
+ window.setTimeout(() => {
342
+ if (this.referenceOpen) {
343
+ this.trackReference(this.draft, input.selectionStart ?? this.draft.length);
344
+ }
345
+ }, 0);
346
+ },
347
+ closeReferences() {
348
+ window.clearTimeout(this.referenceTimer);
349
+ this.referenceOpen = false;
350
+ this.referenceToken = null;
351
+ },
352
+ trackReference(value, caret) {
353
+ const token = activeReference(value, caret);
354
+ window.clearTimeout(this.referenceTimer);
355
+ if (!token) {
356
+ this.closeReferences();
357
+ return;
358
+ }
359
+ this.commandsOpen = false;
360
+ this.commandTyped = false;
361
+ this.referenceOpen = true;
362
+ this.referenceToken = token;
363
+ this.referenceIndex = 0;
364
+ this.referenceTimer = window.setTimeout(() => {
365
+ this.$emit("open-references", { query: token.query, quoted: token.quoted });
366
+ }, REFERENCE_DEBOUNCE_MS);
367
+ },
368
+ pickReference(row) {
369
+ if (!this.referenceToken) return;
370
+ const inserted = applyReference(this.draft, this.referenceToken, row);
371
+ this.$emit("update:draft", inserted.draft);
372
+ this.$nextTick(() => {
373
+ const input = this.$refs.input;
374
+ input?.focus();
375
+ input?.setSelectionRange(inserted.caret, inserted.caret);
376
+ if (row.continuation) this.trackReference(inserted.draft, inserted.caret);
377
+ else this.closeReferences();
378
+ });
379
+ },
380
+ pickCommand(command) {
381
+ this.commandsOpen = false;
382
+ this.commandTyped = false;
383
+ this.$emit("pick-command", command);
384
+ },
385
+ imageStatus(image) {
386
+ return draftImageStatus(image);
180
387
  },
181
388
  onSend() {
389
+ if (this.referenceOpen || this.commandsOpen) return;
182
390
  if (this.canSend) this.$emit("send");
183
391
  },
184
392
  onKeydown(event) {
393
+ if (this.referenceOpen) {
394
+ if (event.key === "Escape") {
395
+ event.preventDefault();
396
+ this.closeReferences();
397
+ return;
398
+ }
399
+ if ((event.key === "ArrowDown" || event.key === "ArrowUp") && this.references.length) {
400
+ event.preventDefault();
401
+ const step = event.key === "ArrowDown" ? 1 : -1;
402
+ this.referenceIndex = (this.referenceIndex + step + this.references.length) % this.references.length;
403
+ return;
404
+ }
405
+ if (event.key === "Enter" && !event.shiftKey && !event.isComposing && this.references.length) {
406
+ event.preventDefault();
407
+ this.pickReference(this.references[this.referenceIndex] ?? this.references[0]);
408
+ return;
409
+ }
410
+ }
411
+ if (this.commandsOpen) {
412
+ if (event.key === "Escape") {
413
+ event.preventDefault();
414
+ this.commandsOpen = false;
415
+ this.commandTyped = false;
416
+ return;
417
+ }
418
+ if ((event.key === "ArrowDown" || event.key === "ArrowUp") && this.commandMenuRows.length) {
419
+ event.preventDefault();
420
+ const step = event.key === "ArrowDown" ? 1 : -1;
421
+ this.commandIndex = (this.commandIndex + step + this.commandMenuRows.length) % this.commandMenuRows.length;
422
+ return;
423
+ }
424
+ if (event.key === "Enter" && !event.shiftKey && !event.isComposing && this.commandMenuRows.length) {
425
+ event.preventDefault();
426
+ this.pickCommand(this.commandMenuRows[this.commandIndex] ?? this.commandMenuRows[0]);
427
+ return;
428
+ }
429
+ }
185
430
  if (event.key !== "Enter" || event.shiftKey || event.isComposing) return;
186
431
  if (typeof window !== "undefined" && window.matchMedia?.("(pointer: coarse)").matches) return;
187
432
  event.preventDefault();
@@ -235,9 +480,12 @@ export default {
235
480
  const el = this.$refs.input;
236
481
  if (!el) return;
237
482
  el.style.height = "auto";
238
- el.style.height = `${Math.min(el.scrollHeight, 160)}px`;
483
+ el.style.height = `${Math.min(el.scrollHeight, 176)}px`;
239
484
  });
240
485
  },
486
+ focus() {
487
+ this.$refs.input?.focus();
488
+ },
241
489
  },
242
490
  };
243
491
  </script>
@@ -251,7 +499,12 @@ export default {
251
499
  padding: 8px 16px calc(12px + env(safe-area-inset-bottom, 0px));
252
500
  }
253
501
 
502
+ .lares-composer--hero {
503
+ padding: 0;
504
+ }
505
+
254
506
  .lares-composer__card {
507
+ position: relative;
255
508
  display: flex;
256
509
  flex-direction: column;
257
510
  gap: 6px;
@@ -261,10 +514,208 @@ export default {
261
514
  background: var(--q-background-1);
262
515
  }
263
516
 
517
+ .lares-composer__menu {
518
+ position: absolute;
519
+ z-index: 12;
520
+ right: 0;
521
+ bottom: calc(100% + 6px);
522
+ left: 0;
523
+ display: flex;
524
+ max-height: min(240px, 38vh);
525
+ flex-direction: column;
526
+ overflow: hidden;
527
+ border: 1px solid var(--q-separator);
528
+ border-radius: 14px;
529
+ padding: 4px;
530
+ background: var(--q-background-1);
531
+ box-shadow: 0 12px 30px rgb(0 0 0 / 16%);
532
+ }
533
+
534
+ .lares-composer__menu-scroll {
535
+ min-height: 0;
536
+ overflow-y: auto;
537
+ -webkit-overflow-scrolling: touch;
538
+ }
539
+
540
+ .lares-composer__menu-status {
541
+ display: flex;
542
+ min-height: 40px;
543
+ align-items: center;
544
+ margin: 0;
545
+ padding: 8px 12px;
546
+ color: var(--q-ink-3);
547
+ font-size: 15px;
548
+ line-height: 20px;
549
+ }
550
+
551
+ .lares-composer__menu-section {
552
+ margin: 0;
553
+ padding: 6px 12px 2px;
554
+ color: var(--q-ink-3);
555
+ font-size: 12px;
556
+ font-weight: 500;
557
+ line-height: 18px;
558
+ }
559
+
560
+ .lares-composer__menu-section:not(:first-child) {
561
+ margin-top: 4px;
562
+ }
563
+
564
+ .lares-composer__menu-item {
565
+ display: flex;
566
+ width: 100%;
567
+ min-height: 44px;
568
+ align-items: center;
569
+ gap: 8px;
570
+ border: 0;
571
+ border-radius: 10px;
572
+ padding: 8px 12px;
573
+ background: transparent;
574
+ color: var(--q-ink-1);
575
+ font: inherit;
576
+ font-size: 15px;
577
+ line-height: 20px;
578
+ text-align: left;
579
+ }
580
+
581
+ .lares-composer__menu-item[data-selected="true"],
582
+ .lares-composer__menu-item:active {
583
+ background: var(--q-background-hover);
584
+ }
585
+
586
+ .lares-composer__menu-name {
587
+ max-width: 42%;
588
+ flex: none;
589
+ overflow: hidden;
590
+ text-overflow: ellipsis;
591
+ white-space: nowrap;
592
+ }
593
+
594
+ .lares-composer__menu-path {
595
+ min-width: 0;
596
+ flex: 1;
597
+ overflow: hidden;
598
+ color: var(--q-ink-3);
599
+ text-overflow: ellipsis;
600
+ white-space: nowrap;
601
+ }
602
+
603
+ .lares-composer__menu-item--command {
604
+ flex-direction: column;
605
+ align-items: flex-start;
606
+ gap: 2px;
607
+ }
608
+
609
+ .lares-composer__command-name {
610
+ color: var(--q-ink-1);
611
+ font-weight: 500;
612
+ }
613
+
614
+ .lares-composer__command-hint {
615
+ width: 100%;
616
+ overflow: hidden;
617
+ color: var(--q-ink-3);
618
+ font-size: 14px;
619
+ text-overflow: ellipsis;
620
+ white-space: nowrap;
621
+ }
622
+
623
+ .lares-composer__card[data-hero="true"] {
624
+ gap: 4px;
625
+ border-radius: 20px;
626
+ padding: 10px 14px 8px;
627
+ background: var(--q-background-2);
628
+ }
629
+
630
+ .lares-composer__card[data-hero="true"] .lares-composer__input {
631
+ min-height: 44px;
632
+ padding: 0;
633
+ font-size: 16px;
634
+ line-height: 1.45;
635
+ }
636
+
637
+ .lares-composer__card[data-hero="true"] .lares-composer__bar {
638
+ min-height: 28px;
639
+ }
640
+
641
+ .lares-composer__attachments {
642
+ display: flex;
643
+ gap: 8px;
644
+ overflow-x: auto;
645
+ padding: 0 0 4px;
646
+ scrollbar-width: none;
647
+ }
648
+
649
+ .lares-composer__attachments::-webkit-scrollbar {
650
+ display: none;
651
+ }
652
+
653
+ .lares-composer__attachments figure {
654
+ position: relative;
655
+ width: 72px;
656
+ height: 72px;
657
+ flex: 0 0 72px;
658
+ overflow: hidden;
659
+ margin: 0;
660
+ border: 1px solid var(--q-separator);
661
+ border-radius: 12px;
662
+ background: var(--q-background-3);
663
+ }
664
+
665
+ .lares-composer__attachments figure[data-status="failed"] {
666
+ border-color: var(--q-orange-default);
667
+ }
668
+
669
+ .lares-composer__attachment-img {
670
+ width: 100%;
671
+ height: 100%;
672
+ object-fit: cover;
673
+ transition: opacity var(--lares-duration-normal, 220ms) var(--lares-ease-out, ease);
674
+ }
675
+
676
+ .lares-composer__attachment-overlay {
677
+ position: absolute;
678
+ inset: 0;
679
+ display: grid;
680
+ place-items: center;
681
+ background: rgb(0 0 0 / 42%);
682
+ color: var(--q-ink-on-brand);
683
+ }
684
+
685
+ .lares-composer__attachment-overlay[data-kind="error"] {
686
+ background: rgb(0 0 0 / 54%);
687
+ font-size: 18px;
688
+ font-weight: 700;
689
+ }
690
+
691
+ .lares-composer__attachment-remove {
692
+ position: absolute;
693
+ top: 4px;
694
+ right: 4px;
695
+ display: grid;
696
+ width: 22px;
697
+ height: 22px;
698
+ place-items: center;
699
+ border: 0;
700
+ border-radius: 50%;
701
+ padding: 0;
702
+ background: rgb(0 0 0 / 58%);
703
+ color: white;
704
+ }
705
+
706
+ .lares-composer__attachment-remove svg {
707
+ width: 12px;
708
+ height: 12px;
709
+ fill: none;
710
+ stroke: currentColor;
711
+ stroke-width: 2;
712
+ stroke-linecap: round;
713
+ }
714
+
264
715
  .lares-composer__input {
265
716
  width: 100%;
266
- min-height: 24px;
267
- max-height: 160px;
717
+ min-height: 28px;
718
+ max-height: 176px;
268
719
  resize: none;
269
720
  overflow-y: auto;
270
721
  border: 0;
@@ -280,8 +731,8 @@ export default {
280
731
  .lares-composer__hold {
281
732
  margin: 0;
282
733
  color: var(--q-blue-default);
283
- font-size: 13px;
284
- line-height: 18px;
734
+ font-size: 15px;
735
+ line-height: 20px;
285
736
  }
286
737
 
287
738
  .lares-composer__bar {
@@ -312,9 +763,9 @@ export default {
312
763
  padding: 0 10px 0 8px;
313
764
  background: var(--q-background-3);
314
765
  color: var(--q-ink-2);
315
- font-size: 13px;
766
+ font-size: 15px;
316
767
  font-weight: 500;
317
- line-height: 16px;
768
+ line-height: 18px;
318
769
  white-space: nowrap;
319
770
  }
320
771
 
@@ -399,7 +850,7 @@ export default {
399
850
  }
400
851
 
401
852
  .lares-composer__live {
402
- font-size: 10px;
853
+ font-size: 12px;
403
854
  font-variant-numeric: tabular-nums;
404
855
  }
405
856
 
@@ -414,7 +865,7 @@ export default {
414
865
 
415
866
  .lares-composer__hint {
416
867
  margin: 0 4px;
417
- font-size: 12px;
868
+ font-size: 14px;
418
869
  color: var(--q-ink-3);
419
870
  }
420
871
 
@@ -53,7 +53,7 @@
53
53
  </template>
54
54
 
55
55
  <script>
56
- import { fileName } from "@olares/lares-core/files/preview-workspace";
56
+ import { fileName } from "@olares/lares-core/files/filename";
57
57
 
58
58
  export default {
59
59
  name: "LaresDeliverables",
@@ -79,7 +79,7 @@ export default {
79
79
  .lares-turn-media-loading {
80
80
  margin: 0;
81
81
  color: var(--q-ink-3);
82
- font-size: 13px;
82
+ font-size: 15px;
83
83
  }
84
84
 
85
85
  .lares-turn-media-list {
@@ -109,7 +109,7 @@ export default {
109
109
  justify-content: space-between;
110
110
  gap: 12px;
111
111
  color: var(--q-ink-2);
112
- font-size: 12px;
112
+ font-size: 14px;
113
113
  }
114
114
 
115
115
  .lares-turn-media-caption > span {
@@ -119,11 +119,21 @@ export default {
119
119
  white-space: nowrap;
120
120
  }
121
121
 
122
- .lares-turn-open,
123
- .lares-turn-file {
124
- border: 0;
122
+ .lares-turn-open {
123
+ height: 28px;
124
+ flex: none;
125
+ padding: 0 10px;
126
+ border: 1px solid var(--q-input-stroke);
127
+ border-radius: 14px;
125
128
  background: transparent;
126
- color: var(--q-blue-default);
129
+ color: var(--q-ink-1);
130
+ cursor: pointer;
131
+ font-size: 12px;
132
+ line-height: 18px;
133
+ }
134
+
135
+ .lares-turn-open:hover {
136
+ background: var(--q-background-hover);
127
137
  }
128
138
 
129
139
  .lares-turn-media-image,
@@ -144,8 +154,8 @@ export default {
144
154
  width: min(520px, 100%);
145
155
  padding: 16px;
146
156
  color: var(--q-ink-3);
147
- font-size: 13px;
148
- line-height: 20px;
157
+ font-size: 15px;
158
+ line-height: 22px;
149
159
  }
150
160
 
151
161
  .lares-turn-files {
@@ -153,7 +163,7 @@ export default {
153
163
  grid-template-columns: max-content minmax(0, 1fr);
154
164
  align-items: center;
155
165
  gap: 8px;
156
- font-size: 13px;
166
+ font-size: 15px;
157
167
  }
158
168
 
159
169
  .lares-turn-files-label {
@@ -170,7 +180,9 @@ export default {
170
180
  max-width: 320px;
171
181
  padding: 4px 8px;
172
182
  overflow: hidden;
183
+ border: 0;
173
184
  border-radius: 6px;
185
+ cursor: pointer;
174
186
  background: var(--q-background-hover);
175
187
  color: var(--q-ink-2);
176
188
  text-overflow: ellipsis;