@stimulus-plumbers/controllers 0.2.7 → 0.2.9

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.
package/README.md CHANGED
@@ -1,86 +1,108 @@
1
1
  # @stimulus-plumbers/controllers
2
2
 
3
+ [![Version][npm_badge]][npm]
4
+ [![CI][ci_badge]][ci]
5
+ [![Coverage][coverage_badge]][coverage]
6
+
3
7
  Accessible Stimulus controllers following WCAG 2.1+ standards.
4
8
 
9
+ ## Requirements
10
+
11
+ - Node.js >= 18
12
+ - `@hotwired/stimulus` ^2.0 or ^3.0 (peer dependency)
13
+
5
14
  ## Installation
6
15
 
7
16
  ```bash
8
17
  npm install @stimulus-plumbers/controllers
9
18
  ```
10
19
 
11
- Requires `@hotwired/stimulus` ^2.0.0 or ^3.0.0 as a peer dependency.
20
+ ## Setup
12
21
 
13
- ## Usage
22
+ Register the controllers you need with your Stimulus application:
14
23
 
15
24
  ```javascript
16
- import { Application } from '@hotwired/stimulus';
17
- import { ModalController, DatepickerController, CalendarMonthController } from '@stimulus-plumbers/controllers';
18
-
19
- const application = Application.start();
20
- application.register('modal', ModalController);
21
- application.register('datepicker', DatepickerController);
22
- application.register('calendar-month', CalendarMonthController);
25
+ import { Application } from '@hotwired/stimulus'
26
+ import {
27
+ InputComboboxController,
28
+ InputFormatController,
29
+ ComboboxDateController,
30
+ ComboboxTimeController,
31
+ ComboboxDropdownController,
32
+ CalendarMonthController,
33
+ CalendarMonthObserverController,
34
+ ModalController,
35
+ PopoverController,
36
+ DismisserController,
37
+ FlipperController,
38
+ ClipboardController,
39
+ } from '@stimulus-plumbers/controllers'
40
+
41
+ const application = Application.start()
42
+
43
+ application.register('input-combobox', InputComboboxController)
44
+ application.register('input-format', InputFormatController)
45
+ application.register('combobox-date', ComboboxDateController)
46
+ application.register('combobox-time', ComboboxTimeController)
47
+ application.register('combobox-dropdown', ComboboxDropdownController)
48
+ application.register('calendar-month', CalendarMonthController)
49
+ application.register('calendar-month-observer', CalendarMonthObserverController)
50
+ application.register('modal', ModalController)
51
+ application.register('popover', PopoverController)
52
+ application.register('dismisser', DismisserController)
53
+ application.register('flipper', FlipperController)
54
+ application.register('clipboard', ClipboardController)
23
55
  ```
24
56
 
25
- ### ModalController
57
+ ## Controllers
26
58
 
