mattrguerra/cortexmainPrivate on GitHub, published here in full

app.css

Language CSS22.0 KB1243 lines

src/styles/app.css

  1. /* ---- surfaces ------------------------------------------------------------ */
  2. .glass {
  3. background: var(--glass);
  4. border: 1px solid var(--glass-border);
  5. box-shadow: var(--shadow);
  6. }
  7. .glass-strong {
  8. background: var(--glass-strong);
  9. border: 1px solid var(--glass-border);
  10. box-shadow: var(--shadow-pop);
  11. -webkit-backdrop-filter: blur(var(--blur)) saturate(var(--saturate));
  12. backdrop-filter: blur(var(--blur)) saturate(var(--saturate));
  13. }
  14. .glass-tint {
  15. background: var(--glass-tint);
  16. border: 1px solid var(--glass-border);
  17. }
  18. /* Where there is no native frost, the page frosts its own panels. */
  19. :root[data-vibrancy='none'] .glass {
  20. -webkit-backdrop-filter: blur(var(--blur)) saturate(var(--saturate));
  21. backdrop-filter: blur(var(--blur)) saturate(var(--saturate));
  22. }
  23. /* ---- controls ------------------------------------------------------------ */
  24. button {
  25. border: 0;
  26. background: none;
  27. border-radius: var(--radius-sm);
  28. padding: 6px 12px;
  29. line-height: 20px;
  30. transition:
  31. background 120ms var(--ease),
  32. opacity 120ms;
  33. }
  34. button:disabled {
  35. opacity: 0.45;
  36. }
  37. button.primary {
  38. background: var(--accent);
  39. color: var(--accent-text);
  40. font-weight: 600;
  41. }
  42. button.primary:hover:not(:disabled) {
  43. filter: brightness(1.06);
  44. }
  45. button.ghost:hover:not(:disabled),
  46. button.pill:hover {
  47. background: var(--accent-soft);
  48. }
  49. button.small {
  50. padding: 2px 8px;
  51. font-size: 12px;
  52. }
  53. button.icon {
  54. padding: 6px;
  55. display: inline-grid;
  56. place-items: center;
  57. }
  58. button.link {
  59. padding: 0;
  60. color: var(--accent);
  61. text-decoration: underline;
  62. text-underline-offset: 2px;
  63. }
  64. button.danger,
  65. .danger {
  66. color: var(--danger);
  67. }
  68. button.pill {
  69. border: 1px solid var(--hairline);
  70. border-radius: 999px;
  71. padding: 3px 11px;
  72. font-size: 12px;
  73. color: var(--text-2);
  74. }
  75. button.pill.on {
  76. background: var(--accent);
  77. border-color: var(--accent);
  78. color: var(--accent-text);
  79. }
  80. input,
  81. textarea,
  82. select {
  83. background: var(--glass-tint);
  84. border: 1px solid var(--hairline);
  85. border-radius: var(--radius-sm);
  86. padding: 7px 10px;
  87. min-width: 0;
  88. user-select: text;
  89. -webkit-user-select: text;
  90. }
  91. input:focus,
  92. textarea:focus,
  93. select:focus {
  94. outline: none;
  95. border-color: var(--accent);
  96. box-shadow: var(--focus);
  97. }
  98. kbd {
  99. font-family: var(--font);
  100. font-size: 11px;
  101. color: var(--text-3);
  102. border: 1px solid var(--hairline);
  103. border-radius: 5px;
  104. padding: 0 5px;
  105. }
  106. .row {
  107. display: flex;
  108. gap: 8px;
  109. align-items: center;
  110. }
  111. .row.end {
  112. justify-content: flex-end;
  113. }
  114. .row.wrap {
  115. flex-wrap: wrap;
  116. }
  117. .grow {
  118. flex: 1;
  119. }
  120. .spacer {
  121. flex: 1;
  122. }
  123. .muted {
  124. color: var(--text-2);
  125. }
  126. .small {
  127. font-size: 12px;
  128. }
  129. .mono {
  130. font-family: var(--mono);
  131. font-size: 12px;
  132. }
  133. .pad {
  134. padding: 8px 12px;
  135. }
  136. /* ---- layout -------------------------------------------------------------- */
  137. .app {
  138. display: grid;
  139. grid-template-columns: var(--sidebar) 1fr;
  140. height: 100%;
  141. gap: 10px;
  142. padding: 10px;
  143. }
  144. .app.loading {
  145. display: block;
  146. }
  147. .fatal {
  148. padding: 40px;
  149. color: var(--danger);
  150. }
  151. /* ---- sidebar ------------------------------------------------------------- */
  152. .sidebar {
  153. display: flex;
  154. flex-direction: column;
  155. min-height: 0;
  156. border-radius: var(--radius-lg);
  157. overflow: hidden;
  158. }
  159. .sidebar-top {
  160. padding: 14px 12px 8px;
  161. display: grid;
  162. gap: 8px;
  163. }
  164. .sidebar-top.traffic {
  165. padding-top: 40px; /* room for the macOS window buttons */
  166. }
  167. .new-chat {
  168. width: 100%;
  169. padding: 8px;
  170. }
  171. .search-trigger {
  172. display: flex;
  173. align-items: center;
  174. gap: 8px;
  175. width: 100%;
  176. color: var(--text-2);
  177. border: 1px solid var(--hairline);
  178. background: var(--glass-tint);
  179. text-align: left;
  180. }
  181. .search-trigger span {
  182. flex: 1;
  183. }
  184. .conv-list {
  185. flex: 1;
  186. overflow-y: auto;
  187. padding: 4px 8px 12px;
  188. }
  189. .conv-list h2 {
  190. font-size: 11px;
  191. font-weight: 600;
  192. text-transform: uppercase;
  193. letter-spacing: 0.06em;
  194. color: var(--text-3);
  195. margin: 14px 8px 4px;
  196. }
  197. .conv-list ul {
  198. list-style: none;
  199. margin: 0;
  200. padding: 0;
  201. }
  202. .conv {
  203. width: 100%;
  204. display: flex;
  205. gap: 8px;
  206. align-items: baseline;
  207. text-align: left;
  208. padding: 7px 8px;
  209. }
  210. .conv:hover {
  211. background: var(--accent-soft);
  212. }
  213. .conv.active {
  214. background: var(--glass-strong);
  215. box-shadow: inset 0 0 0 1px var(--glass-border);
  216. }
  217. .conv-title {
  218. flex: 1;
  219. min-width: 0;
  220. white-space: nowrap;
  221. overflow: hidden;
  222. text-overflow: ellipsis;
  223. }
  224. .conv-cost {
  225. font-size: 11px;
  226. color: var(--text-3);
  227. font-variant-numeric: tabular-nums;
  228. }
  229. .sidebar-foot {
  230. border-top: 1px solid var(--hairline);
  231. padding: 10px 12px 12px;
  232. display: grid;
  233. gap: 6px;
  234. }
  235. .sidebar-foot .row {
  236. justify-content: space-between;
  237. }
  238. .spend {
  239. display: grid;
  240. gap: 5px;
  241. text-align: left;
  242. width: 100%;
  243. padding: 8px;
  244. }
  245. .spend:hover {
  246. background: var(--accent-soft);
  247. }
  248. .spend-row {
  249. display: flex;
  250. justify-content: space-between;
  251. font-size: 12px;
  252. color: var(--text-2);
  253. }
  254. .spend-row strong {
  255. color: var(--text-1);
  256. font-variant-numeric: tabular-nums;
  257. }
  258. .spend-sub {
  259. font-size: 11px;
  260. color: var(--text-3);
  261. }
  262. .bar {
  263. height: 5px;
  264. border-radius: 5px;
  265. background: var(--hairline);
  266. overflow: hidden;
  267. }
  268. .bar span {
  269. display: block;
  270. height: 100%;
  271. background: linear-gradient(90deg, var(--teal), var(--accent));
  272. border-radius: 5px;
  273. }
  274. .spend.level-1 .bar span {
  275. background: var(--warn);
  276. }
  277. .spend.level-2 .bar span {
  278. background: var(--danger);
  279. }
  280. /* ---- main column --------------------------------------------------------- */
  281. .main {
  282. display: flex;
  283. flex-direction: column;
  284. min-width: 0;
  285. min-height: 0;
  286. position: relative;
  287. }
  288. .chat-header {
  289. display: flex;
  290. align-items: center;
  291. gap: 12px;
  292. padding: 8px 6px 8px 14px;
  293. min-height: 48px;
  294. }
  295. .title-wrap {
  296. flex: 1;
  297. min-width: 0;
  298. display: flex;
  299. align-items: baseline;
  300. gap: 10px;
  301. }
  302. .chat-title {
  303. font-size: 15px;
  304. font-weight: 600;
  305. margin: 0;
  306. white-space: nowrap;
  307. overflow: hidden;
  308. text-overflow: ellipsis;
  309. }
  310. .title-input {
  311. font-size: 15px;
  312. font-weight: 600;
  313. width: min(420px, 100%);
  314. }
  315. .chat-total {
  316. font-size: 12px;
  317. color: var(--text-3);
  318. font-variant-numeric: tabular-nums;
  319. white-space: nowrap;
  320. }
  321. .header-actions {
  322. display: flex;
  323. gap: 4px;
  324. align-items: center;
  325. }
  326. .anchor {
  327. position: relative;
  328. }
  329. .model-button {
  330. display: flex;
  331. align-items: baseline;
  332. gap: 8px;
  333. border-radius: 999px;
  334. padding: 5px 12px;
  335. max-width: 340px;
  336. }
  337. .model-button-name {
  338. font-weight: 600;
  339. white-space: nowrap;
  340. overflow: hidden;
  341. text-overflow: ellipsis;
  342. }
  343. .model-button-price {
  344. font-size: 11px;
  345. color: var(--text-3);
  346. white-space: nowrap;
  347. }
  348. /* ---- popovers and menus -------------------------------------------------- */
  349. .popover {
  350. position: absolute;
  351. top: calc(100% + 6px);
  352. right: 0;
  353. z-index: 30;
  354. border-radius: var(--radius);
  355. padding: 6px;
  356. animation: pop 140ms var(--ease);
  357. }
  358. @keyframes pop {
  359. from {
  360. opacity: 0;
  361. transform: translateY(-4px) scale(0.98);
  362. }
  363. }
  364. .menu {
  365. min-width: 190px;
  366. display: grid;
  367. }
  368. .menu button {
  369. text-align: left;
  370. padding: 6px 10px;
  371. }
  372. .menu button:hover {
  373. background: var(--accent-soft);
  374. }
  375. .menu button.checked::before {
  376. content: '\2713';
  377. margin-right: 6px;
  378. }
  379. .menu hr {
  380. border: 0;
  381. border-top: 1px solid var(--hairline);
  382. margin: 4px 0;
  383. }
  384. .model-picker {
  385. width: min(560px, calc(100vw - 40px));
  386. display: grid;
  387. gap: 8px;
  388. padding: 10px;
  389. }
  390. .search-input {
  391. width: 100%;
  392. font-size: 14px;
  393. }
  394. .search-input.big {
  395. font-size: 17px;
  396. padding: 12px 14px;
  397. border: 0;
  398. border-bottom: 1px solid var(--hairline);
  399. border-radius: 0;
  400. background: transparent;
  401. box-shadow: none;
  402. }
  403. .filters {
  404. display: flex;
  405. gap: 6px;
  406. flex-wrap: wrap;
  407. }
  408. .model-head,
  409. .model-row {
  410. display: grid;
  411. grid-template-columns: 1fr 128px 56px;
  412. gap: 10px;
  413. align-items: center;
  414. }
  415. .model-head {
  416. font-size: 11px;
  417. color: var(--text-3);
  418. padding: 0 8px;
  419. text-transform: uppercase;
  420. letter-spacing: 0.05em;
  421. }
  422. .model-list {
  423. list-style: none;
  424. margin: 0;
  425. padding: 0;
  426. max-height: 360px;
  427. overflow-y: auto;
  428. }
  429. .model-row {
  430. padding: 6px 8px;
  431. border-radius: var(--radius-sm);
  432. }
  433. .model-row.cursor {
  434. background: var(--accent-soft);
  435. }
  436. .model-row.selected .model-id {
  437. color: var(--accent);
  438. font-weight: 600;
  439. }
  440. .model-name {
  441. display: flex;
  442. align-items: center;
  443. gap: 6px;
  444. min-width: 0;
  445. }
  446. .model-id {
  447. white-space: nowrap;
  448. overflow: hidden;
  449. text-overflow: ellipsis;
  450. }
  451. .model-price,
  452. .model-ctx {
  453. font-size: 12px;
  454. color: var(--text-2);
  455. font-variant-numeric: tabular-nums;
  456. text-align: right;
  457. }
  458. .star {
  459. padding: 0 2px;
  460. color: var(--hairline);
  461. font-size: 13px;
  462. }
  463. .star.on {
  464. color: #e0a526;
  465. }
  466. .tag {
  467. font-size: 10px;
  468. padding: 0 6px;
  469. border-radius: 999px;
  470. background: var(--accent-soft);
  471. color: var(--text-2);
  472. white-space: nowrap;
  473. }
  474. .tag.local {
  475. background: rgba(15, 125, 114, 0.15);
  476. }
  477. .picker-foot {
  478. display: flex;
  479. justify-content: space-between;
  480. align-items: center;
  481. gap: 8px;
  482. }
  483. .empty-row {
  484. padding: 12px;
  485. color: var(--text-3);
  486. list-style: none;
  487. }
  488. /* ---- the thread ---------------------------------------------------------- */
  489. .chat-scroll {
  490. flex: 1;
  491. overflow-y: auto;
  492. min-height: 0;
  493. }
  494. .thread {
  495. max-width: 780px;
  496. margin: 0 auto;
  497. padding: 12px 24px 24px;
  498. display: grid;
  499. gap: 18px;
  500. }
  501. .system-prompt {
  502. font-size: 12px;
  503. color: var(--text-2);
  504. border-left: 2px solid var(--accent-soft);
  505. padding: 4px 10px;
  506. }
  507. .system-prompt summary {
  508. cursor: default;
  509. color: var(--text-3);
  510. }
  511. .msg.user {
  512. justify-self: end;
  513. max-width: 82%;
  514. display: grid;
  515. justify-items: end;
  516. gap: 4px;
  517. }
  518. .msg.user .bubble {
  519. background: var(--user-bubble);
  520. border: 1px solid var(--glass-border);
  521. border-radius: var(--radius-lg) var(--radius-lg) 4px var(--radius-lg);
  522. padding: 9px 14px;
  523. display: grid;
  524. gap: 8px;
  525. }
  526. .user-text {
  527. white-space: pre-wrap;
  528. overflow-wrap: anywhere;
  529. }
  530. .msg-actions {
  531. opacity: 0;
  532. transition: opacity 120ms;
  533. display: flex;
  534. gap: 2px;
  535. }
  536. .msg:hover .msg-actions,
  537. .msg:focus-within .msg-actions {
  538. opacity: 1;
  539. }
  540. .msg.assistant {
  541. display: grid;
  542. gap: 6px;
  543. }
  544. .msg-meta {
  545. display: flex;
  546. align-items: center;
  547. flex-wrap: wrap;
  548. gap: 4px 10px;
  549. font-size: 12px;
  550. color: var(--text-3);
  551. }
  552. .msg-meta button {
  553. opacity: 0;
  554. }
  555. .msg:hover .msg-meta button,
  556. .msg:focus-within .msg-meta button {
  557. opacity: 1;
  558. }
  559. .model-tag {
  560. font-weight: 600;
  561. color: var(--text-2);
  562. }
  563. .cost-line {
  564. font-variant-numeric: tabular-nums;
  565. }
  566. .cost-line strong {
  567. color: var(--text-2);
  568. font-weight: 600;
  569. }
  570. .est {
  571. margin-left: 4px;
  572. text-decoration: none;
  573. font-size: 11px;
  574. padding: 0 5px;
  575. border-radius: 999px;
  576. background: var(--warn-bg);
  577. color: var(--warn);
  578. }
  579. .msg-error {
  580. color: var(--danger);
  581. background: var(--danger-bg);
  582. border-radius: var(--radius-sm);
  583. padding: 8px 12px;
  584. font-size: 13px;
  585. }
  586. .msg-note {
  587. color: var(--text-3);
  588. font-size: 12px;
  589. font-style: italic;
  590. }
  591. .reasoning {
  592. font-size: 13px;
  593. color: var(--text-2);
  594. }
  595. .reasoning summary {
  596. color: var(--text-3);
  597. font-size: 12px;
  598. }
  599. .reasoning-text {
  600. white-space: pre-wrap;
  601. border-left: 2px solid var(--hairline);
  602. padding: 4px 10px;
  603. margin-top: 4px;
  604. }
  605. .edit {
  606. display: grid;
  607. gap: 8px;
  608. min-width: min(520px, 70vw);
  609. }
  610. .typing {
  611. display: flex;
  612. gap: 4px;
  613. padding: 6px 0;
  614. }
  615. .typing span {
  616. width: 6px;
  617. height: 6px;
  618. border-radius: 50%;
  619. background: var(--text-3);
  620. animation: blink 1.1s infinite;
  621. }
  622. .typing span:nth-child(2) {
  623. animation-delay: 0.18s;
  624. }
  625. .typing span:nth-child(3) {
  626. animation-delay: 0.36s;
  627. }
  628. @keyframes blink {
  629. 50% {
  630. opacity: 0.25;
  631. }
  632. }
  633. .caret {
  634. display: inline-block;
  635. width: 7px;
  636. height: 15px;
  637. background: var(--accent);
  638. border-radius: 2px;
  639. animation: blink 1s infinite;
  640. margin-top: -4px;
  641. }
  642. .msg-image {
  643. margin: 0;
  644. width: min(360px, 100%);
  645. border-radius: var(--radius);
  646. overflow: hidden;
  647. background: var(--hairline);
  648. }
  649. .msg-image img {
  650. width: 100%;
  651. height: 100%;
  652. object-fit: cover;
  653. display: block;
  654. }
  655. /* ---- markdown ------------------------------------------------------------ */
  656. .md {
  657. line-height: 1.62;
  658. overflow-wrap: anywhere;
  659. }
  660. .md > :first-child {
  661. margin-top: 0;
  662. }
  663. .md > :last-child {
  664. margin-bottom: 0;
  665. }
  666. .md p,
  667. .md ul,
  668. .md ol,
  669. .md table {
  670. margin: 0 0 10px;
  671. }
  672. .md h1,
  673. .md h2,
  674. .md h3 {
  675. font-size: 15px;
  676. margin: 16px 0 6px;
  677. }
  678. .md a {
  679. color: var(--accent);
  680. }
  681. .md code {
  682. font-family: var(--mono);
  683. font-size: 12.5px;
  684. background: var(--code-bg);
  685. padding: 1px 5px;
  686. border-radius: 5px;
  687. }
  688. .md pre code {
  689. background: none;
  690. padding: 0;
  691. }
  692. .md table {
  693. border-collapse: collapse;
  694. font-size: 13px;
  695. display: block;
  696. overflow-x: auto;
  697. }
  698. .md th,
  699. .md td {
  700. border-bottom: 1px solid var(--hairline);
  701. padding: 5px 12px 5px 0;
  702. text-align: left;
  703. }
  704. .md th {
  705. color: var(--text-2);
  706. font-weight: 600;
  707. }
  708. .md blockquote {
  709. margin: 0 0 10px;
  710. padding-left: 12px;
  711. border-left: 3px solid var(--accent-soft);
  712. color: var(--text-2);
  713. }
  714. .codeblock {
  715. border-radius: var(--radius);
  716. background: var(--code-bg);
  717. border: 1px solid var(--hairline);
  718. margin: 0 0 12px;
  719. overflow: hidden;
  720. }
  721. .codeblock-bar {
  722. display: flex;
  723. justify-content: space-between;
  724. align-items: center;
  725. padding: 3px 6px 3px 12px;
  726. font-size: 11px;
  727. color: var(--text-3);
  728. border-bottom: 1px solid var(--hairline);
  729. }
  730. .codeblock pre {
  731. margin: 0;
  732. padding: 10px 12px;
  733. overflow-x: auto;
  734. font-family: var(--mono);
  735. font-size: 12.5px;
  736. line-height: 1.55;
  737. }
  738. .md-img {
  739. color: var(--text-3);
  740. font-style: italic;
  741. }
  742. /* ---- composer ------------------------------------------------------------ */
  743. .composer-wrap {
  744. padding: 0 24px 12px;
  745. }
  746. .composer {
  747. max-width: 780px;
  748. margin: 0 auto;
  749. border-radius: var(--radius-lg);
  750. padding: 10px 10px 8px 14px;
  751. display: grid;
  752. gap: 6px;
  753. -webkit-backdrop-filter: blur(var(--blur)) saturate(var(--saturate));
  754. backdrop-filter: blur(var(--blur)) saturate(var(--saturate));
  755. }
  756. .composer.dragging {
  757. box-shadow: var(--focus), var(--shadow);
  758. }
  759. .composer textarea {
  760. resize: none;
  761. border: 0;
  762. background: transparent;
  763. padding: 4px 0;
  764. font-size: 14.5px;
  765. line-height: 1.5;
  766. max-height: 240px;
  767. box-shadow: none;
  768. }
  769. .composer-bar {
  770. display: flex;
  771. align-items: center;
  772. gap: 8px;
  773. }
  774. .estimate {
  775. flex: 1;
  776. font-size: 12px;
  777. color: var(--text-3);
  778. font-variant-numeric: tabular-nums;
  779. }
  780. .estimate.over {
  781. color: var(--danger);
  782. }
  783. .send {
  784. padding: 6px 16px;
  785. }
  786. .stop {
  787. padding: 6px 16px;
  788. background: var(--danger-bg);
  789. color: var(--danger);
  790. font-weight: 600;
  791. }
  792. .chips {
  793. display: flex;
  794. flex-wrap: wrap;
  795. gap: 6px;
  796. }
  797. .chip {
  798. display: flex;
  799. align-items: center;
  800. gap: 6px;
  801. max-width: 220px;
  802. border: 1px solid var(--hairline);
  803. background: var(--glass-tint);
  804. border-radius: var(--radius-sm);
  805. padding: 3px 4px 3px 3px;
  806. font-size: 12px;
  807. }
  808. .chip img,
  809. .chip-thumb {
  810. width: 26px;
  811. height: 26px;
  812. border-radius: 5px;
  813. object-fit: cover;
  814. background: var(--hairline);
  815. }
  816. .chip-icon {
  817. font-size: 9px;
  818. font-weight: 700;
  819. padding: 5px 4px;
  820. border-radius: 5px;
  821. background: var(--accent-soft);
  822. color: var(--accent);
  823. }
  824. .chip-name {
  825. white-space: nowrap;
  826. overflow: hidden;
  827. text-overflow: ellipsis;
  828. }
  829. .chip-x {
  830. padding: 0 5px;
  831. font-size: 15px;
  832. line-height: 18px;
  833. color: var(--text-3);
  834. }
  835. /* ---- empty state --------------------------------------------------------- */
  836. .empty {
  837. max-width: 560px;
  838. margin: 12vh auto 0;
  839. padding: 0 24px;
  840. text-align: center;
  841. display: grid;
  842. gap: 10px;
  843. justify-items: center;
  844. }
  845. .empty h1 {
  846. font-size: 24px;
  847. font-weight: 650;
  848. margin: 8px 0 0;
  849. letter-spacing: -0.01em;
  850. }
  851. .empty-mark {
  852. width: 54px;
  853. height: 54px;
  854. border-radius: 16px;
  855. background:
  856. radial-gradient(circle at 70% 30%, var(--teal) 0 14%, transparent 15%),
  857. conic-gradient(from 210deg, var(--accent), var(--teal), var(--accent));
  858. -webkit-mask: radial-gradient(circle, transparent 11px, #000 12px);
  859. mask: radial-gradient(circle, transparent 11px, #000 12px);
  860. opacity: 0.9;
  861. }
  862. .suggestions {
  863. display: grid;
  864. gap: 8px;
  865. width: 100%;
  866. margin-top: 18px;
  867. }
  868. .suggestion {
  869. text-align: left;
  870. padding: 10px 14px;
  871. border-radius: var(--radius);
  872. color: var(--text-2);
  873. }
  874. .suggestion:hover {
  875. color: var(--text-1);
  876. background: var(--glass-strong);
  877. }
  878. /* ---- banners, toasts ----------------------------------------------------- */
  879. .budget-banner {
  880. margin: 0 24px 8px;
  881. padding: 7px 12px;
  882. border-radius: var(--radius-sm);
  883. font-size: 13px;
  884. }
  885. .budget-banner.near {
  886. background: var(--warn-bg);
  887. color: var(--warn);
  888. }
  889. .budget-banner.over {
  890. background: var(--danger-bg);
  891. color: var(--danger);
  892. }
  893. .toasts {
  894. position: fixed;
  895. bottom: 18px;
  896. left: 50%;
  897. transform: translateX(-50%);
  898. display: grid;
  899. gap: 8px;
  900. z-index: 60;
  901. pointer-events: none;
  902. }
  903. .toast {
  904. border-radius: var(--radius);
  905. padding: 9px 14px;
  906. font-size: 13px;
  907. max-width: min(520px, 90vw);
  908. animation: pop 160ms var(--ease);
  909. }
  910. .toast.error {
  911. color: var(--danger);
  912. }
  913. /* ---- overlays: search, settings, usage ----------------------------------- */
  914. .overlay {
  915. position: fixed;
  916. inset: 0;
  917. z-index: 40;
  918. background: rgba(10, 8, 20, 0.22);
  919. display: grid;
  920. justify-items: center;
  921. align-items: start;
  922. padding: 9vh 16px 16px;
  923. animation: fade 140ms var(--ease);
  924. }
  925. @keyframes fade {
  926. from {
  927. opacity: 0;
  928. }
  929. }
  930. .palette {
  931. width: min(640px, 100%);
  932. border-radius: var(--radius-lg);
  933. overflow: hidden;
  934. }
  935. .hits {
  936. list-style: none;
  937. margin: 0;
  938. padding: 6px;
  939. max-height: 56vh;
  940. overflow-y: auto;
  941. }
  942. .hits li {
  943. padding: 9px 10px;
  944. border-radius: var(--radius-sm);
  945. display: grid;
  946. gap: 2px;
  947. }
  948. .hits li.cursor {
  949. background: var(--accent-soft);
  950. }
  951. .hit-head {
  952. display: flex;
  953. justify-content: space-between;
  954. gap: 10px;
  955. }
  956. .hit-snippet {
  957. font-size: 13px;
  958. color: var(--text-2);
  959. }
  960. mark {
  961. background: rgba(255, 196, 92, 0.45);
  962. color: inherit;
  963. border-radius: 3px;
  964. padding: 0 2px;
  965. }
  966. .sheet {
  967. width: min(720px, 100%);
  968. max-height: 84vh;
  969. border-radius: var(--radius-lg);
  970. display: flex;
  971. flex-direction: column;
  972. overflow: hidden;
  973. }
  974. .sheet-head {
  975. display: flex;
  976. align-items: center;
  977. gap: 12px;
  978. padding: 14px 16px;
  979. border-bottom: 1px solid var(--hairline);
  980. }
  981. .sheet-head h2 {
  982. margin: 0;
  983. font-size: 16px;
  984. flex: 1;
  985. }
  986. .sheet-body {
  987. overflow-y: auto;
  988. padding: 8px 18px 22px;
  989. }
  990. .sheet-body h3 {
  991. font-size: 12px;
  992. text-transform: uppercase;
  993. letter-spacing: 0.06em;
  994. color: var(--text-3);
  995. margin: 20px 0 8px;
  996. }
  997. .settings section {
  998. display: grid;
  999. gap: 10px;
  1000. }
  1001. .field {
  1002. display: grid;
  1003. gap: 6px;
  1004. font-size: 13px;
  1005. color: var(--text-2);
  1006. }
  1007. .field input,
  1008. .field select,
  1009. .field textarea {
  1010. color: var(--text-1);
  1011. }
  1012. .hint {
  1013. margin: 0;
  1014. font-size: 12px;
  1015. color: var(--text-3);
  1016. }
  1017. .check {
  1018. display: flex;
  1019. gap: 8px;
  1020. align-items: center;
  1021. font-size: 13px;
  1022. }
  1023. .check input {
  1024. accent-color: var(--accent);
  1025. }
  1026. label.inline {
  1027. display: flex;
  1028. align-items: center;
  1029. gap: 6px;
  1030. font-size: 13px;
  1031. }
  1032. label.inline input {
  1033. width: 70px;
  1034. }
  1035. .provider-row,
  1036. .preset-list li {
  1037. display: flex;
  1038. justify-content: space-between;
  1039. gap: 10px;
  1040. align-items: center;
  1041. padding: 10px 12px;
  1042. border-radius: var(--radius);
  1043. }
  1044. .preset-list {
  1045. list-style: none;
  1046. margin: 0;
  1047. padding: 0;
  1048. display: grid;
  1049. gap: 6px;
  1050. }
  1051. .clamp {
  1052. display: -webkit-box;
  1053. -webkit-line-clamp: 2;
  1054. -webkit-box-orient: vertical;
  1055. overflow: hidden;
  1056. }
  1057. .shortcut {
  1058. border: 1px solid var(--hairline);
  1059. background: var(--glass-tint);
  1060. min-width: 160px;
  1061. font-size: 15px;
  1062. letter-spacing: 0.04em;
  1063. }
  1064. .shortcut.recording {
  1065. border-color: var(--accent);
  1066. box-shadow: var(--focus);
  1067. font-size: 13px;
  1068. }
  1069. .path {
  1070. color: var(--text-2);
  1071. overflow: hidden;
  1072. text-overflow: ellipsis;
  1073. white-space: nowrap;
  1074. }
  1075. .stat-row {
  1076. display: grid;
  1077. grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  1078. gap: 8px;
  1079. margin-top: 12px;
  1080. }
  1081. .stat {
  1082. border-radius: var(--radius);
  1083. padding: 10px 12px;
  1084. display: grid;
  1085. gap: 2px;
  1086. }
  1087. .stat strong {
  1088. font-size: 18px;
  1089. font-variant-numeric: tabular-nums;
  1090. }
  1091. .bars {
  1092. list-style: none;
  1093. margin: 0;
  1094. padding: 0;
  1095. display: grid;
  1096. gap: 6px;
  1097. }
  1098. .bars li {
  1099. display: grid;
  1100. grid-template-columns: minmax(0, 200px) 1fr 80px;
  1101. gap: 10px;
  1102. align-items: center;
  1103. font-size: 13px;
  1104. }
  1105. .bar-label {
  1106. overflow: hidden;
  1107. text-overflow: ellipsis;
  1108. white-space: nowrap;
  1109. }
  1110. .bar-track {
  1111. height: 8px;
  1112. background: var(--hairline);
  1113. border-radius: 8px;
  1114. overflow: hidden;
  1115. }
  1116. .bar-fill {
  1117. display: block;
  1118. height: 100%;
  1119. background: linear-gradient(90deg, var(--teal), var(--accent));
  1120. border-radius: 8px;
  1121. }
  1122. .bar-value {
  1123. text-align: right;
  1124. font-variant-numeric: tabular-nums;
  1125. color: var(--text-2);
  1126. }
  1127. .days {
  1128. display: flex;
  1129. align-items: flex-end;
  1130. gap: 4px;
  1131. height: 120px;
  1132. padding-top: 8px;
  1133. overflow-x: auto;
  1134. }
  1135. .day {
  1136. flex: 1 0 22px;
  1137. display: grid;
  1138. grid-template-rows: 1fr auto;
  1139. height: 100%;
  1140. gap: 4px;
  1141. }
  1142. .day-fill {
  1143. align-self: end;
  1144. background: linear-gradient(180deg, var(--accent), var(--teal));
  1145. border-radius: 4px 4px 1px 1px;
  1146. min-height: 3px;
  1147. }
  1148. .day-label {
  1149. font-size: 10px;
  1150. color: var(--text-3);
  1151. text-align: center;
  1152. }
  1153. /* ---- the quick window ---------------------------------------------------- */
  1154. .quick-window body {
  1155. background: transparent;
  1156. }
  1157. :root.quick-window[data-vibrancy='none'] body {
  1158. background: var(--backdrop);
  1159. }
  1160. .quick {
  1161. height: 100%;
  1162. border-radius: 14px;
  1163. display: flex;
  1164. flex-direction: column;
  1165. overflow: hidden;
  1166. }
  1167. :root[data-vibrancy='native'] .quick {
  1168. border: 0;
  1169. box-shadow: none;
  1170. background: transparent;
  1171. }
  1172. .quick-row {
  1173. display: flex;
  1174. align-items: center;
  1175. gap: 12px;
  1176. padding: 0 18px;
  1177. height: 76px;
  1178. flex: none;
  1179. }
  1180. .quick-mark {
  1181. width: 22px;
  1182. height: 22px;
  1183. border-radius: 50%;
  1184. border: 4px solid var(--accent);
  1185. border-right-color: transparent;
  1186. transform: rotate(45deg);
  1187. flex: none;
  1188. }
  1189. .quick-input {
  1190. flex: 1;
  1191. font-size: 20px;
  1192. border: 0;
  1193. background: transparent;
  1194. padding: 0;
  1195. box-shadow: none !important;
  1196. }
  1197. .quick-model {
  1198. font-size: 12px;
  1199. color: var(--text-3);
  1200. white-space: nowrap;
  1201. }
  1202. .quick-body {
  1203. border-top: 1px solid var(--hairline);
  1204. padding: 12px 18px 12px;
  1205. overflow-y: auto;
  1206. display: grid;
  1207. gap: 8px;
  1208. }
  1209. .quick-foot {
  1210. display: flex;
  1211. align-items: center;
  1212. gap: 8px;
  1213. font-size: 12px;
  1214. color: var(--text-3);
  1215. }
  1216. /* ---- narrow windows ------------------------------------------------------ */
  1217. @media (max-width: 860px) {
  1218. .app {
  1219. grid-template-columns: 220px 1fr;
  1220. }
  1221. .model-button-price {
  1222. display: none;
  1223. }
  1224. .thread {
  1225. padding: 8px 14px 20px;
  1226. }
  1227. .composer-wrap {
  1228. padding: 0 12px 10px;
  1229. }
  1230. }