experimental-a2 0.20.0 → 0.22.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 (309) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +1 -1
  3. package/dist/{actor-C7b-1arn.d.ts → actor-CqibLgjQ.d.ts} +15 -7
  4. package/dist/actor-CqibLgjQ.d.ts.map +1 -0
  5. package/dist/actor-client.d.ts +1 -1
  6. package/dist/actor-client.js +2 -2
  7. package/dist/actor-react.d.ts +3 -3
  8. package/dist/actor-react.js +5 -5
  9. package/dist/{actor-shared-t7w8xIKP.js → actor-shared-DFET5q16.js} +3 -3
  10. package/dist/actor-shared-DFET5q16.js.map +1 -0
  11. package/dist/actor.d.ts +1 -1
  12. package/dist/actor.js +54 -43
  13. package/dist/actor.js.map +1 -1
  14. package/dist/{ai-Cz3hqVhk.d.ts → ai-DAu77CDr.d.ts} +8 -8
  15. package/dist/{ai-Cz3hqVhk.d.ts.map → ai-DAu77CDr.d.ts.map} +1 -1
  16. package/dist/{ai-mMiWul1T.js → ai-EEfKyc-z.js} +9 -9
  17. package/dist/ai-EEfKyc-z.js.map +1 -0
  18. package/dist/ai-client.d.ts +2 -2
  19. package/dist/ai-client.js +2 -2
  20. package/dist/ai-fx.d.ts +4 -2
  21. package/dist/ai-fx.d.ts.map +1 -1
  22. package/dist/ai-fx.js +214 -67
  23. package/dist/ai-fx.js.map +1 -1
  24. package/dist/{ai-harness-CV6rXbB3.d.ts → ai-harness-DTjkAr2T.d.ts} +2 -2
  25. package/dist/{ai-harness-CV6rXbB3.d.ts.map → ai-harness-DTjkAr2T.d.ts.map} +1 -1
  26. package/dist/{ai-harness-Clbg5ei7.js → ai-harness-dQeJaR1t.js} +7 -3
  27. package/dist/ai-harness-dQeJaR1t.js.map +1 -0
  28. package/dist/ai-pi.d.ts +1 -1
  29. package/dist/ai-pi.js +3 -3
  30. package/dist/ai-pi.js.map +1 -1
  31. package/dist/ai-react.d.ts +5 -5
  32. package/dist/ai-react.js +2 -2
  33. package/dist/ai-server.d.ts +14 -17
  34. package/dist/ai-server.d.ts.map +1 -1
  35. package/dist/ai-server.js +86 -73
  36. package/dist/ai-server.js.map +1 -1
  37. package/dist/ai.d.ts +2 -2
  38. package/dist/ai.js +2 -2
  39. package/dist/{client-BhHLoNKF.js → client-BQS4i_V9.js} +29 -6
  40. package/dist/client-BQS4i_V9.js.map +1 -0
  41. package/dist/{client-h_DKFAjj.d.ts → client-CUMbS_38.d.ts} +3 -3
  42. package/dist/{client-h_DKFAjj.d.ts.map → client-CUMbS_38.d.ts.map} +1 -1
  43. package/dist/client.d.ts +3 -3
  44. package/dist/client.js +1 -1
  45. package/dist/{contract-BYKASlCV.js → contract-CWukt01d.js} +2 -2
  46. package/dist/contract-CWukt01d.js.map +1 -0
  47. package/dist/index.d.ts +5 -5
  48. package/dist/index.js +3 -3
  49. package/dist/{initial-snapshot-Bx-c0pDP.d.ts → initial-snapshot-D3Lve43o.d.ts} +4 -4
  50. package/dist/initial-snapshot-D3Lve43o.d.ts.map +1 -0
  51. package/dist/{internal-CscSY7K_.js → internal-CvsrprnU.js} +40 -16
  52. package/dist/internal-CvsrprnU.js.map +1 -0
  53. package/dist/otel.d.ts +1 -1
  54. package/dist/otel.js +1 -1
  55. package/dist/otel.js.map +1 -1
  56. package/dist/{react-BBXgHWFc.d.ts → react-BoHvC3v9.d.ts} +4 -4
  57. package/dist/{react-BBXgHWFc.d.ts.map → react-BoHvC3v9.d.ts.map} +1 -1
  58. package/dist/react.d.ts +1 -1
  59. package/dist/react.js +1 -1
  60. package/dist/{reducer-CqA59Q6U.d.ts → reducer-CYPHsSmd.d.ts} +2 -2
  61. package/dist/{reducer-CqA59Q6U.d.ts.map → reducer-CYPHsSmd.d.ts.map} +1 -1
  62. package/dist/{reducer-BAXc8JyF.js → reducer-CjmvZSAb.js} +2 -2
  63. package/dist/{reducer-BAXc8JyF.js.map → reducer-CjmvZSAb.js.map} +1 -1
  64. package/dist/runtime-consumer-CIeL33wj.js +12 -0
  65. package/dist/runtime-consumer-CIeL33wj.js.map +1 -0
  66. package/dist/scheduler-qstash.d.ts +2 -2
  67. package/dist/scheduler-qstash.js +3 -3
  68. package/dist/scheduler-task-X1SToDjP.js.map +1 -1
  69. package/dist/scheduler-vercel.d.ts +2 -2
  70. package/dist/scheduler-vercel.js +3 -3
  71. package/dist/scheduler-vercel.js.map +1 -1
  72. package/dist/{server-qyb5aJJG.js → server-DtFrWxi3.js} +412 -116
  73. package/dist/server-DtFrWxi3.js.map +1 -0
  74. package/dist/{server-DYAATFuT.d.ts → server-qgez0Xny.d.ts} +108 -41
  75. package/dist/server-qgez0Xny.d.ts.map +1 -0
  76. package/dist/server.browser.js +1 -1
  77. package/dist/server.browser.js.map +1 -1
  78. package/dist/server.d.ts +4 -4
  79. package/dist/server.js +2 -2
  80. package/dist/{session-clear-C-QwTXV1.d.ts → session-clear-D1PFe7xl.d.ts} +2 -2
  81. package/dist/session-clear-D1PFe7xl.d.ts.map +1 -0
  82. package/dist/{session-clear-DGI4jTQ5.js → session-clear-wHd5GCpZ.js} +5 -4
  83. package/dist/session-clear-wHd5GCpZ.js.map +1 -0
  84. package/dist/store-D0MhBvg6.d.ts +532 -0
  85. package/dist/store-D0MhBvg6.d.ts.map +1 -0
  86. package/dist/store-N8PXxDAS.js.map +1 -1
  87. package/dist/store-codec-DwrWlgQx.js +65 -0
  88. package/dist/store-codec-DwrWlgQx.js.map +1 -0
  89. package/dist/store-memory.d.ts +1 -1
  90. package/dist/store-memory.d.ts.map +1 -1
  91. package/dist/store-memory.js +406 -225
  92. package/dist/store-memory.js.map +1 -1
  93. package/dist/{store-polling-7WJV0YWP.js → store-polling-BZt2Rf3D.js} +2 -2
  94. package/dist/{store-polling-7WJV0YWP.js.map → store-polling-BZt2Rf3D.js.map} +1 -1
  95. package/dist/store-postgres.d.ts +1 -1
  96. package/dist/store-postgres.d.ts.map +1 -1
  97. package/dist/store-postgres.js +1598 -587
  98. package/dist/store-postgres.js.map +1 -1
  99. package/dist/store-presence-polling-JuAy2Ck2.js +111 -0
  100. package/dist/store-presence-polling-JuAy2Ck2.js.map +1 -0
  101. package/dist/store-redis-http.d.ts +1 -1
  102. package/dist/store-redis-http.js +4 -4
  103. package/dist/store-redis-notify-CsJw_hfD.js +3060 -0
  104. package/dist/store-redis-notify-CsJw_hfD.js.map +1 -0
  105. package/dist/store-redis.d.ts +1 -1
  106. package/dist/store-redis.d.ts.map +1 -1
  107. package/dist/store-redis.js +4 -5
  108. package/dist/store-redis.js.map +1 -1
  109. package/dist/store-sqlite.d.ts +1 -1
  110. package/dist/store-sqlite.d.ts.map +1 -1
  111. package/dist/store-sqlite.js +527 -299
  112. package/dist/store-sqlite.js.map +1 -1
  113. package/dist/stream-buffer-DrTyiIuo.js +57 -0
  114. package/dist/stream-buffer-DrTyiIuo.js.map +1 -0
  115. package/dist/{telemetry-Cyfqo6Qt.d.ts → telemetry-CWwsh-Gx.d.ts} +3 -3
  116. package/dist/telemetry-CWwsh-Gx.d.ts.map +1 -0
  117. package/dist/{wire-BKxH1vbP.js → wire-CV-Z7wz-.js} +6 -5
  118. package/dist/wire-CV-Z7wz-.js.map +1 -0
  119. package/docs/01-quickstart.mdx +21 -15
  120. package/docs/02-examples.mdx +1 -1
  121. package/docs/actors/01-introduction.mdx +13 -2
  122. package/docs/actors/02-concurrency.mdx +1 -1
  123. package/docs/agents/01-introduction.mdx +1 -1
  124. package/docs/agents/02-tools.mdx +12 -11
  125. package/docs/agents/03-conversations.mdx +36 -25
  126. package/docs/agents/04-harnesses.mdx +14 -7
  127. package/docs/client/03-presence.mdx +18 -14
  128. package/docs/contract/01-events.mdx +2 -2
  129. package/docs/contract/02-state.mdx +18 -14
  130. package/docs/contract/03-sessions.mdx +32 -25
  131. package/docs/index.mdx +29 -24
  132. package/docs/reference/01-core.mdx +7 -6
  133. package/docs/reference/02-server.mdx +250 -191
  134. package/docs/reference/04-ai.mdx +33 -23
  135. package/docs/reference/05-telemetry.mdx +27 -13
  136. package/docs/reference/06-errors.mdx +25 -19
  137. package/docs/reference/meta.ts +1 -1
  138. package/docs/schedulers/01-overview.mdx +8 -8
  139. package/docs/schedulers/02-vercel-queues.mdx +2 -2
  140. package/docs/schedulers/03-qstash.mdx +4 -4
  141. package/docs/server/01-consumers.mdx +418 -0
  142. package/docs/server/02-timers.mdx +31 -21
  143. package/docs/server/03-cancellation.mdx +52 -44
  144. package/docs/server/04-routes.mdx +4 -1
  145. package/docs/server/05-sql-projections.mdx +391 -0
  146. package/docs/server/06-guarantees.mdx +61 -51
  147. package/docs/stores/01-overview.mdx +3 -3
  148. package/docs/stores/02-redis.mdx +24 -10
  149. package/docs/stores/03-redis-http.mdx +8 -6
  150. package/docs/stores/04-postgres.mdx +65 -14
  151. package/docs/stores/05-sqlite.mdx +5 -3
  152. package/docs/upgrades/01-overview.mdx +31 -0
  153. package/docs/upgrades/78-0-22.mdx +115 -0
  154. package/docs/upgrades/79-0-21.mdx +165 -0
  155. package/docs/upgrades/80-0-20.mdx +43 -0
  156. package/docs/upgrades/81-0-19.mdx +33 -0
  157. package/docs/upgrades/82-0-18.mdx +33 -0
  158. package/docs/upgrades/83-0-17.mdx +69 -0
  159. package/docs/upgrades/meta.ts +3 -0
  160. package/examples/playground/DEPLOY.md +39 -7
  161. package/examples/playground/app/a0/chat.test.tsx +2 -2
  162. package/examples/playground/app/a0/sandbox-log.ts +17 -15
  163. package/examples/playground/app/a0/sandbox.ts +58 -13
  164. package/examples/playground/app/a0/server.ts +4 -4
  165. package/examples/playground/app/a2slack/a2slack.css +1067 -0
  166. package/examples/playground/app/a2slack/c/[channel]/page.tsx +20 -0
  167. package/examples/playground/app/a2slack/consumers/agent.ts +63 -0
  168. package/examples/playground/app/a2slack/consumers/feed.ts +164 -0
  169. package/examples/playground/app/a2slack/consumers/notify.ts +116 -0
  170. package/examples/playground/app/a2slack/consumers/search.ts +37 -0
  171. package/examples/playground/app/a2slack/consumers/triage.ts +31 -0
  172. package/examples/playground/app/a2slack/consumers/welcome.ts +25 -0
  173. package/examples/playground/app/a2slack/db/a2.ts +209 -0
  174. package/examples/playground/app/a2slack/db/index.ts +73 -0
  175. package/examples/playground/app/a2slack/db/migrations/0000_extensions.sql +4 -0
  176. package/examples/playground/app/a2slack/db/migrations/0001_workspace.sql +74 -0
  177. package/examples/playground/app/a2slack/db/migrations/0002_a2.sql +215 -0
  178. package/examples/playground/app/a2slack/db/migrations/0003_a2_batch.sql +67 -0
  179. package/examples/playground/app/a2slack/db/migrations/0004_a2_session_event_ids.sql +2 -0
  180. package/examples/playground/app/a2slack/db/migrations/meta/0000_snapshot.json +18 -0
  181. package/examples/playground/app/a2slack/db/migrations/meta/0001_snapshot.json +500 -0
  182. package/examples/playground/app/a2slack/db/migrations/meta/0002_snapshot.json +1159 -0
  183. package/examples/playground/app/a2slack/db/migrations/meta/0003_snapshot.json +1159 -0
  184. package/examples/playground/app/a2slack/db/migrations/meta/0004_snapshot.json +1165 -0
  185. package/examples/playground/app/a2slack/db/migrations/meta/_journal.json +41 -0
  186. package/examples/playground/app/a2slack/db/queries.ts +263 -0
  187. package/examples/playground/app/a2slack/db/schema.ts +145 -0
  188. package/examples/playground/app/a2slack/drills/a2slack.drill.ts +708 -0
  189. package/examples/playground/app/a2slack/drills/harness.ts +244 -0
  190. package/examples/playground/app/a2slack/events/route.ts +36 -0
  191. package/examples/playground/app/a2slack/identity.ts +44 -0
  192. package/examples/playground/app/a2slack/inbox/route.ts +8 -0
  193. package/examples/playground/app/a2slack/lag/data/route.ts +8 -0
  194. package/examples/playground/app/a2slack/lag/page.tsx +101 -0
  195. package/examples/playground/app/a2slack/lag.ts +73 -0
  196. package/examples/playground/app/a2slack/layout.tsx +43 -0
  197. package/examples/playground/app/a2slack/messages/route.ts +17 -0
  198. package/examples/playground/app/a2slack/model.test.ts +208 -0
  199. package/examples/playground/app/a2slack/model.ts +369 -0
  200. package/examples/playground/app/a2slack/models.test.ts +72 -0
  201. package/examples/playground/app/a2slack/page.tsx +10 -0
  202. package/examples/playground/app/a2slack/scheduler/route.ts +5 -0
  203. package/examples/playground/app/a2slack/search/route.ts +40 -0
  204. package/examples/playground/app/a2slack/search-index.ts +108 -0
  205. package/examples/playground/app/a2slack/server.test.ts +315 -0
  206. package/examples/playground/app/a2slack/server.ts +55 -0
  207. package/examples/playground/app/a2slack/sessions.ts +50 -0
  208. package/examples/playground/app/a2slack/thread/route.ts +8 -0
  209. package/examples/playground/app/a2slack/ui/ChannelView.tsx +87 -0
  210. package/examples/playground/app/a2slack/ui/Composer.tsx +117 -0
  211. package/examples/playground/app/a2slack/ui/DotsShadow.tsx +42 -0
  212. package/examples/playground/app/a2slack/ui/Feed.tsx +157 -0
  213. package/examples/playground/app/a2slack/ui/InboxContext.tsx +63 -0
  214. package/examples/playground/app/a2slack/ui/InboxView.tsx +82 -0
  215. package/examples/playground/app/a2slack/ui/Menu.tsx +128 -0
  216. package/examples/playground/app/a2slack/ui/MessageRow.tsx +314 -0
  217. package/examples/playground/app/a2slack/ui/NameGate.tsx +35 -0
  218. package/examples/playground/app/a2slack/ui/SearchContext.tsx +146 -0
  219. package/examples/playground/app/a2slack/ui/SearchResults.tsx +97 -0
  220. package/examples/playground/app/a2slack/ui/Shell.tsx +34 -0
  221. package/examples/playground/app/a2slack/ui/Sidebar.tsx +199 -0
  222. package/examples/playground/app/a2slack/ui/ThreadPanel.tsx +134 -0
  223. package/examples/playground/app/a2slack/ui/useInbox.ts +71 -0
  224. package/examples/playground/app/agent/server.ts +3 -3
  225. package/examples/playground/app/chat/[chatId]/chat-client.tsx +1 -1
  226. package/examples/playground/app/chat/server.ts +45 -35
  227. package/examples/playground/app/components/demo-icons.tsx +7 -0
  228. package/examples/playground/app/components/demos.tsx +7 -0
  229. package/examples/playground/app/orders/[orderId]/order-client.tsx +2 -2
  230. package/examples/playground/app/orders/page.tsx +1 -1
  231. package/examples/playground/app/orders/server.ts +49 -30
  232. package/examples/playground/app/recovery/[recoveryId]/recovery-client.tsx +14 -15
  233. package/examples/playground/app/recovery/page.tsx +4 -4
  234. package/examples/playground/app/recovery/server.ts +23 -32
  235. package/examples/playground/drizzle.config.ts +14 -0
  236. package/examples/playground/lib/store.ts +1 -1
  237. package/examples/playground/next.config.ts +6 -1
  238. package/examples/playground/package.json +12 -1
  239. package/examples/playground/scripts/migrate.mjs +31 -0
  240. package/examples/playground/vercel.json +9 -0
  241. package/examples/playground/vitest.drills.config.ts +32 -0
  242. package/package.json +5 -2
  243. package/sql/postgres/drizzle-schema.ts +209 -0
  244. package/sql/postgres/schema.sql +227 -67
  245. package/src/actor-shared.ts +10 -2
  246. package/src/actor.ts +101 -71
  247. package/src/ai-agent.ts +162 -111
  248. package/src/ai-control-server.ts +8 -8
  249. package/src/ai-fx.ts +324 -82
  250. package/src/ai-harness.ts +17 -2
  251. package/src/ai-pi.ts +2 -2
  252. package/src/ai-server.ts +2 -2
  253. package/src/ai.ts +7 -7
  254. package/src/client.ts +19 -2
  255. package/src/contract.ts +1 -1
  256. package/src/deterministic-id.ts +27 -4
  257. package/src/errors.ts +8 -5
  258. package/src/idempotent-replay.ts +0 -1
  259. package/src/index.ts +1 -1
  260. package/src/internal.ts +57 -16
  261. package/src/otel.ts +1 -1
  262. package/src/postgres-schema.ts +98 -57
  263. package/src/presence-recovery.ts +18 -11
  264. package/src/presence-tombstones.ts +52 -0
  265. package/src/push-envelope.ts +20 -0
  266. package/src/runtime-consumer.ts +10 -0
  267. package/src/scheduler-task.ts +2 -2
  268. package/src/scheduler-vercel.ts +1 -1
  269. package/src/server.browser.ts +1 -1
  270. package/src/server.ts +819 -218
  271. package/src/session-socket.ts +1 -1
  272. package/src/store-codec.ts +66 -0
  273. package/src/store-memory.ts +604 -286
  274. package/src/store-postgres.ts +2006 -857
  275. package/src/store-presence-polling.ts +59 -34
  276. package/src/store-redis-core.ts +1961 -1333
  277. package/src/store-redis-notify.ts +76 -26
  278. package/src/store-redis.ts +2 -3
  279. package/src/store-sqlite.ts +915 -516
  280. package/src/store.ts +241 -102
  281. package/src/telemetry.ts +2 -1
  282. package/src/wire.ts +1 -0
  283. package/dist/actor-C7b-1arn.d.ts.map +0 -1
  284. package/dist/actor-shared-t7w8xIKP.js.map +0 -1
  285. package/dist/ai-harness-Clbg5ei7.js.map +0 -1
  286. package/dist/ai-mMiWul1T.js.map +0 -1
  287. package/dist/client-BhHLoNKF.js.map +0 -1
  288. package/dist/contract-BYKASlCV.js.map +0 -1
  289. package/dist/idempotent-replay-JdgMQRRm.js +0 -21
  290. package/dist/idempotent-replay-JdgMQRRm.js.map +0 -1
  291. package/dist/initial-snapshot-Bx-c0pDP.d.ts.map +0 -1
  292. package/dist/internal-CscSY7K_.js.map +0 -1
  293. package/dist/server-DYAATFuT.d.ts.map +0 -1
  294. package/dist/server-qyb5aJJG.js.map +0 -1
  295. package/dist/session-clear-C-QwTXV1.d.ts.map +0 -1
  296. package/dist/session-clear-DGI4jTQ5.js.map +0 -1
  297. package/dist/store-CyLUy86v.d.ts +0 -404
  298. package/dist/store-CyLUy86v.d.ts.map +0 -1
  299. package/dist/store-codec-DTG0Ftek.js +0 -10
  300. package/dist/store-codec-DTG0Ftek.js.map +0 -1
  301. package/dist/store-presence-polling-B1ixeqIS.js +0 -94
  302. package/dist/store-presence-polling-B1ixeqIS.js.map +0 -1
  303. package/dist/store-redis-notify-CM0AfLY0.js +0 -2544
  304. package/dist/store-redis-notify-CM0AfLY0.js.map +0 -1
  305. package/dist/stream-buffer-Cx7AAPGq.js +0 -23
  306. package/dist/stream-buffer-Cx7AAPGq.js.map +0 -1
  307. package/dist/telemetry-Cyfqo6Qt.d.ts.map +0 -1
  308. package/dist/wire-BKxH1vbP.js.map +0 -1
  309. package/docs/server/01-handlers.mdx +0 -227
