MDN: Compat table: first and compact

Moves compatibility and specs tables to the top and makes them compact in articles at developer.mozilla.org.

/* ==UserStyle==
@name        MDN: Compat table: first and compact
@description Moves compatibility and specs tables to the top and makes them compact in articles at developer.mozilla.org.
@namespace   myfonj
@version     1.6.0
@license     CC0 - Public Domain
==/UserStyle== */

@-moz-document domain("developer.mozilla.org") {
/*
Changelog
1.6.0 (2024-10-16) - "Resources" like "See also" on the top
1.5.0 (2024-04-17) - sticky header attepmt
1.4.3 (2024-03-21) - "see also" also in right order in sidebar nav
1.4.2 (2024-03-21) - reordered sidebar nav to match new order
1.4.1 (2024-03-20) - pulling up even the "no compat/spec data found" warning boxes
*/


 /** no fancy yet distracting underlines */
 .main-page-content h1::after {
  content: none;
 }
 
 /*

https://userstyles.org/styles/177139/edit
https://gf.qytechs.cn/en/scripts/408039/versions/new

MDN: Compat table: first and compact

*/

/*
 Pull Browser Compatibility table to the top
*/
.main-page-content {
 display: flex;
 flex-direction: column;
}
section[aria-labelledby="browser_compatibility" i],
[id="Browser_compatibility" i],
[id="Browser_compatibility" i] + a,
[id="Browser_compatibility" i] + a + .table-scroll ,
[id="Browser_compatibility" i] + a + .table-container ,
[id="Browser_compatibility" i] + div[class="notecard warning"] {
 order: -2;
}
.document-toc-list {
 display: flex;
 flex-direction: column;
 & .document-toc-item:has([href="#browser_compatibility" i]) {
  order: -3;
 }
 & .document-toc-item:has([href="#specifications" i]) {
  order: -2;
 }
 & .document-toc-item:has([href="#resources" i]) {
  order: -1;
 }
 & .document-toc-item:has([href="#see_also" i]) {
  order: -1;
 }
}
/*
for pages wit multiple compat tables scattered
e.g.: https://developer.mozilla.org/en-US/docs/Web/CSS/hue-interpolation-method
keeping separate from above to keep compat with older UAs
*/
[id]:has(+ a.bc-github-link + .table-container .bc-table) {
 & {
  font-size: 1.1rem;
  position: relative;
  z-index: 1;
  margin: 0 3em 0 0;
  align-self: flex-start;

 }
 & + a.bc-github-link {
  margin-top: -1.5rem;
  margin-left: 3em;
 }
 &,
 & + a.bc-github-link,
 & + a.bc-github-link + .table-container {
  order: -2;
 }
}

.table-container:has(.bc-table) ~ .table-container:has(.bc-table) thead {

 & *:not(.bc-head-icon-symbol){
  height: 0px !important;
  overflow: hidden;
  padding: 0;
  margin: 0;
  line-height: 0;
 }
 & .bc-head-icon-symbol,
 & .bc-head-icon-symbol::before {
  --_w: 2ch;
  height: var(--_w) !important;
  background-size: var(--_w) var(--_w) !important;
  background-repeat: no-repeat;
 }
}


/*
 Pull Specifications Table below Compatibility table
*/
[aria-labelledby="specifications"],
/* this is probably obsolete */
:is([id="Specifications" i], [id="Specification" i]),
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table, div[class="notecard warning"]) {
 order: -1;
 border-left: none;
 margin-top: 0 !important;
}

 /*
  Pull "See also" and "Resources" up (below specifications)
  // Yay, we can now target sections by aria attributes!
  // We don't even need upcoming :has() anymore!
 */
 section[aria-labelledby="resources"],
 section[aria-labelledby="see_also"] {
  order: -1;
 }

 
/*
  main heading: above all, after all, and slightly dimmer;
 */
 .main-page-content > h1 {
  order: -2;
  margin: 0 !important;
  opacity: .6;
 }
 main#content {
  padding-top: 0;
 }
 
 section[aria-labelledby="resources"] h2[id="resources"],
 section[aria-labelledby="see_also"] h2[id="see_also"] {
   font-size: 1.2rem;
   margin: .8em 0 0
 }

/*
 * remake Specifications Table into condensed and reversed "list"
 * • 3 columns without status badge (Specification | Comment | Feedback)
 *   e.g. https://developer.mozilla.org/en-US/docs/Web/CSS/@media#Specifications
 *   ->  (counter) Specification Comment Feedback
 * • 3 columns with status badge (Specification | Status | Comment)
 * e.g. https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Specifications
 *  -> Status (badge) Specification (link) Comment
 * • 2 columns (Specification | Title)
 * e.g. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expires#Specifications
 * 	-> Title Specification (link)
 * // the only page using `#Specification` instead of `#Specifications` was https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML
*/

