desy-html 16.0.4 → 17.0.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/.node-version +1 -1
- package/.nvmrc +1 -1
- package/AGENTS.md +207 -207
- package/README.md +203 -203
- package/TESTING_PLAN.md +379 -379
- package/branding/BRANDING.md +398 -398
- package/branding/branding.config.js +76 -76
- package/branding/branding.config.yourorganization.js +72 -72
- package/branding/logos/aragon-compact.svg +1 -1
- package/branding/logos/aragon-expanded.svg +1 -1
- package/branding/logos/aragon-mini.svg +1 -1
- package/branding/logos/favicon.svg +1 -1
- package/branding/logos/yourlogo-compact.svg +13 -13
- package/branding/logos/yourlogo-expanded.svg +17 -17
- package/branding/logos/yourlogo-mini.svg +17 -17
- package/branding/logos/yourorganization-favicon.svg +13 -13
- package/branding/vite-branding-plugin.js +221 -221
- package/docs/_global.content-placeholder.njk +7 -7
- package/docs/_global.foot.njk +11 -11
- package/docs/_global.head.njk +42 -42
- package/docs/_include.template-header.njk +391 -386
- package/docs/_macro.component-example.njk +6 -6
- package/docs/_macro.example-render.njk +350 -346
- package/docs/_macro.load-component-params.njk +2 -2
- package/docs/_macro.load-component-template.njk +3 -3
- package/docs/_macro.render-caller.njk +3 -3
- package/docs/_macro.show-code-from-file.njk +57 -57
- package/docs/_macro.show-html-from-file.njk +42 -42
- package/docs/_template.default.njk +8 -8
- package/docs/_template.examples.njk +13 -13
- package/docs/catalogo.html +27 -27
- package/docs/componentes.html +187 -184
- package/docs/ds/_ds.example.accordion.njk +109 -109
- package/docs/ds/_ds.example.border.njk +39 -39
- package/docs/ds/_ds.example.botones-alert-sm.njk +264 -264
- package/docs/ds/_ds.example.botones-alert.njk +264 -264
- package/docs/ds/_ds.example.botones-default-sm.njk +264 -264
- package/docs/ds/_ds.example.botones-default.njk +258 -258
- package/docs/ds/_ds.example.botones-primary-lg.njk +264 -264
- package/docs/ds/_ds.example.botones-primary-sm.njk +264 -264
- package/docs/ds/_ds.example.botones-primary.njk +264 -264
- package/docs/ds/_ds.example.botones-transparent-sm.njk +264 -264
- package/docs/ds/_ds.example.botones-transparent.njk +264 -264
- package/docs/ds/_ds.example.breadcrumbs.njk +65 -65
- package/docs/ds/_ds.example.card.njk +198 -198
- package/docs/ds/_ds.example.checkboxes.njk +377 -377
- package/docs/ds/_ds.example.collapsible.njk +18 -18
- package/docs/ds/_ds.example.color-de-interaccion.njk +16 -16
- package/docs/ds/_ds.example.colores-cabecera.njk +15 -15
- package/docs/ds/_ds.example.colores-de-soporte.njk +82 -82
- package/docs/ds/_ds.example.colores-neutros.njk +26 -26
- package/docs/ds/_ds.example.combobox.njk +91 -0
- package/docs/ds/_ds.example.date-input.njk +363 -363
- package/docs/ds/_ds.example.description-list.njk +289 -289
- package/docs/ds/_ds.example.details.njk +23 -23
- package/docs/ds/_ds.example.dropdowns-default.njk +186 -186
- package/docs/ds/_ds.example.dropdowns-en-uso.njk +105 -105
- package/docs/ds/_ds.example.dropdowns-variaciones.njk +224 -224
- package/docs/ds/_ds.example.error-summary.njk +34 -34
- package/docs/ds/_ds.example.file-upload.njk +54 -54
- package/docs/ds/_ds.example.footer.njk +28 -28
- package/docs/ds/_ds.example.header-advanced.njk +70 -70
- package/docs/ds/_ds.example.header.njk +211 -211
- package/docs/ds/_ds.example.input-group.njk +242 -242
- package/docs/ds/_ds.example.input.njk +164 -164
- package/docs/ds/_ds.example.item.njk +176 -176
- package/docs/ds/_ds.example.layout-escritorio.njk +38 -38
- package/docs/ds/_ds.example.layout-movil.njk +14 -14
- package/docs/ds/_ds.example.layout-sidebar.njk +11 -11
- package/docs/ds/_ds.example.links-list.njk +170 -170
- package/docs/ds/_ds.example.listbox-default.njk +677 -677
- package/docs/ds/_ds.example.listbox-variaciones.njk +824 -824
- package/docs/ds/_ds.example.menu-horizontal.njk +66 -66
- package/docs/ds/_ds.example.menu-navigation.njk +493 -493
- package/docs/ds/_ds.example.menu-vertical.njk +129 -129
- package/docs/ds/_ds.example.menubar-en-uso.njk +244 -244
- package/docs/ds/_ds.example.menubar-variaciones.njk +785 -785
- package/docs/ds/_ds.example.modal.njk +210 -210
- package/docs/ds/_ds.example.nav.njk +158 -158
- package/docs/ds/_ds.example.notification.njk +122 -122
- package/docs/ds/_ds.example.pagination.njk +190 -190
- package/docs/ds/_ds.example.pills.njk +215 -215
- package/docs/ds/_ds.example.radios.njk +419 -419
- package/docs/ds/_ds.example.searchbar.njk +87 -87
- package/docs/ds/_ds.example.select.njk +390 -390
- package/docs/ds/_ds.example.status-item.njk +239 -239
- package/docs/ds/_ds.example.status.njk +47 -47
- package/docs/ds/_ds.example.table.njk +740 -740
- package/docs/ds/_ds.example.tabs.njk +136 -136
- package/docs/ds/_ds.example.textarea.njk +237 -237
- package/docs/ds/_ds.example.textos.njk +32 -32
- package/docs/ds/_ds.example.toggle.njk +75 -75
- package/docs/ds/_ds.example.tree.njk +456 -456
- package/docs/ds/_ds.example.treegrid.njk +810 -810
- package/docs/ds/_ds.example.typography.njk +225 -225
- package/docs/ds/_ds.macro.code-snippet.njk +32 -32
- package/docs/ds/_ds.macro.section-title.njk +2 -2
- package/docs/ds/_ds.macro.subsection-title.njk +2 -2
- package/docs/ds/_ds.section.avisos.njk +22 -22
- package/docs/ds/_ds.section.botones.njk +53 -53
- package/docs/ds/_ds.section.campo-y-area-de-texto.njk +19 -19
- package/docs/ds/_ds.section.color.njk +147 -147
- package/docs/ds/_ds.section.datos.njk +42 -42
- package/docs/ds/_ds.section.dropdowns.njk +23 -23
- package/docs/ds/_ds.section.espaciado.njk +296 -296
- package/docs/ds/_ds.section.forms.njk +73 -68
- package/docs/ds/_ds.section.informacion.njk +12 -12
- package/docs/ds/_ds.section.layout.njk +63 -63
- package/docs/ds/_ds.section.menubar.njk +18 -18
- package/docs/ds/_ds.section.mostrar-ocultar.njk +33 -33
- package/docs/ds/_ds.section.navigation.njk +57 -57
- package/docs/ds/_ds.section.textos.njk +287 -287
- package/docs/ds/_ds.section.typography.njk +28 -28
- package/docs/estilos.html +37 -37
- package/docs/examples-accordion-history.html +8 -8
- package/docs/examples-accordion.html +8 -8
- package/docs/examples-alert.html +8 -8
- package/docs/examples-breadcrumbs.html +8 -8
- package/docs/examples-button-loader.html +8 -8
- package/docs/examples-button.html +8 -8
- package/docs/examples-card.html +8 -8
- package/docs/examples-character-count.html +8 -8
- package/docs/examples-checkboxes.html +8 -8
- package/docs/examples-collapsible.html +8 -8
- package/docs/examples-combobox.html +8 -0
- package/docs/examples-date-input.html +8 -8
- package/docs/examples-datepicker.html +8 -8
- package/docs/examples-description-list.html +8 -8
- package/docs/examples-details.html +8 -8
- package/docs/examples-dialog.html +8 -8
- package/docs/examples-dropdown.html +8 -8
- package/docs/examples-error-message.html +8 -8
- package/docs/examples-error-summary.html +8 -8
- package/docs/examples-fieldset.html +8 -8
- package/docs/examples-file-upload.html +8 -8
- package/docs/examples-footer.html +8 -8
- package/docs/examples-header-advanced.html +8 -8
- package/docs/examples-header-mini.html +8 -8
- package/docs/examples-header.html +8 -8
- package/docs/examples-hint.html +8 -8
- package/docs/examples-input-group.html +8 -8
- package/docs/examples-input.html +8 -8
- package/docs/examples-item.html +8 -8
- package/docs/examples-label.html +8 -8
- package/docs/examples-links-list.html +8 -8
- package/docs/examples-listbox.html +8 -8
- package/docs/examples-media-object.html +8 -8
- package/docs/examples-menu-horizontal.html +8 -8
- package/docs/examples-menu-navigation.html +8 -8
- package/docs/examples-menu-vertical.html +8 -8
- package/docs/examples-menubar.html +8 -8
- package/docs/examples-modal.html +8 -8
- package/docs/examples-nav.html +8 -8
- package/docs/examples-notification.html +8 -8
- package/docs/examples-pagination.html +8 -8
- package/docs/examples-pill.html +8 -8
- package/docs/examples-radios.html +8 -8
- package/docs/examples-searchbar.html +8 -8
- package/docs/examples-select.html +8 -8
- package/docs/examples-skip-link.html +8 -8
- package/docs/examples-spinner.html +8 -8
- package/docs/examples-status-item.html +8 -8
- package/docs/examples-status.html +8 -8
- package/docs/examples-table-advanced.html +8 -8
- package/docs/examples-table.html +8 -8
- package/docs/examples-tabs.html +8 -8
- package/docs/examples-textarea.html +8 -8
- package/docs/examples-toggle.html +8 -8
- package/docs/examples-tooltip.html +8 -8
- package/docs/examples-tree.html +8 -8
- package/docs/examples-treegrid.html +8 -8
- package/docs/index.html +914 -908
- package/docs/pagina-accesibilidad.html +110 -110
- package/docs/pagina-mapa-web.html +137 -137
- package/docs/pagina-prueba.html +95 -95
- package/docs/plantilla-con-header-advanced.html +14 -14
- package/docs/plantilla-editar-con-cabecera-fija-y-sidebar-sticky.html +154 -154
- package/docs/plantilla-editar-con-cabecera-fija.html +17 -17
- package/docs/plantilla-logueado-con-cabecera-fija-headroom.html +15 -15
- package/docs/plantilla-logueado-con-cabecera-fija.html +15 -15
- package/docs/plantilla-logueado-con-selector-de-app-y-sidebar.html +164 -164
- package/docs/plantilla-logueado-con-selector-de-app-y-subheader.html +16 -16
- package/docs/plantilla-logueado-con-selector-de-app.html +14 -14
- package/docs/plantilla-logueado-con-titulo-de-app.html +14 -14
- package/docs/plantilla-sin-loguear.html +14 -14
- package/docs/plantillas.html +89 -89
- package/docs/spinner-plantilla-con-header-advanced.html +2 -2
- package/docs/spinner-plantilla-editar-con-cabecera-fija.html +4 -4
- package/docs/spinner-plantilla-logueado-con-cabecera-fija.html +2 -2
- package/docs/spinner-plantilla-logueado-con-selector-de-app-y-subheader.html +2 -2
- package/docs/spinner-plantilla-logueado-con-titulo-de-app.html +2 -2
- package/docs/spinner-plantilla-sin-loguear.html +18 -18
- package/docs/sprints/01-combobox-template.md +433 -0
- package/docs/sprints/02-combobox-styles.md +291 -0
- package/docs/sprints/03-combobox-javascript.md +589 -0
- package/docs/sprints/04-combobox-integration.md +386 -0
- package/docs/sprints/05-combobox-refinamiento-w3c.md +55 -0
- package/package.json +61 -61
- package/public/images/demo-icon.svg +9 -9
- package/replit.md +74 -74
- package/src/EUPL-1.2.txt +287 -287
- package/src/css/base.css +44 -44
- package/src/css/component.form-group.css +24 -24
- package/src/css/component.headroom.css +32 -32
- package/src/css/component.text.css +169 -169
- package/src/css/styles.css +247 -246
- package/src/js/aria/MenuHorizontal.js +65 -65
- package/src/js/aria/MenuNavigation.js +34 -2
- package/src/js/aria/MenuVertical.js +60 -60
- package/src/js/aria/Nav.js +60 -60
- package/src/js/aria/PopupMenuAction.js +30 -12
- package/src/js/aria/accordion.js +264 -264
- package/src/js/aria/checkBoxes.js +52 -52
- package/src/js/aria/collapsible.js +44 -44
- package/src/js/aria/combobox.js +584 -0
- package/src/js/aria/dataGrid.js +950 -950
- package/src/js/aria/linksList.js +42 -42
- package/src/js/aria/notification.js +56 -56
- package/src/js/aria/radioButton.js +50 -50
- package/src/js/aria/toggle.js +61 -61
- package/src/js/aria/treegrid.js +507 -507
- package/src/js/aria/utils.js +219 -219
- package/src/js/desy-html.js +860 -813
- package/src/js/headroom.min.js +6 -6
- package/src/js/index.js +74 -72
- package/src/main.js +2 -2
- package/src/templates/components/accordion/_examples.accordion.njk +482 -482
- package/src/templates/components/accordion/_macro.accordion.njk +3 -3
- package/src/templates/components/accordion/_template.accordion.njk +131 -131
- package/src/templates/components/accordion/params.accordion.yaml +125 -125
- package/src/templates/components/accordion-history/_examples.accordion-history.njk +521 -521
- package/src/templates/components/accordion-history/_macro.accordion-history.njk +3 -3
- package/src/templates/components/accordion-history/_template.accordion-history.njk +193 -193
- package/src/templates/components/accordion-history/params.accordion-history.yaml +129 -129
- package/src/templates/components/alert/_examples.alert.njk +91 -91
- package/src/templates/components/alert/_macro.alert.njk +3 -3
- package/src/templates/components/alert/_styles.alert.css +9 -9
- package/src/templates/components/alert/_template.alert.njk +16 -16
- package/src/templates/components/alert/params.alert.yaml +25 -25
- package/src/templates/components/breadcrumbs/_examples.breadcrumbs.njk +464 -464
- package/src/templates/components/breadcrumbs/_macro.breadcrumbs.njk +3 -3
- package/src/templates/components/breadcrumbs/_styles.breadcrumbs.css +81 -81
- package/src/templates/components/breadcrumbs/_template.breadcrumbs.njk +77 -77
- package/src/templates/components/breadcrumbs/params.breadcrumbs.yaml +44 -44
- package/src/templates/components/button/_examples.button.njk +518 -511
- package/src/templates/components/button/_macro.button.njk +3 -3
- package/src/templates/components/button/_styles.button.css +180 -180
- package/src/templates/components/button/_template.button.njk +49 -49
- package/src/templates/components/button/params.button.yaml +48 -48
- package/src/templates/components/button-loader/_examples.button-loader.njk +499 -492
- package/src/templates/components/button-loader/_macro.button-loader.njk +3 -3
- package/src/templates/components/button-loader/_styles.button-loader.css +194 -194
- package/src/templates/components/button-loader/_template.button-loader.njk +84 -84
- package/src/templates/components/button-loader/params.button-loader.yaml +74 -74
- package/src/templates/components/card/_examples.card.njk +381 -381
- package/src/templates/components/card/_macro.card.njk +3 -3
- package/src/templates/components/card/_template.card.njk +34 -34
- package/src/templates/components/card/params.card.yaml +112 -112
- package/src/templates/components/character-count/_examples.character-count.njk +195 -195
- package/src/templates/components/character-count/_macro.character-count.njk +5 -5
- package/src/templates/components/character-count/_template.character-count.njk +38 -38
- package/src/templates/components/character-count/params.character-count.yaml +77 -77
- package/src/templates/components/checkboxes/_examples.checkboxes.njk +835 -835
- package/src/templates/components/checkboxes/_macro.checkboxes.njk +3 -3
- package/src/templates/components/checkboxes/_styles.checkboxes.css +30 -30
- package/src/templates/components/checkboxes/_template.checkboxes.njk +137 -137
- package/src/templates/components/checkboxes/params.checkboxes.yaml +116 -116
- package/src/templates/components/collapsible/_examples.collapsible.njk +107 -107
- package/src/templates/components/collapsible/_macro.collapsible.njk +3 -3
- package/src/templates/components/collapsible/_styles.collapsible.css +35 -35
- package/src/templates/components/collapsible/_template.collapsible.njk +17 -17
- package/src/templates/components/collapsible/params.collapsible.yaml +48 -48
- package/src/templates/components/combobox/_examples.combobox.njk +440 -0
- package/src/templates/components/combobox/_macro.combobox.njk +3 -0
- package/src/templates/components/combobox/_styles.combobox.css +92 -0
- package/src/templates/components/combobox/_template.combobox.njk +97 -0
- package/src/templates/components/combobox/params.combobox.yaml +102 -0
- package/src/templates/components/date-input/_examples.date-input.njk +578 -578
- package/src/templates/components/date-input/_macro.date-input.njk +3 -3
- package/src/templates/components/date-input/_template.date-input.njk +125 -125
- package/src/templates/components/date-input/params.date-input.yaml +97 -97
- package/src/templates/components/datepicker/_examples.datepicker.njk +415 -415
- package/src/templates/components/datepicker/_macro.datepicker.njk +3 -3
- package/src/templates/components/datepicker/_styles.datepicker.css +87 -87
- package/src/templates/components/datepicker/_template.datepicker.njk +129 -129
- package/src/templates/components/datepicker/params.datepicker.yaml +104 -104
- package/src/templates/components/description-list/_examples.description-list.njk +502 -502
- package/src/templates/components/description-list/_macro.description-list.njk +3 -3
- package/src/templates/components/description-list/_template.description-list.njk +17 -17
- package/src/templates/components/description-list/params.description-list.yaml +61 -61
- package/src/templates/components/details/_examples.details.njk +68 -68
- package/src/templates/components/details/_macro.details.njk +3 -3
- package/src/templates/components/details/_template.details.njk +17 -17
- package/src/templates/components/details/params.details.yaml +40 -40
- package/src/templates/components/dialog/_examples.dialog.njk +156 -156
- package/src/templates/components/dialog/_macro.dialog.njk +3 -3
- package/src/templates/components/dialog/_styles.dialog.css +27 -27
- package/src/templates/components/dialog/_template.dialog.njk +12 -12
- package/src/templates/components/dialog/params.dialog.yaml +25 -25
- package/src/templates/components/dropdown/_examples.dropdown.njk +226 -226
- package/src/templates/components/dropdown/_macro.dropdown.njk +3 -3
- package/src/templates/components/dropdown/_styles.dropdown.css +191 -191
- package/src/templates/components/dropdown/_template.dropdown.njk +34 -34
- package/src/templates/components/dropdown/params.dropdown.yaml +32 -32
- package/src/templates/components/error-message/_examples.error-message.njk +28 -28
- package/src/templates/components/error-message/_macro.error-message.njk +5 -5
- package/src/templates/components/error-message/_template.error-message.njk +8 -8
- package/src/templates/components/error-message/params.error-message.yaml +23 -23
- package/src/templates/components/error-summary/_examples.error-summary.njk +111 -111
- package/src/templates/components/error-summary/_macro.error-summary.njk +5 -5
- package/src/templates/components/error-summary/_template.error-summary.njk +48 -48
- package/src/templates/components/error-summary/params.error-summary.yaml +50 -50
- package/src/templates/components/fieldset/_examples.fieldset.njk +79 -79
- package/src/templates/components/fieldset/_macro.fieldset.njk +2 -2
- package/src/templates/components/fieldset/_template.fieldset.njk +46 -46
- package/src/templates/components/fieldset/params.fieldset.yaml +49 -49
- package/src/templates/components/file-upload/_examples.file-upload.njk +103 -103
- package/src/templates/components/file-upload/_macro.file-upload.njk +2 -2
- package/src/templates/components/file-upload/_template.file-upload.njk +45 -45
- package/src/templates/components/file-upload/params.file-upload.yaml +48 -48
- package/src/templates/components/footer/_examples.footer.njk +558 -558
- package/src/templates/components/footer/_macro.footer.njk +3 -3
- package/src/templates/components/footer/_styles.footer.css +43 -43
- package/src/templates/components/footer/_template.footer.njk +130 -130
- package/src/templates/components/footer/params.footer.yaml +140 -140
- package/src/templates/components/header/_examples.header.njk +627 -627
- package/src/templates/components/header/_macro.header.header__dropdown.njk +3 -3
- package/src/templates/components/header/_macro.header.header__navigation.njk +3 -3
- package/src/templates/components/header/_macro.header.header__offcanvas.njk +3 -3
- package/src/templates/components/header/_macro.header.header__offcanvasButton.njk +3 -3
- package/src/templates/components/header/_macro.header.header__subnav.njk +3 -3
- package/src/templates/components/header/_macro.header.njk +3 -3
- package/src/templates/components/header/_styles.header.css +12 -12
- package/src/templates/components/header/_template.header.header__dropdown.njk +27 -27
- package/src/templates/components/header/_template.header.header__navigation.njk +25 -25
- package/src/templates/components/header/_template.header.header__offcanvas.njk +20 -20
- package/src/templates/components/header/_template.header.header__offcanvasButton.njk +10 -10
- package/src/templates/components/header/_template.header.header__subnav.njk +33 -33
- package/src/templates/components/header/_template.header.njk +155 -155
- package/src/templates/components/header/params.header.yaml +295 -295
- package/src/templates/components/header-advanced/_examples.header-advanced.njk +1110 -1110
- package/src/templates/components/header-advanced/_macro.header-advanced.njk +3 -3
- package/src/templates/components/header-advanced/_template.header-advanced.njk +171 -171
- package/src/templates/components/header-advanced/params.header-advanced.yaml +352 -352
- package/src/templates/components/header-mini/_examples.header-mini.njk +319 -316
- package/src/templates/components/header-mini/_macro.header-mini.njk +3 -3
- package/src/templates/components/header-mini/_template.header-mini.njk +51 -51
- package/src/templates/components/header-mini/params.header-mini.yaml +90 -90
- package/src/templates/components/hint/_examples.hint.njk +26 -26
- package/src/templates/components/hint/_macro.hint.njk +3 -3
- package/src/templates/components/hint/_template.hint.njk +3 -3
- package/src/templates/components/hint/params.hint.yaml +21 -21
- package/src/templates/components/input/_examples.input.njk +393 -393
- package/src/templates/components/input/_macro.input.njk +3 -3
- package/src/templates/components/input/_styles.input.css +17 -17
- package/src/templates/components/input/_template.input.njk +53 -53
- package/src/templates/components/input/params.input.yaml +80 -80
- package/src/templates/components/input-group/_examples.input-group.njk +558 -558
- package/src/templates/components/input-group/_macro.input-group.njk +3 -3
- package/src/templates/components/input-group/_template.input-group.njk +107 -107
- package/src/templates/components/input-group/params.input-group.yaml +123 -123
- package/src/templates/components/item/_examples.item.njk +370 -370
- package/src/templates/components/item/_macro.item.njk +3 -3
- package/src/templates/components/item/_template.item.njk +73 -73
- package/src/templates/components/item/params.item.yaml +101 -101
- package/src/templates/components/label/_examples.label.njk +58 -58
- package/src/templates/components/label/_macro.label.njk +5 -5
- package/src/templates/components/label/_template.label.njk +37 -37
- package/src/templates/components/label/params.label.yaml +28 -28
- package/src/templates/components/links-list/_examples.links-list.njk +761 -761
- package/src/templates/components/links-list/_macro.links-list.njk +3 -3
- package/src/templates/components/links-list/_template.links-list.njk +119 -119
- package/src/templates/components/links-list/params.links-list.yaml +101 -101
- package/src/templates/components/listbox/_examples.listbox.njk +813 -812
- package/src/templates/components/listbox/_macro.listbox.njk +3 -3
- package/src/templates/components/listbox/_styles.listbox.css +218 -218
- package/src/templates/components/listbox/_template.listbox.njk +90 -90
- package/src/templates/components/listbox/params.listbox.yaml +85 -85
- package/src/templates/components/media-object/_examples.media-object.njk +79 -79
- package/src/templates/components/media-object/_macro.media-object.njk +3 -3
- package/src/templates/components/media-object/_template.media-object.njk +21 -21
- package/src/templates/components/media-object/params.media-object.yaml +16 -16
- package/src/templates/components/menu-horizontal/_examples.menu-horizontal.njk +613 -613
- package/src/templates/components/menu-horizontal/_macro.menu-horizontal.njk +3 -3
- package/src/templates/components/menu-horizontal/_styles.menu-horizontal.css +167 -167
- package/src/templates/components/menu-horizontal/_template.menu-horizontal.njk +36 -36
- package/src/templates/components/menu-horizontal/params.menu-horizontal.yaml +53 -53
- package/src/templates/components/menu-navigation/_examples.menu-navigation.njk +1292 -1292
- package/src/templates/components/menu-navigation/_macro.menu-navigation.njk +3 -3
- package/src/templates/components/menu-navigation/_styles.menu-navigation.css +238 -238
- package/src/templates/components/menu-navigation/_template.menu-navigation.njk +87 -87
- package/src/templates/components/menu-navigation/params.menu-navigation.yaml +86 -86
- package/src/templates/components/menu-vertical/_examples.menu-vertical.njk +835 -835
- package/src/templates/components/menu-vertical/_macro.menu-vertical.njk +3 -3
- package/src/templates/components/menu-vertical/_template.menu-vertical.njk +92 -92
- package/src/templates/components/menu-vertical/params.menu-vertical.yaml +77 -77
- package/src/templates/components/menubar/_examples.menubar.njk +1843 -1843
- package/src/templates/components/menubar/_macro.menubar.njk +3 -3
- package/src/templates/components/menubar/_styles.menubar.css +259 -259
- package/src/templates/components/menubar/_template.menubar.njk +106 -106
- package/src/templates/components/menubar/params.menubar.yaml +130 -130
- package/src/templates/components/modal/_examples.modal.njk +432 -432
- package/src/templates/components/modal/_macro.modal.njk +3 -3
- package/src/templates/components/modal/_template.modal.njk +129 -129
- package/src/templates/components/modal/params.modal.yaml +77 -77
- package/src/templates/components/nav/_examples.nav.njk +468 -468
- package/src/templates/components/nav/_macro.nav.njk +3 -3
- package/src/templates/components/nav/_template.nav.njk +53 -53
- package/src/templates/components/nav/params.nav.yaml +61 -61
- package/src/templates/components/notification/_examples.notification.njk +277 -277
- package/src/templates/components/notification/_macro.notification.njk +3 -3
- package/src/templates/components/notification/_styles.notification.css +30 -30
- package/src/templates/components/notification/_template.notification.njk +86 -86
- package/src/templates/components/notification/params.notification.yaml +101 -101
- package/src/templates/components/pagination/_examples.pagination.njk +444 -444
- package/src/templates/components/pagination/_macro.pagination.njk +3 -3
- package/src/templates/components/pagination/_template.pagination.njk +162 -162
- package/src/templates/components/pagination/params.pagination.yaml +150 -150
- package/src/templates/components/pill/_examples.pill.njk +180 -180
- package/src/templates/components/pill/_macro.pill.njk +3 -3
- package/src/templates/components/pill/_styles.pill.css +59 -59
- package/src/templates/components/pill/_template.pill.njk +38 -38
- package/src/templates/components/pill/params.pill.yaml +28 -28
- package/src/templates/components/radios/_examples.radios.njk +698 -698
- package/src/templates/components/radios/_macro.radios.njk +5 -5
- package/src/templates/components/radios/_styles.radios.css +30 -30
- package/src/templates/components/radios/_template.radios.njk +133 -133
- package/src/templates/components/radios/params.radios.yaml +104 -104
- package/src/templates/components/searchbar/_examples.searchbar.njk +147 -147
- package/src/templates/components/searchbar/_macro.searchbar.njk +3 -3
- package/src/templates/components/searchbar/_template.searchbar.njk +45 -45
- package/src/templates/components/searchbar/params.searchbar.yaml +46 -46
- package/src/templates/components/select/_examples.select.njk +364 -364
- package/src/templates/components/select/_macro.select.njk +5 -5
- package/src/templates/components/select/_styles.select.css +45 -45
- package/src/templates/components/select/_template.select.njk +67 -67
- package/src/templates/components/select/params.select.yaml +93 -93
- package/src/templates/components/skip-link/_examples.skip-link.njk +31 -31
- package/src/templates/components/skip-link/_macro.skip-link.njk +3 -3
- package/src/templates/components/skip-link/_styles.skip-link.css +12 -12
- package/src/templates/components/skip-link/_template.skip-link.njk +4 -4
- package/src/templates/components/skip-link/params.skip-link.yaml +20 -20
- package/src/templates/components/spinner/_examples.spinner.njk +91 -101
- package/src/templates/components/spinner/_macro.spinner.njk +3 -3
- package/src/templates/components/spinner/_styles.spinner.css +33 -33
- package/src/templates/components/spinner/_template.spinner.njk +12 -12
- package/src/templates/components/spinner/params.spinner.yaml +12 -12
- package/src/templates/components/status/_examples.status.njk +80 -80
- package/src/templates/components/status/_macro.status.njk +3 -3
- package/src/templates/components/status/_template.status.njk +23 -23
- package/src/templates/components/status/params.status.yaml +24 -24
- package/src/templates/components/status-item/_examples.status-item.njk +319 -319
- package/src/templates/components/status-item/_macro.status-item.njk +3 -3
- package/src/templates/components/status-item/_template.status-item.njk +99 -99
- package/src/templates/components/status-item/params.status-item.yaml +106 -106
- package/src/templates/components/table/_examples.table.njk +705 -705
- package/src/templates/components/table/_macro.table.njk +3 -3
- package/src/templates/components/table/_styles.table.css +19 -19
- package/src/templates/components/table/_template.table.njk +68 -68
- package/src/templates/components/table/params.table.yaml +130 -130
- package/src/templates/components/table-advanced/_examples.table-advanced.njk +839 -839
- package/src/templates/components/table-advanced/_macro.table-advanced.njk +3 -3
- package/src/templates/components/table-advanced/_styles.table-advanced.css +63 -63
- package/src/templates/components/table-advanced/_template.table-advanced.njk +210 -210
- package/src/templates/components/table-advanced/params.table-advanced.yaml +160 -160
- package/src/templates/components/tabs/_examples.tabs.njk +588 -588
- package/src/templates/components/tabs/_macro.tabs.njk +3 -3
- package/src/templates/components/tabs/_styles.tabs.css +132 -132
- package/src/templates/components/tabs/_template.tabs.njk +70 -70
- package/src/templates/components/tabs/params.tabs.yaml +83 -83
- package/src/templates/components/textarea/_examples.textarea.njk +174 -174
- package/src/templates/components/textarea/_macro.textarea.njk +5 -5
- package/src/templates/components/textarea/_template.textarea.njk +47 -47
- package/src/templates/components/textarea/params.textarea.yaml +64 -64
- package/src/templates/components/toggle/_examples.toggle.njk +248 -248
- package/src/templates/components/toggle/_macro.toggle.njk +3 -3
- package/src/templates/components/toggle/_styles.toggle.css +31 -31
- package/src/templates/components/toggle/_template.toggle.njk +27 -27
- package/src/templates/components/toggle/params.toggle.yaml +69 -69
- package/src/templates/components/tooltip/_examples.tooltip.njk +134 -134
- package/src/templates/components/tooltip/_macro.tooltip.njk +3 -3
- package/src/templates/components/tooltip/_styles.tooltip.css +9 -9
- package/src/templates/components/tooltip/_template.tooltip.njk +40 -40
- package/src/templates/components/tooltip/params.tooltip.yaml +40 -40
- package/src/templates/components/tree/_examples.tree.njk +2671 -2671
- package/src/templates/components/tree/_macro.tree.njk +3 -3
- package/src/templates/components/tree/_styles.tree.css +54 -54
- package/src/templates/components/tree/_template.tree.njk +232 -232
- package/src/templates/components/tree/params.tree.yaml +173 -173
- package/src/templates/components/treegrid/_examples.treegrid.njk +1269 -1269
- package/src/templates/components/treegrid/_macro.treegrid.njk +3 -3
- package/src/templates/components/treegrid/_styles.treegrid.css +31 -31
- package/src/templates/components/treegrid/_template.treegrid.njk +90 -90
- package/src/templates/components/treegrid/params.treegrid.yaml +131 -131
- package/src/templates/includes/_abrir-notificaciones-extra.njk +2 -2
- package/src/templates/includes/_abrir-notificaciones.njk +2 -2
- package/src/templates/includes/_acciones-de-cabecera.njk +28 -28
- package/src/templates/includes/_ejemplo-titulo-h2-parrafo.njk +4 -4
- package/src/templates/includes/_ejemplo-titulo-parrafo.njk +4 -4
- package/src/templates/includes/_test-include.njk +13 -13
- package/src/templates/pages/_page.foot-headroom.njk +30 -30
- package/src/templates/pages/_page.foot.njk +5 -5
- package/src/templates/pages/_page.footer.njk +19 -19
- package/src/templates/pages/_page.head.njk +27 -27
- package/src/templates/pages/_page.notification-edit-inner-content.njk +31 -31
- package/src/templates/pages/_page.notification-edit.njk +30 -30
- package/src/templates/pages/_page.notification-footer.njk +32 -32
- package/src/templates/pages/_page.notification-header-fixed.njk +30 -30
- package/src/templates/pages/_page.notification-header.njk +31 -31
- package/src/templates/pages/_page.sidebar-content.njk +20 -20
- package/src/templates/pages/_page.spinner-block.njk +14 -14
- package/src/templates/pages/_page.spinner-show.njk +15 -15
- package/src/templates/pages/_page.spinner.njk +15 -15
- package/src/templates/pages/_template.edit-fixed-with-sticky-sidebar.njk +36 -36
- package/src/templates/pages/_template.edit-fixed.njk +74 -74
- package/src/templates/pages/_template.home.njk +111 -111
- package/src/templates/pages/_template.logged-out.njk +56 -56
- package/src/templates/pages/_template.logged-selector-fixed-headroom.njk +198 -198
- package/src/templates/pages/_template.logged-selector-fixed.njk +195 -195
- package/src/templates/pages/_template.logged-selector-subheader.njk +80 -80
- package/src/templates/pages/_template.logged-selector-with-sidebar.njk +28 -28
- package/src/templates/pages/_template.logged-selector.njk +195 -195
- package/src/templates/pages/_template.logged.njk +141 -141
- package/src/templates/pages/_template.mfe-iframe-content.njk +31 -31
- package/src/templates/pages/_template.mfe.njk +83 -83
- package/src/templates/pages/_template.test.njk +48 -48
- package/src/templates/pages/_template.with-header-advanced.njk +311 -311
- package/vite.config.js +982 -982
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
# Fase 1: Combobox - Nunjucks Templates + ARIA HTML
|
|
2
|
+
|
|
3
|
+
## Deliverables
|
|
4
|
+
|
|
5
|
+
Archivos a crear:
|
|
6
|
+
|
|
7
|
+
| Archivo | Descripcion |
|
|
8
|
+
|---------|-------------|
|
|
9
|
+
| `src/templates/components/combobox/_macro.combobox.njk` | Macro Nunjucks (entry point) |
|
|
10
|
+
| `src/templates/components/combobox/_template.combobox.njk` | Template HTML con ARIA |
|
|
11
|
+
| `src/templates/components/combobox/params.combobox.yaml` | Schema de parametros YAML |
|
|
12
|
+
|
|
13
|
+
## Dependencias
|
|
14
|
+
|
|
15
|
+
- Ninguna. Esta es la primera fase.
|
|
16
|
+
|
|
17
|
+
## PROMPT
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
Eres un desarrollador frontend especializado en design systems accesibles. Vas a crear el template Nunjucks y schema YAML para un componente combobox con autocomplete en el proyecto desy-html (Design System del Gobierno de Aragon).
|
|
21
|
+
|
|
22
|
+
## Contexto del proyecto
|
|
23
|
+
|
|
24
|
+
desy-html es un design system basado en Nunjucks + Tailwind CSS v4. Los componentes siguen un patron consistente:
|
|
25
|
+
- Macro en `_macro.{component}.njk` que incluye el template
|
|
26
|
+
- Template en `_template.{component}.njk` con el HTML
|
|
27
|
+
- Parametros en `params.{component}.yaml` con el schema
|
|
28
|
+
|
|
29
|
+
## MCP Server DESY
|
|
30
|
+
|
|
31
|
+
Antes de implementar, consulta las guias del design system usando las herramientas MCP:
|
|
32
|
+
1. Usa `mcp__DESY-MCP-Server__list_categories` para ver categorias disponibles
|
|
33
|
+
2. Usa `mcp__DESY-MCP-Server__get_guideline` para obtener guias de:
|
|
34
|
+
- Formularios (patrones de form integration)
|
|
35
|
+
- Accesibilidad (requisitos WCAG 2.2 AA)
|
|
36
|
+
- Componentes interactivos (patrones ARIA)
|
|
37
|
+
|
|
38
|
+
## Skills y agentes disponibles
|
|
39
|
+
|
|
40
|
+
- Usa la skill `desy` para consultar patrones del design system
|
|
41
|
+
- Usa la skill `ux-designer` para decisiones de UX/accesibilidad
|
|
42
|
+
- Al finalizar, usa el agente `code-refactoring:code-reviewer` para revisar calidad del codigo
|
|
43
|
+
|
|
44
|
+
## Patron W3C de referencia
|
|
45
|
+
|
|
46
|
+
El componente sigue el patron WAI-ARIA APG "combobox-autocomplete-both":
|
|
47
|
+
- URL: https://www.w3.org/WAI/ARIA/apg/patterns/combobox/
|
|
48
|
+
- Roles: combobox (input), listbox (popup), option (items)
|
|
49
|
+
- Estados: aria-expanded, aria-activedescendant, aria-selected, aria-autocomplete
|
|
50
|
+
|
|
51
|
+
## Decisiones de diseno
|
|
52
|
+
|
|
53
|
+
| Aspecto | Decision |
|
|
54
|
+
|---------|----------|
|
|
55
|
+
| Relacion con existentes | Componente nuevo independiente (no extiende select ni listbox) |
|
|
56
|
+
| Origen de datos | Solo estatico (HTML), sin fetch remoto |
|
|
57
|
+
| Modos autocomplete | 'list' y 'both' (configurable via parametro) |
|
|
58
|
+
| Seleccion | Unica (arquitectura preparada para multiple futura) |
|
|
59
|
+
| Contenido opciones | Solo texto plano |
|
|
60
|
+
| Integracion formulario | Composicion interna con label, hint, error-message |
|
|
61
|
+
| Grupos | Sin soporte de grupos |
|
|
62
|
+
| Form submit | Hidden input nativo para enviar el valor |
|
|
63
|
+
| Clear button | Siempre visible cuando hay texto, en tab order |
|
|
64
|
+
| Toggle button | No incluir (apertura via teclado/escritura) |
|
|
65
|
+
| Sin resultados | Mensaje visible en popup (texto configurable) |
|
|
66
|
+
| Disabled | Solo combobox completo (no opciones individuales) |
|
|
67
|
+
| Valor por defecto | Via parametro del macro |
|
|
68
|
+
| Value/Label | Iguales (el texto visible es el valor enviado) |
|
|
69
|
+
|
|
70
|
+
## Archivos de referencia existentes
|
|
71
|
+
|
|
72
|
+
### Patron macro (copiar estructura):
|
|
73
|
+
Archivo: `src/templates/components/select/_macro.select.njk`
|
|
74
|
+
```njk
|
|
75
|
+
{% macro componentSelect(params) %}
|
|
76
|
+
{% include "./_template.select.njk" %}
|
|
77
|
+
{% endmacro %}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Patron template con form integration (referencia para label/hint/error):
|
|
81
|
+
Archivo: `src/templates/components/select/_template.select.njk`
|
|
82
|
+
|
|
83
|
+
El select template muestra como:
|
|
84
|
+
1. Importar macros de error-message, hint y label
|
|
85
|
+
2. Construir describedBy para aria-describedby
|
|
86
|
+
3. Envolver en div.c-form-group con clase de error condicional
|
|
87
|
+
4. Renderizar label, hint y errorMessage condicionalmente
|
|
88
|
+
5. Aplicar aria-errorMessage y aria-invalid en estado error
|
|
89
|
+
|
|
90
|
+
### Patron YAML de parametros (referencia):
|
|
91
|
+
Archivo: `src/templates/components/select/params.select.yaml`
|
|
92
|
+
|
|
93
|
+
Estructura: array `params` con objetos que tienen name, type, required, description.
|
|
94
|
+
Tipos: string, boolean, array, object. Subcomponentes usan `isComponent: true`.
|
|
95
|
+
|
|
96
|
+
### Patron listbox template (referencia para opciones y tooltip):
|
|
97
|
+
Archivo: `src/templates/components/listbox/_template.listbox.njk`
|
|
98
|
+
|
|
99
|
+
El listbox template muestra como:
|
|
100
|
+
1. Generar IDs para opciones con idPrefix
|
|
101
|
+
2. Detectar item activo (aria-selected, aria-activedescendant)
|
|
102
|
+
3. Renderizar items como `<li role="option">` con clases Tailwind
|
|
103
|
+
4. Usar data-module para inicializacion JS
|
|
104
|
+
5. Estructura: contenedor > button trigger > tooltip popup > ul[role=listbox] > li[role=option]
|
|
105
|
+
|
|
106
|
+
## Especificacion tecnica
|
|
107
|
+
|
|
108
|
+
### 1. Macro: `_macro.combobox.njk`
|
|
109
|
+
|
|
110
|
+
```njk
|
|
111
|
+
{% macro componentCombobox(params) %}
|
|
112
|
+
{% include "./_template.combobox.njk" %}
|
|
113
|
+
{% endmacro %}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 2. Template: `_template.combobox.njk`
|
|
117
|
+
|
|
118
|
+
Estructura HTML objetivo (patron W3C combobox-autocomplete-both):
|
|
119
|
+
|
|
120
|
+
```html
|
|
121
|
+
<!-- combobox -->
|
|
122
|
+
<div class="c-form-group [c-form-group--error]" data-module="c-combobox">
|
|
123
|
+
<label for="{id}" class="...">Label text</label>
|
|
124
|
+
<!-- hint opcional -->
|
|
125
|
+
<p id="{id}-hint" class="...">Hint text</p>
|
|
126
|
+
<!-- error-message opcional -->
|
|
127
|
+
<p id="{id}-error" class="...">Error text</p>
|
|
128
|
+
|
|
129
|
+
<div class="c-combobox relative">
|
|
130
|
+
<div class="c-combobox__input-wrapper relative flex items-center">
|
|
131
|
+
<input
|
|
132
|
+
id="{id}"
|
|
133
|
+
name="{name}"
|
|
134
|
+
type="text"
|
|
135
|
+
role="combobox"
|
|
136
|
+
aria-autocomplete="{autocomplete}"
|
|
137
|
+
aria-expanded="false"
|
|
138
|
+
aria-controls="{id}-listbox"
|
|
139
|
+
aria-describedby="{describedBy}"
|
|
140
|
+
aria-errorMessage="{id}-error"
|
|
141
|
+
aria-invalid="true|false"
|
|
142
|
+
autocomplete="off"
|
|
143
|
+
data-module="c-combobox-input"
|
|
144
|
+
class="c-combobox__input ..."
|
|
145
|
+
value="{defaultValue}"
|
|
146
|
+
/>
|
|
147
|
+
<button
|
|
148
|
+
type="button"
|
|
149
|
+
tabindex="0"
|
|
150
|
+
aria-label="{clearButtonLabel}"
|
|
151
|
+
data-module="c-combobox-clear"
|
|
152
|
+
class="c-combobox__clear ..."
|
|
153
|
+
hidden
|
|
154
|
+
>
|
|
155
|
+
<!-- SVG icono X -->
|
|
156
|
+
</button>
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
<input type="hidden" name="{name}" value="{defaultValue}" data-module="c-combobox-hidden" />
|
|
160
|
+
|
|
161
|
+
<div
|
|
162
|
+
id="{id}-listbox-container"
|
|
163
|
+
class="c-combobox__tooltip hidden ..."
|
|
164
|
+
data-module="c-combobox-tooltip"
|
|
165
|
+
>
|
|
166
|
+
<ul
|
|
167
|
+
id="{id}-listbox"
|
|
168
|
+
role="listbox"
|
|
169
|
+
aria-labelledby="{id}-label"
|
|
170
|
+
data-module="c-combobox-list"
|
|
171
|
+
class="..."
|
|
172
|
+
>
|
|
173
|
+
{% for item in params.items %}
|
|
174
|
+
<li
|
|
175
|
+
id="{id}-option-{index}"
|
|
176
|
+
role="option"
|
|
177
|
+
aria-selected="false"
|
|
178
|
+
class="..."
|
|
179
|
+
data-value="{item.text}"
|
|
180
|
+
>
|
|
181
|
+
{item.text}
|
|
182
|
+
</li>
|
|
183
|
+
{% endfor %}
|
|
184
|
+
</ul>
|
|
185
|
+
<div
|
|
186
|
+
class="c-combobox__no-results hidden ..."
|
|
187
|
+
data-module="c-combobox-no-results"
|
|
188
|
+
role="status"
|
|
189
|
+
aria-live="polite"
|
|
190
|
+
>
|
|
191
|
+
{noResultsText}
|
|
192
|
+
</div>
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
<!-- /combobox -->
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Notas de implementacion:
|
|
200
|
+
- El input visible es `type="text"` con `role="combobox"` y `autocomplete="off"`
|
|
201
|
+
- El hidden input lleva el `name` para form submission (el input visible NO tiene name para evitar duplicados)
|
|
202
|
+
- `aria-autocomplete` acepta "list" o "both" segun parametro `autocomplete`
|
|
203
|
+
- El boton clear usa `hidden` attribute (JS lo muestra cuando hay texto)
|
|
204
|
+
- El popup usa `hidden` class inicialmente (JS controla visibilidad)
|
|
205
|
+
- `data-module` attributes para que JS localice elementos
|
|
206
|
+
- El input visible NO debe tener atributo `name` (solo el hidden input)
|
|
207
|
+
- `aria-controls` apunta al `id` del `<ul>` listbox
|
|
208
|
+
- Los `<li>` llevan `data-value` con el texto para facilitar el filtrado JS
|
|
209
|
+
|
|
210
|
+
### 3. Schema YAML: `params.combobox.yaml`
|
|
211
|
+
|
|
212
|
+
```yaml
|
|
213
|
+
params:
|
|
214
|
+
- name: id
|
|
215
|
+
type: string
|
|
216
|
+
required: true
|
|
217
|
+
description: Unique identifier for the combobox. Used to generate IDs for child elements.
|
|
218
|
+
- name: name
|
|
219
|
+
type: string
|
|
220
|
+
required: true
|
|
221
|
+
description: Name attribute for the hidden input (form submission).
|
|
222
|
+
- name: items
|
|
223
|
+
type: array
|
|
224
|
+
required: true
|
|
225
|
+
description: Array of options for the combobox listbox.
|
|
226
|
+
params:
|
|
227
|
+
- name: text
|
|
228
|
+
type: string
|
|
229
|
+
required: true
|
|
230
|
+
description: Text content of the option. Also used as the value.
|
|
231
|
+
- name: attributes
|
|
232
|
+
type: object
|
|
233
|
+
required: false
|
|
234
|
+
description: HTML attributes to add to the option element.
|
|
235
|
+
- name: autocomplete
|
|
236
|
+
type: string
|
|
237
|
+
required: false
|
|
238
|
+
description: "Autocomplete mode: 'list' (filter only) or 'both' (filter + inline completion). Defaults to 'both'."
|
|
239
|
+
- name: defaultValue
|
|
240
|
+
type: string
|
|
241
|
+
required: false
|
|
242
|
+
description: Pre-selected value for the combobox on initial render.
|
|
243
|
+
- name: noResultsText
|
|
244
|
+
type: string
|
|
245
|
+
required: false
|
|
246
|
+
description: "Text shown when no options match the filter. Defaults to 'No hay resultados'."
|
|
247
|
+
- name: clearButtonLabel
|
|
248
|
+
type: string
|
|
249
|
+
required: false
|
|
250
|
+
description: "Accessible label for the clear button. Defaults to 'Limpiar seleccion'."
|
|
251
|
+
- name: label
|
|
252
|
+
type: object
|
|
253
|
+
required: true
|
|
254
|
+
description: Label text or HTML by specifying value for either text or html keys.
|
|
255
|
+
isComponent: true
|
|
256
|
+
- name: hint
|
|
257
|
+
type: object
|
|
258
|
+
required: false
|
|
259
|
+
description: Options for the hint component.
|
|
260
|
+
isComponent: true
|
|
261
|
+
- name: errorMessage
|
|
262
|
+
type: object
|
|
263
|
+
required: false
|
|
264
|
+
description: Options for the error message component. Will not display if falsy.
|
|
265
|
+
isComponent: true
|
|
266
|
+
- name: formGroup
|
|
267
|
+
type: object
|
|
268
|
+
required: false
|
|
269
|
+
description: Options for the form-group wrapper.
|
|
270
|
+
params:
|
|
271
|
+
- name: classes
|
|
272
|
+
type: string
|
|
273
|
+
required: false
|
|
274
|
+
description: Classes to add to the form group.
|
|
275
|
+
- name: disabled
|
|
276
|
+
type: boolean
|
|
277
|
+
required: false
|
|
278
|
+
description: If true, the entire combobox will be disabled.
|
|
279
|
+
- name: classes
|
|
280
|
+
type: string
|
|
281
|
+
required: false
|
|
282
|
+
description: Additional classes to add to the combobox input.
|
|
283
|
+
- name: attributes
|
|
284
|
+
type: object
|
|
285
|
+
required: false
|
|
286
|
+
description: HTML attributes (e.g. data attributes) to add to the combobox wrapper.
|
|
287
|
+
- name: describedBy
|
|
288
|
+
type: string
|
|
289
|
+
required: false
|
|
290
|
+
description: One or more element IDs to add to aria-describedby.
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Template Nunjucks completo a implementar
|
|
294
|
+
|
|
295
|
+
```njk
|
|
296
|
+
{% from "../error-message/_macro.error-message.njk" import componentErrorMessage -%}
|
|
297
|
+
{% from "../hint/_macro.hint.njk" import componentHint %}
|
|
298
|
+
{% from "../label/_macro.label.njk" import componentLabel %}
|
|
299
|
+
|
|
300
|
+
{%- set describedBy = params.describedBy if params.describedBy else "" -%}
|
|
301
|
+
{%- set errorId = params.id + '-error' -%}
|
|
302
|
+
{%- set autocompleteMode = params.autocomplete if params.autocomplete else 'both' -%}
|
|
303
|
+
{%- set noResultsMsg = params.noResultsText if params.noResultsText else 'No hay resultados' -%}
|
|
304
|
+
{%- set clearLabel = params.clearButtonLabel if params.clearButtonLabel else 'Limpiar seleccion' -%}
|
|
305
|
+
|
|
306
|
+
<!-- combobox -->
|
|
307
|
+
<div class="c-form-group {%- if params.errorMessage %} c-form-group--error{% endif %} {%- if params.formGroup.classes %} {{ params.formGroup.classes }}{% endif %}" data-module="c-combobox" {%- for attribute, value in params.attributes %} {{ attribute }}="{{ value }}"{% endfor %}>
|
|
308
|
+
{{ componentLabel({
|
|
309
|
+
html: params.label.html,
|
|
310
|
+
text: params.label.text,
|
|
311
|
+
classes: params.label.classes,
|
|
312
|
+
isPageHeading: params.label.isPageHeading,
|
|
313
|
+
attributes: params.label.attributes,
|
|
314
|
+
for: params.id
|
|
315
|
+
}) | indent(2) | trim }}
|
|
316
|
+
{% if params.hint %}
|
|
317
|
+
{% set hintId = params.id + '-hint' %}
|
|
318
|
+
{% set describedBy = describedBy + ' ' + hintId if describedBy else hintId %}
|
|
319
|
+
{{ componentHint({
|
|
320
|
+
id: hintId,
|
|
321
|
+
classes: params.hint.classes,
|
|
322
|
+
attributes: params.hint.attributes,
|
|
323
|
+
html: params.hint.html,
|
|
324
|
+
text: params.hint.text
|
|
325
|
+
}) | indent(2) | trim }}
|
|
326
|
+
{% endif %}
|
|
327
|
+
{% if params.errorMessage %}
|
|
328
|
+
{% set describedBy = describedBy + ' ' + errorId if describedBy else errorId %}
|
|
329
|
+
{{ componentErrorMessage({
|
|
330
|
+
id: errorId,
|
|
331
|
+
classes: params.errorMessage.classes,
|
|
332
|
+
attributes: params.errorMessage.attributes,
|
|
333
|
+
html: params.errorMessage.html,
|
|
334
|
+
text: params.errorMessage.text,
|
|
335
|
+
visuallyHiddenText: params.errorMessage.visuallyHiddenText
|
|
336
|
+
}) | indent(2) | trim }}
|
|
337
|
+
{% endif %}
|
|
338
|
+
<div class="c-combobox relative">
|
|
339
|
+
<div class="c-combobox__input-wrapper relative flex items-center">
|
|
340
|
+
<input
|
|
341
|
+
id="{{ params.id }}"
|
|
342
|
+
type="text"
|
|
343
|
+
role="combobox"
|
|
344
|
+
aria-autocomplete="{{ autocompleteMode }}"
|
|
345
|
+
aria-expanded="false"
|
|
346
|
+
aria-controls="{{ params.id }}-listbox"
|
|
347
|
+
{%- if describedBy %} aria-describedby="{{ describedBy }}"{% endif %}
|
|
348
|
+
{%- if params.errorMessage %} aria-errormessage="{{ errorId }}" aria-invalid="true"{% endif %}
|
|
349
|
+
autocomplete="off"
|
|
350
|
+
data-module="c-combobox-input"
|
|
351
|
+
class="c-combobox__input block w-full mt-sm transition duration-150 ease-in-out {% if params.errorMessage %}border-alert-base ring-2 ring-alert-base{% else %}border-black{% endif %} rounded-sm font-semibold focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base pr-10 {%- if params.classes %} {{ params.classes }}{% endif %}"
|
|
352
|
+
{%- if params.defaultValue %} value="{{ params.defaultValue }}"{% endif %}
|
|
353
|
+
{%- if params.disabled %} disabled aria-disabled="true"{% endif %}
|
|
354
|
+
/>
|
|
355
|
+
<button
|
|
356
|
+
type="button"
|
|
357
|
+
tabindex="0"
|
|
358
|
+
aria-label="{{ clearLabel }}"
|
|
359
|
+
data-module="c-combobox-clear"
|
|
360
|
+
class="c-combobox__clear absolute right-2 top-1/2 -translate-y-1/2 p-1 text-neutral-dark hover:text-black focus:outline-hidden focus:bg-warning-base focus:shadow-outline-black rounded-sm"
|
|
361
|
+
hidden
|
|
362
|
+
>
|
|
363
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" aria-hidden="true" fill="currentColor" focusable="false" width="1em" height="1em"><path d="M39.5 11.383 36.617 8.5 24 21.117 11.383 8.5 8.5 11.383 21.117 24 8.5 36.617 11.383 39.5 24 26.883 36.617 39.5 39.5 36.617 26.883 24z"/></svg>
|
|
364
|
+
</button>
|
|
365
|
+
</div>
|
|
366
|
+
|
|
367
|
+
<input type="hidden" name="{{ params.name }}" {%- if params.defaultValue %} value="{{ params.defaultValue }}"{% endif %} data-module="c-combobox-hidden" />
|
|
368
|
+
|
|
369
|
+
<div
|
|
370
|
+
id="{{ params.id }}-listbox-container"
|
|
371
|
+
class="c-combobox__tooltip hidden absolute z-50 min-w-full mt-1 border border-neutral-base shadow-md bg-white rounded-sm"
|
|
372
|
+
data-module="c-combobox-tooltip"
|
|
373
|
+
>
|
|
374
|
+
<ul
|
|
375
|
+
id="{{ params.id }}-listbox"
|
|
376
|
+
role="listbox"
|
|
377
|
+
aria-label="{{ params.label.text if params.label.text else '' }}"
|
|
378
|
+
data-module="c-combobox-list"
|
|
379
|
+
class="text-sm outline-hidden max-h-60 overflow-y-auto"
|
|
380
|
+
>
|
|
381
|
+
{%- for item in params.items %}
|
|
382
|
+
{% if item %}
|
|
383
|
+
<li
|
|
384
|
+
id="{{ params.id }}-option-{{ loop.index }}"
|
|
385
|
+
role="option"
|
|
386
|
+
aria-selected="false"
|
|
387
|
+
class="c-combobox__option flex items-center px-base py-sm hover:bg-primary-base hover:text-white cursor-pointer"
|
|
388
|
+
data-value="{{ item.text }}"
|
|
389
|
+
{%- for attribute, value in item.attributes %} {{ attribute }}="{{ value }}"{% endfor %}
|
|
390
|
+
>
|
|
391
|
+
{{ item.text }}
|
|
392
|
+
</li>
|
|
393
|
+
{% endif %}
|
|
394
|
+
{%- endfor %}
|
|
395
|
+
</ul>
|
|
396
|
+
<div
|
|
397
|
+
class="c-combobox__no-results hidden px-base py-sm text-sm text-neutral-dark italic"
|
|
398
|
+
data-module="c-combobox-no-results"
|
|
399
|
+
role="status"
|
|
400
|
+
aria-live="polite"
|
|
401
|
+
>
|
|
402
|
+
{{ noResultsMsg }}
|
|
403
|
+
</div>
|
|
404
|
+
</div>
|
|
405
|
+
</div>
|
|
406
|
+
</div>
|
|
407
|
+
<!-- /combobox -->
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
## Criterios de aceptacion
|
|
411
|
+
|
|
412
|
+
- [ ] Archivo `_macro.combobox.njk` creado con macro `componentCombobox`
|
|
413
|
+
- [ ] Archivo `_template.combobox.njk` creado con HTML ARIA completo
|
|
414
|
+
- [ ] Archivo `params.combobox.yaml` creado con todos los parametros
|
|
415
|
+
- [ ] El template importa y usa macros de label, hint, error-message
|
|
416
|
+
- [ ] `describedBy` se construye correctamente con hint y error IDs
|
|
417
|
+
- [ ] El input tiene `role="combobox"`, `aria-autocomplete`, `aria-expanded`, `aria-controls`
|
|
418
|
+
- [ ] `aria-autocomplete` es configurable entre "list" y "both" (default: "both")
|
|
419
|
+
- [ ] Hidden input con `name` para form submission
|
|
420
|
+
- [ ] El input visible NO tiene atributo `name`
|
|
421
|
+
- [ ] Boton clear con `hidden` attribute, `aria-label` y en tab order (`tabindex="0"`)
|
|
422
|
+
- [ ] Popup con `role="listbox"` y opciones con `role="option"`
|
|
423
|
+
- [ ] Opciones tienen `aria-selected="false"` por defecto
|
|
424
|
+
- [ ] Opciones tienen `data-value` con el texto
|
|
425
|
+
- [ ] IDs generados consistentemente: `{id}-listbox`, `{id}-option-{n}`
|
|
426
|
+
- [ ] `data-module` attributes en: wrapper (`c-combobox`), input (`c-combobox-input`), clear (`c-combobox-clear`), hidden (`c-combobox-hidden`), tooltip (`c-combobox-tooltip`), list (`c-combobox-list`), no-results (`c-combobox-no-results`)
|
|
427
|
+
- [ ] Zona "sin resultados" con `role="status"` y `aria-live="polite"`
|
|
428
|
+
- [ ] Estado disabled aplicable al combobox completo
|
|
429
|
+
- [ ] Estado error con `aria-invalid`, `aria-errormessage` y clases visuales
|
|
430
|
+
- [ ] Valor por defecto (`defaultValue`) se aplica al input visible y al hidden input
|
|
431
|
+
- [ ] Textos configurables: `noResultsText`, `clearButtonLabel`
|
|
432
|
+
- [ ] El template no genera errores al renderizar con Nunjucks
|
|
433
|
+
```
|