@liveblocks/react-ui 1.12.0-initial1

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 (391) hide show
  1. package/README.md +65 -0
  2. package/dist/components/Comment.js +473 -0
  3. package/dist/components/Comment.js.map +1 -0
  4. package/dist/components/Comment.mjs +447 -0
  5. package/dist/components/Comment.mjs.map +1 -0
  6. package/dist/components/Composer.js +299 -0
  7. package/dist/components/Composer.js.map +1 -0
  8. package/dist/components/Composer.mjs +297 -0
  9. package/dist/components/Composer.mjs.map +1 -0
  10. package/dist/components/InboxNotification.js +374 -0
  11. package/dist/components/InboxNotification.js.map +1 -0
  12. package/dist/components/InboxNotification.mjs +372 -0
  13. package/dist/components/InboxNotification.mjs.map +1 -0
  14. package/dist/components/InboxNotificationList.js +19 -0
  15. package/dist/components/InboxNotificationList.js.map +1 -0
  16. package/dist/components/InboxNotificationList.mjs +17 -0
  17. package/dist/components/InboxNotificationList.mjs.map +1 -0
  18. package/dist/components/Thread.js +188 -0
  19. package/dist/components/Thread.js.map +1 -0
  20. package/dist/components/Thread.mjs +167 -0
  21. package/dist/components/Thread.mjs.map +1 -0
  22. package/dist/components/internal/Attribution.js +26 -0
  23. package/dist/components/internal/Attribution.js.map +1 -0
  24. package/dist/components/internal/Attribution.mjs +24 -0
  25. package/dist/components/internal/Attribution.mjs.map +1 -0
  26. package/dist/components/internal/Avatar.js +40 -0
  27. package/dist/components/internal/Avatar.js.map +1 -0
  28. package/dist/components/internal/Avatar.mjs +38 -0
  29. package/dist/components/internal/Avatar.mjs.map +1 -0
  30. package/dist/components/internal/Button.js +24 -0
  31. package/dist/components/internal/Button.js.map +1 -0
  32. package/dist/components/internal/Button.mjs +22 -0
  33. package/dist/components/internal/Button.mjs.map +1 -0
  34. package/dist/components/internal/Dropdown.js +72 -0
  35. package/dist/components/internal/Dropdown.js.map +1 -0
  36. package/dist/components/internal/Dropdown.mjs +47 -0
  37. package/dist/components/internal/Dropdown.mjs.map +1 -0
  38. package/dist/components/internal/Emoji.js +18 -0
  39. package/dist/components/internal/Emoji.js.map +1 -0
  40. package/dist/components/internal/Emoji.mjs +16 -0
  41. package/dist/components/internal/Emoji.mjs.map +1 -0
  42. package/dist/components/internal/EmojiPicker.js +186 -0
  43. package/dist/components/internal/EmojiPicker.js.map +1 -0
  44. package/dist/components/internal/EmojiPicker.mjs +162 -0
  45. package/dist/components/internal/EmojiPicker.mjs.map +1 -0
  46. package/dist/components/internal/Icon.js +28 -0
  47. package/dist/components/internal/Icon.js.map +1 -0
  48. package/dist/components/internal/Icon.mjs +24 -0
  49. package/dist/components/internal/Icon.mjs.map +1 -0
  50. package/dist/components/internal/InboxNotificationThread.js +116 -0
  51. package/dist/components/internal/InboxNotificationThread.js.map +1 -0
  52. package/dist/components/internal/InboxNotificationThread.mjs +112 -0
  53. package/dist/components/internal/InboxNotificationThread.mjs.map +1 -0
  54. package/dist/components/internal/List.js +34 -0
  55. package/dist/components/internal/List.js.map +1 -0
  56. package/dist/components/internal/List.mjs +32 -0
  57. package/dist/components/internal/List.mjs.map +1 -0
  58. package/dist/components/internal/Room.js +22 -0
  59. package/dist/components/internal/Room.js.map +1 -0
  60. package/dist/components/internal/Room.mjs +20 -0
  61. package/dist/components/internal/Room.mjs.map +1 -0
  62. package/dist/components/internal/Tooltip.js +91 -0
  63. package/dist/components/internal/Tooltip.js.map +1 -0
  64. package/dist/components/internal/Tooltip.mjs +65 -0
  65. package/dist/components/internal/Tooltip.mjs.map +1 -0
  66. package/dist/components/internal/User.js +41 -0
  67. package/dist/components/internal/User.js.map +1 -0
  68. package/dist/components/internal/User.mjs +39 -0
  69. package/dist/components/internal/User.mjs.map +1 -0
  70. package/dist/components.js +64 -0
  71. package/dist/components.js.map +1 -0
  72. package/dist/components.mjs +41 -0
  73. package/dist/components.mjs.map +1 -0
  74. package/dist/config.js +33 -0
  75. package/dist/config.js.map +1 -0
  76. package/dist/config.mjs +30 -0
  77. package/dist/config.mjs.map +1 -0
  78. package/dist/constants.js +10 -0
  79. package/dist/constants.js.map +1 -0
  80. package/dist/constants.mjs +6 -0
  81. package/dist/constants.mjs.map +1 -0
  82. package/dist/icons/ArrowDown.js +15 -0
  83. package/dist/icons/ArrowDown.js.map +1 -0
  84. package/dist/icons/ArrowDown.mjs +13 -0
  85. package/dist/icons/ArrowDown.mjs.map +1 -0
  86. package/dist/icons/Check.js +15 -0
  87. package/dist/icons/Check.js.map +1 -0
  88. package/dist/icons/Check.mjs +13 -0
  89. package/dist/icons/Check.mjs.map +1 -0
  90. package/dist/icons/Cross.js +17 -0
  91. package/dist/icons/Cross.js.map +1 -0
  92. package/dist/icons/Cross.mjs +15 -0
  93. package/dist/icons/Cross.mjs.map +1 -0
  94. package/dist/icons/Delete.js +15 -0
  95. package/dist/icons/Delete.js.map +1 -0
  96. package/dist/icons/Delete.mjs +13 -0
  97. package/dist/icons/Delete.mjs.map +1 -0
  98. package/dist/icons/Edit.js +15 -0
  99. package/dist/icons/Edit.js.map +1 -0
  100. package/dist/icons/Edit.mjs +13 -0
  101. package/dist/icons/Edit.mjs.map +1 -0
  102. package/dist/icons/Ellipsis.js +26 -0
  103. package/dist/icons/Ellipsis.js.map +1 -0
  104. package/dist/icons/Ellipsis.mjs +24 -0
  105. package/dist/icons/Ellipsis.mjs.map +1 -0
  106. package/dist/icons/Emoji.js +27 -0
  107. package/dist/icons/Emoji.js.map +1 -0
  108. package/dist/icons/Emoji.mjs +25 -0
  109. package/dist/icons/Emoji.mjs.map +1 -0
  110. package/dist/icons/EmojiAdd.js +29 -0
  111. package/dist/icons/EmojiAdd.js.map +1 -0
  112. package/dist/icons/EmojiAdd.mjs +27 -0
  113. package/dist/icons/EmojiAdd.mjs.map +1 -0
  114. package/dist/icons/Mention.js +17 -0
  115. package/dist/icons/Mention.js.map +1 -0
  116. package/dist/icons/Mention.mjs +15 -0
  117. package/dist/icons/Mention.mjs.map +1 -0
  118. package/dist/icons/Missing.js +19 -0
  119. package/dist/icons/Missing.js.map +1 -0
  120. package/dist/icons/Missing.mjs +17 -0
  121. package/dist/icons/Missing.mjs.map +1 -0
  122. package/dist/icons/Resolve.js +19 -0
  123. package/dist/icons/Resolve.js.map +1 -0
  124. package/dist/icons/Resolve.mjs +17 -0
  125. package/dist/icons/Resolve.mjs.map +1 -0
  126. package/dist/icons/Resolved.js +21 -0
  127. package/dist/icons/Resolved.js.map +1 -0
  128. package/dist/icons/Resolved.mjs +19 -0
  129. package/dist/icons/Resolved.mjs.map +1 -0
  130. package/dist/icons/Search.js +15 -0
  131. package/dist/icons/Search.js.map +1 -0
  132. package/dist/icons/Search.mjs +13 -0
  133. package/dist/icons/Search.mjs.map +1 -0
  134. package/dist/icons/Send.js +15 -0
  135. package/dist/icons/Send.js.map +1 -0
  136. package/dist/icons/Send.mjs +13 -0
  137. package/dist/icons/Send.mjs.map +1 -0
  138. package/dist/icons/Spinner.js +22 -0
  139. package/dist/icons/Spinner.js.map +1 -0
  140. package/dist/icons/Spinner.mjs +20 -0
  141. package/dist/icons/Spinner.mjs.map +1 -0
  142. package/dist/index.d.mts +476 -0
  143. package/dist/index.d.ts +476 -0
  144. package/dist/index.js +20 -0
  145. package/dist/index.js.map +1 -0
  146. package/dist/index.mjs +11 -0
  147. package/dist/index.mjs.map +1 -0
  148. package/dist/overrides.js +100 -0
  149. package/dist/overrides.js.map +1 -0
  150. package/dist/overrides.mjs +77 -0
  151. package/dist/overrides.mjs.map +1 -0
  152. package/dist/primitives/Comment/index.js +113 -0
  153. package/dist/primitives/Comment/index.js.map +1 -0
  154. package/dist/primitives/Comment/index.mjs +109 -0
  155. package/dist/primitives/Comment/index.mjs.map +1 -0
  156. package/dist/primitives/Comment/utils.js +25 -0
  157. package/dist/primitives/Comment/utils.js.map +1 -0
  158. package/dist/primitives/Comment/utils.mjs +20 -0
  159. package/dist/primitives/Comment/utils.mjs.map +1 -0
  160. package/dist/primitives/Composer/contexts.js +34 -0
  161. package/dist/primitives/Composer/contexts.js.map +1 -0
  162. package/dist/primitives/Composer/contexts.mjs +27 -0
  163. package/dist/primitives/Composer/contexts.mjs.map +1 -0
  164. package/dist/primitives/Composer/index.js +771 -0
  165. package/dist/primitives/Composer/index.js.map +1 -0
  166. package/dist/primitives/Composer/index.mjs +762 -0
  167. package/dist/primitives/Composer/index.mjs.map +1 -0
  168. package/dist/primitives/Composer/utils.js +102 -0
  169. package/dist/primitives/Composer/utils.js.map +1 -0
  170. package/dist/primitives/Composer/utils.mjs +93 -0
  171. package/dist/primitives/Composer/utils.mjs.map +1 -0
  172. package/dist/primitives/EmojiPicker/contexts.js +19 -0
  173. package/dist/primitives/EmojiPicker/contexts.js.map +1 -0
  174. package/dist/primitives/EmojiPicker/contexts.mjs +16 -0
  175. package/dist/primitives/EmojiPicker/contexts.mjs.map +1 -0
  176. package/dist/primitives/EmojiPicker/index.js +434 -0
  177. package/dist/primitives/EmojiPicker/index.js.map +1 -0
  178. package/dist/primitives/EmojiPicker/index.mjs +430 -0
  179. package/dist/primitives/EmojiPicker/index.mjs.map +1 -0
  180. package/dist/primitives/EmojiPicker/utils.js +329 -0
  181. package/dist/primitives/EmojiPicker/utils.js.map +1 -0
  182. package/dist/primitives/EmojiPicker/utils.mjs +325 -0
  183. package/dist/primitives/EmojiPicker/utils.mjs.map +1 -0
  184. package/dist/primitives/Timestamp.js +121 -0
  185. package/dist/primitives/Timestamp.js.map +1 -0
  186. package/dist/primitives/Timestamp.mjs +119 -0
  187. package/dist/primitives/Timestamp.mjs.map +1 -0
  188. package/dist/primitives/index.d.mts +502 -0
  189. package/dist/primitives/index.d.ts +502 -0
  190. package/dist/primitives/index.js +16 -0
  191. package/dist/primitives/index.js.map +1 -0
  192. package/dist/primitives/index.mjs +9 -0
  193. package/dist/primitives/index.mjs.map +1 -0
  194. package/dist/primitives/internal/Emoji.js +30 -0
  195. package/dist/primitives/internal/Emoji.js.map +1 -0
  196. package/dist/primitives/internal/Emoji.mjs +28 -0
  197. package/dist/primitives/internal/Emoji.mjs.map +1 -0
  198. package/dist/shared.js +21 -0
  199. package/dist/shared.js.map +1 -0
  200. package/dist/shared.mjs +19 -0
  201. package/dist/shared.mjs.map +1 -0
  202. package/dist/slate/plugins/auto-formatting.js +83 -0
  203. package/dist/slate/plugins/auto-formatting.js.map +1 -0
  204. package/dist/slate/plugins/auto-formatting.mjs +81 -0
  205. package/dist/slate/plugins/auto-formatting.mjs.map +1 -0
  206. package/dist/slate/plugins/auto-links.js +175 -0
  207. package/dist/slate/plugins/auto-links.js.map +1 -0
  208. package/dist/slate/plugins/auto-links.mjs +172 -0
  209. package/dist/slate/plugins/auto-links.mjs.map +1 -0
  210. package/dist/slate/plugins/empty-clear-formatting.js +18 -0
  211. package/dist/slate/plugins/empty-clear-formatting.js.map +1 -0
  212. package/dist/slate/plugins/empty-clear-formatting.mjs +16 -0
  213. package/dist/slate/plugins/empty-clear-formatting.mjs.map +1 -0
  214. package/dist/slate/plugins/mentions.js +112 -0
  215. package/dist/slate/plugins/mentions.js.map +1 -0
  216. package/dist/slate/plugins/mentions.mjs +105 -0
  217. package/dist/slate/plugins/mentions.mjs.map +1 -0
  218. package/dist/slate/utils/get-character.js +50 -0
  219. package/dist/slate/utils/get-character.js.map +1 -0
  220. package/dist/slate/utils/get-character.mjs +47 -0
  221. package/dist/slate/utils/get-character.mjs.map +1 -0
  222. package/dist/slate/utils/get-dom-range.js +17 -0
  223. package/dist/slate/utils/get-dom-range.js.map +1 -0
  224. package/dist/slate/utils/get-dom-range.mjs +15 -0
  225. package/dist/slate/utils/get-dom-range.mjs.map +1 -0
  226. package/dist/slate/utils/get-match-range.js +53 -0
  227. package/dist/slate/utils/get-match-range.js.map +1 -0
  228. package/dist/slate/utils/get-match-range.mjs +51 -0
  229. package/dist/slate/utils/get-match-range.mjs.map +1 -0
  230. package/dist/slate/utils/is-empty-string.js +8 -0
  231. package/dist/slate/utils/is-empty-string.js.map +1 -0
  232. package/dist/slate/utils/is-empty-string.mjs +6 -0
  233. package/dist/slate/utils/is-empty-string.mjs.map +1 -0
  234. package/dist/slate/utils/is-empty.js +10 -0
  235. package/dist/slate/utils/is-empty.js.map +1 -0
  236. package/dist/slate/utils/is-empty.mjs +8 -0
  237. package/dist/slate/utils/is-empty.mjs.map +1 -0
  238. package/dist/slate/utils/is-selection-collapsed.js +10 -0
  239. package/dist/slate/utils/is-selection-collapsed.js.map +1 -0
  240. package/dist/slate/utils/is-selection-collapsed.mjs +8 -0
  241. package/dist/slate/utils/is-selection-collapsed.mjs.map +1 -0
  242. package/dist/slate/utils/marks.js +43 -0
  243. package/dist/slate/utils/marks.js.map +1 -0
  244. package/dist/slate/utils/marks.mjs +38 -0
  245. package/dist/slate/utils/marks.mjs.map +1 -0
  246. package/dist/utils/Persist.js +85 -0
  247. package/dist/utils/Persist.js.map +1 -0
  248. package/dist/utils/Persist.mjs +81 -0
  249. package/dist/utils/Persist.mjs.map +1 -0
  250. package/dist/utils/Portal.js +27 -0
  251. package/dist/utils/Portal.js.map +1 -0
  252. package/dist/utils/Portal.mjs +25 -0
  253. package/dist/utils/Portal.mjs.map +1 -0
  254. package/dist/utils/capitalize.js +8 -0
  255. package/dist/utils/capitalize.js.map +1 -0
  256. package/dist/utils/capitalize.mjs +6 -0
  257. package/dist/utils/capitalize.mjs.map +1 -0
  258. package/dist/utils/chunk.js +12 -0
  259. package/dist/utils/chunk.js.map +1 -0
  260. package/dist/utils/chunk.mjs +10 -0
  261. package/dist/utils/chunk.mjs.map +1 -0
  262. package/dist/utils/clamp.js +8 -0
  263. package/dist/utils/clamp.js.map +1 -0
  264. package/dist/utils/clamp.mjs +6 -0
  265. package/dist/utils/clamp.mjs.map +1 -0
  266. package/dist/utils/class-names.js +8 -0
  267. package/dist/utils/class-names.js.map +1 -0
  268. package/dist/utils/class-names.mjs +6 -0
  269. package/dist/utils/class-names.mjs.map +1 -0
  270. package/dist/utils/exists.js +8 -0
  271. package/dist/utils/exists.js.map +1 -0
  272. package/dist/utils/exists.mjs +6 -0
  273. package/dist/utils/exists.mjs.map +1 -0
  274. package/dist/utils/find-last-index.js +15 -0
  275. package/dist/utils/find-last-index.js.map +1 -0
  276. package/dist/utils/find-last-index.mjs +13 -0
  277. package/dist/utils/find-last-index.mjs.map +1 -0
  278. package/dist/utils/flush-sync.js +12 -0
  279. package/dist/utils/flush-sync.js.map +1 -0
  280. package/dist/utils/flush-sync.mjs +10 -0
  281. package/dist/utils/flush-sync.mjs.map +1 -0
  282. package/dist/utils/get-initials.js +13 -0
  283. package/dist/utils/get-initials.js.map +1 -0
  284. package/dist/utils/get-initials.mjs +11 -0
  285. package/dist/utils/get-initials.mjs.map +1 -0
  286. package/dist/utils/intl.js +24 -0
  287. package/dist/utils/intl.js.map +1 -0
  288. package/dist/utils/intl.mjs +20 -0
  289. package/dist/utils/intl.mjs.map +1 -0
  290. package/dist/utils/is-apple.js +9 -0
  291. package/dist/utils/is-apple.js.map +1 -0
  292. package/dist/utils/is-apple.mjs +7 -0
  293. package/dist/utils/is-apple.mjs.map +1 -0
  294. package/dist/utils/is-key.js +26 -0
  295. package/dist/utils/is-key.js.map +1 -0
  296. package/dist/utils/is-key.mjs +24 -0
  297. package/dist/utils/is-key.mjs.map +1 -0
  298. package/dist/utils/memoize.js +19 -0
  299. package/dist/utils/memoize.js.map +1 -0
  300. package/dist/utils/memoize.mjs +17 -0
  301. package/dist/utils/memoize.mjs.map +1 -0
  302. package/dist/utils/pluralize.js +8 -0
  303. package/dist/utils/pluralize.js.map +1 -0
  304. package/dist/utils/pluralize.mjs +6 -0
  305. package/dist/utils/pluralize.mjs.map +1 -0
  306. package/dist/utils/request-idle-callback.js +15 -0
  307. package/dist/utils/request-idle-callback.js.map +1 -0
  308. package/dist/utils/request-idle-callback.mjs +12 -0
  309. package/dist/utils/request-idle-callback.mjs.map +1 -0
  310. package/dist/utils/request-submit.js +20 -0
  311. package/dist/utils/request-submit.js.map +1 -0
  312. package/dist/utils/request-submit.mjs +18 -0
  313. package/dist/utils/request-submit.mjs.map +1 -0
  314. package/dist/utils/url.js +22 -0
  315. package/dist/utils/url.js.map +1 -0
  316. package/dist/utils/url.mjs +20 -0
  317. package/dist/utils/url.mjs.map +1 -0
  318. package/dist/utils/use-controllable-state.js +34 -0
  319. package/dist/utils/use-controllable-state.js.map +1 -0
  320. package/dist/utils/use-controllable-state.mjs +32 -0
  321. package/dist/utils/use-controllable-state.mjs.map +1 -0
  322. package/dist/utils/use-id.js +29 -0
  323. package/dist/utils/use-id.js.map +1 -0
  324. package/dist/utils/use-id.mjs +27 -0
  325. package/dist/utils/use-id.mjs.map +1 -0
  326. package/dist/utils/use-index.js +32 -0
  327. package/dist/utils/use-index.js.map +1 -0
  328. package/dist/utils/use-index.mjs +30 -0
  329. package/dist/utils/use-index.mjs.map +1 -0
  330. package/dist/utils/use-initial.js +10 -0
  331. package/dist/utils/use-initial.js.map +1 -0
  332. package/dist/utils/use-initial.mjs +8 -0
  333. package/dist/utils/use-initial.mjs.map +1 -0
  334. package/dist/utils/use-interval.js +24 -0
  335. package/dist/utils/use-interval.js.map +1 -0
  336. package/dist/utils/use-interval.mjs +22 -0
  337. package/dist/utils/use-interval.mjs.map +1 -0
  338. package/dist/utils/use-latest.js +14 -0
  339. package/dist/utils/use-latest.js.map +1 -0
  340. package/dist/utils/use-latest.mjs +12 -0
  341. package/dist/utils/use-latest.mjs.map +1 -0
  342. package/dist/utils/use-layout-effect.js +8 -0
  343. package/dist/utils/use-layout-effect.js.map +1 -0
  344. package/dist/utils/use-layout-effect.mjs +6 -0
  345. package/dist/utils/use-layout-effect.mjs.map +1 -0
  346. package/dist/utils/use-refs.js +24 -0
  347. package/dist/utils/use-refs.js.map +1 -0
  348. package/dist/utils/use-refs.mjs +22 -0
  349. package/dist/utils/use-refs.mjs.map +1 -0
  350. package/dist/utils/use-rerender.js +14 -0
  351. package/dist/utils/use-rerender.js.map +1 -0
  352. package/dist/utils/use-rerender.mjs +12 -0
  353. package/dist/utils/use-rerender.mjs.map +1 -0
  354. package/dist/utils/use-transition.js +12 -0
  355. package/dist/utils/use-transition.js.map +1 -0
  356. package/dist/utils/use-transition.mjs +10 -0
  357. package/dist/utils/use-transition.mjs.map +1 -0
  358. package/dist/utils/use-visible.js +48 -0
  359. package/dist/utils/use-visible.js.map +1 -0
  360. package/dist/utils/use-visible.mjs +46 -0
  361. package/dist/utils/use-visible.mjs.map +1 -0
  362. package/dist/utils/visually-hidden.js +17 -0
  363. package/dist/utils/visually-hidden.js.map +1 -0
  364. package/dist/utils/visually-hidden.mjs +15 -0
  365. package/dist/utils/visually-hidden.mjs.map +1 -0
  366. package/dist/utils/wrap.js +9 -0
  367. package/dist/utils/wrap.js.map +1 -0
  368. package/dist/utils/wrap.mjs +7 -0
  369. package/dist/utils/wrap.mjs.map +1 -0
  370. package/dist/version.js +10 -0
  371. package/dist/version.js.map +1 -0
  372. package/dist/version.mjs +6 -0
  373. package/dist/version.mjs.map +1 -0
  374. package/package.json +142 -0
  375. package/primitives/README.md +5 -0
  376. package/primitives/package.json +4 -0
  377. package/src/styles/constants.css +17 -0
  378. package/src/styles/dark/attributes.css +8 -0
  379. package/src/styles/dark/index.css +29 -0
  380. package/src/styles/dark/media-query.css +7 -0
  381. package/src/styles/index.css +1437 -0
  382. package/src/styles/utils.css +36 -0
  383. package/styles/dark/attributes.css +1 -0
  384. package/styles/dark/attributes.css.d.ts +1 -0
  385. package/styles/dark/attributes.css.map +1 -0
  386. package/styles/dark/media-query.css +1 -0
  387. package/styles/dark/media-query.css.d.ts +1 -0
  388. package/styles/dark/media-query.css.map +1 -0
  389. package/styles.css +1 -0
  390. package/styles.css.d.ts +1 -0
  391. package/styles.css.map +1 -0