:is([id="Specifications" i], [id="Specification" i]) + :is(table.standard-table, div > table.standard-table) tbody {
display: flex;
flex-direction: column-reverse;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) th,
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td br {
 display: none !important;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td {
 background-color: transparent !important;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td,
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td * {
 display: inline !important;
 padding: 0;
 border: none !important;
 box-shadow: none !important;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td:nth-child(1) small {
 padding-left: 1ch;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr {
 border-bottom: 1px solid #ccc;
 text-indent: 4rem;
 position: relative;
 counter-increment: specount -1;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr * {
 text-indent: 0 !important; /* whoa, text indent is inherited? */
}
/*
 this is just "fallback"
*/
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody td:first-child::before {
 content: counter(specount, lower-roman) '.';
 width: 4rem;
 text-align: center;
 position: absolute;
 left: 0;
 top: 0;
 opacity: .4;
}
/*
 We don't have nice things, sadly: it's impossible to count "backwards" to 1 starting from items count
 https://github.com/w3c/csswg-drafts/issues/4559#issuecomment-562058086
*/
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(1) { counter-reset: specount 2; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(2) { counter-reset: specount 3; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(3) { counter-reset: specount 4; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(4) { counter-reset: specount 5; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(5) { counter-reset: specount 6; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(6) { counter-reset: specount 7; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(7) { counter-reset: specount 8; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(8) { counter-reset: specount 9; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(9) { counter-reset: specount 10; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(10) { counter-reset: specount 11; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(11) td:first-child::before, 
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(11) ~ tr td:first-child::before {
 content: '•';
}
/* futile attempt */

/*
Status badge is in three columns table [class^="spec-"]
Sadly, there are three columns tables WITHOUT status badges in the middle col :sad face:
 (e.g. https://developer.mozilla.org/en-US/docs/Web/CSS/@media#Browser_compatibility
 contains
 )
 So resorting to little yanky posabs swap.
 Because displayed badge is ::before and text is 'real', I cannot make static placeholder for overflowing tooltip pade from text
*/
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class^="spec-"] {
 white-space: nowrap;
 background-color: #eeeeee !important;
 font-size: 0;
 position: absolute;
 left: 0; top: 0;
 z-index: 1;
 padding-right: 1ch;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class^="spec-"]::after {
 content: '';
 font-size: 1rem;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class^="spec-"]:hover {
 font-size: 1rem;
 box-shadow: 0 0 1ch #fff;
 padding-right: 1ch;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class^="spec-"]::before {
 content: attr(class);
 pointer-events: all;
 margin: 0;
 padding: 0;
 padding-left: 1ch;
 padding-right: 1ch;
 font-size: 1rem;
}
/*
 ::before contents removed in 
 https://github.com/mdn/mdn-minimalist/commit/c702743a06df0bda9318f4e60b54157cece8df6a
 restoring something resembling state from
 https://github.com/mdn/mdn-minimalist/blob/978e0b075d6fb12432a99307ca22c9263d41d406/sass/atoms/_meta.scss
*/
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-living"]::before { content: "LS"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-standard"]::before { content: "ST"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-rec"]::before { content: "REC"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-cr"]::before { content: "CR"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-pr"]::before { content: "PR"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-rfc"]::before { content: "RFC"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-wd"]::before { content: "WD"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-draft"]::before { content: "D"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-lc"]::before { content: "LC"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-ed"]::before { content: "ED"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-obsolete"]::before { content: "O"; }
/*  */

 
/*
 Hide "The definition of '%feature%' in that specification."
 Redundant.
*/
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td:nth-child(1) > a[href*="#"] > br + small {
 display: none !important;
}
 
/*
 Hiding unnecessary headings
 (display: none; breaks anchors)
*/
[id="Specification" i],
[id="Specifications" i],
[id="Browser_compatibility" i] {
 height: 0 !important;
 overflow: hidden;
 padding: 0 !important;
 margin: 0 !important;
}

.bc-table {
 margin-top: 0 !important;  
 margin-bottom: 0 !important;
}
.bc-table td:empty {
 background-color: inherit !important;
}
/* compact table headers - icons only */
.bc-table .bc-platforms > th {
 padding: 0;
 border-top: 1px solid;
 height: 1em !important;
 overflow: visible;
}
.bc-table .bc-platforms > th::before {
 position: absolute;
 top: -1.4em;
}
.bc-table thead,
.bc-table .bc-platforms, 
.bc-table .bc-platforms > th,
.bc-table .bc-platforms > th::before {
 background-color: inherit;
}
/*
§ attempt to have BDC browsers header sticky
 will probably cause horizontal scroll of entire page
 sadly necessary
*/
.table-container:has(.bc-table) {
 overflow: visible;
}
.table-container-inner {
 padding-right: 0;
}
.bc-table thead .bc-browsers{
 background-color: var(--background-primary);
 position: sticky;
 top: 0;
 z-index: 1
}

.bc-table .bc-browsers th {
 padding: 0;
 height: 2rem;
 overflow: hidden;
}

/* browser headers: hide text until hover */

 th.bc-browser {
  position: relative !important;
  overflow: visible !important;
 }
 th.bc-browser:not(:hover) .bc-head-txt-label {
  opacity: 0;
 }
 .bc-head-icon-symbol {
  opacity: .7; /* too glaring */
 }
 th.bc-browser .bc-head-txt-label {
  display: block !important; /* reverting other tweaks */
  background-color: var(--background-primary) !important;
  writing-mode: horizontal-tb;
  transform: translate(50%);
  position: absolute;
  top: auto;
  right: 50%;
  left: auto;
  bottom: 100%;
  padding: .5em 1em;
  border: 1px solid var(--border-secondary);
 }
 th.bc-browser:last-child .bc-head-txt-label {
  transform: none;
  right: 0;
 }
 

/* history dropdown toggle smaller */
.bc-history-link.only-icon {
 border: none;
 text-align: right;
}
.ic-history {border-right: 0.35rem solid transparent
}
.text-content .bc-has-history.active .bc-history-link {
 max-width: 2em
}
.bc-history-link {
 height: 8px;
}
td[aria-expanded="false"]:not(:hover) .bc-history-link {
 opacity: .5 !important;
}

/*
"⚠" badges in theads
* OFF 2022-04-04 - messed in cells /
.bc-table-row-header {

}
.bc-table-row-header * {
}
.bc-table-row-header .bc-icons {
 position: absolute;
 right: 0; line-height: 2.1;
}
.bc-table-row-header:not(:hover) .bc-icons {
 opacity: 0.7

}

/*
text underflow fix in label cells
e.g. https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
*/
.bc-table-row-header code {
 white-space: normal;
}

/*
 Legend is redundant for us
*/ 
.bc-legend {
 display: none;
} 

/*
footnote "*" (stars) are quite redundant as well
make them small and not let them wrap 
*/
.bc-table td[class^="bc-browser"] .bc-icons {
 position: absolute;
}
.bc-table td[class^="bc-browser"] .bc-icons *,
.bc-table td[class^="bc-browser"] .bc-icons *::before{
 background-size: .4rem !important;
 background-repeat: no-repeat !important;
}


/*
 wild formatting paragraphs appears
*/
p:empty {
 display: none;
}
.text-content dd:last-child {
 margin-bottom: 0;
}
 


/*
"Report problems…"
*/
.bc-github-link {
 text-align: right;
 align-self: flex-end;
 display: block;
 position: relative;
 z-index: 0;
}
.bc-github-link:not(:hover) {
 color: transparent !important;
}
/* collision with compacted headings in multiple bc tables */
.bc-github-link:hover {
 z-index: 2;
 background-color: var(--background-primary);
 
}

/*
visually accessible markers of support levels for when background images are not rendered
WHCM or user style
*/
.bc-level-yes::before {
 content: '✓';
 color: transparent;
}
.bc-level-no::before {
 content: '✗';
 color: transparent;
}

/*
<span class="bc-version-label" title="Released 2018-10-02">18</span>
*/
/*
 Release dates in cell tooltips visible

*/
.bc-version-label[title^="Released "] {
 position: relative;
 margin: 0 -.5em;
 z-index: 0;
}
.bc-version-label[title^="Released "]::after {
 content: attr(title);
 display: block;
 font-family: monospace;
 opacity: .5;
 font-size: 12px;
 line-height: 1em;
 margin: -1em 0em 0 0;
 clip-path: inset(50% 0 0 0);
}
/* for now pull out only in detail */
/* * OFF, not exitent anymore? /
.bc-notes-wrapper .bcd-cell-text-copy {
 text-align: center;
}
.bc-notes-wrapper .bc-version-label::after {
 content: attr(title);
 display: block;
}
/* */
/*
END of MDN: Compat table: first and compact
*/
h4:is([id^="html_"],[id^="css_"],[id^="javascript_"]):has(+.code-example) {
 display: none;
 outline: #0FF6 solid; outline-offset: -2px;
}
.code-example ,
.code-example pre {
 margin: 0 !important;
}

}

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址