desy-html 16.0.4 → 17.0.1
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 +919 -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 +63 -65
- package/src/js/aria/MenuNavigation.js +56 -55
- package/src/js/aria/MenuVertical.js +60 -60
- package/src/js/aria/MenubarAction.js +29 -6
- package/src/js/aria/MenubarItemAction.js +1 -9
- package/src/js/aria/Nav.js +60 -60
- package/src/js/aria/PopupMenuAction.js +32 -14
- package/src/js/aria/accordion.js +281 -264
- package/src/js/aria/alert.js +8 -3
- package/src/js/aria/checkBoxes.js +52 -52
- package/src/js/aria/collapsible.js +44 -44
- package/src/js/aria/combobox.js +597 -0
- package/src/js/aria/dataGrid.js +953 -950
- package/src/js/aria/linksList.js +64 -42
- package/src/js/aria/listbox.js +3 -3
- package/src/js/aria/notification.js +56 -56
- package/src/js/aria/radioButton.js +50 -50
- package/src/js/aria/tabs.js +20 -6
- package/src/js/aria/toggle.js +61 -61
- package/src/js/aria/tree.js +60 -40
- package/src/js/aria/treegrid.js +507 -507
- package/src/js/aria/treeitem.js +22 -13
- package/src/js/aria/utils.js +240 -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 +1021 -982
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
it# Fase 4: Combobox - Integracion y Ejemplos
|
|
2
|
+
|
|
3
|
+
## Deliverables
|
|
4
|
+
|
|
5
|
+
| Archivo | Accion |
|
|
6
|
+
|---------|--------|
|
|
7
|
+
| `src/js/desy-html.js` | Modificar (importar combobox, crear comboboxComponent, exportar) |
|
|
8
|
+
| `src/js/index.js` | Modificar (importar y ejecutar comboboxComponent) |
|
|
9
|
+
| `src/templates/components/combobox/_examples.combobox.njk` | Crear |
|
|
10
|
+
|
|
11
|
+
## Dependencias
|
|
12
|
+
|
|
13
|
+
- **Fase 1 completada**: Templates Nunjucks
|
|
14
|
+
- **Fase 2 completada**: Estilos CSS (import en styles.css)
|
|
15
|
+
- **Fase 3 completada**: Modulo JS ARIA (`src/js/aria/combobox.js`)
|
|
16
|
+
|
|
17
|
+
## PROMPT
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
Eres un desarrollador frontend que va a integrar el componente combobox en desy-html (Design System del Gobierno de Aragon). Las fases previas ya crearon los templates, estilos y JS ARIA. Ahora necesitas registrar el componente en el sistema y crear la pagina de ejemplos.
|
|
21
|
+
|
|
22
|
+
## Contexto del proyecto
|
|
23
|
+
|
|
24
|
+
desy-html registra componentes JS en dos archivos:
|
|
25
|
+
1. `src/js/desy-html.js`: Define funciones de componente que importan modulos ARIA, buscan elementos DOM y los inicializan. Tambien contiene `createFloatingElement()` para posicionamiento de popups.
|
|
26
|
+
2. `src/js/index.js`: Importa las funciones de componente y las ejecuta con el objeto `aria`.
|
|
27
|
+
|
|
28
|
+
Los ejemplos de componentes se crean como archivos Nunjucks `_examples.{component}.njk` dentro de la carpeta del componente.
|
|
29
|
+
|
|
30
|
+
## MCP Server DESY
|
|
31
|
+
|
|
32
|
+
Antes de implementar, consulta las guias del design system:
|
|
33
|
+
1. Usa `mcp__DESY-MCP-Server__get_guideline` para obtener guias de:
|
|
34
|
+
- Patrones de ejemplos de componentes
|
|
35
|
+
- Integracion de componentes interactivos
|
|
36
|
+
|
|
37
|
+
## Skills y agentes disponibles
|
|
38
|
+
|
|
39
|
+
- Usa la skill `desy` para consultar patrones del design system
|
|
40
|
+
- Usa la skill `code-simplifier` para simplificar el codigo de integracion
|
|
41
|
+
- Al finalizar, usa los agentes:
|
|
42
|
+
- `code-refactoring:code-reviewer` para revisar calidad
|
|
43
|
+
- Usa la skill `create-commit` para preparar el mensaje de commit
|
|
44
|
+
|
|
45
|
+
## Archivos de referencia
|
|
46
|
+
|
|
47
|
+
### Patron de componente en desy-html.js (listboxComponent):
|
|
48
|
+
Archivo: `src/js/desy-html.js`
|
|
49
|
+
|
|
50
|
+
```js
|
|
51
|
+
// Import (linea 10)
|
|
52
|
+
import { listbox } from './aria/listbox.js';
|
|
53
|
+
|
|
54
|
+
// Funcion de componente (linea 114)
|
|
55
|
+
export function listboxComponent(aria) {
|
|
56
|
+
listbox(aria);
|
|
57
|
+
const modules = document.querySelectorAll('[data-module]');
|
|
58
|
+
let activeButton;
|
|
59
|
+
for (const item in modules)
|
|
60
|
+
if (modules.hasOwnProperty(item)) {
|
|
61
|
+
const moduleValue = modules[item].getAttribute('data-module');
|
|
62
|
+
|
|
63
|
+
if (moduleValue == 'c-listbox') {
|
|
64
|
+
const buttonListbox = modules[item].querySelector('[data-module = "c-listbox-button"]');
|
|
65
|
+
const tooltip = modules[item].querySelector('[data-module = "c-listbox-tooltip"]');
|
|
66
|
+
const list = modules[item].querySelector('[data-module = "c-listbox-list"]');
|
|
67
|
+
|
|
68
|
+
if (buttonListbox && tooltip) {
|
|
69
|
+
const listboxObj = new aria.Listbox(list);
|
|
70
|
+
|
|
71
|
+
// Floating element setup
|
|
72
|
+
const instance = createFloatingElement(buttonListbox, tooltip, {
|
|
73
|
+
placement: 'bottom-start',
|
|
74
|
+
offset: [8, -1],
|
|
75
|
+
middleware: middlewares,
|
|
76
|
+
interactive: true,
|
|
77
|
+
trigger: 'manual',
|
|
78
|
+
hideOnClick: true,
|
|
79
|
+
role: false,
|
|
80
|
+
ariaContent: 'auto',
|
|
81
|
+
hideOnEsc: true,
|
|
82
|
+
hideOnPopperBlur: true,
|
|
83
|
+
onMount: (instance) => { ... },
|
|
84
|
+
onHidden: (instance) => { ... }
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// Event listeners, etc.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Patron de registro en index.js:
|
|
95
|
+
Archivo: `src/js/index.js`
|
|
96
|
+
|
|
97
|
+
```js
|
|
98
|
+
// Import
|
|
99
|
+
import { listboxComponent, ... } from './desy-html.js';
|
|
100
|
+
|
|
101
|
+
// Ejecucion
|
|
102
|
+
var aria = aria || {};
|
|
103
|
+
listboxComponent(aria);
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### createFloatingElement API:
|
|
107
|
+
Definida en `src/js/desy-html.js` (linea 509). Opciones relevantes para combobox:
|
|
108
|
+
- `placement: 'bottom-start'` - alinear popup abajo-izquierda
|
|
109
|
+
- `interactive: true` - permitir interaccion con el popup
|
|
110
|
+
- `trigger: 'manual'` - control programatico (no auto-trigger)
|
|
111
|
+
- `hideOnClick: true` - cerrar al click fuera
|
|
112
|
+
- `hideOnEsc: true` - cerrar con Escape
|
|
113
|
+
- `hideOnPopperBlur: true` - cerrar al perder foco
|
|
114
|
+
- `onHidden: callback` - para sincronizar estado
|
|
115
|
+
- Middleware: `computePosition.shift({ padding: 5 })` para mantener en viewport
|
|
116
|
+
|
|
117
|
+
## Especificacion tecnica
|
|
118
|
+
|
|
119
|
+
### 1. Modificar `src/js/desy-html.js`
|
|
120
|
+
|
|
121
|
+
#### Anadir import (despues de la linea de listbox, orden alfabetico no requerido pero agrupado):
|
|
122
|
+
|
|
123
|
+
```js
|
|
124
|
+
import { combobox } from './aria/combobox.js';
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
#### Anadir funcion comboboxComponent (antes de listboxComponent):
|
|
128
|
+
|
|
129
|
+
```js
|
|
130
|
+
export function comboboxComponent(aria) {
|
|
131
|
+
combobox(aria);
|
|
132
|
+
|
|
133
|
+
const modules = document.querySelectorAll('[data-module="c-combobox"]');
|
|
134
|
+
[...modules].forEach((module) => {
|
|
135
|
+
const input = module.querySelector('[data-module="c-combobox-input"]');
|
|
136
|
+
const tooltip = module.querySelector('[data-module="c-combobox-tooltip"]');
|
|
137
|
+
|
|
138
|
+
if (input && tooltip) {
|
|
139
|
+
// Crear instancia ARIA
|
|
140
|
+
const comboboxObj = new aria.Combobox(module);
|
|
141
|
+
|
|
142
|
+
// Configurar floating element para posicionamiento del popup
|
|
143
|
+
const inputWrapper = module.querySelector('.c-combobox__input-wrapper');
|
|
144
|
+
|
|
145
|
+
const middlewares = [
|
|
146
|
+
computePosition.shift({ padding: 5 })
|
|
147
|
+
];
|
|
148
|
+
|
|
149
|
+
// Ajustar ancho del tooltip al input
|
|
150
|
+
tooltip.style.width = 'auto';
|
|
151
|
+
tooltip.style.minWidth = inputWrapper.offsetWidth + 'px';
|
|
152
|
+
|
|
153
|
+
const instance = createFloatingElement(inputWrapper, tooltip, {
|
|
154
|
+
placement: 'bottom-start',
|
|
155
|
+
offset: [0, 4],
|
|
156
|
+
middleware: middlewares,
|
|
157
|
+
interactive: true,
|
|
158
|
+
trigger: 'manual',
|
|
159
|
+
hideOnClick: true,
|
|
160
|
+
role: false,
|
|
161
|
+
ariaContent: 'auto',
|
|
162
|
+
hideOnEsc: false, // Lo maneja el JS del combobox
|
|
163
|
+
hideOnPopperBlur: false, // Lo maneja el JS del combobox
|
|
164
|
+
onHidden: () => {
|
|
165
|
+
// Sincronizar estado si floating cierra por click externo
|
|
166
|
+
if (comboboxObj.isOpen) {
|
|
167
|
+
comboboxObj.isOpen = false;
|
|
168
|
+
comboboxObj.activeIndex = -1;
|
|
169
|
+
input.setAttribute('aria-expanded', 'false');
|
|
170
|
+
input.removeAttribute('aria-activedescendant');
|
|
171
|
+
comboboxObj.clearActiveDescendant();
|
|
172
|
+
module.dispatchEvent(new CustomEvent('combobox:close', { bubbles: true }));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// Asignar floating instance al combobox para que use show/hide
|
|
178
|
+
comboboxObj.floatingInstance = instance;
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### 2. Modificar `src/js/index.js`
|
|
185
|
+
|
|
186
|
+
#### Anadir import:
|
|
187
|
+
|
|
188
|
+
```js
|
|
189
|
+
import {
|
|
190
|
+
accordionComponent,
|
|
191
|
+
alertComponent,
|
|
192
|
+
checkBoxComponent,
|
|
193
|
+
collapsibleComponent,
|
|
194
|
+
comboboxComponent, // <-- NUEVO
|
|
195
|
+
DatepickerComponent,
|
|
196
|
+
// ... resto igual
|
|
197
|
+
} from './desy-html.js';
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
#### Anadir ejecucion (despues de collapsibleComponent, orden alfabetico):
|
|
201
|
+
|
|
202
|
+
```js
|
|
203
|
+
var aria = aria || {};
|
|
204
|
+
|
|
205
|
+
accordionComponent(aria);
|
|
206
|
+
alertComponent(aria);
|
|
207
|
+
collapsibleComponent(aria);
|
|
208
|
+
comboboxComponent(aria); // <-- NUEVO
|
|
209
|
+
dialogComponent(aria);
|
|
210
|
+
// ... resto igual
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### 3. Crear `_examples.combobox.njk`
|
|
214
|
+
|
|
215
|
+
```njk
|
|
216
|
+
{% from "./combobox/_macro.combobox.njk" import componentCombobox %}
|
|
217
|
+
|
|
218
|
+
{# Ejemplo 1: Basico con autocomplete "both" #}
|
|
219
|
+
<h2>Combobox basico (autocomplete both)</h2>
|
|
220
|
+
{{ componentCombobox({
|
|
221
|
+
id: "combobox-comunidad",
|
|
222
|
+
name: "comunidad",
|
|
223
|
+
label: {
|
|
224
|
+
text: "Comunidad Autonoma"
|
|
225
|
+
},
|
|
226
|
+
items: [
|
|
227
|
+
{ text: "Andalucia" },
|
|
228
|
+
{ text: "Aragon" },
|
|
229
|
+
{ text: "Asturias" },
|
|
230
|
+
{ text: "Baleares" },
|
|
231
|
+
{ text: "Canarias" },
|
|
232
|
+
{ text: "Cantabria" },
|
|
233
|
+
{ text: "Castilla y Leon" },
|
|
234
|
+
{ text: "Castilla-La Mancha" },
|
|
235
|
+
{ text: "Cataluna" },
|
|
236
|
+
{ text: "Comunidad Valenciana" },
|
|
237
|
+
{ text: "Extremadura" },
|
|
238
|
+
{ text: "Galicia" },
|
|
239
|
+
{ text: "La Rioja" },
|
|
240
|
+
{ text: "Madrid" },
|
|
241
|
+
{ text: "Murcia" },
|
|
242
|
+
{ text: "Navarra" },
|
|
243
|
+
{ text: "Pais Vasco" }
|
|
244
|
+
]
|
|
245
|
+
}) }}
|
|
246
|
+
|
|
247
|
+
{# Ejemplo 2: Con hint y autocomplete "list" #}
|
|
248
|
+
<h2>Combobox con hint (autocomplete list)</h2>
|
|
249
|
+
{{ componentCombobox({
|
|
250
|
+
id: "combobox-provincia",
|
|
251
|
+
name: "provincia",
|
|
252
|
+
autocomplete: "list",
|
|
253
|
+
label: {
|
|
254
|
+
text: "Provincia"
|
|
255
|
+
},
|
|
256
|
+
hint: {
|
|
257
|
+
text: "Escribe para filtrar las provincias disponibles"
|
|
258
|
+
},
|
|
259
|
+
items: [
|
|
260
|
+
{ text: "Huesca" },
|
|
261
|
+
{ text: "Teruel" },
|
|
262
|
+
{ text: "Zaragoza" }
|
|
263
|
+
]
|
|
264
|
+
}) }}
|
|
265
|
+
|
|
266
|
+
{# Ejemplo 3: Con valor por defecto #}
|
|
267
|
+
<h2>Combobox con valor por defecto</h2>
|
|
268
|
+
{{ componentCombobox({
|
|
269
|
+
id: "combobox-default",
|
|
270
|
+
name: "ciudad",
|
|
271
|
+
defaultValue: "Zaragoza",
|
|
272
|
+
label: {
|
|
273
|
+
text: "Ciudad"
|
|
274
|
+
},
|
|
275
|
+
items: [
|
|
276
|
+
{ text: "Huesca" },
|
|
277
|
+
{ text: "Jaca" },
|
|
278
|
+
{ text: "Teruel" },
|
|
279
|
+
{ text: "Zaragoza" }
|
|
280
|
+
]
|
|
281
|
+
}) }}
|
|
282
|
+
|
|
283
|
+
{# Ejemplo 4: Con error #}
|
|
284
|
+
<h2>Combobox con error</h2>
|
|
285
|
+
{{ componentCombobox({
|
|
286
|
+
id: "combobox-error",
|
|
287
|
+
name: "comarca",
|
|
288
|
+
label: {
|
|
289
|
+
text: "Comarca"
|
|
290
|
+
},
|
|
291
|
+
errorMessage: {
|
|
292
|
+
text: "Selecciona una comarca valida"
|
|
293
|
+
},
|
|
294
|
+
items: [
|
|
295
|
+
{ text: "Alto Gallego" },
|
|
296
|
+
{ text: "Campo de Borja" },
|
|
297
|
+
{ text: "Cinco Villas" },
|
|
298
|
+
{ text: "Hoya de Huesca" },
|
|
299
|
+
{ text: "La Jacetania" },
|
|
300
|
+
{ text: "Ribera Alta del Ebro" }
|
|
301
|
+
]
|
|
302
|
+
}) }}
|
|
303
|
+
|
|
304
|
+
{# Ejemplo 5: Disabled #}
|
|
305
|
+
<h2>Combobox deshabilitado</h2>
|
|
306
|
+
{{ componentCombobox({
|
|
307
|
+
id: "combobox-disabled",
|
|
308
|
+
name: "disabled-field",
|
|
309
|
+
disabled: true,
|
|
310
|
+
label: {
|
|
311
|
+
text: "Campo deshabilitado"
|
|
312
|
+
},
|
|
313
|
+
items: [
|
|
314
|
+
{ text: "Opcion 1" },
|
|
315
|
+
{ text: "Opcion 2" }
|
|
316
|
+
]
|
|
317
|
+
}) }}
|
|
318
|
+
|
|
319
|
+
{# Ejemplo 6: Texto de sin resultados personalizado #}
|
|
320
|
+
<h2>Combobox con texto personalizado (sin resultados)</h2>
|
|
321
|
+
{{ componentCombobox({
|
|
322
|
+
id: "combobox-custom",
|
|
323
|
+
name: "municipio",
|
|
324
|
+
noResultsText: "No se encontraron municipios",
|
|
325
|
+
clearButtonLabel: "Borrar busqueda",
|
|
326
|
+
label: {
|
|
327
|
+
text: "Municipio"
|
|
328
|
+
},
|
|
329
|
+
hint: {
|
|
330
|
+
text: "Empieza a escribir el nombre del municipio"
|
|
331
|
+
},
|
|
332
|
+
items: [
|
|
333
|
+
{ text: "Alagon" },
|
|
334
|
+
{ text: "Borja" },
|
|
335
|
+
{ text: "Calatayud" },
|
|
336
|
+
{ text: "Ejea de los Caballeros" },
|
|
337
|
+
{ text: "Fraga" },
|
|
338
|
+
{ text: "Huesca" },
|
|
339
|
+
{ text: "Jaca" },
|
|
340
|
+
{ text: "Monzon" },
|
|
341
|
+
{ text: "Tarazona" },
|
|
342
|
+
{ text: "Teruel" },
|
|
343
|
+
{ text: "Utebo" },
|
|
344
|
+
{ text: "Zaragoza" }
|
|
345
|
+
]
|
|
346
|
+
}) }}
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## Criterios de aceptacion
|
|
350
|
+
|
|
351
|
+
### Integracion JS
|
|
352
|
+
- [ ] Import de `combobox` anadido en `desy-html.js`
|
|
353
|
+
- [ ] Funcion `comboboxComponent` exportada desde `desy-html.js`
|
|
354
|
+
- [ ] `comboboxComponent` busca `[data-module="c-combobox"]` y crea instancias `aria.Combobox`
|
|
355
|
+
- [ ] `createFloatingElement` configurado con `placement: 'bottom-start'`, `trigger: 'manual'`, `interactive: true`
|
|
356
|
+
- [ ] `hideOnEsc: false` y `hideOnPopperBlur: false` (el JS del combobox gestiona estos)
|
|
357
|
+
- [ ] `onHidden` callback sincroniza estado del combobox cuando floating cierra por click externo
|
|
358
|
+
- [ ] `floatingInstance` asignado al objeto combobox
|
|
359
|
+
- [ ] Ancho del tooltip ajustado al input wrapper
|
|
360
|
+
- [ ] Import y ejecucion anadidos en `index.js` en orden alfabetico
|
|
361
|
+
- [ ] `comboboxComponent(aria)` ejecutado despues de `collapsibleComponent(aria)`
|
|
362
|
+
|
|
363
|
+
### Pagina de ejemplos
|
|
364
|
+
- [ ] Archivo `_examples.combobox.njk` creado en `src/templates/components/combobox/`
|
|
365
|
+
- [ ] Importa macro `componentCombobox` correctamente
|
|
366
|
+
- [ ] Ejemplo 1: Basico con autocomplete "both" (default) - comunidades autonomas
|
|
367
|
+
- [ ] Ejemplo 2: Con hint y autocomplete "list" - provincias
|
|
368
|
+
- [ ] Ejemplo 3: Con valor por defecto (`defaultValue`) - ciudades
|
|
369
|
+
- [ ] Ejemplo 4: Con estado error (`errorMessage`) - comarcas
|
|
370
|
+
- [ ] Ejemplo 5: Deshabilitado (`disabled: true`)
|
|
371
|
+
- [ ] Ejemplo 6: Textos personalizados (`noResultsText`, `clearButtonLabel`) - municipios
|
|
372
|
+
- [ ] Todos los ejemplos usan datos relevantes del contexto aragones
|
|
373
|
+
- [ ] Cada ejemplo muestra un caso de uso diferente del componente
|
|
374
|
+
|
|
375
|
+
### Verificacion integral
|
|
376
|
+
- [ ] El proyecto compila sin errores (`npm run build` o equivalente)
|
|
377
|
+
- [ ] El combobox renderiza correctamente en el navegador
|
|
378
|
+
- [ ] El filtrado funciona al escribir
|
|
379
|
+
- [ ] Las teclas de navegacion funcionan (Arrow, Enter, Escape, Home, End)
|
|
380
|
+
- [ ] El clear button aparece/desaparece y funciona correctamente
|
|
381
|
+
- [ ] El popup se posiciona correctamente con floating-ui
|
|
382
|
+
- [ ] El blur sin match limpia el input
|
|
383
|
+
- [ ] El valor seleccionado se envia correctamente en formularios (hidden input)
|
|
384
|
+
- [ ] Los eventos custom se disparan correctamente
|
|
385
|
+
- [ ] No hay errores en consola
|
|
386
|
+
```
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Sprint 05 — Combobox Refinamiento W3C
|
|
2
|
+
|
|
3
|
+
## Objetivo
|
|
4
|
+
|
|
5
|
+
Alcanzar fidelidad al patrón W3C WAI-ARIA APG combobox-autocomplete-both corrigiendo 3 diferencias detectadas.
|
|
6
|
+
|
|
7
|
+
**Referencia**: https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-autocomplete-both/
|
|
8
|
+
|
|
9
|
+
## Cambios realizados
|
|
10
|
+
|
|
11
|
+
### 1. Botón toggle (▼)
|
|
12
|
+
|
|
13
|
+
Se añadió un `<button>` con flecha SVG al lado del input que abre/cierra el listbox completo, siguiendo el patrón W3C.
|
|
14
|
+
|
|
15
|
+
**Archivos modificados:**
|
|
16
|
+
- `src/templates/components/combobox/_template.combobox.njk` — markup del botón
|
|
17
|
+
- `src/templates/components/combobox/params.combobox.yaml` — nuevo param `toggleButtonLabel`
|
|
18
|
+
- `src/templates/components/combobox/_styles.combobox.css` — estilos posición, hover, focus, rotación SVG
|
|
19
|
+
- `src/js/aria/combobox.js` — handler click, sincronización aria-expanded
|
|
20
|
+
- `src/js/desy-html.js` — discovery del toggle node
|
|
21
|
+
|
|
22
|
+
**Especificación ARIA del botón:**
|
|
23
|
+
- `tabindex="-1"`: fuera del tab order (como W3C)
|
|
24
|
+
- `aria-expanded`: sincronizado con el estado del popup
|
|
25
|
+
- `aria-controls`: apunta al listbox
|
|
26
|
+
- `aria-label`: por defecto usa el texto del label del combobox
|
|
27
|
+
|
|
28
|
+
**Comportamiento click:**
|
|
29
|
+
- Si cerrado: abre, muestra TODAS las opciones, foco en primera
|
|
30
|
+
- Si abierto: cierra
|
|
31
|
+
- Siempre devuelve foco al input
|
|
32
|
+
|
|
33
|
+
### 2. Alt+Down corregido
|
|
34
|
+
|
|
35
|
+
Antes: Alt+Down abría el listbox Y navegaba a la primera opción.
|
|
36
|
+
Ahora: Alt+Down abre el listbox mostrando todas las opciones SIN mover el foco a ninguna opción (comportamiento W3C correcto).
|
|
37
|
+
|
|
38
|
+
### 3. Dataset ampliado — Comarcas de Aragón
|
|
39
|
+
|
|
40
|
+
Se añadió un ejemplo con las 33 comarcas de Aragón para demostrar:
|
|
41
|
+
- Filtrado real con muchos items
|
|
42
|
+
- Scroll en el listbox (max-height: 15rem)
|
|
43
|
+
- Valor del autocompletado inline con datos reales
|
|
44
|
+
|
|
45
|
+
## Verificación
|
|
46
|
+
|
|
47
|
+
1. `npm run dev` sin errores
|
|
48
|
+
2. Abrir http://localhost:5173/examples-combobox.html
|
|
49
|
+
3. Click en botón toggle: abre listbox con TODAS las opciones
|
|
50
|
+
4. Click de nuevo: cierra
|
|
51
|
+
5. Alt+Down: abre sin mover foco a ninguna opción
|
|
52
|
+
6. Escribir texto: filtra normalmente (toggle sigue visible)
|
|
53
|
+
7. Clear button sigue funcionando
|
|
54
|
+
8. Ejemplo comarcas muestra scroll
|
|
55
|
+
9. aria-expanded sincronizado en input Y botón toggle
|
package/package.json
CHANGED
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "desy-html",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "desy-html contains the code you need to start building a user interface for Gobierno de Aragón government webapps.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"author": {
|
|
7
|
-
"name": "Desy (SDA Servicios Digitales de Aragón)",
|
|
8
|
-
"email": "sda@aragon.es"
|
|
9
|
-
},
|
|
10
|
-
"keywords": [
|
|
11
|
-
"desy",
|
|
12
|
-
"gobierno de aragón",
|
|
13
|
-
"frontend",
|
|
14
|
-
"design system",
|
|
15
|
-
"template"
|
|
16
|
-
],
|
|
17
|
-
"license": "EUPL-1.2",
|
|
18
|
-
"repository": {
|
|
19
|
-
"type": "git",
|
|
20
|
-
"url": "https://bitbucket.org/sdaragon/desy-html.git"
|
|
21
|
-
},
|
|
22
|
-
"homepage": "https://desy.aragon.es/",
|
|
23
|
-
"exports": {
|
|
24
|
-
"./branding": "./branding/branding.config.js",
|
|
25
|
-
"./branding/plugin": "./branding/vite-branding-plugin.js"
|
|
26
|
-
},
|
|
27
|
-
"engines": {
|
|
28
|
-
"node": ">=20.19.2 <23.0.0",
|
|
29
|
-
"npm": ">=10.0.0"
|
|
30
|
-
},
|
|
31
|
-
"scripts": {
|
|
32
|
-
"dev": "vite",
|
|
33
|
-
"dev:yourorganization": "cross-env BRANDING_CONFIG=yourorganization npm run dev",
|
|
34
|
-
"build": "vite build",
|
|
35
|
-
"build:yourorganization": "cross-env BRANDING_CONFIG=yourorganization npm run build",
|
|
36
|
-
"preview": "vite preview",
|
|
37
|
-
"preview:yourorganization": "cross-env BRANDING_CONFIG=yourorganization npm run preview"
|
|
38
|
-
},
|
|
39
|
-
"dependencies": {
|
|
40
|
-
"@floating-ui/dom": "^1.6.13",
|
|
41
|
-
"@tailwindcss/forms": "^0.5.10",
|
|
42
|
-
"@tailwindcss/typography": "^0.5.18",
|
|
43
|
-
"@tailwindcss/vite": "^4.
|
|
44
|
-
"autoprefixer": "^10.4.21",
|
|
45
|
-
"cally": "^0.8.0",
|
|
46
|
-
"chokidar": "^3.6.0",
|
|
47
|
-
"hex-rgb": "^5.0.0",
|
|
48
|
-
"js-yaml": "^4.1.0",
|
|
49
|
-
"tailwindcss": "^4.
|
|
50
|
-
},
|
|
51
|
-
"devDependencies": {
|
|
52
|
-
"cross-env": "^10.1.0",
|
|
53
|
-
"glob": "^11.0.1",
|
|
54
|
-
"highlight.js": "^11.11.1",
|
|
55
|
-
"js-beautify": "^1.14.11",
|
|
56
|
-
"nunjucks": "^3.2.4",
|
|
57
|
-
"outdent": "^0.8.0",
|
|
58
|
-
"sharp": "^0.34.3",
|
|
59
|
-
"vite": "^7.1.6"
|
|
60
|
-
}
|
|
61
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "desy-html",
|
|
3
|
+
"version": "17.0.1",
|
|
4
|
+
"description": "desy-html contains the code you need to start building a user interface for Gobierno de Aragón government webapps.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Desy (SDA Servicios Digitales de Aragón)",
|
|
8
|
+
"email": "sda@aragon.es"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"desy",
|
|
12
|
+
"gobierno de aragón",
|
|
13
|
+
"frontend",
|
|
14
|
+
"design system",
|
|
15
|
+
"template"
|
|
16
|
+
],
|
|
17
|
+
"license": "EUPL-1.2",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://bitbucket.org/sdaragon/desy-html.git"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://desy.aragon.es/",
|
|
23
|
+
"exports": {
|
|
24
|
+
"./branding": "./branding/branding.config.js",
|
|
25
|
+
"./branding/plugin": "./branding/vite-branding-plugin.js"
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=20.19.2 <23.0.0",
|
|
29
|
+
"npm": ">=10.0.0"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"dev": "vite",
|
|
33
|
+
"dev:yourorganization": "cross-env BRANDING_CONFIG=yourorganization npm run dev",
|
|
34
|
+
"build": "vite build",
|
|
35
|
+
"build:yourorganization": "cross-env BRANDING_CONFIG=yourorganization npm run build",
|
|
36
|
+
"preview": "vite preview",
|
|
37
|
+
"preview:yourorganization": "cross-env BRANDING_CONFIG=yourorganization npm run preview"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@floating-ui/dom": "^1.6.13",
|
|
41
|
+
"@tailwindcss/forms": "^0.5.10",
|
|
42
|
+
"@tailwindcss/typography": "^0.5.18",
|
|
43
|
+
"@tailwindcss/vite": "^4.2",
|
|
44
|
+
"autoprefixer": "^10.4.21",
|
|
45
|
+
"cally": "^0.8.0",
|
|
46
|
+
"chokidar": "^3.6.0",
|
|
47
|
+
"hex-rgb": "^5.0.0",
|
|
48
|
+
"js-yaml": "^4.1.0",
|
|
49
|
+
"tailwindcss": "^4.2"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"cross-env": "^10.1.0",
|
|
53
|
+
"glob": "^11.0.1",
|
|
54
|
+
"highlight.js": "^11.11.1",
|
|
55
|
+
"js-beautify": "^1.14.11",
|
|
56
|
+
"nunjucks": "^3.2.4",
|
|
57
|
+
"outdent": "^0.8.0",
|
|
58
|
+
"sharp": "^0.34.3",
|
|
59
|
+
"vite": "^7.1.6"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" aria-label="Demo Icon" role="img">
|
|
2
|
-
<!-- Face circle -->
|
|
3
|
-
<circle cx="16" cy="16" r="14" fill="none" stroke="currentColor" stroke-width="2"/>
|
|
4
|
-
<!-- Eyes -->
|
|
5
|
-
<circle cx="10" cy="12" r="2" fill="currentColor"/>
|
|
6
|
-
<circle cx="22" cy="12" r="2" fill="currentColor"/>
|
|
7
|
-
<!-- Smile -->
|
|
8
|
-
<path d="M10 20 Q16 26 22 20" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
|
|
9
|
-
</svg>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" aria-label="Demo Icon" role="img">
|
|
2
|
+
<!-- Face circle -->
|
|
3
|
+
<circle cx="16" cy="16" r="14" fill="none" stroke="currentColor" stroke-width="2"/>
|
|
4
|
+
<!-- Eyes -->
|
|
5
|
+
<circle cx="10" cy="12" r="2" fill="currentColor"/>
|
|
6
|
+
<circle cx="22" cy="12" r="2" fill="currentColor"/>
|
|
7
|
+
<!-- Smile -->
|
|
8
|
+
<path d="M10 20 Q16 26 22 20" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
|
|
9
|
+
</svg>
|