HTML5-History-API
HTML5 History API expansion for browsers not supporting pushState, replaceState
Top Related Projects
Modernizr is a JavaScript library that detects HTML5 and CSS3 features in the user’s browser.
History.js gracefully supports the HTML5 History/State APIs (pushState, replaceState, onPopState) in all browsers. Including continued support for data, titles, replaceState. Supports jQuery, MooTools and Prototype. For HTML5 browsers this means that you can modify the URL directly, without needing to use hashes anymore. For HTML4 browsers it will revert back to using the old onhashchange functionality.
Manage session history with JavaScript
Turbolinks makes navigating your web application faster
HTML Standard
Quick Overview
The HTML5-History-API is a JavaScript library that provides a polyfill for the HTML5 History API. It enables developers to use the History API in browsers that don't natively support it, allowing for the creation of single-page applications with proper URL handling and browser navigation support.
Pros
- Enables HTML5 History API functionality in older browsers
- Simplifies the creation of single-page applications
- Lightweight and easy to integrate
- Well-documented with examples
Cons
- May not be necessary for projects targeting only modern browsers
- Requires additional JavaScript to be loaded and executed
- Potential for conflicts with other history manipulation libraries
- Limited maintenance and updates in recent years
Code Examples
- Pushing a new state:
history.pushState({ page: 2 }, "Page 2", "/page2");
- Replacing the current state:
history.replaceState({ page: 3 }, "Page 3", "/page3");
- Handling popstate events:
window.addEventListener("popstate", function(event) {
console.log("Current state:", event.state);
});
- Navigating through history:
history.back(); // Go back one step
history.forward(); // Go forward one step
history.go(-2); // Go back two steps
Getting Started
- Include the HTML5-History-API script in your HTML file:
<script src="https://cdn.jsdelivr.net/npm/html5-history-api@4.2.10/history.min.js"></script>
- Use the History API methods as you would normally:
// Push a new state
history.pushState({ page: 1 }, "Page 1", "/page1");
// Handle popstate events
window.addEventListener("popstate", function(event) {
if (event.state) {
console.log("Navigated to page:", event.state.page);
// Update your application state here
}
});
- Ensure your server is configured to handle HTML5 pushState URLs by serving your main HTML file for all routes.
Competitor Comparisons
Modernizr is a JavaScript library that detects HTML5 and CSS3 features in the user’s browser.
Pros of Modernizr
- Broader feature detection capabilities, covering a wide range of HTML5 and CSS3 features
- Active community and regular updates
- Extensive documentation and examples
Cons of Modernizr
- Larger file size, which may impact page load times
- More complex setup and configuration
- Potential overhead for projects that only need specific feature detection
Code Comparison
HTML5-History-API:
history.pushState({page: 1}, "title 1", "?page=1");
history.replaceState({page: 2}, "title 2", "?page=2");
Modernizr:
if (Modernizr.history) {
// Use HTML5 History API
} else {
// Fallback for older browsers
}
HTML5-History-API focuses specifically on providing a consistent History API across browsers, while Modernizr offers a comprehensive feature detection solution for various HTML5 and CSS3 features. HTML5-History-API is more lightweight and targeted, making it ideal for projects that only need History API support. Modernizr, on the other hand, provides a broader range of feature detection capabilities, making it suitable for projects that require extensive browser compatibility checks across multiple features.
History.js gracefully supports the HTML5 History/State APIs (pushState, replaceState, onPopState) in all browsers. Including continued support for data, titles, replaceState. Supports jQuery, MooTools and Prototype. For HTML5 browsers this means that you can modify the URL directly, without needing to use hashes anymore. For HTML4 browsers it will revert back to using the old onhashchange functionality.
Pros of history.js
- More comprehensive cross-browser support, including older browsers
- Offers a simpler API for common use cases
- Provides additional features like state management and HTML4 fallback
Cons of history.js
- Larger file size due to broader compatibility and feature set
- Less actively maintained, with fewer recent updates
- May include unnecessary code for modern web applications
Code Comparison
HTML5-History-API:
history.pushState({page: 1}, "Title 1", "?page=1");
history.replaceState({page: 2}, "Title 2", "?page=2");
history.js:
History.pushState({state:1}, "State 1", "?state=1");
History.replaceState({state:2}, "State 2", "?state=2");
Both libraries provide similar functionality for manipulating browser history, but history.js uses a capitalized History
object, while HTML5-History-API uses the native history
object.
HTML5-History-API focuses on providing a polyfill for the HTML5 History API, making it more lightweight and suitable for modern web applications. It closely mimics the native API, making it easier to transition to native support when available.
history.js, on the other hand, offers a more feature-rich solution with broader browser support, including older versions. It provides additional utilities and a slightly different API, which may be beneficial for projects requiring extensive backwards compatibility.
Manage session history with JavaScript
Pros of history
- More actively maintained with frequent updates
- Broader browser support, including older versions
- Extensive documentation and examples
Cons of history
- Larger package size
- Steeper learning curve for beginners
- Less focus on pure HTML5 History API implementation
Code Comparison
HTML5-History-API:
history.pushState({page: 1}, "Title 1", "?page=1");
history.replaceState({page: 2}, "Title 2", "?page=2");
history:
import { createBrowserHistory } from 'history';
const history = createBrowserHistory();
history.push('/home', { some: 'state' });
history.replace('/about', { more: 'state' });
Key Differences
- HTML5-History-API focuses on polyfilling the native History API, while history provides a more abstracted and feature-rich approach.
- history offers additional utilities like location parsing and memory history for non-DOM environments.
- HTML5-History-API aims for a smaller footprint and closer adherence to the native API.
Use Cases
- Choose HTML5-History-API for lightweight projects requiring basic history manipulation and broad compatibility.
- Opt for history in larger applications, especially those using React Router or similar frameworks, for more advanced routing capabilities.
Turbolinks makes navigating your web application faster
Pros of Turbolinks
- Faster page loads by replacing only the
<body>
content - Automatic handling of browser history and URL updates
- Seamless integration with Rails applications
Cons of Turbolinks
- Potential conflicts with JavaScript-heavy applications
- Learning curve for developers unfamiliar with the Turbolinks lifecycle
- May require additional configuration for certain third-party libraries
Code Comparison
HTML5-History-API:
history.pushState({page: 1}, "title 1", "?page=1");
window.addEventListener("popstate", function(e) {
console.log("popstate event", e.state);
});
Turbolinks:
document.addEventListener("turbolinks:load", function() {
console.log("Page loaded with Turbolinks");
});
Turbolinks.visit("/new-page");
Key Differences
- HTML5-History-API focuses on providing a consistent API for manipulating browser history across different browsers
- Turbolinks is a higher-level solution that aims to speed up page loads in web applications
- HTML5-History-API requires more manual implementation of navigation behavior
- Turbolinks automatically handles most navigation scenarios out of the box
Use Cases
- HTML5-History-API is suitable for developers who need fine-grained control over browser history manipulation
- Turbolinks is ideal for Ruby on Rails applications or projects seeking to improve perceived page load times with minimal configuration
HTML Standard
Pros of html
- Comprehensive documentation of the entire HTML specification
- Actively maintained by the WHATWG community
- Includes detailed explanations and examples for all HTML elements and APIs
Cons of html
- Large and complex repository, potentially overwhelming for beginners
- Focuses on the entire HTML spec, not specifically on the History API
- May contain more technical and formal language
Code comparison
HTML5-History-API:
history.pushState({page: 1}, "title 1", "?page=1");
history.replaceState({page: 2}, "title 2", "?page=2");
html:
<a href="?page=1" onclick="history.pushState({page: 1}, 'title 1', '?page=1'); return false;">
Go to page 1
</a>
Summary
HTML5-History-API is a focused library for working with the HTML5 History API, providing cross-browser support and additional features. It's ideal for developers specifically interested in manipulating browser history and state.
html is the official HTML specification repository, offering comprehensive documentation on all aspects of HTML, including the History API. It's best suited for those seeking in-depth understanding of HTML standards and implementations.
Choose HTML5-History-API for a targeted solution to History API manipulation, or html for a complete reference to HTML specifications and standards.
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
ENGLISH
This Javascript library provides an emulation of HTML5 History API for older browsers.
The library operates according to W3C specification, adding no new or incompatible methods. The library can be used exactly as described, for example, in Dive Into HTML5 book (http://diveintohtml5.info/history.html) or in the History API Specification (http://www.w3.org/TR/html5/browsers.html#the-history-interface).
You may install this plugin with this command:
npm install html5-history-api
Browser Support:
history.js
- IE8+ and other browsers
history.ielte7.js
- IE6+ and other browsers
For library developers:
To enable support for HTML5-History-API polyfill in your library, you need to add one line of code:
var location = window.history.location || window.location;
code of library looks like this:
(function(){
// To enable support for HTML5-History-API polyfill in your library
var location = window.history.location || window.location;
// you library code here
// ....
// ....
// ....
})();
AMD Support:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="/require.js"></script>
<script type="text/javascript">
requirejs(['/history'], function() {
if (history.emulate) {
console.log('In your browser is emulated HTML5-History-API');
} else {
console.log('In your browser is natively support HTML5-History-API');
}
});
</script>
</head>
<body>
</body>
</html>
Example of using the library in the pure JS context:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="history.js"></script>
<script type="text/javascript">
(function(eventInfo) {
// we get a normal Location object
/*
* Note, this is the only difference when using this library,
* because the object window.location cannot be overriden,
* so library the returns generated "location" object within
* an object window.history, so get it out of "history.location".
* For browsers supporting "history.pushState" get generated
* object "location" with the usual "window.location".
*/
var location = window.history.location || window.location;
// hang on the event, all references in this document
document[eventInfo[0]](eventInfo[1] + 'click', function(event) {
event = event || window.event;
var target = event.target || event.srcElement;
// looking for all the links with 'ajax' class found
if (target && target.nodeName === 'A' &&
(' ' + target.className + ' ').indexOf(' ajax ') >= 0)
{
// keep the link in the browser history
history.pushState(null, null, target.href);
// here can cause data loading, etc.
// do not give a default action
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
}
}, false);
// hang on popstate event triggered by pressing back/forward in browser
window[eventInfo[0]](eventInfo[1] + 'popstate', function(event) {
// here can cause data loading, etc.
// just post
alert("We returned to the page with a link: " + location.href);
}, false);
})(window.addEventListener ? ['addEventListener', ''] : ['attachEvent', 'on']);
</script>
</head>
<body>
<a class="ajax" href="/mylink.html">My Link</a>
<a class="ajax" href="/otherlink.html">Other Link</a>
</body>
</html>
Example of using the library along with JQuery:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="history.js"></script>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(function() {
// we get a normal Location object
/*
* Note, this is the only difference when using this library,
* because the object window.location cannot be overriden,
* so library the returns generated "location" object within
* an object window.history, so get it out of "history.location".
* For browsers supporting "history.pushState" get generated
* object "location" with the usual "window.location".
*/
var location = window.history.location || window.location;
// looking for all the links and hang on the event, all references in this document
$(document).on('click', 'a.ajax', function() {
// keep the link in the browser history
history.pushState(null, null, this.href);
// here can cause data loading, etc.
// do not give a default action
return false;
});
// hang on popstate event triggered by pressing back/forward in browser
$(window).on('popstate', function(e) {
// here can cause data loading, etc.
// just post
alert("We returned to the page with a link: " + location.href);
});
});
</script>
</head>
<body>
<a class="ajax" href="/mylink.html">My Link</a>
<a class="ajax" href="/otherlink.html">Other Link</a>
</body>
</html>
Advanced library configuration:
history.js?basepath=/pathtosite/ - the base path to the site; defaults to the root "/".
history.js?redirect=true - enable link translation.
history.js?type=/ - substitute the string after the anchor; by default "/".
You can also combine options:
history.js?type=/&redirect=true&basepath=/pathtosite/ - the order of options does not matter.
Or execute special method in JavaScript:
history.redirect(/* type = */ '/', /* basepath = */ '/pathtosite/');
Demo Site: http://history.spb-piksel.ru/ or http://devote.github.io/demos/history/
Follow me on Twitter: https://twitter.com/DimaPakhtinov
РУССÐÐÐ (Russian)
ÐиблиоÑека ÑмÑлиÑÑÐµÑ HTML5 History API в ÑÑаÑÑÑ Ð±ÑаÑзеÑÐ°Ñ .
ÐиблиоÑека, коÑоÑÐ°Ñ Ð½Ðµ добавлÑÐµÑ Ð½ÐµÐ½ÑжнÑе меÑодÑ, заÑÑавлÑÑ Ð¸Ñ Ð¸Ð·ÑÑаÑÑ, а опеÑиÑÑÐµÑ Ð¿Ð¾ ÑпеÑиÑикаÑии w3c, по инÑеÑÑейÑÑ History.
ÐÐ»Ñ Ð¿ÑимеÑа Ð¼Ð¾Ð³Ñ Ð¿ÑивеÑÑи коÑоÑкий код как Ñ Ð½ÐµÐ¹ ÑабоÑаÑÑ.
Ðо пÑинÑÐ¸Ð¿Ñ Ð¼Ñ ÑабоÑаем Ñ HTML5 History API Ñак как опиÑано, напÑимеÑ, ÑÑÑ http://htmlbook.ru/html5/history или по ÑпеÑиÑикаÑии http://www.w3.org/TR/html5/history.html#the-history-interface
ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑÑÑановиÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ:
npm install html5-history-api
ÐоддеÑжка бÑаÑзеÑов:
history.js
- IE8+ и дÑÑгие бÑаÑзеÑÑ
history.ielte7.js
- IE6+ и дÑÑгие бÑаÑзеÑÑ
ÐÐ»Ñ ÑазÑабоÑÑиков библиоÑек:
ÐÐ»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки плагина HTML5-History-API polyfill в ÑÐ²Ð¾Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÐ°Ñ , добавÑÑе ÑÑÑÐ¾ÐºÑ ÐºÐ¾Ð´Ð°:
var location = window.history.location || window.location;
код бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ð¿ÑимеÑно Ñак:
(function(){
// ÐклÑÑÐ°ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° HTML5-History-API polyfill
var location = window.history.location || window.location;
// код ваÑей библиоÑеки
// ....
// ....
// ....
})();
ÐоддеÑжка AMD:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="/require.js"></script>
<script type="text/javascript">
requirejs(['/history'], function() {
if (history.emulate) {
console.log('РваÑем бÑаÑзеÑе ÑмÑлиÑÑеÑÑÑ HTML5-History-API');
} else {
console.log('РваÑем бÑаÑзеÑе еÑÑÑ Ð¿Ð¾Ð´Ð´ÐµÑжка HTML5-History-API');
}
});
</script>
</head>
<body>
</body>
</html>
ÐоÑоÑенÑкий пÑÐ¸Ð¼ÐµÑ Ð½Ð° ÑиÑÑом JS:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="history.js"></script>
<script type="text/javascript">
(function(eventInfo) {
// полÑÑаем ноÑмалÑнÑй обÑÐµÐºÑ Location
/*
* замеÑÑÑе, ÑÑо единÑÑÐ²ÐµÐ½Ð½Ð°Ñ ÑазниÑа пÑи ÑабоÑе Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ библиоÑекой,
* Ñак как обÑÐµÐºÑ window.location нелÑÐ·Ñ Ð¿ÐµÑезагÑÑзиÑÑ, поÑÑомÑ
* библиоÑека history возвÑаÑÐ°ÐµÑ ÑÑоÑмиÑованнÑй "location" обÑÐµÐºÑ Ð²Ð½ÑÑÑи
* обÑекÑа window.history, поÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем его из "history.location".
* ÐÐ»Ñ Ð±ÑаÑзеÑов поддеÑживаÑÑиÑ
"history.pushState" полÑÑаем
* ÑÑоÑмиÑованнÑй обÑÐµÐºÑ "location" Ñ Ð¾Ð±ÑÑного "window.location".
*/
var location = window.history.location || window.location;
// веÑаем ÑобÑÑÐ¸Ñ Ð½Ð° вÑе ÑÑÑлки в наÑем докÑменÑе
document[eventInfo[0]](eventInfo[1] + 'click', function(event) {
event = event || window.event;
var target = event.target || event.srcElement;
// иÑем вÑе ÑÑÑлки Ñ ÐºÐ»Ð°ÑÑом 'ajax'
if (target && target.nodeName === 'A' &&
(' ' + target.className + ' ').indexOf('ajax') >= 0)
{
// заноÑим ÑÑÑÐ»ÐºÑ Ð² иÑÑоÑиÑ
history.pushState(null, null, target.href);
// ÑÑÑ Ð¼Ð¾Ð¶ÐµÑе вÑзваÑÑ Ð¿Ð¾Ð´Ð³ÑÑÐ·ÐºÑ Ð´Ð°Ð½Ð½ÑÑ
и Ñ.п.
// не даем вÑполниÑÑ Ð´ÐµÐ¹ÑÑвие по ÑмолÑаниÑ
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
}
}, false);
// веÑаем ÑобÑÑие на popstate коÑоÑое ÑÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ñи нажаÑии back/forward в бÑаÑзеÑе
window[eventInfo[0]](eventInfo[1] + 'popstate', function(event) {
// ÑÑÑ Ð¼Ð¾Ð¶ÐµÑе вÑзваÑÑ Ð¿Ð¾Ð´Ð³ÑÑÐ·ÐºÑ Ð´Ð°Ð½Ð½ÑÑ
и Ñ.п.
// пÑоÑÑо ÑообÑение
alert("We returned to the page with a link: " + location.href);
}, false);
})(window.addEventListener ? ['addEventListener', ''] : ['attachEvent', 'on']);
</script>
</head>
<body>
<a class="ajax" href="/mylink.html">My Link</a>
<a class="ajax" href="/otherlink.html">Other Link</a>
</body>
</html>
Ð ÑепеÑÑ Ð¿Ð¾ÐºÐ°Ð·ÑÐ²Ð°Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð² ÑвÑзке Ñ jQuery:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="history.js"></script>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(function() {
// полÑÑаем ноÑмалÑнÑй обÑÐµÐºÑ Location
/*
* замеÑÑÑе, ÑÑо единÑÑÐ²ÐµÐ½Ð½Ð°Ñ ÑазниÑа пÑи ÑабоÑе Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ библиоÑекой,
* Ñак как обÑÐµÐºÑ window.location нелÑÐ·Ñ Ð¿ÐµÑезагÑÑзиÑÑ, поÑÑомÑ
* библиоÑека history возвÑаÑÐ°ÐµÑ ÑÑоÑмиÑованнÑй "location" обÑÐµÐºÑ Ð²Ð½ÑÑÑи
* обÑекÑа window.history, поÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем его из "history.location".
* ÐÐ»Ñ Ð±ÑаÑзеÑов поддеÑживаÑÑиÑ
"history.pushState" полÑÑаем
* ÑÑоÑмиÑованнÑй обÑÐµÐºÑ "location" Ñ Ð¾Ð±ÑÑного "window.location".
*/
var location = window.history.location || window.location;
// иÑем вÑе ÑÑÑлки и веÑаем ÑобÑÑÐ¸Ñ Ð½Ð° вÑе ÑÑÑлки в наÑем докÑменÑе
$(document).on('click', 'a.ajax', function() {
// заноÑим ÑÑÑÐ»ÐºÑ Ð² иÑÑоÑиÑ
history.pushState(null, null, this.href);
// ÑÑÑ Ð¼Ð¾Ð¶ÐµÑе вÑзваÑÑ Ð¿Ð¾Ð´Ð³ÑÑÐ·ÐºÑ Ð´Ð°Ð½Ð½ÑÑ
и Ñ.п.
// не даем вÑполниÑÑ Ð´ÐµÐ¹ÑÑвие по ÑмолÑаниÑ
return false;
});
// веÑаем ÑобÑÑие на popstate коÑоÑое ÑÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ñи нажаÑии back/forward в бÑаÑзеÑе
$(window).on('popstate', function(e) {
// ÑÑÑ Ð¼Ð¾Ð¶ÐµÑе вÑзваÑÑ Ð¿Ð¾Ð´Ð³ÑÑÐ·ÐºÑ Ð´Ð°Ð½Ð½ÑÑ
и Ñ.п.
// пÑоÑÑо ÑообÑение
alert("ÐÑ Ð²ÐµÑнÑлиÑÑ Ð½Ð° ÑÑÑаниÑÑ Ñо ÑÑÑлкой: " + location.href);
});
});
</script>
</head>
<body>
<a class="ajax" href="/mylink.html">My Link</a>
<a class="ajax" href="/otherlink.html">Other Link</a>
</body>
</html>
ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе паÑамеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии библиоÑеки:
history.js?basepath=/pathtosite/ - базовÑй пÑÑÑ Ðº ÑайÑÑ, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение коÑÐ½Ñ "/".
history.js?redirect=true - вклÑÑиÑÑ Ð¿ÑеобÑазование ÑÑÑлок.
history.js?type=/ - подÑÑавлÑÑÑ Ð¿Ð¾Ð´ÑÑÑÐ¾ÐºÑ Ð¿Ð¾Ñле ÑкоÑÑ, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ Ñимвол "/".
Также Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе комбиниÑоваÑÑ Ð¾Ð¿Ñии:
history.js?type=/&redirect=true&basepath=/pathtosite/ - поÑÑдок опÑий не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение.
Ðли вÑполниÑÑ ÑпеÑиалÑнÑй меÑод в JavaScript:
history.redirect(/* type = */ '/', /* basepath = */ '/pathtosite/');
Ðемо-ÑайÑ: http://history.spb-piksel.ru/ или http://devote.github.io/demos/history/
Я в Twitter: https://twitter.com/DimaPakhtinov
Top Related Projects
Modernizr is a JavaScript library that detects HTML5 and CSS3 features in the user’s browser.
History.js gracefully supports the HTML5 History/State APIs (pushState, replaceState, onPopState) in all browsers. Including continued support for data, titles, replaceState. Supports jQuery, MooTools and Prototype. For HTML5 browsers this means that you can modify the URL directly, without needing to use hashes anymore. For HTML4 browsers it will revert back to using the old onhashchange functionality.
Manage session history with JavaScript
Turbolinks makes navigating your web application faster
HTML Standard
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot