@imsovikde/source-grab 1.0.1

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 (481) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +21 -0
  3. package/README.md +281 -0
  4. package/background/capture-registry.js +306 -0
  5. package/background/debugger-capture.js +171 -0
  6. package/background/download-engine.js +316 -0
  7. package/background/service-worker.js +426 -0
  8. package/content-scripts/auto-scroll.js +51 -0
  9. package/content-scripts/isolated-bridge.js +36 -0
  10. package/content-scripts/main-world-hook.js +278 -0
  11. package/design-tokens.css +67 -0
  12. package/icons/2-double-tap.svg +12 -0
  13. package/icons/2-scroll-left.svg +11 -0
  14. package/icons/2-scroll-right.svg +11 -0
  15. package/icons/2-scroll-up-1.svg +11 -0
  16. package/icons/2-scroll-up.svg +11 -0
  17. package/icons/2-tap-1.svg +15 -0
  18. package/icons/2-tap.svg +11 -0
  19. package/icons/2-touch-hold.svg +13 -0
  20. package/icons/3-scroll-down.svg +11 -0
  21. package/icons/3-scroll-up.svg +11 -0
  22. package/icons/3-tap-scroll.svg +13 -0
  23. package/icons/3-tap.svg +11 -0
  24. package/icons/analytics.svg +10 -0
  25. package/icons/anchor.svg +10 -0
  26. package/icons/apple.svg +11 -0
  27. package/icons/arrow-circle-down.svg +4 -0
  28. package/icons/arrow-circle-left.svg +4 -0
  29. package/icons/arrow-circle-right.svg +4 -0
  30. package/icons/arrow-circle-up.svg +4 -0
  31. package/icons/arrow-down-2.svg +3 -0
  32. package/icons/arrow-down.svg +11 -0
  33. package/icons/arrow-left.svg +3 -0
  34. package/icons/arrow-ne.svg +3 -0
  35. package/icons/arrow-nw.svg +3 -0
  36. package/icons/arrow-right.svg +3 -0
  37. package/icons/arrow-se.svg +3 -0
  38. package/icons/arrow-single-down.svg +3 -0
  39. package/icons/arrow-single-left.svg +3 -0
  40. package/icons/arrow-single-right.svg +3 -0
  41. package/icons/arrow-single-up.svg +3 -0
  42. package/icons/arrow-square-down.svg +4 -0
  43. package/icons/arrow-square-left.svg +4 -0
  44. package/icons/arrow-square-right.svg +4 -0
  45. package/icons/arrow-square-up.svg +4 -0
  46. package/icons/arrow-sw.svg +3 -0
  47. package/icons/arrow-up-2.svg +3 -0
  48. package/icons/arrow-up.svg +11 -0
  49. package/icons/arrow.svg +10 -0
  50. package/icons/at-the-rate.svg +10 -0
  51. package/icons/automation.svg +4 -0
  52. package/icons/backward.svg +11 -0
  53. package/icons/bag-2.svg +3 -0
  54. package/icons/bag.svg +3 -0
  55. package/icons/balloon-2.svg +10 -0
  56. package/icons/balloon.svg +10 -0
  57. package/icons/bank.svg +10 -0
  58. package/icons/basket.svg +6 -0
  59. package/icons/behance.svg +12 -0
  60. package/icons/bell-2.svg +10 -0
  61. package/icons/bell.svg +10 -0
  62. package/icons/bill.svg +19 -0
  63. package/icons/bisexual.svg +10 -0
  64. package/icons/blood-bag.svg +10 -0
  65. package/icons/blood.svg +12 -0
  66. package/icons/bluetooth.svg +10 -0
  67. package/icons/bookmark.svg +10 -0
  68. package/icons/bot.svg +6 -0
  69. package/icons/bottle.svg +15 -0
  70. package/icons/box-2.svg +6 -0
  71. package/icons/box.svg +3 -0
  72. package/icons/bug.svg +3 -0
  73. package/icons/bulb.svg +10 -0
  74. package/icons/burger.svg +16 -0
  75. package/icons/bus.svg +8 -0
  76. package/icons/cake.svg +10 -0
  77. package/icons/calculator.svg +15 -0
  78. package/icons/calendar.svg +15 -0
  79. package/icons/call.svg +12 -0
  80. package/icons/camera-2.svg +10 -0
  81. package/icons/camera.svg +12 -0
  82. package/icons/candy.svg +10 -0
  83. package/icons/car.svg +8 -0
  84. package/icons/card-2.svg +9 -0
  85. package/icons/card-3.svg +6 -0
  86. package/icons/card.svg +4 -0
  87. package/icons/cart-add.svg +4 -0
  88. package/icons/cart-delete.svg +4 -0
  89. package/icons/cart-remove.svg +4 -0
  90. package/icons/cash.svg +11 -0
  91. package/icons/caution.svg +12 -0
  92. package/icons/center-align-2.svg +10 -0
  93. package/icons/center-align.svg +13 -0
  94. package/icons/checklist.svg +4 -0
  95. package/icons/chevrons-down.svg +4 -0
  96. package/icons/chevrons-left.svg +4 -0
  97. package/icons/chevrons-right.svg +4 -0
  98. package/icons/chevrons-up.svg +4 -0
  99. package/icons/chip.svg +4 -0
  100. package/icons/clap.svg +14 -0
  101. package/icons/clock.svg +11 -0
  102. package/icons/cloud-down.svg +10 -0
  103. package/icons/cloud-up.svg +10 -0
  104. package/icons/cloud.svg +10 -0
  105. package/icons/cloudy-day.svg +15 -0
  106. package/icons/cloudy-night.svg +10 -0
  107. package/icons/codepen.svg +10 -0
  108. package/icons/coffee-cup-1.svg +7 -0
  109. package/icons/coffee-cup-2.svg +6 -0
  110. package/icons/coin-2.svg +11 -0
  111. package/icons/coin.svg +11 -0
  112. package/icons/confused-emoji.svg +8 -0
  113. package/icons/conveyor-belt.svg +8 -0
  114. package/icons/cookie.svg +14 -0
  115. package/icons/cool-emoji.svg +4 -0
  116. package/icons/copy.svg +10 -0
  117. package/icons/crop.svg +10 -0
  118. package/icons/cross.svg +10 -0
  119. package/icons/crown.svg +14 -0
  120. package/icons/crying-emoji.svg +4 -0
  121. package/icons/cut.svg +10 -0
  122. package/icons/cutlery.svg +11 -0
  123. package/icons/dashboard-2.svg +10 -0
  124. package/icons/dashboard-3.svg +11 -0
  125. package/icons/dashboard-4.svg +11 -0
  126. package/icons/dashboard.svg +11 -0
  127. package/icons/delete.svg +12 -0
  128. package/icons/diamond.svg +10 -0
  129. package/icons/dish.svg +10 -0
  130. package/icons/doc-add.svg +11 -0
  131. package/icons/doc-remove.svg +11 -0
  132. package/icons/doc.svg +15 -0
  133. package/icons/dollar-2.svg +11 -0
  134. package/icons/dollar.svg +10 -0
  135. package/icons/double-tap.svg +12 -0
  136. package/icons/download.svg +11 -0
  137. package/icons/drawer.svg +10 -0
  138. package/icons/dribbble.svg +10 -0
  139. package/icons/drink.svg +10 -0
  140. package/icons/dropbox.svg +10 -0
  141. package/icons/dropper.svg +10 -0
  142. package/icons/egg.svg +11 -0
  143. package/icons/eject.svg +12 -0
  144. package/icons/eraser.svg +10 -0
  145. package/icons/euro.svg +11 -0
  146. package/icons/facebook-2.svg +10 -0
  147. package/icons/facebook.svg +3 -0
  148. package/icons/factory.svg +7 -0
  149. package/icons/fast-forward.svg +10 -0
  150. package/icons/fast-rewind.svg +10 -0
  151. package/icons/fb-messenger.svg +11 -0
  152. package/icons/femaile.svg +10 -0
  153. package/icons/file-attachment.svg +10 -0
  154. package/icons/file-audio.svg +13 -0
  155. package/icons/file-code.svg +13 -0
  156. package/icons/file-contract.svg +15 -0
  157. package/icons/file-csv.svg +13 -0
  158. package/icons/file-figma.svg +14 -0
  159. package/icons/file-form.svg +15 -0
  160. package/icons/file-image-2.svg +12 -0
  161. package/icons/file-image.svg +12 -0
  162. package/icons/file-invoice.svg +15 -0
  163. package/icons/file-jpg.svg +13 -0
  164. package/icons/file-list.svg +17 -0
  165. package/icons/file-mov.svg +13 -0
  166. package/icons/file-mp4.svg +13 -0
  167. package/icons/file-notes.svg +12 -0
  168. package/icons/file-pdf.svg +13 -0
  169. package/icons/file-png.svg +13 -0
  170. package/icons/file-spreadsheet.svg +11 -0
  171. package/icons/file-svg.svg +13 -0
  172. package/icons/file-text.svg +14 -0
  173. package/icons/file-vector.svg +11 -0
  174. package/icons/file-zip.svg +10 -0
  175. package/icons/file.svg +10 -0
  176. package/icons/filter.svg +10 -0
  177. package/icons/fire.svg +5 -0
  178. package/icons/first-aid.svg +11 -0
  179. package/icons/firstaid-2.svg +12 -0
  180. package/icons/flag-2.svg +10 -0
  181. package/icons/flag.svg +10 -0
  182. package/icons/flashlight.svg +8 -0
  183. package/icons/flask-round.svg +10 -0
  184. package/icons/flask.svg +10 -0
  185. package/icons/flip.svg +12 -0
  186. package/icons/floppy.svg +11 -0
  187. package/icons/folded-hands.svg +12 -0
  188. package/icons/folder-add.svg +11 -0
  189. package/icons/folder-delete.svg +11 -0
  190. package/icons/folder-empty.svg +10 -0
  191. package/icons/folder-remove.svg +11 -0
  192. package/icons/folder.svg +10 -0
  193. package/icons/fork.svg +10 -0
  194. package/icons/forward.svg +11 -0
  195. package/icons/frame.svg +11 -0
  196. package/icons/franc.svg +11 -0
  197. package/icons/free-drag.svg +11 -0
  198. package/icons/gay.svg +10 -0
  199. package/icons/genderless.svg +10 -0
  200. package/icons/gift.svg +10 -0
  201. package/icons/globe.svg +10 -0
  202. package/icons/google.svg +10 -0
  203. package/icons/grid-2.svg +10 -0
  204. package/icons/grid.svg +10 -0
  205. package/icons/grinning-squinting-emoji.svg +6 -0
  206. package/icons/guitar.svg +10 -0
  207. package/icons/hand-truck.svg +5 -0
  208. package/icons/hand.svg +10 -0
  209. package/icons/happy-emoji.svg +8 -0
  210. package/icons/headphone.svg +10 -0
  211. package/icons/heart-beat.svg +10 -0
  212. package/icons/heart-eyes-emoji.svg +6 -0
  213. package/icons/heart.svg +10 -0
  214. package/icons/hetro.svg +10 -0
  215. package/icons/hide.svg +12 -0
  216. package/icons/home-1.svg +10 -0
  217. package/icons/home.svg +10 -0
  218. package/icons/horizontal-scroll.svg +12 -0
  219. package/icons/hot-air-balloon.svg +3 -0
  220. package/icons/ice-cream.svg +10 -0
  221. package/icons/icon.svg +12 -0
  222. package/icons/info.svg +5 -0
  223. package/icons/injection.svg +10 -0
  224. package/icons/instagram.svg +12 -0
  225. package/icons/intersex.svg +10 -0
  226. package/icons/key.svg +11 -0
  227. package/icons/laugh-emoji.svg +8 -0
  228. package/icons/layer.svg +10 -0
  229. package/icons/left-align-2.svg +12 -0
  230. package/icons/left-align.svg +13 -0
  231. package/icons/lesbian.svg +10 -0
  232. package/icons/link.svg +11 -0
  233. package/icons/linkedin.svg +13 -0
  234. package/icons/list.svg +15 -0
  235. package/icons/location-pin.svg +10 -0
  236. package/icons/location.svg +4 -0
  237. package/icons/lock.svg +11 -0
  238. package/icons/login.svg +11 -0
  239. package/icons/logout.svg +11 -0
  240. package/icons/lungs.svg +10 -0
  241. package/icons/magic-wand.svg +13 -0
  242. package/icons/mail-gift.svg +10 -0
  243. package/icons/mail-open.svg +10 -0
  244. package/icons/mail-surprise.svg +10 -0
  245. package/icons/mail.svg +10 -0
  246. package/icons/male.svg +10 -0
  247. package/icons/map.svg +13 -0
  248. package/icons/maximize.svg +13 -0
  249. package/icons/medical-logo.svg +10 -0
  250. package/icons/megaphone.svg +10 -0
  251. package/icons/menu-2.svg +12 -0
  252. package/icons/menu.svg +12 -0
  253. package/icons/message-2.svg +13 -0
  254. package/icons/message.svg +13 -0
  255. package/icons/mic-2.svg +11 -0
  256. package/icons/mic.svg +10 -0
  257. package/icons/microscope.svg +10 -0
  258. package/icons/minimize.svg +13 -0
  259. package/icons/money-plant.svg +11 -0
  260. package/icons/move.svg +10 -0
  261. package/icons/movie-clapper.svg +13 -0
  262. package/icons/multi-touch.svg +11 -0
  263. package/icons/music-2.svg +10 -0
  264. package/icons/music-3.svg +10 -0
  265. package/icons/music.svg +10 -0
  266. package/icons/mute.svg +11 -0
  267. package/icons/navigation-2.svg +10 -0
  268. package/icons/navigation.svg +10 -0
  269. package/icons/night.svg +10 -0
  270. package/icons/non-binary-transgender.svg +10 -0
  271. package/icons/note.svg +11 -0
  272. package/icons/offer.svg +9 -0
  273. package/icons/ok.svg +10 -0
  274. package/icons/other-gender.svg +10 -0
  275. package/icons/page-move.svg +11 -0
  276. package/icons/paint-brush-2.svg +10 -0
  277. package/icons/paint-brush.svg +10 -0
  278. package/icons/paint-bucket-2.svg +10 -0
  279. package/icons/paint-bucket.svg +10 -0
  280. package/icons/paint-roller.svg +10 -0
  281. package/icons/paper-clip-2.svg +10 -0
  282. package/icons/paper-clip.svg +10 -0
  283. package/icons/paste.svg +10 -0
  284. package/icons/pause.svg +11 -0
  285. package/icons/paypal.svg +10 -0
  286. package/icons/pen-tool.svg +10 -0
  287. package/icons/pen.svg +10 -0
  288. package/icons/pencil-2.svg +10 -0
  289. package/icons/pencil-3.svg +11 -0
  290. package/icons/pencil-ruler.svg +11 -0
  291. package/icons/pencil.svg +10 -0
  292. package/icons/phone-setting.svg +12 -0
  293. package/icons/phone.svg +11 -0
  294. package/icons/photo.svg +11 -0
  295. package/icons/pie.svg +11 -0
  296. package/icons/piggy-bank.svg +13 -0
  297. package/icons/pills.svg +10 -0
  298. package/icons/pin.svg +10 -0
  299. package/icons/pinterest.svg +10 -0
  300. package/icons/pizza-2.svg +10 -0
  301. package/icons/pizza.svg +33 -0
  302. package/icons/plane.svg +3 -0
  303. package/icons/play.svg +10 -0
  304. package/icons/png.svg +11 -0
  305. package/icons/point-down.svg +10 -0
  306. package/icons/point-left.svg +10 -0
  307. package/icons/point-right.svg +3 -0
  308. package/icons/point-up.svg +10 -0
  309. package/icons/popsicle.svg +10 -0
  310. package/icons/pound.svg +11 -0
  311. package/icons/product-hunt.svg +10 -0
  312. package/icons/puzzle-2.svg +10 -0
  313. package/icons/puzzle.svg +10 -0
  314. package/icons/qr.svg +21 -0
  315. package/icons/question-2.svg +11 -0
  316. package/icons/question.svg +11 -0
  317. package/icons/rain-heavy.svg +17 -0
  318. package/icons/rain-light.svg +13 -0
  319. package/icons/record.svg +11 -0
  320. package/icons/rectangle.svg +10 -0
  321. package/icons/right-align-2.svg +12 -0
  322. package/icons/right-align.svg +13 -0
  323. package/icons/rocket.svg +7 -0
  324. package/icons/rotate.svg +11 -0
  325. package/icons/rss.svg +13 -0
  326. package/icons/ruble.svg +11 -0
  327. package/icons/ruler.svg +10 -0
  328. package/icons/rupee.svg +11 -0
  329. package/icons/sad-emoji.svg +8 -0
  330. package/icons/safe.svg +13 -0
  331. package/icons/sale.svg +7 -0
  332. package/icons/satellite.svg +3 -0
  333. package/icons/saving.svg +15 -0
  334. package/icons/scan-2.svg +15 -0
  335. package/icons/scan-fingerprint.svg +20 -0
  336. package/icons/scan.svg +14 -0
  337. package/icons/screen-rotate.svg +12 -0
  338. package/icons/scroll-down.svg +11 -0
  339. package/icons/scroll-left-1.svg +11 -0
  340. package/icons/scroll-left.svg +11 -0
  341. package/icons/scroll-up.svg +11 -0
  342. package/icons/search.svg +10 -0
  343. package/icons/send-2.svg +10 -0
  344. package/icons/send-3.svg +11 -0
  345. package/icons/send.svg +10 -0
  346. package/icons/server-2.svg +15 -0
  347. package/icons/server.svg +3 -0
  348. package/icons/setting-2.svg +11 -0
  349. package/icons/setting-3.svg +10 -0
  350. package/icons/setting.svg +12 -0
  351. package/icons/shape.svg +10 -0
  352. package/icons/shield-2.svg +11 -0
  353. package/icons/shield.svg +11 -0
  354. package/icons/ship.svg +4 -0
  355. package/icons/shocked-emoji.svg +8 -0
  356. package/icons/shop.svg +4 -0
  357. package/icons/shopping-cart-2.svg +4 -0
  358. package/icons/shopping-cart-3.svg +4 -0
  359. package/icons/shopping-cart.svg +5 -0
  360. package/icons/shuffle.svg +10 -0
  361. package/icons/signal.svg +14 -0
  362. package/icons/skype.svg +11 -0
  363. package/icons/smiling-emoji.svg +6 -0
  364. package/icons/smiling-with-eyes-emoji.svg +8 -0
  365. package/icons/snapchat.svg +10 -0
  366. package/icons/snow.svg +22 -0
  367. package/icons/snowflake.svg +10 -0
  368. package/icons/snowman.svg +16 -0
  369. package/icons/sofa.svg +10 -0
  370. package/icons/speaker.svg +12 -0
  371. package/icons/spoon.svg +10 -0
  372. package/icons/spotify.svg +13 -0
  373. package/icons/square.svg +10 -0
  374. package/icons/star.svg +10 -0
  375. package/icons/stethoscope.svg +11 -0
  376. package/icons/stopwatch.svg +11 -0
  377. package/icons/suitcase.svg +10 -0
  378. package/icons/sun-2.svg +11 -0
  379. package/icons/sun-3.svg +18 -0
  380. package/icons/sun-4.svg +11 -0
  381. package/icons/sun.svg +18 -0
  382. package/icons/sunny.svg +18 -0
  383. package/icons/surprised-emoji.svg +8 -0
  384. package/icons/swipe-left.svg +11 -0
  385. package/icons/swipe-right.svg +11 -0
  386. package/icons/switch-1.svg +11 -0
  387. package/icons/switch.svg +10 -0
  388. package/icons/sync.svg +11 -0
  389. package/icons/tablet-2.svg +19 -0
  390. package/icons/tablet.svg +11 -0
  391. package/icons/tag-2.svg +3 -0
  392. package/icons/tag.svg +4 -0
  393. package/icons/tap-1.svg +15 -0
  394. package/icons/tap.svg +11 -0
  395. package/icons/target-2.svg +11 -0
  396. package/icons/target.svg +13 -0
  397. package/icons/test-tube.svg +10 -0
  398. package/icons/thumbs-down.svg +11 -0
  399. package/icons/thumbs-up-2.svg +11 -0
  400. package/icons/thumbs-up.svg +11 -0
  401. package/icons/thunderstorm.svg +11 -0
  402. package/icons/tick-2.svg +4 -0
  403. package/icons/tick.svg +3 -0
  404. package/icons/tik-tok.svg +10 -0
  405. package/icons/tooth.svg +12 -0
  406. package/icons/tornado.svg +25 -0
  407. package/icons/touch-hold.svg +13 -0
  408. package/icons/transform.svg +10 -0
  409. package/icons/transgender-2.svg +10 -0
  410. package/icons/transgender.svg +10 -0
  411. package/icons/tree-2.svg +10 -0
  412. package/icons/tree.svg +10 -0
  413. package/icons/trend-down-square.svg +11 -0
  414. package/icons/trend-down.svg +10 -0
  415. package/icons/trend-up-square.svg +11 -0
  416. package/icons/trend-up.svg +10 -0
  417. package/icons/trophy-2.svg +3 -0
  418. package/icons/trophy.svg +10 -0
  419. package/icons/truck.svg +4 -0
  420. package/icons/tumblr.svg +11 -0
  421. package/icons/tv.svg +11 -0
  422. package/icons/twitch.svg +13 -0
  423. package/icons/twitter.svg +10 -0
  424. package/icons/uber.svg +10 -0
  425. package/icons/unbox.svg +3 -0
  426. package/icons/unhide.svg +11 -0
  427. package/icons/unlink.svg +12 -0
  428. package/icons/upload.svg +11 -0
  429. package/icons/user-add.svg +12 -0
  430. package/icons/user-caution.svg +13 -0
  431. package/icons/user-delete.svg +12 -0
  432. package/icons/user-female.svg +11 -0
  433. package/icons/user-male.svg +11 -0
  434. package/icons/user-remove.svg +12 -0
  435. package/icons/user.svg +11 -0
  436. package/icons/v.svg +10 -0
  437. package/icons/vector.svg +10 -0
  438. package/icons/vibrate.svg +15 -0
  439. package/icons/video-camera.svg +10 -0
  440. package/icons/volume-down.svg +11 -0
  441. package/icons/volume-up.svg +12 -0
  442. package/icons/wallet.svg +11 -0
  443. package/icons/warehouse.svg +3 -0
  444. package/icons/water.svg +10 -0
  445. package/icons/wave-left.svg +11 -0
  446. package/icons/wave-right.svg +11 -0
  447. package/icons/webflow.svg +10 -0
  448. package/icons/whatsapp.svg +11 -0
  449. package/icons/wheelchair.svg +11 -0
  450. package/icons/wind.svg +14 -0
  451. package/icons/windows.svg +10 -0
  452. package/icons/wink-emoji.svg +6 -0
  453. package/icons/won.svg +11 -0
  454. package/icons/worried-emoji.svg +8 -0
  455. package/icons/y-combinator.svg +10 -0
  456. package/icons/yen.svg +11 -0
  457. package/icons/youtube.svg +11 -0
  458. package/icons/zap.svg +10 -0
  459. package/icons/zoom-in-2.svg +12 -0
  460. package/icons/zoom-in.svg +11 -0
  461. package/icons/zoom-out-1.svg +11 -0
  462. package/icons/zoom-out-2.svg +11 -0
  463. package/icons/zoom-out.svg +11 -0
  464. package/manifest.json +43 -0
  465. package/package.json +53 -0
  466. package/sidepanel/app.js +437 -0
  467. package/sidepanel/components/bottom-dock.js +148 -0
  468. package/sidepanel/components/empty-state.js +40 -0
  469. package/sidepanel/components/file-list-item.js +58 -0
  470. package/sidepanel/components/file-list.js +134 -0
  471. package/sidepanel/components/filter-bar.js +261 -0
  472. package/sidepanel/components/progress-overlay.js +79 -0
  473. package/sidepanel/components/recording-indicator.js +32 -0
  474. package/sidepanel/components/stats-header.js +37 -0
  475. package/sidepanel/icons/file-type-icons.svg +55 -0
  476. package/sidepanel/icons/ui-icons.svg +85 -0
  477. package/sidepanel/index.html +37 -0
  478. package/sidepanel/styles.css +934 -0
  479. package/sidepanel/utils/clipboard.js +33 -0
  480. package/sidepanel/utils/format.js +23 -0
  481. package/sidepanel/utils/virtual-scroll.js +107 -0
