Style.js 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669
  1. export class Style {
  2. static init( container ) {
  3. const css = /* css */`
  4. @scope (.three-inspector) {
  5. :scope {
  6. --profiler-background: #1e1e24f5;
  7. --profiler-header-background: #2a2a33aa;
  8. --profiler-header: #2a2a33;
  9. --profiler-border: #4a4a5a;
  10. --text-primary: #e0e0e0;
  11. --text-secondary: #9a9aab;
  12. --color-accent: #00aaff;
  13. --color-green: #4caf50;
  14. --color-yellow: #ffc107;
  15. --color-red: #f44336;
  16. --color-fps: rgb(63, 81, 181);
  17. --color-call: rgba(255, 185, 34, 1);
  18. --font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  19. --font-mono: 'Courier New', Courier, monospace;
  20. }
  21. .profiler-panel *, .profiler-toggle * {
  22. text-transform: initial;
  23. line-height: normal;
  24. box-sizing: border-box;
  25. -webkit-font-smoothing: antialiased;
  26. -moz-osx-font-smoothing: grayscale;
  27. }
  28. .profiler-toggle {
  29. position: fixed;
  30. top: 15px;
  31. right: 15px;
  32. background-color: rgba(30, 30, 36, 0.85);
  33. border: 1px solid #4a4a5a54;
  34. border-radius: 12px 6px 6px 12px;
  35. color: var(--text-primary);
  36. cursor: pointer;
  37. z-index: 1001;
  38. transition: all 0.2s ease-in-out;
  39. /*font-size: 14px;*/
  40. font-size: 15px;
  41. backdrop-filter: blur(8px);
  42. box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
  43. display: flex;
  44. align-items: stretch;
  45. padding: 0;
  46. overflow: hidden;
  47. font-family: var(--font-family);
  48. }
  49. .profiler-toggle.position-right.panel-open {
  50. right: auto;
  51. left: 15px;
  52. border-radius: 6px 12px 12px 6px;
  53. flex-direction: row-reverse;
  54. }
  55. .profiler-toggle.position-right.panel-open .builtin-tabs-container {
  56. border-right: none;
  57. border-left: 1px solid #262636;
  58. }
  59. .profiler-toggle:hover {
  60. border-color: var(--color-accent);
  61. }
  62. .profiler-toggle.panel-open .toggle-icon {
  63. background-color: rgba(0, 170, 255, 0.2);
  64. color: var(--color-accent);
  65. }
  66. .toggle-icon {
  67. display: flex;
  68. align-items: center;
  69. justify-content: center;
  70. width: 40px;
  71. font-size: 20px;
  72. transition: background-color 0.2s;
  73. }
  74. .profiler-toggle:hover .toggle-icon {
  75. background-color: rgba(255, 255, 255, 0.05);
  76. }
  77. .profiler-toggle.panel-open:hover .toggle-icon {
  78. background-color: rgba(0, 170, 255, 0.3);
  79. }
  80. .toggle-separator {
  81. width: 1px;
  82. background-color: var(--profiler-border);
  83. }
  84. .toggle-text {
  85. display: flex;
  86. align-items: baseline;
  87. padding: 8px 14px;
  88. min-width: 80px;
  89. justify-content: right;
  90. }
  91. .toggle-text .fps-label {
  92. font-size: 0.7em;
  93. margin-left: 10px;
  94. color: #999;
  95. }
  96. .builtin-tabs-container {
  97. display: flex;
  98. align-items: stretch;
  99. gap: 0;
  100. border-right: 1px solid #262636;
  101. order: -1;
  102. }
  103. .builtin-tab-btn {
  104. background: transparent;
  105. border: none;
  106. color: var(--text-secondary);
  107. cursor: pointer;
  108. padding: 8px 14px;
  109. font-family: var(--font-family);
  110. font-size: 13px;
  111. font-weight: 600;
  112. transition: all 0.2s;
  113. display: flex;
  114. align-items: center;
  115. justify-content: center;
  116. min-width: 32px;
  117. position: relative;
  118. }
  119. .builtin-tab-btn svg {
  120. width: 20px;
  121. height: 20px;
  122. stroke: currentColor;
  123. }
  124. .builtin-tab-btn:hover {
  125. background-color: rgba(255, 255, 255, 0.08);
  126. color: var(--color-accent);
  127. }
  128. .builtin-tab-btn:active {
  129. background-color: rgba(255, 255, 255, 0.12);
  130. }
  131. .builtin-tab-btn.active {
  132. background-color: rgba(0, 170, 255, 0.2);
  133. color: var(--color-accent);
  134. }
  135. .builtin-tab-btn.active:hover {
  136. background-color: rgba(0, 170, 255, 0.3);
  137. }
  138. .profiler-mini-panel {
  139. position: fixed;
  140. top: 60px;
  141. right: 15px;
  142. background-color: rgba(30, 30, 36, 0.85);
  143. border: 1px solid #4a4a5a54;
  144. border-radius: 8px;
  145. color: var(--text-primary);
  146. z-index: 9999;
  147. backdrop-filter: blur(8px);
  148. box-shadow: 0 6px 24px rgba(0, 0, 0, 0.5);
  149. font-family: var(--font-family);
  150. font-size: 11px;
  151. width: 350px;
  152. max-height: calc(100vh - 100px);
  153. overflow-y: auto;
  154. overflow-x: hidden;
  155. display: none;
  156. opacity: 0;
  157. transform: translateY(-10px) scale(0.98);
  158. transition: opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1),
  159. transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
  160. }
  161. .profiler-mini-panel.position-right.panel-open {
  162. right: auto;
  163. left: 15px;
  164. }
  165. .profiler-mini-panel.visible {
  166. display: block;
  167. opacity: 1;
  168. transform: translateY(0) scale(1);
  169. }
  170. .profiler-mini-panel::-webkit-scrollbar {
  171. width: 6px;
  172. }
  173. .profiler-mini-panel::-webkit-scrollbar-track {
  174. background: transparent;
  175. }
  176. .profiler-mini-panel::-webkit-scrollbar-thumb {
  177. background: rgba(255, 255, 255, 0.15);
  178. border-radius: 3px;
  179. transition: background 0.2s;
  180. }
  181. .profiler-mini-panel::-webkit-scrollbar-thumb:hover {
  182. background: rgba(255, 255, 255, 0.25);
  183. }
  184. .mini-panel-content {
  185. padding: 0;
  186. font-size: 11px;
  187. line-height: 1.5;
  188. font-family: var(--font-mono);
  189. letter-spacing: 0.3px;
  190. user-select: none;
  191. -webkit-user-select: none;
  192. }
  193. .mini-panel-content .profiler-content {
  194. display: block !important;
  195. background: transparent;
  196. }
  197. .mini-panel-content .list-scroll-wrapper {
  198. max-height: calc(100vh - 120px);
  199. overflow-y: auto;
  200. overflow-x: hidden;
  201. width: 100%;
  202. }
  203. .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar {
  204. width: 4px;
  205. }
  206. .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar-track {
  207. background: transparent;
  208. }
  209. .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar-thumb {
  210. background: rgba(255, 255, 255, 0.1);
  211. border-radius: 2px;
  212. }
  213. .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar-thumb:hover {
  214. background: rgba(255, 255, 255, 0.2);
  215. }
  216. .mini-panel-content .parameters {
  217. background: transparent;
  218. border: none;
  219. box-shadow: none;
  220. padding: 4px;
  221. }
  222. .mini-panel-content .list-container.parameters {
  223. padding: 2px 6px 0px 6px !important;
  224. }
  225. .mini-panel-content .list-header {
  226. display: none;
  227. padding: 2px 4px;
  228. font-size: 11px;
  229. font-weight: 600;
  230. text-transform: uppercase;
  231. letter-spacing: 0.5px;
  232. }
  233. .mini-panel-content .list-item {
  234. border-bottom: 1px solid rgba(74, 74, 90, 0.2);
  235. transition: background-color 0.15s;
  236. }
  237. .mini-panel-content .list-item:last-child {
  238. border-bottom: none;
  239. }
  240. .mini-panel-content .list-item:hover {
  241. background-color: rgba(255, 255, 255, 0.04);
  242. }
  243. .mini-panel-content .list-item.actionable:hover {
  244. background-color: rgba(255, 255, 255, 0.06);
  245. cursor: pointer;
  246. }
  247. /* Style adjustments for lil-gui look */
  248. .mini-panel-content .item-row {
  249. padding: 3px 8px;
  250. min-height: 24px;
  251. }
  252. .mini-panel-content .list-item-row {
  253. padding: 1px 4px;
  254. gap: 8px;
  255. min-height: 21px;
  256. align-items: center;
  257. }
  258. .mini-panel-content input[type="checkbox"] {
  259. width: 12px;
  260. height: 12px;
  261. }
  262. .mini-panel-content input[type="range"] {
  263. height: 18px;
  264. }
  265. .mini-panel-content .value-number input,
  266. .mini-panel-content .value-slider input {
  267. background-color: rgba(0, 0, 0, 0.3);
  268. border: 1px solid rgba(74, 74, 90, 0.5);
  269. font-size: 10px;
  270. }
  271. .mini-panel-content .value-number input:focus,
  272. .mini-panel-content .value-slider input:focus {
  273. border-color: var(--color-accent);
  274. }
  275. .mini-panel-content .value-slider {
  276. gap: 6px;
  277. }
  278. /* Compact nested items */
  279. .mini-panel-content .list-item .list-item {
  280. margin-left: 8px;
  281. }
  282. .mini-panel-content .list-item .list-item .item-row,
  283. .mini-panel-content .list-item .list-item .list-item-row {
  284. padding: 2px 6px;
  285. min-height: 22px;
  286. }
  287. /* Compact collapsible headers */
  288. .mini-panel-content .collapsible .item-row,
  289. .mini-panel-content .list-item-row.collapsible {
  290. padding: 2px 8px;
  291. font-weight: 600;
  292. min-height: 16px;
  293. display: flex;
  294. align-items: center;
  295. }
  296. .mini-panel-content .collapsible-icon {
  297. font-size: 10px;
  298. width: 14px;
  299. height: 14px;
  300. }
  301. .mini-panel-content .param-control input[type="range"] {
  302. height: 12px;
  303. margin-top: 1px;
  304. padding-top: 5px;
  305. user-select: none;
  306. -webkit-user-select: none;
  307. outline: none;
  308. }
  309. .mini-panel-content .param-control input[type="range"]::-webkit-slider-thumb {
  310. width: 14px;
  311. height: 14px;
  312. margin-top: -5px;
  313. user-select: none;
  314. -webkit-user-select: none;
  315. }
  316. .mini-panel-content .param-control input[type="range"]::-moz-range-thumb {
  317. width: 14px;
  318. height: 14px;
  319. user-select: none;
  320. -moz-user-select: none;
  321. }
  322. .mini-panel-content .list-children-container {
  323. padding-left: 0;
  324. }
  325. .mini-panel-content .param-control input[type="number"] {
  326. flex-basis: 60px !important;
  327. }
  328. .mini-panel-content .param-control {
  329. align-items: center;
  330. }
  331. .mini-panel-content .param-control select {
  332. font-size: 11px;
  333. }
  334. .mini-panel-content .list-item-wrapper {
  335. margin-top: 0;
  336. margin-bottom: 0;
  337. }
  338. .profiler-panel {
  339. position: fixed;
  340. z-index: 1001 !important;
  341. bottom: 0;
  342. left: 0;
  343. right: 0;
  344. height: 350px;
  345. background-color: var(--profiler-background);
  346. backdrop-filter: blur(8px);
  347. border-top: 2px solid var(--profiler-border);
  348. color: var(--text-primary);
  349. display: flex;
  350. flex-direction: column;
  351. z-index: 1000;
  352. /*box-shadow: 0 -5px 25px rgba(0, 0, 0, 0.5);*/
  353. transform: translateY(100%);
  354. transition: transform 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94), height 0.3s ease-out, width 0.3s ease-out;
  355. font-family: var(--font-mono);
  356. }
  357. .profiler-panel.resizing,
  358. .profiler-panel.dragging {
  359. transition: none;
  360. }
  361. .profiler-panel.visible {
  362. transform: translateY(0);
  363. }
  364. .profiler-panel.maximized {
  365. height: 100vh;
  366. }
  367. /* Position-specific styles */
  368. .profiler-panel.position-top {
  369. bottom: auto;
  370. top: 0;
  371. border-top: none;
  372. border-bottom: 2px solid var(--profiler-border);
  373. transform: translateY(-100%);
  374. }
  375. .profiler-panel.position-top.visible {
  376. transform: translateY(0);
  377. }
  378. .profiler-panel.position-bottom {
  379. /* Default position - already defined above */
  380. }
  381. .profiler-panel.position-left {
  382. top: 0;
  383. bottom: 0;
  384. left: 0;
  385. right: auto;
  386. width: 350px;
  387. height: 100%;
  388. border-top: none;
  389. border-right: 2px solid var(--profiler-border);
  390. transform: translateX(-100%);
  391. }
  392. .profiler-panel.position-left.visible {
  393. transform: translateX(0);
  394. }
  395. .profiler-panel.position-right {
  396. top: 0;
  397. bottom: 0;
  398. left: auto;
  399. right: 0;
  400. width: 350px;
  401. height: 100%;
  402. border-top: none;
  403. border-left: 2px solid var(--profiler-border);
  404. transform: translateX(100%);
  405. }
  406. .profiler-panel.position-right.visible {
  407. transform: translateX(0);
  408. }
  409. .profiler-panel.position-floating {
  410. border: 2px solid var(--profiler-border);
  411. border-radius: 8px;
  412. box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
  413. transform: none !important;
  414. overflow: hidden;
  415. }
  416. .profiler-panel.position-floating.visible {
  417. transform: none !important;
  418. }
  419. .profiler-panel.position-floating .profiler-header {
  420. border-radius: 6px 6px 0 0;
  421. }
  422. .profiler-panel.position-floating .panel-resizer {
  423. bottom: 0;
  424. right: 0;
  425. top: auto;
  426. left: auto;
  427. width: 16px;
  428. height: 16px;
  429. cursor: nwse-resize;
  430. border-radius: 0 0 6px 0;
  431. }
  432. .profiler-panel.position-floating .panel-resizer::after {
  433. content: '';
  434. position: absolute;
  435. right: 2px;
  436. bottom: 2px;
  437. width: 10px;
  438. height: 10px;
  439. background: linear-gradient(135deg, transparent 0%, transparent 45%, var(--profiler-border) 45%, var(--profiler-border) 55%, transparent 55%);
  440. }
  441. .panel-resizer {
  442. position: absolute;
  443. top: -2px;
  444. left: 0;
  445. width: 100%;
  446. height: 5px;
  447. cursor: ns-resize;
  448. z-index: 1001;
  449. touch-action: none;
  450. }
  451. .profiler-panel.position-top .panel-resizer {
  452. top: auto;
  453. bottom: -2px;
  454. }
  455. .profiler-panel.position-left .panel-resizer {
  456. top: 0;
  457. left: auto;
  458. right: -2px;
  459. width: 5px;
  460. height: 100%;
  461. cursor: ew-resize;
  462. }
  463. .profiler-panel.position-right .panel-resizer {
  464. top: 0;
  465. left: -2px;
  466. right: auto;
  467. width: 5px;
  468. height: 100%;
  469. cursor: ew-resize;
  470. }
  471. .profiler-header {
  472. display: flex;
  473. background-color: var(--profiler-header-background);
  474. border-bottom: 1px solid var(--profiler-border);
  475. flex-shrink: 0;
  476. justify-content: space-between;
  477. align-items: stretch;
  478. overflow-x: auto;
  479. overflow-y: hidden;
  480. width: calc(100% - 134px);
  481. height: 38px;
  482. user-select: none;
  483. -webkit-user-select: none;
  484. }
  485. /* Adjust header width based on panel position */
  486. .profiler-panel.position-right .profiler-header,
  487. .profiler-panel.position-left .profiler-header {
  488. width: calc(100% - 134px);
  489. }
  490. .profiler-panel.position-bottom .profiler-header,
  491. .profiler-panel.position-top .profiler-header {
  492. width: calc(100% - 134px);
  493. }
  494. /* Adjust header width when position toggle button is hidden (mobile) */
  495. .profiler-panel.hide-position-toggle .profiler-header {
  496. width: calc(100% - 90px);
  497. }
  498. /* ===== RULES FOR WHEN THERE ARE NO TABS ===== */
  499. /* Horizontal mode (bottom/top) without tabs */
  500. .profiler-panel.position-bottom.no-tabs:not(.maximized),
  501. .profiler-panel.position-top.no-tabs:not(.maximized) {
  502. height: 38px !important;
  503. min-height: 38px !important;
  504. }
  505. .profiler-panel.position-bottom.no-tabs .profiler-header,
  506. .profiler-panel.position-top.no-tabs .profiler-header {
  507. width: 100%;
  508. height: 38px;
  509. border-bottom: none;
  510. }
  511. .profiler-panel.position-bottom.no-tabs .profiler-content-wrapper,
  512. .profiler-panel.position-top.no-tabs .profiler-content-wrapper {
  513. display: none;
  514. }
  515. .profiler-panel.position-bottom.no-tabs .panel-resizer,
  516. .profiler-panel.position-top.no-tabs .panel-resizer {
  517. display: none;
  518. }
  519. /* Vertical mode (right/left) without tabs */
  520. .profiler-panel.position-right.no-tabs:not(.maximized),
  521. .profiler-panel.position-left.no-tabs:not(.maximized) {
  522. width: 45px !important;
  523. min-width: 45px !important;
  524. }
  525. /* Vertical layout for header when no tabs */
  526. .profiler-panel.position-right.no-tabs .profiler-header,
  527. .profiler-panel.position-left.no-tabs .profiler-header {
  528. width: 100%;
  529. flex-direction: column;
  530. height: 100%;
  531. border-bottom: none;
  532. }
  533. /* Vertical layout for controls when no tabs */
  534. .profiler-panel.position-right.no-tabs .profiler-controls,
  535. .profiler-panel.position-left.no-tabs .profiler-controls {
  536. position: static;
  537. flex-direction: column-reverse;
  538. justify-content: flex-end;
  539. width: 100%;
  540. height: 100%;
  541. border-bottom: none;
  542. border-left: none;
  543. background: transparent;
  544. }
  545. .profiler-panel.position-right.no-tabs .profiler-controls button,
  546. .profiler-panel.position-left.no-tabs .profiler-controls button {
  547. width: 100%;
  548. height: 45px;
  549. border-left: none;
  550. border-top: none;
  551. border-bottom: 1px solid var(--profiler-border);
  552. }
  553. .profiler-panel.position-right.no-tabs .profiler-content-wrapper,
  554. .profiler-panel.position-left.no-tabs .profiler-content-wrapper {
  555. display: none;
  556. }
  557. .profiler-panel.position-right.no-tabs .profiler-tabs,
  558. .profiler-panel.position-left.no-tabs .profiler-tabs {
  559. display: none;
  560. }
  561. .profiler-panel.position-right.no-tabs .panel-resizer,
  562. .profiler-panel.position-left.no-tabs .panel-resizer {
  563. display: none;
  564. }
  565. /* Hide position toggle on mobile without tabs */
  566. .profiler-panel.hide-position-toggle.position-right.no-tabs:not(.maximized),
  567. .profiler-panel.hide-position-toggle.position-left.no-tabs:not(.maximized) {
  568. width: 45px !important;
  569. min-width: 45px !important;
  570. }
  571. /* Hide drag indicator on mobile devices */
  572. .profiler-panel.is-mobile .tab-btn.active::before {
  573. display: none;
  574. }
  575. .profiler-header::-webkit-scrollbar {
  576. width: 8px;
  577. height: 8px;
  578. }
  579. .profiler-header::-webkit-scrollbar-track {
  580. background: transparent;
  581. }
  582. .profiler-header::-webkit-scrollbar-thumb {
  583. background-color: rgba(0, 0, 0, 0.25);
  584. border-radius: 10px;
  585. transition: background 0.3s ease;
  586. }
  587. .profiler-header::-webkit-scrollbar-thumb:hover {
  588. background-color: rgba(0, 0, 0, 0.4);
  589. }
  590. .profiler-header::-webkit-scrollbar-corner {
  591. background: transparent;
  592. }
  593. .profiler-panel.dragging .profiler-header {
  594. cursor: grabbing !important;
  595. }
  596. .profiler-panel.dragging {
  597. opacity: 0.8;
  598. }
  599. .profiler-tabs {
  600. display: flex;
  601. cursor: grab;
  602. position: relative;
  603. }
  604. .profiler-tabs:active {
  605. cursor: grabbing;
  606. }
  607. .profiler-tabs::-webkit-scrollbar {
  608. width: 8px;
  609. height: 8px;
  610. }
  611. .profiler-tabs::-webkit-scrollbar-track {
  612. background: transparent;
  613. }
  614. .profiler-tabs::-webkit-scrollbar-thumb {
  615. background-color: rgba(0, 0, 0, 0.25);
  616. border-radius: 10px;
  617. transition: background 0.3s ease;
  618. }
  619. .profiler-tabs::-webkit-scrollbar-thumb:hover {
  620. background-color: rgba(0, 0, 0, 0.4);
  621. }
  622. .profiler-tabs::-webkit-scrollbar-corner {
  623. background: transparent;
  624. }
  625. .profiler-controls {
  626. display: flex;
  627. position: absolute;
  628. right: 0;
  629. top: 0;
  630. height: 38px;
  631. background: var(--profiler-header-background);
  632. border-bottom: 1px solid var(--profiler-border);
  633. }
  634. .tab-btn {
  635. position: relative;
  636. background: transparent;
  637. border: none;
  638. /*border-right: 1px solid var(--profiler-border);*/
  639. color: var(--text-secondary);
  640. padding: 8px 18px;
  641. cursor: default;
  642. display: flex;
  643. align-items: center;
  644. font-family: var(--font-family);
  645. font-weight: 600;
  646. font-size: 14px;
  647. user-select: none;
  648. transition: opacity 0.2s, transform 0.2s;
  649. touch-action: pan-x;
  650. white-space: nowrap;
  651. }
  652. .tab-btn.active {
  653. border-bottom: 2px solid var(--color-accent);
  654. color: white;
  655. }
  656. .tab-btn.active::before {
  657. content: '⋮⋮';
  658. position: absolute;
  659. left: 3px;
  660. top: calc(50% - .1rem);
  661. transform: translateY(-50%);
  662. color: var(--profiler-border);
  663. font-size: 18px;
  664. letter-spacing: -2px;
  665. opacity: 0.6;
  666. }
  667. .tab-btn.no-detach.active::before {
  668. display: none;
  669. }
  670. .floating-btn,
  671. .maximize-btn,
  672. .hide-panel-btn {
  673. background: transparent;
  674. border: none;
  675. border-left: 1px solid var(--profiler-border);
  676. color: var(--text-secondary);
  677. width: 45px;
  678. height: 100%;
  679. cursor: pointer;
  680. transition: all 0.2s;
  681. display: flex;
  682. align-items: center;
  683. justify-content: center;
  684. flex-shrink: 0;
  685. }
  686. /* Disable transitions in vertical mode to avoid broken animations */
  687. .profiler-panel.position-right .floating-btn,
  688. .profiler-panel.position-right .maximize-btn,
  689. .profiler-panel.position-right .hide-panel-btn,
  690. .profiler-panel.position-left .floating-btn,
  691. .profiler-panel.position-left .maximize-btn,
  692. .profiler-panel.position-left .hide-panel-btn {
  693. transition: background-color 0.2s, color 0.2s;
  694. }
  695. .floating-btn:hover,
  696. .maximize-btn:hover,
  697. .hide-panel-btn:hover {
  698. background-color: rgba(255, 255, 255, 0.1);
  699. color: var(--text-primary);
  700. }
  701. /* Hide maximize button when there are no tabs */
  702. .profiler-panel.position-right.no-tabs .maximize-btn,
  703. .profiler-panel.position-left.no-tabs .maximize-btn,
  704. .profiler-panel.position-bottom.no-tabs .maximize-btn,
  705. .profiler-panel.position-top.no-tabs .maximize-btn {
  706. display: none !important;
  707. }
  708. .profiler-content-wrapper {
  709. flex-grow: 1;
  710. overflow: hidden;
  711. position: relative;
  712. }
  713. .profiler-content {
  714. position: absolute;
  715. top: 0;
  716. left: 0;
  717. width: 100%;
  718. height: 100%;
  719. overflow-y: auto;
  720. font-size: 13px;
  721. visibility: hidden;
  722. opacity: 0;
  723. transition: opacity 0.2s, visibility 0.2s;
  724. box-sizing: border-box;
  725. display: flex;
  726. flex-direction: column;
  727. user-select: none;
  728. -webkit-user-select: none;
  729. }
  730. .profiler-content.active {
  731. visibility: visible;
  732. opacity: 1;
  733. }
  734. .profiler-content {
  735. overflow: auto; /* make sure scrollbars can appear */
  736. }
  737. .profiler-content::-webkit-scrollbar {
  738. width: 8px;
  739. height: 8px;
  740. }
  741. .profiler-content::-webkit-scrollbar-track {
  742. background: transparent;
  743. }
  744. .profiler-content::-webkit-scrollbar-thumb {
  745. background-color: rgba(0, 0, 0, 0.25);
  746. border-radius: 10px;
  747. transition: background 0.3s ease;
  748. }
  749. .profiler-content::-webkit-scrollbar-thumb:hover {
  750. background-color: rgba(0, 0, 0, 0.4);
  751. }
  752. .profiler-content::-webkit-scrollbar-corner {
  753. background: transparent;
  754. }
  755. .profiler-content {
  756. scrollbar-width: thin; /* "auto" | "thin" */
  757. scrollbar-color: rgba(0, 0, 0, 0.25) transparent;
  758. }
  759. .list-item-row {
  760. display: grid;
  761. align-items: center;
  762. padding: 4px 8px;
  763. border-radius: 3px;
  764. transition: background-color 0.2s;
  765. gap: 10px;
  766. border-bottom: none;
  767. user-select: none;
  768. -webkit-user-select: none;
  769. }
  770. .parameters .list-item-row {
  771. min-height: 31px;
  772. }
  773. .mini-panel-content .parameters .list-item-row {
  774. min-height: 21px;
  775. }
  776. .list-item-wrapper {
  777. margin-top: 2px;
  778. margin-bottom: 2px;
  779. user-select: none;
  780. -webkit-user-select: none;
  781. }
  782. .list-item-wrapper:first-child {
  783. /*margin-top: 0;*/
  784. }
  785. .list-item-wrapper:not(.header-wrapper):nth-child(odd) > .list-item-row {
  786. background-color: rgba(0,0,0,0.1);
  787. }
  788. .list-item-wrapper.header-wrapper>.list-item-row {
  789. color: var(--color-accent);
  790. background-color: rgba(0, 170, 255, 0.1);
  791. }
  792. .list-item-wrapper.header-wrapper>.list-item-row>.list-item-cell:first-child {
  793. font-weight: 600;
  794. line-height: 1;
  795. }
  796. .list-item-row.collapsible,
  797. .list-item-row.actionable {
  798. cursor: pointer;
  799. }
  800. .list-item-row.collapsible {
  801. background-color: rgba(0, 170, 255, 0.15) !important;
  802. min-height: 23px;
  803. }
  804. .list-item-row.collapsible.alert,
  805. .list-item-row.alert {
  806. background-color: rgba(244, 67, 54, 0.1) !important;
  807. }
  808. @media (hover: hover) {
  809. .list-item-row:hover:not(.collapsible):not(.no-hover),
  810. .list-item-row:hover:not(.no-hover),
  811. .list-item-row.actionable:hover,
  812. .list-item-row.collapsible.actionable:hover {
  813. background-color: rgba(255, 255, 255, 0.05) !important;
  814. }
  815. .list-item-row.collapsible:hover {
  816. background-color: rgba(0, 170, 255, 0.25) !important;
  817. }
  818. }
  819. .list-item-cell {
  820. white-space: pre;
  821. display: flex;
  822. align-items: center;
  823. user-select: none;
  824. -webkit-user-select: none;
  825. }
  826. .list-item-cell:not(:first-child) {
  827. justify-content: flex-end;
  828. font-weight: 600;
  829. }
  830. .list-header {
  831. display: grid;
  832. align-items: center;
  833. padding: 4px 8px;
  834. font-weight: 600;
  835. color: var(--text-secondary);
  836. padding-bottom: 6px;
  837. border-bottom: 1px solid var(--profiler-border);
  838. margin-bottom: 5px;
  839. gap: 10px;
  840. user-select: none;
  841. -webkit-user-select: none;
  842. }
  843. .list-item-wrapper.section-start {
  844. margin-top: 5px;
  845. margin-bottom: 5px;
  846. }
  847. .list-header .list-header-cell:not(:first-child) {
  848. text-align: right;
  849. }
  850. .list-children-container {
  851. padding-left: 1.5em;
  852. overflow: hidden;
  853. transition: max-height 0.1s ease-out;
  854. margin-top: 2px;
  855. }
  856. .list-children-container.closed {
  857. max-height: 0;
  858. }
  859. .item-toggler {
  860. display: inline-block;
  861. margin-right: 0.8em;
  862. text-align: left;
  863. }
  864. .list-item-row.open .item-toggler::before {
  865. content: '-';
  866. }
  867. .list-item-row:not(.open) .item-toggler::before {
  868. content: '+';
  869. }
  870. .list-item-cell .value.good {
  871. color: var(--color-green);
  872. }
  873. .list-item-cell .value.warn {
  874. color: var(--color-yellow);
  875. }
  876. .list-item-cell .value.bad {
  877. color: var(--color-red);
  878. }
  879. .list-scroll-wrapper {
  880. width: max-content;
  881. min-width: 100%;
  882. display: flex;
  883. flex-direction: column;
  884. min-height: 100%;
  885. }
  886. .list-container.parameters .list-item-row:not(.collapsible) {
  887. }
  888. .graph-container {
  889. width: 100%;
  890. box-sizing: border-box;
  891. padding: 8px 0;
  892. position: relative;
  893. }
  894. .graph-svg {
  895. width: 100%;
  896. height: 80px;
  897. background-color: var(--profiler-header);
  898. border: 1px solid var(--profiler-border);
  899. border-radius: 4px;
  900. }
  901. .graph-path {
  902. stroke-width: 2;
  903. fill-opacity: 0.4;
  904. }
  905. .console-header {
  906. padding: 10px;
  907. border-bottom: 1px solid var(--profiler-border);
  908. display: flex;
  909. gap: 20px;
  910. flex-shrink: 0;
  911. align-items: center;
  912. justify-content: space-between;
  913. }
  914. .console-buttons-group {
  915. display: flex;
  916. gap: 20px;
  917. }
  918. .console-filter-input {
  919. background-color: var(--profiler-background);
  920. border: 1px solid var(--profiler-border);
  921. color: var(--text-primary);
  922. border-radius: 4px;
  923. padding: 4px 8px;
  924. font-family: var(--font-mono);
  925. flex-grow: 1;
  926. max-width: 300px;
  927. border-radius: 15px;
  928. }
  929. .console-filter-input:focus {
  930. outline: none;
  931. border-color: var(--text-secondary);
  932. }
  933. .console-copy-button {
  934. background: transparent;
  935. border: none;
  936. color: var(--text-secondary);
  937. cursor: pointer;
  938. padding: 4px;
  939. display: flex;
  940. align-items: center;
  941. justify-content: center;
  942. border-radius: 4px;
  943. transition: color 0.2s, background-color 0.2s;
  944. }
  945. .console-copy-button:hover {
  946. color: var(--text-primary);
  947. background-color: var(--profiler-hover);
  948. }
  949. .console-copy-button.copied {
  950. color: var(--color-green);
  951. }
  952. .console-log {
  953. display: flex;
  954. flex-direction: column;
  955. gap: 4px;
  956. padding: 10px;
  957. overflow-y: auto;
  958. flex-grow: 1;
  959. user-select: text;
  960. -webkit-user-select: text;
  961. }
  962. .log-message {
  963. padding: 2px 5px;
  964. white-space: pre-wrap;
  965. word-break: break-all;
  966. border-radius: 3px;
  967. line-height: 1.5 !important;
  968. }
  969. .log-message.hidden {
  970. display: none;
  971. }
  972. .log-message.info {
  973. color: var(--text-primary);
  974. }
  975. .log-message.warn {
  976. color: var(--color-yellow);
  977. }
  978. .log-message.error {
  979. color: #f9dedc;
  980. background-color: rgba(244, 67, 54, 0.1);
  981. }
  982. .log-prefix {
  983. color: var(--text-secondary);
  984. margin-right: 8px;
  985. }
  986. .log-code {
  987. background-color: rgba(255, 255, 255, 0.1);
  988. border-radius: 3px;
  989. padding: 1px 4px;
  990. }
  991. .thumbnail-container {
  992. display: flex;
  993. align-items: center;
  994. }
  995. .thumbnail-svg {
  996. width: 40px;
  997. height: 22.5px;
  998. flex-shrink: 0;
  999. margin-right: 8px;
  1000. }
  1001. .param-control {
  1002. display: flex;
  1003. align-items: center;
  1004. justify-content: flex-end;
  1005. gap: 10px;
  1006. width: 100%;
  1007. }
  1008. .param-control input,
  1009. .param-control select,
  1010. .param-control button {
  1011. background-color: var(--profiler-background);
  1012. border: 1px solid var(--profiler-border);
  1013. color: var(--text-primary);
  1014. border-radius: 4px;
  1015. padding: 4px 6px;
  1016. padding-bottom: 2px;
  1017. font-family: var(--font-mono);
  1018. width: 100%;
  1019. box-sizing: border-box;
  1020. }
  1021. .param-control input:focus {
  1022. outline: none;
  1023. border-color: var(--color-accent);
  1024. }
  1025. .param-control select {
  1026. padding-top: 3px;
  1027. padding-bottom: 1px;
  1028. }
  1029. .param-control input[type="number"] {
  1030. cursor: ns-resize;
  1031. }
  1032. .param-control input[type="color"] {
  1033. padding: 2px;
  1034. }
  1035. .param-control button {
  1036. cursor: pointer;
  1037. transition: background-color 0.2s;
  1038. }
  1039. .param-control button:hover {
  1040. background-color: var(--profiler-header);
  1041. }
  1042. .param-control-vector {
  1043. display: flex;
  1044. gap: 5px;
  1045. }
  1046. .custom-checkbox {
  1047. display: inline-flex;
  1048. align-items: center;
  1049. cursor: pointer;
  1050. gap: 8px;
  1051. will-change: transform;
  1052. }
  1053. .custom-checkbox input {
  1054. display: none;
  1055. }
  1056. .custom-checkbox .checkmark {
  1057. width: 14px;
  1058. height: 14px;
  1059. border: 1px solid var(--color-accent);
  1060. border-radius: 3px;
  1061. display: inline-flex;
  1062. justify-content: center;
  1063. align-items: center;
  1064. transition: background-color 0.2s, border-color 0.2s;
  1065. }
  1066. .custom-checkbox .checkmark::after {
  1067. content: '';
  1068. width: 6px;
  1069. height: 6px;
  1070. background-color: var(--color-accent);
  1071. border-radius: 1px;
  1072. display: block;
  1073. transform: scale(0);
  1074. transition: transform 0.2s;
  1075. }
  1076. .custom-checkbox input:checked+.checkmark {
  1077. border-color: var(--color-accent);
  1078. }
  1079. .custom-checkbox input:checked+.checkmark::after {
  1080. transform: scale(1);
  1081. }
  1082. .param-control input[type="range"] {
  1083. -webkit-appearance: none;
  1084. appearance: none;
  1085. width: 100%;
  1086. height: 16px;
  1087. background: var(--profiler-header);
  1088. border-radius: 5px;
  1089. border: 1px solid var(--profiler-border);
  1090. outline: none;
  1091. padding: 0px;
  1092. padding-top: 8px;
  1093. }
  1094. .param-control input[type="range"]::-webkit-slider-thumb {
  1095. -webkit-appearance: none;
  1096. appearance: none;
  1097. width: 18px;
  1098. height: 18px;
  1099. background: var(--profiler-background);
  1100. border: 1px solid var(--color-accent);
  1101. border-radius: 3px;
  1102. cursor: pointer;
  1103. margin-top: -8px;
  1104. }
  1105. .param-control input[type="range"]::-moz-range-thumb {
  1106. width: 18px;
  1107. height: 18px;
  1108. background: var(--profiler-background);
  1109. border: 2px solid var(--color-accent);
  1110. border-radius: 3px;
  1111. cursor: pointer;
  1112. }
  1113. .param-control input[type="range"]::-moz-range-track {
  1114. width: 100%;
  1115. height: 16px;
  1116. background: var(--profiler-header);
  1117. border-radius: 5px;
  1118. border: 1px solid var(--profiler-border);
  1119. }
  1120. /* Override .param-control styles for mini-panel-content */
  1121. .mini-panel-content input,
  1122. .mini-panel-content select,
  1123. .mini-panel-content button {
  1124. padding: 2px 4px;
  1125. height: 21px;
  1126. line-height: 1.4;
  1127. padding-top: 4px;
  1128. }
  1129. .mini-panel-content .param-control input,
  1130. .mini-panel-content .param-control select,
  1131. .mini-panel-content .param-control button {
  1132. background-color: #1e1e24c2;
  1133. line-height: 1.0;
  1134. }
  1135. .mini-panel-content .param-control select {
  1136. padding: 2px 2px;
  1137. padding-top: 3px;
  1138. }
  1139. .mini-panel-content .param-control input[type="number"]::-webkit-outer-spin-button,
  1140. .mini-panel-content .param-control input[type="number"]::-webkit-inner-spin-button {
  1141. -webkit-appearance: none;
  1142. margin: 0;
  1143. }
  1144. .mini-panel-content .param-control input[type="number"] {
  1145. -moz-appearance: textfield;
  1146. }
  1147. .mini-panel-content .list-item-cell span {
  1148. position: relative;
  1149. top: 1px;
  1150. margin-left: 2px;
  1151. }
  1152. .mini-panel-content .custom-checkbox .checkmark {
  1153. width: 12px;
  1154. height: 12px;
  1155. margin-bottom: 2px;
  1156. will-change: transform;
  1157. }
  1158. .mini-panel-content .list-container.parameters .list-item-row:not(.collapsible) {
  1159. margin-bottom: 2px;
  1160. }
  1161. @media screen and (max-width: 450px) and (orientation: portrait) {
  1162. .console-filter-input {
  1163. max-width: 100px;
  1164. }
  1165. }
  1166. /* Touch device optimizations */
  1167. @media (hover: none) and (pointer: coarse) {
  1168. .panel-resizer {
  1169. top: -10px !important;
  1170. height: 20px !important;
  1171. }
  1172. .profiler-panel.position-top .panel-resizer {
  1173. top: auto !important;
  1174. bottom: -10px !important;
  1175. height: 20px !important;
  1176. }
  1177. .profiler-panel.position-left .panel-resizer {
  1178. right: -10px !important;
  1179. width: 20px !important;
  1180. height: 100% !important;
  1181. }
  1182. .profiler-panel.position-right .panel-resizer {
  1183. left: -10px !important;
  1184. width: 20px !important;
  1185. height: 100% !important;
  1186. }
  1187. .detached-tab-resizer-top,
  1188. .detached-tab-resizer-bottom {
  1189. height: 10px !important;
  1190. }
  1191. .detached-tab-resizer-left,
  1192. .detached-tab-resizer-right {
  1193. width: 10px !important;
  1194. }
  1195. }
  1196. .drag-preview-indicator {
  1197. position: fixed;
  1198. background-color: rgba(0, 170, 255, 0.2);
  1199. border: 2px dashed var(--color-accent);
  1200. z-index: 999;
  1201. pointer-events: none;
  1202. transition: all 0.2s ease-out;
  1203. }
  1204. /* Detached Tab Windows */
  1205. .detached-tab-panel {
  1206. position: fixed;
  1207. width: 500px;
  1208. height: 400px;
  1209. background: var(--profiler-background);
  1210. border: 1px solid var(--profiler-border);
  1211. border-radius: 8px;
  1212. box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
  1213. z-index: 1002;
  1214. display: flex;
  1215. flex-direction: column;
  1216. backdrop-filter: blur(10px);
  1217. overflow: hidden;
  1218. opacity: 1;
  1219. visibility: visible;
  1220. transition: opacity 0.2s, visibility 0.2s;
  1221. }
  1222. .profiler-panel:not(.visible) ~ * .detached-tab-panel,
  1223. body:has(.profiler-panel:not(.visible)) .detached-tab-panel {
  1224. opacity: 0;
  1225. visibility: hidden;
  1226. pointer-events: none;
  1227. }
  1228. .detached-tab-header {
  1229. background: var(--profiler-header-background);
  1230. padding: 0 7px 0 15px;
  1231. font-family: var(--font-family);
  1232. font-size: 14px;
  1233. color: var(--text-primary);
  1234. font-weight: 600;
  1235. display: flex;
  1236. justify-content: space-between;
  1237. align-items: center;
  1238. border-bottom: 1px solid var(--profiler-border);
  1239. cursor: grab;
  1240. user-select: none;
  1241. height: 38px;
  1242. flex-shrink: 0;
  1243. -webkit-font-smoothing: antialiased;
  1244. -moz-osx-font-smoothing: grayscale;
  1245. touch-action: none;
  1246. }
  1247. .detached-tab-header:active {
  1248. cursor: grabbing;
  1249. }
  1250. .detached-header-controls {
  1251. display: flex;
  1252. gap: 5px;
  1253. }
  1254. .detached-reattach-btn {
  1255. background: transparent;
  1256. border: none;
  1257. color: var(--text-secondary);
  1258. font-family: var(--font-family);
  1259. font-size: 18px;
  1260. line-height: 1;
  1261. cursor: pointer;
  1262. padding: 4px 8px;
  1263. border-radius: 4px;
  1264. transition: all 0.2s;
  1265. display: flex;
  1266. align-items: center;
  1267. justify-content: center;
  1268. -webkit-font-smoothing: antialiased;
  1269. -moz-osx-font-smoothing: grayscale;
  1270. }
  1271. .detached-reattach-btn:hover {
  1272. background: rgba(0, 170, 255, 0.2);
  1273. color: var(--color-accent);
  1274. }
  1275. .detached-tab-content {
  1276. flex: 1;
  1277. overflow: auto;
  1278. position: relative;
  1279. background: var(--profiler-background);
  1280. }
  1281. .detached-tab-content::-webkit-scrollbar {
  1282. width: 8px;
  1283. height: 8px;
  1284. }
  1285. .detached-tab-content::-webkit-scrollbar-track {
  1286. background: transparent;
  1287. }
  1288. .detached-tab-content::-webkit-scrollbar-thumb {
  1289. background-color: rgba(0, 0, 0, 0.25);
  1290. border-radius: 10px;
  1291. transition: background 0.3s ease;
  1292. }
  1293. .detached-tab-content::-webkit-scrollbar-thumb:hover {
  1294. background-color: rgba(0, 0, 0, 0.4);
  1295. }
  1296. .detached-tab-content::-webkit-scrollbar-corner {
  1297. background: transparent;
  1298. }
  1299. .detached-tab-content .profiler-content {
  1300. display: block !important;
  1301. height: 100%;
  1302. visibility: visible !important;
  1303. opacity: 1 !important;
  1304. position: relative !important;
  1305. }
  1306. .detached-tab-content .profiler-content > * {
  1307. font-family: var(--font-mono);
  1308. color: var(--text-primary);
  1309. }
  1310. .detached-tab-resizer {
  1311. position: absolute;
  1312. bottom: 0;
  1313. right: 0;
  1314. width: 20px;
  1315. height: 20px;
  1316. cursor: nwse-resize;
  1317. z-index: 10;
  1318. touch-action: none;
  1319. }
  1320. .detached-tab-resizer::after {
  1321. content: '';
  1322. position: absolute;
  1323. bottom: 2px;
  1324. right: 2px;
  1325. width: 12px;
  1326. height: 12px;
  1327. border-right: 2px solid var(--profiler-border);
  1328. border-bottom: 2px solid var(--profiler-border);
  1329. border-bottom-right-radius: 6px;
  1330. opacity: 0.5;
  1331. }
  1332. .detached-tab-resizer:hover::after {
  1333. opacity: 1;
  1334. border-color: var(--color-accent);
  1335. }
  1336. /* Edge resizers */
  1337. .detached-tab-resizer-top {
  1338. position: absolute;
  1339. top: 0;
  1340. left: 0;
  1341. right: 0;
  1342. height: 5px;
  1343. cursor: ns-resize;
  1344. z-index: 10;
  1345. touch-action: none;
  1346. }
  1347. .detached-tab-resizer-right {
  1348. position: absolute;
  1349. top: 0;
  1350. right: 0;
  1351. bottom: 0;
  1352. width: 5px;
  1353. cursor: ew-resize;
  1354. z-index: 10;
  1355. touch-action: none;
  1356. }
  1357. .detached-tab-resizer-bottom {
  1358. position: absolute;
  1359. bottom: 0;
  1360. left: 0;
  1361. right: 0;
  1362. height: 5px;
  1363. cursor: ns-resize;
  1364. z-index: 10;
  1365. touch-action: none;
  1366. }
  1367. .detached-tab-resizer-left {
  1368. position: absolute;
  1369. top: 0;
  1370. left: 0;
  1371. bottom: 0;
  1372. width: 5px;
  1373. cursor: ew-resize;
  1374. z-index: 10;
  1375. touch-action: none;
  1376. }
  1377. /* Input number spin buttons - hide arrows */
  1378. /* Chrome, Safari, Edge, Opera */
  1379. .profiler-panel input[type="number"]::-webkit-outer-spin-button,
  1380. .profiler-panel input[type="number"]::-webkit-inner-spin-button,
  1381. .detached-tab-content input[type="number"]::-webkit-outer-spin-button,
  1382. .detached-tab-content input[type="number"]::-webkit-inner-spin-button {
  1383. -webkit-appearance: none;
  1384. margin: 0;
  1385. }
  1386. /* Firefox */
  1387. .profiler-panel input[type="number"],
  1388. .detached-tab-content input[type="number"] {
  1389. -moz-appearance: textfield;
  1390. }
  1391. .panel-action-btn {
  1392. background: transparent;
  1393. color: var(--text-primary);
  1394. border: 1px solid var(--profiler-border);
  1395. border-radius: 4px;
  1396. padding: 6px 12px;
  1397. cursor: pointer;
  1398. font-family: var(--font-family);
  1399. font-size: 12px;
  1400. transition: background-color 0.2s;
  1401. display: flex;
  1402. align-items: center;
  1403. justify-content: center;
  1404. }
  1405. .panel-action-btn:hover {
  1406. background-color: rgba(255, 255, 255, 0.05);
  1407. }
  1408. }
  1409. `;
  1410. const styleElement = document.createElement( 'style' );
  1411. styleElement.textContent = css;
  1412. container.appendChild( styleElement );
  1413. }
  1414. }
粤ICP备19079148号