https://github.com/stimulus-use/stimulus-use
A collection of composable behaviors for your Stimulus Controllers
https://github.com/stimulus-use/stimulus-use
hotwire stimulus stimulus-controller stimulus-use stimulusjs turbo typescript
Last synced: 9 months ago
JSON representation
A collection of composable behaviors for your Stimulus Controllers
- Host: GitHub
- URL: https://github.com/stimulus-use/stimulus-use
- Owner: stimulus-use
- License: mit
- Created: 2020-05-18T06:34:53.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2025-03-14T21:24:27.000Z (11 months ago)
- Last Synced: 2025-05-12T13:17:26.307Z (9 months ago)
- Topics: hotwire, stimulus, stimulus-controller, stimulus-use, stimulusjs, turbo, typescript
- Language: JavaScript
- Homepage: https://stimulus-use.github.io/stimulus-use
- Size: 4.5 MB
- Stars: 1,616
- Watchers: 14
- Forks: 70
- Open Issues: 37
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-hotwire - stimulus-use - A collection of composable behaviors for your Stimulus controllers. (**Awesome Hotwire** [](https://github.com/sindresorhus/awesome) / Stimulus)
README
**A collection of composable behaviors for your Stimulus Controllers**
[](https://npmjs.com/package/stimulus-use)
[](https://bundlephobia.com/result?p=stimulus-use)



- **New lifecycle behaviors**: adds new standard behaviors to your Stimulus controllers.
- **Composable**: compose at will different behaviors in a single controller with mixins.
- **Modular**: built as ES6 modules, just import what you need and tree shaking will remove the rest.
- **Typescript**: Types available, better autocompletion.
- **Small**: ~7k gzip + tree shaking π³π³π³
## Getting Started
### Stimulus 3
If you want to use `stimulus-use` with Stimulus 3 you can use the version `0.50.0+`. This and all future versions are designed to work with the `@hotwired/stimulus` npm package.
**Note:** If other packages still depend on the `stimulus` npm package you can safely keep that in your `package.json`, this won't break the `stimulus-use` compability.
#### Using npm
```bash
npm i stimulus-use @hotwired/stimulus
```
#### Using yarn
```bash
yarn add stimulus-use @hotwired/stimulus
```
### Stimulus 2 and below
If you want to use `stimulus-use` with Stimulus 2 (or below) you can use version `0.41.0`. This version is designed to work with the `stimulus` npm package.
#### Using npm
```bash
npm i stimulus-use@0.41.0 stimulus@2.0.0
```
#### Using yarn
```bash
yarn add stimulus-use@0.41.0 stimulus@2.0.0
```
## Documentation
We got you covered π [stimulus-use.github.io/stimulus-use](https://stimulus-use.github.io/stimulus-use/#/)
## Mixins
### Observers
This set of mixins is built around the [`Observer APIs`](https://developer.mozilla.org/en-US/docs/Web/API) and custom events to enhance your controllers with new behaviors.
| Mixin | Description | NEW Callbacks |
|-----------------------|-------------|---------------------|
|[`useClickOutside`](./docs/use-click-outside.md)|Tracks the clicks outside of the element and adds a new lifecycle callback **clickOutside**.|`clickOutside`|
|[`useHotkeys`](./docs/use-hotkeys.md)|Registers hotkeys using the [hotkeys-js](https://wangchujiang.com/hotkeys-js/) library and binds them to handler methods||
|[`useHover`](./docs/use-hover.md)|Tracks the user's mouse movements over an element and adds **mouseEnter** and **mouseLeave** callbacks to your controller.|`mouseEnter` `mouseLeave`|
|[`useIdle`](./docs/use-idle.md)| Tracks if the user is idle on your page and adds **away** and **back** callbacks to your controller.|`away` `back`|
|[`useIntersection`](./docs/use-intersection.md) | Tracks the element's intersection and adds **appear**, **disappear** callbacks to your controller.|`appear` `disappear`|
|[`useMatchMedia`](./docs/use-match-media.md) | Tracks if the window matches a media query string.| `is[Name]`, `not[Name]` and `[name]Changed`|
|[`useMutation`](./docs/use-mutation.md) | Tracks mutations on an element, its attributes and/or subtree. Adds a **mutate** callback to your controller.|`mutate`|
|[`useResize`](./docs/use-resize.md)|Tracks the element's size and adds a new lifecycle callback **resize**.|`resize`|
|[`useTargetMutation`](./docs/use-target-mutation.md) | Tracks when targets are added or removed from the controller's scope, or their contents changed. Adds **[target]TargetAdded** , **[target]TargetRemoved** and **[target]TargetChanged** callback to your controller for each specified target.| `[target]TargetAdded` `[target]TargetRemoved` `[target]TargetChanged`|
|[`useVisibility`](./docs/use-visibility.md) | Tracks the page visibility and adds **visible**, **invisible** callbacks to your controller.|`visible` `invisible`|
|[`useWindowFocus`](./docs/use-window-focus.md) | Tracks the window focus and adds **focus**, **unfocus** callbacks to your controller.|`focus` `unfocus`|
|[`useWindowResize`](./docs/use-window-resize.md)| Tracks the size of the `window` object and adds a new lifecycle callback **windowResize**.|`windowResize`|
### Optimization
A set of mixin to optimize performances.
| Mixin| Description |
|------|-------------|
|[`useDebounce`](./docs/use-debounce.md)|Adds the ability to specify an array "debounces" of functions to debounce.|
|[`useMemo`](./docs/use-memo.md)|Memoize expensive getters by mixing in `useMemo` and adding a static `memos` array.|
|[`useThrottle`](./docs/use-throttle.md)|Adds the ability to specify an array "throttles" of functions to throttle.|
### Animation
A set of mixin and controllers to build animations.
| Mixin| Description |
|------|-------------|
|[`useTransition`](./docs/use-transition.md)|Mixin or controller to apply classes to various stages of an element's transition.|
### Application
| Mixin | Description |
|------|-------------|
|[`useApplication, ApplicationController`](./docs/application-controller.md)| supercharged controller for your application.|
|[`useDispatch`](./docs/use-dispatch.md)|Adds a dispatch helper function to emit custom events. Useful to communicate between different controllers.|
|[`useMeta`](./docs/use-meta.md)|Adds getters to easily access meta values.|
## Extend or compose
Stimulus-use can be used in two ways: **composing* with mixins* or **extending built-in controllers**
**Composing with mixins**
This is the prefered approach as it bring the most flexibility. Simply import a mixin and apply it in the `connect` or `initialize` to adds new behaviors to you controller. You can combine several mixins within the same controller.
```js
import { Controller } from '@hotwired/stimulus'
import { useIntersection, useResize } from 'stimulus-use'
export default class extends Controller {
connect() {
useIntersection(this)
useResize(this)
}
appear(entry) {
// triggered when the element appears within the viewport
}
resize({ height, width }) {
// trigered when the element is resized
}
}
```
**Extending built-in controllers**
You can create your Stimulus controller from a pre-built Stimulus-use controller which offers the new behavior you're looking for.
This method works perfectly when you only need a single behavior for your controller.
```js
import { IntersectionController } from 'stimulus-use'
export default class extends IntersectionController {
appear(entry) {
// triggered when the element appears within the viewport
}
}
```
## Development
- Fork the project locally
- `yarn install`
- `yarn start` - to run the local dev server with examples
- `yarn test` - to run the unit tests
- `yarn lint` - to run the linter with ESLint
- `yarn format` - to format changes with Prettier
- `yarn build` - to bundle the app into static files for production
## Contributors β¨
Made with :heart: by [@adrienpoly](https://twitter.com/adrienpoly), [@marcoroth](https://twitter.com/marcoroth_) and all these wonderful contributors ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)):

Marco Roth
π π» π π

Philipp Daun
π

M. E. Patterson
π

Jonathan Sundqvist
π

Rui Freitas
π

Nicolas Filzi
π

Benjamin Darcet
π

juancarlosasensio
π

lidqqq
π π

Julian Rubisch
π» π

Takuya Fukuju
π

Justin Coyne
π

Asger Behncke Jacobsen
π

Dan Callaghan
π

Konnor Rogers
π π»

Francisco Presencia
π

Takayuki Shimada
π

Dylan Clarke
π» π

Martin Tomov
π

Ryan Weaver
π π

Adrien S
π

Felix Albroscheit
π

Guillaume Briday
π»

craisp
π π»

Gabriel
π π»

Donnie Flood
π»

Γscar Carretero
π π

Ikko Ashimine
π

Michael Coyne
π

Ollie Harridge
π

Leon Vogt
π π»

Thomas KΓΆnig
π

Scott
π

Daniel Rikowski
π

Marc KΓΆhlbrugge
π€

Leon Vogt
π

Ted H. Tran
π

Romain Monteil
π»

Adam Jahnke
π»

Kerrick Long
π»
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
## Acknowledgments
Continuous integration and cross browser testing is generously provided Sauce Labs.
[](https://saucelabs.com)