stimeo-ui 0.5.0 → 0.6.0
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/CHANGELOG.md +116 -0
- package/dist/controllers/aspect_ratio_controller.d.ts +1 -3
- package/dist/controllers/aspect_ratio_controller.js +19 -11
- package/dist/controllers/aspect_ratio_controller.js.map +1 -1
- package/dist/controllers/avatar_controller.d.ts +36 -15
- package/dist/controllers/avatar_controller.js +195 -40
- package/dist/controllers/avatar_controller.js.map +1 -1
- package/dist/controllers/carousel_controller.d.ts +12 -3
- package/dist/controllers/carousel_controller.js +85 -9
- package/dist/controllers/carousel_controller.js.map +1 -1
- package/dist/controllers/checkbox_controller.d.ts +31 -5
- package/dist/controllers/checkbox_controller.js +136 -25
- package/dist/controllers/checkbox_controller.js.map +1 -1
- package/dist/controllers/color_picker_controller.d.ts +7 -1
- package/dist/controllers/color_picker_controller.js +35 -9
- package/dist/controllers/color_picker_controller.js.map +1 -1
- package/dist/controllers/date_range_picker_controller.d.ts +23 -4
- package/dist/controllers/date_range_picker_controller.js +157 -30
- package/dist/controllers/date_range_picker_controller.js.map +1 -1
- package/dist/controllers/file_dropzone_controller.d.ts +7 -1
- package/dist/controllers/file_dropzone_controller.js +26 -3
- package/dist/controllers/file_dropzone_controller.js.map +1 -1
- package/dist/controllers/focus_controller.d.ts +2 -3
- package/dist/controllers/focus_controller.js.map +1 -1
- package/dist/controllers/hover_card_controller.d.ts +2 -2
- package/dist/controllers/hover_card_controller.js.map +1 -1
- package/dist/controllers/idle_controller.d.ts +3 -3
- package/dist/controllers/idle_controller.js +27 -5
- package/dist/controllers/idle_controller.js.map +1 -1
- package/dist/controllers/menubar_controller.js +5 -3
- package/dist/controllers/menubar_controller.js.map +1 -1
- package/dist/controllers/multi_select_controller.d.ts +46 -12
- package/dist/controllers/multi_select_controller.js +460 -151
- package/dist/controllers/multi_select_controller.js.map +1 -1
- package/dist/controllers/number_input_controller.d.ts +24 -6
- package/dist/controllers/number_input_controller.js +275 -51
- package/dist/controllers/number_input_controller.js.map +1 -1
- package/dist/controllers/overflow_menu_controller.js +4 -0
- package/dist/controllers/overflow_menu_controller.js.map +1 -1
- package/dist/controllers/pagination_controller.js +33 -0
- package/dist/controllers/pagination_controller.js.map +1 -1
- package/dist/controllers/password_strength_controller.d.ts +3 -3
- package/dist/controllers/password_strength_controller.js +20 -2
- package/dist/controllers/password_strength_controller.js.map +1 -1
- package/dist/controllers/persist_controller.d.ts +4 -4
- package/dist/controllers/persist_controller.js +24 -5
- package/dist/controllers/persist_controller.js.map +1 -1
- package/dist/controllers/popover_controller.d.ts +2 -2
- package/dist/controllers/popover_controller.js.map +1 -1
- package/dist/controllers/portal_controller.d.ts +1 -2
- package/dist/controllers/portal_controller.js.map +1 -1
- package/dist/controllers/radio_group_controller.d.ts +41 -15
- package/dist/controllers/radio_group_controller.js +540 -56
- package/dist/controllers/radio_group_controller.js.map +1 -1
- package/dist/controllers/rating_controller.d.ts +36 -31
- package/dist/controllers/rating_controller.js +272 -89
- package/dist/controllers/rating_controller.js.map +1 -1
- package/dist/controllers/resizable_controller.js +33 -0
- package/dist/controllers/resizable_controller.js.map +1 -1
- package/dist/controllers/roving_controller.d.ts +4 -0
- package/dist/controllers/roving_controller.js +60 -5
- package/dist/controllers/roving_controller.js.map +1 -1
- package/dist/controllers/scroll_area_controller.d.ts +6 -0
- package/dist/controllers/scroll_area_controller.js +154 -22
- package/dist/controllers/scroll_area_controller.js.map +1 -1
- package/dist/controllers/scroll_visibility_controller.js +33 -0
- package/dist/controllers/scroll_visibility_controller.js.map +1 -1
- package/dist/controllers/tags_input_controller.d.ts +41 -11
- package/dist/controllers/tags_input_controller.js +356 -120
- package/dist/controllers/tags_input_controller.js.map +1 -1
- package/dist/controllers/time_picker_controller.d.ts +42 -13
- package/dist/controllers/time_picker_controller.js +296 -107
- package/dist/controllers/time_picker_controller.js.map +1 -1
- package/dist/controllers/toggle_group_controller.d.ts +39 -13
- package/dist/controllers/toggle_group_controller.js +378 -55
- package/dist/controllers/toggle_group_controller.js.map +1 -1
- package/dist/controllers/toolbar_controller.js +5 -3
- package/dist/controllers/toolbar_controller.js.map +1 -1
- package/dist/controllers/tooltip_controller.d.ts +2 -2
- package/dist/controllers/tooltip_controller.js.map +1 -1
- package/dist/controllers/transition_controller.d.ts +2 -3
- package/dist/controllers/transition_controller.js.map +1 -1
- package/dist/controllers/tree_view_controller.js +5 -3
- package/dist/controllers/tree_view_controller.js.map +1 -1
- package/dist/index.js +2637 -781
- package/dist/index.js.map +1 -1
- package/dist/inspector/cli.d.ts +16 -3
- package/dist/inspector/cli.js +22 -6
- package/dist/inspector/cli.js.map +1 -1
- package/dist/inspector/cli_bin.js +22 -6
- package/dist/inspector/cli_bin.js.map +1 -1
- package/dist/inspector/examples.json +8 -8
- package/dist/inspector/manifest.json +169 -37
- package/dist/positioning/index.d.ts +2 -2
- package/dist/positioning/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
"stimeo--aspect-ratio": {
|
|
21
21
|
"file": "examples/aspect_ratio/_demo.html.erb",
|
|
22
|
-
"source": "<%# Markup for the aspect-ratio demo.\n The library only supplies the ratio Value as the --stimeo--aspect-ratio custom\n property; demo.css does the actual ratio rendering\n (aspect-ratio: var(--stimeo--aspect-ratio)). %>\n<div class=\"aspect-ratio-demo\">\n <figure class=\"aspect-ratio-demo__item\">\n <div class=\"ratio-box\" data-controller=\"stimeo--aspect-ratio\"\n data-stimeo--aspect-ratio-ratio-value=\"16/9\">\n <div class=\"ratio-box__content\"
|
|
22
|
+
"source": "<%# Markup for the aspect-ratio demo.\n The library only supplies the ratio Value as the --stimeo--aspect-ratio custom\n property; demo.css does the actual ratio rendering\n (aspect-ratio: var(--stimeo--aspect-ratio)). %>\n<div class=\"aspect-ratio-demo\">\n <figure class=\"aspect-ratio-demo__item\">\n <div class=\"ratio-box\" data-controller=\"stimeo--aspect-ratio\"\n data-stimeo--aspect-ratio-ratio-value=\"16/9\">\n <div class=\"ratio-box__content\">16 / 9</div>\n </div>\n <figcaption><%= t(\"components.aspect_ratio.demo.wide\") %></figcaption>\n </figure>\n\n <figure class=\"aspect-ratio-demo__item\">\n <div class=\"ratio-box\" data-controller=\"stimeo--aspect-ratio\"\n data-stimeo--aspect-ratio-ratio-value=\"1/1\">\n <div class=\"ratio-box__content\">1 / 1</div>\n </div>\n <figcaption><%= t(\"components.aspect_ratio.demo.square\") %></figcaption>\n </figure>\n\n <figure class=\"aspect-ratio-demo__item\">\n <div class=\"ratio-box\" data-controller=\"stimeo--aspect-ratio\"\n data-stimeo--aspect-ratio-ratio-value=\"3/4\">\n <div class=\"ratio-box__content\">3 / 4</div>\n </div>\n <figcaption><%= t(\"components.aspect_ratio.demo.portrait\") %></figcaption>\n </figure>\n</div>\n"
|
|
23
23
|
},
|
|
24
24
|
"stimeo--auto-submit": {
|
|
25
25
|
"file": "examples/auto_submit/_demo.html.erb",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
},
|
|
28
28
|
"stimeo--avatar": {
|
|
29
29
|
"file": "examples/avatar/_demo.html.erb",
|
|
30
|
-
"source": "<%# Markup for the avatar demo.\n The accessible name is owned solely by the container (role=\"img\" + aria-label);\n the inner <img> and fallback use aria-hidden=\"true\" to avoid double announcement.\n The library only
|
|
30
|
+
"source": "<%# Markup for the avatar demo.\n The accessible name is owned solely by the container (role=\"img\" + aria-label);\n the inner <img> and fallback use aria-hidden=\"true\" to avoid double announcement.\n The library only tracks the source and its load state, exposing empty / loading /\n loaded / error on data-state; shape, color, and size are drawn by demo.css. %>\n<div class=\"avatar-demo\">\n <%# 1. An avatar that loads successfully. The src is a self-contained data-URI SVG that\n draws a person silhouette (a picture, not letters) so the \"loaded image\" state reads\n clearly different from the initials fallback below. %>\n <figure class=\"avatar-demo__item\">\n <span\n class=\"avatar\"\n data-controller=\"stimeo--avatar\"\n role=\"img\"\n aria-label=\"<%= t(\"components.avatar.demo.name_ok\") %>\"\n data-stimeo--avatar-src-value=\"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='96'%20height='96'%3E%3Cdefs%3E%3ClinearGradient%20id='g'%20x1='0'%20y1='0'%20x2='0'%20y2='1'%3E%3Cstop%20offset='0'%20stop-color='%236366f1'/%3E%3Cstop%20offset='1'%20stop-color='%234338ca'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect%20width='96'%20height='96'%20fill='url(%23g)'/%3E%3Ccircle%20cx='48'%20cy='38'%20r='17'%20fill='%23eef2ff'/%3E%3Cpath%20d='M20%2084%20a28%2028%200%200%201%2056%200%20Z'%20fill='%23eef2ff'/%3E%3C/svg%3E\">\n <img\n class=\"avatar__image\"\n alt=\"\"\n aria-hidden=\"true\"\n data-stimeo--avatar-target=\"image\"\n data-action=\"load->stimeo--avatar#onLoad error->stimeo--avatar#onError\">\n <span\n class=\"avatar__fallback\"\n aria-hidden=\"true\"\n hidden\n data-stimeo--avatar-target=\"fallback\"\n >AU</span>\n </span>\n <figcaption><%= t(\"components.avatar.demo.caption_ok\") %></figcaption>\n </figure>\n\n <%# 2. An avatar that fails to load (nonexistent path → fallback initials). The browser\n logs an expected 404 for the missing image — that is the point: it triggers the error\n → fallback path the library handles. %>\n <figure class=\"avatar-demo__item\">\n <span\n class=\"avatar\"\n data-controller=\"stimeo--avatar\"\n role=\"img\"\n aria-label=\"<%= t(\"components.avatar.demo.name_fallback\") %>\"\n data-stimeo--avatar-src-value=\"/this-image-does-not-exist.jpg\">\n <img\n class=\"avatar__image\"\n alt=\"\"\n aria-hidden=\"true\"\n data-stimeo--avatar-target=\"image\"\n data-action=\"load->stimeo--avatar#onLoad error->stimeo--avatar#onError\">\n <span\n class=\"avatar__fallback\"\n aria-hidden=\"true\"\n hidden\n data-stimeo--avatar-target=\"fallback\"\n >JD</span>\n </span>\n <figcaption><%= t(\"components.avatar.demo.caption_fallback\") %></figcaption>\n </figure>\n\n <%# 3. An avatar with no image target at all. Both targets are optional, so a\n fallback-only avatar is valid and settles in the empty state. %>\n <figure class=\"avatar-demo__item\">\n <span\n class=\"avatar\"\n data-controller=\"stimeo--avatar\"\n role=\"img\"\n aria-label=\"<%= t(\"components.avatar.demo.name_empty\") %>\">\n <span\n class=\"avatar__fallback\"\n aria-hidden=\"true\"\n data-stimeo--avatar-target=\"fallback\"\n >GU</span>\n </span>\n <figcaption><%= t(\"components.avatar.demo.caption_empty\") %></figcaption>\n </figure>\n</div>\n"
|
|
31
31
|
},
|
|
32
32
|
"stimeo--breadcrumb": {
|
|
33
33
|
"file": "examples/breadcrumb/_demo.html.erb",
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
},
|
|
104
104
|
"stimeo--date-range-picker": {
|
|
105
105
|
"file": "examples/date_range_picker/_demo.html.erb",
|
|
106
|
-
"source": "<%# Markup for the date-range-picker (range-selection calendar) demo.\n stimeo--date-range-picker derives from calendar and handles two-point start/end\n selection, a provisional range preview mid-selection, marking in-range cells,\n auto-swapping when start > end, applying presets, and grid keyboard movement\n (roving). Range ends are shown with aria-selected and the inside with data-in-range;\n placement and styling live in demo.css. %>\n<div class=\"drp demo-card\" data-controller=\"stimeo--date-range-picker\">\n <div class=\"drp__header\">\n <button class=\"drp__nav\" type=\"button\"\n data-action=\"click->stimeo--date-range-picker#prev\"\n aria-label=\"<%= t(\"components.date_range_picker.demo.prev_month\") %>\">‹</button>\n <span class=\"drp__label\" id=\"drp-month\" aria-live=\"polite\"\n data-stimeo--date-range-picker-target=\"monthLabel\"></span>\n <button class=\"drp__nav\" type=\"button\"\n data-action=\"click->stimeo--date-range-picker#next\"\n aria-label=\"<%= t(\"components.date_range_picker.demo.next_month\") %>\">›</button>\n </div>\n\n <div class=\"drp__weekdays\" aria-hidden=\"true\">\n <% t(\"components.date_range_picker.demo.weekdays\").each do |day| %>\n <span class=\"drp__weekday\"><%= day %></span>\n <% end %>\n </div>\n\n <div class=\"drp__grid\" role=\"grid\" aria-labelledby=\"drp-month\"\n data-stimeo--date-range-picker-target=\"grid\">\n <% 6.times do %>\n <div class=\"drp__row\" role=\"row\">\n <% 7.times do %>\n <button class=\"drp__cell\" type=\"button\" role=\"gridcell\" tabindex=\"-1\"\n data-stimeo--date-range-picker-target=\"cell\"\n data-action=\"click->stimeo--date-range-picker#selectDate\n mouseenter->stimeo--date-range-picker#previewTo\n focus->stimeo--date-range-picker#previewTo\n keydown->stimeo--date-range-picker#onKeydown\"></button>\n <% end %>\n </div>\n <% end %>\n </div>\n\n <div class=\"drp__presets\" role=\"group\"\n aria-label=\"<%= t(\"components.date_range_picker.demo.presets_label\") %>\">\n <button class=\"drp__preset\" type=\"button\" data-range=\"today\"\n data-action=\"click->stimeo--date-range-picker#applyPreset\">\n <%= t(\"components.date_range_picker.demo.preset_today\") %>\n </button>\n <button class=\"drp__preset\" type=\"button\" data-range=\"last7\"\n data-action=\"click->stimeo--date-range-picker#applyPreset\">\n <%= t(\"components.date_range_picker.demo.preset_last7\") %>\n </button>\n <button class=\"drp__preset\" type=\"button\" data-range=\"thisMonth\"\n data-action=\"click->stimeo--date-range-picker#applyPreset\">\n <%= t(\"components.date_range_picker.demo.preset_this_month\") %>\n </button>\n </div>\n\n <span class=\"drp__status\" role=\"status\" aria-live=\"polite\"\n data-stimeo--date-range-picker-target=\"status\"></span>\n\n <input type=\"hidden\" name=\"start_date\" data-stimeo--date-range-picker-target=\"startField\" />\n <input type=\"hidden\" name=\"end_date\" data-stimeo--date-range-picker-target=\"endField\" />\n</div>\n"
|
|
106
|
+
"source": "<%# Markup for the date-range-picker (range-selection calendar) demo.\n stimeo--date-range-picker derives from calendar and handles two-point start/end\n selection, a provisional range preview mid-selection, marking in-range cells,\n auto-swapping when start > end, applying presets, and grid keyboard movement\n (roving). Range ends are shown with aria-selected and the inside with data-in-range;\n placement and styling live in demo.css.\n\n Two unavailable days are declared as data rather than written onto cells. The\n 42 cells are reused for a different date every month, so availability has to\n be keyed by the date; the controller derives each cell's aria-disabled from\n this array on every paint. A range may still span such a day — it just cannot\n end on one. %>\n<% blackout = [3.days.from_now, 4.days.from_now].map { |day| day.strftime(\"%Y-%m-%d\") } %>\n<div class=\"drp demo-card\" data-controller=\"stimeo--date-range-picker\"\n data-stimeo--date-range-picker-disabled-dates-value=\"<%= blackout.to_json %>\">\n <div class=\"drp__header\">\n <button class=\"drp__nav\" type=\"button\"\n data-action=\"click->stimeo--date-range-picker#prev\"\n aria-label=\"<%= t(\"components.date_range_picker.demo.prev_month\") %>\">‹</button>\n <span class=\"drp__label\" id=\"drp-month\" aria-live=\"polite\"\n data-stimeo--date-range-picker-target=\"monthLabel\"></span>\n <button class=\"drp__nav\" type=\"button\"\n data-action=\"click->stimeo--date-range-picker#next\"\n aria-label=\"<%= t(\"components.date_range_picker.demo.next_month\") %>\">›</button>\n </div>\n\n <div class=\"drp__weekdays\" aria-hidden=\"true\">\n <% t(\"components.date_range_picker.demo.weekdays\").each do |day| %>\n <span class=\"drp__weekday\"><%= day %></span>\n <% end %>\n </div>\n\n <div class=\"drp__grid\" role=\"grid\" aria-labelledby=\"drp-month\"\n data-stimeo--date-range-picker-target=\"grid\">\n <% 6.times do %>\n <div class=\"drp__row\" role=\"row\">\n <% 7.times do %>\n <button class=\"drp__cell\" type=\"button\" role=\"gridcell\" tabindex=\"-1\"\n data-stimeo--date-range-picker-target=\"cell\"\n data-action=\"click->stimeo--date-range-picker#selectDate\n mouseenter->stimeo--date-range-picker#previewTo\n focus->stimeo--date-range-picker#previewTo\n keydown->stimeo--date-range-picker#onKeydown\"></button>\n <% end %>\n </div>\n <% end %>\n </div>\n\n <div class=\"drp__presets\" role=\"group\"\n aria-label=\"<%= t(\"components.date_range_picker.demo.presets_label\") %>\">\n <button class=\"drp__preset\" type=\"button\" data-range=\"today\"\n data-action=\"click->stimeo--date-range-picker#applyPreset\">\n <%= t(\"components.date_range_picker.demo.preset_today\") %>\n </button>\n <button class=\"drp__preset\" type=\"button\" data-range=\"last7\"\n data-action=\"click->stimeo--date-range-picker#applyPreset\">\n <%= t(\"components.date_range_picker.demo.preset_last7\") %>\n </button>\n <button class=\"drp__preset\" type=\"button\" data-range=\"thisMonth\"\n data-action=\"click->stimeo--date-range-picker#applyPreset\">\n <%= t(\"components.date_range_picker.demo.preset_this_month\") %>\n </button>\n </div>\n\n <span class=\"drp__status\" role=\"status\" aria-live=\"polite\"\n data-stimeo--date-range-picker-target=\"status\"></span>\n\n <%# Says on screen why two days are struck out. The dates move with today, so\n without this the exclusion reads as a glitch rather than a demonstration. %>\n <p class=\"drp__note\"><%= t(\"components.date_range_picker.demo.blackout_note\") %></p>\n\n <input type=\"hidden\" name=\"start_date\" data-stimeo--date-range-picker-target=\"startField\" />\n <input type=\"hidden\" name=\"end_date\" data-stimeo--date-range-picker-target=\"endField\" />\n</div>\n"
|
|
107
107
|
},
|
|
108
108
|
"stimeo--dialog": {
|
|
109
109
|
"file": "examples/dialog/_demo.html.erb",
|
|
@@ -219,7 +219,7 @@
|
|
|
219
219
|
},
|
|
220
220
|
"stimeo--multi-select": {
|
|
221
221
|
"file": "examples/multi_select/_demo.html.erb",
|
|
222
|
-
"source": "<%# Markup for the multi-select (multiple-selection combobox) demo.\n Filter candidates as you type, select several, and show the selected ones as chips.\n Focus stays on the input; the active candidate is shown via aria-activedescendant\n and selection via aria-selected. The library handles filtering, multi-select\n toggling, chip create/remove, roving,
|
|
222
|
+
"source": "<%# Markup for the multi-select (multiple-selection combobox) demo.\n Filter candidates as you type, select several, and show the selected ones as chips.\n Focus stays on the input; the active candidate is shown via aria-activedescendant\n and selection via aria-selected. The library handles filtering, multi-select\n toggling, chip create/remove, roving, shared announcements, and dismiss. Placement\n lives in demo.css. %>\n<% announce_selected = t(\"components.multi_select.demo.announce_selected\") %>\n<% announce_removed = t(\"components.multi_select.demo.announce_removed\") %>\n<% remove_label = t(\"components.multi_select.demo.remove_label\") %>\n<div\n class=\"multi-select\"\n data-controller=\"stimeo--multi-select\"\n data-stimeo--multi-select-announce-text-value=\"<%= announce_selected %>\"\n data-stimeo--multi-select-announce-removed-text-value=\"<%= announce_removed %>\">\n <span id=\"multi-select-label\" class=\"multi-select__label\">\n <%= t(\"components.multi_select.demo.label\") %>\n </span>\n\n <ul\n class=\"multi-select__tags\"\n aria-label=\"<%= t(\"components.multi_select.demo.selected_label\") %>\"\n data-stimeo--multi-select-target=\"tags\"></ul>\n\n <input\n type=\"text\"\n class=\"multi-select__input\"\n role=\"combobox\"\n aria-expanded=\"false\"\n aria-autocomplete=\"list\"\n aria-controls=\"multi-select-list\"\n aria-labelledby=\"multi-select-label\"\n placeholder=\"<%= t(\"components.multi_select.demo.placeholder\") %>\"\n data-stimeo--multi-select-target=\"input\"\n data-action=\"input->stimeo--multi-select#filter\n keydown->stimeo--multi-select#onKeydown\n focus->stimeo--multi-select#open\" />\n\n <ul\n id=\"multi-select-list\"\n class=\"multi-select__list\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n aria-label=\"<%= t(\"components.multi_select.demo.options_label\") %>\"\n hidden\n data-stimeo--multi-select-target=\"list\">\n <% %w[apple banana cherry grape orange melon].each_with_index do |fruit, index| %>\n <li\n id=\"multi-select-opt-<%= index %>\"\n class=\"multi-select__option\"\n role=\"option\"\n aria-selected=\"false\"\n data-value=\"<%= fruit %>\"\n data-stimeo--multi-select-target=\"option\"\n data-action=\"click->stimeo--multi-select#toggleOption\">\n <%= t(\"components.multi_select.demo.options.#{fruit}\") %>\n </li>\n <% end %>\n </ul>\n\n <template data-stimeo--multi-select-target=\"tagTemplate\">\n <li class=\"multi-select__tag\" data-stimeo--multi-select-target=\"tag\">\n <span data-stimeo--multi-select-target=\"label\"></span>\n <%# Removal is handled by a delegated listener on the tags container, so it\n works instantly without waiting on Stimulus wiring a data-action onto the\n dynamically-added button. %>\n <button\n type=\"button\"\n class=\"multi-select__remove\"\n tabindex=\"-1\"\n aria-label=\"<%= remove_label %>\"\n data-stimeo--multi-select-target=\"remove\">×</button>\n </li>\n </template>\n\n <%# Selection announcements go to the shared announcer that lives in the page. %>\n <div data-controller=\"stimeo--announcer\">\n <div class=\"visually-hidden\" data-stimeo--announcer-target=\"polite\"\n aria-live=\"polite\" aria-atomic=\"true\"></div>\n </div>\n</div>\n"
|
|
223
223
|
},
|
|
224
224
|
"stimeo--navigation-menu": {
|
|
225
225
|
"file": "examples/navigation_menu/_demo.html.erb",
|
|
@@ -295,7 +295,7 @@
|
|
|
295
295
|
},
|
|
296
296
|
"stimeo--radio-group": {
|
|
297
297
|
"file": "examples/radio_group/_demo.html.erb",
|
|
298
|
-
"source": "<%# Markup for the radio-group (APG Radio Group) demo.\n A custom card-style radio. Single selection is shown via aria-checked and the single\n tab stop via roving tabindex. Arrows move the selection (focus = selection). The\n selected value is reflected into a hidden field; the look is the consumer's CSS. %>\n<div class=\"radio-group-demo\" role=\"radiogroup\" aria-labelledby=\"rg-label\"\n data-controller=\"stimeo--radio-group\">\n <span class=\"radio-group-demo__legend\" id=\"rg-label\">\n <%= t(\"components.radio_group.demo.legend\") %>\n </span>\n <p class=\"radio-group-demo__hint\"><%= t(\"components.radio_group.demo.hint\") %></p>\n\n <div class=\"radio-group-demo__options\">\n <div class=\"radio-group-demo__option\" role=\"radio\" aria-checked=\"false\" tabindex=\"0\"\n data-value=\"basic\" data-stimeo--radio-group-target=\"radio\"
|
|
298
|
+
"source": "<%# Markup for the radio-group (APG Radio Group) demo.\n A custom card-style radio. Single selection is shown via aria-checked and the single\n tab stop via roving tabindex. Arrows move the selection (focus = selection). The group\n delegates click and keydown, so the radios carry no data-action of their own. The\n selected value is reflected into a hidden field; the look is the consumer's CSS. %>\n<div class=\"radio-group-demo\" role=\"radiogroup\" aria-labelledby=\"rg-label\"\n data-controller=\"stimeo--radio-group\">\n <span class=\"radio-group-demo__legend\" id=\"rg-label\">\n <%= t(\"components.radio_group.demo.legend\") %>\n </span>\n <p class=\"radio-group-demo__hint\"><%= t(\"components.radio_group.demo.hint\") %></p>\n\n <div class=\"radio-group-demo__options\">\n <div class=\"radio-group-demo__option\" role=\"radio\" aria-checked=\"false\" tabindex=\"0\"\n data-value=\"basic\" data-stimeo--radio-group-target=\"radio\">\n <span class=\"radio-group-demo__name\"><%= t(\"components.radio_group.demo.basic\") %></span>\n <span class=\"radio-group-demo__desc\"><%= t(\"components.radio_group.demo.basic_desc\") %></span>\n </div>\n <div class=\"radio-group-demo__option\" role=\"radio\" aria-checked=\"false\" tabindex=\"-1\"\n data-value=\"pro\" data-stimeo--radio-group-target=\"radio\">\n <span class=\"radio-group-demo__name\"><%= t(\"components.radio_group.demo.pro\") %></span>\n <span class=\"radio-group-demo__desc\"><%= t(\"components.radio_group.demo.pro_desc\") %></span>\n </div>\n <div class=\"radio-group-demo__option\" role=\"radio\" aria-checked=\"false\" tabindex=\"-1\"\n data-value=\"max\" data-stimeo--radio-group-target=\"radio\">\n <span class=\"radio-group-demo__name\"><%= t(\"components.radio_group.demo.max\") %></span>\n <span class=\"radio-group-demo__desc\"><%= t(\"components.radio_group.demo.max_desc\") %></span>\n </div>\n </div>\n\n <input type=\"hidden\" name=\"plan\" value=\"\" data-stimeo--radio-group-target=\"field\" />\n\n <p class=\"radio-group-demo__status\" aria-live=\"polite\">\n <%= t(\"components.radio_group.demo.selected\") %>\n <span data-radio-value><%= t(\"components.radio_group.demo.none\") %></span>\n </p>\n</div>\n"
|
|
299
299
|
},
|
|
300
300
|
"stimeo--range-slider": {
|
|
301
301
|
"file": "examples/range_slider/_demo.html.erb",
|
|
@@ -303,7 +303,7 @@
|
|
|
303
303
|
},
|
|
304
304
|
"stimeo--rating": {
|
|
305
305
|
"file": "examples/rating/_demo.html.erb",
|
|
306
|
-
"source": "<%# Markup for the rating (APG Radio Group, ordinal scale) demo.\n Each symbol is role=\"radio\" with an aria-label (\"3 stars\", etc.). Selection is\n aria-checked; the currently filled range is data-rating-hover (the selected value or\n a hover preview).
|
|
306
|
+
"source": "<%# Markup for the rating (APG Radio Group, ordinal scale) demo.\n Each symbol is role=\"radio\" with an aria-label (\"3 stars\", etc.). Selection is\n aria-checked; the currently filled range is data-rating-hover (the selected value or\n a hover/focus preview). DOM order defines values 1..N. The star look is the consumer's CSS. %>\n<div class=\"rating-demo-wrap\">\n <p class=\"rating-demo__hint\"><%= t(\"components.rating.demo.hint\") %></p>\n <div class=\"rating-demo\" role=\"radiogroup\" aria-label=\"<%= t('components.rating.demo.label') %>\"\n data-controller=\"stimeo--rating\"\n data-stimeo--rating-value-value=\"0\">\n <% (1..5).each do |n| %>\n <span class=\"rating-demo__star\" role=\"radio\" aria-checked=\"false\"\n aria-label=\"<%= t('components.rating.demo.star', count: n) %>\"\n tabindex=\"<%= n == 1 ? 0 : -1 %>\"\n data-stimeo--rating-target=\"symbol\"\n data-action=\"click->stimeo--rating#select\n mouseenter->stimeo--rating#preview\n mouseleave->stimeo--rating#endPreview\n focus->stimeo--rating#preview\n blur->stimeo--rating#endPreview\n keydown->stimeo--rating#onKeydown\">\n <svg class=\"rating-demo__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M12 2l2.9 6.26 6.86.6-5.2 4.52 1.56 6.72L12 17.1 5.88 20.6l1.56-6.72-5.2-4.52\n 6.86-.6z\"></path>\n </svg>\n </span>\n <% end %>\n\n <input type=\"hidden\" name=\"rating\" value=\"0\" data-stimeo--rating-target=\"field\" />\n\n <%# Subscribe to committed and reconciled values to update this instance's status. %>\n <span class=\"rating-demo__status\" aria-live=\"polite\"\n data-empty-text=\"<%= t('components.rating.demo.empty') %>\"\n data-rated-template=\"<%= t('components.rating.demo.rated') %>\"><%= t(\n 'components.rating.demo.empty'\n ) %></span>\n </div>\n</div>\n"
|
|
307
307
|
},
|
|
308
308
|
"stimeo--read-more": {
|
|
309
309
|
"file": "examples/read_more/_demo.html.erb",
|
|
@@ -403,7 +403,7 @@
|
|
|
403
403
|
},
|
|
404
404
|
"stimeo--tags-input": {
|
|
405
405
|
"file": "examples/tags_input/_demo.html.erb",
|
|
406
|
-
"source": "<%# Markup for the tags-input demo.\n Enter or a comma (delimiter) turns the input value into a tag, blocking duplicates /\n empties / over-limit. Tag remove buttons move via roving (left/right keys), and\n Backspace on an empty input deletes the previous tag. The library handles tag\n create/remove, hidden-field sync, focus handoff, and
|
|
406
|
+
"source": "<%# Markup for the tags-input demo.\n Enter or a comma (delimiter) turns the input value into a tag, blocking duplicates /\n empties / over-limit. Tag remove buttons move via roving (left/right keys), and\n Backspace on an empty input deletes the previous tag. The library handles tag\n create/remove, hidden-field sync, focus handoff, and shared announcements. %>\n<% announce_added = t(\"components.tags_input.demo.announce_added\") %>\n<% announce_removed = t(\"components.tags_input.demo.announce_removed\") %>\n<% remove_label = t(\"components.tags_input.demo.remove_label\") %>\n<div class=\"tags-input\" data-controller=\"stimeo--tags-input\"\n data-stimeo--tags-input-delimiter-value=\",\"\n data-stimeo--tags-input-name-value=\"frameworks[]\"\n data-stimeo--tags-input-announce-text-value=\"<%= announce_added %>\"\n data-stimeo--tags-input-announce-removed-text-value=\"<%= announce_removed %>\">\n <ul\n class=\"tags-input__tags\"\n role=\"list\"\n aria-label=\"<%= t(\"components.tags_input.demo.tags_label\") %>\"\n data-stimeo--tags-input-target=\"tags\"></ul>\n\n <input\n type=\"text\"\n class=\"tags-input__input\"\n aria-label=\"<%= t(\"components.tags_input.demo.input_label\") %>\"\n aria-describedby=\"tags-input-help\"\n data-stimeo--tags-input-target=\"input\"\n data-action=\"keydown->stimeo--tags-input#onKeydown\" />\n\n <span id=\"tags-input-help\" class=\"tags-input__help\">\n <%= t(\"components.tags_input.demo.help\") %>\n </span>\n\n <%# The library creates and syncs the submit hidden inputs as name=\"frameworks[]\". %>\n <div hidden data-stimeo--tags-input-target=\"fields\"></div>\n\n <template data-stimeo--tags-input-target=\"tagTemplate\">\n <li class=\"tags-input__tag\" role=\"listitem\" data-stimeo--tags-input-target=\"tag\">\n <span data-stimeo--tags-input-target=\"label\"></span>\n <%# Removal is handled by a delegated listener on the tags container, so it\n works instantly without waiting on Stimulus wiring a data-action onto the\n dynamically-added button. %>\n <button\n type=\"button\"\n class=\"tags-input__remove\"\n tabindex=\"-1\"\n aria-label=\"<%= remove_label %>\"\n data-stimeo--tags-input-target=\"remove\">×</button>\n </li>\n </template>\n\n <%# Tag announcements go to the shared announcer that lives in the page. %>\n <div data-controller=\"stimeo--announcer\">\n <div class=\"visually-hidden\" data-stimeo--announcer-target=\"polite\"\n aria-live=\"polite\" aria-atomic=\"true\"></div>\n </div>\n</div>\n"
|
|
407
407
|
},
|
|
408
408
|
"stimeo--textarea-autosize": {
|
|
409
409
|
"file": "examples/textarea_autosize/_demo.html.erb",
|
|
@@ -423,7 +423,7 @@
|
|
|
423
423
|
},
|
|
424
424
|
"stimeo--toggle-group": {
|
|
425
425
|
"file": "examples/toggle_group/_demo.html.erb",
|
|
426
|
-
"source": "<%# Markup for the toggle-group
|
|
426
|
+
"source": "<%# Markup for the toggle-group demo: multiple selection, single selection, and\n unavailable items. The group delegates click and keydown, so the items carry\n no data-action of their own. %>\n<div class=\"toggle-group-demo-suite\">\n <section class=\"toggle-group-demo__example\">\n <h3 class=\"toggle-group-demo__heading\" id=\"toggle-group-multiple-heading\">\n <%= t(\"components.toggle_group.demo.multiple_heading\") %>\n </h3>\n <div class=\"toggle-group-demo\" role=\"group\"\n aria-labelledby=\"toggle-group-multiple-heading\"\n data-controller=\"stimeo--toggle-group\">\n <button type=\"button\" class=\"toggle-group-demo__item\" aria-pressed=\"false\" tabindex=\"0\"\n aria-label=\"<%= t('components.toggle_group.demo.bold') %>\" data-value=\"bold\"\n data-stimeo--toggle-group-target=\"item\">\n <svg class=\"demo-icon\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M6 4h8a4 4 0 0 1 0 8H6z\"></path>\n <path d=\"M6 12h9a4 4 0 0 1 0 8H6z\"></path>\n </svg>\n </button>\n <button type=\"button\" class=\"toggle-group-demo__item\" aria-pressed=\"false\" tabindex=\"-1\"\n aria-label=\"<%= t('components.toggle_group.demo.italic') %>\" data-value=\"italic\"\n data-stimeo--toggle-group-target=\"item\">\n <svg class=\"demo-icon\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\"></line>\n <line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\"></line>\n <line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\"></line>\n </svg>\n </button>\n <button type=\"button\" class=\"toggle-group-demo__item\" aria-pressed=\"false\" tabindex=\"-1\"\n aria-label=\"<%= t('components.toggle_group.demo.underline') %>\" data-value=\"underline\"\n data-stimeo--toggle-group-target=\"item\">\n <svg class=\"demo-icon\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M6 3v7a6 6 0 0 0 12 0V3\"></path>\n <line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\"></line>\n </svg>\n </button>\n </div>\n </section>\n\n <section class=\"toggle-group-demo__example\">\n <h3 class=\"toggle-group-demo__heading\" id=\"toggle-group-single-heading\">\n <%= t(\"components.toggle_group.demo.single_heading\") %>\n </h3>\n <div class=\"toggle-group-demo\" role=\"group\"\n aria-labelledby=\"toggle-group-single-heading\"\n data-controller=\"stimeo--toggle-group\"\n data-stimeo--toggle-group-mode-value=\"single\">\n <button type=\"button\" class=\"toggle-group-demo__item\" aria-pressed=\"true\" tabindex=\"0\"\n aria-label=\"<%= t('components.toggle_group.demo.align_left') %>\" data-value=\"left\"\n data-stimeo--toggle-group-target=\"item\">\n <svg class=\"demo-icon\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"M4 6h16M4 10h11M4 14h16M4 18h9\"></path>\n </svg>\n </button>\n <button type=\"button\" class=\"toggle-group-demo__item\" aria-pressed=\"false\" tabindex=\"-1\"\n aria-label=\"<%= t('components.toggle_group.demo.align_center') %>\" data-value=\"center\"\n data-stimeo--toggle-group-target=\"item\">\n <svg class=\"demo-icon\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"M4 6h16M6 10h12M4 14h16M7 18h10\"></path>\n </svg>\n </button>\n <button type=\"button\" class=\"toggle-group-demo__item\" aria-pressed=\"false\" tabindex=\"-1\"\n aria-label=\"<%= t('components.toggle_group.demo.align_right') %>\" data-value=\"right\"\n data-stimeo--toggle-group-target=\"item\">\n <svg class=\"demo-icon\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"M4 6h16M9 10h11M4 14h16M11 18h9\"></path>\n </svg>\n </button>\n </div>\n </section>\n\n <section class=\"toggle-group-demo__example\">\n <h3 class=\"toggle-group-demo__heading\" id=\"toggle-group-disabled-heading\">\n <%= t(\"components.toggle_group.demo.disabled_heading\") %>\n </h3>\n <div class=\"toggle-group-demo\" role=\"group\"\n aria-labelledby=\"toggle-group-disabled-heading\"\n data-controller=\"stimeo--toggle-group\">\n <button type=\"button\" class=\"toggle-group-demo__item toggle-group-demo__item--wide\"\n aria-pressed=\"false\" tabindex=\"0\" data-value=\"available\"\n data-stimeo--toggle-group-target=\"item\">\n <%= t(\"components.toggle_group.demo.available\") %>\n </button>\n <button type=\"button\" class=\"toggle-group-demo__item toggle-group-demo__item--wide\"\n aria-pressed=\"false\" tabindex=\"-1\" data-value=\"native-disabled\" disabled\n data-stimeo--toggle-group-target=\"item\">\n <%= t(\"components.toggle_group.demo.native_disabled\") %>\n </button>\n <button type=\"button\" class=\"toggle-group-demo__item toggle-group-demo__item--wide\"\n aria-pressed=\"false\" tabindex=\"-1\" data-value=\"aria-disabled\" aria-disabled=\"true\"\n data-stimeo--toggle-group-target=\"item\">\n <%= t(\"components.toggle_group.demo.aria_disabled\") %>\n </button>\n </div>\n </section>\n</div>\n"
|
|
427
427
|
},
|
|
428
428
|
"stimeo--toolbar": {
|
|
429
429
|
"file": "examples/toolbar/_demo.html.erb",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 11,
|
|
3
|
-
"packageVersion": "0.
|
|
3
|
+
"packageVersion": "0.6.0",
|
|
4
4
|
"controllers": {
|
|
5
5
|
"stimeo--accordion": {
|
|
6
6
|
"targets": [
|
|
@@ -122,9 +122,7 @@
|
|
|
122
122
|
"forbiddenAria": []
|
|
123
123
|
},
|
|
124
124
|
"stimeo--aspect-ratio": {
|
|
125
|
-
"targets": [
|
|
126
|
-
"content"
|
|
127
|
-
],
|
|
125
|
+
"targets": [],
|
|
128
126
|
"values": [
|
|
129
127
|
"ratio"
|
|
130
128
|
],
|
|
@@ -192,9 +190,7 @@
|
|
|
192
190
|
"events": [
|
|
193
191
|
"error"
|
|
194
192
|
],
|
|
195
|
-
"requiredTargets": [
|
|
196
|
-
"image"
|
|
197
|
-
],
|
|
193
|
+
"requiredTargets": [],
|
|
198
194
|
"conditionalTargets": [],
|
|
199
195
|
"a11y": [],
|
|
200
196
|
"keyboard": [],
|
|
@@ -349,7 +345,8 @@
|
|
|
349
345
|
"events": [
|
|
350
346
|
"change",
|
|
351
347
|
"pause",
|
|
352
|
-
"play"
|
|
348
|
+
"play",
|
|
349
|
+
"reconcile"
|
|
353
350
|
],
|
|
354
351
|
"requiredTargets": [
|
|
355
352
|
"slide",
|
|
@@ -475,11 +472,10 @@
|
|
|
475
472
|
"onParentChange"
|
|
476
473
|
],
|
|
477
474
|
"events": [
|
|
478
|
-
"change"
|
|
479
|
-
|
|
480
|
-
"requiredTargets": [
|
|
481
|
-
"parent"
|
|
475
|
+
"change",
|
|
476
|
+
"reconcile"
|
|
482
477
|
],
|
|
478
|
+
"requiredTargets": [],
|
|
483
479
|
"conditionalTargets": [],
|
|
484
480
|
"a11y": [],
|
|
485
481
|
"keyboard": [],
|
|
@@ -488,7 +484,14 @@
|
|
|
488
484
|
"compositions": [],
|
|
489
485
|
"companions": [],
|
|
490
486
|
"targetDeclarations": [],
|
|
491
|
-
"cardinality": [
|
|
487
|
+
"cardinality": [
|
|
488
|
+
{
|
|
489
|
+
"within": "",
|
|
490
|
+
"target": "parent",
|
|
491
|
+
"max": 1,
|
|
492
|
+
"suggestion": "Keep at most one \"parent\" target in a checkbox group — omit it for a child-only aggregate, or use one select-all checkbox for the children."
|
|
493
|
+
}
|
|
494
|
+
],
|
|
492
495
|
"forbiddenAria": []
|
|
493
496
|
},
|
|
494
497
|
"stimeo--clipboard": {
|
|
@@ -575,7 +578,8 @@
|
|
|
575
578
|
"onPointerDown"
|
|
576
579
|
],
|
|
577
580
|
"events": [
|
|
578
|
-
"change"
|
|
581
|
+
"change",
|
|
582
|
+
"reconcile"
|
|
579
583
|
],
|
|
580
584
|
"requiredTargets": [
|
|
581
585
|
"slider"
|
|
@@ -1250,7 +1254,8 @@
|
|
|
1250
1254
|
],
|
|
1251
1255
|
"values": [
|
|
1252
1256
|
"min",
|
|
1253
|
-
"max"
|
|
1257
|
+
"max",
|
|
1258
|
+
"disabledDates"
|
|
1254
1259
|
],
|
|
1255
1260
|
"valueConstraints": [],
|
|
1256
1261
|
"valueRelations": [],
|
|
@@ -1263,7 +1268,8 @@
|
|
|
1263
1268
|
"selectDate"
|
|
1264
1269
|
],
|
|
1265
1270
|
"events": [
|
|
1266
|
-
"change"
|
|
1271
|
+
"change",
|
|
1272
|
+
"monthchange"
|
|
1267
1273
|
],
|
|
1268
1274
|
"requiredTargets": [
|
|
1269
1275
|
"grid",
|
|
@@ -2480,13 +2486,16 @@
|
|
|
2480
2486
|
"tags",
|
|
2481
2487
|
"tag",
|
|
2482
2488
|
"tagTemplate",
|
|
2483
|
-
"
|
|
2489
|
+
"label",
|
|
2490
|
+
"remove",
|
|
2484
2491
|
"fields"
|
|
2485
2492
|
],
|
|
2486
2493
|
"values": [
|
|
2487
2494
|
"max",
|
|
2488
2495
|
"name",
|
|
2489
|
-
"form"
|
|
2496
|
+
"form",
|
|
2497
|
+
"announceText",
|
|
2498
|
+
"announceRemovedText"
|
|
2490
2499
|
],
|
|
2491
2500
|
"valueConstraints": [],
|
|
2492
2501
|
"valueRelations": [],
|
|
@@ -2499,14 +2508,26 @@
|
|
|
2499
2508
|
],
|
|
2500
2509
|
"events": [
|
|
2501
2510
|
"change",
|
|
2502
|
-
"filter"
|
|
2511
|
+
"filter",
|
|
2512
|
+
"reconcile"
|
|
2503
2513
|
],
|
|
2504
2514
|
"requiredTargets": [
|
|
2505
2515
|
"input",
|
|
2506
2516
|
"list",
|
|
2507
2517
|
"tags"
|
|
2508
2518
|
],
|
|
2509
|
-
"conditionalTargets": [
|
|
2519
|
+
"conditionalTargets": [
|
|
2520
|
+
{
|
|
2521
|
+
"whenPresent": "tagTemplate",
|
|
2522
|
+
"require": [
|
|
2523
|
+
"tag",
|
|
2524
|
+
"label",
|
|
2525
|
+
"remove"
|
|
2526
|
+
],
|
|
2527
|
+
"requireInside": true,
|
|
2528
|
+
"suggestion": "Complete the chip template: inside it, it needs a \"tag\" root, a \"label\" element for the option text, and a \"remove\" button. Parts declared outside the template never reach the clone, so no selection can commit."
|
|
2529
|
+
}
|
|
2530
|
+
],
|
|
2510
2531
|
"a11y": [
|
|
2511
2532
|
{
|
|
2512
2533
|
"target": "input",
|
|
@@ -2580,6 +2601,13 @@
|
|
|
2580
2601
|
"option"
|
|
2581
2602
|
],
|
|
2582
2603
|
"suggestion": "Add role=\"option\" to each option target."
|
|
2604
|
+
},
|
|
2605
|
+
{
|
|
2606
|
+
"target": "remove",
|
|
2607
|
+
"attrs": [
|
|
2608
|
+
"aria-label"
|
|
2609
|
+
],
|
|
2610
|
+
"suggestion": "Add a localized aria-label to the remove target (for example, aria-label=\"Remove {label}\")."
|
|
2583
2611
|
}
|
|
2584
2612
|
],
|
|
2585
2613
|
"keyboard": [],
|
|
@@ -2735,7 +2763,8 @@
|
|
|
2735
2763
|
"onKeydown"
|
|
2736
2764
|
],
|
|
2737
2765
|
"events": [
|
|
2738
|
-
"change"
|
|
2766
|
+
"change",
|
|
2767
|
+
"reconcile"
|
|
2739
2768
|
],
|
|
2740
2769
|
"requiredTargets": [
|
|
2741
2770
|
"input"
|
|
@@ -3228,7 +3257,8 @@
|
|
|
3228
3257
|
"select"
|
|
3229
3258
|
],
|
|
3230
3259
|
"events": [
|
|
3231
|
-
"change"
|
|
3260
|
+
"change",
|
|
3261
|
+
"reconcile"
|
|
3232
3262
|
],
|
|
3233
3263
|
"requiredTargets": [
|
|
3234
3264
|
"radio"
|
|
@@ -3270,12 +3300,32 @@
|
|
|
3270
3300
|
}
|
|
3271
3301
|
],
|
|
3272
3302
|
"keyboard": [],
|
|
3273
|
-
"hosts": [
|
|
3303
|
+
"hosts": [
|
|
3304
|
+
{
|
|
3305
|
+
"target": "radio",
|
|
3306
|
+
"mode": "non-interactive-or-button",
|
|
3307
|
+
"buttonTypes": [
|
|
3308
|
+
"button"
|
|
3309
|
+
],
|
|
3310
|
+
"suggestion": "Use <button type=\"button\">, or place the \"radio\" target on a non-interactive host such as <div role=\"radio\">."
|
|
3311
|
+
}
|
|
3312
|
+
],
|
|
3274
3313
|
"managedAria": [],
|
|
3275
3314
|
"compositions": [],
|
|
3276
3315
|
"companions": [],
|
|
3277
3316
|
"targetDeclarations": [],
|
|
3278
|
-
"cardinality": [
|
|
3317
|
+
"cardinality": [
|
|
3318
|
+
{
|
|
3319
|
+
"within": "",
|
|
3320
|
+
"target": "radio",
|
|
3321
|
+
"attr": "aria-checked",
|
|
3322
|
+
"values": [
|
|
3323
|
+
"true"
|
|
3324
|
+
],
|
|
3325
|
+
"max": 1,
|
|
3326
|
+
"suggestion": "Leave aria-checked=\"true\" on at most one radio and set the others to \"false\" — connect keeps the first checked radio in DOM order."
|
|
3327
|
+
}
|
|
3328
|
+
],
|
|
3279
3329
|
"forbiddenAria": []
|
|
3280
3330
|
},
|
|
3281
3331
|
"stimeo--range-slider": {
|
|
@@ -3413,7 +3463,6 @@
|
|
|
3413
3463
|
],
|
|
3414
3464
|
"values": [
|
|
3415
3465
|
"value",
|
|
3416
|
-
"max",
|
|
3417
3466
|
"clearable",
|
|
3418
3467
|
"readonly"
|
|
3419
3468
|
],
|
|
@@ -3426,7 +3475,8 @@
|
|
|
3426
3475
|
"select"
|
|
3427
3476
|
],
|
|
3428
3477
|
"events": [
|
|
3429
|
-
"change"
|
|
3478
|
+
"change",
|
|
3479
|
+
"reconcile"
|
|
3430
3480
|
],
|
|
3431
3481
|
"requiredTargets": [
|
|
3432
3482
|
"symbol"
|
|
@@ -4388,14 +4438,17 @@
|
|
|
4388
4438
|
"tags",
|
|
4389
4439
|
"tag",
|
|
4390
4440
|
"tagTemplate",
|
|
4391
|
-
"
|
|
4441
|
+
"label",
|
|
4442
|
+
"remove",
|
|
4392
4443
|
"fields"
|
|
4393
4444
|
],
|
|
4394
4445
|
"values": [
|
|
4395
4446
|
"delimiter",
|
|
4396
4447
|
"max",
|
|
4397
4448
|
"allowDuplicates",
|
|
4398
|
-
"name"
|
|
4449
|
+
"name",
|
|
4450
|
+
"announceText",
|
|
4451
|
+
"announceRemovedText"
|
|
4399
4452
|
],
|
|
4400
4453
|
"valueConstraints": [],
|
|
4401
4454
|
"valueRelations": [],
|
|
@@ -4404,14 +4457,35 @@
|
|
|
4404
4457
|
],
|
|
4405
4458
|
"events": [
|
|
4406
4459
|
"change",
|
|
4460
|
+
"reconcile",
|
|
4407
4461
|
"reject"
|
|
4408
4462
|
],
|
|
4409
4463
|
"requiredTargets": [
|
|
4410
4464
|
"input",
|
|
4411
|
-
"tags"
|
|
4465
|
+
"tags",
|
|
4466
|
+
"tagTemplate"
|
|
4467
|
+
],
|
|
4468
|
+
"conditionalTargets": [
|
|
4469
|
+
{
|
|
4470
|
+
"whenPresent": "tagTemplate",
|
|
4471
|
+
"require": [
|
|
4472
|
+
"tag",
|
|
4473
|
+
"label",
|
|
4474
|
+
"remove"
|
|
4475
|
+
],
|
|
4476
|
+
"requireInside": true,
|
|
4477
|
+
"suggestion": "Complete the chip template: inside it, it needs a \"tag\" root, a \"label\" element for the entered text, and a \"remove\" button. Parts declared outside the template never reach the clone, so no tag can commit."
|
|
4478
|
+
}
|
|
4479
|
+
],
|
|
4480
|
+
"a11y": [
|
|
4481
|
+
{
|
|
4482
|
+
"target": "remove",
|
|
4483
|
+
"attrs": [
|
|
4484
|
+
"aria-label"
|
|
4485
|
+
],
|
|
4486
|
+
"suggestion": "Add a localized aria-label to the remove target (for example, aria-label=\"Remove {label}\")."
|
|
4487
|
+
}
|
|
4412
4488
|
],
|
|
4413
|
-
"conditionalTargets": [],
|
|
4414
|
-
"a11y": [],
|
|
4415
4489
|
"keyboard": [],
|
|
4416
4490
|
"hosts": [],
|
|
4417
4491
|
"managedAria": [],
|
|
@@ -4488,17 +4562,26 @@
|
|
|
4488
4562
|
"seconds",
|
|
4489
4563
|
"wrap"
|
|
4490
4564
|
],
|
|
4491
|
-
"valueConstraints": [
|
|
4565
|
+
"valueConstraints": [
|
|
4566
|
+
{
|
|
4567
|
+
"value": "step",
|
|
4568
|
+
"type": "number",
|
|
4569
|
+
"finite": true,
|
|
4570
|
+
"greaterThan": 0,
|
|
4571
|
+
"suggestion": "Set step to a positive integer.",
|
|
4572
|
+
"integer": true
|
|
4573
|
+
}
|
|
4574
|
+
],
|
|
4492
4575
|
"valueRelations": [],
|
|
4493
4576
|
"actions": [
|
|
4494
4577
|
"onKeydown"
|
|
4495
4578
|
],
|
|
4496
4579
|
"events": [
|
|
4497
|
-
"change"
|
|
4580
|
+
"change",
|
|
4581
|
+
"reconcile"
|
|
4498
4582
|
],
|
|
4499
4583
|
"requiredTargets": [
|
|
4500
|
-
"segment"
|
|
4501
|
-
"field"
|
|
4584
|
+
"segment"
|
|
4502
4585
|
],
|
|
4503
4586
|
"conditionalTargets": [],
|
|
4504
4587
|
"a11y": [
|
|
@@ -4593,9 +4676,58 @@
|
|
|
4593
4676
|
"item"
|
|
4594
4677
|
],
|
|
4595
4678
|
"conditionalTargets": [],
|
|
4596
|
-
"a11y": [
|
|
4679
|
+
"a11y": [
|
|
4680
|
+
{
|
|
4681
|
+
"target": "",
|
|
4682
|
+
"attrs": [
|
|
4683
|
+
"role"
|
|
4684
|
+
],
|
|
4685
|
+
"values": [
|
|
4686
|
+
"group"
|
|
4687
|
+
],
|
|
4688
|
+
"suggestion": "Add role=\"group\" to the controller element."
|
|
4689
|
+
},
|
|
4690
|
+
{
|
|
4691
|
+
"target": "item",
|
|
4692
|
+
"attrs": [
|
|
4693
|
+
"role"
|
|
4694
|
+
],
|
|
4695
|
+
"values": [
|
|
4696
|
+
"button"
|
|
4697
|
+
],
|
|
4698
|
+
"whenElement": {
|
|
4699
|
+
"exceptTags": [
|
|
4700
|
+
"button"
|
|
4701
|
+
]
|
|
4702
|
+
},
|
|
4703
|
+
"suggestion": "Add role=\"button\" to each non-button item target."
|
|
4704
|
+
},
|
|
4705
|
+
{
|
|
4706
|
+
"target": "",
|
|
4707
|
+
"attrs": [
|
|
4708
|
+
"aria-labelledby",
|
|
4709
|
+
"aria-label"
|
|
4710
|
+
],
|
|
4711
|
+
"whenElement": {
|
|
4712
|
+
"exceptTags": [
|
|
4713
|
+
"fieldset"
|
|
4714
|
+
]
|
|
4715
|
+
},
|
|
4716
|
+
"severity": "warning",
|
|
4717
|
+
"suggestion": "Name the toggle group via aria-labelledby or aria-label."
|
|
4718
|
+
}
|
|
4719
|
+
],
|
|
4597
4720
|
"keyboard": [],
|
|
4598
|
-
"hosts": [
|
|
4721
|
+
"hosts": [
|
|
4722
|
+
{
|
|
4723
|
+
"target": "item",
|
|
4724
|
+
"mode": "non-interactive-or-button",
|
|
4725
|
+
"buttonTypes": [
|
|
4726
|
+
"button"
|
|
4727
|
+
],
|
|
4728
|
+
"suggestion": "Use <button type=\"button\">, or place the \"item\" target on a non-interactive host such as <div role=\"button\">."
|
|
4729
|
+
}
|
|
4730
|
+
],
|
|
4599
4731
|
"managedAria": [],
|
|
4600
4732
|
"compositions": [],
|
|
4601
4733
|
"companions": [],
|
|
@@ -6,8 +6,8 @@ import { Controller, Application } from '@hotwired/stimulus';
|
|
|
6
6
|
* Headless **anchored positioning**: keeps a `floating` element placed against an
|
|
7
7
|
* `anchor`, flipping/shifting it away from viewport edges as the page scrolls or
|
|
8
8
|
* resizes. It is the declarative surface of the opt-in {@link attachPositioning}
|
|
9
|
-
* engine (`@floating-ui/dom`-based)
|
|
10
|
-
*
|
|
9
|
+
* engine (`@floating-ui/dom`-based), exposing its `autoUpdate` behavior as a
|
|
10
|
+
* controller. No dedicated APG pattern; it is the
|
|
11
11
|
* placement primitive the popup patterns (Tooltip / Menu / Popover …) build on.
|
|
12
12
|
*
|
|
13
13
|
* Markup contract (identifier: `stimeo--anchored`):
|