swh.web 0.16.2__py3-none-any.whl → 0.16.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. swh/web/add_forge_now/templates/add-forge-request-dashboard.html +5 -2
  2. swh/web/api/views/origin.py +2 -2
  3. swh/web/archive_coverage/views.py +4 -7
  4. swh/web/badges/__init__.py +1 -1
  5. swh/web/badges/assets/index.js +40 -14
  6. swh/web/browse/assets/browse/browse.css +5 -0
  7. swh/web/browse/assets/browse/sidetabs.js +3 -16
  8. swh/web/browse/templates/browse-iframe.html +10 -7
  9. swh/web/browse/templates/browse-origin-visits.html +2 -2
  10. swh/web/browse/templates/browse-revision.html +5 -3
  11. swh/web/browse/templates/includes/content-display.html +10 -5
  12. swh/web/browse/templates/includes/readme-display.html +3 -2
  13. swh/web/browse/templates/includes/show-metadata.html +3 -2
  14. swh/web/browse/templates/includes/sidetabs.html +9 -7
  15. swh/web/browse/templates/includes/top-navigation.html +2 -1
  16. swh/web/browse/tests/views/test_origin.py +3 -1
  17. swh/web/deposit/templates/deposit-admin.html +6 -1
  18. swh/web/inbound_email/handle_message.py +1 -1
  19. swh/web/inbound_email/tests/test_utils.py +2 -2
  20. swh/web/save_code_now/assets/origin-save-admin.js +5 -2
  21. swh/web/save_code_now/assets/origin-save.js +9 -4
  22. swh/web/static/css/{archive_coverage.70eba3d32ed75472d638.css → archive_coverage.df54ae8fe40453ecd972.css} +2 -2
  23. swh/web/static/css/archive_coverage.df54ae8fe40453ecd972.css.map +1 -0
  24. swh/web/static/css/browse.633076034514e6a3977d.css +2 -0
  25. swh/web/static/css/browse.633076034514e6a3977d.css.map +1 -0
  26. swh/web/static/css/guided_tour.d496a0c252e1bb193496.css +2 -0
  27. swh/web/static/css/{guided_tour.62c03630e944b8b8d9ad.css.map → guided_tour.d496a0c252e1bb193496.css.map} +1 -1
  28. swh/web/static/css/{highlightjs.0c1b181eb006699a4c3e.css → highlightjs.37238c93749cb449800d.css} +2 -2
  29. swh/web/static/css/highlightjs.37238c93749cb449800d.css.map +1 -0
  30. swh/web/static/css/origin_visits.9a796c4df6606bd9905f.css +2 -0
  31. swh/web/static/css/origin_visits.9a796c4df6606bd9905f.css.map +1 -0
  32. swh/web/static/css/vendors.a4844da6ce54cbc04960.css +24 -0
  33. swh/web/static/css/vendors.a4844da6ce54cbc04960.css.map +1 -0
  34. swh/web/static/css/{webapp.4655323082740f1a4862.css → webapp.e995faa24f8c84db0d06.css} +2 -2
  35. swh/web/static/css/webapp.e995faa24f8c84db0d06.css.map +1 -0
  36. swh/web/static/js/add_forge_now.e85d09463e38c1e19632.js +3 -0
  37. swh/web/static/js/add_forge_now.e85d09463e38c1e19632.js.map +1 -0
  38. swh/web/static/js/auth.06c697ab58b81d08ebce.js +3 -0
  39. swh/web/static/js/auth.06c697ab58b81d08ebce.js.map +1 -0
  40. swh/web/static/js/badges.50941e27bf5e4453b0e0.js +3 -0
  41. swh/web/static/js/badges.50941e27bf5e4453b0e0.js.LICENSE.txt +6 -0
  42. swh/web/static/js/badges.50941e27bf5e4453b0e0.js.map +1 -0
  43. swh/web/static/js/browse.3f22819b69002c8b6407.js +3 -0
  44. swh/web/static/js/browse.3f22819b69002c8b6407.js.map +1 -0
  45. swh/web/static/js/deposit.d47e18177b16ccdbdb84.js.map +1 -1
  46. swh/web/static/js/{highlightjs.dc9b8354c69d942fad33.js → highlightjs.516e784a1e62011c7605.js} +3 -3
  47. swh/web/static/js/highlightjs.516e784a1e62011c7605.js.map +1 -0
  48. swh/web/static/js/mailmap.de04f685e56eff5b627f.js +3 -0
  49. swh/web/static/js/mailmap.de04f685e56eff5b627f.js.map +1 -0
  50. swh/web/static/js/mathjax.98ef576f318f1a0b0c4a.js.map +1 -1
  51. swh/web/static/js/pdf.worker.min.js +1 -1
  52. swh/web/static/js/pdfjs.018d9890c044b3612ece.js +3 -0
  53. swh/web/static/js/pdfjs.018d9890c044b3612ece.js.map +1 -0
  54. swh/web/static/js/{revision.ac9293e1b984b4d4d909.js → revision.122a31614a5f9abffc3c.js} +3 -3
  55. swh/web/static/js/revision.122a31614a5f9abffc3c.js.map +1 -0
  56. swh/web/static/js/save_code_now.d4d8fc47420a4badb683.js +3 -0
  57. swh/web/static/js/save_code_now.d4d8fc47420a4badb683.js.map +1 -0
  58. swh/web/static/js/vault.d2ec3dd1d84a8d038a6c.js +3 -0
  59. swh/web/static/js/vault.d2ec3dd1d84a8d038a6c.js.map +1 -0
  60. swh/web/static/js/vendors.f62cb86cf3b92ae280ee.js +3 -0
  61. swh/web/static/js/{vendors.2eeadf2e0831a7a82b6d.js.LICENSE.txt → vendors.f62cb86cf3b92ae280ee.js.LICENSE.txt} +5 -1
  62. swh/web/static/js/vendors.f62cb86cf3b92ae280ee.js.map +1 -0
  63. swh/web/static/js/webapp.e93873983e400db67bf8.js +3 -0
  64. swh/web/static/js/{webapp.26efc059a8f5fe204240.js.LICENSE.txt → webapp.e93873983e400db67bf8.js.LICENSE.txt} +1 -1
  65. swh/web/static/js/webapp.e93873983e400db67bf8.js.map +1 -0
  66. swh/web/static/jssources/@myriaddreamin/highlighter-typst/dist/esm/contrib/hljs/typst-lite.bundle.js +180 -111
  67. swh/web/static/jssources/assets/src/utils/functions.js +5 -5
  68. swh/web/static/jssources/core-js/LICENSE.txt +1 -1
  69. swh/web/static/jssources/core-js/internals/shared-store.js +3 -3
  70. swh/web/static/jssources/core-js/modules/es.object.group-by.js +2 -1
  71. swh/web/static/jssources/datatables.net/js/dataTables.mjs +108 -44
  72. swh/web/static/jssources/datatables.net-fixedheader/js/dataTables.fixedHeader.mjs +10 -4
  73. swh/web/static/jssources/datatables.net-fixedheader/node_modules/datatables.net/js/dataTables.mjs +14027 -0
  74. swh/web/static/jssources/datatables.net-fixedheader-bs5/node_modules/datatables.net/js/dataTables.mjs +14027 -0
  75. swh/web/static/jssources/datatables.net-fixedheader-bs5/node_modules/datatables.net-bs5/js/dataTables.bootstrap5.mjs +81 -0
  76. swh/web/static/jssources/dompurify/dist/purify.es.mjs +35 -12
  77. swh/web/static/jssources/highlightjs-line-numbers.js/src/highlightjs-line-numbers.js +1 -1
  78. swh/web/static/jssources/highlightjs-macaulay2/dist/macaulay2.min.js +3 -3
  79. swh/web/static/jssources/jslicenses.json +1 -1
  80. swh/web/static/jssources/pdfjs-dist/build/pdf.worker.mjs +885 -596
  81. swh/web/static/jssources/pdfjs-dist/legacy/build/pdf.mjs +4982 -4566
  82. swh/web/static/jssources/swh/web/badges/assets/index.js +40 -14
  83. swh/web/static/jssources/swh/web/browse/assets/browse/sidetabs.js +3 -16
  84. swh/web/static/jssources/swh/web/save_code_now/assets/origin-save-admin.js +5 -2
  85. swh/web/static/jssources/swh/web/save_code_now/assets/origin-save.js +9 -4
  86. swh/web/static/jssources/swh/web/vault/assets/vault-ui.js +6 -4
  87. swh/web/static/jssources/swh/web/webapp/assets/webapp/webapp-utils.js +18 -1
  88. swh/web/static/security.txt +3 -0
  89. swh/web/static/webpack-stats.json +240 -235
  90. swh/web/tests/views.py +9 -8
  91. swh/web/utils/archive.py +1 -1
  92. swh/web/utils/swh_templatetags.py +8 -13
  93. swh/web/vault/assets/vault-ui.js +6 -4
  94. swh/web/webapp/assets/webapp/webapp-utils.js +18 -1
  95. swh/web/webapp/assets/webapp/webapp.css +8 -0
  96. swh/web/webapp/templates/layout.html +13 -10
  97. swh/web/webapp/tests/test_views.py +16 -1
  98. {swh_web-0.16.2.dist-info → swh_web-0.16.4.dist-info}/METADATA +2 -3
  99. {swh_web-0.16.2.dist-info → swh_web-0.16.4.dist-info}/RECORD +112 -107
  100. swh/web/static/css/archive_coverage.70eba3d32ed75472d638.css.map +0 -1
  101. swh/web/static/css/browse.0a250d3b07ce628588a5.css +0 -2
  102. swh/web/static/css/browse.0a250d3b07ce628588a5.css.map +0 -1
  103. swh/web/static/css/guided_tour.62c03630e944b8b8d9ad.css +0 -2
  104. swh/web/static/css/highlightjs.0c1b181eb006699a4c3e.css.map +0 -1
  105. swh/web/static/css/origin_visits.88099d68a63f86af2f8e.css +0 -2
  106. swh/web/static/css/origin_visits.88099d68a63f86af2f8e.css.map +0 -1
  107. swh/web/static/css/vendors.1cfc8080eed63af482cf.css +0 -24
  108. swh/web/static/css/vendors.1cfc8080eed63af482cf.css.map +0 -1
  109. swh/web/static/css/webapp.4655323082740f1a4862.css.map +0 -1
  110. swh/web/static/js/add_forge_now.e25d1ad2ab6c45e60b67.js +0 -3
  111. swh/web/static/js/add_forge_now.e25d1ad2ab6c45e60b67.js.map +0 -1
  112. swh/web/static/js/auth.bd2f475f49caa9f84e99.js +0 -3
  113. swh/web/static/js/auth.bd2f475f49caa9f84e99.js.map +0 -1
  114. swh/web/static/js/badges.f02607179ad0264e7522.js +0 -2
  115. swh/web/static/js/badges.f02607179ad0264e7522.js.map +0 -1
  116. swh/web/static/js/browse.fc5d5fafca71e03d2add.js +0 -3
  117. swh/web/static/js/browse.fc5d5fafca71e03d2add.js.map +0 -1
  118. swh/web/static/js/highlightjs.dc9b8354c69d942fad33.js.map +0 -1
  119. swh/web/static/js/mailmap.631c53127ba5511ebda7.js +0 -3
  120. swh/web/static/js/mailmap.631c53127ba5511ebda7.js.map +0 -1
  121. swh/web/static/js/pdfjs.40675676ebcbdde8baab.js +0 -3
  122. swh/web/static/js/pdfjs.40675676ebcbdde8baab.js.map +0 -1
  123. swh/web/static/js/revision.ac9293e1b984b4d4d909.js.map +0 -1
  124. swh/web/static/js/save_code_now.369ff7f28aaf74e7728e.js +0 -3
  125. swh/web/static/js/save_code_now.369ff7f28aaf74e7728e.js.map +0 -1
  126. swh/web/static/js/vault.1229427aed95c78d4ee2.js +0 -3
  127. swh/web/static/js/vault.1229427aed95c78d4ee2.js.map +0 -1
  128. swh/web/static/js/vendors.2eeadf2e0831a7a82b6d.js +0 -3
  129. swh/web/static/js/vendors.2eeadf2e0831a7a82b6d.js.map +0 -1
  130. swh/web/static/js/webapp.26efc059a8f5fe204240.js +0 -3
  131. swh/web/static/js/webapp.26efc059a8f5fe204240.js.map +0 -1
  132. /swh/web/static/js/{add_forge_now.e25d1ad2ab6c45e60b67.js.LICENSE.txt → add_forge_now.e85d09463e38c1e19632.js.LICENSE.txt} +0 -0
  133. /swh/web/static/js/{auth.bd2f475f49caa9f84e99.js.LICENSE.txt → auth.06c697ab58b81d08ebce.js.LICENSE.txt} +0 -0
  134. /swh/web/static/js/{browse.fc5d5fafca71e03d2add.js.LICENSE.txt → browse.3f22819b69002c8b6407.js.LICENSE.txt} +0 -0
  135. /swh/web/static/js/{highlightjs.dc9b8354c69d942fad33.js.LICENSE.txt → highlightjs.516e784a1e62011c7605.js.LICENSE.txt} +0 -0
  136. /swh/web/static/js/{mailmap.631c53127ba5511ebda7.js.LICENSE.txt → mailmap.de04f685e56eff5b627f.js.LICENSE.txt} +0 -0
  137. /swh/web/static/js/{pdfjs.40675676ebcbdde8baab.js.LICENSE.txt → pdfjs.018d9890c044b3612ece.js.LICENSE.txt} +0 -0
  138. /swh/web/static/js/{revision.ac9293e1b984b4d4d909.js.LICENSE.txt → revision.122a31614a5f9abffc3c.js.LICENSE.txt} +0 -0
  139. /swh/web/static/js/{save_code_now.369ff7f28aaf74e7728e.js.LICENSE.txt → save_code_now.d4d8fc47420a4badb683.js.LICENSE.txt} +0 -0
  140. /swh/web/static/js/{vault.1229427aed95c78d4ee2.js.LICENSE.txt → vault.d2ec3dd1d84a8d038a6c.js.LICENSE.txt} +0 -0
  141. {swh_web-0.16.2.dist-info → swh_web-0.16.4.dist-info}/WHEEL +0 -0
  142. {swh_web-0.16.2.dist-info → swh_web-0.16.4.dist-info}/licenses/AUTHORS +0 -0
  143. {swh_web-0.16.2.dist-info → swh_web-0.16.4.dist-info}/licenses/LICENSE +0 -0
  144. {swh_web-0.16.2.dist-info → swh_web-0.16.4.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  {% extends "layout.html" %}
2
2
 
3
3
  {% comment %}
4
- Copyright (C) 2022-2024 The Software Heritage developers
4
+ Copyright (C) 2022-2025 The Software Heritage developers
5
5
  See the AUTHORS file at the top-level directory of this distribution
6
6
  License: GNU Affero General Public License version 3, or any later version
7
7
  See top-level LICENSE file for more information
@@ -119,8 +119,11 @@ See top-level LICENSE file for more information
119
119
  </div>
120
120
  </div>
121
121
  </div>
122
+ {{ next_statuses_for|swh_json_script:"next_statuses_for" }}
122
123
  <script>
123
124
  swh.webapp.initPage('add-forge-now-moderation');
124
- swh.add_forge_now.onRequestDashboardLoad("{{ request_id }}", {{ next_statuses_for | jsonify }});
125
+ swh.add_forge_now.onRequestDashboardLoad(
126
+ "{{ request_id }}", swh.webapp.parseJsonScript('next_statuses_for')
127
+ );
125
128
  </script>
126
129
  {% endblock content %}
@@ -578,7 +578,7 @@ def api_origin_intrinsic_metadata_legacy(request: Request, origin_url: str):
578
578
  """
579
579
  .. http:get:: /api/1/origin/(origin_url)/intrinsic-metadata
580
580
 
581
- This route is deprecated; use http:get:/api/1/intrinsic-metadata/origin/ instead
581
+ This route is deprecated; use :http:get:`/api/1/intrinsic-metadata/origin/` instead
582
582
 
583
583
  Get intrinsic metadata of a software origin (as a JSON-LD/CodeMeta dictionary).
584
584
  """
@@ -590,7 +590,7 @@ def api_origin_intrinsic_metadata_legacy(request: Request, origin_url: str):
590
590
  enrich_fn=enrich_origin,
591
591
  request=request,
592
592
  )
