Gutenberg: Restore existing behavior when rendering document title (<title> tag)

Created on 28 Nov 2017  ·  18Comments  ·  Source: WordPress/gutenberg

I've noticed that Gutenberg edits the <title> tag:

image

As an existing WordPress writer, this makes it difficult to find the tab I was writing in because I'm accustomed to searching for "Edit Post":

image

Just wanted to record this usability feedback.

Accessibility (a11y) Backwards Compatibility Needs Decision [Type] Bug

Most helpful comment

If you have multiple posts open for editing in multiple tabs, having the post's title in the document title is key to be able to identify which tab contains the post you're needing to get back to editing. The post title was put at the beginning to account for browser tabs that are narrow, as in screenshot. But prefixing the title with “Edit…” would probably be a good compromise. (Or else, a ✏️ emoji perhaps? 😄)

All 18 comments

This is important for accessibility too, as the document title is the first thing screen readers announce. Not sure what the reasoning behind this is, but at least the initial document title should be consistent with what WordPress does in the Classic Editor and say as first thing _what_ the page is about:
Edit Post ...
Edit Page ...
Edit {CPT name here} ...

It was added here: https://github.com/WordPress/gutenberg/pull/1802

Only other thought I have is: Do we really want the document title to be assigned as the post's title? Per #1737 and current editor behavior, seems "Edit Post" could work just as well. Was there any conversation or thoughts behind the choice to use post title?

cc @westonruter @aduth

If you have multiple posts open for editing in multiple tabs, having the post's title in the document title is key to be able to identify which tab contains the post you're needing to get back to editing. The post title was put at the beginning to account for browser tabs that are narrow, as in screenshot. But prefixing the title with “Edit…” would probably be a good compromise. (Or else, a ✏️ emoji perhaps? 😄)

(Or else, a ✏️ emoji perhaps? 😄)

lol. Well I understand the argumentation, however Gutenberg shouldn't deviate from what WordPress does in all the other screens. The document title should be consistent across all admin screens. Not sure adding the post title would fit in the limited space (browsers tend to truncate long titles); we should also consider the doc title has a limited _visual_ value, while it is very important for other software reading (and announcing) it.

I'm not sure we're being serious but a -1 on emoji's here, they are awesome but not in this case :)

I think it's right to go with existing WP patterns in this case. We can always iterate on them later.

