This script provides a declarative way to control loading indicators and CSS classes for Unpoly-enabled forms and links using custom attributes prefixed with app-loading-.
You can show/hide elements, add/remove classes, and control delays for loading states.
app-loading-show: Show elements when loading starts (custom display mode)app-loading-hide: Hide elements when loading startsapp-loading-add: Add a class to elements when loading starts, remove when loading endsapp-loading-remove: Remove a class from elements when loading starts, add back when loading endsapp-loading-delay: Control delay (in ms) before applying start/end loading effects
All attributes can be used independently or in combination.
<!-- Loader element -->
<div id="loader" class="loader">Loading...</div>
<!-- Button that will be hidden -->
<button id="button" class="ready">Submit</button>
<!-- Form that triggers loading state -->
<form up-submit
app-loading-show="#loader, flex"
app-loading-hide="#button"
app-loading-add="#loader, spinning"
app-loading-remove="#button, ready">
<!-- ... -->
</form>- When form is submitted,
#loaderis shown (display: flex),#buttonis hidden,spinningclass is added to#loader, andreadyclass is removed from#button. - When loading ends, all changes are reverted.
<div class="spinner"></div>
<form up-submit app-loading-show=".spinner, block">
<!-- ... -->
</form><div id="loader"></div>
<div class="overlay"></div>
<form up-submit app-loading-show="#loader .overlay, flex">
<!-- ... -->
</form><!-- 1s delay before resetting (end), 5s delay before starting -->
<form up-submit app-loading-show="#loader, flex" app-loading-delay="1000, 5000">
<!-- ... -->
</form>
<!-- Only delay at end (after loading finishes) -->
<form up-submit app-loading-add="#loader, loading" app-loading-delay="1500">
<!-- ... -->
</form>
<!-- No end delay, 2s start delay -->
<form up-submit app-loading-hide="#loader" app-loading-delay="0, 2000">
<!-- ... -->
</form>Each attribute value is a comma-separated pair:
- First part: CSS selector(s) (IDs, classes, complex selectors, etc.)
- Second part:
- For
show/hide: display value (e.g.,block,flex,none) - For
add/remove: class name
- For
| Attribute | Example Value | Meaning |
|---|---|---|
| app-loading-show | #loader, flex |
Show #loader as display: flex when loading |
| app-loading-hide | .btn, none |
Hide .btn (display: none) when loading |
| app-loading-add | #form, busy |
Add class busy to #form when loading |
| app-loading-remove | .ready, ready |
Remove class ready from .ready when loading |
| app-loading-delay | 1000, 5000 |
1s end delay, 5s start delay |
| app-loading-delay | 1500 |
1.5s end delay, no start delay |
- On start event (form submit or link follow):
- Applies show/hide/class additions/removals (after optional start delay)
- On end event (fragment loaded, offline, aborted):
- Resets show/hide/class changes (after optional end delay)
All changes are reverted after the loading finishes.
MIT