593
- return response[0]
593
+ return response[0] if response else None
594
594
 
595
595
 
596
596
  class OriginUrlQuerySerializer(serializers.Serializer):
@@ -20,10 +20,6 @@ from swh.web.config import scheduler
20
20
  from swh.web.utils import django_cache, reverse
21
21
  from swh.web.utils.archive import count_origins
22
22
 
23
- _swh_arch_overview_doc = (
24
- "https://docs.softwareheritage.org/devel/architecture/overview.html"
25
- )
26
-
27
23
  # Current coverage list of the archive in a high level overview fashion,
28
24
  # categorized as follow:
29
25
  # - listed origins: origins discovered using a swh lister
@@ -35,7 +31,7 @@ _swh_arch_overview_doc = (
35
31
  listed_origins: Dict[str, Any] = {
36
32
  "info": (
37
33
  "These software origins get continuously discovered and archived using "
38
- f'the <a href="{_swh_arch_overview_doc}#listers" target="_blank" '
34
+ 'the <a href="https://docs.softwareheritage.org/user/listers.html" target="_blank" '
39
35
  'rel="noopener noreferrer">listers</a> implemented by Software Heritage.'
40
36
  ),
41
37
  "origins": [
@@ -411,8 +407,9 @@ legacy_origins: Dict[str, Any] = {
411
407
  deposited_origins: Dict[str, Any] = {
412
408
  "info": (
413
409
  "These origins are directly pushed into the archive by trusted partners "
414
- f'using the <a href="{_swh_arch_overview_doc}#deposit" target="_blank" '
415
- 'rel="noopener noreferrer">deposit</a> service of Software Heritage.'
410
+ "using the "
411
+ '<a href="https://docs.softwareheritage.org/devel/architecture/overview.html#deposit" '
412
+ 'target="_blank" rel="noopener noreferrer">deposit</a> service of Software Heritage.'
416
413
  ),
417
414
  "origins": [
418
415
  {
@@ -6,7 +6,7 @@
6
6
  from base64 import b64encode
7
7
  from typing import Optional, cast
8
8
 
9
- from pybadges import badge
9
+ from pybadges2 import badge
10
10
 
11
11
  from django.contrib.staticfiles import finders
12
12
  from django.http import HttpRequest, HttpResponse
@@ -1,10 +1,12 @@
1
1
  /**
2
- * Copyright (C) 2019-2023 The Software Heritage developers
2
+ * Copyright (C) 2019-2025 The Software Heritage developers
3
3
  * See the AUTHORS file at the top-level directory of this distribution
4
4
  * License: GNU Affero General Public License version 3, or any later version
5
5
  * See top-level LICENSE file for more information
6
6
  */
7
7
 
8
+ import ClipboardJS from 'clipboard';
9
+
8
10
  import './badges.css';
9
11
 
10
12
  export function showBadgeInfoModal(objectType, objectSWHID) {
@@ -35,22 +37,46 @@ export function showBadgeInfoModal(objectType, objectSWHID) {
35
37
  <a href="${absoluteBadgeLinkUrl}">
36
38
  <img class="swh-badge" src="${absoluteBadgeImageUrl}" alt="Archived | ${objectSWHID}"/>
37
39
  </a>
38
- <div>
39
- <label>HTML</label>
40
- <pre><code class="swh-badge-html html">&lt;a href="${absoluteBadgeLinkUrl}"&gt;
41
- &lt;img src="${absoluteBadgeImageUrl}" alt="Archived | ${objectCoreSWHID}"/&gt;
40
+ <ul class="nav nav-tabs">
41
+ <li class="nav-item">
42
+ <a class="nav-link active" data-bs-toggle="tab" href="#swh-badge-html">HTML</a>
43
+ </li>
44
+ <li class="nav-item">
45
+ <a class="nav-link" data-bs-toggle="tab" href="#swh-badge-markdown">Markdown</a>
46
+ </li>
47
+ <li class="nav-item">
48
+ <a class="nav-link" data-bs-toggle="tab" href="#swh-badge-rst">reStructuredText</a>
49
+ </li>
50
+ </ul>
51
+ <div class="tab-content swh-badges-integrations">
52
+ <div class="tab-pane active" id="swh-badge-html">
53
+ <pre><code class="swh-badge-html html">&lt;a href="${absoluteBadgeLinkUrl}"&gt;
54
+ &lt;img src="${absoluteBadgeImageUrl}" alt="Archived | ${objectCoreSWHID}"/&gt;
42
55
  &lt;/a&gt;</code></pre>
43
- </div>
44
- <div>
45
- <label>Markdown</label>
46
- <pre><code class="swh-badge-md markdown">[![SWH](${absoluteBadgeImageUrl})](${absoluteBadgeLinkUrl})</code></pre>
47
- </div>
48
- <div>
49
- <label>reStructuredText</label>
50
- <pre class="swh-badge-rst">.. image:: ${absoluteBadgeImageUrl}
51
- :target: ${absoluteBadgeLinkUrl}</pre>
56
+ </div>
57
+ <div class="tab-pane" id="swh-badge-markdown">
58
+ <pre><code class="swh-badge-md markdown">[![SWH](${absoluteBadgeImageUrl})](${absoluteBadgeLinkUrl})</code></pre>
59
+ </div>
60
+ <div class="tab-pane" id="swh-badge-rst">
61
+ <pre class="swh-badge-rst">.. image:: ${absoluteBadgeImageUrl}
62
+ :target: ${absoluteBadgeLinkUrl}</pre>
63
+ </div>
64
+ <button type="button"
65
+ class="btn btn-secondary btn-sm btn-swh-copy-badge-code float-end"
66
+ title="Copy badge code to clipboard">
67
+ <i class="mdi mdi-content-copy mdi-fw" aria-hidden="true"></i>Copy badge code
68
+ </button>
52
69
  </div>`;
53
70
  swh.webapp.showModalHtml('Software Heritage badge integration', html);
54
71
  swh.webapp.highlightCode(false, '.swh-badge-html');
55
72
  swh.webapp.highlightCode(false, '.swh-badge-md');
73
+ new ClipboardJS('.btn-swh-copy-badge-code', {
74
+ text: () => {
75
+ return $('.swh-badges-integrations .tab-pane.active pre').text();
76
+ },
77
+ container: document.getElementById('swh-web-modal-html')
78
+ }).on('success', function(e) {
79
+ swh.webapp.toggleButtonText(e.trigger, 'Copied!');
80
+ e.clearSelection();
81
+ });
56
82
  }
@@ -151,4 +151,9 @@ td.swh-branch-date {
151
151
  .btn-swhid-copy, .btn-swhid-url-copy, .btn-citation-copy {
152
152
  width: 125px;
153
153
  height: 32px;
154
+ }
155
+
156
+ .btn-swh-copy-badge-code {
157
+ width: 128px;
158
+ height: 32px;
154
159
  }
@@ -183,26 +183,13 @@ export async function generateCitationForObjectType(event) {
183
183
  export async function initSideTabs() {
184
184
 
185
185
  $(document).ready(() => {
186
- const toggleButtonText = (button, text) => {
187
- const currentLabel = button.innerHTML;
188
-
189
- if (currentLabel === text) {
190
- return;
191
- }
192
-
193
- button.innerHTML = text;
194
- setTimeout(function() {
195
- button.innerHTML = currentLabel;
196
- }, 1000);
197
- };
198
-
199
186
  new ClipboardJS('.btn-swhid-copy', {
200
187
  text: trigger => {
201
188
  const swhId = $(trigger).closest('.swhid-ui').find('.swhid').text();
202
189
  return swhId.replace(/;\n/g, ';');
203
190
  }
204
191
  }).on('success', function(e) {
205
- toggleButtonText(e.trigger, 'Copied!');
192
+ swh.webapp.toggleButtonText(e.trigger, 'Copied!');
206
193
  e.clearSelection();
207
194
  });
208
195
 
@@ -212,7 +199,7 @@ export async function initSideTabs() {
212
199
  return window.location.origin + swhIdUrl;
213
200
  }
214
201
  }).on('success', function(e) {
215
- toggleButtonText(e.trigger, 'Copied!');
202
+ swh.webapp.toggleButtonText(e.trigger, 'Copied!');
216
203
  e.clearSelection();
217
204
  });
218
205
 
@@ -310,7 +297,7 @@ export async function initSideTabs() {
310
297
  return citation;
311
298
  }
312
299
  }).on('success', function(e) {
313
- toggleButtonText(e.trigger, 'Copied!');
300
+ swh.webapp.toggleButtonText(e.trigger, 'Copied!');
314
301
  });
315
302
 
316
303
  const tabSlideOptionsCitations = {
@@ -1,5 +1,5 @@
1
1
  {% comment %}
2
- Copyright (C) 2021-2024 The Software Heritage developers
2
+ Copyright (C) 2021-2025 The Software Heritage developers
3
3
  See the AUTHORS file at the top-level directory of this distribution
4
4
  License: GNU Affero General Public License version 3, or any later version
5
5
  See top-level LICENSE file for more information
@@ -21,11 +21,12 @@ See top-level LICENSE file for more information
21
21
  {% render_bundle 'vendors' %}
22
22
  {% render_bundle 'webapp' %}
23
23
  {% render_bundle 'browse' %}
24
+ {% render_bundle 'content' %}
24
25
  <script>
25
26
  /*
26
27
  @licstart The following is the entire license notice for the JavaScript code in this page.
27
28
 
28
- Copyright (C) 2021-2023 The Software Heritage developers
29
+ Copyright (C) 2021-2025 The Software Heritage developers
29
30
 
30
31
  This program is free software: you can redistribute it and/or modify
31
32
  it under the terms of the GNU Affero General Public License as
@@ -175,13 +176,15 @@ along with this program. If not, see <https://www.gnu.org/licenses />.
175
176
  {% if "swh.web.jslicenses" in SWH_DJANGO_APPS %}
176
177
  <a href="{% url 'jslicenses' %}" rel="jslicense" style="display: none;">JavaScript license information</a>
177
178
  {% endif %}
178
- {% if object_type == "cnt" %}
179
+ {% if object_type == "cnt" and lines %}
180
+ {{ lines|swh_json_script:"lines" }}
179
181
  <script>
182
+ const lines = swh.webapp.parseJsonScript('lines');
180
183
  setTimeout(function() {
181
- {% if lines %}
182
- swh.webapp.scrollToLine(swh.webapp.highlightLine({{ lines.0|jsonify }}), 100);
183
- swh.webapp.highlightLines({{ lines.0|jsonify }}, {{ lines.1|jsonify }});
184
- {% endif %}
184
+ swh.webapp.scrollToLine(swh.webapp.highlightLine(lines[0]), 100);
185
+ if (lines[1]) {
186
+ swh.webapp.highlightLines(lines[0], lines[1]);
187
+ }
185
188
  }, 500);
186
189
  </script>
187
190
  {% endif %}
@@ -89,9 +89,9 @@ See top-level LICENSE file for more information
89
89
  <h5>List</h5>
90
90
  <div id="swh-visits-list"></div>
91
91
  </div>
92
+ {{ origin_visits|swh_json_script:"origin_visits" }}
92
93
  <script>
93
94
  // all origin visits
94
- var visits = {{ origin_visits|jsonify }};
95
- swh.origin_visits.initVisitsReporting(visits);
95
+ swh.origin_visits.initVisitsReporting(swh.webapp.parseJsonScript('origin_visits'));
96
96
  </script>
97
97
  {% endblock swh-browse-content %}
@@ -1,7 +1,7 @@
1
1
  {% extends "./browse.html" %}
2
2
 
3
3
  {% comment %}
4
- Copyright (C) 2017-2024 The Software Heritage developers
4
+ Copyright (C) 2017-2025 The Software Heritage developers
5
5
  See the AUTHORS file at the top-level directory of this distribution
6
6
  License: GNU Affero General Public License version 3, or any later version
7
7
  See top-level LICENSE file for more information
@@ -119,9 +119,11 @@ See top-level LICENSE file for more information
119
119
  </div>
120
120
  </div>
121
121
  </div>
122
+ {{ message_body|swh_json_script:"revMsgBody" }}
123
+ {{ diff_revision_url|swh_json_script:"diffRevUrl" }}
122
124
  <script>
123
- var revMsgBody = {{ message_body|jsonify }};
124
- var diffRevUrl = {{ diff_revision_url|jsonify }};
125
+ var revMsgBody = swh.webapp.parseJsonScript('revMsgBody');
126
+ var diffRevUrl = swh.webapp.parseJsonScript('diffRevUrl');
125
127
  swh.revision.initRevisionDiff(revMsgBody, diffRevUrl);
126
128
  </script>
127
129
  {% endblock swh-browse-content %}
@@ -82,13 +82,18 @@ See top-level LICENSE file for more information
82
82
  </div>
83
83
  {% if not iframe_mode %}</div>{% endif %}
84
84
  {% if content %}
85
+ {{ filename|swh_json_script:"filename" }}
86
+ {{ mimetype|swh_json_script:"mimetype" }}
87
+ {{ top_right_link.url|swh_json_script:"content_url" }}
88
+ {{ mathjax_js_library|swh_json_script:"mathjax_js_library" }}
89
+ {{ iframe_mode|swh_json_script:"iframe_mode" }}
85
90
  <script>
86
91
  swh.content.renderContent(
87
- {{ filename|jsonify }},
88
- {{ mimetype|jsonify }},
89
- {{ top_right_link.url|jsonify }},
90
- {{ mathjax_js_library|jsonify }},
91
- !{{ iframe_mode|jsonify }}
92
+ swh.webapp.parseJsonScript('filename'),
93
+ swh.webapp.parseJsonScript('mimetype'),
94
+ swh.webapp.parseJsonScript('content_url'),
95
+ swh.webapp.parseJsonScript('mathjax_js_library'),
96
+ !swh.webapp.parseJsonScript('iframe_mode')
92
97
  );
93
98
  </script>
94
99
  {% endif %}
@@ -1,5 +1,5 @@
1
1
  {% comment %}
2
- Copyright (C) 2017-2024 The Software Heritage developers
2
+ Copyright (C) 2017-2025 The Software Heritage developers
3
3
  See the AUTHORS file at the top-level directory of this distribution
4
4
  License: GNU Affero General Public License version 3, or any later version
5
5
  See top-level LICENSE file for more information
@@ -21,8 +21,9 @@ See top-level LICENSE file for more information
21
21
  </div>
22
22
  </div>
23
23
  {% if readme_html %}
24
+ {{ readme_html|swh_json_script:"readme_html" }}
24
25
  <script>
25
- $('.swh-readme').html(swh.webapp.filterXSS({{ readme_html|jsonify }}));
26
+ $('.swh-readme').html(swh.webapp.filterXSS(swh.webapp.parseJsonScript('readme_html')));
26
27
  swh.webapp.addReadmeHeadingAnchors();
27
28
  </script>
28
29
  {% elif readme_url is None %}
@@ -1,5 +1,5 @@
1
1
  {% comment %}
2
- Copyright (C) 2017-2024 The Software Heritage developers
2
+ Copyright (C) 2017-2025 The Software Heritage developers
3
3
  See the AUTHORS file at the top-level directory of this distribution
4
4
  License: GNU Affero General Public License version 3, or any later version
5
5
  See top-level LICENSE file for more information
@@ -57,4 +57,5 @@ See top-level LICENSE file for more information
57
57
  </div>
58
58
  {% endif %}
59
59
  {% endif %}
60
- <script>swh.webapp.setBrowsedSwhObjectMetadata({{ swh_object_metadata|jsonify }})</script>
60
+ {{ swh_object_metadata|swh_json_script:"swh_object_metadata" }}
61
+ <script>swh.webapp.setBrowsedSwhObjectMetadata(swh.webapp.parseJsonScript('swh_object_metadata'))</script>
@@ -92,12 +92,13 @@ See top-level LICENSE file for more information
92
92
  title="Click to display badge integration info" />
93
93
  {% endif %}
94
94
  {% if swhid_info.object_type.name.lower == "content" or swhid_info.object_type.name.lower == "directory" %}
95
- <a class="ms-auto float-end"
96
- style="cursor: pointer"
97
- role="button"
98
- onclick="swh.browse.showIframeInfoModal('{{ swhid_info.object_type.name.lower }}', $(this).closest('.swhid-ui').find('.swhid').text())">
99
- Iframe embedding
100
- </a>
95
+ <button type="button"
96
+ class="btn btn-secondary btn-sm ms-auto float-end mb-2"
97
+ title="Display info about how to embed source code archived by Software Heritage in external websites using an iframe"
98
+ onclick="swh.browse.showIframeInfoModal('{{ swhid_info.object_type.name.lower }}', $(this).closest('.swhid-ui').find('.swhid').text())">
99
+ <i class="mdi mdi-application-brackets-outline mdi-fw"
100
+ aria-hidden="true"></i>Iframe embedding
101
+ </button>
101
102
  {% endif %}
102
103
  </div>
103
104
  {% endif %}
@@ -245,8 +246,9 @@ See top-level LICENSE file for more information
245
246
  </div>
246
247
  </div>
247
248
  {% endif %}
249
+ {{ swhids_info|swh_json_script:"swhids_info" }}
248
250
  <script>
249
- swh.webapp.setSwhIdsContext({{ swhids_info|jsonify }});
251
+ swh.webapp.setSwhIdsContext(swh.webapp.parseJsonScript('swhids_info'));
250
252
  swh.browse.initSideTabs();
251
253
  </script>
252
254
  {% endif %}
@@ -148,6 +148,7 @@ See top-level LICENSE file for more information
148
148
  </div>
149
149
  </div>
150
150
  {% include "./sidetabs.html" %}
151
+ {{ iframe_mode|swh_json_script:"iframe_mode" }}
151
152
  <script>
152
153
  var snapshotContext = false;
153
154
  var branch = false;
@@ -161,7 +162,7 @@ See top-level LICENSE file for more information
161
162
  $(".chosen-search-input").attr("aria-label", "Search language to highlight");
162
163
  });
163
164
  $(".chosen-select").chosen().change(function(event, params) {
164
- swh.content.updateLanguage(params.selected, !{{ iframe_mode|jsonify }});
165
+ swh.content.updateLanguage(params.selected, !swh.webapp.parseJsonScript('iframe_mode'));
165
166
  });
166
167
  {% endif %}
167
168
  swh.browse.initSnapshotNavigation(snapshotContext, branch !== "None");
@@ -51,7 +51,9 @@ def test_origin_visits_browse(client, archive_data, origin_with_multiple_visits)
51
51
  browse_dir_url = reverse(
52
52
  "browse-origin-directory",
53
53
  query_params={"origin_url": origin_url, "timestamp": vdate},
54
- )
54
+ ).replace(
55
+ "&", "\\u0026"
56
+ ) # & character was escaped by the swh_json_script template filter
55
57
  assert_contains(resp, browse_dir_url)
56
58
 
57
59
  _check_origin_link(resp, origin_url)
@@ -59,8 +59,13 @@ See top-level LICENSE file for more information
59
59
  </thead>
60
60
  </table>
61
61
  <p id="swh-admin-deposit-list-error"></p>
62
+ {{ request.user.username|swh_json_script:"username" }}
63
+ {{ request.user.is_staff|swh_json_script:"user_is_staff" }}
62
64
  <script>
63
65
  swh.webapp.initPage('deposit-admin');
64
- swh.deposit.initDepositAdmin({{ request.user.username|jsonify }}, {{ request.user.is_staff|jsonify }});
66
+ swh.deposit.initDepositAdmin(
67
+ swh.webapp.parseJsonScript('username'),
68
+ swh.webapp.parseJsonScript('user_is_staff')
69
+ );
65
70
  </script>
66
71
  {% endblock content %}
@@ -20,7 +20,7 @@ class MessageHandler:
20
20
  def __init__(self, raw_message: bytes, sender: Optional[Type] = None):
21
21
  try:
22
22
  self.message = email.message_from_bytes(
23
- raw_message, policy=email.policy.default # type: ignore[arg-type]
23
+ raw_message, policy=email.policy.default
24
24
  )
25
25
  except Exception as exc:
26
26
  sentry_capture_exception(exc)
@@ -154,7 +154,7 @@ def test_recipient_matches_casemapping():
154
154
  )
155
155
  def test_recipient_matches_real_world(filename: str, recipient: str, extension: str):
156
156
  with open_binary("swh.web.inbound_email.tests.resources", filename) as f:
157
- message = email.message_from_binary_file(f, policy=email.policy.default) # type: ignore[arg-type]
157
+ message = email.message_from_binary_file(f, policy=email.policy.default)
158
158
 
159
159
  assert isinstance(message, EmailMessage)
160
160
 
@@ -400,7 +400,7 @@ def test_get_message_plaintext(
400
400
  filename: str, expected_parts: List[str], expected_absent: List[str]
401
401
  ):
402
402
  with open_binary("swh.web.inbound_email.tests.resources", filename) as f:
403
- message = email.message_from_binary_file(f, policy=email.policy.default) # type: ignore[arg-type]
403
+ message = email.message_from_binary_file(f, policy=email.policy.default)
404
404
 
405
405
  assert isinstance(message, EmailMessage)
406
406
 
@@ -73,6 +73,7 @@ export function initOriginSaveAdmin() {
73
73
  if (type === 'display') {
74
74
  let html = '';
75
75
  const sanitizedURL = $.fn.dataTable.render.text().display(data);
76
+ const parsedURL = new URL(sanitizedURL);
76
77
  if (row.save_task_status === 'succeeded') {
77
78
  let browseOriginUrl = `${Urls.browse_origin()}?origin_url=${encodeURIComponent(sanitizedURL)}`;
78
79
  if (row.visit_date) {
@@ -82,8 +83,10 @@ export function initOriginSaveAdmin() {
82
83
  } else {
83
84
  html += sanitizedURL;
84
85
  }
85
- html += `&nbsp;<a href="${sanitizedURL}" target="_blank" rel="noopener noreferrer">` +
86
- '<i class="mdi mdi-open-in-new" aria-hidden="true"></i></a>';
86
+ if (parsedURL.protocol.startsWith('http')) {
87
+ html += `&nbsp;<a href="${sanitizedURL}" target="_blank" rel="noopener noreferrer">` +
88
+ '<i class="mdi mdi-open-in-new" aria-hidden="true"></i></a>';
89
+ }
87
90
  return html;
88
91
  }
89
92
  return data;
@@ -182,6 +182,7 @@ export function initOriginSave() {
182
182
  if (type === 'display') {
183
183
  let html = '';
184
184
  const sanitizedURL = $.fn.dataTable.render.text().display(data);
185
+ const parsedURL = new URL(sanitizedURL);
185
186
  if (row.save_task_status === 'succeeded') {
186
187
  if (row.visit_status === 'full' || row.visit_status === 'partial') {
187
188
  let browseOriginUrl = `${Urls.browse_origin()}?origin_url=${encodeURIComponent(sanitizedURL)}`;
@@ -196,8 +197,10 @@ export function initOriginSave() {
196
197
  } else {
197
198
  html += sanitizedURL;
198
199
  }
199
- html += `&nbsp;<a href="${sanitizedURL}" target="_blank" rel="noopener noreferrer">` +
200
- '<i class="mdi mdi-open-in-new" aria-hidden="true"></i></a>';
200
+ if (parsedURL.protocol.startsWith('http')) {
201
+ html += `&nbsp;<a href="${sanitizedURL}" target="_blank" rel="noopener noreferrer">` +
202
+ '<i class="mdi mdi-open-in-new" aria-hidden="true"></i></a>';
203
+ }
201
204
  return html;
202
205
  }
203
206
  return data;
@@ -359,8 +362,10 @@ export function initOriginSave() {
359
362
 
360
363
  }
361
364
 
362
- const tarballExtensions =
363
- ['.jar', '.tar', '.tar.bz2', '.tar.gz', '.tar.lz', '.tar.xz', '.tar.zst', '.zip'];
365
+ const tarballExtensions = [
366
+ '.jar', '.tar', '.tar.bz2', '.tbz', '.tbz2', '.tar.gz', '.tgz', '.tar.lz',
367
+ '.tar.xz', '.tar.zst', '.zip'
368
+ ];
364
369
 
365
370
  function updateVisitType() {
366
371
  const originUrl = $('#swh-input-origin-url').val().trim();
@@ -1,4 +1,4 @@
1
- html{height:100%;overflow-x:hidden;scroll-behavior:auto!important}body{margin:0;min-height:100%;overflow-y:clip;position:relative}*{-webkit-font-variant-ligatures:no-common-ligatures;-moz-font-variant-ligatures:no-common-ligatures;font-variant-ligatures:no-common-ligatures}a.active,a:active{outline:none}.page-item:focus-visible,.page-link:focus-visible,a:focus-visible{outline:4px solid rgba(226,0,38,.25)!important;z-index:100}.swh-top-bar a:focus-visible,footer a:focus-visible{outline:3px solid rgba(226,0,38,.75)!important}code{background-color:#f9f2f4}pre code{background-color:transparent}footer{background-color:#262626!important;color:#fff!important;font-size:.8rem;padding-bottom:10px;padding-top:10px;width:100%}footer a,footer a:hover,footer a:visited{color:#fecd1b}pre{background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px;color:#212529;font-size:.8rem;padding:9.5px}.app-content{padding-top:10px}.app-main{overflow:hidden!important}.btn.active{background-color:#e7e7e7}.card{margin-bottom:5px!important;overflow-x:auto}.navbar-brand{margin-right:0;padding:5px}.table{margin-bottom:0}.swh-table thead{background-color:#f2f4f5;border-top:1px solid rgba(0,0,0,.2);font-weight:400}.swh-table-striped th{border-top:none}.swh-table-striped tbody tr:nth-child(2n){background-color:#f2f4f5!important}.swh-table-striped tbody tr:nth-child(odd){background-color:#fff!important}.table>thead>tr>th{border-bottom:1px solid #e20026;border-top:none}.table>tbody>tr>td{border-style:none}.sitename .first-word,.sitename .second-word{color:rgba(0,0,0,.75);font-size:1.2rem;font-weight:400}.sitename .first-word{font-family:Alegreya Sans,sans-serif}.sitename .second-word{font-family:Alegreya,serif}.swh-counter{font-size:150%}@media (max-width:600px){.swh-counter-container{margin-top:1rem}}.swh-http-error{margin:0 auto;text-align:center}.swh-http-error-head{color:#2d353c;font-size:30px}.swh-http-error-code{bottom:60%;color:#2d353c;font-size:96px;line-height:80px;margin-bottom:10px!important}.swh-http-error-desc{color:#647788;font-size:12px;text-align:center}.swh-http-error-desc pre{display:inline-block;max-width:800px;text-align:left;white-space:pre-wrap}.swh-list-unstyled{list-style:none}.popover{max-width:97%;z-index:40000}.modal{padding:0!important;text-align:center;z-index:50000}.modal:before{content:"";height:100%;margin-right:-4px}.modal-dialog,.modal:before{display:inline-block;vertical-align:middle}.modal-dialog{text-align:left}.dropdown-submenu{position:relative}.dropdown-submenu .dropdown-menu{left:-100%;margin-left:-2px;margin-top:-5px;top:0}.dropdown-item:focus,.dropdown-item:hover{background-color:rgba(0,0,0,.1)}a.dropdown-left:before{content:"\f035e";display:block;float:left;font-family:Material Design Icons;height:20px;margin-left:0;width:20px}.swh-navbar{border-bottom-width:5px;-webkit-border-image:-webkit-gradient(linear,left top,right top,from(#e20026),to(#fecd1b)) 1 1 1 1;-webkit-border-image:-webkit-linear-gradient(left,#e20026,#fecd1b) 1 1 1 1;-moz-border-image:-moz-linear-gradient(left,#e20026 0,#fecd1b 100%) 1 1 1 1;-o-border-image:linear-gradient(90deg,#e20026 0,#fecd1b) 1 1 1 1;border-image:-webkit-gradient(linear,left top,right top,from(#e20026),to(#fecd1b)) 1 1 1 1;border-image:linear-gradient(90deg,#e20026 0,#fecd1b) 1 1 1 1;border-style:none none solid;margin-top:30px;padding:5px;width:100%;-webkit-box-pack:normal;-webkit-justify-content:normal;-moz-box-pack:normal;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;height:72px;justify-content:normal;overflow:hidden}.swh-navbar-banner{margin-top:60px!important}#back-to-top{bottom:30px;display:none;position:fixed;right:30px;z-index:10}#back-to-top a img{background-size:32px 32px;display:block;height:32px;overflow:hidden;text-indent:-999px;width:32px}.swh-top-bar{background-color:#262626;color:#fff;direction:ltr;font-size:14px;height:30px;left:0;position:fixed;text-align:center;top:0;width:100%;z-index:99999}.swh-top-bar ul{margin-top:4px;padding-left:0;white-space:nowrap}.swh-top-bar li{display:inline-block;margin-left:10px;margin-right:10px}.swh-top-bar a,.swh-top-bar a:visited{color:#fff}.swh-top-bar a.swh-current-site,.swh-top-bar a.swh-current-site:visited{color:#fecd1b}.swh-banner{border:none;height:30px;left:0;position:fixed;top:30px;width:100%;z-index:99999}.swh-banner .row{background-color:#fecd1b;color:#e20026;font-size:larger;height:30px}.swh-position-left{left:0;position:absolute}.swh-position-right{position:absolute;right:0}.swh-background-gray{background:#f6f5f4}.swh-donate-link{background-color:#e20026;border:1px solid #fecd1b;border-radius:3px;color:#fff!important;padding:3px}.swh-navbar-content h4{padding-left:15px;padding-top:11px}.swh-navbar-content .bread-crumbs{display:block;margin-left:-40px}.swh-navbar-content .bread-crumbs li.bc-no-root{padding-top:.7rem}.app-sidebar{background:#fff;max-height:-webkit-calc(100vh - 30px)!important;max-height:-moz-calc(100vh - 30px)!important;max-height:calc(100vh - 30px)!important;top:30px!important}.app-sidebar-banner{margin-top:60px}.content-wrapper{background:none}.swh-push-menu{padding-top:5px}.sidebar-brand{border-bottom:5px solid #e20026!important;font-weight:500;height:4.5rem;padding-bottom:18px;padding-left:4px;padding-top:18.5px}.brand-image{max-height:40px}.sidebar-brand:focus,.sidebar-brand:hover{background-color:#e7e7e7!important;color:#323232!important}.sidebar-menu .nav-link p{padding-top:5px}.navbar-header a,ul.dropdown-menu a,ul.nav.sidebar-menu a,ul.navbar-nav a{border-bottom-style:none;color:#323232}.nav.sidebar-menu .nav-icon
1
+ html{height:100%;overflow-x:hidden;scroll-behavior:auto!important}body{margin:0;min-height:100%;overflow-y:clip;position:relative}body.modal-open{overflow:hidden;position:fixed;width:100%}*{-webkit-font-variant-ligatures:no-common-ligatures;-moz-font-variant-ligatures:no-common-ligatures;font-variant-ligatures:no-common-ligatures}a.active,a:active{outline:none}.page-item:focus-visible,.page-link:focus-visible,a:focus-visible{outline:4px solid rgba(226,0,38,.25)!important;z-index:100}.swh-top-bar a:focus-visible,footer a:focus-visible{outline:3px solid rgba(226,0,38,.75)!important}code{background-color:#f9f2f4}pre code{background-color:transparent}footer{background-color:#262626!important;color:#fff!important;font-size:.8rem;padding-bottom:10px;padding-top:10px;width:100%}footer a,footer a:hover,footer a:visited{color:#fecd1b}pre{background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px;color:#212529;font-size:.8rem;padding:9.5px}.app-content{padding-top:10px}.app-main{overflow:hidden!important}.btn.active{background-color:#e7e7e7}.card{margin-bottom:5px!important;overflow-x:auto}.navbar-brand{margin-right:0;padding:5px}.table{margin-bottom:0}.swh-table thead{background-color:#f2f4f5;border-top:1px solid rgba(0,0,0,.2);font-weight:400}.swh-table-striped th{border-top:none}.swh-table-striped tbody tr:nth-child(2n){background-color:#f2f4f5!important}.swh-table-striped tbody tr:nth-child(odd){background-color:#fff!important}.table>thead>tr>th{border-bottom:1px solid #e20026;border-top:none}.table>tbody>tr>td{border-style:none}.sitename .first-word,.sitename .second-word{color:rgba(0,0,0,.75);font-size:1.2rem;font-weight:400}.sitename .first-word{font-family:Alegreya Sans,sans-serif}.sitename .second-word{font-family:Alegreya,serif}.swh-counter{font-size:150%}@media (max-width:600px){.swh-counter-container{margin-top:1rem}}.swh-http-error{margin:0 auto;text-align:center}.swh-http-error-head{color:#2d353c;font-size:30px}.swh-http-error-code{bottom:60%;color:#2d353c;font-size:96px;line-height:80px;margin-bottom:10px!important}.swh-http-error-desc{color:#647788;font-size:12px;text-align:center}.swh-http-error-desc pre{display:inline-block;max-width:800px;text-align:left;white-space:pre-wrap}.swh-list-unstyled{list-style:none}.popover{max-width:97%;z-index:40000}.modal{padding:0!important;text-align:center;z-index:50000}.modal:before{content:"";height:100%;margin-right:-4px}.modal-dialog,.modal:before{display:inline-block;vertical-align:middle}.modal-dialog{text-align:left}.dropdown-submenu{position:relative}.dropdown-submenu .dropdown-menu{left:-100%;margin-left:-2px;margin-top:-5px;top:0}.dropdown-item:focus,.dropdown-item:hover{background-color:rgba(0,0,0,.1)}a.dropdown-left:before{content:"\f035e";display:block;float:left;font-family:Material Design Icons;height:20px;margin-left:0;width:20px}.swh-navbar{border-bottom-width:5px;-webkit-border-image:-webkit-gradient(linear,left top,right top,from(#e20026),to(#fecd1b)) 1 1 1 1;-webkit-border-image:-webkit-linear-gradient(left,#e20026,#fecd1b) 1 1 1 1;-moz-border-image:-moz-linear-gradient(left,#e20026 0,#fecd1b 100%) 1 1 1 1;-o-border-image:linear-gradient(90deg,#e20026 0,#fecd1b) 1 1 1 1;border-image:-webkit-gradient(linear,left top,right top,from(#e20026),to(#fecd1b)) 1 1 1 1;border-image:linear-gradient(90deg,#e20026 0,#fecd1b) 1 1 1 1;border-style:none none solid;margin-top:30px;padding:5px;width:100%;-webkit-box-pack:normal;-webkit-justify-content:normal;-moz-box-pack:normal;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;height:72px;justify-content:normal;overflow:hidden}.swh-navbar-banner{margin-top:60px!important}#back-to-top{bottom:30px;display:none;position:fixed;right:30px;z-index:10}#back-to-top a img{background-size:32px 32px;display:block;height:32px;overflow:hidden;text-indent:-999px;width:32px}.swh-top-bar{background-color:#262626;color:#fff;direction:ltr;font-size:14px;height:30px;left:0;position:fixed;text-align:center;top:0;width:100%;z-index:99999}.swh-top-bar ul{margin-top:4px;padding-left:0;white-space:nowrap}.swh-top-bar li{display:inline-block;margin-left:10px;margin-right:10px}.swh-top-bar a,.swh-top-bar a:visited{color:#fff}.swh-top-bar a.swh-current-site,.swh-top-bar a.swh-current-site:visited{color:#fecd1b}.swh-banner{border:none;height:30px;left:0;position:fixed;top:30px;width:100%;z-index:99999}.swh-banner .row{background-color:#fecd1b;color:#e20026;font-size:larger;height:30px}.swh-position-left{left:0;position:absolute}.swh-position-right{position:absolute;right:0}.swh-background-gray{background:#f6f5f4}.swh-donate-link{background-color:#e20026;border:1px solid #fecd1b;border-radius:3px;color:#fff!important;padding:3px}.swh-navbar-content h4{padding-left:15px;padding-top:11px}.swh-navbar-content .bread-crumbs{display:block;margin-left:-40px}.swh-navbar-content .bread-crumbs li.bc-no-root{padding-top:.7rem}.app-sidebar{background:#fff;max-height:-webkit-calc(100vh - 30px)!important;max-height:-moz-calc(100vh - 30px)!important;max-height:calc(100vh - 30px)!important;top:30px!important}.app-sidebar-banner{margin-top:60px}.content-wrapper{background:none}.swh-push-menu{padding-top:5px}.sidebar-brand{border-bottom:5px solid #e20026!important;font-weight:500;height:4.5rem;padding-bottom:18px;padding-left:4px;padding-top:18.5px}.brand-image{max-height:40px}.sidebar-brand:focus,.sidebar-brand:hover{background-color:#e7e7e7!important;color:#323232!important}.sidebar-menu .nav-link p{padding-top:5px}.navbar-header a,ul.dropdown-menu a,ul.nav.sidebar-menu a,ul.navbar-nav a{border-bottom-style:none;color:#323232}.nav.sidebar-menu .nav-icon
2
2
 
3
3
  .nav-tabs .nav-link.active{border-top:3px solid #e20026}.swh-menu-item .nav-icon{color:#e20026!important}.swh-admin-menu-item .nav-icon{color:#fecd1b!important}.swh-notification-icon{color:#e20026!important;-webkit-transform:translate(8px,-6px);-moz-transform:translate(8px,-6px);transform:translate(8px,-6px)}.swh-sidebar .nav-link.active,.swh-sidebar .nav-link:focus{background-color:#e7e7e7!important;color:#323232!important}.swh-image-error{height:auto;width:80px}@media (max-width:600px){.card{min-width:80%}.swh-image-error{height:auto;width:40px}.swh-donate-link{display:none}}.swhid{white-space:pre-wrap}.swhid .swhid-option{display:inline-block;line-height:1rem;margin-right:5px}.nav-pills .nav-link:not(.active):hover{color:rgba(0,0,0,.55)}.swh-heading-color{color:#e20026!important}.sidebar-mini.sidebar-collapse .app-sidebar:hover{max-width:4.6rem;min-width:4.6rem;width:4.6rem}.sidebar-mini.sidebar-collapse .brand-text{display:none!important}.sidebar-mini.sidebar-collapse .app-sidebar:hover .brand-text,.sidebar-mini.sidebar-collapse .app-sidebar:hover .nav.sidebar-menu .nav-link p,.sidebar-mini.sidebar-collapse .app-sidebar:hover .user-panel>.info{visibility:hidden!important}.sidebar-mini.sidebar-collapse .app-sidebar .nav-header{display:none}.swh-words-logo{color:rgba(0,0,0,.75);font-size:10pt;height:73px;left:0;pointer-events:none;position:absolute;text-align:center;top:0;width:73px}.swh-words-logo:hover{text-decoration:none}.swh-words-logo-swh{line-height:1;padding-top:13px;visibility:hidden}.sidebar-collapse .swh-words-logo-swh{visibility:visible}.sidebar-open .swh-words-logo-swh{visibility:hidden}.sidebar-open .sidebar-wrapper{padding-left:1.5rem}hr.swh-faded-line{background-image:-webkit-gradient(linear,right top,left top,from(#f0f0f0),color-stop(#8c8b8b),to(#f0f0f0));background-image:-webkit-linear-gradient(right,#f0f0f0,#8c8b8b,#f0f0f0);background-image:-moz-linear-gradient(right,#f0f0f0,#8c8b8b,#f0f0f0);background-image:linear-gradient(270deg,#f0f0f0,#8c8b8b,#f0f0f0);border:0;height:1px}.swh-readme h1 a,.swh-readme h2 a,.swh-readme h3 a,.swh-readme h4 a,.swh-readme h5 a,.swh-readme h6 a{color:#e20026}.swh-rst li p{margin-bottom:0}.swh-readme-txt pre{background:none;border:none;white-space:pre-wrap}.swh-coverage-info-body{max-height:150px;overflow:auto hidden}tr.swh-tr-hover-highlight:hover td{background:#ededed}tr.swh-api-doc-route a{text-decoration:none}.swh-apidoc .col{margin:10px}.swh-apidoc .swh-rst blockquote{border:0;margin:0;padding:0}a.toggle-col{text-decoration:none}a.toggle-col.col-hidden{text-decoration:line-through}.admonition.warning{background:#fcf8e3;border:1px solid #faebcc}.admonition.note{background:#dce7fc;border:1px solid #c3d6fa}.admonition.important{background:#f8e5d3;border:1px solid #de7b21}.admonition.important,.admonition.note,.admonition.warning{border-radius:4px;margin-bottom:1rem;padding:15px}.admonition.important p,.admonition.note p,.admonition.warning p{margin-bottom:0}.admonition-title{font-weight:700}.admonition-title:before{display:block;float:left;height:20px;margin-left:0;width:20px}.admonition.warning .admonition-title:before{content:"\f0026";font-family:Material Design Icons}.admonition.note .admonition-title:before{content:"\f02fc";font-family:Material Design Icons}.admonition.important .admonition-title:before{content:"\f0238";font-family:Material Design Icons}.swh-popover{max-height:50vh;overflow:auto;padding:0}@media screen and (min-width:768px){.swh-popover{max-width:50vw}}.swh-popover pre{margin-bottom:0;white-space:pre-wrap}.d3-wrapper{height:0;padding:0 0 100%;position:relative;width:100%}.d3-wrapper>svg{height:100%;left:0;position:absolute;top:0;width:100%}div.d3-tooltip{background:#fff;border:1px solid #000;border-radius:4px;font:12px sans-serif;height:auto;padding:2px;pointer-events:none;position:absolute;text-align:center;width:auto}.page-link{cursor:pointer}.wrapper{overflow:hidden}.mdi{display:inline-block}.mdi-camera{-webkit-transform:translateY(1px);-moz-transform:translateY(1px);transform:translateY(1px)}.mdi-source-commit{-webkit-transform:translateY(2px);-moz-transform:translateY(2px);transform:translateY(2px)}.mdi-fw{text-align:center;width:1.25em}.mdi-stack{display:inline-block;height:1em;line-height:1em;position:relative;vertical-align:middle;width:1em}.mdi-stack .mdi{left:0;position:absolute;text-align:center;top:0;width:100%}.main-header .nav-link{height:inherit}.nav.sidebar-menu .nav-header:not(:first-of-type){padding-top:1rem}.nav.sidebar-menu .nav-link{padding-bottom:0;padding-top:0}.nav.sidebar-menu>.nav-item .nav-icon{vertical-align:sub}.swh-search-icon{line-height:1rem;vertical-align:middle}.swh-search-navbar{position:absolute;right:4rem;top:1rem;width:500px;z-index:50000}.swh-corner-ribbon{background:#f6f5f4;-webkit-box-shadow:0 0 3px rgba(0,0,0,.3);box-shadow:0 0 3px rgba(0,0,0,.3);color:#e20026;left:auto;letter-spacing:1px;position:absolute;right:-50px;text-align:center;top:28px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);transform:rotate(45deg);width:200px;z-index:1000}.swh-corner-ribbon-banner{top:85px}@media screen and (max-width:600px){.swh-corner-ribbon{right:-55px;top:24px}}.invalid-feedback{font-size:100%}.swh-required-label:after{color:red;content:"*"}.docutils.literal{background-color:#f9f2f4;color:#c7254e;font-family:monospace}.swh-mirror-text-under-logo,.swh-text-under-logo{position:absolute;top:45px}.swh-text-under-logo{left:30px}.swh-mirror-text-under-logo{left:33px}.sidebar-collapse .swh-text-under-logo{left:15px}.sidebar-collapse .swh-mirror-text-under-logo{left:17px}.swh-mirror-partner-logo{height:100%;position:absolute;right:47rem;top:0;z-index:50000}.sidebar-collapse .swh-mirror-partner-logo{right:36rem}.swh-mirror-partner-logo-no-search{right:15rem}.sidebar-collapse .swh-mirror-partner-logo-no-search{right:5rem}.sidebar-collapse .swh-add-forge-now-link .mdi-open-in-new,.sidebar-collapse .swh-origin-save-link .mdi-open-in-new{left:35px;position:absolute;top:5px}#swh-web-api-link{color:#e20026}p a{text-decoration:underline}.skipnav{text-align:left}.skipnav a{background:#000;color:#fff;height:auto;left:-10000px;position:absolute;text-decoration:underline;top:5px;width:auto;z-index:100000}.skipnav a:active,.skipnav a:focus{left:5px}#swh-login,#swh-logout{text-decoration:underline}#swh-logout-form{display:inline}#swh-logout-form button{background:none;border:none;color:#fff!important;cursor:pointer;padding:0;text-decoration:underline}.select-no-arrows{background:none!important}.swh-coverage{border:none;overflow:visible;padding-top:.3rem}.swh-coverage a{text-decoration:none}.swh-coverage-col{padding-left:10px;padding-right:10px}.swh-coverage-header{padding-bottom:0;padding-top:0}.swh-coverage-logo{display:block;font-family:"object-fit: contain;";height:50px;margin-left:auto;margin-right:auto;-o-object-fit:contain;object-fit:contain;width:100%}.swh-coverage-iframe{border:none;height:320px;width:100%}.swh-coverage-chevron{position:absolute;right:0}.swh-coverage .card-header .mdi{-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;-moz-transition:transform .3s ease-in-out,-moz-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out,-moz-transform .3s ease-in-out}.swh-coverage .card-header .collapsed .mdi{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);transform:rotate(90deg)}.swh-coverage-info-body{max-height:400px;overflow:auto;padding:0;scrollbar-width:thin}.swh-coverage-focus{border:2px solid #e20026!important}.swh-coverage-info-body::-webkit-scrollbar{width:4px}.swh-coverage-info-body::-webkit-scrollbar-track{background:#eff0f1}.swh-coverage-info-body::-webkit-scrollbar-thumb{background:#909396}
4
- /*# sourceMappingURL=archive_coverage.70eba3d32ed75472d638.css.map*/
4
+ /*# sourceMappingURL=archive_coverage.df54ae8fe40453ecd972.css.map*/
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css/archive_coverage.df54ae8fe40453ecd972.css","mappings":"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","sources":["webpack://swh/./swh/web/webapp/assets/webapp/webapp.css","webpack://swh/./swh/web/archive_coverage/assets/coverage.css"],"sourcesContent":["/**\n * Copyright (C) 2018-2025 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nhtml {\n height: 100%;\n overflow-x: hidden;\n scroll-behavior: auto !important;\n}\n\nbody {\n min-height: 100%;\n margin: 0;\n position: relative;\n overflow-y: clip;\n}\n\n/* Prevent scrolling of background when modal is opened */\nbody.modal-open {\n overflow: hidden;\n position: fixed;\n width: 100%;\n}\n\n\n/* The Alegreya font used in swh-web ships some ligatures producing\nconfusing text rendering, for instance the ligatures for `~` and some\ncharacters like e, y, u, ... so disable font common ligatures */\n* {\n font-variant-ligatures: no-common-ligatures;\n}\n\na:active,\na.active {\n outline: none;\n}\n\na:focus-visible,\n.page-item:focus-visible,\n.page-link:focus-visible {\n outline:rgb(226 0 38 / 25%) 4px solid !important;\n z-index: 100;\n}\n\n.swh-top-bar a:focus-visible,\nfooter a:focus-visible {\n outline:rgb(226 0 38 / 75%) 3px solid !important;\n}\n\ncode {\n background-color: #f9f2f4;\n}\n\npre code {\n background-color: transparent;\n}\n\nfooter {\n background-color: #262626 !important;\n color: #fff !important;\n font-size: 0.8rem;\n width: 100%;\n padding-top: 10px;\n padding-bottom: 10px;\n}\n\nfooter a,\nfooter a:visited,\nfooter a:hover {\n color: #fecd1b;\n}\n\n\npre {\n background-color: #f5f5f5;\n color: #212529;\n border: 1px solid #ccc;\n border-radius: 4px;\n padding: 9.5px;\n font-size: 0.8rem;\n}\n\n.app-content {\n padding-top: 10px;\n}\n\n.app-main {\n overflow: hidden !important;\n}\n\n.btn.active {\n background-color: #e7e7e7;\n}\n\n.card {\n margin-bottom: 5px !important;\n overflow-x: auto;\n}\n\n\n.navbar-brand {\n padding: 5px;\n margin-right: 0;\n}\n\n.table {\n margin-bottom: 0;\n}\n\n.swh-table thead {\n background-color: #f2f4f5;\n border-top: 1px solid rgb(0 0 0 / 20%);\n font-weight: normal;\n}\n\n.swh-table-striped th {\n border-top: none;\n}\n\n.swh-table-striped tbody tr:nth-child(even) {\n background-color: #f2f4f5 !important;\n}\n\n.swh-table-striped tbody tr:nth-child(odd) {\n background-color: #fff !important;\n}\n\n.table > thead > tr > th {\n border-top: none;\n border-bottom: 1px solid #e20026;\n}\n\n.table > tbody > tr > td {\n border-style: none;\n}\n\n.sitename .first-word,\n.sitename .second-word {\n color: rgb(0 0 0 / 75%);\n font-weight: normal;\n font-size: 1.2rem;\n}\n\n.sitename .first-word {\n font-family: \"Alegreya Sans\", sans-serif;\n}\n\n.sitename .second-word {\n font-family: Alegreya, serif;\n}\n\n.swh-counter {\n font-size: 150%;\n}\n\n@media (max-width: 600px) {\n .swh-counter-container {\n margin-top: 1rem;\n }\n}\n\n.swh-http-error {\n margin: 0 auto;\n text-align: center;\n}\n\n.swh-http-error-head {\n color: #2d353c;\n font-size: 30px;\n}\n\n.swh-http-error-code {\n bottom: 60%;\n color: #2d353c;\n font-size: 96px;\n line-height: 80px;\n margin-bottom: 10px !important;\n}\n\n.swh-http-error-desc {\n font-size: 12px;\n color: #647788;\n text-align: center;\n}\n\n.swh-http-error-desc pre {\n display: inline-block;\n text-align: left;\n max-width: 800px;\n white-space: pre-wrap;\n}\n\n.swh-list-unstyled {\n list-style: none;\n}\n\n.popover {\n max-width: 97%;\n z-index: 40000;\n}\n\n.modal {\n text-align: center;\n padding: 0 !important;\n z-index: 50000;\n}\n\n.modal::before {\n content: \"\";\n display: inline-block;\n height: 100%;\n vertical-align: middle;\n margin-right: -4px;\n}\n\n.modal-dialog {\n display: inline-block;\n text-align: left;\n vertical-align: middle;\n}\n\n.dropdown-submenu {\n position: relative;\n}\n\n.dropdown-submenu .dropdown-menu {\n top: 0;\n left: -100%;\n margin-top: -5px;\n margin-left: -2px;\n}\n\n.dropdown-item:hover,\n.dropdown-item:focus {\n background-color: rgb(0 0 0 / 10%);\n}\n\na.dropdown-left::before {\n content: \"\\f035e\";\n font-family: \"Material Design Icons\";\n display: block;\n width: 20px;\n height: 20px;\n float: left;\n margin-left: 0;\n}\n\n.swh-navbar {\n border-style: solid;\n border-top-style: none;\n border-left-style: none;\n border-right-style: none;\n border-bottom-width: 5px;\n border-image:\n linear-gradient(\n to right,\n rgb(226 0 38) 0%,\n rgb(254 205 27) 100%\n )\n 1 1 1 1;\n width: 100%;\n padding: 5px;\n margin-top: 30px;\n justify-content: normal;\n flex-wrap: nowrap;\n height: 72px;\n overflow: hidden;\n}\n\n.swh-navbar-banner {\n margin-top: 60px !important;\n}\n\n#back-to-top {\n display: none;\n position: fixed;\n bottom: 30px;\n right: 30px;\n z-index: 10;\n}\n\n#back-to-top a img {\n display: block;\n width: 32px;\n height: 32px;\n background-size: 32px 32px;\n text-indent: -999px;\n overflow: hidden;\n}\n\n.swh-top-bar {\n direction: ltr;\n height: 30px;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n z-index: 99999;\n background-color: #262626;\n color: #fff;\n text-align: center;\n font-size: 14px;\n}\n\n.swh-top-bar ul {\n margin-top: 4px;\n padding-left: 0;\n white-space: nowrap;\n}\n\n.swh-top-bar li {\n display: inline-block;\n margin-left: 10px;\n margin-right: 10px;\n}\n\n.swh-top-bar a,\n.swh-top-bar a:visited {\n color: white;\n}\n\n.swh-top-bar a.swh-current-site,\n.swh-top-bar a.swh-current-site:visited {\n color: #fecd1b;\n}\n\n.swh-banner {\n height: 30px;\n position: fixed;\n top: 30px;\n left: 0;\n width: 100%;\n z-index: 99999;\n border: none;\n}\n\n.swh-banner .row {\n height: 30px;\n background-color: #fecd1b;\n color: #e20026;\n font-size: larger;\n}\n\n.swh-position-left {\n position: absolute;\n left: 0;\n}\n\n.swh-position-right {\n position: absolute;\n right: 0;\n}\n\n.swh-background-gray {\n background: #f6f5f4;\n}\n\n.swh-donate-link {\n border: 1px solid #fecd1b;\n background-color: #e20026;\n color: white !important;\n padding: 3px;\n border-radius: 3px;\n}\n\n.swh-navbar-content h4 {\n padding-top: 11px;\n padding-left: 15px;\n}\n\n.swh-navbar-content .bread-crumbs {\n display: block;\n margin-left: -40px;\n}\n\n.swh-navbar-content .bread-crumbs li.bc-no-root {\n padding-top: 0.7rem;\n}\n\n.app-sidebar {\n background: white;\n top: 30px !important;\n max-height: calc(100vh - 30px) !important;\n}\n\n.app-sidebar-banner {\n margin-top: 60px;\n}\n\n.content-wrapper {\n background: none;\n}\n\n.swh-push-menu {\n padding-top: 5px;\n}\n\n.sidebar-brand {\n padding-top: 18.5px;\n padding-bottom: 18px;\n padding-left: 4px;\n border-bottom: 5px solid #e20026 !important;\n height: 4.5rem;\n font-weight: 500;\n}\n\n.brand-image {\n max-height: 40px;\n}\n\n.sidebar-brand:hover,\n.sidebar-brand:focus {\n color: #323232 !important;\n background-color: #e7e7e7 !important;\n}\n\n.sidebar-menu .nav-link p {\n padding-top: 5px;\n}\n\n.navbar-header a,\nul.dropdown-menu a,\nul.navbar-nav a,\nul.nav.sidebar-menu a {\n border-bottom-style: none;\n color: #323232;\n}\n\n.nav.sidebar-menu .nav-icon\n\n.nav-tabs .nav-link.active {\n border-top: 3px solid #e20026;\n}\n\n.swh-menu-item .nav-icon {\n color: #e20026 !important;\n}\n\n.swh-admin-menu-item .nav-icon {\n color: #fecd1b ! important;\n}\n\n.swh-notification-icon {\n color: #e20026 !important;\n transform: translate(8px, -6px);\n}\n\n.swh-sidebar .nav-link.active,\n.swh-sidebar .nav-link:focus {\n color: #323232 !important;\n background-color: #e7e7e7 !important;\n}\n\n.swh-image-error {\n width: 80px;\n height: auto;\n}\n\n@media (max-width: 600px) {\n .card {\n min-width: 80%;\n }\n\n .swh-image-error {\n width: 40px;\n height: auto;\n }\n\n .swh-donate-link {\n display: none;\n }\n}\n\n.swhid {\n white-space: pre-wrap;\n}\n\n.swhid .swhid-option {\n display: inline-block;\n margin-right: 5px;\n line-height: 1rem;\n}\n\n.nav-pills .nav-link:not(.active):hover {\n color: rgb(0 0 0 / 55%);\n}\n\n.swh-heading-color {\n color: #e20026 !important;\n}\n\n.sidebar-mini.sidebar-collapse .app-sidebar:hover {\n width: 4.6rem;\n\n /* ensure collapsed sidebar is not automatically expanded when hovering it */\n min-width: 4.6rem;\n max-width: 4.6rem;\n}\n\n.sidebar-mini.sidebar-collapse .brand-text {\n display: none !important;\n}\n\n.sidebar-mini.sidebar-collapse .app-sidebar:hover .user-panel > .info,\n.sidebar-mini.sidebar-collapse .app-sidebar:hover .nav.sidebar-menu .nav-link p,\n.sidebar-mini.sidebar-collapse .app-sidebar:hover .brand-text {\n visibility: hidden !important;\n}\n\n.sidebar-mini.sidebar-collapse .app-sidebar .nav-header {\n display: none;\n}\n\n.swh-words-logo {\n position: absolute;\n top: 0;\n left: 0;\n width: 73px;\n height: 73px;\n text-align: center;\n font-size: 10pt;\n color: rgb(0 0 0 / 75%);\n pointer-events: none;\n}\n\n.swh-words-logo:hover {\n text-decoration: none;\n}\n\n.swh-words-logo-swh {\n line-height: 1;\n padding-top: 13px;\n visibility: hidden;\n}\n\n.sidebar-collapse .swh-words-logo-swh {\n visibility: visible;\n}\n\n.sidebar-open .swh-words-logo-swh {\n visibility: hidden;\n}\n\n.sidebar-open .sidebar-wrapper {\n padding-left: 1.5rem;\n}\n\nhr.swh-faded-line {\n border: 0;\n height: 1px;\n background-image: linear-gradient(to left, #f0f0f0, #8c8b8b, #f0f0f0);\n}\n\n/* Ensure that section title with link is colored like standard section title */\n.swh-readme h1 a,\n.swh-readme h2 a,\n.swh-readme h3 a,\n.swh-readme h4 a,\n.swh-readme h5 a,\n.swh-readme h6 a {\n color: #e20026;\n}\n\n/* Make list compact in reStructuredText rendering */\n.swh-rst li p {\n margin-bottom: 0;\n}\n\n.swh-readme-txt pre {\n background: none;\n border: none;\n white-space: pre-wrap;\n}\n\n.swh-coverage {\n padding-top: 0.3rem;\n border: none;\n overflow: visible;\n}\n\n.swh-coverage a {\n text-decoration: none;\n}\n\n.swh-coverage-col {\n padding-left: 10px;\n padding-right: 10px;\n}\n\n.swh-coverage-header {\n padding-top: 0;\n padding-bottom: 0;\n}\n\n.swh-coverage-logo {\n display: block;\n width: 100%;\n height: 50px;\n margin-left: auto;\n margin-right: auto;\n object-fit: contain;\n\n /* polyfill for old browsers, see https://github.com/bfred-it/object-fit-images */\n font-family: \"object-fit: contain;\";\n}\n\n.swh-coverage-iframe {\n width: 100%;\n height: 320px;\n border: none;\n}\n\n.swh-coverage-chevron {\n position: absolute;\n right: 0;\n}\n\n.swh-coverage .card-header .mdi {\n transition: 0.3s transform ease-in-out;\n}\n\n.swh-coverage .card-header .collapsed .mdi {\n transform: rotate(90deg);\n}\n\n.swh-coverage-info-body {\n max-height: 150px;\n overflow: auto hidden;\n scrollbar-width: thin; /* Firefox only */\n padding: 0;\n}\n\n/* Thin scrollbar for chromium based browsers */\n\n.swh-coverage-info-body::-webkit-scrollbar {\n width: 4px;\n}\n\n.swh-coverage-info-body::-webkit-scrollbar-track {\n background: #eff0f1;\n}\n\n.swh-coverage-info-body::-webkit-scrollbar-thumb {\n background: #909396;\n}\n\ntr.swh-tr-hover-highlight:hover td {\n background: #ededed;\n}\n\ntr.swh-api-doc-route a {\n text-decoration: none;\n}\n\n.swh-apidoc .col {\n margin: 10px;\n}\n\n.swh-apidoc .swh-rst blockquote {\n border: 0;\n margin: 0;\n padding: 0;\n}\n\na.toggle-col {\n text-decoration: none;\n}\n\na.toggle-col.col-hidden {\n text-decoration: line-through;\n}\n\n.admonition.warning {\n background: #fcf8e3;\n border: 1px solid #faebcc;\n}\n\n.admonition.note {\n background: #dce7fc;\n border: 1px solid #c3d6fa;\n}\n\n.admonition.important {\n background: hsl(28.5deg 74% 90%);\n border: 1px solid hsl(28.5deg 74% 50%);\n}\n\n.admonition.warning,\n.admonition.note,\n.admonition.important {\n padding: 15px;\n border-radius: 4px;\n margin-bottom: 1rem;\n}\n\n.admonition.warning p,\n.admonition.note p,\n.admonition.important p {\n margin-bottom: 0;\n}\n\n.admonition-title {\n font-weight: bold;\n}\n\n.admonition-title::before {\n display: block;\n width: 20px;\n height: 20px;\n float: left;\n margin-left: 0;\n}\n\n.admonition.warning .admonition-title::before {\n content: \"\\f0026\";\n font-family: \"Material Design Icons\";\n}\n\n.admonition.note .admonition-title::before {\n content: \"\\f02fc\";\n font-family: \"Material Design Icons\";\n}\n\n.admonition.important .admonition-title::before {\n content: \"\\f0238\";\n font-family: \"Material Design Icons\";\n}\n\n.swh-popover {\n max-height: 50vh;\n overflow: auto;\n padding: 0;\n}\n\n@media screen and (min-width: 768px) {\n .swh-popover {\n max-width: 50vw;\n }\n}\n\n.swh-popover pre {\n white-space: pre-wrap;\n margin-bottom: 0;\n}\n\n.d3-wrapper {\n position: relative;\n height: 0;\n width: 100%;\n padding: 0;\n\n /* padding-bottom will be overwritten by JavaScript later */\n padding-bottom: 100%;\n}\n\n.d3-wrapper > svg {\n position: absolute;\n height: 100%;\n width: 100%;\n left: 0;\n top: 0;\n}\n\ndiv.d3-tooltip {\n position: absolute;\n text-align: center;\n width: auto;\n height: auto;\n padding: 2px;\n font: 12px sans-serif;\n background: white;\n border: 1px solid black;\n border-radius: 4px;\n pointer-events: none;\n}\n\n.page-link {\n cursor: pointer;\n}\n\n.wrapper {\n overflow: hidden;\n}\n\n/* Material Design icons alignment tweaks */\n\n.mdi {\n display: inline-block;\n}\n\n.mdi-camera {\n transform: translateY(1px);\n}\n\n.mdi-source-commit {\n transform: translateY(2px);\n}\n\n/* To set icons at a fixed width. Great to use when different\n icon widths throw off alignment. Courtesy of Font Awesome. */\n.mdi-fw {\n text-align: center;\n width: 1.25em;\n}\n\n.mdi-stack {\n position: relative;\n display: inline-block;\n width: 1em;\n height: 1em;\n line-height: 1em;\n vertical-align: middle;\n}\n\n.mdi-stack .mdi {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n text-align: center;\n}\n\n.main-header .nav-link {\n height: inherit;\n}\n\n.nav.sidebar-menu .nav-header:not(:first-of-type) {\n padding-top: 1rem;\n}\n\n.nav.sidebar-menu .nav-link {\n padding-top: 0;\n padding-bottom: 0;\n}\n\n.nav.sidebar-menu > .nav-item .nav-icon {\n vertical-align: sub;\n}\n\n.swh-search-icon {\n line-height: 1rem;\n vertical-align: middle;\n}\n\n.swh-search-navbar {\n position: absolute;\n top: 1rem;\n right: 4rem;\n z-index: 50000;\n width: 500px;\n}\n\n.swh-corner-ribbon {\n width: 200px;\n background: #f6f5f4;\n color: #e20026;\n position: absolute;\n text-align: center;\n letter-spacing: 1px;\n box-shadow: 0 0 3px rgb(0 0 0 / 30%);\n top: 28px;\n right: -50px;\n left: auto;\n transform: rotate(45deg);\n z-index: 1000;\n}\n\n.swh-corner-ribbon-banner {\n top: 85px;\n}\n\n@media screen and (max-width: 600px) {\n .swh-corner-ribbon {\n top: 24px;\n right: -55px;\n }\n}\n\n.invalid-feedback {\n font-size: 100%;\n}\n\n.swh-required-label::after {\n content: \"*\";\n color: #f00;\n}\n\n.docutils.literal {\n background-color: #f9f2f4;\n color: #c7254e;\n font-family: monospace;\n}\n\n.swh-text-under-logo, .swh-mirror-text-under-logo {\n position: absolute;\n top: 45px;\n}\n\n.swh-text-under-logo {\n left: 30px;\n}\n\n.swh-mirror-text-under-logo {\n left: 33px;\n}\n\n.sidebar-collapse .swh-text-under-logo {\n left: 15px;\n}\n\n.sidebar-collapse .swh-mirror-text-under-logo {\n left: 17px;\n}\n\n.swh-mirror-partner-logo {\n position: absolute;\n top: 0;\n right: 47rem;\n z-index: 50000;\n height: 100%;\n}\n\n.sidebar-collapse .swh-mirror-partner-logo {\n right: 36rem;\n}\n\n.swh-mirror-partner-logo-no-search {\n right: 15rem;\n}\n\n.sidebar-collapse .swh-mirror-partner-logo-no-search {\n right: 5rem;\n}\n\n.sidebar-collapse .swh-origin-save-link .mdi-open-in-new,\n.sidebar-collapse .swh-add-forge-now-link .mdi-open-in-new {\n position: absolute;\n left: 35px;\n top: 5px;\n}\n\n#swh-web-api-link {\n color: #e20026;\n}\n\np a {\n text-decoration: underline;\n}\n\n.skipnav {\n text-align: left;\n}\n\n.skipnav a {\n position: absolute;\n left: -10000px;\n top: 5px;\n width: auto;\n height: auto;\n text-decoration: underline;\n background: black;\n color: white;\n z-index: 100000;\n}\n\n.skipnav a:focus,\n.skipnav a:active {\n left: 5px;\n}\n\n#swh-login,\n#swh-logout {\n text-decoration: underline;\n}\n\n#swh-logout-form {\n display: inline;;\n}\n\n#swh-logout-form button {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n text-decoration: underline;\n color: white !important;\n}\n\n.select-no-arrows {\n background: none !important;\n}\n\n\n\n","/**\n * Copyright (C) 2021-2022 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\n.swh-coverage {\n padding-top: 0.3rem;\n border: none;\n overflow: visible;\n}\n\n.swh-coverage a {\n text-decoration: none;\n}\n\n.swh-coverage-col {\n padding-left: 10px;\n padding-right: 10px;\n}\n\n.swh-coverage-header {\n padding-top: 0;\n padding-bottom: 0;\n}\n\n.swh-coverage-logo {\n display: block;\n width: 100%;\n height: 50px;\n margin-left: auto;\n margin-right: auto;\n object-fit: contain;\n\n /* polyfill for old browsers, see https://github.com/bfred-it/object-fit-images */\n font-family: \"object-fit: contain;\";\n}\n\n.swh-coverage-iframe {\n width: 100%;\n height: 320px;\n border: none;\n}\n\n.swh-coverage-chevron {\n position: absolute;\n right: 0;\n}\n\n.swh-coverage .card-header .mdi {\n transition: 0.3s transform ease-in-out;\n}\n\n.swh-coverage .card-header .collapsed .mdi {\n transform: rotate(90deg);\n}\n\n.swh-coverage-info-body {\n max-height: 400px;\n overflow: auto;\n scrollbar-width: thin; /* Firefox only */\n padding: 0;\n}\n\n.swh-coverage-focus {\n border: 2px solid #e20026 !important;\n}\n\n/* Thin scrollbar for chromium based browsers */\n\n.swh-coverage-info-body::-webkit-scrollbar {\n width: 4px;\n}\n\n.swh-coverage-info-body::-webkit-scrollbar-track {\n background: #eff0f1;\n}\n\n.swh-coverage-info-body::-webkit-scrollbar-thumb {\n background: #909396;\n}\n"],"names":[],"sourceRoot":""}