diff --git a/src/dockle/sphinx/themes/dockle/static/dockle.css b/src/dockle/sphinx/themes/dockle/static/dockle.css index 7a8af89..64b9232 100644 --- a/src/dockle/sphinx/themes/dockle/static/dockle.css +++ b/src/dockle/sphinx/themes/dockle/static/dockle.css @@ -151,11 +151,11 @@ h6:hover > .headerlink, visibility: visible; } -.dockle-heading-anchor { +html[data-dockle-framework] .dockle-heading-anchor { align-items: center; background: transparent; border-radius: 0.25rem; - color: var(--dockle-muted) !important; + color: var(--dockle-muted); display: inline-flex; font-size: 0.65em; line-height: 1; @@ -163,7 +163,7 @@ h6:hover > .headerlink, opacity: 0; padding: 0.15em; position: absolute; - text-decoration: none !important; + text-decoration: none; transform: translateY(0.08em); transition: background-color 120ms ease, @@ -172,26 +172,26 @@ h6:hover > .headerlink, visibility: hidden; } -:where(h1, h2, h3, h4, h5, h6):hover > .dockle-heading-anchor, -:where(h1, h2, h3, h4, h5, h6):focus-within > .dockle-heading-anchor { +html[data-dockle-framework] :where(h1, h2, h3, h4, h5, h6):hover > .dockle-heading-anchor, +html[data-dockle-framework] :where(h1, h2, h3, h4, h5, h6):focus-within > .dockle-heading-anchor { opacity: 0.72; visibility: visible; } -.dockle-heading-anchor:hover, -.dockle-heading-anchor:focus-visible { +html[data-dockle-framework] .dockle-heading-anchor:hover, +html[data-dockle-framework] .dockle-heading-anchor:focus-visible { background: var(--dockle-background-secondary); - color: var(--dockle-primary) !important; + color: var(--dockle-primary); opacity: 1; visibility: visible; } -.dockle-heading-anchor:focus-visible { +html[data-dockle-framework] .dockle-heading-anchor:focus-visible { outline: 2px solid var(--dockle-primary); outline-offset: 2px; } -.dockle-heading-anchor .lucide { +html[data-dockle-framework] .dockle-heading-anchor .lucide { height: 1em; width: 1em; } @@ -224,7 +224,7 @@ h6:hover > .headerlink, } @media (hover: none) { - .dockle-heading-anchor { + html[data-dockle-framework] .dockle-heading-anchor { opacity: 0.72; visibility: visible; } @@ -254,10 +254,10 @@ pre, div.fragment, .highlight, .source { - background: var(--dockle-code-background) !important; - border: 1px solid var(--dockle-border) !important; + background: var(--dockle-code-background); + border: 1px solid var(--dockle-border); border-radius: var(--dockle-radius); - box-shadow: none !important; + box-shadow: none; font-size: 1rem; line-height: 1.5; overflow-x: auto; @@ -272,9 +272,9 @@ html[data-dockle-framework="doxygen"] #doc-content .contents img { } html[data-dockle-framework="doxygen"] span.tt { - background: var(--dockle-code-background) !important; + background: var(--dockle-code-background); border-radius: 0.2rem; - color: var(--dockle-content) !important; + color: var(--dockle-content); font-family: var(--dockle-code-font); padding: 0.12em 0.28em; } @@ -289,19 +289,19 @@ pre code { } .highlight pre { - border: 0 !important; + border: 0; margin: 0; } /* Normalize each generator's native syntax tokens to one shared palette. */ -:where(.highlight, .codehilite) :is(.c, .ch, .cm, .cp, .cpf, .c1, .cs), +:is(.highlight, .codehilite) :is(.c, .ch, .cm, .cp, .cpf, .c1, .cs), .hljs :is(.hljs-comment, .hljs-quote), html[data-dockle-framework="jsdoc"] pre.prettyprint .com, html[data-dockle-framework="rustdoc"] pre :is(.comment, .doccomment) { - color: var(--dockle-code-comment) !important; + color: var(--dockle-code-comment); } -:where(.highlight, .codehilite) :is(.k, .kc, .kd, .kn, .kp, .kr, .kt), +:is(.highlight, .codehilite) :is(.k, .kc, .kd, .kn, .kp, .kr, .kt), .hljs :is( .hljs-keyword, @@ -312,10 +312,10 @@ html[data-dockle-framework="rustdoc"] pre :is(.comment, .doccomment) { ), html[data-dockle-framework="jsdoc"] pre.prettyprint :is(.kwd, .typ), html[data-dockle-framework="rustdoc"] pre :is(.kw, .kw-2, .self-val) { - color: var(--dockle-code-keyword) !important; + color: var(--dockle-code-keyword); } -:where(.highlight, .codehilite) :is(.nb, .nc, .nd, .ne, .nf, .nl, .nn, .nt), +:is(.highlight, .codehilite) :is(.nb, .nc, .nd, .ne, .nf, .nl, .nn, .nt), .hljs :is( .hljs-attribute, @@ -332,31 +332,31 @@ html[data-dockle-framework="rustdoc"] pre :is(.kw, .kw-2, .self-val) { ), html[data-dockle-framework="jsdoc"] pre.prettyprint :is(.atn, .tag), html[data-dockle-framework="rustdoc"] pre :is(.macro, .prelude-ty, .prelude-val, .primitive) { - color: var(--dockle-code-name) !important; + color: var(--dockle-code-name); } -:where(.highlight, .codehilite) :is(.m, .mb, .mf, .mh, .mi, .mo, .il), +:is(.highlight, .codehilite) :is(.m, .mb, .mf, .mh, .mi, .mo, .il), .hljs :is(.hljs-number, .hljs-meta), html[data-dockle-framework="jsdoc"] pre.prettyprint .lit, html[data-dockle-framework="rustdoc"] pre :is(.bool-val, .number) { - color: var(--dockle-code-number) !important; + color: var(--dockle-code-number); } -:where(.highlight, .codehilite) :is(.o, .ow), +:is(.highlight, .codehilite) :is(.o, .ow), html[data-dockle-framework="rustdoc"] pre :is(.lifetime, .question-mark) { - color: var(--dockle-code-operator) !important; + color: var(--dockle-code-operator); } -:where(.highlight, .codehilite) +:is(.highlight, .codehilite) :is(.s, .sa, .sb, .sc, .dl, .sd, .s1, .s2, .se, .sh, .si, .sr, .ss, .sx), .hljs :is(.hljs-string, .hljs-regexp, .hljs-deletion), html[data-dockle-framework="jsdoc"] pre.prettyprint :is(.atv, .str), html[data-dockle-framework="rustdoc"] pre :is(.string, .string-2) { - color: var(--dockle-code-string) !important; + color: var(--dockle-code-string); } .hljs { - background: transparent !important; + background: transparent; color: inherit; } @@ -451,7 +451,7 @@ div.fragment > code.hljs { .dockle-language-toc { list-style: none; margin: 0.3rem 0 0; - padding-left: 0.75rem !important; + padding-left: 0.75rem; } .dockle-language-toc > li { @@ -517,9 +517,9 @@ td > .dockle-code-block { .dockle-copy-button:hover, .dockle-copy-button:focus-visible { - background: var(--dockle-background-secondary) !important; - color: var(--dockle-primary) !important; - opacity: 1 !important; + background: var(--dockle-background-secondary); + color: var(--dockle-primary); + opacity: 1; } .dockle-copy-button:focus-visible { @@ -528,9 +528,9 @@ td > .dockle-code-block { } blockquote { - background: var(--dockle-background-secondary) !important; + background: var(--dockle-background-secondary); border-left: 0.25rem solid var(--dockle-primary); - color: var(--dockle-content) !important; + color: var(--dockle-content); margin: 1rem 0; padding: 0.75rem 1rem; } @@ -551,16 +551,21 @@ table { overflow-x: auto; } +/* Outrank generator table styles while retaining their text alignment. */ +html[data-dockle-framework] th, +html[data-dockle-framework] td { + border: 1px solid var(--dockle-border); + padding: 0.55rem 0.8rem; +} + th, td { - border: 1px solid var(--dockle-border) !important; - padding: 0.55rem 0.8rem !important; text-align: left; } -th { - background: var(--dockle-background-secondary) !important; - color: var(--dockle-content) !important; +html[data-dockle-framework] th { + background: var(--dockle-background-secondary); + color: var(--dockle-content); } .dockle-alias-table { @@ -596,13 +601,16 @@ dl[class] > dd { margin-left: 1rem; } +html[data-dockle-framework] .dockle-alert { + background: var(--dockle-background-secondary); + border: 1px solid var(--dockle-border); + border-left: 0.25rem solid var(--dockle-alert-color); + box-shadow: none; +} + .dockle-alert { --dockle-alert-color: #2563eb; - background: var(--dockle-background-secondary) !important; - border: 1px solid var(--dockle-border) !important; - border-left: 0.25rem solid var(--dockle-alert-color) !important; border-radius: var(--dockle-radius); - box-shadow: none !important; overflow: hidden; padding: 0; } @@ -617,14 +625,14 @@ dl.dockle-alert, .dockle-alert-title, .admonition-title { align-items: center; - background: color-mix(in srgb, var(--dockle-alert-color) 16%, var(--dockle-background)) !important; + background: color-mix(in srgb, var(--dockle-alert-color) 16%, var(--dockle-background)); border: 0; border-bottom: 1px solid color-mix(in srgb, var(--dockle-alert-color) 32%, transparent); - color: var(--dockle-alert-color) !important; + color: var(--dockle-alert-color); display: flex; font-weight: 700; gap: 0.45rem; - margin: 0 !important; + margin: 0; padding: 0.45rem 0.8rem; } @@ -638,7 +646,7 @@ dl.dockle-alert, } dl.dockle-alert > dd { - margin: 0 !important; + margin: 0; padding: 0.8rem 1rem; } @@ -720,7 +728,7 @@ dl.dockle-alert > dd { } .dockle-tab-panel[hidden] { - display: none !important; + display: none; } .dockle-tab-panel > :first-child { @@ -1149,7 +1157,7 @@ html[data-dockle-framework="rustdoc"] .sidebar::before { .dockle-on-this-page a.dockle-toc-current, #page-nav a.dockle-toc-current { background: color-mix(in srgb, var(--dockle-primary) 12%, transparent); - color: var(--dockle-primary) !important; + color: var(--dockle-primary); font-weight: 600; } @@ -1210,7 +1218,7 @@ a.dockle-page-action:visited { background: var(--dockle-background-secondary); border: 1px solid var(--dockle-border); border-radius: 50%; - color: var(--dockle-content) !important; + color: var(--dockle-content); display: inline-flex; flex: 0 0 2.6rem; height: 2.6rem; @@ -1223,7 +1231,7 @@ a.dockle-page-action:visited { a.dockle-page-action:hover, a.dockle-page-action:focus-visible { border-color: var(--dockle-primary); - color: var(--dockle-primary) !important; + color: var(--dockle-primary); } .dockle-page-action:focus-visible { @@ -1415,7 +1423,7 @@ a.dockle-page-action:focus-visible { .dockle-portal-card:hover { border-color: var(--dockle-primary); - text-decoration: none !important; + text-decoration: none; transform: translateY(-2px); } @@ -1447,28 +1455,28 @@ html[data-dockle-framework="doxygen"] { html[data-dockle-framework="doxygen"] #top, html[data-dockle-framework="doxygen"] #side-nav, html[data-dockle-framework="doxygen"] #nav-tree, -html[data-dockle-framework="doxygen"] .navpath ul, +html[data-dockle-framework="doxygen"] #nav-path ul, html[data-dockle-framework="doxygen"] #titlearea, html[data-dockle-framework="doxygen"] #projectname { - background: var(--dockle-background-secondary) !important; - color: var(--dockle-content) !important; + background: var(--dockle-background-secondary); + color: var(--dockle-content); } html[data-dockle-framework="doxygen"] #side-nav { border-right: 1px solid var(--dockle-border); bottom: 0; - height: 100vh !important; - max-width: var(--dockle-sidebar-width) !important; - min-width: var(--dockle-sidebar-width) !important; - position: fixed !important; - top: 0 !important; - width: var(--dockle-sidebar-width) !important; + height: 100vh; + max-width: var(--dockle-sidebar-width); + min-width: var(--dockle-sidebar-width); + position: fixed; + top: 0; + width: var(--dockle-sidebar-width); z-index: 20; } html[data-dockle-framework="doxygen"] #top { border: 0; - height: auto !important; + height: auto; position: static; width: 100%; } @@ -1481,10 +1489,10 @@ html[data-dockle-framework="doxygen"] #titlearea table, html[data-dockle-framework="doxygen"] #titlearea tbody, html[data-dockle-framework="doxygen"] #titlearea tr, html[data-dockle-framework="doxygen"] #titlearea td { - border: 0 !important; + border: 0; display: block; - padding: 0 !important; - width: auto !important; + padding: 0; + width: auto; } html[data-dockle-framework="doxygen"] #projectname { @@ -1503,13 +1511,13 @@ html[data-dockle-framework="doxygen"] #projectbrief { } html[data-dockle-framework="doxygen"] #MSearchBox { - display: none !important; + display: none; } html[data-dockle-framework="doxygen"] #nav-tree { border: 0; box-sizing: border-box; - height: 100vh !important; + height: 100vh; overflow-anchor: none; overflow: auto; padding: var(--dockle-sidebar-header-height) var(--dockle-sidebar-padding) 4.25rem; @@ -1524,7 +1532,7 @@ html[data-dockle-framework="doxygen"] #nav-tree-contents { html[data-dockle-framework="doxygen"] #nav-tree ul.children_ul { list-style: none; margin: 0; - padding-left: 0.85rem !important; + padding-left: 0.85rem; } html[data-dockle-framework="doxygen"] #nav-tree li { @@ -1546,14 +1554,14 @@ html[data-dockle-framework="doxygen"] #nav-tree .label { } html[data-dockle-framework="doxygen"] #nav-tree a { - color: var(--dockle-muted) !important; + color: var(--dockle-muted); text-decoration: none; } html[data-dockle-framework="doxygen"] #nav-tree a[href="javascript:void(0)"], html[data-dockle-framework="doxygen"] #nav-tree .arrow, html[data-dockle-framework="doxygen"] #page-nav .arrow { - display: none !important; + display: none; } html[data-dockle-framework="doxygen"] #nav-tree-contents > ul > li > .item { @@ -1561,7 +1569,7 @@ html[data-dockle-framework="doxygen"] #nav-tree-contents > ul > li > .item { } html[data-dockle-framework="doxygen"] #nav-tree-contents > ul > li > .children_ul { - padding-left: 0 !important; + padding-left: 0; } html[data-dockle-framework="doxygen"] #page-nav ul.page-outline ul { @@ -1579,83 +1587,83 @@ html[data-dockle-framework="doxygen"] #nav-tree .selected a, html[data-dockle-framework="doxygen"] #nav-tree .dockle-current-item a, html[data-dockle-framework="doxygen"] #nav-tree .item:hover a, html[data-dockle-framework="doxygen"] #nav-tree a:hover { - background-image: none !important; - color: var(--dockle-primary) !important; - text-decoration: none !important; + background-image: none; + color: var(--dockle-primary); + text-decoration: none; } html[data-dockle-framework="doxygen"] .glow:not(.dockle-anchor-highlight) { - background: transparent !important; - box-shadow: none !important; - text-shadow: none !important; + background: transparent; + box-shadow: none; + text-shadow: none; } html[data-dockle-framework="doxygen"] div.fragment .clipboard { - display: none !important; + display: none; } html[data-dockle-framework="doxygen"] div.fragment, html[data-dockle-framework="doxygen"] div.fragment > .line { - color: var(--dockle-content) !important; + color: var(--dockle-content); } html[data-dockle-framework="doxygen"] div.fragment.dockle-code-block, html[data-dockle-framework="doxygen"] div.fragment.dockle-code-block > .line { - font-family: var(--dockle-code-font) !important; - font-size: 1rem !important; - line-height: 1.5 !important; + font-family: var(--dockle-code-font); + font-size: 1rem; + line-height: 1.5; } html[data-dockle-framework="doxygen"] div.fragment.dockle-code-block > .line:not(:has(.lineno)) { - padding-left: 0 !important; - text-indent: 0 !important; + padding-left: 0; + text-indent: 0; } html[data-dockle-framework="doxygen"] div.fragment span.comment { - color: var(--dockle-code-comment) !important; + color: var(--dockle-code-comment); } html[data-dockle-framework="doxygen"] div.fragment :is(span.keyword, span.keywordflow, span.vhdlkeyword) { - color: var(--dockle-code-keyword) !important; + color: var(--dockle-code-keyword); } html[data-dockle-framework="doxygen"] div.fragment :is(span.keywordtype, span.preprocessor) { - color: var(--dockle-code-name) !important; + color: var(--dockle-code-name); } html[data-dockle-framework="doxygen"] div.fragment :is(span.vhdldigit, span.vhdllogic) { - color: var(--dockle-code-number) !important; + color: var(--dockle-code-number); } html[data-dockle-framework="doxygen"] div.fragment :is(span.charliteral, span.stringliteral) { - color: var(--dockle-code-string) !important; + color: var(--dockle-code-string); } html[data-dockle-framework="doxygen"] #nav-sync, html[data-dockle-framework="doxygen"] .ui-resizable-handle { - display: none !important; + display: none; } html[data-dockle-framework="doxygen"] #doc-content { - height: auto !important; - margin-left: var(--dockle-sidebar-width) !important; + height: auto; + margin-left: var(--dockle-sidebar-width); min-height: 100vh; - overflow: visible !important; - width: auto !important; + overflow: visible; + width: auto; } html[data-dockle-framework="doxygen"] #doc-content div.header { - background: transparent !important; + background: transparent; border-bottom: 0; margin: 0; } @@ -1702,30 +1710,30 @@ html[data-dockle-framework="doxygen"] #doc-content .contents table { } html[data-dockle-framework="doxygen"] #page-nav { - background: var(--dockle-background) !important; - border-left: 0 !important; + background: var(--dockle-background); + border-left: 0; bottom: 2rem; color: var(--dockle-muted); - display: block !important; - overflow-x: hidden !important; - overflow-y: auto !important; - position: fixed !important; + display: block; + overflow-x: hidden; + overflow-y: auto; + position: fixed; right: var(--dockle-content-gutter); top: 2rem; - width: var(--dockle-page-toc-width) !important; + width: var(--dockle-page-toc-width); z-index: 10; } html[data-dockle-framework="doxygen"].dockle-has-page-toc:not(.dockle-native-page-toc) #doc-content { - margin-right: var(--dockle-page-toc-width) !important; + margin-right: var(--dockle-page-toc-width); } html[data-dockle-framework="doxygen"].dockle-native-page-toc #doc-content { - margin-right: 0 !important; + margin-right: 0; } html[data-dockle-framework="doxygen"] #page-nav-resize-handle { - background: var(--dockle-border) !important; + background: var(--dockle-border); } html[data-dockle-framework="doxygen"] #page-nav-contents { @@ -1759,10 +1767,10 @@ html[data-dockle-framework="doxygen"] #page-nav .dockle-toc-depth-2 { html[data-dockle-framework="doxygen"] #page-nav ul.page-outline li a { border-radius: 0.25rem; - color: var(--dockle-muted) !important; + color: var(--dockle-muted); display: block; font-family: var(--dockle-font); - font-size: 0.85rem !important; + font-size: 0.85rem; margin-left: -0.4rem; padding: 0.2rem 0.4rem; text-decoration: none; @@ -1770,7 +1778,7 @@ html[data-dockle-framework="doxygen"] #page-nav ul.page-outline li a { html[data-dockle-framework="doxygen"] #page-nav ul.page-outline li.vis > a, html[data-dockle-framework="doxygen"] #page-nav ul.page-outline li a:hover { - color: var(--dockle-primary) !important; + color: var(--dockle-primary); } html[data-dockle-framework="doxygen"] #page-nav ul.page-outline li.vis { @@ -1778,7 +1786,7 @@ html[data-dockle-framework="doxygen"] #page-nav ul.page-outline li.vis { } html[data-dockle-framework="doxygen"] #page-nav ul.page-outline li.vis::after { - content: none !important; + content: none; } html[data-dockle-framework="doxygen"] h2.groupheader, @@ -1804,29 +1812,29 @@ html[data-dockle-framework="doxygen"] dl.note dt, html[data-dockle-framework="doxygen"] dl.warning dt, html[data-dockle-framework="doxygen"] dl.important dt, html[data-dockle-framework="doxygen"] dl.attention dt { - color: var(--dockle-content) !important; + color: var(--dockle-content); } html[data-dockle-framework="doxygen"] table.memberdecls tr.heading > td, html[data-dockle-framework="doxygen"] table.memberdecls tr.groupHeader > td, html[data-dockle-framework="doxygen"] table.memberdecls tr.inherit_header > td { background: transparent; - border: 0 !important; - padding: 0 !important; + border: 0; + padding: 0; } -html[data-dockle-framework="doxygen"] table.memberdecls .memItemLeft, -html[data-dockle-framework="doxygen"] table.memberdecls .memItemRight, -html[data-dockle-framework="doxygen"] table.memberdecls .memTemplParams { +html[data-dockle-framework="doxygen"] #doc-content table.memberdecls .memItemLeft, +html[data-dockle-framework="doxygen"] #doc-content table.memberdecls .memItemRight, +html[data-dockle-framework="doxygen"] #doc-content table.memberdecls .memTemplParams { background: var(--dockle-background-secondary); - border-color: var(--dockle-border) !important; + border-color: var(--dockle-border); } -html[data-dockle-framework="doxygen"] table.memberdecls .mdescLeft, -html[data-dockle-framework="doxygen"] table.memberdecls .mdescRight, -html[data-dockle-framework="doxygen"] table.memberdecls .memSeparator { +html[data-dockle-framework="doxygen"] #doc-content table.memberdecls .mdescLeft, +html[data-dockle-framework="doxygen"] #doc-content table.memberdecls .mdescRight, +html[data-dockle-framework="doxygen"] #doc-content table.memberdecls .memSeparator { background: transparent; - border-color: var(--dockle-border) !important; + border-color: var(--dockle-border); } html[data-dockle-framework="doxygen"] div.directory { @@ -1848,24 +1856,24 @@ html[data-dockle-framework="doxygen"] table.directory { html[data-dockle-framework="doxygen"] table.directory tr.even, html[data-dockle-framework="doxygen"] table.directory tr.odd { - background: transparent !important; + background: transparent; } html[data-dockle-framework="doxygen"] table.directory tr:nth-child(even) { - background: var(--dockle-background-secondary) !important; + background: var(--dockle-background-secondary); } html[data-dockle-framework="doxygen"] table.directory tr:hover { - background: color-mix(in srgb, var(--dockle-primary) 8%, transparent) !important; + background: color-mix(in srgb, var(--dockle-primary) 8%, transparent); } html[data-dockle-framework="doxygen"] table.directory td.entry, html[data-dockle-framework="doxygen"] table.directory td.desc { - background: transparent !important; - border-color: var(--dockle-border) !important; + background: transparent; + border-color: var(--dockle-border); color: var(--dockle-content); line-height: 1.5; - padding: 0.65rem 0.8rem !important; + padding: 0.65rem 0.8rem; } html[data-dockle-framework="doxygen"] .levels { @@ -1875,7 +1883,7 @@ html[data-dockle-framework="doxygen"] .levels { } html[data-dockle-framework="doxygen"] .levels a { - color: var(--dockle-primary) !important; + color: var(--dockle-primary); text-decoration: none; } @@ -1886,15 +1894,15 @@ html[data-dockle-framework="doxygen"] .icona { } html[data-dockle-framework="doxygen"] .icon { - background: var(--dockle-primary) !important; + background: var(--dockle-primary); border-radius: 0.2rem; - color: white !important; + color: white; font-family: var(--dockle-font); } html[data-dockle-framework="doxygen"] .classindex dl.even, html[data-dockle-framework="doxygen"] .classindex dl.odd { - background: transparent !important; + background: transparent; border-bottom: 1px solid var(--dockle-border); } @@ -1907,7 +1915,7 @@ html[data-dockle-framework="doxygen"] .dockle-compat-brand { } html[data-dockle-framework="doxygen"] #nav-path { - display: none !important; + display: none; } html[data-dockle-framework="doxygen"] .dockle-generated-page-links { @@ -1916,31 +1924,31 @@ html[data-dockle-framework="doxygen"] .dockle-generated-page-links { html[data-dockle-framework="doxygen"] .dockle-alert, html[data-dockle-framework="doxygen"] .dockle-alert dd { - color: var(--dockle-content) !important; + color: var(--dockle-content); } html[data-dockle-framework="doxygen"] .memitem, html[data-dockle-framework="doxygen"] .memproto, html[data-dockle-framework="doxygen"] .memdoc { - background: var(--dockle-background-secondary) !important; - border-color: var(--dockle-border) !important; - box-shadow: none !important; + background: var(--dockle-background-secondary); + border-color: var(--dockle-border); + box-shadow: none; } html[data-dockle-framework="doxygen"] .memitem { - border: 1px solid var(--dockle-border) !important; + border: 1px solid var(--dockle-border); border-radius: var(--dockle-radius); overflow: hidden; } html[data-dockle-framework="doxygen"] .memproto { - border: 0 !important; - border-bottom: 1px solid var(--dockle-border) !important; + border: 0; + border-bottom: 1px solid var(--dockle-border); padding: 0.8rem; } html[data-dockle-framework="doxygen"] .memdoc { - border: 0 !important; + border: 0; padding: 0.8rem 1rem; } @@ -1959,7 +1967,7 @@ html[data-dockle-framework="doxygen"] h2.memtitle { @media (min-width: 801px) { html[data-dockle-framework="doxygen"] #main-nav, html[data-dockle-framework="doxygen"] #main-nav-mobile { - display: none !important; + display: none; } } @@ -2075,12 +2083,12 @@ html[data-dockle-framework="jsdoc"] #main article h2 { } html[data-dockle-framework="jsdoc"] #main section { - background: transparent !important; - border: 0 !important; - box-shadow: none !important; + background: transparent; + border: 0; + box-shadow: none; margin: 0 0 2rem; max-width: var(--dockle-content-width); - padding: 0 !important; + padding: 0; } html[data-dockle-framework="jsdoc"] #main article { @@ -2102,26 +2110,26 @@ html[data-dockle-framework="jsdoc"] #main > .dockle-built-with { html[data-dockle-framework="jsdoc"] .signature, html[data-dockle-framework="jsdoc"] .type-signature { - color: var(--dockle-muted) !important; + color: var(--dockle-muted); } html[data-dockle-framework="jsdoc"] :is(.params, .props) .name code { - background: var(--dockle-code-background) !important; - color: var(--dockle-content) !important; + background: var(--dockle-code-background); + color: var(--dockle-content); } html[data-dockle-framework="jsdoc"] pre.prettyprint code { - background: transparent !important; - color: var(--dockle-content) !important; - padding: 0 !important; + background: transparent; + color: var(--dockle-content); + padding: 0; } html[data-dockle-framework="jsdoc"] pre.prettyprint .pln, html[data-dockle-framework="jsdoc"] pre.prettyprint .pun { - color: var(--dockle-content) !important; + color: var(--dockle-content); } /* rustdoc. */ @@ -2142,30 +2150,30 @@ html[data-dockle-framework="rustdoc"] { } html[data-dockle-framework="rustdoc"] #main-content :target { - animation: none !important; - background: transparent !important; - border-right: 0 !important; + animation: none; + background: transparent; + border-right: 0; } html[data-dockle-framework="rustdoc"] #main-content :target.dockle-anchor-highlight { - animation: dockle-anchor-highlight 650ms ease-out !important; + animation: dockle-anchor-highlight 650ms ease-out; } html[data-dockle-framework="rustdoc"] .sidebar { - background: var(--dockle-background-secondary) !important; + background: var(--dockle-background-secondary); border-right: 1px solid var(--dockle-border); box-sizing: border-box; overflow-anchor: none; - padding-bottom: 4.25rem !important; - padding-top: var(--dockle-sidebar-header-height) !important; + padding-bottom: 4.25rem; + padding-top: var(--dockle-sidebar-header-height); scrollbar-gutter: stable; transition: padding-top 160ms ease-out; } html[data-dockle-framework="rustdoc"] .sidebar-resizer { - display: none !important; + display: none; } html[data-dockle-framework="rustdoc"] .sidebar .sidebar-crate, @@ -2187,7 +2195,7 @@ html[data-dockle-framework="rustdoc"] .sidebar h3 { } html[data-dockle-framework="rustdoc"] body.rustdoc:not(.src) > main { - padding: 2rem var(--dockle-content-gutter) 4rem !important; + padding: 2rem var(--dockle-content-gutter) 4rem; } html[data-dockle-framework="rustdoc"] body > main, @@ -2232,13 +2240,14 @@ html[data-dockle-framework="rustdoc"] .sidebar li { } html[data-dockle-framework="rustdoc"] .sidebar a, -html[data-dockle-framework="rustdoc"] .sidebar a:visited { +html[data-dockle-framework="rustdoc"] .sidebar a:visited, +html[data-dockle-framework="rustdoc"] .sidebar a#all-types { border-radius: 0.2rem; - color: var(--dockle-muted) !important; + color: var(--dockle-muted); display: block; font-family: var(--dockle-font); font-size: 0.95rem; - margin: 0 !important; + margin: 0; overflow-wrap: anywhere; padding: 0.25rem 0.35rem; text-decoration: none; @@ -2248,7 +2257,7 @@ html[data-dockle-framework="rustdoc"] .sidebar a:hover, html[data-dockle-framework="rustdoc"] .sidebar a.dockle-current, html[data-dockle-framework="rustdoc"] .sidebar a[aria-current="page"] { background: color-mix(in srgb, var(--dockle-primary) 10%, transparent); - color: var(--dockle-primary) !important; + color: var(--dockle-primary); } html[data-dockle-framework="rustdoc"] .sidebar .version { @@ -2258,11 +2267,11 @@ html[data-dockle-framework="rustdoc"] .sidebar .version { } html[data-dockle-framework="rustdoc"] .search-form { - display: none !important; + display: none; } html[data-dockle-framework="rustdoc"] #search-button { - display: none !important; + display: none; } html[data-dockle-framework="rustdoc"].dockle-component-reference #main-content > .main-heading, @@ -2293,35 +2302,35 @@ html[data-dockle-framework="rustdoc"].dockle-component-reference .top-doc .docbl html[data-dockle-framework="rustdoc"] .rustdoc .main-heading, html[data-dockle-framework="rustdoc"] .rustdoc .sub-heading, html[data-dockle-framework="rustdoc"] .rustdoc .item-table { - border-color: var(--dockle-border) !important; + border-color: var(--dockle-border); } html[data-dockle-framework="rustdoc"] .dockle-code-block > pre { box-sizing: border-box; - font-size: 1rem !important; - line-height: 1.5 !important; + font-size: 1rem; + line-height: 1.5; width: 100%; } html[data-dockle-framework="rustdoc"] .dockle-code-block > pre > code { - background: transparent !important; - border-radius: 0 !important; - font-size: inherit !important; - line-height: inherit !important; - padding: 0 !important; + background: transparent; + border-radius: 0; + font-size: inherit; + line-height: inherit; + padding: 0; } html[data-dockle-framework="rustdoc"] .dockle-code-block > .button-holder { - display: none !important; + display: none; } html[data-dockle-framework="rustdoc"] #copy-path::before, html[data-dockle-framework="rustdoc"] .settings-menu > a::before, html[data-dockle-framework="rustdoc"] .help-menu > a::before, html[data-dockle-framework="rustdoc"] button#toggle-all-docs::before { - content: none !important; + content: none; } html[data-dockle-framework="rustdoc"] #copy-path { @@ -2351,7 +2360,7 @@ html[data-dockle-framework="rustdoc"] .dockle-rustdoc-icon .lucide { } html[data-dockle-framework="rustdoc"] rustdoc-topbar { - background: var(--dockle-background-secondary) !important; + background: var(--dockle-background-secondary); border-bottom: 1px solid var(--dockle-border); color: var(--dockle-content); } @@ -2368,7 +2377,7 @@ html[data-dockle-framework="rustdoc"] rustdoc-topbar { @media (min-width: 801px) and (max-width: 1499px) { html[data-dockle-framework="doxygen"] #page-nav { - display: none !important; + display: none; } html[data-dockle-framework="rustdoc"] .dockle-compat-toc { @@ -2376,7 +2385,7 @@ html[data-dockle-framework="rustdoc"] rustdoc-topbar { } html[data-dockle-framework="doxygen"].dockle-has-page-toc #doc-content { - margin-right: 0 !important; + margin-right: 0; } } @@ -2529,7 +2538,7 @@ html[data-dockle-framework="rustdoc"] rustdoc-topbar { html[data-dockle-framework="jsdoc"] body > main, html[data-dockle-framework="jsdoc"] body > #main, html[data-dockle-framework="doxygen"] #doc-content { - margin-left: 0 !important; + margin-left: 0; } html[data-dockle-framework="jsdoc"].dockle-has-page-toc body > main, @@ -2554,24 +2563,24 @@ html[data-dockle-framework="rustdoc"] rustdoc-topbar { } html[data-dockle-framework="doxygen"] #nav-path { - margin-left: 0 !important; + margin-left: 0; } html[data-dockle-framework="doxygen"] #container { - display: block !important; + display: block; } html[data-dockle-framework="doxygen"] #page-nav { - display: none !important; + display: none; } html[data-dockle-framework="doxygen"] #side-nav { - display: none !important; + display: none; } html[data-dockle-framework="doxygen"] #doc-content { - margin-right: 0 !important; - width: 100% !important; + margin-right: 0; + width: 100%; } html[data-dockle-framework="doxygen"] div.header .title, diff --git a/src/dockle/sphinx/themes/dockle/static/doxygen-settings.js b/src/dockle/sphinx/themes/dockle/static/doxygen-settings.js index 36d8ca6..9d71eb7 100644 --- a/src/dockle/sphinx/themes/dockle/static/doxygen-settings.js +++ b/src/dockle/sphinx/themes/dockle/static/doxygen-settings.js @@ -18,4 +18,37 @@ } return value; }; + + const configureLayout = () => { + // Dockle owns panel geometry; Doxygen still owns tree expansion and scrolling. + // Discard only the inline dimensions that would override the responsive CSS. + const panels = [ + ['side-nav', ['height', 'width']], + ['nav-tree', ['height']], + ['doc-content', ['height', 'margin-left']], + ['page-nav', ['width']], + ]; + for (const [id, properties] of panels) { + const panel = document.getElementById(id); + if (!panel) continue; + const reset = () => { + for (const property of properties) { + if (panel.style.getPropertyValue(property)) { + panel.style.removeProperty(property); + } + } + // Native resizing also reserves a grid column for the page outline. + const container = document.getElementById('container'); + if (id === 'page-nav' && panel.offsetWidth && container) { + container.style.gridTemplateColumns = `auto ${panel.offsetWidth}px`; + } + }; + reset(); + new MutationObserver(reset).observe(panel, { + attributes: true, + attributeFilter: ['style'], + }); + } + }; + document.addEventListener('DOMContentLoaded', configureLayout, { once: true }); })(); diff --git a/tests-js/doxygen-settings.test.mjs b/tests-js/doxygen-settings.test.mjs index 8baf9b7..9845725 100644 --- a/tests-js/doxygen-settings.test.mjs +++ b/tests-js/doxygen-settings.test.mjs @@ -47,6 +47,7 @@ function createBrowser(chromium) { function loadSettings(browser, root, pages = ['index.html', 'usage.html', 'd0/d00/source.html']) { const document = Object.create(browser.cookieDocument); document.currentScript = { src: `https://docs.example.test${root}cookie.js` }; + document.addEventListener = () => {}; const context = createContext({ ...browser, document, URL, dockleDoxygenNavigationPages: pages }); runInContext(cookieSource, context, { filename: fixturePath }); runInContext(runtime, context, { filename: runtimePath }); @@ -139,3 +140,60 @@ test('documentation roots with spaces or Unicode remain distinct', () => { test('Doxygen versions without the Cookie helper are left untouched', () => { assert.doesNotThrow(() => runInContext(runtime, createContext({}), { filename: runtimePath })); }); + +test('responsive layout discards native panel dimensions on initialization and resize', () => { + const panels = new Map(); + for (const id of ['side-nav', 'nav-tree', 'doc-content', 'page-nav']) { + const values = new Map([ + ['height', '999px'], ['width', '250px'], ['margin-left', '250px'], + ['overflow', 'auto'], + ]); + panels.set(id, { style: { + getPropertyValue: (property) => values.get(property) ?? '', + removeProperty: (property) => values.delete(property), + }, values }); + } + const observers = []; + const events = []; + const container = { style: {} }; + panels.get('page-nav').offsetWidth = 224; + const context = createContext({ + Cookie: { readSetting() {} }, + dockleDoxygenNavigationPages: [], + URL, + document: { + currentScript: { src: 'https://docs.example.test/cookie.js' }, + addEventListener: (...args) => events.push(args), + getElementById: (id) => id === 'container' ? container : panels.get(id), + }, + MutationObserver: class { + constructor(callback) { this.callback = callback; } + observe(panel, options) { observers.push({ panel, options, callback: this.callback }); } + }, + }); + runInContext(runtime, context, { filename: runtimePath }); + assert.equal(events[0][0], 'DOMContentLoaded'); + assert.equal(events[0][2].once, true); + events[0][1](); + assert.equal(observers.length, 4); + assert.equal(container.style.gridTemplateColumns, 'auto 224px'); + for (const { panel, options, callback } of observers) { + assert.equal(options.attributes, true); + assert.deepEqual(Array.from(options.attributeFilter), ['style']); + assert.equal(panel.values.get('overflow'), 'auto'); + const removed = ['height', 'width', 'margin-left'].filter((p) => !panel.values.has(p)); + assert.ok(removed.length > 0); + for (const property of removed) panel.values.set(property, '123px'); + callback(); + for (const property of removed) assert.equal(panel.values.has(property), false); + // Repeated delivery after our own removals must not cause more style writes. + panel.style.removeProperty = () => assert.fail('unchanged styles were rewritten'); + callback(); + } + panels.get('page-nav').offsetWidth = 0; + container.style.gridTemplateColumns = 'auto 6px'; + observers[3].callback(); + assert.equal(container.style.gridTemplateColumns, 'auto 6px'); + panels.clear(); + assert.doesNotThrow(() => events[0][1]()); +}); diff --git a/tests/test_sphinx_theme.py b/tests/test_sphinx_theme.py index 42f8a6b..6e166a3 100644 --- a/tests/test_sphinx_theme.py +++ b/tests/test_sphinx_theme.py @@ -26,6 +26,10 @@ def test_theme_contains_owned_template_and_assets(self) -> None: self.assertTrue((THEME_DIRECTORY / "theme.toml").is_file()) self.assertTrue((THEME_DIRECTORY / "layout.html").is_file()) self.assertTrue((THEME_DIRECTORY / "static" / "dockle.css").is_file()) + self.assertNotIn( + "!important", + (THEME_DIRECTORY / "static" / "dockle.css").read_text(encoding="utf-8"), + ) self.assertTrue((THEME_DIRECTORY / "static" / "dockle.js").is_file()) self.assertTrue( (THEME_DIRECTORY / "static" / "lucide.min.js").is_file() @@ -158,7 +162,7 @@ def test_tabs_support_keyboard_navigation_and_named_groups(self) -> None: self.assertIn("dockle-alias-table", stylesheet) self.assertIn(".dockle-tab-list button:focus-visible", stylesheet) self.assertIn(".dockle-tab-panel[hidden]", stylesheet) - self.assertIn("display: none !important", stylesheet) + self.assertIn("display: none", stylesheet) def test_sidebar_identity_stays_pinned_and_compacts_on_scroll(self) -> None: stylesheet = ( @@ -232,7 +236,7 @@ def test_compatibility_adapters_receive_right_page_navigation(self) -> None: self.assertIn("event.stopPropagation()", script) self.assertIn("dockle-compat-toc", script) self.assertIn(".dockle-compat-toc", stylesheet) - self.assertIn("border-left: 0 !important", stylesheet) + self.assertIn("border-left: 0", stylesheet) self.assertIn("contents.replaceChildren()", script) self.assertIn("#page-nav .dockle-toc-depth-1", stylesheet) @@ -275,7 +279,7 @@ def test_sphinx_pages_expose_repository_and_source_actions(self) -> None: self.assertIn(".dockle-page-action", stylesheet) self.assertIn(".dockle-theme-toggle .lucide", stylesheet) self.assertIn(".dockle-repository-icon", stylesheet) - self.assertIn("color: var(--dockle-content) !important", stylesheet) + self.assertIn("color: var(--dockle-content)", stylesheet) self.assertIn(".headertitle\n > .dockle-page-actions", stylesheet) doxygen_title = stylesheet.split( 'html[data-dockle-framework="doxygen"] div.header .title {', 1 @@ -310,11 +314,11 @@ def test_code_blocks_receive_shared_copy_controls(self) -> None: ) self.assertIn("div.fragment .clipboard", stylesheet) self.assertIn( - '#nav-tree a:hover {\n background-image: none !important;', + '#nav-tree a:hover {\n background-image: none;', stylesheet, ) - self.assertIn("font-size: 1rem !important", stylesheet) - self.assertIn("text-indent: 0 !important", stylesheet) + self.assertIn("font-size: 1rem", stylesheet) + self.assertIn("text-indent: 0", stylesheet) def test_code_tokens_and_jsdoc_inline_code_share_theme_colors(self) -> None: stylesheet = ( @@ -399,13 +403,13 @@ def test_rustdoc_uses_shared_lucide_toolbar_icons(self) -> None: self.assertIn("#copy-path::before", stylesheet) self.assertIn( '.dockle-code-block > pre > code {\n' - " background: transparent !important;\n" - " border-radius: 0 !important;", + " background: transparent;\n" + " border-radius: 0;", stylesheet, ) self.assertIn( '.dockle-code-block\n > .button-holder {\n' - " display: none !important;", + " display: none;", stylesheet, )