@@ -0,0 +1,1437 @@
1
+ @import "./utils";
2
+ @import "./constants";
3
+
4
+ .lb-root {
5
+ /**
6
+ * Basic
7
+ */
8
+ --lb-radius: 0.5em;
9
+ --lb-spacing: 1em;
10
+ --lb-accent: #17f;
11
+ --lb-accent-foreground: #fff;
12
+ --lb-destructive: #f45;
13
+ --lb-destructive-foreground: #fff;
14
+ --lb-background: #fff;
15
+ --lb-foreground: #111;
16
+
17
+ /**
18
+ * Advanced
19
+ */
20
+ --lb-icon-size: 20px;
21
+ --lb-icon-weight: 1.5px;
22
+ --lb-avatar-radius: 50%;
23
+ --lb-button-radius: calc(0.75 * var(--lb-radius));
24
+ --lb-transition-duration: 0.1s;
25
+ --lb-transition-easing: cubic-bezier(0.4, 0, 0.2, 1);
26
+ --lb-elevation-shadow: $lb-elevation-shadow;
27
+ --lb-tooltip-shadow: $lb-tooltip-shadow;
28
+ --lb-accent-contrast: 8%;
29
+ --lb-destructive-contrast: 8%;
30
+ --lb-foreground-contrast: 8%;
31
+
32
+ /**
33
+ * Colors
34
+ */
35
+ --lb-background-foreground-faint: color-mix-scale(
36
+ var(--lb-background),
37
+ var(--lb-foreground),
38
+ var(--lb-foreground-contrast),
39
+ 50
40
+ );
41
+ --lb-background-accent-faint: color-mix-scale(
42
+ var(--lb-background),
43
+ var(--lb-accent),
44
+ var(--lb-accent-contrast),
45
+ 50
46
+ );
47
+ --lb-background-accent-subtle: color-mix-scale(
48
+ var(--lb-background),
49
+ var(--lb-accent),
50
+ var(--lb-accent-contrast),
51
+ 100
52
+ );
53
+ --lb-accent-subtle: color-mix-scale(
54
+ var(--lb-dynamic-background),
55
+ var(--lb-accent),
56
+ var(--lb-accent-contrast),
57
+ 100
58
+ );
59
+ --lb-accent-moderate: color-mix-scale(
60
+ var(--lb-dynamic-background),
61
+ var(--lb-accent),
62
+ var(--lb-accent-contrast),
63
+ 400
64
+ );
65
+ --lb-accent-tertiary: color-mix-scale(
66
+ var(--lb-dynamic-background),
67
+ var(--lb-accent),
68
+ var(--lb-accent-contrast),
69
+ 600
70
+ );
71
+ --lb-accent-secondary: color-mix-scale(
72
+ var(--lb-dynamic-background),
73
+ var(--lb-accent),
74
+ var(--lb-accent-contrast),
75
+ 800
76
+ );
77
+ --lb-foreground-subtle: color-mix-scale(
78
+ var(--lb-dynamic-background),
79
+ var(--lb-foreground),
80
+ var(--lb-foreground-contrast),
81
+ 100
82
+ );
83
+ --lb-foreground-moderate: color-mix-scale(
84
+ var(--lb-dynamic-background),
85
+ var(--lb-foreground),
86
+ var(--lb-foreground-contrast),
87
+ 400
88
+ );
89
+ --lb-foreground-tertiary: color-mix-scale(
90
+ var(--lb-dynamic-background),
91
+ var(--lb-foreground),
92
+ var(--lb-foreground-contrast),
93
+ 600
94
+ );
95
+ --lb-foreground-secondary: color-mix-scale(
96
+ var(--lb-dynamic-background),
97
+ var(--lb-foreground),
98
+ var(--lb-foreground-contrast),
99
+ 800
100
+ );
101
+
102
+ overflow-wrap: break-word;
103
+ accent-color: var(--lb-accent);
104
+ text-size-adjust: none;
105
+ -webkit-font-smoothing: antialiased;
106
+ -moz-osx-font-smoothing: grayscale;
107
+
108
+ &,
109
+ *,
110
+ ::before,
111
+ ::after {
112
+ box-sizing: border-box;
113
+ transition: none var(--lb-transition-duration) var(--lb-transition-easing);
114
+ }
115
+
116
+ /* Define some variables only on first .lb-root instances */
117
+ &:where(:not(& &)) {
118
+ --lb-dynamic-background: var(--lb-background);
119
+ }
120
+ }
121
+
122
+ /*************************************
123
+ * Icon *
124
+ *************************************/
125
+
126
+ .lb-icon {
127
+ --lb-icon-background: var(--lb-dynamic-background);
128
+
129
+ inline-size: var(--lb-icon-size);
130
+ block-size: var(--lb-icon-size);
131
+
132
+ * {
133
+ stroke-width: var(--lb-icon-weight);
134
+ vector-effect: non-scaling-stroke;
135
+ }
136
+ }
137
+
138
+ /*************************************
139
+ * Button *
140
+ *************************************/
141
+
142
+ .lb-button {
143
+ --lb-button-background: var(--lb-dynamic-background);
144
+
145
+ all: unset;
146
+ position: relative;
147
+ display: flex;
148
+ justify-content: center;
149
+ align-items: center;
150
+ box-sizing: inherit;
151
+ padding: calc(0.25 * var(--lb-spacing));
152
+ border-radius: var(--lb-button-radius);
153
+ background: var(--lb-button-background);
154
+ color: var(--lb-foreground-moderate);
155
+ outline: none;
156
+ cursor: pointer;
157
+ user-select: none;
158
+ transition-timing-function: var(--lb-transition-easing);
159
+ transition-duration: var(--lb-transition-duration);
160
+ transition-property: background, color, opacity;
161
+ -webkit-tap-highlight-color: transparent;
162
+
163
+ &::after {
164
+ content: "";
165
+ position: absolute;
166
+ inset: 0;
167
+ border-radius: inherit;
168
+ pointer-events: none;
169
+ transition-property: box-shadow;
170
+ }
171
+
172
+ &:where(:focus-visible) {
173
+ z-index: 1;
174
+
175
+ &::after {
176
+ box-shadow:
177
+ var(--lb-dynamic-background) 0 0 0 2px,
178
+ var(--lb-accent) 0 0 0 4px;
179
+ }
180
+ }
181
+
182
+ &:where(.lb-button\:non-disableable:disabled) {
183
+ cursor: default;
184
+ }
185
+
186
+ &:where(:not(.lb-button\:non-disableable):disabled) {
187
+ opacity: 0.5;
188
+ cursor: not-allowed;
189
+ }
190
+
191
+ &:where(
192
+ :enabled:hover,
193
+ :enabled:focus-visible,
194
+ [aria-expanded="true"],
195
+ [aria-selected="true"]
196
+ ) {
197
+ --lb-button-background: var(--lb-foreground-subtle);
198
+
199
+ color: var(--lb-foreground-tertiary);
200
+ }
201
+
202
+ &:where(
203
+ [data-variant="default"]:not(
204
+ :is(
205
+ :enabled:hover,
206
+ :enabled:focus-visible,
207
+ [aria-expanded="true"],
208
+ [aria-selected="true"]
209
+ )
210
+ )
211
+ ) {
212
+ background: transparent;
213
+ }
214
+
215
+ &:where([data-variant="primary"]) {
216
+ --lb-button-background: var(--lb-accent);
217
+
218
+ color: var(--lb-accent-foreground);
219
+
220
+ &:where(
221
+ :enabled:hover,
222
+ :enabled:focus-visible,
223
+ [aria-expanded="true"],
224
+ [aria-selected="true"]
225
+ ) {
226
+ --lb-button-background: var(--lb-accent-secondary);
227
+
228
+ color: var(--lb-accent-foreground);
229
+ }
230
+ }
231
+
232
+ &:where([data-variant="outline"]) {
233
+ box-shadow: inset 0 0 0 1px var(--lb-foreground-subtle);
234
+ transition-property: background, color, opacity, box-shadow;
235
+ }
236
+ }
237
+
238
+ .lb-button-icon {
239
+ --lb-icon-background: var(--lb-button-background);
240
+ }
241
+
242
+ /*************************************
243
+ * Dropdown *
244
+ *************************************/
245
+
246
+ .lb-dropdown-item-icon {
247
+ margin-inline-start: calc(-0.125 * var(--lb-spacing));
248
+ margin-inline-end: calc(0.375 * var(--lb-spacing));
249
+ color: var(--lb-foreground-moderate);
250
+ transition-property: color;
251
+ }
252
+
253
+ .lb-dropdown-item:where(:is([data-highlighted], [data-selected])) {
254
+ :where(.lb-dropdown-item-icon) {
255
+ color: var(--lb-foreground-tertiary);
256
+ }
257
+ }
258
+
259
+ /*************************************
260
+ * Composer suggestions *
261
+ *************************************/
262
+
263
+ .lb-composer-suggestions-list {
264
+ margin: 0;
265
+ padding: 0;
266
+ list-style: none;
267
+ }
268
+
269
+ .lb-composer-suggestions-list-item {
270
+ scroll-margin-block: $lb-elevation-list-padding;
271
+ }
272
+
273
+ /*************************************
274
+ * Composer mention suggestions *
275
+ *************************************/
276
+
277
+ .lb-composer-mention-suggestions {
278
+ --lb-composer-mention-suggestion-avatar-size: 1.25rem;
279
+ }
280
+
281
+ .lb-composer-mention-suggestion {
282
+ padding: calc(0.375 * var(--lb-spacing)) calc(0.625 * var(--lb-spacing));
283
+ }
284
+
285
+ .lb-composer-mention-suggestion-avatar {
286
+ inline-size: var(--lb-composer-mention-suggestion-avatar-size);
287
+ margin-inline-start: calc(-0.125 * var(--lb-spacing));
288
+ margin-inline-end: calc(0.5 * var(--lb-spacing));
289
+ margin-block: calc(0.125 * var(--lb-spacing));
290
+ background: var(--lb-foreground-subtle);
291
+ color: var(--lb-foreground-moderate);
292
+ }
293
+
294
+ /*************************************
295
+ * List *
296
+ *************************************/
297
+
298
+ .lb-list {
299
+ display: contents;
300
+ }
301
+
302
+ /*************************************
303
+ * Emoji *
304
+ *************************************/
305
+
306
+ @include safari-only {
307
+ .lb-emoji {
308
+ transform: scale(0.825);
309
+ will-change: transform;
310
+ }
311
+ }
312
+
313
+ /*************************************
314
+ * Emoji picker *
315
+ *************************************/
316
+
317
+ .lb-emoji-picker {
318
+ --lb-emoji-picker-padding: $lb-emoji-picker-padding;
319
+ --lb-emoji-picker-offset-padding: calc(
320
+ $lb-emoji-picker-padding + 0.375 * var(--lb-spacing)
321
+ );
322
+
323
+ display: flex;
324
+ flex-direction: column;
325
+ block-size: 350px;
326
+ color: var(--lb-foreground);
327
+ }
328
+
329
+ .lb-emoji-picker-header {
330
+ flex: none;
331
+ border-block-end: 1px solid var(--lb-foreground-subtle);
332
+ }
333
+
334
+ .lb-emoji-picker-search-container {
335
+ position: relative;
336
+ display: flex;
337
+ align-items: center;
338
+ }
339
+
340
+ .lb-emoji-picker-search {
341
+ all: unset;
342
+ box-sizing: inherit;
343
+ inline-size: 100%;
344
+ padding: var(--lb-emoji-picker-offset-padding);
345
+ padding-inline-start: calc(
346
+ var(--lb-icon-size) + var(--lb-emoji-picker-offset-padding) + 0.375 *
347
+ var(--lb-spacing)
348
+ );
349
+ background: transparent;
350
+ outline: none;
351
+ appearance: textfield;
352
+
353
+ &::placeholder {
354
+ color: var(--lb-foreground-moderate);
355
+ }
356
+
357
+ &::-webkit-search-cancel-button {
358
+ display: none;
359
+ }
360
+ }
361
+
362
+ .lb-emoji-picker-search-icon {
363
+ position: absolute;
364
+ inset-inline-start: var(--lb-emoji-picker-offset-padding);
365
+ color: var(--lb-foreground-moderate);
366
+ pointer-events: none;
367
+ }
368
+
369
+ .lb-emoji-picker-content {
370
+ position: relative;
371
+ flex: 1;
372
+ }
373
+
374
+ .lb-emoji-picker-loading,
375
+ .lb-emoji-picker-empty,
376
+ .lb-emoji-picker-error {
377
+ position: absolute;
378
+ inset: 0;
379
+ display: flex;
380
+ justify-content: center;
381
+ align-items: center;
382
+ }
383
+
384
+ .lb-emoji-picker-loading {
385
+ color: var(--lb-foreground-moderate);
386
+ }
387
+
388
+ .lb-emoji-picker-empty,
389
+ .lb-emoji-picker-error {
390
+ padding: var(--lb-spacing);
391
+ color: var(--lb-foreground-tertiary);
392
+ font-size: 0.875em;
393
+ text-align: center;
394
+ text-wrap: balance;
395
+ }
396
+
397
+ .lb-emoji-picker-category-header {
398
+ padding: var(--lb-emoji-picker-padding) var(--lb-emoji-picker-offset-padding);
399
+ background: var(--lb-dynamic-background);
400
+ }
401
+
402
+ .lb-emoji-picker-category-header-title {
403
+ color: var(--lb-foreground-tertiary);
404
+ font-weight: 600;
405
+ font-size: 0.675em;
406
+ text-transform: uppercase;
407
+ }
408
+
409
+ .lb-emoji-picker-grid {
410
+ position: absolute;
411
+ inset: 0;
412
+ animation: lb-animation-appear var(--lb-transition-duration)
413
+ var(--lb-transition-easing) both;
414
+ }
415
+
416
+ .lb-emoji-picker-row {
417
+ display: flex;
418
+ padding-inline: $lb-emoji-picker-padding;
419
+ scroll-margin-block: $lb-emoji-picker-padding;
420
+
421
+ &:where([data-last]) {
422
+ padding-block-end: $lb-emoji-picker-padding;
423
+ }
424
+ }
425
+
426
+ .lb-emoji-picker-emoji {
427
+ all: unset;
428
+ display: flex;
429
+ justify-content: center;
430
+ align-items: center;
431
+ overflow: hidden;
432
+ box-sizing: inherit;
433
+ aspect-ratio: 1;
434
+ padding: calc(0.375 * var(--lb-spacing));
435
+ border-radius: calc(var(--lb-radius) - 0.75 * $lb-emoji-picker-padding);
436
+ text-align: center;
437
+ }
438
+
439
+ /*************************************
440
+ * Tooltip *
441
+ *************************************/
442
+
443
+ .lb-tooltip {
444
+ --lb-background: #222;
445
+ --lb-foreground: #fff;
446
+ --lb-foreground-contrast: 10%;
447
+
448
+ position: relative;
449
+ display: flex;
450
+ align-items: center;
451
+ min-block-size: calc(
452
+ $lb-tooltip-shortcut-height + 2 * $lb-tooltip-additional-padding
453
+ );
454
+ padding-inline: $lb-tooltip-horizontal-padding;
455
+ border-radius: var(--lb-radius);
456
+ background: var(--lb-dynamic-background);
457
+ color: var(--lb-foreground);
458
+ box-shadow: var(--lb-tooltip-shadow);
459
+ font-size: 0.75rem;
460
+ line-height: 1;
461
+ pointer-events: none;
462
+
463
+ &::after {
464
+ content: "";
465
+ position: absolute;
466
+ inset: 0;
467
+ z-index: 1;
468
+ border-radius: inherit;
469
+ box-shadow: var(--lb-inset-shadow);
470
+ pointer-events: none;
471
+ }
472
+ }
473
+
474
+ .lb-tooltip\:multiline {
475
+ justify-content: center;
476
+ padding-block: calc(
477
+ $lb-tooltip-vertical-padding * (1 / $lb-tooltip-line-height)
478
+ );
479
+ line-height: $lb-tooltip-line-height;
480
+ text-align: center;
481
+ }
482
+
483
+ .lb-tooltip-shortcut {
484
+ display: flex;
485
+ gap: calc(0.125 * var(--lb-spacing));
486
+ justify-content: center;
487
+ align-items: center;
488
+ block-size: $lb-tooltip-shortcut-height;
489
+ margin-inline-start: $lb-tooltip-horizontal-padding;
490
+ margin-inline-end: calc(
491
+ -1 * $lb-tooltip-horizontal-padding + $lb-tooltip-additional-padding
492
+ );
493
+ padding-inline: calc(0.25 * var(--lb-spacing));
494
+ border-radius: calc(
495
+ var(--lb-radius) - 0.625 * $lb-tooltip-additional-padding
496
+ );
497
+ background: var(--lb-foreground-subtle);
498
+ color: var(--lb-foreground-tertiary);
499
+ font-family: inherit;
500
+ line-height: 1;
501
+ text-transform: uppercase;
502
+
503
+ :where(abbr) {
504
+ all: unset;
505
+ }
506
+ }
507
+
508
+ /*************************************
509
+ * Avatar *
510
+ *************************************/
511
+
512
+ .lb-avatar {
513
+ position: relative;
514
+ container-type: inline-size;
515
+ display: flex;
516
+ justify-content: center;
517
+ align-items: center;
518
+ overflow: hidden;
519
+ aspect-ratio: 1;
520
+ border-radius: var(--lb-avatar-radius);
521
+ background: var(--lb-foreground-subtle);
522
+ color: var(--lb-foreground-moderate);
523
+
524
+ &:where([data-loading]) {
525
+ background: var(--lb-foreground);
526
+ opacity: $lb-loading-opacity;
527
+ }
528
+ }
529
+
530
+ .lb-avatar-image {
531
+ position: absolute;
532
+ inset: 0;
533
+ object-fit: cover;
534
+ inline-size: 100%;
535
+ block-size: 100%;
536
+ }
537
+
538
+ .lb-avatar-fallback {
539
+ font-weight: 500;
540
+ font-size: 35cqi;
541
+ white-space: nowrap;
542
+
543
+ /**
544
+ * Progressive enhancement: Only show the fallback when container queries are supported
545
+ */
546
+ @supports not (container-type: inline-size) {
547
+ display: none;
548
+ }
549
+ }
550
+
551
+ /*************************************
552
+ * Name *
553
+ *************************************/
554
+
555
+ .lb-name:where([data-loading]) {
556
+ &::before {
557
+ content: "\FEFF";
558
+ display: inline-block;
559
+ vertical-align: middle;
560
+ inline-size: 8ch;
561
+ block-size: 1.75ex;
562
+ border-radius: calc(0.5 * var(--lb-radius));
563
+ background: currentcolor;
564
+ opacity: $lb-loading-opacity;
565
+ user-select: none;
566
+ }
567
+ }
568
+
569
+ /*************************************
570
+ * Loading *
571
+ *************************************/
572
+
573
+ :is(.lb-avatar, .lb-name):where([data-loading]) {
574
+ animation: lb-animation-shimmer 8s linear infinite;
575
+ }
576
+
577
+ /*************************************
578
+ * Body *
579
+ *************************************/
580
+
581
+ :is(.lb-comment-body, .lb-composer-editor) {
582
+ color: var(--lb-foreground-secondary);
583
+
584
+ :where(p) {
585
+ margin-block-start: 0.25em;
586
+ margin-block-end: 0.25em;
587
+
588
+ &:where(:first-of-type) {
589
+ margin-block-start: 0;
590
+ }
591
+
592
+ &:where(:last-of-type) {
593
+ margin-block-end: 0;
594
+ }
595
+ }
596
+
597
+ :where(strong) {
598
+ font-weight: 600;
599
+ }
600
+ }
601
+
602
+ .lb-comment-mention,
603
+ .lb-composer-mention {
604
+ color: var(--lb-accent);
605
+ box-decoration-break: clone;
606
+ font-weight: 500;
607
+ }
608
+
609
+ :is(.lb-comment-link, .lb-composer-link) {
610
+ color: var(--lb-foreground);
611
+ outline: none;
612
+ font-weight: 500;
613
+ transition-property: color, text-decoration-color;
614
+ text-decoration-line: underline;
615
+ text-decoration-color: var(--lb-foreground-moderate);
616
+ text-underline-offset: 2px;
617
+
618
+ &:where([href]):where(:hover, :focus-visible) {
619
+ color: var(--lb-accent);
620
+ text-decoration-color: var(--lb-accent-moderate);
621
+ }
622
+ }
623
+
624
+ .lb-comment-mention:where([data-self]),
625
+ .lb-composer-mention {
626
+ padding: 0.1em 0.3em;
627
+ border-radius: calc(0.675 * var(--lb-radius));
628
+ background: var(--lb-accent-subtle);
629
+ }
630
+
631
+ /*************************************
632
+ * Composer *
633
+ *************************************/
634
+
635
+ .lb-composer {
636
+ background: var(--lb-dynamic-background);
637
+ color: var(--lb-foreground);
638
+ transition-property: background;
639
+ }
640
+
641
+ .lb-composer-form {
642
+ margin: 0;
643
+ }
644
+
645
+ /**
646
+ * Progressive enhancement: Use :has instead of :focus-within to target the editor specifically
647
+ */
648
+ @supports selector(:has(*)) {
649
+ .lb-composer:where(:has(.lb-composer-editor:not(:focus-visible))) {
650
+ :where(.lb-button[data-variant="primary"]) {
651
+ --lb-button-background: var(--lb-foreground-subtle);
652
+
653
+ color: var(--lb-foreground-tertiary);
654
+
655
+ &:where(:enabled:hover, :enabled:focus-visible) {
656
+ --lb-button-background: var(--lb-accent);
657
+
658
+ color: var(--lb-accent-foreground);
659
+ }
660
+ }
661
+ }
662
+ }
663
+
664
+ @supports not selector(:has(*)) {
665
+ .lb-composer:where(:not(:focus-within)) {
666
+ :where(.lb-button[data-variant="primary"]) {
667
+ --lb-button-background: var(--lb-foreground-subtle);
668
+
669
+ color: var(--lb-foreground-tertiary);
670
+
671
+ &:where(:enabled:hover, :enabled:focus-visible) {
672
+ --lb-button-background: var(--lb-accent);
673
+
674
+ color: var(--lb-accent-foreground);
675
+ }
676
+ }
677
+ }
678
+ }
679
+
680
+ .lb-composer-editor {
681
+ padding: var(--lb-spacing);
682
+ outline: none;
683
+
684
+ :where([data-placeholder]) {
685
+ color: var(--lb-foreground-moderate);
686
+ }
687
+ }
688
+
689
+ .lb-composer-mention {
690
+ @include invisible-selection;
691
+
692
+ &:where([data-selected]) {
693
+ background: var(--lb-accent);
694
+ color: var(--lb-accent-foreground);
695
+ }
696
+ }
697
+
698
+ .lb-composer-footer {
699
+ display: flex;
700
+ gap: calc(0.75 * var(--lb-spacing));
701
+ align-items: center;
702
+ block-size: calc($lb-button-size + var(--lb-spacing));
703
+ padding: 0 var(--lb-spacing) var(--lb-spacing);
704
+ }
705
+
706
+ .lb-composer-actions,
707
+ .lb-composer-editor-actions {
708
+ display: flex;
709
+ gap: calc(0.125 * var(--lb-spacing));
710
+ align-items: center;
711
+ }
712
+
713
+ .lb-composer-editor-actions {
714
+ margin-inline-end: auto;
715
+ }
716
+
717
+ .lb-composer-attribution {
718
+ color: var(--lb-foreground-moderate);
719
+ outline: none;
720
+ transition-property: color;
721
+
722
+ &:where(:hover, :focus-visible) {
723
+ color: var(--lb-foreground-tertiary);
724
+ }
725
+
726
+ :where(svg) {
727
+ block-size: calc(0.75 * $lb-button-size);
728
+ }
729
+ }
730
+
731
+ .lb-composer:where(:not([data-collapsed])) {
732
+ :where(.lb-composer-editor) {
733
+ padding-block-end: calc(0.875 * var(--lb-spacing));
734
+ }
735
+ }
736
+
737
+ /*************************************
738
+ * Comment *
739
+ *************************************/
740
+
741
+ .lb-comment {
742
+ --lb-comment-avatar-size: $lb-button-size;
743
+
744
+ position: relative;
745
+ padding: var(--lb-spacing);
746
+ background: var(--lb-dynamic-background);
747
+ color: var(--lb-foreground);
748
+ font-weight: 400;
749
+ scroll-margin: var(--lb-spacing);
750
+
751
+ @media (hover: hover) {
752
+ &:where(.lb-comment\:show-actions-hover) {
753
+ :where(.lb-comment-actions) {
754
+ position: absolute;
755
+ inset-inline-end: 0;
756
+ opacity: 0;
757
+ transition-property: opacity;
758
+ }
759
+
760
+ &:where(:is(:hover, :focus-within, .lb-comment\:action-open)) {
761
+ :where(.lb-comment-actions) {
762
+ position: relative;
763
+ opacity: 1;
764
+ }
765
+ }
766
+ }
767
+ }
768
+
769
+ &:where(:target, [data-target]) {
770
+ --lb-dynamic-background: var(--lb-background-accent-faint);
771
+ }
772
+
773
+ &:where([data-editing]) {
774
+ --lb-dynamic-background: var(--lb-background-foreground-faint);
775
+ }
776
+ }
777
+
778
+ .lb-comment-header {
779
+ position: relative;
780
+ display: flex;
781
+ gap: calc(0.75 * var(--lb-spacing));
782
+ align-items: center;
783
+ block-size: var(--lb-comment-avatar-size);
784
+ margin-block-end: calc(0.75 * var(--lb-spacing));
785
+ }
786
+
787
+ .lb-comment-details {
788
+ display: flex;
789
+ gap: calc(0.75 * var(--lb-spacing));
790
+ align-items: center;
791
+ min-inline-size: 0;
792
+ }
793
+
794
+ .lb-comment-avatar {
795
+ flex: none;
796
+ inline-size: var(--lb-comment-avatar-size);
797
+ }
798
+
799
+ .lb-comment-details-labels {
800
+ display: flex;
801
+ gap: calc(0.5 * var(--lb-spacing));
802
+ align-items: baseline;
803
+ min-inline-size: 0;
804
+ }
805
+
806
+ .lb-comment-author {
807
+ @include truncate;
808
+
809
+ font-weight: 500;
810
+ }
811
+
812
+ .lb-comment-date {
813
+ @include truncate;
814
+
815
+ color: var(--lb-foreground-tertiary);
816
+ font-size: 0.875em;
817
+ }
818
+
819
+ .lb-comment-date-created,
820
+ .lb-comment-date-edited {
821
+ display: contents;
822
+ }
823
+
824
+ .lb-comment-actions {
825
+ display: flex;
826
+ gap: calc(0.125 * var(--lb-spacing));
827
+ margin-inline-start: auto;
828
+ }
829
+
830
+ .lb-comment-composer {
831
+ margin: calc(-1 * var(--lb-spacing));
832
+ background: unset;
833
+ }
834
+
835
+ .lb-comment-body {
836
+ /**
837
+ * Prevent empty lines from collapsing
838
+ */
839
+ :where(p span:only-child:empty::before) {
840
+ content: "\FEFF";
841
+ user-select: none;
842
+ }
843
+ }
844
+
845
+ .lb-comment-reactions {
846
+ display: flex;
847
+ flex-wrap: wrap;
848
+ gap: calc(0.375 * var(--lb-spacing));
849
+ margin-block-start: calc(0.75 * var(--lb-spacing));
850
+ }
851
+
852
+ .lb-comment-reaction {
853
+ gap: calc(0.375 * var(--lb-spacing));
854
+ block-size: $lb-button-size;
855
+ padding-inline: calc(0.575 * var(--lb-spacing));
856
+ border-radius: $lb-radius-full;
857
+
858
+ &:where([data-self]) {
859
+ background: var(--lb-accent-subtle);
860
+ color: var(--lb-accent-secondary);
861
+ box-shadow: inset 0 0 0 1px var(--lb-accent-moderate);
862
+
863
+ &:where(
864
+ :enabled:hover,
865
+ :enabled:focus-visible,
866
+ [aria-expanded="true"],
867
+ [aria-selected="true"]
868
+ ) {
869
+ color: var(--lb-accent);
870
+ }
871
+ }
872
+ }
873
+
874
+ .lb-comment-reaction-count {
875
+ font-weight: 500;
876
+ font-size: 0.75em;
877
+ font-variant-numeric: tabular-nums;
878
+ }
879
+
880
+ .lb-comment-reaction-tooltip {
881
+ max-inline-size: 200px;
882
+ }
883
+
884
+ .lb-comment-deleted {
885
+ color: var(--lb-foreground-tertiary);
886
+ font-size: 0.875em;
887
+ }
888
+
889
+ .lb-comment\:indent-content {
890
+ min-block-size: calc(var(--lb-comment-avatar-size) + 2 * var(--lb-spacing));
891
+
892
+ :where(.lb-comment-header) {
893
+ block-size: $lb-button-size;
894
+ margin-block-end: calc(0.25 * var(--lb-spacing));
895
+ }
896
+
897
+ :where(.lb-comment-avatar) {
898
+ position: absolute;
899
+ inset-inline-start: 0;
900
+ inset-block-start: 0;
901
+ }
902
+
903
+ :where(.lb-comment-details-labels) {
904
+ margin-inline-start: calc(
905
+ var(--lb-comment-avatar-size) + 0.75 * var(--lb-spacing)
906
+ );
907
+ }
908
+
909
+ :where(.lb-comment-content) {
910
+ padding-inline-start: calc(
911
+ var(--lb-comment-avatar-size) + 0.75 * var(--lb-spacing)
912
+ );
913
+ }
914
+ }
915
+
916
+ /*************************************
917
+ * Thread *
918
+ *************************************/
919
+
920
+ .lb-thread {
921
+ background: var(--lb-dynamic-background);
922
+ color: var(--lb-foreground);
923
+ transition-property: background;
924
+
925
+ @media (hover: hover) {
926
+ &:where(.lb-thread\:show-actions-hover :is(:hover, :focus-within)) {
927
+ :where(.lb-thread-actions) {
928
+ opacity: 1;
929
+ }
930
+ }
931
+ }
932
+ }
933
+
934
+ .lb-thread-comments {
935
+ position: relative;
936
+ z-index: 0;
937
+ display: flex;
938
+ flex-direction: column;
939
+ }
940
+
941
+ .lb-thread-comment {
942
+ z-index: 0;
943
+ padding-block: calc(0.6 * var(--lb-spacing));
944
+ transition-property: background;
945
+
946
+ &:where(.lb-comment\:indent-content) {
947
+ min-block-size: calc(var(--lb-comment-avatar-size) + var(--lb-spacing));
948
+ }
949
+
950
+ &:where(:first-of-type) {
951
+ padding-block-start: var(--lb-spacing);
952
+
953
+ &:where(.lb-comment\:indent-content) {
954
+ min-block-size: calc(
955
+ var(--lb-comment-avatar-size) + 1.5 * var(--lb-spacing)
956
+ );
957
+ }
958
+ }
959
+
960
+ &:where(:last-of-type) {
961
+ padding-block-end: var(--lb-spacing);
962
+
963
+ &:where(.lb-comment\:indent-content) {
964
+ min-block-size: calc(
965
+ var(--lb-comment-avatar-size) + 1.75 * var(--lb-spacing)
966
+ );
967
+ }
968
+ }
969
+ }
970
+
971
+ .lb-thread-new-indicator {
972
+ position: relative;
973
+ z-index: 1;
974
+ display: flex;
975
+ justify-content: center;
976
+ align-items: center;
977
+ block-size: 0;
978
+
979
+ &::before,
980
+ &::after {
981
+ content: "";
982
+ z-index: 0;
983
+ flex: 1;
984
+ block-size: 0;
985
+ border-block-start: 1px solid var(--lb-foreground-subtle);
986
+ transition-property: border;
987
+ }
988
+ }
989
+
990
+ .lb-thread-new-indicator-label {
991
+ z-index: 1;
992
+ display: flex;
993
+ flex: none;
994
+ gap: calc(0.325 * var(--lb-spacing));
995
+ align-items: center;
996
+ padding: calc(0.25 * var(--lb-spacing)) var(--lb-spacing);
997
+ color: var(--lb-accent);
998
+ font-weight: 600;
999
+ font-size: 0.675em;
1000
+ text-transform: uppercase;
1001
+ }
1002
+
1003
+ .lb-thread-new-indicator-label-icon {
1004
+ inline-size: calc(0.6 * var(--lb-icon-size));
1005
+ block-size: calc(0.6 * var(--lb-icon-size));
1006
+ }
1007
+
1008
+ .lb-thread-composer {
1009
+ position: relative;
1010
+
1011
+ &::after {
1012
+ content: "";
1013
+ position: absolute;
1014
+ inset: 0;
1015
+ inline-size: 100%;
1016
+ block-size: 100%;
1017
+ border-block-start: 1px solid var(--lb-foreground-subtle);
1018
+ pointer-events: none;
1019
+ transition-property: border;
1020
+ }
1021
+ }
1022
+
1023
+ /*************************************
1024
+ * Inbox Notification *
1025
+ *************************************/
1026
+
1027
+ .lb-inbox-notification {
1028
+ --lb-inbox-notification-aside-size: 36px;
1029
+
1030
+ position: relative;
1031
+ display: flex;
1032
+ gap: calc(0.75 * var(--lb-spacing));
1033
+ overflow: hidden;
1034
+ padding: var(--lb-spacing);
1035
+ background: var(--lb-dynamic-background);
1036
+ color: var(--lb-foreground);
1037
+ font-weight: 400;
1038
+ text-decoration: inherit;
1039
+ transition-property: background;
1040
+
1041
+ /* Highlight missing notifications during development */
1042
+ &:where([data-missing]) {
1043
+ --lb-accent: var(--lb-destructive) !important;
1044
+ --lb-accent-foreground: var(--lb-destructive-foreground) !important;
1045
+ --lb-accent-contrast: var(--lb-destructive-contrast) !important;
1046
+ --lb-dynamic-background: var(--lb-background-accent-faint);
1047
+ }
1048
+
1049
+ &:where([data-unread]) {
1050
+ --lb-dynamic-background: var(--lb-background-accent-faint);
1051
+ }
1052
+
1053
+ &:where([href]) {
1054
+ cursor: pointer;
1055
+
1056
+ &:where(:hover, :focus-visible, :focus-within) {
1057
+ --lb-dynamic-background: var(--lb-background-foreground-faint);
1058
+ }
1059
+
1060
+ &:where([data-unread]) {
1061
+ &:where(:hover, :focus-visible, :focus-within) {
1062
+ --lb-dynamic-background: var(--lb-background-accent-subtle);
1063
+ }
1064
+ }
1065
+ }
1066
+
1067
+ @media (hover: hover) {
1068
+ &:where(.lb-inbox-notification\:show-actions-hover) {
1069
+ :where(.lb-inbox-notification-header) {
1070
+ display: grid;
1071
+ grid-template: "title secondary" / 1fr max-content;
1072
+ }
1073
+
1074
+ :where(.lb-inbox-notification-details) {
1075
+ opacity: 1;
1076
+ transition-property: opacity;
1077
+ }
1078
+
1079
+ :where(.lb-inbox-notification-actions) {
1080
+ opacity: 0;
1081
+ transition-property: opacity;
1082
+ }
1083
+
1084
+ &:where(:is(:hover, :focus-within, .lb-inbox-notification\:action-open)) {
1085
+ :where(.lb-inbox-notification-details) {
1086
+ opacity: 0;
1087
+ }
1088
+
1089
+ :where(.lb-inbox-notification-actions) {
1090
+ opacity: 1;
1091
+ }
1092
+ }
1093
+
1094
+ :where(.lb-inbox-notification-details),
1095
+ :where(.lb-inbox-notification-actions) {
1096
+ grid-area: secondary;
1097
+ justify-self: end;
1098
+ }
1099
+ }
1100
+ }
1101
+ }
1102
+
1103
+ .lb-inbox-notification-aside {
1104
+ flex: none;
1105
+ inline-size: var(--lb-inbox-notification-aside-size);
1106
+ }
1107
+
1108
+ .lb-inbox-notification-icon {
1109
+ display: flex;
1110
+ justify-content: center;
1111
+ place-items: center;
1112
+ aspect-ratio: 1;
1113
+ border-radius: 50%;
1114
+ background: var(--lb-foreground-subtle);
1115
+
1116
+ .lb-inbox-notification:where([data-missing]) :where(&) {
1117
+ background: var(--lb-accent-subtle);
1118
+ color: var(--lb-accent);
1119
+ }
1120
+ }
1121
+
1122
+ .lb-inbox-notification-content {
1123
+ flex: 1;
1124
+ }
1125
+
1126
+ .lb-inbox-notification-content,
1127
+ .lb-inbox-notification-body {
1128
+ min-inline-size: 0;
1129
+ max-inline-size: 100%;
1130
+ }
1131
+
1132
+ .lb-inbox-notification-header {
1133
+ display: flex;
1134
+ gap: calc(0.75 * var(--lb-spacing));
1135
+ align-items: center;
1136
+ margin-block-start: calc(0.25 * var(--lb-spacing));
1137
+ margin-block-end: calc(0.5 * var(--lb-spacing));
1138
+ }
1139
+
1140
+ .lb-inbox-notification-title {
1141
+ min-block-size: $lb-button-size;
1142
+
1143
+ :where(strong, .lb-list, .lb-name) {
1144
+ font-weight: 500;
1145
+ }
1146
+ }
1147
+
1148
+ .lb-inbox-notification-details {
1149
+ flex: none;
1150
+ align-self: start;
1151
+ min-inline-size: 0;
1152
+ block-size: $lb-button-size;
1153
+ margin-inline-start: auto;
1154
+ }
1155
+
1156
+ .lb-inbox-notification-details-labels {
1157
+ display: flex;
1158
+ align-items: baseline;
1159
+ min-inline-size: 0;
1160
+
1161
+ &::before {
1162
+ content: "\FEFF";
1163
+ }
1164
+ }
1165
+
1166
+ .lb-inbox-notification-actions {
1167
+ display: flex;
1168
+ grid-area: actions;
1169
+ gap: calc(0.125 * var(--lb-spacing));
1170
+ align-self: start;
1171
+ }
1172
+
1173
+ .lb-inbox-notification-comments {
1174
+ display: flex;
1175
+ flex-direction: column;
1176
+ gap: var(--lb-spacing);
1177
+ }
1178
+
1179
+ .lb-inbox-notification-comment {
1180
+ padding: 0;
1181
+ background: transparent;
1182
+
1183
+ :where(.lb-comment-header) {
1184
+ block-size: auto;
1185
+ color: var(--lb-foreground-tertiary);
1186
+ font-size: 0.875rem;
1187
+ }
1188
+
1189
+ :where(.lb-comment-reaction) {
1190
+ pointer-events: none;
1191
+ }
1192
+ }
1193
+
1194
+ .lb-inbox-notification-date {
1195
+ color: var(--lb-foreground-tertiary);
1196
+ font-size: 0.875em;
1197
+ }
1198
+
1199
+ .lb-inbox-notification-unread-indicator {
1200
+ align-self: center;
1201
+ inline-size: 10px;
1202
+ block-size: 10px;
1203
+ margin-inline-start: calc(0.5 * var(--lb-spacing));
1204
+ border-radius: 50%;
1205
+ background: var(--lb-accent);
1206
+ }
1207
+
1208
+ /*************************************
1209
+ * Inbox Notification List *
1210
+ *************************************/
1211
+
1212
+ .lb-inbox-notification-list {
1213
+ margin: 0;
1214
+ padding: 0;
1215
+ list-style: none;
1216
+ }
1217
+
1218
+ .lb-inbox-notification-list-item {
1219
+ &:where(:not(:last-of-type)) {
1220
+ border-block-end: 1px solid var(--lb-foreground-subtle);
1221
+ }
1222
+ }
1223
+
1224
+ /*************************************
1225
+ * Inline code *
1226
+ *************************************/
1227
+
1228
+ :is(.lb-root) {
1229
+ :where(code) {
1230
+ padding: 0.2em 0.4em;
1231
+ border-radius: calc(0.75 * var(--lb-radius));
1232
+ background: var(--lb-foreground-subtle);
1233
+ box-decoration-break: clone;
1234
+ font-size: 85%;
1235
+ line-height: 1;
1236
+ }
1237
+
1238
+ /**
1239
+ * Progressive enhancement: Merge adjacent inline code elements
1240
+ */
1241
+ :where(span:has(code) + span code) {
1242
+ padding-inline-start: 0;
1243
+ border-start-start-radius: 0;
1244
+ border-end-start-radius: 0;
1245
+ }
1246
+
1247
+ :where(span:has(code):has(+ span code) code) {
1248
+ padding-inline-end: 0;
1249
+ border-start-end-radius: 0;
1250
+ border-end-end-radius: 0;
1251
+ }
1252
+ }
1253
+
1254
+ /* 0,0,0 specificity to inherit any styles applied to `code` elements */
1255
+ :where(:is(.lb-root) code) {
1256
+ font-family: ui-monospace, Menlo, Monaco, "Roboto Mono", "Cascadia Code",
1257
+ "Source Code Pro", Consolas, "DejaVu Sans Mono", monospace;
1258
+ }
1259
+
1260
+ /*************************************
1261
+ * Elevation *
1262
+ *************************************/
1263
+
1264
+ .lb-elevation {
1265
+ position: relative;
1266
+ overflow: hidden;
1267
+ border-radius: var(--lb-radius);
1268
+ background: var(--lb-dynamic-background);
1269
+ box-shadow: var(--lb-elevation-shadow);
1270
+
1271
+ &::after {
1272
+ content: "";
1273
+ position: absolute;
1274
+ inset: 0;
1275
+ z-index: 1;
1276
+ border-radius: inherit;
1277
+ box-shadow: var(--lb-inset-shadow);
1278
+ pointer-events: none;
1279
+ }
1280
+ }
1281
+
1282
+ /*************************************
1283
+ * Elevation lists *
1284
+ *************************************/
1285
+
1286
+ .lb-dropdown,
1287
+ .lb-composer-suggestions {
1288
+ padding: $lb-elevation-list-padding;
1289
+ }
1290
+
1291
+ .lb-dropdown-item,
1292
+ .lb-composer-suggestions-list-item {
1293
+ display: flex;
1294
+ align-items: center;
1295
+ padding: calc(0.25 * var(--lb-spacing)) calc(0.5 * var(--lb-spacing));
1296
+ font-size: 0.875rem;
1297
+ }
1298
+
1299
+ .lb-dropdown-item,
1300
+ .lb-composer-suggestions-list-item,
1301
+ .lb-emoji-picker-emoji {
1302
+ border-radius: calc(var(--lb-radius) - 0.75 * $lb-elevation-list-padding);
1303
+ color: var(--lb-foreground-secondary);
1304
+ outline: none;
1305
+ cursor: pointer;
1306
+ user-select: none;
1307
+ transition-property: background, color, opacity;
1308
+ }
1309
+
1310
+ :is(
1311
+ .lb-dropdown-item,
1312
+ .lb-composer-suggestions-list-item,
1313
+ .lb-emoji-picker-emoji
1314
+ ) {
1315
+ &:where([data-highlighted], [data-selected]) {
1316
+ background: var(--lb-foreground-subtle);
1317
+ transition-duration: calc(var(--lb-transition-duration) / 2);
1318
+ }
1319
+
1320
+ &:where(:disabled, [data-disabled]) {
1321
+ opacity: 0.5;
1322
+ cursor: not-allowed;
1323
+ }
1324
+ }
1325
+
1326
+ /*************************************
1327
+ * Floating animations *
1328
+ *************************************/
1329
+
1330
+ .lb-dropdown,
1331
+ .lb-composer-suggestions,
1332
+ .lb-tooltip,
1333
+ .lb-emoji-picker {
1334
+ animation-duration: var(--lb-transition-duration);
1335
+ animation-timing-function: var(--lb-transition-easing);
1336
+ will-change: transform, opacity;
1337
+ }
1338
+
1339
+ :is(
1340
+ .lb-dropdown,
1341
+ .lb-emoji-picker,
1342
+ .lb-tooltip:where([data-state="delayed-open"]),
1343
+ .lb-composer-suggestions
1344
+ ) {
1345
+ &:where([data-side="top"]) {
1346
+ animation-name: lb-animation-slide-up;
1347
+ }
1348
+
1349
+ &:where([data-side="bottom"]) {
1350
+ animation-name: lb-animation-slide-down;
1351
+ }
1352
+ }
1353
+
1354
+ :is(.lb-dropdown, .lb-emoji-picker, .lb-tooltip, .lb-composer-suggestions) {
1355
+ &:where([data-state="closed"]) {
1356
+ animation-name: lb-animation-disappear;
1357
+ }
1358
+ }
1359
+
1360
+ @media (prefers-reduced-motion) {
1361
+ .lb-dropdown:where(:not([data-state="closed"])),
1362
+ .lb-emoji-picker:where(:not([data-state="closed"])),
1363
+ .lb-tooltip:where([data-state="delayed-open"]:not([data-state="closed"])),
1364
+ .lb-composer-suggestions:where(:not([data-state="closed"])) {
1365
+ animation-name: lb-animation-appear;
1366
+ }
1367
+ }
1368
+
1369
+ /*************************************
1370
+ * Animations *
1371
+ *************************************/
1372
+
1373
+ @keyframes lb-animation-slide-down {
1374
+ from {
1375
+ opacity: 0;
1376
+ transform: translateY(-4px);
1377
+ }
1378
+
1379
+ to {
1380
+ opacity: 1;
1381
+ transform: translateY(0);
1382
+ }
1383
+ }
1384
+
1385
+ @keyframes lb-animation-slide-up {
1386
+ from {
1387
+ opacity: 0;
1388
+ transform: translateY(4px);
1389
+ }
1390
+
1391
+ to {
1392
+ opacity: 1;
1393
+ transform: translateY(0);
1394
+ }
1395
+ }
1396
+
1397
+ @keyframes lb-animation-appear {
1398
+ from {
1399
+ opacity: 0;
1400
+ }
1401
+
1402
+ to {
1403
+ opacity: 1;
1404
+ }
1405
+ }
1406
+
1407
+ @keyframes lb-animation-disappear {
1408
+ from {
1409
+ opacity: 1;
1410
+ }
1411
+
1412
+ to {
1413
+ opacity: 0;
1414
+ }
1415
+ }
1416
+
1417
+ @keyframes lb-animation-shimmer {
1418
+ from,
1419
+ to {
1420
+ mask-image: linear-gradient(
1421
+ 90deg,
1422
+ rgb(0 0 0 / 50%),
1423
+ #000,
1424
+ #000,
1425
+ rgb(0 0 0 / 50%)
1426
+ );
1427
+ mask-size: 400% 100%;
1428
+ }
1429
+
1430
+ from {
1431
+ mask-position: 200% 0;
1432
+ }
1433
+
1434
+ to {
1435
+ mask-position: -200% 0;
1436
+ }
1437
+ }