share.module.css 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  1. .root {
  2. display: flex;
  3. flex-direction: column;
  4. gap: 2.5rem;
  5. line-height: 1;
  6. padding: 1.5rem;
  7. @media (max-width: 30rem) {
  8. padding: 1rem;
  9. gap: 2rem;
  10. }
  11. --sm-tool-width: 28rem;
  12. --md-tool-width: 40rem;
  13. --lg-tool-width: 56rem;
  14. --term-icon: url("data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2060%2016'%20preserveAspectRatio%3D'xMidYMid%20meet'%3E%3Ccircle%20cx%3D'8'%20cy%3D'8'%20r%3D'8'%2F%3E%3Ccircle%20cx%3D'30'%20cy%3D'8'%20r%3D'8'%2F%3E%3Ccircle%20cx%3D'52'%20cy%3D'8'%20r%3D'8'%2F%3E%3C%2Fsvg%3E");
  15. }
  16. [data-element-button-text] {
  17. cursor: pointer;
  18. appearance: none;
  19. background-color: transparent;
  20. border: none;
  21. padding: 0;
  22. color: var(--sl-color-text-secondary);
  23. &:hover {
  24. color: var(--sl-color-text);
  25. }
  26. &[data-element-button-more] {
  27. display: flex;
  28. align-items: center;
  29. gap: 0.125rem;
  30. span[data-button-icon] {
  31. line-height: 1;
  32. opacity: 0.85;
  33. svg {
  34. display: block;
  35. }
  36. }
  37. }
  38. }
  39. [data-element-label] {
  40. text-transform: uppercase;
  41. letter-spacing: -0.5px;
  42. color: var(--sl-color-text-dimmed);
  43. }
  44. .header {
  45. display: flex;
  46. flex-direction: column;
  47. gap: 1rem;
  48. @media (max-width: 30rem) {
  49. gap: 1rem;
  50. }
  51. [data-section="title"] {
  52. h1 {
  53. font-size: 2.75rem;
  54. font-weight: 500;
  55. line-height: 1.2;
  56. letter-spacing: -0.05em;
  57. display: -webkit-box;
  58. -webkit-box-orient: vertical;
  59. -webkit-line-clamp: 3;
  60. overflow: hidden;
  61. @media (max-width: 30rem) {
  62. font-size: 1.75rem;
  63. line-height: 1.25;
  64. -webkit-line-clamp: 3;
  65. }
  66. }
  67. }
  68. [data-section="row"] {
  69. display: flex;
  70. flex-direction: column;
  71. gap: 0.5rem;
  72. }
  73. [data-section="stats"] {
  74. list-style-type: none;
  75. padding: 0;
  76. margin: 0;
  77. display: flex;
  78. gap: 0.5rem 1rem;
  79. flex-wrap: wrap;
  80. li {
  81. display: flex;
  82. align-items: center;
  83. gap: 0.5rem;
  84. font-size: 0.875rem;
  85. span[data-placeholder] {
  86. color: var(--sl-color-text-dimmed);
  87. }
  88. }
  89. }
  90. [data-section="stats"][data-section-root],
  91. [data-section="stats"][data-section-models] {
  92. li {
  93. gap: 0.3125rem;
  94. [data-stat-icon] {
  95. flex: 0 0 auto;
  96. color: var(--sl-color-text-dimmed);
  97. opacity: 0.85;
  98. svg {
  99. display: block;
  100. }
  101. }
  102. span[data-stat-model] {
  103. color: var(--sl-color-text);
  104. }
  105. }
  106. }
  107. [data-section="time"] {
  108. span {
  109. color: var(--sl-color-text-dimmed);
  110. font-size: 0.875rem;
  111. }
  112. }
  113. }
  114. .parts {
  115. display: flex;
  116. flex-direction: column;
  117. gap: 0.625rem;
  118. [data-section="part"] {
  119. display: flex;
  120. gap: 0.625rem;
  121. & > [data-section="decoration"] {
  122. flex: 0 0 auto;
  123. display: flex;
  124. flex-direction: column;
  125. gap: 0.625rem;
  126. align-items: center;
  127. justify-content: flex-start;
  128. [data-element-anchor] {
  129. position: relative;
  130. a:first-child {
  131. display: block;
  132. flex: 0 0 auto;
  133. width: 18px;
  134. opacity: 0.65;
  135. svg {
  136. color: var(--sl-color-text-secondary);
  137. display: block;
  138. &:nth-child(3) {
  139. color: var(--sl-color-green-high);
  140. }
  141. }
  142. svg:nth-child(2),
  143. svg:nth-child(3) {
  144. display: none;
  145. }
  146. &:hover {
  147. svg:nth-child(1) {
  148. display: none;
  149. }
  150. svg:nth-child(2) {
  151. display: block;
  152. }
  153. }
  154. }
  155. [data-element-tooltip] {
  156. position: absolute;
  157. top: 50%;
  158. left: calc(100% + 12px);
  159. transform: translate(0, -50%);
  160. line-height: 1.1;
  161. padding: 0.375em 0.5em calc(0.375em + 2px);
  162. background: var(--sl-color-white);
  163. color: var(--sl-color-text-invert);
  164. font-size: 0.6875rem;
  165. border-radius: 7px;
  166. white-space: nowrap;
  167. z-index: 1;
  168. opacity: 0;
  169. visibility: hidden;
  170. &::after {
  171. content: "";
  172. position: absolute;
  173. top: 50%;
  174. left: -15px;
  175. transform: translateY(-50%);
  176. border: 8px solid transparent;
  177. border-right-color: var(--sl-color-white);
  178. }
  179. }
  180. &[data-status="copied"] {
  181. [data-element-tooltip] {
  182. opacity: 1;
  183. visibility: visible;
  184. }
  185. a,
  186. a:hover {
  187. svg:nth-child(1),
  188. svg:nth-child(2) {
  189. display: none;
  190. }
  191. svg:nth-child(3) {
  192. display: block;
  193. }
  194. }
  195. }
  196. }
  197. div:last-child {
  198. width: 3px;
  199. height: 100%;
  200. border-radius: 1px;
  201. background-color: var(--sl-color-hairline);
  202. }
  203. }
  204. & > [data-section="content"] {
  205. flex: 1 1 auto;
  206. min-width: 0;
  207. padding: 0 0 0.375rem;
  208. display: flex;
  209. flex-direction: column;
  210. gap: 1rem;
  211. [data-part-tool-body] {
  212. display: flex;
  213. flex-direction: column;
  214. align-items: flex-start;
  215. gap: 0.375rem;
  216. }
  217. [data-part-title] {
  218. line-height: 18px;
  219. font-size: 0.875rem;
  220. color: var(--sl-color-text-secondary);
  221. max-width: var(--sm-tool-width);
  222. display: flex;
  223. align-items: flex-start;
  224. gap: 0.375rem;
  225. span[data-element-label] {
  226. color: var(--sl-color-text-secondary);
  227. }
  228. b {
  229. color: var(--sl-color-text);
  230. word-break: break-all;
  231. font-weight: 500;
  232. }
  233. }
  234. span[data-part-footer] {
  235. align-self: flex-start;
  236. font-size: 0.75rem;
  237. color: var(--sl-color-text-dimmed);
  238. }
  239. span[data-part-model] {
  240. line-height: 1.5;
  241. }
  242. [data-part-tool-args] {
  243. display: inline-grid;
  244. align-items: center;
  245. grid-template-columns: max-content max-content minmax(0, 1fr);
  246. max-width: var(--md-tool-width);
  247. gap: 0.25rem 0.375rem;
  248. & > div:nth-child(3n + 1) {
  249. width: 8px;
  250. height: 2px;
  251. border-radius: 1px;
  252. background: var(--sl-color-divider);
  253. }
  254. & > div:nth-child(3n + 2),
  255. & > div:nth-child(3n + 3) {
  256. font-size: 0.75rem;
  257. line-height: 1.5;
  258. }
  259. & > div:nth-child(3n + 3) {
  260. padding-left: 0.125rem;
  261. word-break: break-word;
  262. color: var(--sl-color-text-secondary);
  263. }
  264. }
  265. [data-part-tool-result] {
  266. display: flex;
  267. flex-direction: column;
  268. align-items: flex-start;
  269. gap: 0.5rem;
  270. button {
  271. font-size: 0.75rem;
  272. }
  273. }
  274. [data-part-tool-edit] {
  275. width: 100%;
  276. max-width: var(--lg-tool-width);
  277. }
  278. }
  279. }
  280. /* Part types */
  281. [data-part-type="user-text"],
  282. [data-part-type="ai-text"],
  283. [data-part-type="ai-model"],
  284. [data-part-type="system-text"],
  285. [data-part-type="fallback"] {
  286. & > [data-section="content"] {
  287. padding-bottom: 1rem;
  288. }
  289. }
  290. [data-part-type="tool-list"],
  291. [data-part-type="tool-glob"],
  292. [data-part-type="tool-read"],
  293. [data-part-type="tool-edit"],
  294. [data-part-type="tool-write"],
  295. [data-part-type="tool-fetch"] {
  296. & > [data-section="content"] > [data-part-tool-body] {
  297. gap: 0.5rem;
  298. }
  299. }
  300. [data-part-type="tool-grep"] {
  301. &:not(:has([data-part-tool-args]))
  302. > [data-section="content"] > [data-part-tool-body] {
  303. gap: 0.5rem;
  304. }
  305. }
  306. [data-part-type="tool-write"],
  307. [data-part-type="tool-read"],
  308. [data-part-type="tool-fetch"] {
  309. [data-part-tool-result] {
  310. [data-part-tool-code] {
  311. max-width: var(--md-tool-width);
  312. border: 1px solid var(--sl-color-divider);
  313. background-color: var(--sl-color-bg-surface);
  314. border-radius: 0.25rem;
  315. padding: 0.5rem calc(0.5rem + 3px);
  316. pre {
  317. line-height: 1.6;
  318. font-size: 0.75rem;
  319. white-space: pre-wrap;
  320. word-break: break-word;
  321. }
  322. }
  323. }
  324. }
  325. [data-part-type="connection-status"] {
  326. & > [data-section="decoration"] {
  327. span:first-child {
  328. flex: 0 0 auto;
  329. display: block;
  330. margin: 2px;
  331. width: 14px;
  332. height: 14px;
  333. border-radius: 50%;
  334. background-color: var(--sl-color-divider);
  335. &[data-status="connected"] {
  336. background-color: var(--sl-color-green);
  337. }
  338. &[data-status="connecting"] {
  339. background-color: var(--sl-color-orange);
  340. }
  341. &[data-status="disconnected"] {
  342. background-color: var(--sl-color-divider);
  343. }
  344. &[data-status="reconnecting"] {
  345. background-color: var(--sl-color-orange);
  346. }
  347. &[data-status="error"] {
  348. background-color: var(--sl-color-red);
  349. }
  350. }
  351. }
  352. & > [data-section="content"] {
  353. span {
  354. display: block;
  355. line-height: 18px;
  356. font-size: 0.875rem;
  357. color: var(--sl-color-text-dimmed);
  358. }
  359. }
  360. }
  361. }
  362. .message-text {
  363. background-color: var(--sl-color-bg-surface);
  364. padding: 0.5rem calc(0.5rem + 3px);
  365. border-radius: 0.25rem;
  366. display: flex;
  367. flex-direction: column;
  368. align-items: flex-start;
  369. gap: 1rem;
  370. align-self: flex-start;
  371. max-width: var(--md-tool-width);
  372. &[data-size="sm"] {
  373. pre {
  374. font-size: 0.75rem;
  375. }
  376. }
  377. &[data-color="dimmed"] {
  378. pre {
  379. color: var(--sl-color-text-dimmed);
  380. }
  381. }
  382. pre {
  383. line-height: 1.5;
  384. font-size: 0.875rem;
  385. white-space: pre-wrap;
  386. overflow-wrap: anywhere;
  387. color: var(--sl-color-text);
  388. }
  389. button {
  390. flex: 0 0 auto;
  391. padding: 2px 0;
  392. font-size: 0.75rem;
  393. }
  394. &[data-invert="true"] {
  395. background-color: var(--sl-color-blue-high);
  396. pre {
  397. color: var(--sl-color-text-invert);
  398. }
  399. button {
  400. opacity: 0.85;
  401. color: var(--sl-color-text-invert);
  402. &:hover {
  403. opacity: 1;
  404. }
  405. }
  406. }
  407. &[data-highlight="true"] {
  408. background-color: var(--sl-color-blue-low);
  409. }
  410. &[data-expanded="true"] {
  411. pre {
  412. display: block;
  413. }
  414. }
  415. &[data-expanded="false"] {
  416. pre {
  417. display: -webkit-box;
  418. -webkit-box-orient: vertical;
  419. -webkit-line-clamp: 3;
  420. overflow: hidden;
  421. }
  422. }
  423. }
  424. .message-error {
  425. background-color: var(--sl-color-bg-surface);
  426. padding: 0.5rem calc(0.5rem + 3px);
  427. border-radius: 0.25rem;
  428. display: flex;
  429. flex-direction: column;
  430. align-items: flex-start;
  431. gap: 1rem;
  432. align-self: flex-start;
  433. max-width: var(--md-tool-width);
  434. [data-section="content"] {
  435. pre {
  436. margin-bottom: 0.5rem;
  437. line-height: 1.5;
  438. font-size: 0.75rem;
  439. white-space: pre-wrap;
  440. word-break: break-word;
  441. &:last-child {
  442. margin-bottom: 0;
  443. }
  444. span {
  445. margin-right: 0.25rem;
  446. &:last-child {
  447. margin-right: 0;
  448. }
  449. }
  450. span[data-color="red"] {
  451. color: var(--sl-color-red);
  452. }
  453. span[data-color="dimmed"] {
  454. color: var(--sl-color-text-dimmed);
  455. }
  456. span[data-marker="label"] {
  457. text-transform: uppercase;
  458. letter-spacing: -0.5px;
  459. }
  460. span[data-separator] {
  461. margin-right: 0.375rem;
  462. }
  463. }
  464. }
  465. &[data-expanded="true"] {
  466. [data-section="content"] {
  467. display: block;
  468. }
  469. }
  470. &[data-expanded="false"] {
  471. [data-section="content"] {
  472. display: -webkit-box;
  473. -webkit-box-orient: vertical;
  474. -webkit-line-clamp: 7;
  475. overflow: hidden;
  476. }
  477. }
  478. button {
  479. flex: 0 0 auto;
  480. padding: 2px 0;
  481. font-size: 0.75rem;
  482. }
  483. }
  484. .message-terminal {
  485. display: flex;
  486. flex-direction: column;
  487. align-items: flex-start;
  488. gap: 0.5rem;
  489. width: 100%;
  490. max-width: var(--sm-tool-width);
  491. & > [data-section="body"] {
  492. width: 100%;
  493. border: 1px solid var(--sl-color-divider);
  494. border-radius: 0.25rem;
  495. [data-section="header"] {
  496. position: relative;
  497. border-bottom: 1px solid var(--sl-color-divider);
  498. width: 100%;
  499. height: 1.625rem;
  500. text-align: center;
  501. padding: 0 3.25rem;
  502. & > span {
  503. max-width: min(100%, 140ch);
  504. display: inline-block;
  505. white-space: nowrap;
  506. overflow: hidden;
  507. line-height: 1.625rem;
  508. font-size: 0.75rem;
  509. text-overflow: ellipsis;
  510. color: var(--sl-color-text-dimmed);
  511. }
  512. &::before {
  513. content: '';
  514. position: absolute;
  515. pointer-events: none;
  516. top: 8px;
  517. left: 10px;
  518. width: 2rem;
  519. height: 0.5rem;
  520. line-height: 0;
  521. background-color: var(--sl-color-hairline);
  522. mask-image: var(--term-icon);
  523. mask-repeat: no-repeat;
  524. }
  525. }
  526. }
  527. [data-section="content"] {
  528. padding: 0.5rem calc(0.5rem + 3px);
  529. pre {
  530. --shiki-dark-bg: var(--sl-color-bg) !important;
  531. background-color: var(--sl-color-bg) !important;
  532. line-height: 1.6;
  533. font-size: 0.75rem;
  534. white-space: pre-wrap;
  535. word-break: break-word;
  536. }
  537. }
  538. &[data-expanded="true"] {
  539. pre {
  540. display: block;
  541. }
  542. }
  543. &[data-expanded="false"] {
  544. pre {
  545. display: -webkit-box;
  546. -webkit-box-orient: vertical;
  547. -webkit-line-clamp: 7;
  548. overflow: hidden;
  549. }
  550. }
  551. button {
  552. flex: 0 0 auto;
  553. padding-left: 1px;
  554. font-size: 0.75rem;
  555. }
  556. }
  557. .message-markdown {
  558. background-color: var(--sl-color-bg-surface);
  559. padding: 0.5rem calc(0.5rem + 3px);
  560. border-radius: 0.25rem;
  561. display: flex;
  562. flex-direction: column;
  563. align-items: flex-start;
  564. gap: 1rem;
  565. align-self: flex-start;
  566. max-width: var(--md-tool-width);
  567. button {
  568. flex: 0 0 auto;
  569. padding: 2px 0;
  570. font-size: 0.75rem;
  571. }
  572. &[data-highlight="true"] {
  573. background-color: var(--sl-color-blue-low);
  574. }
  575. &[data-expanded="true"] {
  576. [data-element-markdown] {
  577. display: block;
  578. }
  579. }
  580. &[data-expanded="false"] {
  581. [data-element-markdown] {
  582. display: -webkit-box;
  583. -webkit-box-orient: vertical;
  584. -webkit-line-clamp: 3;
  585. overflow: hidden;
  586. }
  587. }
  588. }
  589. .diff-code-block {
  590. pre {
  591. line-height: 1.25;
  592. font-size: 0.75rem;
  593. }
  594. }
  595. .todos {
  596. list-style-type: none;
  597. padding: 0;
  598. margin: 0;
  599. width: 100%;
  600. max-width: var(--sm-tool-width);
  601. border: 1px solid var(--sl-color-divider);
  602. border-radius: 0.25rem;
  603. li {
  604. margin: 0;
  605. position: relative;
  606. padding-left: 1.5rem;
  607. font-size: 0.75rem;
  608. padding: 0.375rem 0.625rem 0.375rem 1.75rem;
  609. border-bottom: 1px solid var(--sl-color-divider);
  610. line-height: 1.5;
  611. word-break: break-word;
  612. &:last-child {
  613. border-bottom: none;
  614. }
  615. & > span {
  616. position: absolute;
  617. display: inline-block;
  618. left: 0.5rem;
  619. top: calc(0.5rem + 1px);
  620. width: 0.75rem;
  621. height: 0.75rem;
  622. border: 1px solid var(--sl-color-divider);
  623. border-radius: 0.15rem;
  624. &::before {
  625. }
  626. }
  627. &[data-status="pending"] {
  628. color: var(--sl-color-text);
  629. }
  630. &[data-status="in_progress"] {
  631. color: var(--sl-color-text);
  632. & > span { border-color: var(--sl-color-orange); }
  633. & > span::before {
  634. content: "";
  635. position: absolute;
  636. top: 2px;
  637. left: 2px;
  638. width: calc(0.75rem - 2px - 4px);
  639. height: calc(0.75rem - 2px - 4px);
  640. box-shadow: inset 1rem 1rem var(--sl-color-orange-low);
  641. }
  642. }
  643. &[data-status="completed"] {
  644. color: var(--sl-color-text-secondary);
  645. & > span { border-color: var(--sl-color-green-low); }
  646. & > span::before {
  647. content: "";
  648. position: absolute;
  649. top: 2px;
  650. left: 2px;
  651. width: calc(0.75rem - 2px - 4px);
  652. height: calc(0.75rem - 2px - 4px);
  653. box-shadow: inset 1rem 1rem var(--sl-color-green);
  654. transform-origin: bottom left;
  655. clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);
  656. }
  657. }
  658. }
  659. }