27
- Native `<dialog>` element:
59
+ | Controller | Description | Docs |
60
+ |-----------|-------------|------|
61
+ | `input-combobox` | Wrapper: trigger, popover, hidden value | [docs/component/combobox.md](docs/component/combobox.md#input-combobox) |
62
+ | `input-format` | Formats and displays values | [docs/component/combobox.md](docs/component/combobox.md#input-format) |
63
+ | `combobox-date` | Calendar grid date picker | [docs/component/combobox.md](docs/component/combobox.md#combobox-date) |
64
+ | `combobox-time` | Drum/scroll-wheel time picker | [docs/component/combobox.md](docs/component/combobox.md#combobox-time) |
65
+ | `combobox-dropdown` | Listbox with fuzzy filter or server fetch | [docs/component/combobox.md](docs/component/combobox.md#combobox-dropdown) |
66
+ | `calendar-month` | Calendar grid renderer | [docs/component/calendar.md](docs/component/calendar.md) |
67
+ | `calendar-month-observer` | Click-to-select handler for calendar grids | [docs/component/calendar.md](docs/component/calendar.md#calendar-month-observer) |
68
+ | `modal` | Native `<dialog>` or custom overlay | [docs/component/modal.md](docs/component/modal.md) |
69
+ | `popover` | Show/hide content with optional remote load | [docs/component/popover.md](docs/component/popover.md) |
70
+ | `dismisser` | Click-outside dismissal | [docs/component/dismisser.md](docs/component/dismisser.md) |
71
+ | `flipper` | Floating element positioning | [docs/component/flipper.md](docs/component/flipper.md) |
72
+ | `clipboard` | Copy-to-clipboard and paste interception | [docs/component/clipboard.md](docs/component/clipboard.md) |
28
73
 
29
- ```html
30
- <div data-controller="modal">
31
- <button data-action="modal#open">Open</button>
32
- <dialog data-modal-target="modal" aria-labelledby="modal-title">
33
- <h2 id="modal-title">Title</h2>
34
- <button data-action="modal#close">Close</button>
35
- </dialog>
36
- </div>
37
- ```
74
+ ## Method naming convention
38
75
 
39
- Custom implementation with overlay:
40
-
41
- ```html
42
- <div data-controller="modal">
43
- <button data-action="modal#open">Open</button>
44
- <div data-modal-target="overlay" hidden>
45
- <div data-modal-target="modal" role="dialog" aria-modal="true" aria-labelledby="modal-title">
46
- <h2 id="modal-title">Title</h2>
47
- <button data-action="modal#close">Close</button>
48
- </div>
49
- </div>
50
- </div>
51
- ```
76
+ Controllers follow a consistent naming pattern:
52
77
 
53
- ### DatepickerController
78
+ | Pattern | Parameter | Role | Example |
79
+ |---------|-----------|------|---------|
80
+ | `x(value)` | raw value | Programmatic API — pure logic, callable directly | `select('us')`, `format('4242…')`, `step(1)`, `filter('query')` |
81
+ | `onX(event)` | DOM event | Event adapter — extracts payload, calls programmatic API | `onSelect(event)`, `onChange(event)`, `onPaste(event)`, `onInput(event)`, `onNavigate(event)` |
82
+ | `past()` | — | Plumber callback — called by plumber after async operation completes | `shown()`, `dismissed()`, `flipped()`, `contentLoaded()` |
54
83
 
55
- Date picker backed by a calendar grid. Combines `datepicker` + `popover` controllers; uses `CalendarMonthController` as an outlet.
84
+ Wire event adapters via `data-action`; call programmatic APIs directly from other controllers or outlets.
56
85
 
57
- ```html
58
- <div data-controller="datepicker popover"
59
- data-datepicker-calendar-month-outlet="[data-controller~='calendar-month']">
60
- <input type="text" data-datepicker-target="display" data-action="focus->popover#show" />
61
- <input type="hidden" data-datepicker-target="input" />
86
+ ## Development
62
87
 
63
- <div data-popover-target="content" hidden>
64
- <button data-datepicker-target="previous">Prev</button>
65
- <button data-datepicker-target="month"></button>
66
- <button data-datepicker-target="year"></button>
67
- <button data-datepicker-target="next">Next</button>
68
-
69
- <div data-controller="calendar-month">
70
- <div data-calendar-month-target="daysOfWeek"></div>
71
- <div data-calendar-month-target="daysOfMonth"></div>
72
- </div>
73
- </div>
74
- </div>
88
+ ```bash
89
+ npm install
90
+
91
+ npm test # run all tests (Vitest)
92
+ npm run test:ui # Vitest UI
93
+ npm run test:coverage # coverage report
94
+ npm run lint # ESLint
95
+ npm run format:write # Prettier (write)
96
+ npm run build # build dist/
75
97
  ```
76
98
 
77
- ## Other Controllers
78
-
79
- - `PopoverController` — show/hide content with optional remote loading
80
- - `DismisserController` — click-outside dismissal
81
- - `FlipperController` — element positioning
82
- - `PannerController` — scroll management
83
-
84
99
  ## License
85
100
 
86
101
  MIT © Ryan Chang
102
+
103
+ [npm_badge]: https://img.shields.io/npm/v/@stimulus-plumbers/controllers.svg
104
+ [npm]: https://www.npmjs.com/package/@stimulus-plumbers/controllers
105
+ [ci_badge]: https://github.com/ryancyq/stimulus-plumbers/actions/workflows/ci-stimulus.yml/badge.svg
106
+ [ci]: https://github.com/ryancyq/stimulus-plumbers/actions/workflows/ci-stimulus.yml
107
+ [coverage_badge]: https://codecov.io/gh/ryancyq/stimulus-plumbers/graph/badge.svg?token=Z77H6M5GER&flag=javascript
108
+ [coverage]: https://codecov.io/gh/ryancyq/stimulus-plumbers