I've done a very small edit which adds an 'Edit: ' to the beginning of the editor's tag, like so, but which otherwise keeps the post title too.<br /> <img loading="lazy" src="https://user-images.githubusercontent.com/4240738/36300723-4a9a7fc4-12d0-11e8-8356-8cf869409d1a.png" alt="new-editor-title-example" /></p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars1.githubusercontent.com/u/4240738?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="stevehardy325 picture"> <strong>stevehardy325</strong> <span class="text-muted ml-1">on 16 Feb 2018</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <p>To better document this issue...</p> <p>Gutenberg does a pretty mediocre job of rendering the document title <code><title></code>.</p> <p>Specifically, when creating a new post, Gutenberg shoves the title in front of <code>Add New Post ‹</code>:</p> <p><img width="293" alt="image" src="https://user-images.githubusercontent.com/36432/40544264-88969d90-5fdc-11e8-8930-8c0b3a0de918.png"></p> <p>Then, once you've saved the post and refreshed the page, Gutenberg ends up in this state:</p> <p><img width="280" alt="image" src="https://user-images.githubusercontent.com/36432/40544305-aa8d1a5a-5fdc-11e8-9244-4ef98a7ceb7a.png"></p> <p>Because the document title can be both localized _and_ filtered with <code>admin_title</code>, I think we should ditch this client-side modification and only set <code><title></code> server-side.</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars1.githubusercontent.com/u/36432?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="danielbachhuber picture"> <strong>danielbachhuber</strong> <span class="text-muted ml-1">on 25 May 2018</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <blockquote> <p>Because the document title can be both localized _and_ filtered with <code>admin_title</code>, I think we should ditch this client-side modification and only set <code><title></code> server-side.</p> </blockquote> <p>Playing devil's advocate: If I refresh the screen at any point in time, assuming I have no unsaved changes, I expect I should be presented with an identical UI, where the browser tab is considered part of the UI. I'm thinking analogous to a <a rel="nofollow noopener" target="_blank" href="https://en.wikipedia.org/wiki/Pure_function">pure function</a> at the browser level. Currently this is more-or-less true. </p> <p>Without client-side modification as proposed, however, I expect this will no longer be true.</p> <p>Cost/benefit may still favor abandoning client-side modification, but I figured it was worth highlighting a yet-unmentioned cost.</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars1.githubusercontent.com/u/1779930?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="aduth picture"> <strong>aduth</strong> <span class="text-muted ml-1">on 29 May 2018</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <blockquote> <p>Currently this is more-or-less true.</p> </blockquote> <p>The current implementation is broken though?</p> <blockquote> <p>Without client-side modification as proposed, however, I expect this will no longer be true.</p> </blockquote> <p>If we switch back to purely server-side, then the <code><title></code> tag should remain consistent regardless of state.</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars1.githubusercontent.com/u/36432?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="danielbachhuber picture"> <strong>danielbachhuber</strong> <span class="text-muted ml-1">on 29 May 2018</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <p>To avoid the complexity of having to deal with two separate styles of document <code><title></code> (one for <code>post-new.php</code> and a second for <code>post.php?post=<id></code>), maybe we could _always_ redirect <code>post-new.php</code> to <code>post.php?post=<id></code> and avoid <code>post-new.php</code> entirely.</p> <p>I'm unsure of the history for <code>post-new.php</code> / <code>post.php?post=<id></code>, so we'd need to vet this from a back-compat perspective. I'm not aware of any immediate back-compat concerns though.</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars1.githubusercontent.com/u/36432?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="danielbachhuber picture"> <strong>danielbachhuber</strong> <span class="text-muted ml-1">on 5 Jun 2018</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="mb-4"> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-3835332123789605" data-ad-slot="3731713875" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <p>Always redirecting <code>post-now.php</code> to <code>post.php</code> has the potential for a whole host of subtle bugs that rely on the <code>WP_Screen</code> functionality, or the <code>$parent_file</code> / <code>$submenu_file</code> values. I would like to avoid it if possible.</p> <p>Given that the <code><title></code> doesn't include the <code>post_title</code>, I think it's reasonable to duplicate the logic in <code>admin-header.php</code> to generate the "Edit Post" <code><title></code>, and swap that in when the new post is saved.</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars3.githubusercontent.com/u/352291?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="pento picture"> <strong>pento</strong> <span class="text-muted ml-1">on 5 Jun 2018</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <p>While I'm thinking of it, the other thing that needs to dynamically update is this:</p> <p><img width="491" alt="image" src="https://user-images.githubusercontent.com/36432/40982879-3ca1b66c-6893-11e8-8491-e1ac877fed6d.png"></p> <blockquote> <p>Always redirecting <code>post-now.php</code> to <code>post.php</code> has the potential for a whole host of subtle bugs that rely on the <code>WP_Screen</code> functionality, or the <code>$parent_file</code> / <code>$submenu_file</code> values. I would like to avoid it if possible.</p> </blockquote> <p>Arguably, these bugs are already present in Gutenberg, given the editing experience starts at <code>post-new.php</code> and doesn't load <code>post.php</code> until page refresh, whereas the Classic editor opens <code>post.php</code> after the first save.</p> <p>While I don't have a strong opinion about the final implementation, I'm not sure the information you've presented is an argument in favor of your suggested implementation. I think always redirecting is an option still worth considering.</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars1.githubusercontent.com/u/36432?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="danielbachhuber picture"> <strong>danielbachhuber</strong> <span class="text-muted ml-1">on 5 Jun 2018</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <blockquote> <p>Arguably, these bugs are already present in Gutenberg, given the editing experience starts at <code>post-new.php</code> and doesn't load <code>post.php</code> until page refresh, whereas the Classic editor opens <code>post.php</code> after the first save.</p> </blockquote> <p>This may have changed. I tested creating a new post in Gutenberg just now and the Gutenberg editor opened <code>post.php</code> after the first save.</p> <blockquote> <p>Because the document title can be both localized _and_ filtered with <code>admin_title</code>, I think we should ditch this client-side modification and only set <code><title></code> server-side.</p> </blockquote> <p>Digging a little deeper, why does the ability to localize and filter <code>admin_title</code> matter for this? Is it because if you make a change to <code><title></code> client-side that change will be temporarily be out-of-sync until an autosave happens?</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars0.githubusercontent.com/u/1119271?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="designsimply picture"> <strong>designsimply</strong> <span class="text-muted ml-1">on 25 Jun 2018</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <p>Tested and confirmed that in the Classic editor the <code><title></code> is prefaced with <code>Edit Post</code> while editing whereas the Gutenberg editor does not.</p> <p>Classic editor:</p> <ul> <li>The title for Post > Add New is <code>Add New Post ‹ Site Title — WordPress</code>.</li> <li>The title after clicking 'Save Draft' is <code>Edit Post ‹ Site Title — WordPress</code>.</li> <li>The title after clicking 'Publish' is <code>Edit Post ‹ Site Title — WordPress</code>.</li> <li>The title after re-opening a post for editing is <code>Edit Post ‹ Site Title — WordPress</code>.</li> <li>The title for the published post on the front-end is <code>Post Title – Site Title</code>.</li> </ul> <p>Gutenberg editor:</p> <ul> <li>The title for Post > Add New is <code>New post | Add New Post ‹ Site Title — WordPress</code>.</li> <li>The title after making any change <code>Post Title | Add New Post ‹ Site Title — WordPress</code>.</li> <li>The title after autosave or refreshing the page is <code>Post Title | ‹ Site Title — WordPress</code>.</li> <li>The title after clicking 'Publish' is <code>Post Title | ‹ Site Title — WordPress</code>.</li> <li>The title after re-opening a post for editing is <code>Post Title | ‹ Site Title — WordPress</code>.</li> <li>The title for the published post on the front-end is <code>Post Title – Site Title</code>.</li> </ul> <p><img loading="lazy" src="https://user-images.githubusercontent.com/1119271/41875730-0b3c63f0-7889-11e8-9d5b-4e6cc27c6d13.png" alt="screen shot 2018-06-25 at mon jun 25 3 03 30 pm" /><br /> <sup>Seen at http://alittletestblog.com/wp-admin/post.php?post=13826&action=edit running WordPress 4.9.6 and Gutenberg 3.1.0 using Firefox 60.0.2 on macOS 10.13.5.</sup></p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars0.githubusercontent.com/u/1119271?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="designsimply picture"> <strong>designsimply</strong> <span class="text-muted ml-1">on 25 Jun 2018</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <p>I removed the <code>Good First Issue</code> label and added the <code>Needs Decision</code> label because the following should be addressed before this issue is actionable:</p> <ol> <li>Should <code><title></code> be prefixed with <code>Edit:</code> or <code>Edit Post ‹</code> while editing a post with Gutenberg?</li> <li>Should <code><title></code> not be changed client-side because it can be localized and filtered with <code>admin_title</code>?</li> <li>Should we always redirect post-new.php to post.php?post=<id> (avoid post-new.php entirely) so we don't have to deal with two separate styles of <code><title></code>?</li> </ol> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars0.githubusercontent.com/u/1119271?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="designsimply picture"> <strong>designsimply</strong> <span class="text-muted ml-1">on 25 Jun 2018</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <p>At this point, my vote would be:</p> <ol> <li>Gutenberg always displays <code>Edit Post ‹ Site Title — WordPress</code></li> <li><code><title></code> is not changed client-side.</li> <li><code><title></code> can be filtered by the <code>admin_title</code> filter.</li> <li>Gutenberg does not redirect <code>post-new.php</code> to <code>post.php?post=</code>, and maintains the same <code><title></code> between them.</li> </ol> <p>I think this is the simplest implementation that maintains the closest parity to Classic Editor behavior.</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars1.githubusercontent.com/u/36432?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="danielbachhuber picture"> <strong>danielbachhuber</strong> <span class="text-muted ml-1">on 9 Aug 2018</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <blockquote> <p>Gutenberg does not redirect <code>post-new.php</code> to <code>post.php?post=</code></p> </blockquote> <p>I'm not really so fond of this one, largely because I think it's a common pattern to reload the page (as an explicit user interaction, or maybe just reopening closed tabs). And if I'd started and saved a post, I'd expect a reload to bring me to that post; not a blank new post.</p> <p>Would it be enough to just remove client-side title manipulations for now? I don't know that they're adding much value as it is. </p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars1.githubusercontent.com/u/1779930?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="aduth picture"> <strong>aduth</strong> <span class="text-muted ml-1">on 10 Aug 2018</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <blockquote> <p>I'm not really so fond of this one, largely because I think it's a common pattern to reload the page (as an explicit user interaction, or maybe just reopening closed tabs). And if I'd started and saved a post, I'd expect a reload to bring me to that post; not a blank new post.</p> </blockquote> <p>Ah, I see that you're referring to Gutenberg's existing behavior of updating the URL after initial save. I think this behavior should persist. I was referring to forcefully redirecting <code>post-new.php</code> on PHP page load.</p> <p>I think we should make these changes:</p> <ol> <li>Remove client-side manipulation of <code><title></code>.</li> <li>Always default <code><title></code> to <code>Edit Post ‹ Site Title — WordPress</code>, regardless of whether the page is <code>post-new.php</code> or <code>post.php?post=</code>.</li> </ol> <p>I can prepare a PR</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars1.githubusercontent.com/u/36432?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="danielbachhuber picture"> <strong>danielbachhuber</strong> <span class="text-muted ml-1">on 10 Aug 2018</span> </div> <div class="col text-right"> </div> </div> </div> </div> </div> <div class="col-12"> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown text-center helpful"> <div class="title">Was this page helpful?</div> <div class="mt-1" onMouseLeave="rating(277510544, 0);"> <i class="fas fa-star inactive" id="star-1" onMouseOver="rating(277510544, 1);" onclick="rate(277510544, 1);"></i> <i class="fas fa-star inactive" id="star-2" onMouseOver="rating(277510544, 2);" onclick="rate(277510544, 2);"></i> <i class="fas fa-star inactive" id="star-3" onMouseOver="rating(277510544, 3);" onclick="rate(277510544, 3);"></i> <i class="fas fa-star inactive" id="star-4" onMouseOver="rating(277510544, 4);" onclick="rate(277510544, 4);"></i> <i class="fas fa-star inactive" id="star-5" onMouseOver="rating(277510544, 5);" onclick="rate(277510544, 5);"></i> </div> <div class="description text-small"><span id="rating-val">0</span> / 5 - <span id="rating-count">0</span> ratings</div> </div> </div> <div class="mb-4"> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-3835332123789605" data-ad-slot="3452512275" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> </div> </div> <div class="col-12 col-lg-4"> <div id="ph-above-related"></div> <div class="card card-custom issue-box"> <div class="card-body pt-3 pb-5"> <h2 class="mb-4">Related issues</h2> <div> <strong> <a href="/gutenberg/231710082/use-correct-plural-for-children">Use correct plural for "children"</a> </strong> </div> <div class="text-muted text-small mt-2"> <img src="https://avatars2.githubusercontent.com/u/387666?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="franz-josef-kaiser picture"> <strong class="pr-1" dir="ltr">franz-josef-kaiser</strong>  ·  <span class="px-1" dir="ltr">3</span><span>Comments</span> </div> <hr /> <div> <strong> <a href="/gutenberg/244393648/inserter-malfunctions-on-mobile">Inserter malfunctions on mobile</a> </strong> </div> <div class="text-muted text-small mt-2"> <img src="https://avatars0.githubusercontent.com/u/2005352?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="moorscode picture"> <strong class="pr-1" dir="ltr">moorscode</strong>  ·  <span class="px-1" dir="ltr">3</span><span>Comments</span> </div> <hr /> <div> <strong> <a href="/gutenberg/206745649/ui-prototype-consider-how-far-to-take-this">UI Prototype: Consider how far to take this</a> </strong> </div> <div class="text-muted text-small mt-2"> <img src="https://avatars3.githubusercontent.com/u/1204802?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="jasmussen picture"> <strong class="pr-1" dir="ltr">jasmussen</strong>  ·  <span class="px-1" dir="ltr">3</span><span>Comments</span> </div> <hr /> <div> <strong> <a href="/gutenberg/271808294/image-can-be-resized-so-small-that-it-can-t-be-selected">Image can be resized so small that it can't be selected anymore</a> </strong> </div> <div class="text-muted text-small mt-2"> <img src="https://avatars0.githubusercontent.com/u/6073772?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="hedgefield picture"> <strong class="pr-1" dir="ltr">hedgefield</strong>  ·  <span class="px-1" dir="ltr">3</span><span>Comments</span> </div> <hr /> <div> <strong> <a href="/gutenberg/267175436/improve-flow-for-previewing-unsaved-pages-posts">Improve flow for previewing unsaved pages/posts</a> </strong> </div> <div class="text-muted text-small mt-2"> <img src="https://avatars3.githubusercontent.com/u/1204802?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="jasmussen picture"> <strong class="pr-1" dir="ltr">jasmussen</strong>  ·  <span class="px-1" dir="ltr">3</span><span>Comments</span> </div> </div> </div> <div class="sticky-top pt-4"> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-3835332123789605" data-ad-slot="3919948963" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <div id="ph-below-related-2" class="mt-4"> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-3835332123789605" data-ad-slot="3919948963" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> </div> <div class="col-12 col-lg-4"> </div> </div> <div class="skyscraper-container"> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-3835332123789605" data-ad-slot="7879185320" data-ad-format="vertical" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <div class="mt-5 spacer"></div> <footer class="mt-5 pb-2 py-4 text-center mt-auto"> <div class="container"> <a class="navbar-brand logo mr-5" href="/"> <img src="/assets/img/logo.svg" width="40" height="40" alt="bleepingcoder logo"> bleeping<strong>coder</strong> </a> <div class="mt-4"> bleepingcoder.com uses publicly licensed GitHub information to provide developers around the world with solutions to their problems. We are not affiliated with GitHub, Inc. or with any developers who use GitHub for their projects. We do not host any of the videos or images on our servers. All rights belong to their respective owners. </div> <div> Source for this page: <a href="https://www.github.com/WordPress/gutenberg/issues/3702" rel="nofollow noreferrer" target="_blank">Source</a> </div> </div> <hr class="mb-5 mt-5"> <div class="container"> <div class="row"> <div class="col-sm-4 col-lg mb-sm-0 mb-5"> <strong>Popular programming languages</strong> <ul class="list-unstyled mb-0 mt-2"> <li class="mb-2"> <a href="/python" dir="ltr">Python</a> </li> <li class="mb-2"> <a href="/javascript" dir="ltr">JavaScript</a> </li> <li class="mb-2"> <a href="/typescript" dir="ltr">TypeScript</a> </li> <li class="mb-2"> <a href="/cpp" dir="ltr">C++</a> </li> <li class="mb-2"> <a href="/csharp" dir="ltr">C#</a> </li> </ul> </div> <div class="col-sm-4 col-lg mb-sm-0 mb-5"> <strong>Popular GitHub projects</strong> <ul class="list-unstyled mb-0 mt-2"> <li class="mb-2"> <a href="/microsoft/vscode" dir="ltr">vscode</a> </li> <li class="mb-2"> <a href="/numpy/numpy" dir="ltr">numpy</a> </li> <li class="mb-2"> <a href="/ant-design/ant-design" dir="ltr">ant-design</a> </li> <li class="mb-2"> <a href="/mui-org/material-ui" dir="ltr">material-ui</a> </li> <li class="mb-2"> <a href="/vercel/next-js" dir="ltr">next.js</a> </li> </ul> </div> <div class="col-sm-4 col-lg mb-0"> <strong>More GitHub projects</strong> <ul class="list-unstyled mb-0 mt-2"> <li class="mb-2"> <a href="/rust-lang/rust" dir="ltr">rust</a> </li> <li class="mb-2"> <a href="/moment/moment" dir="ltr">moment</a> </li> <li class="mb-2"> <a href="/yarnpkg/yarn" dir="ltr">yarn</a> </li> <li class="mb-2"> <a href="/mozilla/pdf-js" dir="ltr">pdf.js</a> </li> <li class="mb-2"> <a href="/JuliaLang/julia" dir="ltr">julia</a> </li> </ul> </div> </div> </div> <hr class="mb-5 mt-5"> <div class="container text-muted"> © 2026 bleepingcoder.com - <a href="/bleeps" rel="nofollow">Contact</a><br /> By using our site, you acknowledge that you have read and understand our <a href="/cookies" rel="nofollow">Cookie Policy</a> and <a href="/privacy" rel="nofollow">Privacy Policy</a>. </div> </footer> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha256-4+XzXVhsDmqanXGHaHvgh1gMQKX40OUvDEBTu8JcmNs=" crossorigin="anonymous"></script> <script async src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script> <!--<script defer type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-5fb2db66acbd74b2"></script>--> <script type="text/javascript" src="/assets/js/main.js"></script> <script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js"></script></body> </html>