@@ -0,0 +1,1067 @@
1
+ /* a2slack: the group chat example, full-window. Its tokens live on the page
2
+ root, so they never meet the playground's own `--bg`, `--ink`, and so on. */
3
+
4
+ body:has(.a2slack-page) {
5
+ height: 100dvh;
6
+ overflow: hidden;
7
+ background-color: #fafafa;
8
+ }
9
+
10
+ main:has(> .a2slack-page) {
11
+ max-width: none;
12
+ height: 100%;
13
+ margin: 0;
14
+ padding: 0;
15
+ }
16
+
17
+ .a2slack-page {
18
+ --a2slack-bg: #fafafa;
19
+ --a2slack-bright: #040404;
20
+ --a2slack-dim: #303030;
21
+ --a2slack-muted: #646464;
22
+ --a2slack-faint: #909090;
23
+ --a2slack-hairline: #d9d9d9;
24
+ --a2slack-shade: #f0f0f0;
25
+ --a2slack-shade-hover: #e3e3e3;
26
+ --a2slack-accent: #0072e4;
27
+ --a2slack-yellow: #c78f00;
28
+ --a2slack-red: #c70000;
29
+ --a2slack-green: #1a7f37;
30
+ --a2slack-selection: rgba(199, 143, 0, 0.26);
31
+ --a2slack-sans:
32
+ var(--font-geist-sans), ui-sans-serif, system-ui, -apple-system, 'Segoe UI',
33
+ sans-serif;
34
+ --a2slack-mono:
35
+ var(--font-geist-mono), ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
36
+ height: 100%;
37
+ /* What the playground's body sets, back to the browser's defaults. */
38
+ font-size: 16px;
39
+ line-height: normal;
40
+ letter-spacing: normal;
41
+ -webkit-font-smoothing: auto;
42
+ }
43
+
44
+ @media (prefers-color-scheme: dark) {
45
+ body:has(.a2slack-page) {
46
+ background-color: #040404;
47
+ }
48
+
49
+ .a2slack-page {
50
+ --a2slack-bg: #040404;
51
+ --a2slack-bright: #fafafa;
52
+ --a2slack-dim: #dedede;
53
+ --a2slack-muted: #909090;
54
+ --a2slack-faint: #646464;
55
+ --a2slack-hairline: #252525;
56
+ --a2slack-shade: #161616;
57
+ --a2slack-shade-hover: #1b1b1b;
58
+ --a2slack-accent: #4c9fef;
59
+ --a2slack-yellow: #ffcc49;
60
+ --a2slack-red: #ff7b72;
61
+ --a2slack-green: #3fb950;
62
+ --a2slack-selection: rgba(255, 204, 73, 0.22);
63
+ }
64
+ }
65
+
66
+ .a2slack-page ::selection {
67
+ background-color: var(--a2slack-selection);
68
+ }
69
+
70
+ /* The playground styles bare buttons, forms, and focus rings. Undo what no
71
+ class below sets, so the page renders as the group chat does. */
72
+ .a2slack-page button {
73
+ font-weight: 400;
74
+ }
75
+
76
+ .a2slack-page button:hover:not(:disabled) {
77
+ filter: none;
78
+ }
79
+
80
+ .a2slack-page button:disabled {
81
+ opacity: 1;
82
+ }
83
+
84
+ .a2slack-page :focus-visible {
85
+ outline: revert;
86
+ outline-offset: revert;
87
+ }
88
+
89
+ .a2slack-input:focus-visible,
90
+ .a2slack-gate-input:focus-visible,
91
+ .a2slack-composer-textarea:focus-visible,
92
+ .a2slack-edit-area:focus-visible,
93
+ .a2slack-menu-popup:focus-visible,
94
+ .a2slack-menu-item:focus-visible {
95
+ outline: none;
96
+ }
97
+
98
+ /* ── shell ───────────────────────────────────────────────────────── */
99
+
100
+ .a2slack-shell {
101
+ display: flex;
102
+ height: 100%;
103
+ background-color: var(--a2slack-bg);
104
+ color: var(--a2slack-dim);
105
+ font-family: var(--a2slack-sans);
106
+ }
107
+
108
+ .a2slack-main {
109
+ position: relative;
110
+ display: flex;
111
+ flex-direction: column;
112
+ flex-grow: 1;
113
+ min-width: 0;
114
+ }
115
+
116
+ .a2slack-loading {
117
+ margin: 1em 0;
118
+ }
119
+
120
+ /* ── home ────────────────────────────────────────────────────────── */
121
+
122
+ .a2slack-empty {
123
+ display: flex;
124
+ flex-direction: column;
125
+ align-items: center;
126
+ justify-content: center;
127
+ gap: 8px;
128
+ min-height: 100%;
129
+ }
130
+
131
+ .a2slack-empty-title {
132
+ margin: 1em 0;
133
+ color: var(--a2slack-bright);
134
+ font-family: var(--a2slack-mono);
135
+ font-size: 13px;
136
+ letter-spacing: -0.02em;
137
+ }
138
+
139
+ .a2slack-empty-hint {
140
+ margin: 1em 0;
141
+ color: var(--a2slack-faint);
142
+ font-family: var(--a2slack-mono);
143
+ font-size: 12px;
144
+ letter-spacing: -0.02em;
145
+ }
146
+
147
+ /* ── sidebar ─────────────────────────────────────────────────────── */
148
+
149
+ .a2slack-sidebar {
150
+ position: relative;
151
+ display: flex;
152
+ flex-direction: column;
153
+ flex-shrink: 0;
154
+ }
155
+
156
+ /* The playground's site nav, as tall as the channel header beside it. */
157
+ .a2slack-sidebar .a2slack-head {
158
+ flex-shrink: 0;
159
+ height: 46px;
160
+ padding: 0 16px;
161
+ border-bottom: 1px solid var(--a2slack-hairline);
162
+ font-family: var(--a2slack-mono);
163
+ }
164
+
165
+ .a2slack-list {
166
+ display: flex;
167
+ flex-direction: column;
168
+ flex-grow: 1;
169
+ gap: 1px;
170
+ padding: 12px 8px;
171
+ overflow-y: auto;
172
+ }
173
+
174
+ .a2slack-label {
175
+ padding: 0 8px 6px;
176
+ color: var(--a2slack-faint);
177
+ font-family: var(--a2slack-mono);
178
+ font-size: 11px;
179
+ letter-spacing: 0.04em;
180
+ text-transform: uppercase;
181
+ }
182
+
183
+ .a2slack-channel {
184
+ padding: 5px 8px;
185
+ overflow: hidden;
186
+ background-color: transparent;
187
+ color: var(--a2slack-muted);
188
+ font-family: var(--a2slack-mono);
189
+ font-size: 13px;
190
+ letter-spacing: -0.02em;
191
+ text-decoration: none;
192
+ text-overflow: ellipsis;
193
+ white-space: nowrap;
194
+ }
195
+
196
+ .a2slack-channel:hover,
197
+ .a2slack-channel[aria-current='page'] {
198
+ background-color: var(--a2slack-shade);
199
+ color: var(--a2slack-bright);
200
+ }
201
+
202
+ /* The inbox: a row like a channel's, with the unread count at its end. */
203
+ .a2slack-inbox-row {
204
+ display: flex;
205
+ align-items: center;
206
+ justify-content: space-between;
207
+ gap: 8px;
208
+ width: 100%;
209
+ border-style: none;
210
+ text-align: left;
211
+ cursor: pointer;
212
+ }
213
+
214
+ .a2slack-label-spaced {
215
+ margin-top: 12px;
216
+ }
217
+
218
+ .a2slack-unread {
219
+ min-width: 18px;
220
+ padding: 2px 5px;
221
+ background-color: var(--a2slack-accent);
222
+ color: var(--a2slack-bg);
223
+ font-family: var(--a2slack-mono);
224
+ font-size: 10px;
225
+ letter-spacing: -0.02em;
226
+ line-height: 1.2;
227
+ text-align: center;
228
+ }
229
+
230
+ .a2slack-form {
231
+ display: block;
232
+ margin: 0;
233
+ padding: 10px 16px;
234
+ border: 0;
235
+ border-top: 1px solid var(--a2slack-hairline);
236
+ background: none;
237
+ }
238
+
239
+ .a2slack-search {
240
+ border-top: 0;
241
+ border-bottom: 1px solid var(--a2slack-hairline);
242
+ }
243
+
244
+ .a2slack-input {
245
+ width: 100%;
246
+ padding: 0;
247
+ border-style: none;
248
+ outline: none;
249
+ background-color: transparent;
250
+ color: var(--a2slack-bright);
251
+ font-family: var(--a2slack-mono);
252
+ font-size: 13px;
253
+ letter-spacing: -0.02em;
254
+ }
255
+
256
+ .a2slack-input::placeholder {
257
+ color: var(--a2slack-faint);
258
+ }
259
+
260
+ .a2slack-you {
261
+ display: flex;
262
+ justify-content: space-between;
263
+ gap: 8px;
264
+ padding: 10px 16px;
265
+ overflow: hidden;
266
+ border-top: 1px solid var(--a2slack-hairline);
267
+ color: var(--a2slack-faint);
268
+ font-family: var(--a2slack-mono);
269
+ font-size: 12px;
270
+ letter-spacing: -0.02em;
271
+ text-overflow: ellipsis;
272
+ white-space: nowrap;
273
+ }
274
+
275
+ .a2slack-lag-link {
276
+ color: var(--a2slack-faint);
277
+ text-decoration: none;
278
+ }
279
+
280
+ .a2slack-lag-link:hover {
281
+ color: var(--a2slack-bright);
282
+ }
283
+
284
+ .a2slack-handle {
285
+ position: absolute;
286
+ top: 0;
287
+ right: -3px;
288
+ bottom: 0;
289
+ z-index: 5;
290
+ width: 7px;
291
+ cursor: col-resize;
292
+ }
293
+
294
+ .a2slack-handle-line {
295
+ position: absolute;
296
+ top: 0;
297
+ bottom: 0;
298
+ left: 3px;
299
+ width: 1px;
300
+ background-color: var(--a2slack-hairline);
301
+ transition: background-color 0.12s;
302
+ }
303
+
304
+ .a2slack-handle-line:hover {
305
+ background-color: var(--a2slack-muted);
306
+ }
307
+
308
+ .a2slack-handle-line[data-active] {
309
+ background-color: var(--a2slack-accent);
310
+ }
311
+
312
+ /* ── name gate ───────────────────────────────────────────────────── */
313
+
314
+ .a2slack-gate {
315
+ position: fixed;
316
+ inset: 0;
317
+ z-index: 10;
318
+ display: flex;
319
+ align-items: center;
320
+ justify-content: center;
321
+ background-color: var(--a2slack-bg);
322
+ }
323
+
324
+ .a2slack-gate-wrapper {
325
+ position: relative;
326
+ }
327
+
328
+ .a2slack-gate-box {
329
+ position: relative;
330
+ z-index: 1;
331
+ display: flex;
332
+ flex-direction: column;
333
+ gap: 18px;
334
+ width: 300px;
335
+ margin: 0;
336
+ padding: 22px 24px 24px;
337
+ border: 1px solid var(--a2slack-dim);
338
+ background-color: var(--a2slack-bg);
339
+ }
340
+
341
+ .a2slack-gate-title {
342
+ margin: 0;
343
+ color: var(--a2slack-bright);
344
+ font-family: var(--a2slack-mono);
345
+ font-size: 13px;
346
+ letter-spacing: -0.02em;
347
+ }
348
+
349
+ .a2slack-gate-label {
350
+ margin: 0;
351
+ color: var(--a2slack-faint);
352
+ font-family: var(--a2slack-mono);
353
+ font-size: 12px;
354
+ letter-spacing: -0.02em;
355
+ }
356
+
357
+ .a2slack-gate-input {
358
+ padding: 4px 0;
359
+ border: 0 solid var(--a2slack-hairline);
360
+ border-bottom-width: 1px;
361
+ border-radius: 0;
362
+ outline: none;
363
+ background-color: transparent;
364
+ color: var(--a2slack-bright);
365
+ font-family: var(--a2slack-sans);
366
+ font-size: 16px;
367
+ }
368
+
369
+ .a2slack-gate-input::placeholder {
370
+ color: var(--a2slack-faint);
371
+ }
372
+
373
+ .a2slack-gate-input:focus {
374
+ border-color: var(--a2slack-bright);
375
+ }
376
+
377
+ .a2slack-gate-hint {
378
+ margin: 0;
379
+ color: var(--a2slack-faint);
380
+ font-family: var(--a2slack-mono);
381
+ font-size: 11px;
382
+ letter-spacing: -0.02em;
383
+ }
384
+
385
+ /* ── dots shadow ─────────────────────────────────────────────────── */
386
+
387
+ .a2slack-dots {
388
+ position: absolute;
389
+ top: 6px;
390
+ left: 6px;
391
+ z-index: -1;
392
+ width: 100%;
393
+ height: 100%;
394
+ overflow: hidden;
395
+ }
396
+
397
+ /* ── menus ───────────────────────────────────────────────────────── */
398
+
399
+ .a2slack-menu-trigger {
400
+ padding: 2px 4px;
401
+ border-style: none;
402
+ background-color: transparent;
403
+ color: var(--a2slack-faint);
404
+ font-family: var(--a2slack-mono);
405
+ font-size: 13px;
406
+ letter-spacing: -0.02em;
407
+ line-height: 1;
408
+ cursor: pointer;
409
+ }
410
+
411
+ .a2slack-menu-trigger:hover,
412
+ .a2slack-menu-trigger[data-popup-open] {
413
+ color: var(--a2slack-bright);
414
+ }
415
+
416
+ .a2slack-menu-positioner {
417
+ z-index: 50;
418
+ }
419
+
420
+ .a2slack-menu-wrapper {
421
+ position: relative;
422
+ }
423
+
424
+ .a2slack-menu-popup {
425
+ position: relative;
426
+ z-index: 50;
427
+ min-width: 160px;
428
+ padding: 6px;
429
+ border: 1px solid var(--a2slack-dim);
430
+ outline: none;
431
+ background-color: var(--a2slack-bg);
432
+ }
433
+
434
+ .a2slack-menu-item {
435
+ display: flex;
436
+ align-items: center;
437
+ gap: 8px;
438
+ padding: 6px 8px;
439
+ outline: none;
440
+ background-color: transparent;
441
+ color: var(--a2slack-muted);
442
+ font-family: var(--a2slack-mono);
443
+ font-size: 13px;
444
+ letter-spacing: -0.02em;
445
+ cursor: default;
446
+ }
447
+
448
+ .a2slack-menu-item[data-highlighted] {
449
+ background-color: var(--a2slack-shade);
450
+ color: var(--a2slack-bright);
451
+ }
452
+
453
+ .a2slack-menu-item[data-danger],
454
+ .a2slack-menu-item[data-danger][data-highlighted] {
455
+ color: var(--a2slack-red);
456
+ }
457
+
458
+ .a2slack-menu-separator {
459
+ height: 1px;
460
+ margin-block: 4px;
461
+ background-color: var(--a2slack-hairline);
462
+ }
463
+
464
+ .a2slack-emoji-row {
465
+ display: grid;
466
+ grid-template-columns: repeat(6, 1fr);
467
+ }
468
+
469
+ .a2slack-menu-item.a2slack-emoji-item {
470
+ justify-content: center;
471
+ padding: 6px 0;
472
+ font-size: 15px;
473
+ line-height: 1;
474
+ text-align: center;
475
+ }
476
+
477
+ /* ── channel ─────────────────────────────────────────────────────── */
478
+
479
+ .a2slack-split {
480
+ display: flex;
481
+ height: 100%;
482
+ min-height: 0;
483
+ }
484
+
485
+ .a2slack-view {
486
+ display: flex;
487
+ flex-direction: column;
488
+ flex-grow: 1;
489
+ min-width: 0;
490
+ min-height: 0;
491
+ }
492
+
493
+ .a2slack-header {
494
+ display: flex;
495
+ flex-shrink: 0;
496
+ align-items: baseline;
497
+ justify-content: space-between;
498
+ padding: 14px 20px;
499
+ border-bottom: 1px solid var(--a2slack-hairline);
500
+ }
501
+
502
+ .a2slack-header-name {
503
+ color: var(--a2slack-bright);
504
+ font-family: var(--a2slack-mono);
505
+ font-size: 13px;
506
+ letter-spacing: -0.02em;
507
+ }
508
+
509
+ .a2slack-status {
510
+ color: var(--a2slack-faint);
511
+ font-family: var(--a2slack-mono);
512
+ font-size: 11px;
513
+ letter-spacing: -0.02em;
514
+ }
515
+
516
+ .a2slack-status[data-status='live'] {
517
+ color: var(--a2slack-green);
518
+ }
519
+
520
+ .a2slack-status[data-status='connecting'] {
521
+ color: var(--a2slack-yellow);
522
+ }
523
+
524
+ /* ── lag ─────────────────────────────────────────────────────────── */
525
+
526
+ .a2slack-lag {
527
+ flex-grow: 1;
528
+ min-height: 0;
529
+ padding: 12px 20px;
530
+ overflow: auto;
531
+ font-family: var(--a2slack-mono);
532
+ font-size: 12px;
533
+ letter-spacing: -0.02em;
534
+ }
535
+
536
+ .a2slack-lag table {
537
+ width: 100%;
538
+ border-collapse: collapse;
539
+ }
540
+
541
+ .a2slack-lag th {
542
+ padding: 6px 12px 6px 0;
543
+ border-bottom: 1px solid var(--a2slack-hairline);
544
+ color: var(--a2slack-faint);
545
+ font-weight: 400;
546
+ text-align: left;
547
+ }
548
+
549
+ .a2slack-lag td {
550
+ padding: 6px 12px 6px 0;
551
+ color: var(--a2slack-dim);
552
+ white-space: nowrap;
553
+ }
554
+
555
+ .a2slack-lag tr[data-behind='yes'] td {
556
+ color: var(--a2slack-yellow);
557
+ }
558
+
559
+ .a2slack-lag .a2slack-lag-error {
560
+ max-width: 28ch;
561
+ overflow: hidden;
562
+ color: var(--a2slack-red);
563
+ text-overflow: ellipsis;
564
+ }
565
+
566
+ .a2slack-lag-title {
567
+ margin: 20px 0 6px;
568
+ color: var(--a2slack-faint);
569
+ }
570
+
571
+ /* ── feed ────────────────────────────────────────────────────────── */
572
+
573
+ .a2slack-feed {
574
+ display: flex;
575
+ flex-direction: column;
576
+ flex-grow: 1;
577
+ min-height: 0;
578
+ padding-block: 12px;
579
+ overflow-y: auto;
580
+ }
581
+
582
+ .a2slack-older {
583
+ align-self: flex-start;
584
+ margin-inline: 16px;
585
+ margin-bottom: 8px;
586
+ padding: 3px 4px;
587
+ border-style: none;
588
+ background-color: transparent;
589
+ color: var(--a2slack-faint);
590
+ font-family: var(--a2slack-mono);
591
+ font-size: 12px;
592
+ letter-spacing: -0.02em;
593
+ cursor: pointer;
594
+ }
595
+
596
+ .a2slack-older:hover {
597
+ background-color: var(--a2slack-shade);
598
+ color: var(--a2slack-bright);
599
+ }
600
+
601
+ .a2slack-older:disabled {
602
+ cursor: pointer;
603
+ }
604
+
605
+ .a2slack-day {
606
+ display: flex;
607
+ align-items: center;
608
+ gap: 10px;
609
+ margin-top: 14px;
610
+ padding-inline: 20px;
611
+ color: var(--a2slack-faint);
612
+ font-family: var(--a2slack-mono);
613
+ font-size: 11px;
614
+ letter-spacing: -0.02em;
615
+ }
616
+
617
+ .a2slack-day-line {
618
+ flex-grow: 1;
619
+ height: 1px;
620
+ background-color: var(--a2slack-hairline);
621
+ }
622
+
623
+ .a2slack-feed-empty {
624
+ margin: auto;
625
+ color: var(--a2slack-faint);
626
+ font-family: var(--a2slack-mono);
627
+ font-size: 12px;
628
+ letter-spacing: -0.02em;
629
+ }
630
+
631
+ /* ── message ─────────────────────────────────────────────────────── */
632
+
633
+ .a2slack-row {
634
+ position: relative;
635
+ padding: 2px 20px 2px 68px;
636
+ }
637
+
638
+ .a2slack-row[data-thread] {
639
+ padding-inline: 14px;
640
+ }
641
+
642
+ .a2slack-row[data-spaced] {
643
+ margin-top: 14px;
644
+ }
645
+
646
+ .a2slack-row[data-hover] {
647
+ background-color: var(--a2slack-shade);
648
+ }
649
+
650
+ .a2slack-meta {
651
+ display: flex;
652
+ align-items: baseline;
653
+ gap: 8px;
654
+ margin-bottom: 2px;
655
+ }
656
+
657
+ .a2slack-author {
658
+ color: var(--a2slack-bright);
659
+ font-size: 13px;
660
+ font-weight: 600;
661
+ }
662
+
663
+ .a2slack-time {
664
+ color: var(--a2slack-faint);
665
+ font-family: var(--a2slack-mono);
666
+ font-size: 11px;
667
+ letter-spacing: -0.02em;
668
+ }
669
+
670
+ /* What triage called a top-level message. */
671
+ .a2slack-badge {
672
+ padding: 1px 5px;
673
+ border: 1px solid var(--a2slack-hairline);
674
+ color: var(--a2slack-muted);
675
+ font-family: var(--a2slack-mono);
676
+ font-size: 10px;
677
+ letter-spacing: -0.02em;
678
+ line-height: 1.2;
679
+ white-space: nowrap;
680
+ }
681
+
682
+ .a2slack-text .a2slack-badge {
683
+ margin-left: 6px;
684
+ vertical-align: 1px;
685
+ }
686
+
687
+ .a2slack-gutter-time {
688
+ position: absolute;
689
+ top: 6px;
690
+ left: 0;
691
+ width: 56px;
692
+ color: var(--a2slack-faint);
693
+ font-family: var(--a2slack-mono);
694
+ font-size: 10px;
695
+ letter-spacing: -0.02em;
696
+ text-align: right;
697
+ }
698
+
699
+ .a2slack-text {
700
+ margin: 0;
701
+ color: var(--a2slack-dim);
702
+ font-size: 14px;
703
+ line-height: 1.5;
704
+ overflow-wrap: break-word;
705
+ white-space: pre-wrap;
706
+ }
707
+
708
+ .a2slack-tombstone {
709
+ margin: 0;
710
+ color: var(--a2slack-faint);
711
+ font-size: 13px;
712
+ font-style: italic;
713
+ line-height: 1.5;
714
+ }
715
+
716
+ .a2slack-edited {
717
+ margin-left: 6px;
718
+ color: var(--a2slack-faint);
719
+ font-family: var(--a2slack-mono);
720
+ font-size: 10px;
721
+ letter-spacing: -0.02em;
722
+ }
723
+
724
+ .a2slack-actions {
725
+ position: absolute;
726
+ top: -12px;
727
+ right: 20px;
728
+ z-index: 5;
729
+ display: flex;
730
+ border: 1px solid var(--a2slack-hairline);
731
+ background-color: var(--a2slack-bg);
732
+ }
733
+
734
+ .a2slack-actions[data-thread] {
735
+ right: 14px;
736
+ }
737
+
738
+ .a2slack-action-button {
739
+ display: flex;
740
+ align-items: center;
741
+ justify-content: center;
742
+ min-width: 28px;
743
+ height: 26px;
744
+ padding: 0 6px;
745
+ border-style: none;
746
+ background-color: transparent;
747
+ color: var(--a2slack-muted);
748
+ font-family: var(--a2slack-mono);
749
+ font-size: 13px;
750
+ letter-spacing: -0.02em;
751
+ line-height: 1;
752
+ cursor: pointer;
753
+ }
754
+
755
+ .a2slack-action-button:hover {
756
+ background-color: var(--a2slack-shade);
757
+ color: var(--a2slack-bright);
758
+ }
759
+
760
+ .a2slack-quick-emoji {
761
+ font-size: 14px;
762
+ }
763
+
764
+ .a2slack-reactions {
765
+ display: flex;
766
+ flex-wrap: wrap;
767
+ gap: 4px;
768
+ margin-top: 4px;
769
+ }
770
+
771
+ .a2slack-chip {
772
+ display: flex;
773
+ align-items: center;
774
+ gap: 5px;
775
+ padding: 3px 7px;
776
+ border: 1px solid var(--a2slack-hairline);
777
+ background-color: var(--a2slack-shade);
778
+ color: var(--a2slack-muted);
779
+ font-family: var(--a2slack-mono);
780
+ font-size: 11px;
781
+ letter-spacing: -0.02em;
782
+ line-height: 1;
783
+ cursor: pointer;
784
+ }
785
+
786
+ .a2slack-chip:hover {
787
+ background-color: var(--a2slack-shade-hover);
788
+ }
789
+
790
+ .a2slack-chip[data-mine] {
791
+ border-color: var(--a2slack-accent);
792
+ color: var(--a2slack-accent);
793
+ }
794
+
795
+ .a2slack-thread-pill {
796
+ display: flex;
797
+ align-items: baseline;
798
+ gap: 8px;
799
+ margin-top: 4px;
800
+ padding: 0;
801
+ border-style: none;
802
+ background-color: transparent;
803
+ color: var(--a2slack-accent);
804
+ font-family: var(--a2slack-mono);
805
+ font-size: 12px;
806
+ letter-spacing: -0.02em;
807
+ text-decoration-line: none;
808
+ text-underline-offset: 3px;
809
+ cursor: pointer;
810
+ }
811
+
812
+ .a2slack-thread-pill:hover {
813
+ text-decoration-line: underline;
814
+ }
815
+
816
+ .a2slack-thread-pill-time {
817
+ color: var(--a2slack-faint);
818
+ }
819
+
820
+ .a2slack-edit-box {
821
+ display: flex;
822
+ flex-direction: column;
823
+ gap: 4px;
824
+ margin-top: 2px;
825
+ }
826
+
827
+ .a2slack-edit-area {
828
+ padding: 8px 10px;
829
+ border: 1px solid var(--a2slack-hairline);
830
+ outline: none;
831
+ background-color: var(--a2slack-bg);
832
+ color: var(--a2slack-dim);
833
+ font-family: var(--a2slack-mono);
834
+ font-size: 13px;
835
+ line-height: 1.5;
836
+ resize: none;
837
+ }
838
+
839
+ .a2slack-edit-area:focus {
840
+ border-color: var(--a2slack-muted);
841
+ }
842
+
843
+ .a2slack-edit-hint {
844
+ color: var(--a2slack-faint);
845
+ font-family: var(--a2slack-mono);
846
+ font-size: 11px;
847
+ letter-spacing: -0.02em;
848
+ }
849
+
850
+ /* ── composer ────────────────────────────────────────────────────── */
851
+
852
+ .a2slack-composer {
853
+ flex-shrink: 0;
854
+ padding: 4px 20px 16px;
855
+ }
856
+
857
+ .a2slack-composer[data-compact] {
858
+ padding: 4px 14px 14px;
859
+ }
860
+
861
+ .a2slack-composer-box {
862
+ display: flex;
863
+ flex-direction: column;
864
+ border: 1px solid var(--a2slack-hairline);
865
+ background-color: var(--a2slack-bg);
866
+ }
867
+
868
+ .a2slack-composer-box:focus-within {
869
+ border-color: var(--a2slack-muted);
870
+ }
871
+
872
+ .a2slack-composer-textarea {
873
+ max-height: 160px;
874
+ padding: 9px 10px 2px;
875
+ overflow-y: auto;
876
+ border-style: none;
877
+ outline: none;
878
+ background-color: transparent;
879
+ color: var(--a2slack-dim);
880
+ font-family: var(--a2slack-mono);
881
+ font-size: 13px;
882
+ letter-spacing: normal;
883
+ line-height: 1.5;
884
+ resize: none;
885
+ }
886
+
887
+ .a2slack-composer-textarea::placeholder {
888
+ color: var(--a2slack-faint);
889
+ }
890
+
891
+ .a2slack-composer-footer {
892
+ display: flex;
893
+ align-items: center;
894
+ justify-content: space-between;
895
+ min-height: 24px;
896
+ padding: 0 10px 5px;
897
+ }
898
+
899
+ .a2slack-typing {
900
+ overflow: hidden;
901
+ color: var(--a2slack-faint);
902
+ font-family: var(--a2slack-mono);
903
+ font-size: 11px;
904
+ letter-spacing: -0.02em;
905
+ text-overflow: ellipsis;
906
+ white-space: nowrap;
907
+ }
908
+
909
+ .a2slack-send {
910
+ flex-shrink: 0;
911
+ margin-left: auto;
912
+ padding: 0;
913
+ border-style: none;
914
+ background-color: transparent;
915
+ color: var(--a2slack-muted);
916
+ font-family: var(--a2slack-mono);
917
+ font-size: 12px;
918
+ letter-spacing: -0.02em;
919
+ text-decoration-line: none;
920
+ text-underline-offset: 3px;
921
+ cursor: pointer;
922
+ }
923
+
924
+ .a2slack-send:hover {
925
+ color: var(--a2slack-bright);
926
+ text-decoration-line: underline;
927
+ }
928
+
929
+ .a2slack-send:disabled {
930
+ color: var(--a2slack-faint);
931
+ text-decoration-line: none;
932
+ cursor: default;
933
+ }
934
+
935
+ /* ── thread ──────────────────────────────────────────────────────── */
936
+
937
+ .a2slack-thread {
938
+ display: flex;
939
+ flex-direction: column;
940
+ flex-shrink: 0;
941
+ width: 360px;
942
+ min-height: 0;
943
+ border-left: 1px solid var(--a2slack-hairline);
944
+ }
945
+
946
+ .a2slack-thread-header {
947
+ display: flex;
948
+ flex-shrink: 0;
949
+ align-items: center;
950
+ justify-content: space-between;
951
+ padding: 14px 14px 13px;
952
+ border-bottom: 1px solid var(--a2slack-hairline);
953
+ }
954
+
955
+ .a2slack-thread-title {
956
+ color: var(--a2slack-bright);
957
+ font-family: var(--a2slack-mono);
958
+ font-size: 13px;
959
+ letter-spacing: -0.02em;
960
+ }
961
+
962
+ .a2slack-close {
963
+ display: flex;
964
+ align-items: center;
965
+ padding: 2px 4px;
966
+ border-style: none;
967
+ background-color: transparent;
968
+ color: var(--a2slack-faint);
969
+ line-height: 1;
970
+ cursor: pointer;
971
+ }
972
+
973
+ .a2slack-close:hover {
974
+ color: var(--a2slack-bright);
975
+ }
976
+
977
+ .a2slack-thread-scroll {
978
+ display: flex;
979
+ flex-direction: column;
980
+ flex-grow: 1;
981
+ min-height: 0;
982
+ padding-block: 8px;
983
+ overflow-y: auto;
984
+ }
985
+
986
+ .a2slack-divider {
987
+ display: flex;
988
+ align-items: center;
989
+ gap: 10px;
990
+ padding: 10px 14px 2px;
991
+ color: var(--a2slack-faint);
992
+ font-family: var(--a2slack-mono);
993
+ font-size: 11px;
994
+ letter-spacing: -0.02em;
995
+ }
996
+
997
+ .a2slack-divider-line {
998
+ flex-grow: 1;
999
+ height: 1px;
1000
+ background-color: var(--a2slack-hairline);
1001
+ }
1002
+
1003
+ /* ── search ──────────────────────────────────────────────────────── */
1004
+
1005
+ /* Over the channel, which stays mounted (and live) underneath. */
1006
+ .a2slack-results {
1007
+ position: absolute;
1008
+ inset: 0;
1009
+ z-index: 6;
1010
+ display: flex;
1011
+ flex-direction: column;
1012
+ background-color: var(--a2slack-bg);
1013
+ }
1014
+
1015
+ .a2slack-results-list {
1016
+ display: flex;
1017
+ flex-direction: column;
1018
+ flex-grow: 1;
1019
+ min-height: 0;
1020
+ padding-block: 12px;
1021
+ overflow-y: auto;
1022
+ }
1023
+
1024
+ .a2slack-results-hint {
1025
+ margin: 0;
1026
+ padding: 2px 20px;
1027
+ color: var(--a2slack-faint);
1028
+ font-family: var(--a2slack-mono);
1029
+ font-size: 12px;
1030
+ letter-spacing: -0.02em;
1031
+ }
1032
+
1033
+ .a2slack-result {
1034
+ display: block;
1035
+ padding: 8px 20px;
1036
+ color: inherit;
1037
+ text-decoration: none;
1038
+ }
1039
+
1040
+ .a2slack-result:hover {
1041
+ background-color: var(--a2slack-shade);
1042
+ }
1043
+
1044
+ .a2slack-result[data-unread] .a2slack-result-text {
1045
+ color: var(--a2slack-bright);
1046
+ }
1047
+
1048
+ .a2slack-result-channel {
1049
+ color: var(--a2slack-muted);
1050
+ font-family: var(--a2slack-mono);
1051
+ font-size: 12px;
1052
+ letter-spacing: -0.02em;
1053
+ }
1054
+
1055
+ .a2slack-result-text {
1056
+ margin: 0;
1057
+ color: var(--a2slack-dim);
1058
+ font-size: 14px;
1059
+ line-height: 1.5;
1060
+ overflow-wrap: break-word;
1061
+ white-space: pre-wrap;
1062
+ }
1063
+
1064
+ .a2slack-result-text mark {
1065
+ background-color: var(--a2slack-selection);
1066
+ color: var(--a2slack-bright);
1067
+ }