@@ -0,0 +1,934 @@
1
+ @import url('../design-tokens.css');
2
+
3
+ *, *::before, *::after {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ html {
10
+ height: 100%;
11
+ }
12
+
13
+ body {
14
+ background-color: var(--canvas);
15
+ font-family: var(--font-ui);
16
+ color: var(--text-primary);
17
+ display: flex;
18
+ flex-direction: column;
19
+ height: 100%;
20
+ overflow: hidden;
21
+ -webkit-font-smoothing: antialiased;
22
+ -moz-osx-font-smoothing: grayscale;
23
+ }
24
+
25
+ /* ─── Scrollbar ─── */
26
+
27
+ ::-webkit-scrollbar {
28
+ width: 0 !important;
29
+ height: 0 !important;
30
+ display: none;
31
+ }
32
+
33
+ /* ─── Header (Glassmorphism Surround) ─── */
34
+
35
+ #sg-header {
36
+ position: sticky;
37
+ top: 0;
38
+ background-color: rgba(247, 243, 236, 0.88);
39
+ backdrop-filter: blur(14px) saturate(1.3);
40
+ -webkit-backdrop-filter: blur(14px) saturate(1.3);
41
+ z-index: 10;
42
+ padding: var(--space-md) var(--space-md) 0 var(--space-md);
43
+ border-bottom: 1px solid rgba(0, 0, 0, 0.04);
44
+ animation: headerSlideDown 0.35s var(--transition-spring) both;
45
+ }
46
+
47
+ .sg-logo-row {
48
+ display: flex;
49
+ justify-content: space-between;
50
+ align-items: center;
51
+ margin-bottom: var(--space-sm);
52
+ min-width: 0;
53
+ overflow: hidden;
54
+ }
55
+
56
+ .sg-logo {
57
+ font-family: var(--font-display);
58
+ font-weight: 700;
59
+ font-size: 22px;
60
+ color: var(--text-primary);
61
+ letter-spacing: -0.5px;
62
+ flex-shrink: 0;
63
+ min-width: 0;
64
+ }
65
+
66
+ .sg-header-right {
67
+ display: flex;
68
+ align-items: center;
69
+ gap: 8px;
70
+ flex-shrink: 0;
71
+ }
72
+
73
+ .header-clear-btn {
74
+ width: 30px;
75
+ height: 30px;
76
+ border-radius: 50%;
77
+ border: 1px solid rgba(0,0,0,0.08);
78
+ background: transparent;
79
+ cursor: pointer;
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ color: var(--text-tertiary);
84
+ transition: all var(--transition-fast);
85
+ flex-shrink: 0;
86
+ }
87
+ .header-clear-btn:hover {
88
+ background: rgba(211, 91, 91, 0.08);
89
+ color: var(--danger);
90
+ border-color: var(--danger);
91
+ }
92
+ .header-clear-btn:active {
93
+ scale: 0.88;
94
+ transition: scale var(--transition-press);
95
+ }
96
+
97
+ /* ─── Stats Header ─── */
98
+
99
+ .stats-header-container {
100
+ font-family: var(--font-ui);
101
+ font-size: 13px;
102
+ color: var(--text-secondary);
103
+ padding-bottom: var(--space-sm);
104
+ display: flex;
105
+ align-items: center;
106
+ gap: var(--space-sm);
107
+ flex-wrap: wrap;
108
+ min-width: 0;
109
+ }
110
+
111
+ .stats-count {
112
+ font-weight: 600;
113
+ color: var(--text-primary);
114
+ font-family: var(--font-display);
115
+ font-size: 15px;
116
+ }
117
+
118
+ .stats-domain {
119
+ font-size: 11px;
120
+ color: var(--text-tertiary);
121
+ margin-left: auto;
122
+ overflow: hidden;
123
+ text-overflow: ellipsis;
124
+ white-space: nowrap;
125
+ max-width: 140px;
126
+ }
127
+
128
+ /* ─── Main ─── */
129
+
130
+ #sg-main {
131
+ flex-grow: 1;
132
+ display: flex;
133
+ flex-direction: column;
134
+ overflow: hidden;
135
+ position: relative;
136
+ padding-bottom: calc(var(--bottom-dock-height) + var(--space-lg));
137
+ }
138
+
139
+ /* ─── File List Container ─── */
140
+
141
+ #file-list-container {
142
+ flex-grow: 1;
143
+ overflow-y: auto;
144
+ position: relative;
145
+ padding: 0 var(--space-sm);
146
+ scrollbar-width: none;
147
+ -ms-overflow-style: none;
148
+ }
149
+
150
+ /* ─── File Item ─── */
151
+
152
+ .file-item {
153
+ height: var(--file-item-height);
154
+ display: flex;
155
+ flex-direction: row;
156
+ align-items: center;
157
+ padding: 0 var(--space-sm) 0 var(--space-md);
158
+ margin-bottom: 3px;
159
+ border-radius: var(--radius-modal);
160
+ background-color: var(--surface);
161
+ transition: transform var(--transition-fast), background-color var(--transition-fast), box-shadow var(--transition-fast);
162
+ cursor: pointer;
163
+ position: relative;
164
+ gap: var(--space-sm);
165
+ }
166
+
167
+ .file-item > * {
168
+ min-width: 0;
169
+ overflow: hidden;
170
+ }
171
+
172
+ .file-item:hover {
173
+ transform: translateY(-1px) scale(1.005);
174
+ background-color: var(--surface-elevated);
175
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
176
+ }
177
+
178
+ .file-item:active {
179
+ transform: scale(0.98);
180
+ transition: transform var(--transition-press);
181
+ }
182
+
183
+ .file-item.is-new {
184
+ border-left: 3px solid var(--cat-images);
185
+ }
186
+
187
+ /* ─── Custom Checkbox ─── */
188
+
189
+ .file-item-checkbox {
190
+ appearance: none;
191
+ -webkit-appearance: none;
192
+ width: 18px;
193
+ height: 18px;
194
+ border-radius: 5px;
195
+ border: 1.5px solid var(--text-tertiary);
196
+ position: relative;
197
+ cursor: pointer;
198
+ outline: none;
199
+ flex-shrink: 0;
200
+ transition: all var(--transition-fast);
201
+ }
202
+ .file-item-checkbox:hover {
203
+ border-color: var(--text-secondary);
204
+ transform: scale(1.1);
205
+ }
206
+ .file-item-checkbox:checked {
207
+ background-color: var(--text-primary);
208
+ border-color: var(--text-primary);
209
+ animation: checkBounce 0.25s var(--transition-spring);
210
+ }
211
+ .file-item-checkbox:checked::after {
212
+ content: '';
213
+ position: absolute;
214
+ top: 2px;
215
+ left: 5px;
216
+ width: 4px;
217
+ height: 8px;
218
+ border: solid var(--surface);
219
+ border-width: 0 2px 2px 0;
220
+ transform: rotate(45deg);
221
+ }
222
+
223
+ /* ─── File Item Parts ─── */
224
+
225
+ .file-item-icon {
226
+ width: 22px;
227
+ height: 22px;
228
+ display: flex;
229
+ align-items: center;
230
+ justify-content: center;
231
+ flex-shrink: 0;
232
+ }
233
+ .file-item-icon svg {
234
+ width: 100%;
235
+ height: 100%;
236
+ }
237
+
238
+ .file-item-info {
239
+ flex-grow: 1;
240
+ overflow: hidden;
241
+ display: flex;
242
+ flex-direction: column;
243
+ gap: 1px;
244
+ min-width: 0;
245
+ }
246
+
247
+ .file-item-name {
248
+ font-family: var(--font-ui);
249
+ font-weight: 500;
250
+ font-size: 13px;
251
+ white-space: nowrap;
252
+ overflow: hidden;
253
+ text-overflow: ellipsis;
254
+ color: var(--text-primary);
255
+ }
256
+
257
+ .file-item-url {
258
+ font-family: var(--font-ui);
259
+ font-weight: 400;
260
+ font-size: 10px;
261
+ color: var(--text-tertiary);
262
+ white-space: nowrap;
263
+ overflow: hidden;
264
+ text-overflow: ellipsis;
265
+ }
266
+
267
+ .file-item-badge {
268
+ padding: 2px 7px;
269
+ border-radius: var(--radius-pill);
270
+ font-family: var(--font-ui);
271
+ font-weight: 600;
272
+ font-size: 9px;
273
+ text-transform: uppercase;
274
+ letter-spacing: 0.5px;
275
+ flex-shrink: 0;
276
+ white-space: nowrap;
277
+ }
278
+
279
+ .file-item-size {
280
+ font-family: var(--font-ui);
281
+ font-weight: 400;
282
+ font-size: 11px;
283
+ color: var(--text-secondary);
284
+ min-width: 48px;
285
+ text-align: right;
286
+ flex-shrink: 0;
287
+ }
288
+
289
+ /* ─── Filter Bar ─── */
290
+
291
+ .filter-bar-container {
292
+ display: flex;
293
+ flex-direction: column;
294
+ gap: var(--space-sm);
295
+ padding: var(--space-sm) var(--space-md) var(--space-sm);
296
+ flex-shrink: 0;
297
+ }
298
+
299
+ .filter-bar-container .controls-row,
300
+ .filter-bar-container > div:first-child:not(.chip-row) {
301
+ display: flex;
302
+ flex-wrap: wrap;
303
+ gap: var(--space-sm);
304
+ }
305
+
306
+ .search-input-wrapper {
307
+ position: relative;
308
+ flex-grow: 1;
309
+ }
310
+ .search-input-wrapper svg {
311
+ position: absolute;
312
+ left: 12px;
313
+ top: 50%;
314
+ transform: translateY(-50%);
315
+ color: var(--text-tertiary);
316
+ pointer-events: none;
317
+ }
318
+ .search-input {
319
+ width: 100%;
320
+ height: 36px;
321
+ border-radius: var(--radius-input);
322
+ border: 1px solid rgba(0,0,0,0.08);
323
+ background-color: var(--surface);
324
+ padding: 0 12px 0 36px;
325
+ font-family: var(--font-ui);
326
+ font-size: 13px;
327
+ outline: none;
328
+ color: var(--text-primary);
329
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
330
+ }
331
+ .search-input:focus {
332
+ border-color: var(--accent);
333
+ box-shadow: 0 0 0 3px rgba(224, 151, 122, 0.12);
334
+ }
335
+ .search-input::placeholder {
336
+ color: var(--text-tertiary);
337
+ }
338
+
339
+ /* ─── Filter Chips ─── */
340
+
341
+ .chip-row {
342
+ display: flex;
343
+ flex-wrap: wrap;
344
+ gap: 6px;
345
+ padding-bottom: 2px;
346
+ scrollbar-width: none;
347
+ -ms-overflow-style: none;
348
+ }
349
+
350
+ .filter-chip {
351
+ height: 30px;
352
+ border-radius: var(--radius-pill);
353
+ border: 1.5px solid var(--text-tertiary);
354
+ background-color: transparent;
355
+ padding: 0 10px;
356
+ font-family: var(--font-ui);
357
+ font-weight: 500;
358
+ font-size: 12px;
359
+ cursor: pointer;
360
+ transition: all var(--transition-fast);
361
+ white-space: nowrap;
362
+ display: flex;
363
+ align-items: center;
364
+ gap: 4px;
365
+ color: var(--text-secondary);
366
+ outline: none;
367
+ position: relative;
368
+ overflow: hidden;
369
+ }
370
+ .filter-chip:hover {
371
+ opacity: 0.85;
372
+ transform: scale(1.03);
373
+ }
374
+ .filter-chip:active {
375
+ transform: scale(0.93);
376
+ transition: transform var(--transition-press);
377
+ }
378
+ .filter-chip .chip-count {
379
+ font-size: 10px;
380
+ }
381
+
382
+ /* Chip ripple effect */
383
+ .filter-chip::after {
384
+ content: '';
385
+ position: absolute;
386
+ inset: 0;
387
+ background: radial-gradient(circle, rgba(255,255,255,0.4) 10%, transparent 70%);
388
+ opacity: 0;
389
+ transition: opacity 0.3s ease;
390
+ pointer-events: none;
391
+ }
392
+ .filter-chip:active::after {
393
+ opacity: 1;
394
+ }
395
+
396
+ /* ─── Custom Dropdown (replaces native <select>) ─── */
397
+
398
+ .custom-dropdown {
399
+ position: relative;
400
+ display: inline-block;
401
+ }
402
+
403
+ .dropdown-trigger {
404
+ display: flex;
405
+ align-items: center;
406
+ gap: 6px;
407
+ padding: 5px 10px;
408
+ border-radius: 8px;
409
+ border: 1px solid rgba(0,0,0,0.08);
410
+ background: var(--surface);
411
+ color: var(--text-primary);
412
+ font-family: var(--font-ui);
413
+ font-size: 12px;
414
+ cursor: pointer;
415
+ transition: all var(--transition-fast);
416
+ outline: none;
417
+ white-space: nowrap;
418
+ user-select: none;
419
+ }
420
+ .dropdown-trigger:hover {
421
+ border-color: var(--text-tertiary);
422
+ }
423
+ .dropdown-trigger:active {
424
+ transform: scale(0.96);
425
+ transition: transform var(--transition-press);
426
+ }
427
+ .dropdown-trigger svg {
428
+ width: 12px;
429
+ height: 12px;
430
+ transition: transform var(--transition-fast);
431
+ flex-shrink: 0;
432
+ }
433
+ .dropdown-trigger.open svg {
434
+ transform: rotate(180deg);
435
+ }
436
+
437
+ .dropdown-menu {
438
+ position: absolute;
439
+ top: calc(100% + 4px);
440
+ left: 0;
441
+ min-width: 140px;
442
+ background: var(--surface);
443
+ border-radius: var(--radius-modal);
444
+ border: 1px solid rgba(0,0,0,0.08);
445
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1), 0 2px 8px rgba(0, 0, 0, 0.04);
446
+ z-index: 50;
447
+ padding: 4px;
448
+ transform-origin: top left;
449
+ animation: dropdownOpen 0.2s var(--transition-spring) both;
450
+ overflow: hidden;
451
+ }
452
+
453
+ .dropdown-menu.closing {
454
+ animation: dropdownClose 0.15s ease-out both;
455
+ }
456
+
457
+ .dropdown-option {
458
+ display: block;
459
+ width: 100%;
460
+ padding: 7px 12px;
461
+ border: none;
462
+ background: transparent;
463
+ color: var(--text-secondary);
464
+ font-family: var(--font-ui);
465
+ font-size: 12px;
466
+ cursor: pointer;
467
+ border-radius: 8px;
468
+ text-align: left;
469
+ transition: all var(--transition-fast);
470
+ }
471
+ .dropdown-option:hover {
472
+ background: rgba(0,0,0,0.04);
473
+ color: var(--text-primary);
474
+ }
475
+ .dropdown-option.active {
476
+ background: var(--accent);
477
+ color: white;
478
+ font-weight: 500;
479
+ }
480
+
481
+ /* ─── Filter Controls ─── */
482
+
483
+ .filter-toggle {
484
+ border-radius: var(--radius-pill);
485
+ border: 1px solid rgba(0,0,0,0.08);
486
+ background: transparent;
487
+ color: var(--text-secondary);
488
+ padding: 5px 12px;
489
+ font-family: var(--font-ui);
490
+ font-size: 12px;
491
+ cursor: pointer;
492
+ transition: all var(--transition-fast);
493
+ white-space: nowrap;
494
+ }
495
+ .filter-toggle:hover {
496
+ border-color: var(--text-tertiary);
497
+ }
498
+ .filter-toggle:active {
499
+ transform: scale(0.93);
500
+ transition: transform var(--transition-press);
501
+ }
502
+ .filter-toggle.active {
503
+ background: var(--text-primary);
504
+ color: var(--canvas);
505
+ border-color: var(--text-primary);
506
+ }
507
+
508
+ /* ─── Bottom Dock (Glassmorphism Surround) ─── */
509
+
510
+ #bottom-dock {
511
+ position: fixed;
512
+ bottom: var(--space-md);
513
+ left: 50%;
514
+ transform: translateX(-50%);
515
+ height: var(--bottom-dock-height);
516
+ width: calc(100% - var(--space-lg));
517
+ border-radius: var(--radius-card);
518
+ background-color: rgba(255, 253, 248, 0.88);
519
+ backdrop-filter: blur(18px) saturate(1.3);
520
+ -webkit-backdrop-filter: blur(18px) saturate(1.3);
521
+ display: flex;
522
+ align-items: center;
523
+ justify-content: center;
524
+ padding: 0 4px;
525
+ gap: 2px;
526
+ border: 1px solid rgba(255, 255, 255, 0.6);
527
+ box-shadow: 0 -4px 24px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(0, 0, 0, 0.02);
528
+ z-index: 100;
529
+ animation: dockSlideUp 0.4s var(--transition-spring) both;
530
+ }
531
+
532
+ .dock-btn {
533
+ border: none;
534
+ background: transparent;
535
+ display: flex;
536
+ flex-direction: column;
537
+ align-items: center;
538
+ justify-content: center;
539
+ gap: 3px;
540
+ cursor: pointer;
541
+ color: var(--text-secondary);
542
+ font-family: var(--font-ui);
543
+ font-weight: 500;
544
+ font-size: 10px;
545
+ padding: 6px 4px;
546
+ border-radius: 12px;
547
+ transition: all var(--transition-fast);
548
+ outline: none;
549
+ white-space: nowrap;
550
+ position: relative;
551
+ flex-shrink: 1;
552
+ min-width: 0;
553
+ }
554
+ .dock-btn svg {
555
+ flex-shrink: 0;
556
+ transition: transform var(--transition-fast);
557
+ }
558
+ .dock-btn:hover {
559
+ background-color: rgba(0,0,0,0.04);
560
+ color: var(--text-primary);
561
+ }
562
+ .dock-btn:hover svg {
563
+ transform: scale(1.1);
564
+ }
565
+ .dock-btn:active {
566
+ scale: 0.88;
567
+ transition: scale var(--transition-press);
568
+ }
569
+ .dock-btn.primary {
570
+ background: linear-gradient(135deg, #E0977A, #D48669);
571
+ color: #FFFFFF;
572
+ padding: 6px 14px;
573
+ font-weight: 600;
574
+ border-radius: var(--radius-pill);
575
+ box-shadow: 0 2px 8px rgba(224, 151, 122, 0.3);
576
+ }
577
+ .dock-btn.primary:hover {
578
+ background: linear-gradient(135deg, #D48669, #C87A5D);
579
+ box-shadow: 0 4px 12px rgba(224, 151, 122, 0.4);
580
+ }
581
+ .dock-btn.primary:active {
582
+ scale: 0.92;
583
+ box-shadow: 0 1px 4px rgba(224, 151, 122, 0.3);
584
+ }
585
+ .dock-btn.danger {
586
+ color: var(--danger);
587
+ }
588
+ .dock-btn.danger:hover {
589
+ background-color: rgba(211, 91, 91, 0.08);
590
+ }
591
+ .dock-btn.success {
592
+ color: var(--success);
593
+ }
594
+
595
+ @media (max-width: 380px) {
596
+ .dock-btn .dock-btn-label {
597
+ display: none;
598
+ }
599
+ }
600
+
601
+ /* Copy success animation */
602
+ .dock-btn.copied {
603
+ color: var(--success) !important;
604
+ animation: copySuccess 0.4s var(--transition-spring);
605
+ }
606
+ .dock-btn.copied svg {
607
+ transform: scale(1.2) rotate(10deg);
608
+ }
609
+
610
+ /* ─── Progress Overlay ─── */
611
+
612
+ #progress-overlay {
613
+ position: fixed;
614
+ inset: 0;
615
+ background-color: var(--surface-overlay);
616
+ z-index: 200;
617
+ display: none;
618
+ align-items: center;
619
+ justify-content: center;
620
+ }
621
+ #progress-overlay.active {
622
+ display: flex;
623
+ animation: fadeIn var(--transition-normal);
624
+ }
625
+
626
+ .progress-card {
627
+ background-color: var(--surface);
628
+ border-radius: var(--radius-card);
629
+ padding: var(--space-lg);
630
+ width: 90%;
631
+ max-width: 380px;
632
+ max-height: 80vh;
633
+ display: flex;
634
+ flex-direction: column;
635
+ border: 1px solid rgba(0,0,0,0.06);
636
+ animation: scaleIn 0.3s var(--transition-spring) both;
637
+ }
638
+
639
+ .progress-title {
640
+ font-family: var(--font-display);
641
+ font-weight: 600;
642
+ font-size: 18px;
643
+ text-align: center;
644
+ margin-bottom: var(--space-md);
645
+ color: var(--text-primary);
646
+ }
647
+
648
+ .progress-bar-container {
649
+ width: 100%;
650
+ height: 6px;
651
+ border-radius: var(--radius-pill);
652
+ background-color: rgba(0,0,0,0.06);
653
+ overflow: hidden;
654
+ margin-bottom: var(--space-sm);
655
+ }
656
+
657
+ .progress-bar-fill {
658
+ height: 100%;
659
+ border-radius: var(--radius-pill);
660
+ background: linear-gradient(90deg, var(--accent), var(--accent-hover));
661
+ transition: width var(--transition-normal);
662
+ }
663
+
664
+ .progress-counter {
665
+ font-family: var(--font-ui);
666
+ font-size: 12px;
667
+ color: var(--text-secondary);
668
+ text-align: center;
669
+ margin-bottom: var(--space-md);
670
+ }
671
+
672
+ .progress-items-list {
673
+ flex-grow: 1;
674
+ overflow-y: auto;
675
+ max-height: 300px;
676
+ margin-bottom: var(--space-md);
677
+ scrollbar-width: none;
678
+ -ms-overflow-style: none;
679
+ }
680
+
681
+ .progress-item {
682
+ display: flex;
683
+ align-items: center;
684
+ gap: var(--space-sm);
685
+ padding: 6px 0;
686
+ border-bottom: 1px solid rgba(0,0,0,0.04);
687
+ font-size: 12px;
688
+ }
689
+
690
+ .progress-item-icon {
691
+ font-size: 14px;
692
+ flex-shrink: 0;
693
+ }
694
+
695
+ .progress-item-name {
696
+ flex-grow: 1;
697
+ overflow: hidden;
698
+ text-overflow: ellipsis;
699
+ white-space: nowrap;
700
+ color: var(--text-primary);
701
+ font-weight: 500;
702
+ }
703
+
704
+ .progress-item-status {
705
+ color: var(--text-tertiary);
706
+ font-size: 11px;
707
+ flex-shrink: 0;
708
+ }
709
+
710
+ .progress-retry-btn {
711
+ background: none;
712
+ border: 1px solid var(--danger);
713
+ color: var(--danger);
714
+ border-radius: 6px;
715
+ padding: 2px 8px;
716
+ font-size: 10px;
717
+ cursor: pointer;
718
+ font-family: var(--font-ui);
719
+ transition: all var(--transition-fast);
720
+ }
721
+ .progress-retry-btn:hover {
722
+ background: var(--danger);
723
+ color: white;
724
+ }
725
+
726
+ .progress-cancel-btn {
727
+ width: 100%;
728
+ padding: 10px;
729
+ border-radius: var(--radius-pill);
730
+ border: 1.5px solid rgba(0,0,0,0.1);
731
+ background: transparent;
732
+ color: var(--text-secondary);
733
+ font-family: var(--font-ui);
734
+ font-weight: 500;
735
+ font-size: 13px;
736
+ cursor: pointer;
737
+ transition: all var(--transition-fast);
738
+ }
739
+ .progress-cancel-btn:hover {
740
+ background: rgba(0,0,0,0.04);
741
+ color: var(--text-primary);
742
+ }
743
+ .progress-cancel-btn:active {
744
+ transform: scale(0.96);
745
+ transition: transform var(--transition-press);
746
+ }
747
+
748
+ /* ─── Empty State ─── */
749
+
750
+ #empty-state {
751
+ position: absolute;
752
+ inset: 0;
753
+ display: none;
754
+ flex-direction: column;
755
+ align-items: center;
756
+ justify-content: center;
757
+ text-align: center;
758
+ padding: var(--space-xl);
759
+ z-index: -1;
760
+ pointer-events: none;
761
+ }
762
+ #empty-state.active {
763
+ display: flex;
764
+ z-index: 1;
765
+ pointer-events: auto;
766
+ animation: fadeIn 0.3s ease-out both;
767
+ }
768
+
769
+ .empty-decoration {
770
+ width: 80px;
771
+ height: 80px;
772
+ border-radius: 50%;
773
+ background-image: radial-gradient(var(--text-tertiary) 1px, transparent 1px);
774
+ background-size: 8px 8px;
775
+ opacity: 0.3;
776
+ margin-bottom: var(--space-md);
777
+ animation: emptyPulse 3s ease-in-out infinite;
778
+ }
779
+
780
+ .empty-title {
781
+ font-family: var(--font-display);
782
+ font-weight: 600;
783
+ font-size: 18px;
784
+ color: var(--text-primary);
785
+ margin-bottom: var(--space-xs);
786
+ }
787
+
788
+ .empty-subtitle {
789
+ font-family: var(--font-ui);
790
+ font-size: 13px;
791
+ color: var(--text-tertiary);
792
+ }
793
+
794
+ /* ─── Recording Indicator ─── */
795
+
796
+ .recording-indicator {
797
+ display: flex;
798
+ align-items: center;
799
+ gap: 6px;
800
+ font-family: var(--font-ui);
801
+ font-size: 12px;
802
+ font-weight: 500;
803
+ color: var(--text-secondary);
804
+ background-color: var(--surface);
805
+ padding: 4px 12px;
806
+ border-radius: var(--radius-pill);
807
+ transition: all var(--transition-fast);
808
+ flex-shrink: 1;
809
+ min-width: 0;
810
+ overflow: hidden;
811
+ }
812
+
813
+ .recording-dot {
814
+ width: 8px;
815
+ height: 8px;
816
+ border-radius: 50%;
817
+ background-color: var(--success);
818
+ flex-shrink: 0;
819
+ will-change: transform;
820
+ transition: background-color var(--transition-fast), transform var(--transition-fast);
821
+ }
822
+
823
+ .recording-dot.active {
824
+ background-color: #E26A6A;
825
+ animation: pulse 2s ease-in-out infinite;
826
+ }
827
+
828
+ .deep-scan-badge {
829
+ font-size: 9px;
830
+ font-weight: 600;
831
+ text-transform: uppercase;
832
+ letter-spacing: 0.5px;
833
+ color: var(--cat-svg-text);
834
+ background-color: var(--cat-svg);
835
+ padding: 1px 6px;
836
+ border-radius: var(--radius-pill);
837
+ margin-left: 4px;
838
+ animation: badgeIn 0.3s var(--transition-spring) both;
839
+ }
840
+
841
+ /* ─── Toast (Spring Physics) ─── */
842
+
843
+ #toast-container {
844
+ position: fixed;
845
+ bottom: 100px;
846
+ left: 50%;
847
+ transform: translateX(-50%);
848
+ z-index: 300;
849
+ display: flex;
850
+ flex-direction: column;
851
+ gap: 8px;
852
+ pointer-events: none;
853
+ }
854
+ .toast {
855
+ background-color: var(--text-primary);
856
+ color: var(--surface);
857
+ padding: 10px 20px;
858
+ border-radius: var(--radius-pill);
859
+ font-family: var(--font-ui);
860
+ font-size: 13px;
861
+ font-weight: 500;
862
+ animation: toastSpring 0.45s var(--transition-spring) both;
863
+ white-space: nowrap;
864
+ pointer-events: auto;
865
+ box-shadow: 0 4px 16px rgba(0,0,0,0.15);
866
+ }
867
+
868
+ /* ─── Animations ─── */
869
+
870
+ @keyframes pulse {
871
+ 0% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(226, 106, 106, 0.6); }
872
+ 70% { transform: scale(1); box-shadow: 0 0 0 6px rgba(226, 106, 106, 0); }
873
+ 100% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(226, 106, 106, 0); }
874
+ }
875
+
876
+ @keyframes fadeIn {
877
+ from { opacity: 0; }
878
+ to { opacity: 1; }
879
+ }
880
+
881
+ @keyframes scaleIn {
882
+ from { transform: scale(0.92); opacity: 0; }
883
+ to { transform: scale(1); opacity: 1; }
884
+ }
885
+
886
+ @keyframes headerSlideDown {
887
+ from { transform: translateY(-10px); opacity: 0; }
888
+ to { transform: translateY(0); opacity: 1; }
889
+ }
890
+
891
+ @keyframes dockSlideUp {
892
+ from { transform: translateX(-50%) translateY(20px); opacity: 0; }
893
+ to { transform: translateX(-50%) translateY(0); opacity: 1; }
894
+ }
895
+
896
+ /* fileItemFadeIn removed — caused blinking on every new file */
897
+
898
+ @keyframes toastSpring {
899
+ 0% { transform: translateY(30px) scale(0.9); opacity: 0; }
900
+ 50% { transform: translateY(-3px) scale(1.02); opacity: 1; }
901
+ 100% { transform: translateY(0) scale(1); opacity: 1; }
902
+ }
903
+
904
+ @keyframes checkBounce {
905
+ 0% { transform: scale(0.7); }
906
+ 50% { transform: scale(1.15); }
907
+ 100% { transform: scale(1); }
908
+ }
909
+
910
+ @keyframes copySuccess {
911
+ 0% { transform: scale(1); }
912
+ 30% { transform: scale(1.15); }
913
+ 100% { transform: scale(1); }
914
+ }
915
+
916
+ @keyframes badgeIn {
917
+ from { transform: scale(0.5); opacity: 0; }
918
+ to { transform: scale(1); opacity: 1; }
919
+ }
920
+
921
+ @keyframes dropdownOpen {
922
+ from { transform: scaleY(0.8) scaleX(0.95); opacity: 0; }
923
+ to { transform: scaleY(1) scaleX(1); opacity: 1; }
924
+ }
925
+
926
+ @keyframes dropdownClose {
927
+ from { transform: scaleY(1); opacity: 1; }
928
+ to { transform: scaleY(0.8); opacity: 0; }
929
+ }
930
+
931
+ @keyframes emptyPulse {
932
+ 0%, 100% { transform: scale(1); opacity: 0.3; }
933
+ 50% { transform: scale(1.05); opacity: 0.4; }
934
+ }