@ds-mo/ui 14.34.0 → 14.35.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/dist/.package-ready.json +1 -1
- package/dist/agent-patterns.json +1 -1
- package/dist/agent.json +310 -23
- package/dist/angular/ds-filter-menu.d.ts +1 -1
- package/dist/angular/ds-filter-menu.js +3 -3
- package/dist/angular/ds-menu.d.ts +1 -1
- package/dist/angular/ds-menu.js +3 -3
- package/dist/angular/ds-select.d.ts +1 -1
- package/dist/angular/ds-select.js +3 -3
- package/dist/angular/ds-tab-group.d.ts +1 -1
- package/dist/angular/ds-tab-group.js +3 -3
- package/dist/angular/ds-table-filter.d.ts +1 -1
- package/dist/angular/ds-table-filter.js +3 -3
- package/dist/angular/ds-table-group.d.ts +1 -1
- package/dist/angular/ds-table-group.js +3 -3
- package/dist/angular/ds-table-preferences.d.ts +39 -0
- package/dist/angular/ds-table-preferences.js +69 -0
- package/dist/angular/ds-table-saved-views.d.ts +1 -1
- package/dist/angular/ds-table-saved-views.js +3 -3
- package/dist/angular/ds-table-search.d.ts +1 -1
- package/dist/angular/ds-table-search.js +3 -3
- package/dist/angular/ds-table-sort.d.ts +1 -1
- package/dist/angular/ds-table-sort.js +3 -3
- package/dist/angular/ds-table-toolbar.d.ts +1 -1
- package/dist/angular/ds-table-toolbar.js +3 -3
- package/dist/angular/ds-table.d.ts +3 -1
- package/dist/angular/ds-table.js +8 -5
- package/dist/angular/index.d.ts +1 -1
- package/dist/angular/index.js +1 -0
- package/dist/angular/proxies.d.ts +1 -0
- package/dist/angular/proxies.js +1 -0
- package/dist/components/ds-agent-activity.js +1 -1
- package/dist/components/ds-agent-questionnaire.js +1 -1
- package/dist/components/ds-agent-response.js +1 -1
- package/dist/components/ds-agent-source-list.js +1 -1
- package/dist/components/ds-agent-tool-call.js +1 -1
- package/dist/components/ds-attachment-list.js +1 -1
- package/dist/components/ds-badge.js +1 -1
- package/dist/components/ds-banner.js +1 -1
- package/dist/components/ds-bar-action.js +1 -1
- package/dist/components/ds-bar-nav.js +1 -1
- package/dist/components/ds-bar-page-title.js +1 -1
- package/dist/components/ds-bar-title.js +1 -1
- package/dist/components/ds-bar-workflow.js +1 -1
- package/dist/components/ds-breadcrumb.js +1 -1
- package/dist/components/ds-button-filled.js +1 -1
- package/dist/components/ds-button-unfilled.js +1 -1
- package/dist/components/ds-card-action-center.js +1 -1
- package/dist/components/ds-card-chart.js +1 -1
- package/dist/components/ds-card-navigation.js +1 -1
- package/dist/components/ds-card-overview.js +1 -1
- package/dist/components/ds-card-setting.js +1 -1
- package/dist/components/ds-card-settings-scope.js +1 -1
- package/dist/components/ds-chart-legend.js +1 -1
- package/dist/components/ds-chart.js +1 -1
- package/dist/components/ds-checkbox.js +1 -1
- package/dist/components/ds-chip.js +1 -1
- package/dist/components/ds-code-block.js +1 -1
- package/dist/components/ds-conversation-list-item.js +1 -1
- package/dist/components/ds-conversation-list-section.js +1 -1
- package/dist/components/ds-empty-state.js +1 -1
- package/dist/components/ds-field.js +1 -1
- package/dist/components/ds-filter-menu.js +1 -1
- package/dist/components/ds-input.js +1 -1
- package/dist/components/ds-markdown.js +1 -1
- package/dist/components/ds-menu.js +1 -1
- package/dist/components/ds-message-actions.js +1 -1
- package/dist/components/ds-message-bubble.js +1 -1
- package/dist/components/ds-message-bubble.js.map +1 -1
- package/dist/components/ds-message-composer.js +1 -1
- package/dist/components/ds-message-scroller.js +1 -1
- package/dist/components/ds-message.js +1 -1
- package/dist/components/ds-mobile-bar-nav.js +1 -1
- package/dist/components/ds-mobile-header.js +1 -1
- package/dist/components/ds-mobile-section-switcher.js +1 -1
- package/dist/components/ds-mobile-sheet-nav.js +1 -1
- package/dist/components/ds-modal.js +1 -1
- package/dist/components/ds-pagination.js +1 -1
- package/dist/components/ds-panel-nav.js +1 -1
- package/dist/components/ds-panel-sub-nav.js +1 -1
- package/dist/components/ds-panel-tool-header.js +1 -1
- package/dist/components/ds-panel-tool-search.js +1 -1
- package/dist/components/ds-panel-tools.js +1 -1
- package/dist/components/ds-paper-texture.js +1 -1
- package/dist/components/ds-radio.js +1 -1
- package/dist/components/ds-score.js +1 -1
- package/dist/components/ds-scroll-overlay.js +1 -1
- package/dist/components/ds-select.js +1 -1
- package/dist/components/ds-shell-app.js +1 -1
- package/dist/components/ds-shell-app.js.map +1 -1
- package/dist/components/ds-shell-page.js +1 -1
- package/dist/components/ds-shell-tools.js +1 -1
- package/dist/components/ds-skeleton.js +1 -1
- package/dist/components/ds-slider.js +1 -1
- package/dist/components/ds-swatch-picker.js +1 -1
- package/dist/components/ds-switch.js +1 -1
- package/dist/components/ds-tab-group.js +1 -1
- package/dist/components/ds-table-filter.js +1 -1
- package/dist/components/ds-table-filter.js.map +1 -1
- package/dist/components/ds-table-group.js +1 -1
- package/dist/components/ds-table-group.js.map +1 -1
- package/dist/components/ds-table-preferences.d.ts +11 -0
- package/dist/components/ds-table-preferences.js +2 -0
- package/dist/components/ds-table-preferences.js.map +1 -0
- package/dist/components/ds-table-saved-views.js +1 -1
- package/dist/components/ds-table-saved-views.js.map +1 -1
- package/dist/components/ds-table-search.js +1 -1
- package/dist/components/ds-table-search.js.map +1 -1
- package/dist/components/ds-table-sort.js +1 -1
- package/dist/components/ds-table-sort.js.map +1 -1
- package/dist/components/ds-table-toolbar.js +1 -1
- package/dist/components/ds-table-toolbar.js.map +1 -1
- package/dist/components/ds-table.js +1 -1
- package/dist/components/ds-table.js.map +1 -1
- package/dist/components/ds-tag.js +1 -1
- package/dist/components/ds-text.js +1 -1
- package/dist/components/ds-textarea.js +1 -1
- package/dist/components/ds-toast.js +1 -1
- package/dist/components/ds-tooltip-chart.js +1 -1
- package/dist/components/ds-tooltip.js +1 -1
- package/dist/components/ds-typing-indicator.js +1 -1
- package/dist/components/{p-ByoywoBH.js → p-B-9fdIWv.js} +2 -2
- package/dist/components/{p-CnK36Be0.js → p-BINSI_KF.js} +2 -2
- package/dist/components/{p-CK2S28gU.js → p-BPhbwXOv.js} +2 -2
- package/dist/components/{p-CMq-jKEI.js → p-BPlWEidl.js} +2 -2
- package/dist/components/{p-DyyfWSLB.js → p-BQaO7cg_.js} +2 -2
- package/dist/components/{p-Br0dx2uP.js → p-BQsVI_vO.js} +2 -2
- package/dist/components/{p-B_nPct4G.js → p-BbfBvMRR.js} +2 -2
- package/dist/components/p-BcdHgPi5.js +2 -0
- package/dist/components/p-BcdHgPi5.js.map +1 -0
- package/dist/components/{p-D_QtZZR8.js → p-BmFeeR4q.js} +2 -2
- package/dist/components/{p-CXAa9TUM.js → p-BnWxbhFP.js} +2 -2
- package/dist/components/{p-CvplapTD.js → p-BnzsBNUY.js} +2 -2
- package/dist/components/{p-BlWNMytv.js → p-C1_3CVma.js} +2 -2
- package/dist/components/p-C1_3CVma.js.map +1 -0
- package/dist/components/{p-DjCnGxSd.js → p-C7CZ9pnP.js} +2 -2
- package/dist/components/{p-DBZwI7HY.js → p-C8ek-1SP.js} +2 -2
- package/dist/components/{p-BEttT0UB.js → p-CAxDdYjh.js} +2 -2
- package/dist/components/{p-BqGdNrVl.js → p-CE540WZ7.js} +2 -2
- package/dist/components/{p-B5QVra1K.js → p-CI7VfYC3.js} +2 -2
- package/dist/components/p-CKarsuR2.js +2 -0
- package/dist/components/p-CKarsuR2.js.map +1 -0
- package/dist/components/{p-AkSwrAKR.js → p-CLGtPE0K.js} +2 -2
- package/dist/components/{p-C51ytXM6.js → p-CSnsz3Eb.js} +2 -2
- package/dist/components/{p-Dx7WcWW1.js → p-CZOiTaNa.js} +2 -2
- package/dist/components/{p-xxuHxP3u.js → p-Cmj04E5Q.js} +2 -2
- package/dist/components/p-Cmj04E5Q.js.map +1 -0
- package/dist/components/{p-zZuAAiiI.js → p-Cq_Qpe_C.js} +2 -2
- package/dist/components/{p-CweS0FfJ.js → p-CqlBlv55.js} +2 -2
- package/dist/components/p-CwqFJMvP.js +2 -0
- package/dist/components/{p-DEyvEIYL.js.map → p-CwqFJMvP.js.map} +1 -1
- package/dist/components/{p-C8XJgV1n.js → p-Cwz9TPVS.js} +2 -2
- package/dist/components/{p-C1QHxVvP.js → p-D44g2Kw1.js} +2 -2
- package/dist/components/{p-CKo2nySr.js → p-DC69DgAR.js} +2 -2
- package/dist/components/{p-CQqZgTYk.js → p-DEGNrPLe.js} +2 -2
- package/dist/components/{p-OxdAzO4v.js → p-DFjIBS5B.js} +2 -2
- package/dist/components/{p-BwsS_Hyr.js → p-DGzn4k4h.js} +2 -2
- package/dist/components/{p-Dj296RmE.js → p-DQQFN2sw.js} +2 -2
- package/dist/components/{p-CIoeHcCk.js → p-DTDLlinw.js} +2 -2
- package/dist/components/p-D_u8WhlU.js +2 -0
- package/dist/components/{p-CHBuzAYH.js.map → p-D_u8WhlU.js.map} +1 -1
- package/dist/components/{p-CqeMumqy.js → p-DdspY23v.js} +2 -2
- package/dist/components/{p-DzbEJN1A.js → p-Dk-8Ju0Q.js} +2 -2
- package/dist/components/{p-Da9VpZX2.js → p-DtLQIMsa.js} +2 -2
- package/dist/components/{p-Cw_npFwN.js → p-FPZbS19l.js} +2 -2
- package/dist/components/{p-BMERUCe1.js → p-KBrC9IG4.js} +2 -2
- package/dist/components/p-N5SHSVo2.js +2 -0
- package/dist/components/{p-CHUdAW1Q.js.map → p-N5SHSVo2.js.map} +1 -1
- package/dist/components/p-QjkufCcn.js +2 -0
- package/dist/components/p-QjkufCcn.js.map +1 -0
- package/dist/components/p-UAIxh67Q.js +2 -0
- package/dist/components/p-UAIxh67Q.js.map +1 -0
- package/dist/components/{p-CIYJhyKt.js → p-beCz9OnD.js} +2 -2
- package/dist/components/{p-LZ8F08Fj.js → p-beRFLHbB.js} +2 -2
- package/dist/components/p-beRFLHbB.js.map +1 -0
- package/dist/components/{p-4DNyCYKM.js → p-mpk_Mm8_.js} +2 -2
- package/dist/components/{p-DrjY8Mpy.js → p-n68x-ZKp.js} +2 -2
- package/dist/components/{p-CNDTHTf6.js → p-omPm8_vx.js} +2 -2
- package/dist/components/{p-lv4YQEsa.js → p-umAf0fBn.js} +2 -2
- package/dist/components/{p-ya8A_SMw.js → p-xHGqrz_p.js} +2 -2
- package/dist/components/{p-ya8A_SMw.js.map → p-xHGqrz_p.js.map} +1 -1
- package/dist/components/{p-CBQzTgvI.js → p-y06IxxoN.js} +2 -2
- package/dist/components/{p-CoE7yza3.js → p-yZRXPHDe.js} +2 -2
- package/dist/docs/components.json +2242 -720
- package/dist/lib/components/ShellApp/shell-app-types.d.ts +3 -1
- package/dist/mcp-data/registry/filter-menu.json +102 -15
- package/dist/mcp-data/registry/menu.json +22 -3
- package/dist/mcp-data/registry/registry.json +312 -22
- package/dist/mcp-data/registry/select.json +43 -8
- package/dist/mcp-data/registry/shell-app.json +4 -3
- package/dist/mcp-data/registry/tab-group.json +20 -3
- package/dist/mcp-data/registry/table-filter.json +26 -6
- package/dist/mcp-data/registry/table-group.json +59 -7
- package/dist/mcp-data/registry/table-preferences.json +511 -0
- package/dist/mcp-data/registry/table-saved-views.json +45 -7
- package/dist/mcp-data/registry/table-search.json +24 -6
- package/dist/mcp-data/registry/table-sort.json +22 -4
- package/dist/mcp-data/registry/table-toolbar.json +26 -6
- package/dist/mcp-data/registry/table.json +70 -4
- package/dist/react/components.d.ts +1 -0
- package/dist/react/components.js +1 -0
- package/dist/react/ds-table-preferences.d.ts +21 -0
- package/dist/react/ds-table-preferences.js +23 -0
- package/dist/react/ds-table.d.ts +1 -0
- package/dist/react/ds-table.js +1 -0
- package/dist/types/components/FilterMenu/FilterMenu.d.ts +16 -0
- package/dist/types/components/Menu/Menu.d.ts +2 -0
- package/dist/types/components/Select/Select.d.ts +5 -1
- package/dist/types/components/ShellApp/shell-app-types.d.ts +3 -1
- package/dist/types/components/TabGroup/TabGroup.d.ts +1 -0
- package/dist/types/components/Table/Table.d.ts +8 -0
- package/dist/types/components/TableFilter/TableFilter.d.ts +2 -0
- package/dist/types/components/TableGroup/TableGroup.d.ts +5 -0
- package/dist/types/components/TablePreferences/TablePreferences.d.ts +56 -0
- package/dist/types/components/TableSavedViews/TableSavedViews.d.ts +4 -0
- package/dist/types/components/TableSearch/TableSearch.d.ts +2 -0
- package/dist/types/components/TableSort/TableSort.d.ts +2 -0
- package/dist/types/components/TableToolbar/TableToolbar.d.ts +2 -0
- package/dist/types/components.d.ts +420 -18
- package/dist/vue/components.d.ts +1 -0
- package/dist/vue/components.js +1 -0
- package/dist/vue/ds-filter-menu.js +5 -0
- package/dist/vue/ds-menu.js +1 -0
- package/dist/vue/ds-select.js +2 -0
- package/dist/vue/ds-tab-group.js +1 -0
- package/dist/vue/ds-table-filter.js +1 -0
- package/dist/vue/ds-table-group.js +3 -0
- package/dist/vue/ds-table-preferences.d.ts +3 -0
- package/dist/vue/ds-table-preferences.js +45 -0
- package/dist/vue/ds-table-saved-views.js +2 -0
- package/dist/vue/ds-table-search.js +1 -0
- package/dist/vue/ds-table-sort.js +1 -0
- package/dist/vue/ds-table-toolbar.js +2 -1
- package/dist/vue/ds-table.js +5 -0
- package/package.json +1 -1
- package/dist/components/p-BlWNMytv.js.map +0 -1
- package/dist/components/p-CHBuzAYH.js +0 -2
- package/dist/components/p-CHUdAW1Q.js +0 -2
- package/dist/components/p-CUL5_8JM.js +0 -2
- package/dist/components/p-CUL5_8JM.js.map +0 -1
- package/dist/components/p-DEyvEIYL.js +0 -2
- package/dist/components/p-DVWOUQfT.js +0 -2
- package/dist/components/p-DVWOUQfT.js.map +0 -1
- package/dist/components/p-LZ8F08Fj.js.map +0 -1
- package/dist/components/p-xxuHxP3u.js.map +0 -1
- /package/dist/components/{p-ByoywoBH.js.map → p-B-9fdIWv.js.map} +0 -0
- /package/dist/components/{p-CnK36Be0.js.map → p-BINSI_KF.js.map} +0 -0
- /package/dist/components/{p-CK2S28gU.js.map → p-BPhbwXOv.js.map} +0 -0
- /package/dist/components/{p-CMq-jKEI.js.map → p-BPlWEidl.js.map} +0 -0
- /package/dist/components/{p-DyyfWSLB.js.map → p-BQaO7cg_.js.map} +0 -0
- /package/dist/components/{p-Br0dx2uP.js.map → p-BQsVI_vO.js.map} +0 -0
- /package/dist/components/{p-B_nPct4G.js.map → p-BbfBvMRR.js.map} +0 -0
- /package/dist/components/{p-D_QtZZR8.js.map → p-BmFeeR4q.js.map} +0 -0
- /package/dist/components/{p-CXAa9TUM.js.map → p-BnWxbhFP.js.map} +0 -0
- /package/dist/components/{p-CvplapTD.js.map → p-BnzsBNUY.js.map} +0 -0
- /package/dist/components/{p-DjCnGxSd.js.map → p-C7CZ9pnP.js.map} +0 -0
- /package/dist/components/{p-DBZwI7HY.js.map → p-C8ek-1SP.js.map} +0 -0
- /package/dist/components/{p-BEttT0UB.js.map → p-CAxDdYjh.js.map} +0 -0
- /package/dist/components/{p-BqGdNrVl.js.map → p-CE540WZ7.js.map} +0 -0
- /package/dist/components/{p-B5QVra1K.js.map → p-CI7VfYC3.js.map} +0 -0
- /package/dist/components/{p-AkSwrAKR.js.map → p-CLGtPE0K.js.map} +0 -0
- /package/dist/components/{p-C51ytXM6.js.map → p-CSnsz3Eb.js.map} +0 -0
- /package/dist/components/{p-Dx7WcWW1.js.map → p-CZOiTaNa.js.map} +0 -0
- /package/dist/components/{p-zZuAAiiI.js.map → p-Cq_Qpe_C.js.map} +0 -0
- /package/dist/components/{p-CweS0FfJ.js.map → p-CqlBlv55.js.map} +0 -0
- /package/dist/components/{p-C8XJgV1n.js.map → p-Cwz9TPVS.js.map} +0 -0
- /package/dist/components/{p-C1QHxVvP.js.map → p-D44g2Kw1.js.map} +0 -0
- /package/dist/components/{p-CKo2nySr.js.map → p-DC69DgAR.js.map} +0 -0
- /package/dist/components/{p-CQqZgTYk.js.map → p-DEGNrPLe.js.map} +0 -0
- /package/dist/components/{p-OxdAzO4v.js.map → p-DFjIBS5B.js.map} +0 -0
- /package/dist/components/{p-BwsS_Hyr.js.map → p-DGzn4k4h.js.map} +0 -0
- /package/dist/components/{p-Dj296RmE.js.map → p-DQQFN2sw.js.map} +0 -0
- /package/dist/components/{p-CIoeHcCk.js.map → p-DTDLlinw.js.map} +0 -0
- /package/dist/components/{p-CqeMumqy.js.map → p-DdspY23v.js.map} +0 -0
- /package/dist/components/{p-DzbEJN1A.js.map → p-Dk-8Ju0Q.js.map} +0 -0
- /package/dist/components/{p-Da9VpZX2.js.map → p-DtLQIMsa.js.map} +0 -0
- /package/dist/components/{p-Cw_npFwN.js.map → p-FPZbS19l.js.map} +0 -0
- /package/dist/components/{p-BMERUCe1.js.map → p-KBrC9IG4.js.map} +0 -0
- /package/dist/components/{p-CIYJhyKt.js.map → p-beCz9OnD.js.map} +0 -0
- /package/dist/components/{p-4DNyCYKM.js.map → p-mpk_Mm8_.js.map} +0 -0
- /package/dist/components/{p-DrjY8Mpy.js.map → p-n68x-ZKp.js.map} +0 -0
- /package/dist/components/{p-CNDTHTf6.js.map → p-omPm8_vx.js.map} +0 -0
- /package/dist/components/{p-lv4YQEsa.js.map → p-umAf0fBn.js.map} +0 -0
- /package/dist/components/{p-CBQzTgvI.js.map → p-y06IxxoN.js.map} +0 -0
- /package/dist/components/{p-CoE7yza3.js.map → p-yZRXPHDe.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["DATE_FILTER_RELATIVE_PRESETS","label","value","days","offset","ISO_DATE_PATTERN","isIsoCalendarDate","test","year","month","day","split","map","Number","date","Date","UTC","getUTCFullYear","getUTCMonth","getUTCDate","shiftIsoCalendarDate","toISOString","slice","dateFilterRelativeValue","preset","dateFilterRangeValue","start","end","ordered","parseDateFilterValue","startsWith","length","some","candidate","kind","rest","FILTER_MENU_WEEKDAYS","MONTH_FORMATTER","Intl","DateTimeFormat","timeZone","DATE_FORMATTER","weekday","filterMenuToday","today","getFullYear","String","getMonth","padStart","getDate","filterMenuCalendarMonth","shiftFilterMenuCalendarMonth","filterMenuCalendarMonthLabel","format","filterMenuCalendarDays","firstOfMonth","firstWeekday","getUTCDay","gridStart","Array","from","_","index","dateValue","inMonth","filterMenuCss","filterMenuId","ICON_SIZE","lg","md","sm","xs","DATE_MODE_TABS","id","RELATIVE_DATE_OPTIONS","FilterMenu","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","open","triggerLabel","showSelectedCount","icon","size","width","hasBorder","activeFill","collapseLabel","ariaLabel","filters","values","matchModes","side","align","sideOffset","TOKEN_CSS_LENGTHS","space050","alignOffset","menuWidth","menuWidthLg","menuLabel","categoriesLabel","clearLabel","searchPlaceholder","noResultsText","footerLayout","initialFocusVisible","shouldRender","closing","positionReady","pos","x","y","focusRingVisible","activeOptionIndex","captionCompact","dateModeByFilter","calendarMonthByFilter","pendingRangeStartByFilter","previewRangeEndByFilter","optionQueryByFilter","generatedId","triggerElement","pendingInitialFocusVisible","closeTimer","hasLoaded","closingSnapshot","position","AnchoredPositionController","getAnchor","resolvedAnchor","getPopup","el","querySelector","getOwnerDocument","ownerDocument","measure","anchor","popup","anchorRect","getBoundingClientRect","sectionInsetPx","resolveCssLengthPx","TOKEN_DEFAULTS","popupWidth","offsetWidth","popupFallbackWidth","popupHeight","offsetHeight","popupFallbackHeight","sideOffsetPx","alignOffsetPx","resolveChoicePopupAlignOffset","viewportPadPx","viewportPad","viewportWidth","window","innerWidth","viewportHeight","innerHeight","collisionRect","resolveAnchoredOverlayBoundaryRect","boundary","apply","onReady","liveUpdate","observeResize","topLayer","interaction","AnchoredOverlayInteractionController","onOutsideActivation","close","componentDidLoad","syncCaptionCompactObserver","onOpenChange","connectedCallback","disconnectedCallback","disconnectCaptionCompactObserver","unobserve","teardownListeners","onCollapseLabelChange","isOpen","setupListeners","schedule","focusInitialCategory","cancel","captureClosingSnapshot","duration","resolveMotionTimeMs","motionShort2","animationDurationShort3","finishClose","setTimeout","onPositionInputChange","handleKeyDown","event","key","preventDefault","tabLeavesPopup","moveFocusAfterTab","shiftKey","anchorId","document","getElementById","usesInternalTrigger","menuFallbackHeight","connect","observe","disconnect","clearTimeout","restoreFocus","focusAnchor","dsOpenChange","emit","dsClose","toggleFromTrigger","detail","handleTriggerKeyDown","matches","hidePopover","dsAfterClose","filter","options","option","Object","fromEntries","entries","isArray","activeFilterId","requestAnimationFrame","focus","selectedFilter","find","selectedCount","totalSelected","reduce","total","activeFilterCount","selectCategory","filterId","dsActiveFilterChange","handleCategoryKeyDown","currentIndex","findIndex","nextIndex","handlePanelKeyDown","handleOptionKeyDown","visibleOptions","selectOption","includes","enabled","optionIndex","isInactive","current","indexOf","next","direction","optionMatchesQuery","query","normalized","trim","toLocaleLowerCase","description","booleanOption","fieldLabel","setOptionQuery","firstEnabled","content","scrollTop","handleOptionSearchKeyDown","toggleMultiple","checked","selected","Set","add","delete","has","dsChange","dateMode","setDateMode","mode","parsed","initialDate","clearCalendarRangePreview","calendarMonth","moveCalendarMonth","selectCalendarDate","pendingStart","previewCalendarRange","focusCalendarDate","targetMonth","handleCalendarDayKeyDown","target","renderRelativeDateOptions","relativeFilter","h","class","role","ChoiceOptionRow","active","usesSubtext","tabIndex","onFocus","onKeyDown","onHover","onSelect","renderDateCalendar","range","previewEnd","previewStart","sort","previewFinish","preferredFocus","focusDate","variant","onDsClick","as","emphasis","color","onMouseLeave","selectedInRange","Boolean","previewInRange","inRange","rangeEdge","textColor","type","onMouseEnter","onClick","renderDateFilter","hasContainer","tabs","onDsChange","stopPropagation","renderOptionSearch","ChoiceSearch","hasFocusBoundary","hasInteractionFill","placeholder","controls","inputRef","undefined","onValueChange","renderNoOptionResults","body","renderOptions","allOptions","choiceListUsesSubtext","subtext","isSelected","leading","presentation","captionIconOnly","captionCompactDisconnect","observeTableCaptionCompact","compact","renderCaptionTooltip","trigger","renderFooter","categoriesClear","dsClear","renderMatchModeFooter","nextMode","dsMatchModeChange","render","state","activeFilter","hasActiveFilters","categoriesClearFooter","textVariant","CONTROL_TEXT_VARIANT","iconSize","popupId","popupStyle","left","top","transform","Math","round","zIndex","visibility","Host","controlWidthClass","ref","element","inputId","name","lineTruncation","popover","style","count","divider","onMouseDown","hasRing","intent","contrast","isInset","rounded"],"sources":["src/wc/utils/date-filter-value.ts","src/wc/components/FilterMenu/filter-menu-calendar.ts","src/wc/components/FilterMenu/FilterMenu.css?tag=ds-filter-menu&encapsulation=scoped","src/wc/components/FilterMenu/FilterMenu.tsx"],"sourcesContent":["export const DATE_FILTER_RELATIVE_PRESETS = [\n { label: 'Today', value: 'today', days: 1, offset: 0 },\n { label: 'Yesterday', value: 'yesterday', days: 1, offset: -1 },\n { label: 'Last 7 days', value: 'last-7-days', days: 7, offset: 0 },\n { label: 'Last 14 days', value: 'last-14-days', days: 14, offset: 0 },\n { label: 'Last 30 days', value: 'last-30-days', days: 30, offset: 0 },\n { label: 'Last 60 days', value: 'last-60-days', days: 60, offset: 0 },\n { label: 'Last 90 days', value: 'last-90-days', days: 90, offset: 0 },\n] as const;\n\nexport type DateFilterRelativePreset = (typeof DATE_FILTER_RELATIVE_PRESETS)[number]['value'];\nexport type DateFilterRelativeValue = `relative:${DateFilterRelativePreset}`;\nexport type DateFilterRangeValue = `range:${string}/${string}`;\nexport type DateFilterValue = DateFilterRelativeValue | DateFilterRangeValue;\n\nexport interface DateFilterRange {\n start: string;\n end: string;\n}\n\nexport type ParsedDateFilterValue =\n | { kind: 'relative'; preset: DateFilterRelativePreset }\n | ({ kind: 'range' } & DateFilterRange);\n\nconst ISO_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport function isIsoCalendarDate(value: string): boolean {\n if (!ISO_DATE_PATTERN.test(value)) return false;\n const [year, month, day] = value.split('-').map(Number);\n const date = new Date(Date.UTC(year, month - 1, day));\n return (\n date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day\n );\n}\n\nexport function shiftIsoCalendarDate(value: string, days: number): string {\n if (!isIsoCalendarDate(value)) return '';\n const [year, month, day] = value.split('-').map(Number);\n const date = new Date(Date.UTC(year, month - 1, day + days));\n return date.toISOString().slice(0, 10);\n}\n\nexport function dateFilterRelativeValue(preset: DateFilterRelativePreset): DateFilterRelativeValue {\n return `relative:${preset}`;\n}\n\nexport function dateFilterRangeValue(start: string, end: string = start): DateFilterRangeValue {\n const ordered = start <= end ? [start, end] : [end, start];\n return `range:${ordered[0]}/${ordered[1]}`;\n}\n\nexport function parseDateFilterValue(value: unknown): ParsedDateFilterValue | null {\n if (typeof value !== 'string' || !value) return null;\n\n if (value.startsWith('relative:')) {\n const preset = value.slice('relative:'.length) as DateFilterRelativePreset;\n return DATE_FILTER_RELATIVE_PRESETS.some(candidate => candidate.value === preset)\n ? { kind: 'relative', preset }\n : null;\n }\n\n if (value.startsWith('range:')) {\n const [start, end, ...rest] = value.slice('range:'.length).split('/');\n if (rest.length || !isIsoCalendarDate(start) || !isIsoCalendarDate(end)) return null;\n return start <= end ? { kind: 'range', start, end } : { kind: 'range', start: end, end: start };\n }\n\n // Preserve the previous single-date contract as a one-day range.\n return isIsoCalendarDate(value) ? { kind: 'range', start: value, end: value } : null;\n}\n\nexport function normalizeDateFilterValue(value: unknown): DateFilterValue | '' {\n const parsed = parseDateFilterValue(value);\n if (!parsed) return '';\n return parsed.kind === 'relative'\n ? dateFilterRelativeValue(parsed.preset)\n : dateFilterRangeValue(parsed.start, parsed.end);\n}\n\nexport function resolveDateFilterRange(\n value: unknown,\n referenceDate: string\n): DateFilterRange | null {\n if (!isIsoCalendarDate(referenceDate)) return null;\n const parsed = parseDateFilterValue(value);\n if (!parsed) return null;\n if (parsed.kind === 'range') return { start: parsed.start, end: parsed.end };\n\n const preset = DATE_FILTER_RELATIVE_PRESETS.find(candidate => candidate.value === parsed.preset);\n if (!preset) return null;\n const end = shiftIsoCalendarDate(referenceDate, preset.offset);\n return { start: shiftIsoCalendarDate(end, -(preset.days - 1)), end };\n}\n","import { isIsoCalendarDate, shiftIsoCalendarDate } from '../../utils';\n\nexport interface FilterMenuCalendarDay {\n value: string;\n day: number;\n inMonth: boolean;\n label: string;\n}\n\nexport const FILTER_MENU_WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nconst MONTH_FORMATTER = new Intl.DateTimeFormat('en-US', {\n month: 'long',\n year: 'numeric',\n timeZone: 'UTC',\n});\nconst DATE_FORMATTER = new Intl.DateTimeFormat('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n timeZone: 'UTC',\n});\n\nexport function filterMenuToday(): string {\n const today = new Date();\n const year = today.getFullYear();\n const month = String(today.getMonth() + 1).padStart(2, '0');\n const day = String(today.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\nexport function filterMenuCalendarMonth(value: string): string {\n return isIsoCalendarDate(value) ? value.slice(0, 7) : filterMenuToday().slice(0, 7);\n}\n\nexport function shiftFilterMenuCalendarMonth(value: string, offset: number): string {\n const [year, month] = value.split('-').map(Number);\n const date = new Date(Date.UTC(year, month - 1 + offset, 1));\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`;\n}\n\nexport function filterMenuCalendarMonthLabel(value: string): string {\n const [year, month] = value.split('-').map(Number);\n return MONTH_FORMATTER.format(new Date(Date.UTC(year, month - 1, 1)));\n}\n\nexport function filterMenuCalendarDays(value: string): FilterMenuCalendarDay[] {\n const [year, month] = value.split('-').map(Number);\n const firstOfMonth = `${year}-${String(month).padStart(2, '0')}-01`;\n const firstWeekday = new Date(`${firstOfMonth}T00:00:00Z`).getUTCDay();\n const gridStart = shiftIsoCalendarDate(firstOfMonth, -firstWeekday);\n return Array.from({ length: 42 }, (_, index) => {\n const dateValue = shiftIsoCalendarDate(gridStart, index);\n const date = new Date(`${dateValue}T00:00:00Z`);\n return {\n value: dateValue,\n day: date.getUTCDate(),\n inMonth: dateValue.startsWith(`${value}-`),\n label: DATE_FORMATTER.format(date),\n };\n });\n}\n","@import '../../utils/radius.css';\n@import '../../utils/choice-list.css';\n@import '../../utils/chrome-header.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/control-width.css';\n@import '../../utils/select-trigger.css';\n@import '../../utils/search-control.css';\n@import '../../utils/table-caption-control.css';\n\n:host(.filter-menu-host--external-trigger) {\n display: contents;\n}\n\n.filter-menu {\n display: flex;\n min-height: 0;\n flex-direction: column;\n color: var(--color-foreground-secondary);\n}\n\n.filter-menu__body {\n display: grid;\n grid-template-columns: var(--dimension-menu-width-xs) var(--dimension-menu-width-sm);\n min-height: calc(var(--dimension-size-800) * 4 + var(--dimension-space-150));\n max-height: calc(100vh - var(--dimension-size-800) - var(--dimension-size-600));\n}\n\n.filter-menu__category-pane {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n border-inline-end: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n\n.filter-menu__categories {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.filter-menu__category-section {\n display: flex;\n min-width: 0;\n flex-direction: column;\n}\n\n.filter-menu__category-section.ds-choice-section--divided {\n padding-block-end: var(--dimension-space-050);\n}\n\n.filter-menu__category {\n justify-content: space-between;\n width: 100%;\n border: 0;\n background: transparent;\n color: var(--color-foreground-secondary);\n cursor: default;\n text-align: start;\n}\n\n.filter-menu__category--active {\n color: var(--color-foreground-primary);\n}\n\n.filter-menu__category-dot-box {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--ds-control-icon, var(--dimension-iconography-md));\n height: var(--ds-control-icon, var(--dimension-iconography-md));\n pointer-events: none;\n}\n\n.filter-menu__options {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n}\n\n.filter-menu__options-content {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1 1 auto;\n flex-direction: column;\n overflow: auto;\n}\n\n.filter-menu__option-search {\n position: relative;\n flex: 0 0 var(--dimension-size-500);\n min-width: 0;\n min-height: var(--dimension-size-500);\n background: transparent;\n}\n\n.filter-menu__option-search::after {\n content: '';\n position: absolute;\n inset: auto 0 0;\n height: var(--dimension-stroke-width-012);\n background-color: var(--color-border-tertiary);\n pointer-events: none;\n}\n\n.filter-menu__option-search .select-search {\n height: 100%;\n background: transparent;\n}\n\n.filter-menu__options--date,\n.filter-menu__option-list--date,\n.filter-menu__date {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n}\n\n.filter-menu__option-list--date,\n.filter-menu__date {\n flex: 1 1 auto;\n}\n\n.filter-menu__date-header {\n flex: 0 0 var(--dimension-size-500);\n justify-content: center;\n min-block-size: var(--dimension-size-500);\n padding: var(--dimension-space-050);\n background: var(--color-background-secondary);\n}\n\n.filter-menu__date-body {\n display: flex;\n flex: 1 1 auto;\n min-height: 0;\n flex-direction: column;\n}\n\n.filter-menu__date-relative {\n flex: 1 1 auto;\n}\n\n.filter-menu__calendar {\n display: flex;\n min-height: 0;\n flex-direction: column;\n padding: var(--dimension-space-100);\n}\n\n.filter-menu__calendar-heading {\n display: grid;\n grid-template-columns: var(--dimension-size-400) minmax(0, 1fr) var(--dimension-size-400);\n align-items: center;\n text-align: center;\n}\n\n.filter-menu__calendar-nav--previous {\n justify-self: start;\n}\n\n.filter-menu__calendar-nav--next {\n justify-self: end;\n}\n\n.filter-menu__calendar-weekdays,\n.filter-menu__calendar-grid {\n display: grid;\n grid-template-columns: repeat(7, minmax(0, 1fr));\n column-gap: var(--dimension-space-050);\n}\n\n.filter-menu__calendar-grid {\n row-gap: var(--dimension-space-050);\n}\n\n.filter-menu__calendar-weekdays {\n align-items: center;\n min-height: var(--dimension-size-400);\n margin-block-start: var(--dimension-space-050);\n color: var(--color-foreground-secondary);\n text-align: center;\n}\n\n.filter-menu__calendar-day {\n appearance: none;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 0;\n width: 100%;\n height: var(--dimension-size-400);\n padding: 0;\n border: 0;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n color: var(--color-foreground-primary);\n cursor: default;\n}\n\n.filter-menu__calendar-day--outside {\n color: var(--color-foreground-tertiary);\n}\n\n.filter-menu__calendar-day--in-range {\n background: var(--color-background-faint-brand);\n color: var(--color-foreground-primary);\n}\n\n/* Pending range preview stays faint while the already-selected start keeps its bold edge. */\n.filter-menu__calendar-day--range-preview {\n background: var(--color-background-faint-brand);\n}\n\n.filter-menu__calendar-day--today {\n color: var(--color-foreground-primary);\n}\n\n.filter-menu__calendar-day--range-edge {\n background: var(--color-background-bold-brand);\n color: var(--color-foreground-on-bold-background-primary);\n}\n\n.filter-menu__footer {\n flex: 0 0 auto;\n}\n\n.filter-menu__footer--categories-clear .ds-choice-footer__content {\n justify-content: flex-start;\n}\n\n.filter-menu__footer--categories-clear[aria-hidden='true']::before {\n visibility: hidden;\n}\n\n.filter-menu__clear {\n color: var(--color-foreground-bold-brand);\n}\n\n.filter-menu__match-mode-footer {\n flex: 0 0 auto;\n}\n\n.filter-menu__match-mode-content {\n justify-content: flex-start;\n padding-inline: calc(\n var(--dimension-space-050) + var(--ds-control-padding-inline, var(--dimension-space-075)) +\n var(--ds-control-label-inset, var(--dimension-space-025))\n );\n}\n\n.filter-menu__match-mode-toggle {\n appearance: none;\n display: inline-flex;\n align-items: center;\n padding: 0;\n border: 0;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n cursor: default;\n}\n\n@media (forced-colors: active) {\n .filter-menu__category-pane {\n border-inline-end-color: var(--ds-forced-color-content);\n }\n\n .filter-menu__calendar-day--range-edge {\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n }\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Prop,\n State,\n type VNode,\n Watch,\n} from '@stencil/core';\nimport {\n CONTROL_TEXT_VARIANT,\n DATE_FILTER_RELATIVE_PRESETS,\n controlWidthClass,\n dateFilterRangeValue,\n dateFilterRelativeValue,\n parseDateFilterValue,\n resolveChoicePopupAlignOffset,\n resolveCssLengthPx,\n resolveMotionTimeMs,\n shiftIsoCalendarDate,\n TOKEN_CSS_LENGTHS,\n TOKEN_DEFAULTS,\n type ControlWidth,\n} from '../../utils';\nimport { observeTableCaptionCompact } from '../../utils/table-caption-compact';\nimport type { AnchoredAlign, AnchoredSide } from '../../utils/anchored-position';\nimport { AnchoredPositionController } from '../../utils/anchored-position-controller';\nimport { AnchoredOverlayInteractionController } from '../../utils/anchored-overlay-interaction-controller';\nimport { resolveAnchoredOverlayBoundaryRect } from '../../utils/anchored-overlay-boundary';\nimport { ChoiceOptionRow, ChoiceSearch } from '../../utils/choice-list-parts';\nimport { choiceListUsesSubtext } from '../../utils/choice-list';\nimport {\n FILTER_MENU_WEEKDAYS,\n filterMenuCalendarDays,\n filterMenuCalendarMonth,\n filterMenuCalendarMonthLabel,\n filterMenuToday,\n shiftFilterMenuCalendarMonth,\n} from './filter-menu-calendar';\n\nexport type FilterMenuFilterKind = 'single' | 'multiple' | 'boolean' | 'date';\nexport type FilterMenuSize = 'lg' | 'md' | 'sm' | 'xs';\nexport type FilterMenuWidth = ControlWidth;\nexport type FilterMenuFooterLayout = 'summary' | 'categories-clear';\nexport type FilterMenuMatchMode = 'any' | 'all';\ntype FilterMenuDateMode = 'range' | 'relative';\n\nexport interface FilterMenuOption {\n label: string;\n value: string;\n description?: string;\n isInactive?: boolean;\n}\n\nexport interface FilterMenuFilter {\n id: string;\n label: string;\n kind: FilterMenuFilterKind;\n options?: FilterMenuOption[];\n description?: string;\n fieldLabel?: string;\n /** Draw a standard menu-section divider after this category. */\n divider?: boolean;\n}\n\nexport type FilterMenuValue = string[] | boolean | string;\nexport type FilterMenuValues = Record<string, FilterMenuValue | undefined>;\nexport type FilterMenuMatchModes = Record<string, FilterMenuMatchMode | undefined>;\n\nexport interface FilterMenuChangeDetail {\n filterId: string;\n value: FilterMenuValue;\n}\n\nexport interface FilterMenuMatchModeChangeDetail {\n filterId: string;\n mode: FilterMenuMatchMode;\n}\n\nlet filterMenuId = 0;\n\nconst ICON_SIZE: Record<FilterMenuSize, 'lg' | 'md' | 'sm' | 'xs'> = {\n lg: 'lg',\n md: 'md',\n sm: 'sm',\n xs: 'xs',\n};\n\nconst DATE_MODE_TABS = [\n { id: 'relative', label: 'Relative' },\n { id: 'range', label: 'Range' },\n];\n\nconst RELATIVE_DATE_OPTIONS: FilterMenuOption[] = DATE_FILTER_RELATIVE_PRESETS.map(preset => ({\n label: preset.label,\n value: dateFilterRelativeValue(preset.value),\n}));\n\n@Component({\n tag: 'ds-filter-menu',\n styleUrl: 'FilterMenu.css',\n scoped: true,\n})\nexport class FilterMenu {\n @Element() el!: HTMLElement;\n\n /** Controlled popup visibility. */\n @Prop({ mutable: true }) open: boolean = false;\n /** Select trigger text. */\n @Prop() triggerLabel: string = 'Filters';\n /** Append the active-filter count to the visible trigger label. */\n @Prop() showSelectedCount: boolean = true;\n /** Optional select trigger prefix icon name. */\n @Prop() icon: string | undefined = 'Filters';\n /** Select trigger density. */\n @Prop() size: FilterMenuSize = 'md';\n /** Select trigger width fit. */\n @Prop() width: FilterMenuWidth = 'hug';\n /** Show the surface-aware inset border around the select trigger. */\n @Prop() hasBorder: boolean = true;\n /** Show selected interaction fill when one or more criteria are active. */\n @Prop() activeFill: boolean = false;\n /**\n * Opt into table-caption icon-only chrome below 900px. The trigger omits its\n * visible label and chevron; keep an accessible name via aria-label.\n */\n @Prop({ reflect: true }) collapseLabel: boolean = false;\n /** ID applied to the internal select trigger. */\n @Prop() inputId: string | undefined;\n /** Direct accessible name for the internal select trigger. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n /** Product-owned filter categories and option definitions. */\n @Prop() filters: FilterMenuFilter[] = [];\n /** Controlled values keyed by filter id. */\n @Prop() values: FilterMenuValues = {};\n /** Controlled any/all match mode keyed by multiple-choice filter id. Defaults to any. */\n @Prop() matchModes: FilterMenuMatchModes = {};\n /** Controlled category shown in the option pane. */\n @Prop() activeFilterId: string | undefined;\n /** External trigger element to position against. */\n @Prop() anchor: HTMLElement | undefined;\n /** ID of the external trigger element used for positioning and focus return. */\n @Prop() anchorId: string | undefined;\n /** Explicit collision owner; otherwise the nearest data-ds-overlay-boundary ancestor is used. */\n @Prop() boundary: HTMLElement | undefined;\n /** Preferred popup side; collision handling may flip it. */\n @Prop() side: AnchoredSide = 'bottom';\n /** Cross-axis alignment against the trigger. */\n @Prop() align: AnchoredAlign = 'end';\n /** Gap between trigger and popup — number in px or a TokoMo length. */\n @Prop() sideOffset: number | string = TOKEN_CSS_LENGTHS.space050;\n /** Cross-axis offset — number in px or a TokoMo length. */\n @Prop() alignOffset: number | string = 0;\n /** Popup width. It remains clamped to its collision boundary by the component recipe. */\n @Prop() menuWidth: string = TOKEN_CSS_LENGTHS.menuWidthLg;\n /** Accessible name for the non-modal filter dialog. */\n @Prop() menuLabel: string = 'Filters';\n /** Accessible name for the category tab list. */\n @Prop() categoriesLabel: string = 'Filter categories';\n /** Footer action and date-clear accessible label. */\n @Prop() clearLabel: string = 'Clear';\n /** Placeholder shown in each non-date option search header. */\n @Prop() searchPlaceholder: string = 'Search';\n /** Empty-state text shown when an option search has no matches. */\n @Prop() noResultsText: string = 'No results';\n /** Footer recipe: full-width selected summary or reserved category-pane Clear action. */\n @Prop() footerLayout: FilterMenuFooterLayout = 'summary';\n /** Show a visible focus ring on initial entry after keyboard activation. */\n @Prop() initialFocusVisible: boolean = false;\n\n @State() private shouldRender = false;\n @State() private closing = false;\n @State() private positionReady = false;\n @State() private pos: { x: number; y: number } = { x: 0, y: 0 };\n @State() private focusRingVisible = false;\n @State() private activeOptionIndex = 0;\n @State() private captionCompact = false;\n @State() private dateModeByFilter: Record<string, FilterMenuDateMode> = {};\n @State() private calendarMonthByFilter: Record<string, string> = {};\n @State() private pendingRangeStartByFilter: Record<string, string> = {};\n @State() private previewRangeEndByFilter: Record<string, string> = {};\n @State() private optionQueryByFilter: Record<string, string> = {};\n\n /** Requests a controlled value replacement without closing the popup. */\n @Event() dsChange!: EventEmitter<FilterMenuChangeDetail>;\n /** Requests that the consumer clear every filter value. */\n @Event() dsClear!: EventEmitter<void>;\n /** Requests a controlled any/all mode replacement for a multiple-choice filter. */\n @Event() dsMatchModeChange!: EventEmitter<FilterMenuMatchModeChangeDetail>;\n /** Requests a controlled active-category replacement. */\n @Event() dsActiveFilterChange!: EventEmitter<string>;\n /** Requests that the controlled popup close. */\n @Event() dsClose!: EventEmitter<void>;\n /** Emitted whenever internal select-trigger activation changes popup visibility. */\n @Event() dsOpenChange!: EventEmitter<boolean>;\n /** Emitted after exit motion and rendered popup removal complete. */\n @Event() dsAfterClose!: EventEmitter<void>;\n\n private readonly generatedId = `ds-filter-menu-${++filterMenuId}`;\n private triggerElement: HTMLButtonElement | null = null;\n private pendingInitialFocusVisible = false;\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n private captionCompactDisconnect: (() => void) | undefined;\n private hasLoaded = false;\n private closingSnapshot: {\n filters: FilterMenuFilter[];\n values: FilterMenuValues;\n matchModes: FilterMenuMatchModes;\n activeFilterId: string | undefined;\n } | null = null;\n\n private readonly position = new AnchoredPositionController({\n getAnchor: () => this.resolvedAnchor,\n getPopup: () => this.el.querySelector<HTMLElement>('.filter-menu-popup'),\n getOwnerDocument: () => this.el.ownerDocument,\n measure: (anchor, popup) => {\n if (!this.open) return null;\n const anchorRect = anchor.getBoundingClientRect();\n const sectionInsetPx = resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n return {\n anchorRect,\n popupWidth: popup.offsetWidth || this.popupFallbackWidth,\n popupHeight: popup.offsetHeight || this.popupFallbackHeight,\n side: this.side,\n align: this.align,\n sideOffsetPx: resolveCssLengthPx(this.sideOffset, TOKEN_DEFAULTS.space050),\n alignOffsetPx: resolveChoicePopupAlignOffset({\n align: this.align,\n alignOffsetPx: resolveCssLengthPx(this.alignOffset, 0),\n sectionInsetPx,\n }),\n viewportPadPx: this.viewportPad,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n collisionRect: resolveAnchoredOverlayBoundaryRect(anchor, this.boundary),\n };\n },\n apply: ({ x, y }) => {\n this.pos = { x, y };\n },\n onReady: () => {\n this.positionReady = true;\n },\n liveUpdate: 'double-frame',\n observeResize: true,\n topLayer: true,\n });\n private readonly interaction = new AnchoredOverlayInteractionController({\n getAnchor: () => this.resolvedAnchor,\n getPopup: () => this.el.querySelector<HTMLElement>('.filter-menu-popup'),\n getOwnerDocument: () => this.el.ownerDocument,\n onOutsideActivation: () => this.close(),\n });\n\n componentDidLoad() {\n this.hasLoaded = true;\n this.syncCaptionCompactObserver();\n if (this.open) this.onOpenChange(true);\n }\n\n connectedCallback() {\n if (!this.hasLoaded) return;\n this.syncCaptionCompactObserver();\n if (this.open) this.onOpenChange(true);\n }\n\n disconnectedCallback() {\n this.disconnectCaptionCompactObserver();\n this.position.unobserve();\n this.teardownListeners();\n }\n\n @Watch('collapseLabel')\n onCollapseLabelChange() {\n this.syncCaptionCompactObserver();\n }\n\n @Watch('open')\n onOpenChange(isOpen: boolean) {\n if (isOpen) {\n this.teardownListeners();\n this.closingSnapshot = null;\n this.shouldRender = true;\n this.closing = false;\n this.positionReady = false;\n this.focusRingVisible = this.pendingInitialFocusVisible || this.initialFocusVisible;\n this.setupListeners();\n this.position.schedule(() => this.focusInitialCategory());\n return;\n }\n\n if (!this.shouldRender) return;\n this.position.cancel();\n this.captureClosingSnapshot();\n this.closing = true;\n this.teardownListeners();\n const duration = resolveMotionTimeMs(\n TOKEN_DEFAULTS.motionShort2,\n TOKEN_DEFAULTS.animationDurationShort3\n );\n if (duration <= 0) {\n this.finishClose();\n return;\n }\n this.closeTimer = setTimeout(() => this.finishClose(), duration);\n }\n\n @Watch('anchor')\n @Watch('anchorId')\n @Watch('boundary')\n @Watch('side')\n @Watch('align')\n @Watch('sideOffset')\n @Watch('alignOffset')\n @Watch('menuWidth')\n onPositionInputChange() {\n if (this.open) this.position.schedule();\n }\n\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n if (!this.shouldRender || this.closing) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n return;\n }\n if (event.key !== 'Tab' || !this.tabLeavesPopup(event)) return;\n event.preventDefault();\n this.close(false);\n this.interaction.moveFocusAfterTab(event.shiftKey);\n }\n\n private get resolvedAnchor(): HTMLElement | null {\n if (this.anchor) return this.anchor;\n if (this.anchorId) return document.getElementById(this.anchorId);\n return this.triggerElement;\n }\n\n private get usesInternalTrigger(): boolean {\n return !this.anchor && !this.anchorId;\n }\n\n private get viewportPad(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n }\n\n private get popupFallbackWidth(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuWidthLg, TOKEN_DEFAULTS.menuWidthLg);\n }\n\n private get popupFallbackHeight(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuFallbackHeight, TOKEN_DEFAULTS.menuFallbackHeight);\n }\n\n private setupListeners() {\n this.interaction.connect();\n this.position.observe();\n }\n\n private teardownListeners() {\n this.position.unobserve();\n this.interaction.disconnect();\n if (this.closeTimer) {\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private close(restoreFocus = true) {\n this.captureClosingSnapshot();\n if (restoreFocus) this.interaction.focusAnchor();\n this.dsOpenChange.emit(false);\n this.dsClose.emit();\n this.open = false;\n this.onOpenChange(false);\n }\n\n private toggleFromTrigger(event: MouseEvent) {\n if (this.open) {\n this.close();\n return;\n }\n this.pendingInitialFocusVisible = event.detail === 0;\n this.open = true;\n this.dsOpenChange.emit(true);\n this.onOpenChange(true);\n }\n\n private handleTriggerKeyDown(event: KeyboardEvent) {\n if (event.key !== 'ArrowDown' || this.open) return;\n event.preventDefault();\n this.pendingInitialFocusVisible = true;\n this.open = true;\n this.dsOpenChange.emit(true);\n this.onOpenChange(true);\n }\n\n private finishClose() {\n const popup = this.el.querySelector<HTMLElement>('.filter-menu-popup');\n if (popup?.matches(':popover-open')) popup.hidePopover();\n this.shouldRender = false;\n this.closing = false;\n this.closingSnapshot = null;\n this.closeTimer = null;\n this.dateModeByFilter = {};\n this.calendarMonthByFilter = {};\n this.pendingRangeStartByFilter = {};\n this.previewRangeEndByFilter = {};\n this.optionQueryByFilter = {};\n this.dsAfterClose.emit();\n }\n\n private captureClosingSnapshot() {\n if (this.closingSnapshot) return;\n this.closingSnapshot = {\n filters: this.filters.map(filter => ({\n ...filter,\n options: filter.options?.map(option => ({ ...option })),\n })),\n values: Object.fromEntries(\n Object.entries(this.values).map(([key, value]) => [\n key,\n Array.isArray(value) ? [...value] : value,\n ])\n ),\n matchModes: { ...this.matchModes },\n activeFilterId: this.activeFilterId,\n };\n }\n\n private focusInitialCategory() {\n requestAnimationFrame(() => {\n this.el.querySelector<HTMLElement>('.filter-menu__category[tabindex=\"0\"]')?.focus();\n this.pendingInitialFocusVisible = false;\n });\n }\n\n private tabLeavesPopup(event: KeyboardEvent): boolean {\n return this.interaction.tabLeavesPopup(event);\n }\n\n private selectedFilter(filters: FilterMenuFilter[], activeFilterId: string | undefined) {\n return filters.find(filter => filter.id === activeFilterId) ?? filters[0];\n }\n\n private selectedCount(filter: FilterMenuFilter, values: FilterMenuValues): number {\n const value = values[filter.id];\n if (filter.kind === 'multiple') return Array.isArray(value) ? value.length : 0;\n if (filter.kind === 'boolean') return value === true ? 1 : 0;\n return typeof value === 'string' && value.length > 0 ? 1 : 0;\n }\n\n private totalSelected(filters: FilterMenuFilter[], values: FilterMenuValues): number {\n return filters.reduce((total, filter) => total + this.selectedCount(filter, values), 0);\n }\n\n private activeFilterCount(filters: FilterMenuFilter[], values: FilterMenuValues): number {\n return filters.filter(filter => this.selectedCount(filter, values) > 0).length;\n }\n\n private selectCategory(filterId: string, focus = false) {\n this.activeOptionIndex = 0;\n this.dsActiveFilterChange.emit(filterId);\n if (!focus) return;\n requestAnimationFrame(() => {\n this.el.querySelector<HTMLElement>(`[data-filter-category=\"${filterId}\"]`)?.focus();\n });\n }\n\n private handleCategoryKeyDown(\n event: KeyboardEvent,\n filters: FilterMenuFilter[],\n filterId: string\n ) {\n const currentIndex = filters.findIndex(filter => filter.id === filterId);\n let nextIndex: number;\n if (event.key === 'ArrowDown') nextIndex = (currentIndex + 1) % filters.length;\n else if (event.key === 'ArrowUp')\n nextIndex = (currentIndex - 1 + filters.length) % filters.length;\n else if (event.key === 'Home') nextIndex = 0;\n else if (event.key === 'End') nextIndex = filters.length - 1;\n else if (event.key === 'ArrowRight') {\n event.preventDefault();\n requestAnimationFrame(() => {\n this.el\n .querySelector<HTMLElement>(\n '.filter-menu__options [role=\"option\"], .filter-menu__options [data-date-option], .filter-menu__options input'\n )\n ?.focus();\n });\n return;\n } else return;\n\n event.preventDefault();\n this.focusRingVisible = true;\n this.selectCategory(filters[nextIndex].id, true);\n }\n\n private handlePanelKeyDown(event: KeyboardEvent, filterId: string) {\n if (event.key !== 'ArrowLeft') return;\n event.preventDefault();\n this.el.querySelector<HTMLElement>(`[data-filter-category=\"${filterId}\"]`)?.focus();\n }\n\n private handleOptionKeyDown(\n event: KeyboardEvent,\n filter: FilterMenuFilter,\n option: FilterMenuOption,\n index: number,\n values: FilterMenuValues,\n visibleOptions: FilterMenuOption[] = filter.options ?? []\n ) {\n if (event.key === 'ArrowLeft') {\n this.handlePanelKeyDown(event, filter.id);\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.selectOption(filter, option, values);\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) return;\n event.preventDefault();\n const enabled = visibleOptions\n .map((candidate, optionIndex) => ({ candidate, optionIndex }))\n .filter(({ candidate }) => !candidate.isInactive)\n .map(({ optionIndex }) => optionIndex);\n if (!enabled.length) return;\n const current = enabled.indexOf(index);\n let next: number;\n if (event.key === 'Home') next = enabled[0];\n else if (event.key === 'End') next = enabled[enabled.length - 1];\n else {\n const direction = event.key === 'ArrowDown' ? 1 : -1;\n const start = current >= 0 ? current : direction === 1 ? -1 : 0;\n next = enabled[(start + direction + enabled.length) % enabled.length];\n }\n this.activeOptionIndex = next;\n this.focusRingVisible = true;\n requestAnimationFrame(() => {\n this.el\n .querySelector<HTMLElement>(`#${this.generatedId}-${filter.id}-option-${next}`)\n ?.focus();\n });\n }\n\n private optionMatchesQuery(option: FilterMenuOption, query: string): boolean {\n const normalized = query.trim().toLocaleLowerCase();\n if (!normalized) return true;\n return `${option.label} ${option.description ?? ''}`.toLocaleLowerCase().includes(normalized);\n }\n\n private visibleOptions(\n filter: FilterMenuFilter,\n query = this.optionQueryByFilter[filter.id] ?? ''\n ) {\n if (filter.kind === 'boolean') {\n const option = this.booleanOption(filter);\n return this.optionMatchesQuery(option, query) ? [option] : [];\n }\n return (filter.options ?? []).filter(option => this.optionMatchesQuery(option, query));\n }\n\n private booleanOption(filter: FilterMenuFilter): FilterMenuOption {\n return {\n label: filter.fieldLabel ?? filter.label,\n value: 'true',\n description: filter.description,\n };\n }\n\n private setOptionQuery(filter: FilterMenuFilter, value: string) {\n const visibleOptions = this.visibleOptions(filter, value);\n const firstEnabled = visibleOptions.findIndex(option => !option.isInactive);\n this.activeOptionIndex = firstEnabled;\n this.focusRingVisible = false;\n this.optionQueryByFilter = { ...this.optionQueryByFilter, [filter.id]: value };\n requestAnimationFrame(() => {\n const content = this.el.querySelector<HTMLElement>('.filter-menu__options-content');\n if (content) content.scrollTop = 0;\n this.position.schedule();\n });\n }\n\n private handleOptionSearchKeyDown(event: KeyboardEvent, filter: FilterMenuFilter) {\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;\n const visibleOptions = this.visibleOptions(filter);\n const enabled = visibleOptions\n .map((option, index) => ({ option, index }))\n .filter(({ option }) => !option.isInactive)\n .map(({ index }) => index);\n if (!enabled.length) return;\n event.preventDefault();\n const next = event.key === 'ArrowDown' ? enabled[0] : enabled[enabled.length - 1];\n this.activeOptionIndex = next;\n this.focusRingVisible = true;\n requestAnimationFrame(() => {\n this.el\n .querySelector<HTMLElement>(`#${this.generatedId}-${filter.id}-option-${next}`)\n ?.focus();\n });\n }\n\n private toggleMultiple(\n filter: FilterMenuFilter,\n option: FilterMenuOption,\n checked: boolean,\n values: FilterMenuValues\n ) {\n if (option.isInactive) return;\n const current = Array.isArray(values[filter.id]) ? (values[filter.id] as string[]) : [];\n const selected = new Set(current);\n if (checked) selected.add(option.value);\n else selected.delete(option.value);\n const ordered = (filter.options ?? [])\n .map(candidate => candidate.value)\n .filter(value => selected.has(value));\n this.dsChange.emit({ filterId: filter.id, value: ordered });\n }\n\n private selectOption(\n filter: FilterMenuFilter,\n option: FilterMenuOption,\n values: FilterMenuValues\n ) {\n if (option.isInactive) return;\n if (filter.kind === 'single') {\n this.dsChange.emit({ filterId: filter.id, value: option.value });\n return;\n }\n const selected = Array.isArray(values[filter.id])\n ? (values[filter.id] as string[]).includes(option.value)\n : false;\n this.toggleMultiple(filter, option, !selected, values);\n }\n\n private dateMode(filterId: string, value: FilterMenuValue | undefined): FilterMenuDateMode {\n return this.dateModeByFilter[filterId] ?? parseDateFilterValue(value)?.kind ?? 'relative';\n }\n\n private setDateMode(filter: FilterMenuFilter, value: FilterMenuValue | undefined, mode: string) {\n if (mode !== 'range' && mode !== 'relative') return;\n this.dateModeByFilter = { ...this.dateModeByFilter, [filter.id]: mode };\n this.activeOptionIndex = 0;\n if (mode === 'range' && !this.calendarMonthByFilter[filter.id]) {\n const parsed = parseDateFilterValue(value);\n const initialDate = parsed?.kind === 'range' ? parsed.start : filterMenuToday();\n this.calendarMonthByFilter = {\n ...this.calendarMonthByFilter,\n [filter.id]: filterMenuCalendarMonth(initialDate),\n };\n }\n if (mode === 'relative' && this.pendingRangeStartByFilter[filter.id]) {\n const next = { ...this.pendingRangeStartByFilter };\n delete next[filter.id];\n this.pendingRangeStartByFilter = next;\n }\n if (mode === 'relative') this.clearCalendarRangePreview(filter.id);\n }\n\n private calendarMonth(filterId: string, value: FilterMenuValue | undefined): string {\n const parsed = parseDateFilterValue(value);\n const initialDate = parsed?.kind === 'range' ? parsed.start : filterMenuToday();\n return this.calendarMonthByFilter[filterId] ?? filterMenuCalendarMonth(initialDate);\n }\n\n private moveCalendarMonth(filterId: string, month: string, offset: number) {\n this.clearCalendarRangePreview(filterId);\n this.calendarMonthByFilter = {\n ...this.calendarMonthByFilter,\n [filterId]: shiftFilterMenuCalendarMonth(month, offset),\n };\n }\n\n private selectCalendarDate(filterId: string, value: string) {\n this.clearCalendarRangePreview(filterId);\n const pendingStart = this.pendingRangeStartByFilter[filterId];\n const next = { ...this.pendingRangeStartByFilter };\n if (pendingStart) delete next[filterId];\n else next[filterId] = value;\n this.pendingRangeStartByFilter = next;\n this.dsChange.emit({\n filterId,\n value: dateFilterRangeValue(pendingStart ?? value, value),\n });\n }\n\n private previewCalendarRange(filterId: string, value: string) {\n if (!this.pendingRangeStartByFilter[filterId]) return;\n if (this.previewRangeEndByFilter[filterId] === value) return;\n this.previewRangeEndByFilter = { ...this.previewRangeEndByFilter, [filterId]: value };\n }\n\n private clearCalendarRangePreview(filterId: string) {\n if (!this.previewRangeEndByFilter[filterId]) return;\n const next = { ...this.previewRangeEndByFilter };\n delete next[filterId];\n this.previewRangeEndByFilter = next;\n }\n\n private focusCalendarDate(filterId: string, value: string) {\n this.previewCalendarRange(filterId, value);\n const targetMonth = filterMenuCalendarMonth(value);\n if (this.calendarMonthByFilter[filterId] !== targetMonth) {\n this.calendarMonthByFilter = { ...this.calendarMonthByFilter, [filterId]: targetMonth };\n }\n requestAnimationFrame(() => {\n this.el.querySelector<HTMLElement>(`[data-date-option=\"${value}\"]`)?.focus();\n });\n }\n\n private handleCalendarDayKeyDown(event: KeyboardEvent, filterId: string, value: string) {\n let offset: number | null = null;\n if (event.key === 'ArrowLeft') offset = -1;\n else if (event.key === 'ArrowRight') offset = 1;\n else if (event.key === 'ArrowUp') offset = -7;\n else if (event.key === 'ArrowDown') offset = 7;\n else if (event.key === 'Home') {\n offset = -new Date(`${value}T00:00:00Z`).getUTCDay();\n } else if (event.key === 'End') {\n offset = 6 - new Date(`${value}T00:00:00Z`).getUTCDay();\n } else if (event.key === 'PageUp') {\n const month = shiftFilterMenuCalendarMonth(filterMenuCalendarMonth(value), -1);\n const day = value.slice(8, 10);\n const candidate = `${month}-${day}`;\n const target = parseDateFilterValue(candidate) ? candidate : `${month}-01`;\n event.preventDefault();\n this.focusCalendarDate(filterId, target);\n return;\n } else if (event.key === 'PageDown') {\n const month = shiftFilterMenuCalendarMonth(filterMenuCalendarMonth(value), 1);\n const day = value.slice(8, 10);\n const candidate = `${month}-${day}`;\n const target = parseDateFilterValue(candidate) ? candidate : `${month}-01`;\n event.preventDefault();\n this.focusCalendarDate(filterId, target);\n return;\n }\n if (offset === null) return;\n event.preventDefault();\n this.focusCalendarDate(filterId, shiftIsoCalendarDate(value, offset));\n }\n\n private renderRelativeDateOptions(filter: FilterMenuFilter, value: FilterMenuValue | undefined) {\n const relativeFilter: FilterMenuFilter = {\n ...filter,\n kind: 'single',\n options: RELATIVE_DATE_OPTIONS,\n };\n return (\n <div\n class=\"filter-menu__date-relative ds-choice-list ds-chrome-column ds-chrome-space--sm\"\n role=\"listbox\"\n aria-label=\"Relative date\"\n >\n {RELATIVE_DATE_OPTIONS.map((option, index) => (\n <ChoiceOptionRow\n size=\"md\"\n id={`${this.generatedId}-${filter.id}-relative-${index}`}\n option={option}\n selected={value === option.value}\n active={index === this.activeOptionIndex}\n focusRingVisible={this.focusRingVisible}\n usesSubtext={false}\n tabIndex={index === this.activeOptionIndex ? 0 : -1}\n onFocus={() => {\n this.activeOptionIndex = index;\n }}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleOptionKeyDown(event, relativeFilter, option, index, {\n [filter.id]: value,\n })\n }\n onHover={() => {\n this.focusRingVisible = false;\n this.activeOptionIndex = index;\n }}\n onSelect={() => this.dsChange.emit({ filterId: filter.id, value: option.value })}\n />\n ))}\n </div>\n );\n }\n\n private renderDateCalendar(filter: FilterMenuFilter, value: FilterMenuValue | undefined) {\n const parsed = parseDateFilterValue(value);\n const range = parsed?.kind === 'range' ? parsed : null;\n const month = this.calendarMonth(filter.id, value);\n const days = filterMenuCalendarDays(month);\n const today = filterMenuToday();\n const pendingStart = this.pendingRangeStartByFilter[filter.id];\n const previewEnd = this.previewRangeEndByFilter[filter.id];\n const previewStart = pendingStart && previewEnd ? [pendingStart, previewEnd].sort()[0] : null;\n const previewFinish = pendingStart && previewEnd ? [pendingStart, previewEnd].sort()[1] : null;\n const preferredFocus =\n this.pendingRangeStartByFilter[filter.id] ??\n range?.end ??\n (month === today.slice(0, 7) ? today : '');\n const focusDate = days.some(day => day.value === preferredFocus)\n ? preferredFocus\n : (days.find(day => day.inMonth)?.value ?? days[0]?.value);\n\n return (\n <div class=\"filter-menu__calendar\">\n <div class=\"filter-menu__calendar-heading ds-control--md\">\n <ds-button-unfilled\n class=\"filter-menu__calendar-nav filter-menu__calendar-nav--previous\"\n variant=\"icon\"\n icon=\"ChevronLeft\"\n size=\"md\"\n hasBorder={false}\n ariaLabel=\"Previous month\"\n onDsClick={() => this.moveCalendarMonth(filter.id, month, -1)}\n />\n <ds-text as=\"span\" variant=\"text-body-medium\" emphasis color=\"primary\">\n {filterMenuCalendarMonthLabel(month)}\n </ds-text>\n <ds-button-unfilled\n class=\"filter-menu__calendar-nav filter-menu__calendar-nav--next\"\n variant=\"icon\"\n icon=\"ChevronRight\"\n size=\"md\"\n hasBorder={false}\n ariaLabel=\"Next month\"\n onDsClick={() => this.moveCalendarMonth(filter.id, month, 1)}\n />\n </div>\n <div class=\"filter-menu__calendar-weekdays\" aria-hidden=\"true\">\n {FILTER_MENU_WEEKDAYS.map(day => (\n <ds-text as=\"span\" variant=\"text-body-small\" color=\"secondary\">\n {day}\n </ds-text>\n ))}\n </div>\n <div\n class=\"filter-menu__calendar-grid\"\n role=\"grid\"\n aria-label={filterMenuCalendarMonthLabel(month)}\n onMouseLeave={() => this.clearCalendarRangePreview(filter.id)}\n >\n {days.map(day => {\n const selectedInRange = Boolean(\n range && day.value >= range.start && day.value <= range.end\n );\n const previewInRange = Boolean(\n previewStart &&\n previewFinish &&\n day.value >= previewStart &&\n day.value <= previewFinish\n );\n const inRange = previewInRange || selectedInRange;\n const rangeEdge = Boolean(\n previewStart\n ? day.value === pendingStart\n : range && (day.value === range.start || day.value === range.end)\n );\n const textColor = rangeEdge\n ? 'on-bold'\n : inRange || day.value === today\n ? 'primary'\n : day.inMonth\n ? 'secondary'\n : 'tertiary';\n return (\n <button\n type=\"button\"\n role=\"gridcell\"\n data-date-option={day.value}\n class={{\n 'filter-menu__calendar-day': true,\n 'filter-menu__calendar-day--outside': !day.inMonth,\n 'filter-menu__calendar-day--today': day.value === today,\n 'filter-menu__calendar-day--in-range': inRange,\n 'filter-menu__calendar-day--range-preview': previewInRange,\n 'filter-menu__calendar-day--range-edge': rangeEdge,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n }}\n aria-label={day.label}\n aria-selected={selectedInRange ? 'true' : 'false'}\n tabIndex={day.value === focusDate ? 0 : -1}\n onMouseEnter={() => this.previewCalendarRange(filter.id, day.value)}\n onFocus={() => this.previewCalendarRange(filter.id, day.value)}\n onClick={() => this.selectCalendarDate(filter.id, day.value)}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleCalendarDayKeyDown(event, filter.id, day.value)\n }\n >\n <ds-text\n class=\"ds-interaction-fill__content\"\n as=\"span\"\n variant=\"text-body-medium\"\n color={textColor}\n emphasis={day.value === today}\n >\n {day.day}\n </ds-text>\n </button>\n );\n })}\n </div>\n </div>\n );\n }\n\n private renderDateFilter(filter: FilterMenuFilter, value: FilterMenuValue | undefined) {\n const mode = this.dateMode(filter.id, value);\n return (\n <div class=\"filter-menu__date\">\n <header class=\"filter-menu__date-header ds-chrome-header ds-chrome-header--bounded\">\n <ds-tab-group\n ariaLabel=\"Date filter mode\"\n size=\"md\"\n width=\"fill\"\n hasContainer={false}\n value={mode}\n tabs={DATE_MODE_TABS}\n onDsChange={(event: CustomEvent<string>) => {\n event.stopPropagation();\n this.setDateMode(filter, value, event.detail);\n }}\n />\n </header>\n <div class=\"filter-menu__date-body\">\n {mode === 'relative'\n ? this.renderRelativeDateOptions(filter, value)\n : this.renderDateCalendar(filter, value)}\n </div>\n </div>\n );\n }\n\n private renderOptionSearch(filter: FilterMenuFilter) {\n return (\n <div class=\"filter-menu__option-search\">\n <ChoiceSearch\n size=\"md\"\n hasFocusBoundary={false}\n hasInteractionFill={false}\n value={this.optionQueryByFilter[filter.id] ?? ''}\n placeholder={this.searchPlaceholder}\n ariaLabel={`Search ${filter.label} options`}\n controls={`${this.generatedId}-${filter.id}-options`}\n inputRef={() => undefined}\n clearLabel={`Clear ${filter.label} search`}\n onValueChange={value => this.setOptionQuery(filter, value)}\n onKeyDown={(event: KeyboardEvent) => this.handleOptionSearchKeyDown(event, filter)}\n />\n </div>\n );\n }\n\n private renderNoOptionResults() {\n return (\n <div\n class=\"ds-choice-empty ds-empty-region\"\n role=\"option\"\n aria-selected=\"false\"\n aria-disabled=\"true\"\n aria-label={this.noResultsText}\n aria-live=\"polite\"\n >\n <ds-empty-state body={this.noResultsText} />\n </div>\n );\n }\n\n private renderOptions(filter: FilterMenuFilter, values: FilterMenuValues) {\n const value = values[filter.id];\n if (filter.kind === 'multiple' || filter.kind === 'single') {\n const selected = Array.isArray(value) ? value : [];\n const allOptions = filter.options ?? [];\n const options = this.visibleOptions(filter);\n const usesSubtext = choiceListUsesSubtext(\n allOptions.map(option => ({\n label: option.label,\n value: option.value,\n subtext: option.description,\n }))\n );\n if (!options.length) return this.renderNoOptionResults();\n return options.map((option, index) => {\n const isSelected =\n filter.kind === 'multiple' ? selected.includes(option.value) : value === option.value;\n return (\n <ChoiceOptionRow\n size=\"md\"\n id={`${this.generatedId}-${filter.id}-option-${index}`}\n option={{\n label: option.label,\n value: option.value,\n subtext: option.description,\n isInactive: option.isInactive,\n }}\n selected={isSelected}\n active={index === this.activeOptionIndex}\n focusRingVisible={this.focusRingVisible}\n usesSubtext={usesSubtext}\n tabIndex={index === this.activeOptionIndex ? 0 : -1}\n leading={\n filter.kind === 'multiple' ? (\n <span\n class=\"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-checkbox label=\"\" size=\"md\" checked={isSelected} presentation />\n </span>\n ) : undefined\n }\n onFocus={() => {\n this.activeOptionIndex = index;\n }}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleOptionKeyDown(event, filter, option, index, values, options)\n }\n onHover={() => {\n this.focusRingVisible = false;\n this.activeOptionIndex = index;\n }}\n onSelect={() => this.selectOption(filter, option, values)}\n />\n );\n });\n }\n\n if (filter.kind === 'boolean') {\n const [option] = this.visibleOptions(filter);\n if (!option) return this.renderNoOptionResults();\n return (\n <ChoiceOptionRow\n size=\"md\"\n id={`${this.generatedId}-${filter.id}-option-0`}\n option={{\n label: option.label,\n value: option.value,\n subtext: option.description,\n }}\n selected={value === true}\n active\n focusRingVisible={this.focusRingVisible}\n usesSubtext={Boolean(option.description)}\n tabIndex={0}\n leading={\n <span\n class=\"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-checkbox label=\"\" size=\"md\" checked={value === true} presentation />\n </span>\n }\n onKeyDown={(event: KeyboardEvent) => {\n if (event.key === 'ArrowLeft') this.handlePanelKeyDown(event, filter.id);\n else if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.dsChange.emit({ filterId: filter.id, value: value !== true });\n }\n }}\n onHover={() => {\n this.focusRingVisible = false;\n }}\n onSelect={() => this.dsChange.emit({ filterId: filter.id, value: value !== true })}\n />\n );\n }\n\n return this.renderDateFilter(filter, value);\n }\n\n private get captionIconOnly(): boolean {\n return (\n this.collapseLabel && this.captionCompact && this.usesInternalTrigger && Boolean(this.icon)\n );\n }\n\n private syncCaptionCompactObserver(): void {\n this.disconnectCaptionCompactObserver();\n if (!this.collapseLabel) {\n if (this.captionCompact) this.captionCompact = false;\n return;\n }\n this.captionCompactDisconnect = observeTableCaptionCompact(this.el, compact => {\n if (this.captionCompact !== compact) this.captionCompact = compact;\n });\n }\n\n private disconnectCaptionCompactObserver(): void {\n this.captionCompactDisconnect?.();\n this.captionCompactDisconnect = undefined;\n }\n\n private renderCaptionTooltip(trigger: VNode, label: string): VNode {\n if (!this.collapseLabel) return trigger;\n return (\n <ds-tooltip label={label} side=\"top\" size=\"sm\">\n {trigger}\n </ds-tooltip>\n );\n }\n\n private renderFooter(totalSelected: number, categoriesClear: boolean) {\n return (\n <div\n class={{\n 'filter-menu__footer': true,\n 'filter-menu__footer--categories-clear': categoriesClear,\n 'ds-choice-footer': true,\n }}\n aria-hidden={categoriesClear && totalSelected === 0 ? 'true' : undefined}\n >\n <div class=\"ds-choice-footer__content ds-control--md\">\n {!categoriesClear ? (\n <ds-text\n class=\"ds-choice-footer__summary\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n aria-live=\"polite\"\n >\n {totalSelected} selected\n </ds-text>\n ) : null}\n {totalSelected > 0 ? (\n <button\n class=\"filter-menu__clear ds-choice-footer__clear ds-text-action\"\n type=\"button\"\n onClick={() => {\n this.pendingRangeStartByFilter = {};\n this.dsClear.emit();\n }}\n >\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n {this.clearLabel}\n </ds-text>\n </button>\n ) : null}\n </div>\n </div>\n );\n }\n\n private renderMatchModeFooter(filter: FilterMenuFilter, matchModes: FilterMenuMatchModes) {\n const mode: FilterMenuMatchMode = matchModes[filter.id] === 'all' ? 'all' : 'any';\n const nextMode: FilterMenuMatchMode = mode === 'any' ? 'all' : 'any';\n return (\n <div class=\"filter-menu__match-mode-footer ds-choice-footer\">\n <div class=\"filter-menu__match-mode-content ds-choice-footer__content ds-control--md\">\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">\n Limit results to\n </ds-text>\n <button\n class=\"filter-menu__match-mode-toggle ds-text-action ds-focus-ring\"\n type=\"button\"\n aria-label={`Limit ${filter.label} results to ${nextMode} selected`}\n onClick={() => this.dsMatchModeChange.emit({ filterId: filter.id, mode: nextMode })}\n onKeyDown={(event: KeyboardEvent) => this.handlePanelKeyDown(event, filter.id)}\n >\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n {mode}\n </ds-text>\n </button>\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">\n selected\n </ds-text>\n </div>\n </div>\n );\n }\n\n render() {\n const state =\n this.closing && this.closingSnapshot\n ? this.closingSnapshot\n : {\n filters: this.filters,\n values: this.values,\n matchModes: this.matchModes,\n activeFilterId: this.activeFilterId,\n };\n const activeFilter = this.selectedFilter(state.filters, state.activeFilterId);\n const totalSelected = this.totalSelected(state.filters, state.values);\n const activeFilterCount = this.activeFilterCount(state.filters, state.values);\n const hasActiveFilters = activeFilterCount > 0;\n const categoriesClearFooter = this.footerLayout === 'categories-clear';\n const label = `${this.triggerLabel}${\n this.showSelectedCount && hasActiveFilters ? ` · ${activeFilterCount}` : ''\n }`;\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const iconSize = ICON_SIZE[this.size];\n const popupId = `${this.generatedId}-popup`;\n const popupStyle: Record<string, string> = {\n position: 'fixed',\n left: '0',\n top: '0',\n width: this.menuWidth,\n transform: `translate(${Math.round(this.pos.x)}px, ${Math.round(this.pos.y)}px)`,\n zIndex: '9998',\n visibility: this.positionReady ? 'visible' : 'hidden',\n };\n\n return (\n <Host\n class={{\n 'filter-menu-host': true,\n 'filter-menu-host--external-trigger': !this.usesInternalTrigger,\n 'ds-select-trigger-host': this.usesInternalTrigger,\n [`ds-control--${this.size}`]: true,\n 'ds-table-caption-control': this.collapseLabel,\n 'ds-table-caption-control--compact': this.captionIconOnly,\n ...controlWidthClass(this.width),\n }}\n >\n {this.usesInternalTrigger\n ? this.renderCaptionTooltip(\n <button\n ref={element => {\n this.triggerElement = (element as HTMLButtonElement) ?? null;\n }}\n id={this.inputId ?? `${this.generatedId}-trigger`}\n type=\"button\"\n class={{\n trigger: true,\n 'ds-control-frame': true,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--selected': this.activeFill && hasActiveFilters,\n 'trigger--expanded': this.open || this.closing,\n 'ds-interaction-fill--surface-open': this.open || this.closing,\n 'trigger--bordered': this.hasBorder,\n 'trigger--has-value': hasActiveFilters,\n [`ds-control--${this.size}`]: true,\n }}\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n aria-expanded={String(this.open)}\n aria-controls={this.open ? popupId : undefined}\n aria-label={this.ariaLabel ?? this.menuLabel}\n onClick={(event: MouseEvent) => this.toggleFromTrigger(event)}\n onKeyDown={(event: KeyboardEvent) => this.handleTriggerKeyDown(event)}\n >\n {this.icon ? (\n <span\n class=\"trigger__prefix ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon name={this.icon} size={iconSize} color=\"inherit\" />\n </span>\n ) : null}\n {this.captionIconOnly ? null : (\n <ds-text\n class=\"trigger__label-box trigger__label trigger__label-content ds-control-label-box ds-interaction-fill__content\"\n as=\"span\"\n variant={textVariant}\n color=\"inherit\"\n lineTruncation={1}\n >\n {label}\n </ds-text>\n )}\n {this.captionIconOnly ? null : (\n <span\n class=\"trigger__chevron ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon name=\"ChevronDown\" size={iconSize} color=\"inherit\" />\n </span>\n )}\n </button>,\n this.captionIconOnly ? label : ''\n )\n : null}\n\n {this.shouldRender ? (\n <div\n id={popupId}\n popover=\"manual\"\n class={{\n 'filter-menu-popup': true,\n 'ds-choice-popup': true,\n 'ds-choice-popup--closing': this.closing,\n }}\n style={popupStyle}\n role=\"dialog\"\n aria-label={this.menuLabel}\n >\n {activeFilter ? (\n <div class=\"filter-menu\">\n <div class=\"filter-menu__body\">\n <div class=\"filter-menu__category-pane\">\n <div\n class=\"filter-menu__categories ds-choice-list ds-chrome-column ds-chrome-space--sm\"\n role=\"tablist\"\n aria-label={this.categoriesLabel}\n aria-orientation=\"vertical\"\n >\n {state.filters.map(filter => {\n const active = filter.id === activeFilter.id;\n const count = this.selectedCount(filter, state.values);\n return (\n <div\n key={filter.id}\n class={{\n 'filter-menu__category-section': true,\n 'ds-choice-section--divided': Boolean(filter.divider),\n }}\n >\n <button\n id={`${this.generatedId}-${filter.id}-tab`}\n type=\"button\"\n role=\"tab\"\n data-filter-category={filter.id}\n class={{\n 'filter-menu__category': true,\n 'filter-menu__category--active': active,\n 'ds-choice-item': true,\n 'ds-control-frame': true,\n 'ds-control--md': true,\n 'ds-focus-ring-inset': true,\n 'ds-focus-ring--visible': active && this.focusRingVisible,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--selected': active,\n }}\n aria-selected={String(active)}\n aria-controls={`${this.generatedId}-panel`}\n tabIndex={active ? 0 : -1}\n onMouseDown={() => {\n this.focusRingVisible = false;\n }}\n onClick={() => this.selectCategory(filter.id)}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleCategoryKeyDown(event, state.filters, filter.id)\n }\n >\n <ds-text\n class=\"ds-choice-item__content ds-choice-item__label ds-control-label-box ds-interaction-fill__content\"\n as=\"span\"\n variant=\"text-body-medium\"\n color={active ? 'primary' : 'secondary'}\n >\n {filter.label}\n </ds-text>\n {count > 0 && filter.kind === 'date' ? (\n <span\n class=\"filter-menu__category-dot-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-badge variant=\"dot\" hasRing={false} label=\"\" />\n </span>\n ) : count > 0 ? (\n <ds-tag\n class=\"ds-choice-item__tag ds-interaction-fill__content\"\n label={String(count)}\n size=\"sm\"\n intent=\"brand\"\n contrast=\"bold\"\n isInset\n rounded\n />\n ) : null}\n </button>\n </div>\n );\n })}\n </div>\n {categoriesClearFooter ? this.renderFooter(totalSelected, true) : null}\n </div>\n\n <div\n id={`${this.generatedId}-panel`}\n class={{\n 'filter-menu__options': true,\n 'filter-menu__options--date': activeFilter.kind === 'date',\n }}\n role=\"tabpanel\"\n aria-labelledby={`${this.generatedId}-${activeFilter.id}-tab`}\n >\n {activeFilter.kind === 'date' ? null : this.renderOptionSearch(activeFilter)}\n <div class=\"filter-menu__options-content\">\n {activeFilter.kind === 'date' ? (\n <div key={activeFilter.id} class=\"filter-menu__option-list--date\">\n {this.renderOptions(activeFilter, state.values)}\n </div>\n ) : (\n <div\n id={`${this.generatedId}-${activeFilter.id}-options`}\n key={activeFilter.id}\n class=\"filter-menu__option-list ds-choice-list ds-chrome-column ds-chrome-space--sm\"\n role=\"listbox\"\n aria-label={activeFilter.label}\n aria-multiselectable={\n activeFilter.kind === 'multiple' ? 'true' : undefined\n }\n >\n {this.renderOptions(activeFilter, state.values)}\n </div>\n )}\n </div>\n {activeFilter.kind === 'multiple'\n ? this.renderMatchModeFooter(activeFilter, state.matchModes)\n : null}\n </div>\n </div>\n\n {!categoriesClearFooter && totalSelected > 0\n ? this.renderFooter(totalSelected, false)\n : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["tabGroupCss","TabGroup","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","value","tabs","size","width","hasContainer","ariaLabel","selectableTabs","getSelectableTabs","focusableTabId","some","tab","id","isInactive","find","selectTab","options","dsChange","emit","focus","focusTab","btn","el","querySelector","preventScroll","onValueChange","next","prev","undefined","requestAnimationFrame","active","document","activeElement","contains","activeId","getAttribute","focusId","nextTab","blur","findEnabled","from","step","len","length","n","i","handleKeyDown","e","focusedId","target","closest","dataset","currentIdx","findIndex","t","nextIdx","key","first","lastEnabled","reverse","preventDefault","getBgClass","background","render","bgClass","h","Host","class","controlWidthClass","role","ariaLabelledby","map","index","isTabDivider","isSelected","variant","showIcon","showLabel","emphasizeLabel","type","label","String","panelId","disabled","tabIndex","onClick","tab__content","dot","name","icon","color","as","CONTROL_TEXT_VARIANT","emphasis","hasRing"],"sources":["src/wc/components/TabGroup/TabGroup.css?tag=ds-tab-group&encapsulation=scoped","src/wc/components/TabGroup/TabGroup.tsx"],"sourcesContent":["@import '../../utils/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/control-density-inset.css';\n@import '../../utils/control-width.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/control-inactive.css';\n\n:host {\n display: block;\n --_tab-group-surface-border: var(--color-border-tertiary);\n --_tab-group-divider: var(--color-border-secondary);\n}\n\n:host(.tab-group-host--on-faint) {\n --_tab-group-selected-fill: var(--color-interaction-active);\n}\n\n:host(.tab-group-host--on-medium) {\n --_tab-group-surface-border: var(--color-border-on-medium-background-tertiary);\n --_tab-group-divider: var(--color-border-on-medium-background-secondary);\n --_tab-group-selected-fill: var(--color-interaction-on-medium-background-active);\n}\n\n:host(.tab-group-host--on-bold) {\n --_tab-group-surface-border: var(--color-border-on-bold-background-tertiary);\n --_tab-group-divider: var(--color-border-on-bold-background-secondary);\n --_tab-group-selected-fill: var(--color-interaction-on-bold-background-active);\n}\n\n:host(.tab-group-host--on-strong) {\n --_tab-group-surface-border: var(--color-border-on-strong-background-tertiary);\n --_tab-group-divider: var(--color-border-on-strong-background-secondary);\n --_tab-group-selected-fill: var(--color-interaction-on-strong-background-active);\n}\n\n:host(.tab-group-host--on-translucent) {\n --_tab-group-surface-border: var(--color-translucent-border-tertiary);\n --_tab-group-divider: var(--color-translucent-border-secondary);\n --_tab-group-selected-fill: var(--color-translucent-interaction-active);\n}\n\n:host(.tab-group-host--on-inverted) {\n --_tab-group-surface-border: var(--color-inverted-border-tertiary);\n --_tab-group-divider: var(--color-inverted-border-secondary);\n --_tab-group-selected-fill: var(--color-inverted-interaction-active);\n}\n\n:host(.tab-group-host--on-media) {\n --_tab-group-surface-border: var(--color-media-border-tertiary);\n --_tab-group-divider: var(--color-media-border-secondary);\n --_tab-group-selected-fill: var(--color-media-interaction-active);\n}\n\n:host(.tab-group-host--on-always-dark) {\n --_tab-group-surface-border: var(--color-always-dark-border-tertiary);\n --_tab-group-divider: var(--color-always-dark-border-secondary);\n --_tab-group-selected-fill: var(--color-always-dark-interaction-active);\n}\n\n.tab-list {\n display: flex;\n align-items: center;\n gap: var(--ds-control-gap);\n position: relative;\n width: max-content;\n max-width: 100%;\n height: var(--ds-control-height);\n padding: calc(var(--dimension-space-025) - var(--dimension-stroke-width-012));\n background-color: var(--color-background-secondary);\n border: var(--dimension-stroke-width-012) solid var(--_tab-group-surface-border);\n border-radius: var(--dimension-radius-half);\n box-sizing: border-box;\n}\n\n:host(.ds-control-width--fill) .tab-list {\n width: 100%;\n}\n\n:host(.tab-group-host--surface) .tab-list {\n background-color: transparent;\n}\n\n:host(.tab-group-host--containerless) .tab-list {\n padding: 0;\n border: 0;\n background-color: transparent;\n}\n\n.tab {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-control-gap);\n padding: 0 var(--ds-control-padding-inline);\n background-color: transparent;\n border: none;\n border-radius: var(--dimension-radius-half);\n cursor: default;\n -webkit-user-select: none;\n user-select: none;\n color: var(--color-foreground-secondary);\n transition: color var(--effect-motion-short-2);\n flex-shrink: 0;\n height: var(--ds-control-height);\n min-width: var(--ds-control-height);\n box-sizing: border-box;\n --_dot: var(--color-foreground-bold-brand);\n /* Hover/press: `.ds-interaction-fill` fills cover the complete segment. */\n}\n\n:host(.ds-control-width--fill) .tab {\n flex: 1 1 0;\n min-width: 0;\n overflow: hidden;\n}\n\n:host(.ds-control-width--fill) .tab__content {\n max-width: 100%;\n overflow: hidden;\n}\n\n:host(.ds-control-width--fill) .tab__label {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tab--selected {\n color: var(--color-foreground-primary);\n background-color: var(--color-background-primary);\n /* Inset stroke on interaction-fill ::after — stays above hover wash. */\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--_tab-group-surface-border);\n}\n\n:host(.tab-group-host--surface) .tab--selected {\n background-color: var(--_tab-group-selected-fill);\n}\n\n.tab--selected:not(.ds-interaction-fill) {\n box-shadow: inset 0 0 0 var(--ds-interaction-border-width) var(--ds-interaction-border-color);\n}\n\n/* Inactive: `.ds-control-inactive` (50% opacity) — applied via class in TSX. */\n\n.tab__content {\n position: relative;\n z-index: 2;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-control-gap);\n min-width: 0;\n}\n\n.tab__content--dot {\n padding-right: var(--dimension-space-050);\n}\n\n.tab__label {\n padding: 0 var(--ds-control-label-inset);\n white-space: nowrap;\n}\n\n.tab__icon {\n flex-shrink: 0;\n}\n\n.tab__dot {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n pointer-events: none;\n}\n\n.on-medium {\n color: var(--color-foreground-on-medium-background-secondary);\n}\n\n.on-medium.tab--selected {\n color: var(--color-foreground-on-medium-background-primary);\n}\n\n.on-bold {\n color: var(--color-foreground-on-bold-background-secondary);\n}\n\n.on-bold.tab--selected {\n color: var(--color-foreground-on-bold-background-primary);\n}\n\n.on-strong {\n color: var(--color-foreground-on-strong-background-secondary);\n}\n\n.on-strong.tab--selected {\n color: var(--color-foreground-on-strong-background-primary);\n}\n\n.on-translucent {\n color: var(--color-translucent-foreground-secondary);\n}\n\n.on-translucent.tab--selected {\n color: var(--color-translucent-foreground-primary);\n}\n\n.on-inverted {\n color: var(--color-inverted-foreground-secondary);\n}\n\n.on-inverted.tab--selected {\n color: var(--color-inverted-foreground-primary);\n}\n\n.on-media {\n color: var(--color-media-foreground-secondary);\n}\n\n.on-media.tab--selected {\n color: var(--color-media-foreground-primary);\n}\n\n.on-always-dark {\n color: var(--color-always-dark-foreground-secondary);\n}\n\n.on-always-dark.tab--selected {\n color: var(--color-always-dark-foreground-primary);\n}\n\n.tab-divider {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--dimension-stroke-width-012);\n align-self: center;\n padding: 0;\n flex-shrink: 0;\n pointer-events: none;\n}\n\n.tab-divider__line {\n width: var(--dimension-stroke-width-012);\n height: var(--typography-lineheight-sm);\n flex-shrink: 0;\n background-color: var(--_tab-group-divider);\n}\n","import {\n Component,\n Prop,\n Event,\n EventEmitter,\n Element,\n Listen,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport { controlWidthClass, CONTROL_TEXT_VARIANT, type ControlWidth } from '../../utils';\nimport {\n getSelectableTabs,\n isTabDivider,\n type TabGroupItem,\n type TabItemTab,\n} from './tab-item-utils';\n\nexport type TabBackground =\n | 'faint'\n | 'medium'\n | 'bold'\n | 'strong'\n | 'translucent'\n | 'inverted'\n | 'media'\n | 'always-dark';\n\nexport type TabGroupSize = 'sm' | 'md' | 'lg';\nexport type TabGroupWidth = ControlWidth;\n\n@Component({\n tag: 'ds-tab-group',\n styleUrl: 'TabGroup.css',\n scoped: true,\n})\nexport class TabGroup {\n @Element() el!: HTMLElement;\n\n @Prop({ mutable: true }) value: string = '';\n @Prop() tabs: TabGroupItem[] = [];\n /** Control density: 24px small, 32px medium, or 40px large track. */\n @Prop() size: TabGroupSize = 'md';\n /** Width fit — hug content (default) or fill the parent with equal-width segments. */\n @Prop() width: TabGroupWidth = 'hug';\n /** Show the segmented control's outer background, border, and inset. */\n @Prop() hasContainer: boolean = true;\n @Prop() background: TabBackground | undefined;\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n @Prop({ attribute: 'aria-labelledby' }) ariaLabelledby: string | undefined;\n\n @Event() dsChange!: EventEmitter<string>;\n\n private get selectableTabs(): TabItemTab[] {\n return getSelectableTabs(this.tabs);\n }\n\n private get focusableTabId(): string {\n return this.selectableTabs.some(tab => tab.id === this.value && !tab.isInactive)\n ? this.value\n : (this.selectableTabs.find(tab => !tab.isInactive)?.id ?? '');\n }\n\n private selectTab(id: string, options?: { focus?: boolean }) {\n this.value = id;\n this.dsChange.emit(id);\n if (options?.focus !== false) {\n this.focusTab(id);\n }\n }\n\n private focusTab(id: string) {\n const btn = this.el.querySelector(`[data-tab-id=\"${id}\"]`) as HTMLElement | null;\n btn?.focus({ preventScroll: true });\n }\n\n /** Keep focus on the selected tab when value changes externally (e.g. BarNav menu). */\n @Watch('value')\n onValueChange(next: string, prev: string | undefined) {\n if (prev === undefined || next === prev) return;\n\n requestAnimationFrame(() => {\n const active = document.activeElement as HTMLElement | null;\n if (!active || !this.el.contains(active)) return;\n\n const activeId = active.getAttribute('data-tab-id');\n if (activeId === next) return;\n\n const focusId = this.selectableTabs.some(tab => tab.id === next && !tab.isInactive)\n ? next\n : this.focusableTabId;\n const nextTab = this.el.querySelector(`[data-tab-id=\"${focusId}\"]`) as HTMLElement | null;\n if (nextTab) {\n nextTab.focus({ preventScroll: true });\n } else {\n active.blur();\n }\n });\n }\n\n /**\n * Find the next non-inactive tab index relative to `from`, stepping by `step`.\n * Returns `from` unchanged if no other enabled tab exists.\n */\n private findEnabled(from: number, step: 1 | -1): number {\n const tabs = this.selectableTabs;\n const len = tabs.length;\n for (let n = 0; n < len; n++) {\n const i = (from + step * (n + 1) + len * (n + 1)) % len;\n if (!tabs[i]?.isInactive) return i;\n }\n return from;\n }\n\n @Listen('keydown')\n handleKeyDown(e: KeyboardEvent) {\n const tabs = this.selectableTabs;\n if (!tabs.length) return;\n\n const focusedId = (e.target as Element | null)?.closest<HTMLElement>('[data-tab-id]')?.dataset[\n 'tabId'\n ];\n const currentIdx = tabs.findIndex(t => t.id === (focusedId ?? this.focusableTabId));\n\n let nextIdx: number | null = null;\n\n if (e.key === 'ArrowRight') {\n nextIdx = this.findEnabled(currentIdx, 1);\n } else if (e.key === 'ArrowLeft') {\n nextIdx = this.findEnabled(currentIdx, -1);\n }\n\n if (e.key === 'Home') {\n const first = tabs.findIndex(t => !t.isInactive);\n nextIdx = first === -1 ? null : first;\n } else if (e.key === 'End') {\n const lastEnabled = [...tabs].reverse().findIndex(t => !t.isInactive);\n nextIdx = lastEnabled === -1 ? null : tabs.length - 1 - lastEnabled;\n }\n\n if (nextIdx !== null) {\n e.preventDefault();\n const next = tabs[nextIdx];\n this.selectTab(next.id);\n }\n }\n\n private getBgClass(): string {\n if (!this.background) return '';\n if (this.background === 'always-dark') return 'on-always-dark';\n return `on-${this.background}`;\n }\n\n render() {\n const bgClass = this.getBgClass();\n const focusableTabId = this.focusableTabId;\n\n return (\n <Host\n class={{\n 'tab-group-host': true,\n [`tab-group-host--${this.size}`]: true,\n [`ds-control--${this.size}`]: true,\n 'tab-group-host--containerless': !this.hasContainer,\n 'tab-group-host--surface': !!bgClass,\n [`tab-group-host--${bgClass}`]: !!bgClass,\n ...controlWidthClass(this.width),\n }}\n >\n <div\n role=\"tablist\"\n class=\"tab-list\"\n aria-label={this.ariaLabel}\n aria-labelledby={this.ariaLabelledby}\n >\n {this.tabs.map((tab, index) => {\n if (isTabDivider(tab)) {\n return (\n <div key={`divider-${index}`} class=\"tab-divider\" aria-hidden=\"true\">\n <div class=\"tab-divider__line\" />\n </div>\n );\n }\n\n const isSelected = tab.id === this.value;\n const variant = tab.variant ?? 'label';\n const showIcon = variant === 'icon' || variant === 'icon-label';\n const showLabel = variant === 'label' || variant === 'icon-label';\n const emphasizeLabel = isSelected && !bgClass;\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n data-tab-id={tab.id}\n class={{\n tab: true,\n 'tab--selected': isSelected,\n [`ds-control--${this.size}`]: true,\n 'ds-control--inset': true,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': !tab.isInactive,\n 'ds-interaction-fill--on-faint': bgClass === 'on-faint',\n 'ds-interaction-fill--on-medium': bgClass === 'on-medium',\n 'ds-interaction-fill--on-bold': bgClass === 'on-bold',\n 'ds-interaction-fill--on-strong': bgClass === 'on-strong',\n 'ds-interaction-fill--on-translucent': bgClass === 'on-translucent',\n 'ds-interaction-fill--on-inverted': bgClass === 'on-inverted',\n 'ds-interaction-fill--on-media': bgClass === 'on-media',\n 'ds-interaction-fill--on-always-dark': bgClass === 'on-always-dark',\n 'ds-control-inactive': !!tab.isInactive,\n [bgClass]: !!bgClass,\n }}\n aria-label={variant === 'icon' ? tab.label : undefined}\n aria-selected={String(isSelected)}\n aria-disabled={tab.isInactive ? 'true' : undefined}\n aria-controls={tab.panelId ?? undefined}\n disabled={tab.isInactive}\n tabIndex={tab.id === focusableTabId ? 0 : -1}\n onClick={() => !tab.isInactive && this.selectTab(tab.id)}\n >\n <span\n class={{\n tab__content: true,\n [`tab__content--${variant}`]: true,\n 'tab__content--dot': !!tab.dot,\n }}\n >\n {showIcon && (\n <ds-icon class=\"tab__icon\" name={tab.icon} size={this.size} color=\"inherit\" />\n )}\n {showLabel && (\n <ds-text\n class=\"tab__label\"\n as=\"span\"\n variant={CONTROL_TEXT_VARIANT[this.size]}\n emphasis={emphasizeLabel}\n color=\"inherit\"\n >\n {tab.label}\n </ds-text>\n )}\n {tab.dot && (\n <ds-badge\n class=\"tab__dot\"\n variant=\"dot\"\n hasRing={false}\n label=\"\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n </button>\n );\n })}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["SelectController","constructor","state","this","triggerEl","popupEl","searchEl","typeahead","typeaheadTimer","outsideHandler","setTriggerElement","element","setPopupElement","setSearchElement","handleTriggerKeyDown","event","open","includes","key","preventDefault","openPopup","isTypeaheadKey","searchable","searchTerm","handleTypeahead","handleListKeyDown","focusRingVisible","activeIndex","moveChoiceIndex","options","enabledChoiceIndexes","enabled","length","target","Node","contains","option","selectOption","closePopup","position","AnchoredPositionController","getAnchor","getPopup","measure","trigger","popup","isConnected","host","sectionPadding","resolveCssLengthPx","TOKEN_DEFAULTS","space050","style","minWidth","menuWidthXs","choicePopupMinWidth","offsetWidth","align","popupAlign","anchorRect","getBoundingClientRect","popupWidth","popupHeight","offsetHeight","side","sideOffsetPx","alignOffsetPx","resolveChoicePopupAlignOffset","sectionInsetPx","viewportPadPx","viewportWidth","window","innerWidth","viewportHeight","innerHeight","collisionRect","resolveAnchoredOverlayBoundaryRect","boundary","apply","x","y","positionReady","topLayer","activeOptionId","isLoading","generatedId","undefined","connect","openChanged","disconnect","cancelPositionRetry","unbindPopupListeners","clearTimeout","setFocus","focus","optionsChanged","requestAnimationFrame","updatePosition","loadingChanged","positionChanged","bindPopupListeners","schedulePositionUpdate","scrollActiveOptionIntoView","searchChanged","activeIndexChanged","focusVisible","edge","isDisabled","preferredIndex","restoreFocus","focusSearchOrTrigger","metaKey","ctrlKey","altKey","normalized","toLocaleLowerCase","repeatedCharacter","every","character","match","findChoiceTypeaheadMatch","resetMs","resolveCssTimeMs","animationDurationMedium1","setTimeout","querySelector","scrollIntoView","block","inline","eventIntersectsComposedBoundary","document","addEventListener","observe","removeEventListener","unobserve","cancel","onReady","schedule","update","selectCss","ICON_SIZE","lg","md","sm","xs","OPTION_ACTION_SIZE","selectId","Select","__stencil_proxyCustomElement","HTMLElement","registerHost","sections","multiple","value","disabled","required","requiredMessage","DEFAULT_REQUIRED_MESSAGE","placeholder","triggerLabelPlaceholder","dot","size","width","isInactive","activeFill","collapseLabel","hasBorder","indicator","allowClear","clearLabel","selectedLabel","searchPlaceholder","noResultsText","loadingLabel","error","ariaLabel","formDisabled","compactFooterSummary","captionCompact","listboxId","errorId","initialValue","controller","createController","hasLoaded","clearSelection","stopPropagation","dsChange","emit","dsClear","visibleOptions","activateFooterAction","dsFooterAction","owner","el","findIndex","scalarValue","componentWillLoad","normalizeValueForMode","Array","isArray","syncFormValue","componentDidLoad","observeFooterContent","syncCaptionCompactObserver","connectedCallback","componentDidRender","scheduleFooterSummaryMeasurement","disconnectedCallback","footerResizeObserver","observedFooterContentElement","footerMeasurementFrame","cancelAnimationFrame","disconnectCaptionCompactObserver","onCollapseLabelChange","inactive","values","resolvedValues","setRepeatedFormControlValue","internals","name","hasSelection","setFormControlValue","missing","setRequiredValidity","onLoadingChange","onPopupAlignChange","onOpenChange","dsOpenChange","onSearchTermChange","onActiveIndexChange","formDisabledCallback","formResetCallback","formStateRestoreCallback","restoreStringFormState","restoreStringArrayFormState","allSections","resolveChoiceSections","allOptions","flattenChoiceSections","visibleSections","filterChoiceSections","valid","Set","map","filter","has","selectedOption","find","Boolean","popupRole","some","action","content","footerContentElement","ResizeObserver","measureFooterSummary","summary","footerSummaryMeasureElement","clear","footerClearElement","styles","getComputedStyle","clientWidth","Number","parseFloat","paddingInlineStart","paddingInlineEnd","requiredWidth","columnGap","nextCompact","current","next","renderOption","index","usesIcons","usesSubtext","selected","active","actionId","h","ChoiceOptionRow","id","actionOpen","surfaceOpen","expanded","leading","class","label","checked","presentation","icon","color","supporting","subtextActions","actionIndex","as","variant","CONTROL_SUPPORTING_TEXT_VARIANT","type","tone","onKeyDown","onClick","dsOptionSubtextAction","actionValue","originalEvent","rounded","haspopup","controls","onDsClick","dsOptionAction","anchorId","detail","onHover","onSelect","captionIconOnly","captionCompactDisconnect","observeTableCaptionCompact","compact","renderCaptionTooltip","render","showPlaceholder","count","triggerLabel","textVariant","CONTROL_TEXT_VARIANT","iconSize","usesOptionIcons","choiceListUsesIcons","usesOptionSubtext","choiceListUsesSubtext","showError","errorMessage","describedBy","ariaDescribedby","join","popupStyle","left","top","transform","Math","round","zIndex","visibility","flatIndex","Host","controlWidthClass","background","ref","inputId","choiceBackgroundClassMap","role","String","ariaLabelledby","shiftKey","getElementById","lineTruncation","hasRing","trim","popover","ChoiceSearch","activeDescendant","inputRef","onValueChange","body","section","sectionIndex","divider","header","emphasis","footerActionLabel","ChoiceActionFooter","onAction","ChoiceFooter","compactSummary","useCompactSummary","contentRef","summaryMeasureRef","clearRef","onClear","textId"],"sources":["src/wc/utils/select-controller.ts","src/wc/components/Select/Select.css?tag=ds-select&encapsulation=scoped","src/wc/components/Select/Select.tsx"],"sourcesContent":["import { AnchoredPositionController } from './anchored-position-controller';\nimport {\n enabledChoiceIndexes,\n findChoiceTypeaheadMatch,\n moveChoiceIndex,\n type ChoiceOption,\n} from './choice-list';\nimport { choicePopupMinWidth, resolveChoicePopupAlignOffset } from './choice-popup-alignment';\nimport { resolveCssLengthPx } from './resolve-css-length-px';\nimport { resolveCssTimeMs } from './resolve-css-time-ms';\nimport { TOKEN_DEFAULTS } from './token-defaults';\nimport { eventIntersectsComposedBoundary } from './anchored-overlay-interaction-controller';\nimport { resolveAnchoredOverlayBoundaryRect } from './anchored-overlay-boundary';\n\ntype PopupPosition = { x: number; y: number };\n\nexport interface SelectControllerState<T extends ChoiceOption> {\n readonly host: HTMLElement;\n readonly generatedId: string;\n readonly options: T[];\n readonly searchable: boolean;\n readonly isLoading: boolean;\n readonly isDisabled: boolean;\n readonly preferredIndex: number;\n readonly popupAlign: 'start' | 'end';\n readonly boundary: HTMLElement | undefined;\n open: boolean;\n activeIndex: number;\n searchTerm: string;\n focusRingVisible: boolean;\n position: PopupPosition;\n positionReady: boolean;\n selectOption(option: T): void;\n}\n\n/**\n * Shared single/multiple Select interaction controller.\n *\n * Decorated Stencil state and scalar/array selection remain in each component;\n * this controller owns only popup lifecycle, focus, positioning, typeahead,\n * and listbox keyboard traversal. Anchored placement is delegated to\n * `AnchoredPositionController`; only the choice-cell measurement stays here.\n */\nexport class SelectController<T extends ChoiceOption> {\n private triggerEl: HTMLButtonElement | null = null;\n private popupEl: HTMLDivElement | null = null;\n private searchEl: HTMLDsInputElement | null = null;\n private typeahead = '';\n private typeaheadTimer: ReturnType<typeof setTimeout> | null = null;\n private outsideHandler: ((event: MouseEvent) => void) | null = null;\n private readonly position: AnchoredPositionController;\n\n constructor(private readonly state: SelectControllerState<T>) {\n this.position = new AnchoredPositionController({\n getAnchor: () => this.triggerEl,\n getPopup: () => this.popupEl,\n measure: (trigger, popup) => {\n if (!this.state.open || !popup.isConnected || !this.state.host.contains(popup)) return null;\n\n const sectionPadding = resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n popup.style.minWidth = `max(var(--ds-choice-popup-min-inline-size, ${TOKEN_DEFAULTS.menuWidthXs}), ${choicePopupMinWidth(trigger.offsetWidth, sectionPadding)}px)`;\n\n const align = this.state.popupAlign;\n return {\n anchorRect: trigger.getBoundingClientRect(),\n popupWidth: popup.offsetWidth,\n popupHeight: popup.offsetHeight,\n side: 'bottom',\n align,\n sideOffsetPx: sectionPadding,\n alignOffsetPx: resolveChoicePopupAlignOffset({\n align,\n alignOffsetPx: 0,\n sectionInsetPx: sectionPadding,\n }),\n viewportPadPx: sectionPadding,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n collisionRect: resolveAnchoredOverlayBoundaryRect(trigger, this.state.boundary),\n };\n },\n apply: ({ x, y }) => {\n this.state.position = { x, y };\n this.state.positionReady = true;\n },\n topLayer: true,\n });\n }\n\n get activeOptionId(): string | undefined {\n return !this.state.isLoading && this.state.activeIndex >= 0\n ? `${this.state.generatedId}-option-${this.state.activeIndex}`\n : undefined;\n }\n\n setTriggerElement = (element: HTMLButtonElement | null) => {\n this.triggerEl = element;\n };\n\n setPopupElement = (element: HTMLDivElement | null) => {\n this.popupEl = element;\n };\n\n setSearchElement = (element: HTMLDsInputElement | null) => {\n this.searchEl = element;\n };\n\n connect() {\n if (this.state.open) this.openChanged(true);\n }\n\n disconnect() {\n this.cancelPositionRetry();\n this.unbindPopupListeners();\n if (this.typeaheadTimer) clearTimeout(this.typeaheadTimer);\n }\n\n setFocus() {\n this.triggerEl?.focus();\n }\n\n optionsChanged() {\n if (!this.state.open) return;\n const enabled = enabledChoiceIndexes(this.state.options);\n if (!enabled.includes(this.state.activeIndex)) this.state.activeIndex = enabled[0] ?? -1;\n requestAnimationFrame(() => this.updatePosition());\n }\n\n loadingChanged() {\n if (this.state.open) requestAnimationFrame(() => this.updatePosition());\n }\n\n positionChanged() {\n if (this.state.open) requestAnimationFrame(() => this.updatePosition());\n }\n\n openChanged(open: boolean) {\n if (open) {\n this.bindPopupListeners();\n this.schedulePositionUpdate(() => {\n this.scrollActiveOptionIntoView();\n if (this.state.searchable) void this.searchEl?.setFocus();\n });\n return;\n }\n this.cancelPositionRetry();\n this.unbindPopupListeners();\n this.state.searchTerm = '';\n this.state.positionReady = false;\n }\n\n searchChanged() {\n this.state.activeIndex = enabledChoiceIndexes(this.state.options)[0] ?? -1;\n requestAnimationFrame(() => {\n this.updatePosition();\n this.scrollActiveOptionIntoView();\n });\n }\n\n activeIndexChanged() {\n requestAnimationFrame(() => this.scrollActiveOptionIntoView());\n }\n\n openPopup(focusVisible: boolean, edge?: 'first' | 'last') {\n if (this.state.isDisabled || (!this.state.options.length && !this.state.isLoading)) return;\n const enabled = enabledChoiceIndexes(this.state.options);\n this.state.activeIndex =\n edge === 'last'\n ? (enabled[enabled.length - 1] ?? -1)\n : this.state.preferredIndex >= 0\n ? this.state.preferredIndex\n : (enabled[0] ?? -1);\n this.state.focusRingVisible = focusVisible;\n this.state.open = true;\n }\n\n closePopup(restoreFocus = false) {\n if (!this.state.open) return;\n this.state.open = false;\n if (restoreFocus) requestAnimationFrame(() => this.triggerEl?.focus());\n }\n\n focusSearchOrTrigger() {\n requestAnimationFrame(() => {\n if (this.state.searchable) void this.searchEl?.setFocus();\n else this.triggerEl?.focus();\n });\n }\n\n handleTriggerKeyDown = (event: KeyboardEvent) => {\n if (!this.state.open) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n this.openPopup(true, event.key === 'ArrowUp' ? 'last' : 'first');\n } else if (this.isTypeaheadKey(event)) {\n event.preventDefault();\n this.openPopup(true);\n if (this.state.searchable) this.state.searchTerm = event.key;\n else this.handleTypeahead(event.key);\n }\n return;\n }\n this.handleListKeyDown(event);\n };\n\n handleListKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.state.focusRingVisible = true;\n this.state.activeIndex = moveChoiceIndex(this.state.options, this.state.activeIndex, 1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.state.focusRingVisible = true;\n this.state.activeIndex = moveChoiceIndex(this.state.options, this.state.activeIndex, -1);\n break;\n case 'Home':\n event.preventDefault();\n this.state.focusRingVisible = true;\n this.state.activeIndex = enabledChoiceIndexes(this.state.options)[0] ?? -1;\n break;\n case 'End': {\n event.preventDefault();\n this.state.focusRingVisible = true;\n const enabled = enabledChoiceIndexes(this.state.options);\n this.state.activeIndex = enabled[enabled.length - 1] ?? -1;\n break;\n }\n case 'Enter':\n case ' ': {\n if (\n event.key === ' ' &&\n this.state.searchable &&\n event.target instanceof Node &&\n this.searchEl?.contains(event.target)\n )\n break;\n event.preventDefault();\n const option = this.state.options[this.state.activeIndex];\n if (option) this.state.selectOption(option);\n break;\n }\n case 'Escape':\n event.preventDefault();\n this.closePopup(true);\n break;\n case 'Tab':\n this.closePopup();\n break;\n default:\n if (!this.state.searchable && this.isTypeaheadKey(event)) {\n this.handleTypeahead(event.key);\n }\n }\n };\n\n private isTypeaheadKey(event: KeyboardEvent) {\n return event.key.length === 1 && !event.metaKey && !event.ctrlKey && !event.altKey;\n }\n\n private handleTypeahead(key: string) {\n if (this.typeaheadTimer) clearTimeout(this.typeaheadTimer);\n this.state.focusRingVisible = true;\n const normalized = key.toLocaleLowerCase();\n const repeatedCharacter =\n this.typeahead.length > 0 && [...this.typeahead].every(character => character === normalized);\n this.typeahead = repeatedCharacter ? normalized : `${this.typeahead}${normalized}`;\n const match = findChoiceTypeaheadMatch(\n this.state.options,\n this.typeahead,\n this.state.activeIndex\n );\n if (match >= 0) this.state.activeIndex = match;\n const resetMs = resolveCssTimeMs(\n TOKEN_DEFAULTS.animationDurationMedium1,\n TOKEN_DEFAULTS.animationDurationMedium1\n );\n this.typeaheadTimer = setTimeout(() => {\n this.typeahead = '';\n this.typeaheadTimer = null;\n }, resetMs);\n }\n\n private scrollActiveOptionIntoView() {\n if (!this.state.open || !this.activeOptionId) return;\n this.state.host\n .querySelector<HTMLElement>(`#${this.activeOptionId}`)\n ?.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }\n\n private bindPopupListeners() {\n this.unbindPopupListeners();\n this.outsideHandler = event => {\n if (eventIntersectsComposedBoundary(event, this.state.host)) return;\n this.closePopup();\n };\n document.addEventListener('mousedown', this.outsideHandler, true);\n this.position.observe();\n }\n\n private unbindPopupListeners() {\n if (this.outsideHandler) {\n document.removeEventListener('mousedown', this.outsideHandler, true);\n this.outsideHandler = null;\n }\n this.position.unobserve();\n }\n\n private cancelPositionRetry() {\n this.position.cancel();\n }\n\n private schedulePositionUpdate(onReady?: () => void) {\n if (!this.state.open) return;\n this.state.positionReady = false;\n this.position.schedule(onReady);\n }\n\n private updatePosition(): boolean {\n return this.position.update();\n }\n}\n","@import '../../utils/radius.css';\n@import '../../utils/choice-list.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/control-width.css';\n@import '../../utils/field-stack.css';\n@import '../../utils/search-control.css';\n@import '../../utils/select-trigger.css';\n@import '../../utils/table-caption-control.css';\n@import '../../utils/typography.css';\n@import '../../styles/control-elevation.css';\n\n.wrapper--error {\n --ds-interaction-border-width: var(--dimension-stroke-width-018);\n --ds-interaction-border-color: var(--color-border-bold-negative);\n}\n\n.select-popup {\n color: var(--color-foreground-secondary);\n}\n\n.select-option[aria-selected='true'] .ds-choice-item__icon {\n color: var(--color-foreground-primary);\n}\n\n.select-option-row {\n position: relative;\n isolation: isolate;\n}\n\n.select-option-row__action {\n position: absolute;\n top: 50%;\n right: var(--dimension-space-050);\n z-index: var(--dimension-z-index-floating);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--dimension-radius-half);\n background: var(--color-background-transparent);\n -webkit-backdrop-filter: blur(var(--effect-blur-sm));\n backdrop-filter: blur(var(--effect-blur-sm));\n opacity: 0;\n pointer-events: none;\n transform: translateY(-50%);\n}\n\n.select-option-row:has(:focus-visible) .select-option-row__action,\n.select-option-row--action-open .select-option-row__action,\n.select-option-row--keyboard-active .select-option-row__action {\n opacity: 1;\n pointer-events: auto;\n}\n\n.select-option-row--action-open .select-option::after {\n background: var(--ds-interaction-hover);\n}\n\n.select-option__subtext-actions {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n min-inline-size: 0;\n color: var(--color-foreground-secondary);\n}\n\n.select-option__subtext-action {\n appearance: none;\n display: inline-flex;\n align-items: center;\n padding: 0;\n border: 0;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n cursor: pointer;\n}\n\n.select-option__subtext-action--negative {\n --ds-text-action-foreground: var(--color-foreground-bold-negative);\n}\n\n.select-option__subtext-action-separator {\n color: var(--color-foreground-tertiary);\n pointer-events: none;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .select-option-row:hover .select-option-row__action {\n opacity: 1;\n pointer-events: auto;\n }\n\n .select-option-row:hover .select-option::after {\n background: var(--ds-interaction-hover);\n }\n}\n\n@media (hover: none) {\n .select-option-row__action {\n opacity: 1;\n pointer-events: auto;\n }\n\n .select-option-row--has-action .ds-choice-item__content {\n padding-inline-end: var(--dimension-size-400);\n }\n}\n\n.error-text {\n width: 100%;\n}\n","import {\n AttachInternals,\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n type VNode,\n Watch,\n} from '@stencil/core';\nimport {\n controlWidthClass,\n CONTROL_SUPPORTING_TEXT_VARIANT,\n CONTROL_TEXT_VARIANT,\n DEFAULT_REQUIRED_MESSAGE,\n restoreStringArrayFormState,\n restoreStringFormState,\n setFormControlValue,\n setRepeatedFormControlValue,\n setRequiredValidity,\n type ControlWidth,\n} from '../../utils';\nimport {\n ChoiceActionFooter,\n ChoiceFooter,\n ChoiceOptionRow,\n ChoiceSearch,\n} from '../../utils/choice-list-parts';\nimport {\n choiceBackgroundClassMap,\n choiceListUsesIcons,\n choiceListUsesSubtext,\n enabledChoiceIndexes,\n filterChoiceSections,\n flattenChoiceSections,\n resolveChoiceSections,\n type ChoiceBackground,\n type ChoiceOption,\n type ChoiceSection,\n} from '../../utils/choice-list';\nimport { SelectController } from '../../utils/select-controller';\nimport { observeTableCaptionCompact } from '../../utils/table-caption-compact';\n\nexport type SelectOption = ChoiceOption;\nexport type SelectSection = ChoiceSection;\nexport type SelectBackground = ChoiceBackground;\nexport type SelectSize = 'lg' | 'md' | 'sm' | 'xs';\nexport type SelectWidth = ControlWidth;\nexport type SelectPopupAlign = 'start' | 'end';\nexport type SelectValue = string | string[];\nexport type SelectIndicator = 'down' | 'up-down';\n\nexport interface SelectOptionActionDetail {\n value: string;\n anchorId: string;\n originalEvent: MouseEvent;\n}\n\nexport interface SelectOptionSubtextActionDetail {\n value: string;\n actionValue: string;\n originalEvent: MouseEvent;\n}\n\nconst ICON_SIZE: Record<SelectSize, 'lg' | 'md' | 'sm' | 'xs'> = {\n lg: 'lg',\n md: 'md',\n sm: 'sm',\n xs: 'xs',\n};\n\nconst OPTION_ACTION_SIZE: Record<SelectSize, 'md' | 'sm' | 'xs'> = {\n lg: 'md',\n md: 'sm',\n sm: 'xs',\n xs: 'xs',\n};\n\nlet selectId = 0;\n\n@Component({\n tag: 'ds-select',\n styleUrl: 'Select.css',\n scoped: true,\n formAssociated: true,\n})\nexport class Select {\n @Element() el!: HTMLElement;\n @AttachInternals() internals!: ElementInternals;\n\n /** Flat choices. Assign arrays through the JavaScript property. */\n @Prop() options: SelectOption[] = [];\n /** Grouped choices; takes precedence over options. Assign through JavaScript. */\n @Prop() sections: SelectSection[] = [];\n /** Enable independent multi-value selection while keeping the popup open. */\n @Prop({ reflect: true }) multiple: boolean = false;\n /** Selected scalar or array value according to `multiple`. */\n @Prop({ mutable: true }) value: SelectValue = '';\n /** Controlled popup visibility. */\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n /** Native form field name. */\n @Prop({ reflect: true }) name: string | undefined;\n /** Native disabled state. */\n @Prop({ reflect: true }) disabled: boolean = false;\n /** Require one valid selected value. */\n @Prop({ reflect: true }) required: boolean = false;\n /** Validation message used when required is missing. */\n @Prop() requiredMessage: string = DEFAULT_REQUIRED_MESSAGE;\n /** Trigger text shown when no valid value is selected. */\n @Prop() placeholder: string = 'Select';\n /** Optional scalar-mode trigger text that does not change the selected option label. */\n @Prop() triggerLabel: string | undefined;\n /** Present triggerLabel with placeholder emphasis while preserving the selected value. */\n @Prop() triggerLabelPlaceholder: boolean = false;\n /** Show a supplemental notification dot beside the trigger label. */\n @Prop() dot: boolean = false;\n /** Control density. */\n @Prop() size: SelectSize = 'md';\n /** Width fit — hug content (default) or fill the parent. */\n @Prop() width: SelectWidth = 'hug';\n /** Align the popup's choice edge to the trigger start or end edge. */\n @Prop() popupAlign: SelectPopupAlign = 'start';\n /** Explicit collision owner; otherwise the nearest data-ds-overlay-boundary ancestor is used. */\n @Prop() boundary: HTMLElement | undefined;\n /** Shared inactive treatment; removes interaction and form submission. */\n @Prop() isInactive: boolean = false;\n /** Replace the prefix with a loader and disable option interaction. */\n @Prop() isLoading: boolean = false;\n /** Show the selected interaction fill when a valid value exists. */\n @Prop() activeFill: boolean = false;\n /**\n * Opt into table-caption icon-only chrome below 900px. The trigger omits its\n * visible label and chevron; keep an accessible name via aria-label.\n */\n @Prop({ reflect: true }) collapseLabel: boolean = false;\n /** Show the surface-aware inset border, including focused and invalid strokes. */\n @Prop() hasBorder: boolean = true;\n /** Optional trigger prefix icon name. */\n @Prop() icon: string | undefined;\n /** Trailing choice indicator. Use up-down for compact value steppers such as page size. */\n @Prop() indicator: SelectIndicator = 'down';\n /** Show the clear footer action when a value exists. */\n @Prop() allowClear: boolean = true;\n /** Localized clear action label. */\n @Prop() clearLabel: string = 'Clear';\n /** Localized noun displayed after the selected count in multiple mode. */\n @Prop() selectedLabel: string = 'selected';\n /** Optional text action shown in the popup footer instead of the clear action. */\n @Prop() footerActionLabel: string | undefined;\n /** Show immediate local filtering over option labels, subtext, and section headings. */\n @Prop() searchable: boolean = false;\n /** Localized search-field placeholder and accessible name. */\n @Prop() searchPlaceholder: string = 'Search';\n /** Localized empty-filter result text. */\n @Prop() noResultsText: string = 'No results found';\n /** Accessible loading status label. */\n @Prop() loadingLabel: string = 'Loading';\n /** Actual parent surface context; omit on primary and secondary surfaces. */\n @Prop() background: SelectBackground | undefined;\n /** Show invalid visual state. */\n @Prop() error: boolean = false;\n /** Error text rendered below the trigger when error is true. */\n @Prop() errorMessage: string | undefined;\n /** ID applied to the internal combobox trigger for external labels. */\n @Prop() inputId: string | undefined;\n /** Direct accessible name when no external label is available. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n /** IDs of elements that label the combobox. */\n @Prop({ attribute: 'aria-labelledby' }) ariaLabelledby: string | undefined;\n /** Additional IDs that describe the combobox. */\n @Prop({ attribute: 'aria-describedby' }) ariaDescribedby: string | undefined;\n\n /** Emitted after selection or clearing with the next scalar or array value. */\n @Event() dsChange!: EventEmitter<SelectValue>;\n /** Emitted after the footer clear action. */\n @Event() dsClear!: EventEmitter<void>;\n /** Emitted whenever popup visibility changes. */\n @Event() dsOpenChange!: EventEmitter<boolean>;\n /** Emitted when the optional popup footer action is activated. */\n @Event() dsFooterAction!: EventEmitter<void>;\n /** Emitted when an option's contextual ellipsis action is activated. */\n @Event() dsOptionAction!: EventEmitter<SelectOptionActionDetail>;\n /** Emitted when an option's supporting text action is activated. */\n @Event() dsOptionSubtextAction!: EventEmitter<SelectOptionSubtextActionDetail>;\n\n @State() private activeIndex = -1;\n @State() private searchTerm = '';\n @State() private formDisabled = false;\n @State() private position = { x: 0, y: 0 };\n @State() private positionReady = false;\n @State() private focusRingVisible = false;\n @State() private compactFooterSummary = false;\n @State() private captionCompact = false;\n\n private readonly generatedId = `ds-select-${++selectId}`;\n private readonly listboxId = `${this.generatedId}-listbox`;\n private readonly errorId = `${this.generatedId}-error`;\n private initialValue: SelectValue = '';\n private readonly controller = this.createController();\n private footerContentElement?: HTMLDivElement;\n private footerSummaryMeasureElement?: HTMLElement;\n private footerClearElement?: HTMLButtonElement;\n private footerResizeObserver?: ResizeObserver;\n private observedFooterContentElement?: HTMLDivElement;\n private footerMeasurementFrame?: number;\n private captionCompactDisconnect: (() => void) | undefined;\n private hasLoaded = false;\n\n private createController() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias -- adapter getters preserve reactive component ownership without inheritance.\n const owner = this;\n return new SelectController<SelectOption>({\n get host() {\n return owner.el;\n },\n generatedId: owner.generatedId,\n get options() {\n return owner.visibleOptions;\n },\n get searchable() {\n return owner.searchable;\n },\n get isLoading() {\n return owner.isLoading;\n },\n get isDisabled() {\n return owner.isDisabled;\n },\n get preferredIndex() {\n if (owner.multiple) return -1;\n return owner.visibleOptions.findIndex(\n option => option.value === owner.scalarValue && !option.isInactive\n );\n },\n get popupAlign() {\n return owner.popupAlign;\n },\n get boundary() {\n return owner.boundary;\n },\n get open() {\n return owner.open;\n },\n set open(value) {\n owner.open = value;\n },\n get activeIndex() {\n return owner.activeIndex;\n },\n set activeIndex(value) {\n owner.activeIndex = value;\n },\n get searchTerm() {\n return owner.searchTerm;\n },\n set searchTerm(value) {\n owner.searchTerm = value;\n },\n get focusRingVisible() {\n return owner.focusRingVisible;\n },\n set focusRingVisible(value) {\n owner.focusRingVisible = value;\n },\n get position() {\n return owner.position;\n },\n set position(value) {\n owner.position = value;\n },\n get positionReady() {\n return owner.positionReady;\n },\n set positionReady(value) {\n owner.positionReady = value;\n },\n selectOption: option => owner.selectOption(option),\n });\n }\n\n componentWillLoad() {\n this.value = this.normalizeValueForMode(this.value);\n this.initialValue = Array.isArray(this.value) ? [...this.value] : this.value;\n this.syncFormValue();\n }\n\n componentDidLoad() {\n this.hasLoaded = true;\n this.controller.connect();\n this.observeFooterContent();\n this.syncCaptionCompactObserver();\n }\n\n connectedCallback() {\n if (!this.hasLoaded) return;\n this.controller.connect();\n this.observeFooterContent();\n this.syncCaptionCompactObserver();\n }\n\n componentDidRender() {\n this.observeFooterContent();\n this.scheduleFooterSummaryMeasurement();\n }\n\n disconnectedCallback() {\n this.controller.disconnect();\n this.footerResizeObserver?.disconnect();\n this.observedFooterContentElement = undefined;\n if (this.footerMeasurementFrame !== undefined) {\n cancelAnimationFrame(this.footerMeasurementFrame);\n this.footerMeasurementFrame = undefined;\n }\n this.disconnectCaptionCompactObserver();\n }\n\n @Watch('collapseLabel')\n onCollapseLabelChange() {\n this.syncCaptionCompactObserver();\n }\n\n @Watch('value')\n @Watch('multiple')\n @Watch('disabled')\n @Watch('isInactive')\n @Watch('required')\n @Watch('name')\n @Watch('options')\n @Watch('sections')\n syncFormValue() {\n if (\n (this.multiple && !Array.isArray(this.value)) ||\n (!this.multiple && Array.isArray(this.value))\n ) {\n this.value = this.normalizeValueForMode(this.value);\n }\n const inactive = this.isDisabled;\n if (this.multiple) {\n const values = this.resolvedValues;\n setRepeatedFormControlValue(this.internals, this.name, values, { inactive });\n } else {\n const value = this.hasSelection ? this.scalarValue : '';\n setFormControlValue(this.internals, value, { inactive });\n }\n const missing = this.required && !inactive && !this.hasSelection;\n setRequiredValidity(this.internals, missing, this.requiredMessage);\n this.controller.optionsChanged();\n }\n\n @Watch('isLoading')\n onLoadingChange() {\n this.controller.loadingChanged();\n }\n\n @Watch('popupAlign')\n @Watch('boundary')\n onPopupAlignChange() {\n this.controller.positionChanged();\n }\n\n @Watch('open')\n onOpenChange(open: boolean) {\n this.dsOpenChange.emit(open);\n this.controller.openChanged(open);\n }\n\n @Watch('searchTerm')\n onSearchTermChange() {\n this.controller.searchChanged();\n }\n\n @Watch('activeIndex')\n onActiveIndexChange() {\n this.controller.activeIndexChanged();\n }\n\n formDisabledCallback(disabled: boolean) {\n this.formDisabled = disabled;\n this.syncFormValue();\n }\n\n formResetCallback() {\n this.value = this.normalizeValueForMode(this.initialValue);\n this.closePopup();\n }\n\n formStateRestoreCallback(state: string | File | FormData | null) {\n if (!this.multiple) {\n this.value = restoreStringFormState(state);\n return;\n }\n this.value = restoreStringArrayFormState(state);\n }\n\n @Method()\n async setFocus() {\n this.controller.setFocus();\n }\n\n private get isDisabled(): boolean {\n return this.disabled || this.isInactive || this.formDisabled;\n }\n\n private normalizeValueForMode(value: SelectValue): SelectValue {\n if (this.multiple) {\n return Array.isArray(value) ? [...value] : value ? [value] : [];\n }\n return Array.isArray(value) ? (value[0] ?? '') : value;\n }\n\n private get allSections(): SelectSection[] {\n return resolveChoiceSections(this.options, this.sections);\n }\n\n private get allOptions(): SelectOption[] {\n return flattenChoiceSections(this.allSections);\n }\n\n private get visibleSections(): SelectSection[] {\n return this.searchable\n ? filterChoiceSections(this.allSections, this.searchTerm)\n : this.allSections;\n }\n\n private get visibleOptions(): SelectOption[] {\n return flattenChoiceSections(this.visibleSections);\n }\n\n private get scalarValue(): string {\n return typeof this.value === 'string' ? this.value : '';\n }\n\n private get resolvedValues(): string[] {\n if (!this.multiple || !Array.isArray(this.value)) return [];\n const valid = new Set(this.allOptions.map(option => option.value));\n return [...new Set(this.value.filter(value => valid.has(value)))];\n }\n\n private get selectedOption(): SelectOption | undefined {\n if (this.multiple) return undefined;\n return this.allOptions.find(option => option.value === this.scalarValue);\n }\n\n private get hasSelection(): boolean {\n return this.multiple ? this.resolvedValues.length > 0 : Boolean(this.selectedOption);\n }\n\n private get activeOptionId(): string | undefined {\n return this.controller.activeOptionId;\n }\n\n private get popupRole(): 'listbox' | 'grid' {\n return this.allOptions.some(option => Boolean(option.action)) ? 'grid' : 'listbox';\n }\n\n private observeFooterContent() {\n const content =\n this.open && this.multiple && this.hasSelection ? this.footerContentElement : undefined;\n if (!content?.isConnected) {\n this.footerResizeObserver?.disconnect();\n this.observedFooterContentElement = undefined;\n return;\n }\n if (this.observedFooterContentElement === content) return;\n\n this.footerResizeObserver?.disconnect();\n if (typeof ResizeObserver !== 'undefined') {\n this.footerResizeObserver = new ResizeObserver(() => this.scheduleFooterSummaryMeasurement());\n this.footerResizeObserver.observe(content);\n }\n this.observedFooterContentElement = content;\n }\n\n private scheduleFooterSummaryMeasurement() {\n if (\n !this.open ||\n !this.multiple ||\n !this.hasSelection ||\n this.footerMeasurementFrame !== undefined\n ) {\n return;\n }\n this.footerMeasurementFrame = requestAnimationFrame(() => {\n this.footerMeasurementFrame = undefined;\n this.measureFooterSummary();\n });\n }\n\n private measureFooterSummary() {\n const content = this.footerContentElement;\n const summary = this.footerSummaryMeasureElement;\n const clear = this.footerClearElement;\n if (!content?.isConnected || !summary?.isConnected || !clear?.isConnected) return;\n\n const styles = getComputedStyle(content);\n const innerWidth =\n content.clientWidth -\n Number.parseFloat(styles.paddingInlineStart || '0') -\n Number.parseFloat(styles.paddingInlineEnd || '0');\n const requiredWidth =\n summary.getBoundingClientRect().width +\n clear.getBoundingClientRect().width +\n Number.parseFloat(styles.columnGap || '0');\n const nextCompact = requiredWidth > innerWidth + 0.5;\n if (nextCompact !== this.compactFooterSummary) {\n this.compactFooterSummary = nextCompact;\n }\n }\n\n private closePopup(restoreFocus = false) {\n this.controller.closePopup(restoreFocus);\n }\n\n private openPopup(focusVisible: boolean, edge?: 'first' | 'last') {\n this.controller.openPopup(focusVisible, edge);\n }\n\n private selectOption(option: SelectOption) {\n if (option.isInactive || this.isLoading) return;\n if (this.multiple) {\n const current = this.resolvedValues;\n const next = current.includes(option.value)\n ? current.filter(value => value !== option.value)\n : [...current, option.value];\n this.value = next;\n this.dsChange.emit([...next]);\n return;\n }\n this.value = option.value;\n this.dsChange.emit(option.value);\n this.controller.closePopup(true);\n }\n\n private clearSelection = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.value = this.multiple ? [] : '';\n this.dsChange.emit(this.multiple ? [] : '');\n this.dsClear.emit();\n if (!this.multiple) {\n const enabled = enabledChoiceIndexes(this.visibleOptions);\n this.activeIndex = enabled[0] ?? -1;\n }\n this.controller.focusSearchOrTrigger();\n };\n\n private activateFooterAction = (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.dsFooterAction.emit();\n this.closePopup();\n };\n\n private readonly handleListKeyDown = this.controller.handleListKeyDown;\n private readonly handleTriggerKeyDown = this.controller.handleTriggerKeyDown;\n\n private renderOption(\n option: SelectOption,\n index: number,\n usesIcons: boolean,\n usesSubtext: boolean\n ) {\n const selected = this.multiple\n ? this.resolvedValues.includes(option.value)\n : option.value === this.scalarValue;\n const active = index === this.activeIndex;\n const actionId = `${this.generatedId}-option-action-${index}`;\n return (\n <ChoiceOptionRow\n size={this.size}\n id={`${this.generatedId}-option-${index}`}\n option={option}\n selected={selected}\n active={active}\n focusRingVisible={this.focusRingVisible}\n usesSubtext={usesSubtext}\n actionOpen={option.action?.surfaceOpen ?? option.action?.expanded}\n popupRole={this.popupRole}\n leading={\n this.multiple ? (\n <span\n class=\"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-checkbox\n class=\"select-option__checkbox\"\n label=\"\"\n size={this.size}\n checked={selected}\n presentation\n />\n </span>\n ) : usesIcons && option.icon ? (\n <span\n class=\"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon name={option.icon} size={this.size} color=\"inherit\" />\n </span>\n ) : undefined\n }\n supporting={\n option.subtextActions?.length ? (\n <span class=\"ds-choice-item__subtext ds-control-label-box select-option__subtext-actions\">\n {option.subtextActions.map((action, actionIndex) => [\n actionIndex > 0 ? (\n <ds-text\n class=\"select-option__subtext-action-separator\"\n as=\"span\"\n variant={CONTROL_SUPPORTING_TEXT_VARIANT[this.size]}\n color=\"inherit\"\n aria-hidden=\"true\"\n >\n ·\n </ds-text>\n ) : null,\n <button\n type=\"button\"\n class={{\n 'select-option__subtext-action': true,\n 'select-option__subtext-action--negative': action.tone === 'negative',\n 'ds-text-action': true,\n 'ds-focus-ring': true,\n }}\n onKeyDown={(event: KeyboardEvent) => event.stopPropagation()}\n onClick={(event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.dsOptionSubtextAction.emit({\n value: option.value,\n actionValue: action.value,\n originalEvent: event,\n });\n }}\n >\n <ds-text\n as=\"span\"\n variant={CONTROL_SUPPORTING_TEXT_VARIANT[this.size]}\n color=\"inherit\"\n >\n {action.label}\n </ds-text>\n </button>,\n ])}\n </span>\n ) : undefined\n }\n action={\n option.action ? (\n <ds-tooltip label={option.action.label} side=\"left\" size=\"sm\">\n <ds-button-unfilled\n id={actionId}\n variant=\"icon\"\n size={OPTION_ACTION_SIZE[this.size]}\n icon=\"Ellipses\"\n rounded\n hasBorder={false}\n activeFill={false}\n ariaLabel={option.action.label}\n haspopup=\"menu\"\n controls={option.action.controls}\n expanded={option.action.expanded}\n surfaceOpen={option.action.surfaceOpen}\n onKeyDown={event => {\n event.stopPropagation();\n if (event.key === 'Escape' || event.key === 'ArrowLeft') {\n event.preventDefault();\n this.controller.focusSearchOrTrigger();\n }\n }}\n onDsClick={(event: CustomEvent<MouseEvent>) => {\n event.stopPropagation();\n this.dsOptionAction.emit({\n value: option.value,\n anchorId: actionId,\n originalEvent: event.detail,\n });\n }}\n />\n </ds-tooltip>\n ) : undefined\n }\n onHover={() => {\n this.focusRingVisible = false;\n this.activeIndex = index;\n }}\n onSelect={() => this.selectOption(option)}\n />\n );\n }\n\n private get captionIconOnly(): boolean {\n return this.collapseLabel && this.captionCompact && Boolean(this.icon || this.isLoading);\n }\n\n private syncCaptionCompactObserver(): void {\n this.disconnectCaptionCompactObserver();\n if (!this.collapseLabel) {\n if (this.captionCompact) this.captionCompact = false;\n return;\n }\n this.captionCompactDisconnect = observeTableCaptionCompact(this.el, compact => {\n if (this.captionCompact !== compact) this.captionCompact = compact;\n });\n }\n\n private disconnectCaptionCompactObserver(): void {\n this.captionCompactDisconnect?.();\n this.captionCompactDisconnect = undefined;\n }\n\n private renderCaptionTooltip(trigger: VNode, label: string): VNode {\n if (!this.collapseLabel) return trigger;\n return (\n <ds-tooltip label={label} side=\"top\" size=\"sm\">\n {trigger}\n </ds-tooltip>\n );\n }\n\n render() {\n const inactive = this.isDisabled;\n const showPlaceholder = !this.hasSelection;\n const count = this.resolvedValues.length;\n const label = this.multiple\n ? `${this.placeholder}${count > 0 ? ` · ${count}` : ''}`\n : showPlaceholder\n ? this.placeholder\n : (this.triggerLabel ?? this.selectedOption?.label);\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const iconSize = ICON_SIZE[this.size];\n const usesOptionIcons = !this.multiple && choiceListUsesIcons(this.allOptions);\n const usesOptionSubtext = choiceListUsesSubtext(this.allOptions);\n const showError = this.error && Boolean(this.errorMessage);\n const describedBy =\n [this.ariaDescribedby, showError ? this.errorId : undefined].filter(Boolean).join(' ') ||\n undefined;\n const popupStyle = {\n position: 'fixed',\n left: '0',\n top: '0',\n transform: `translate(${Math.round(this.position.x)}px, ${Math.round(this.position.y)}px)`,\n zIndex: 'var(--dimension-z-index-floating)',\n visibility: this.positionReady ? 'visible' : 'hidden',\n };\n let flatIndex = 0;\n\n return (\n <Host\n class={{\n 'select-host': true,\n 'ds-select-trigger-host': true,\n 'select-host--multiple': this.multiple,\n 'ds-field-stack': true,\n 'ds-control-inactive': inactive,\n [`ds-control--${this.size}`]: true,\n 'ds-table-caption-control': this.collapseLabel,\n 'ds-table-caption-control--compact': this.captionIconOnly,\n ...controlWidthClass(this.width),\n [`select-host--background-${this.background}`]: !!this.background,\n [`ds-select-trigger-host--background-${this.background}`]: !!this.background,\n }}\n >\n {this.renderCaptionTooltip(\n <button\n ref={element => {\n this.controller.setTriggerElement((element as HTMLButtonElement) ?? null);\n }}\n id={this.inputId ?? this.generatedId}\n type=\"button\"\n class={{\n trigger: true,\n 'ds-control-frame': true,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--selected': !inactive && this.activeFill && this.hasSelection,\n 'trigger--expanded': !inactive && this.open,\n 'ds-interaction-fill--surface-open': !inactive && this.open,\n 'trigger--bordered': this.hasBorder,\n 'trigger--placeholder': showPlaceholder && !this.multiple,\n 'trigger--has-value': this.hasSelection,\n 'trigger--label-placeholder':\n !this.multiple && Boolean(this.triggerLabel) && this.triggerLabelPlaceholder,\n 'wrapper--error': this.hasBorder && this.error,\n [`ds-control--${this.size}`]: true,\n ...choiceBackgroundClassMap(this.background),\n }}\n disabled={inactive}\n role=\"combobox\"\n aria-haspopup={this.popupRole}\n aria-expanded={String(this.open)}\n aria-controls={this.open ? this.listboxId : undefined}\n aria-activedescendant={this.open && !this.searchable ? this.activeOptionId : undefined}\n aria-label={this.ariaLabel ?? (this.captionIconOnly ? label : undefined)}\n aria-labelledby={this.ariaLabelledby}\n aria-describedby={describedBy}\n aria-invalid={this.error ? 'true' : undefined}\n aria-required={this.required || undefined}\n aria-busy={this.isLoading ? 'true' : undefined}\n onClick={() => (this.open ? this.closePopup() : this.openPopup(false))}\n onKeyDown={event => {\n const action = this.visibleOptions[this.activeIndex]?.action;\n if (\n this.open &&\n action &&\n (event.key === 'ArrowRight' || (event.key === 'F10' && event.shiftKey))\n ) {\n event.preventDefault();\n document\n .getElementById(`${this.generatedId}-option-action-${this.activeIndex}`)\n ?.querySelector<HTMLElement>('button')\n ?.focus();\n return;\n }\n this.handleTriggerKeyDown(event);\n }}\n >\n {(this.icon || this.isLoading) && (\n <span\n class=\"trigger__prefix ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n {this.isLoading ? (\n <ds-loader size={iconSize} color=\"inherit\" />\n ) : (\n <ds-icon name={this.icon} size={iconSize} color=\"inherit\" />\n )}\n </span>\n )}\n {this.captionIconOnly ? null : (\n <span\n class={{\n 'trigger__label-box': true,\n 'ds-interaction-fill__content': true,\n }}\n >\n <span\n class={{\n 'trigger__label-content': true,\n 'ds-control-label-box': true,\n 'ds-control-label-dot': this.dot,\n 'trigger__label-content--dot': this.dot,\n }}\n >\n <ds-text\n class=\"trigger__label\"\n as=\"span\"\n variant={textVariant}\n color=\"inherit\"\n lineTruncation={1}\n >\n {label}\n </ds-text>\n {this.dot && (\n <ds-badge\n class=\"trigger__dot ds-control-label-dot__badge\"\n variant=\"dot\"\n hasRing={false}\n label=\"\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n </span>\n )}\n {this.captionIconOnly ? null : (\n <span\n class=\"trigger__chevron ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon\n name={this.indicator === 'up-down' ? 'ChevronUpDown' : 'ChevronDown'}\n size={iconSize}\n color=\"inherit\"\n />\n </span>\n )}\n </button>,\n this.captionIconOnly ? this.ariaLabel?.trim() || this.placeholder : ''\n )}\n\n {this.open && (\n <div\n popover=\"manual\"\n ref={element => {\n this.controller.setPopupElement((element as HTMLDivElement) ?? null);\n }}\n class=\"select-popup ds-choice-popup\"\n style={popupStyle}\n >\n {this.searchable && (\n <ChoiceSearch\n size={this.size}\n value={this.searchTerm}\n placeholder={this.searchPlaceholder}\n controls={this.listboxId}\n activeDescendant={this.activeOptionId}\n inputRef={this.controller.setSearchElement}\n clearLabel={this.clearLabel}\n onValueChange={value => {\n this.searchTerm = value;\n }}\n onKeyDown={event => this.handleListKeyDown(event)}\n />\n )}\n <div\n id={this.listboxId}\n class=\"ds-choice-list\"\n role={this.popupRole}\n aria-multiselectable={this.multiple ? 'true' : undefined}\n aria-label={this.ariaLabel ?? this.placeholder}\n aria-busy={this.isLoading ? 'true' : undefined}\n >\n {this.isLoading ? (\n <div\n class=\"ds-choice-loading ds-empty-region\"\n role={this.popupRole === 'grid' ? 'row' : 'option'}\n aria-selected=\"false\"\n aria-disabled=\"true\"\n aria-label={this.loadingLabel}\n aria-live=\"polite\"\n >\n {this.popupRole === 'grid' ? (\n <span role=\"gridcell\">\n <ds-loader size={this.size} color=\"inherit\" />\n </span>\n ) : (\n <ds-loader size={this.size} color=\"inherit\" />\n )}\n </div>\n ) : this.visibleOptions.length === 0 ? (\n <div\n class=\"ds-choice-empty ds-empty-region\"\n role={this.popupRole === 'grid' ? 'row' : 'option'}\n aria-selected=\"false\"\n aria-disabled=\"true\"\n aria-label={this.noResultsText}\n aria-live=\"polite\"\n >\n {this.popupRole === 'grid' ? (\n <span role=\"gridcell\">\n <ds-empty-state body={this.noResultsText} />\n </span>\n ) : (\n <ds-empty-state body={this.noResultsText} />\n )}\n </div>\n ) : (\n this.visibleSections.map((section, sectionIndex) => (\n <div\n class={{\n 'ds-choice-section': true,\n 'ds-chrome-column': true,\n 'ds-chrome-space--sm': true,\n 'ds-choice-section--divided': !!section.divider,\n 'ds-choice-section--headed-after-first':\n sectionIndex > 0 && Boolean(section.header),\n }}\n role={\n this.popupRole === 'grid' ? 'rowgroup' : section.header ? 'group' : undefined\n }\n aria-label={section.header}\n >\n {section.header && this.popupRole === 'grid' ? (\n <ds-text\n class={`ds-choice-section__header ds-control-section-heading ds-control--${this.size}`}\n as=\"span\"\n variant={CONTROL_SUPPORTING_TEXT_VARIANT[this.size]}\n emphasis\n color=\"primary\"\n role=\"row\"\n >\n <span class=\"ds-choice-section__header-label\" role=\"gridcell\">\n {section.header}\n </span>\n </ds-text>\n ) : section.header ? (\n <ds-text\n class={`ds-choice-section__header ds-control-section-heading ds-control--${this.size}`}\n as=\"span\"\n variant={CONTROL_SUPPORTING_TEXT_VARIANT[this.size]}\n emphasis\n color=\"primary\"\n aria-hidden=\"true\"\n >\n <span class=\"ds-choice-section__header-label\">{section.header}</span>\n </ds-text>\n ) : null}\n {section.options.map(option =>\n this.renderOption(option, flatIndex++, usesOptionIcons, usesOptionSubtext)\n )}\n </div>\n ))\n )}\n </div>\n {this.footerActionLabel && !this.isLoading ? (\n <ChoiceActionFooter\n size={this.size}\n label={this.footerActionLabel}\n onAction={this.activateFooterAction}\n />\n ) : this.allowClear && this.hasSelection && !this.isLoading ? (\n <ChoiceFooter\n size={this.size}\n summary={this.multiple ? `${count} ${this.selectedLabel}` : undefined}\n compactSummary={this.multiple ? String(count) : undefined}\n useCompactSummary={this.compactFooterSummary}\n contentRef={element => {\n this.footerContentElement = element ?? undefined;\n }}\n summaryMeasureRef={element => {\n this.footerSummaryMeasureElement = element ?? undefined;\n }}\n clearRef={element => {\n this.footerClearElement = element ?? undefined;\n }}\n clearLabel={this.clearLabel}\n onClear={this.clearSelection}\n />\n ) : null}\n </div>\n )}\n\n {showError && (\n <ds-text\n class=\"error-text\"\n as=\"div\"\n variant=\"text-body-small\"\n color=\"negative\"\n textId={this.errorId}\n role=\"alert\"\n >\n {this.errorMessage}\n </ds-text>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"u4BA2CaA,EASX,WAAAC,CAA6BC,GAAAC,KAAAD,QARrBC,KAAAC,UAAsC,KACtCD,KAAAE,QAAiC,KACjCF,KAAAG,SAAsC,KACtCH,KAAAI,UAAY,GACZJ,KAAAK,eAAuD,KACvDL,KAAAM,eAAuD,KA8C/DN,KAAAO,kBAAqBC,IACnBR,KAAKC,UAAYO,CAAO,EAG1BR,KAAAS,gBAAmBD,IACjBR,KAAKE,QAAUM,CAAO,EAGxBR,KAAAU,iBAAoBF,IAClBR,KAAKG,SAAWK,CAAO,EAqFzBR,KAAAW,qBAAwBC,IACtB,IAAKZ,KAAKD,MAAMc,KAAM,CACpB,GAAI,CAAC,YAAa,UAAW,QAAS,KAAKC,SAASF,EAAMG,KAAM,CAC9DH,EAAMI,iBACNhB,KAAKiB,UAAU,KAAML,EAAMG,MAAQ,UAAY,OAAS,Q,MACnD,GAAIf,KAAKkB,eAAeN,GAAQ,CACrCA,EAAMI,iBACNhB,KAAKiB,UAAU,MACf,GAAIjB,KAAKD,MAAMoB,WAAYnB,KAAKD,MAAMqB,WAAaR,EAAMG,SACpDf,KAAKqB,gBAAgBT,EAAMG,I,CAElC,M,CAEFf,KAAKsB,kBAAkBV,EAAM,EAG/BZ,KAAAsB,kBAAqBV,IACnB,OAAQA,EAAMG,KACZ,IAAK,YACHH,EAAMI,iBACNhB,KAAKD,MAAMwB,iBAAmB,KAC9BvB,KAAKD,MAAMyB,YAAcC,EAAgBzB,KAAKD,MAAM2B,QAAS1B,KAAKD,MAAMyB,YAAa,GACrF,MACF,IAAK,UACHZ,EAAMI,iBACNhB,KAAKD,MAAMwB,iBAAmB,KAC9BvB,KAAKD,MAAMyB,YAAcC,EAAgBzB,KAAKD,MAAM2B,QAAS1B,KAAKD,MAAMyB,aAAa,GACrF,MACF,IAAK,OACHZ,EAAMI,iBACNhB,KAAKD,MAAMwB,iBAAmB,KAC9BvB,KAAKD,MAAMyB,YAAcG,EAAqB3B,KAAKD,MAAM2B,SAAS,KAAM,EACxE,MACF,IAAK,MAAO,CACVd,EAAMI,iBACNhB,KAAKD,MAAMwB,iBAAmB,KAC9B,MAAMK,EAAUD,EAAqB3B,KAAKD,MAAM2B,SAChD1B,KAAKD,MAAMyB,YAAcI,EAAQA,EAAQC,OAAS,KAAM,EACxD,K,CAEF,IAAK,QACL,IAAK,IAAK,CACR,GACEjB,EAAMG,MAAQ,KACdf,KAAKD,MAAMoB,YACXP,EAAMkB,kBAAkBC,MACxB/B,KAAKG,UAAU6B,SAASpB,EAAMkB,QAE9B,MACFlB,EAAMI,iBACN,MAAMiB,EAASjC,KAAKD,MAAM2B,QAAQ1B,KAAKD,MAAMyB,aAC7C,GAAIS,EAAQjC,KAAKD,MAAMmC,aAAaD,GACpC,K,CAEF,IAAK,SACHrB,EAAMI,iBACNhB,KAAKmC,WAAW,MAChB,MACF,IAAK,MACHnC,KAAKmC,aACL,MACF,QACE,IAAKnC,KAAKD,MAAMoB,YAAcnB,KAAKkB,eAAeN,GAAQ,CACxDZ,KAAKqB,gBAAgBT,EAAMG,I,IAvMjCf,KAAKoC,SAAW,IAAIC,EAA2B,CAC7CC,UAAW,IAAMtC,KAAKC,UACtBsC,SAAU,IAAMvC,KAAKE,QACrBsC,QAAS,CAACC,EAASC,KACjB,IAAK1C,KAAKD,MAAMc,OAAS6B,EAAMC,cAAgB3C,KAAKD,MAAM6C,KAAKZ,SAASU,GAAQ,OAAO,KAEvF,MAAMG,EAAiBC,EAAmBC,EAAeC,SAAUD,EAAeC,UAClFN,EAAMO,MAAMC,SAAW,8CAA8CH,EAAeI,iBAAiBC,EAAoBX,EAAQY,YAAaR,QAE9I,MAAMS,EAAQtD,KAAKD,MAAMwD,WACzB,MAAO,CACLC,WAAYf,EAAQgB,wBACpBC,WAAYhB,EAAMW,YAClBM,YAAajB,EAAMkB,aACnBC,KAAM,SACNP,QACAQ,aAAcjB,EACdkB,cAAeC,EAA8B,CAC3CV,QACAS,cAAe,EACfE,eAAgBpB,IAElBqB,cAAerB,EACfsB,cAAeC,OAAOC,WACtBC,eAAgBF,OAAOG,YACvBC,cAAeC,EAAmChC,EAASzC,KAAKD,MAAM2E,UACvE,EAEHC,MAAO,EAAGC,IAAGC,QACX7E,KAAKD,MAAMqC,SAAW,CAAEwC,IAAGC,KAC3B7E,KAAKD,MAAM+E,cAAgB,IAAI,EAEjCC,SAAU,M,CAId,kBAAIC,GACF,OAAQhF,KAAKD,MAAMkF,WAAajF,KAAKD,MAAMyB,aAAe,EACtD,GAAGxB,KAAKD,MAAMmF,sBAAsBlF,KAAKD,MAAMyB,cAC/C2D,S,CAeN,OAAAC,GACE,GAAIpF,KAAKD,MAAMc,KAAMb,KAAKqF,YAAY,K,CAGxC,UAAAC,GACEtF,KAAKuF,sBACLvF,KAAKwF,uBACL,GAAIxF,KAAKK,eAAgBoF,aAAazF,KAAKK,e,CAG7C,QAAAqF,GACE1F,KAAKC,WAAW0F,O,CAGlB,cAAAC,GACE,IAAK5F,KAAKD,MAAMc,KAAM,OACtB,MAAMe,EAAUD,EAAqB3B,KAAKD,MAAM2B,SAChD,IAAKE,EAAQd,SAASd,KAAKD,MAAMyB,aAAcxB,KAAKD,MAAMyB,YAAcI,EAAQ,KAAM,EACtFiE,uBAAsB,IAAM7F,KAAK8F,kB,CAGnC,cAAAC,GACE,GAAI/F,KAAKD,MAAMc,KAAMgF,uBAAsB,IAAM7F,KAAK8F,kB,CAGxD,eAAAE,GACE,GAAIhG,KAAKD,MAAMc,KAAMgF,uBAAsB,IAAM7F,KAAK8F,kB,CAGxD,WAAAT,CAAYxE,GACV,GAAIA,EAAM,CACRb,KAAKiG,qBACLjG,KAAKkG,wBAAuB,KAC1BlG,KAAKmG,6BACL,GAAInG,KAAKD,MAAMoB,gBAAiBnB,KAAKG,UAAUuF,UAAU,IAE3D,M,CAEF1F,KAAKuF,sBACLvF,KAAKwF,uBACLxF,KAAKD,MAAMqB,WAAa,GACxBpB,KAAKD,MAAM+E,cAAgB,K,CAG7B,aAAAsB,GACEpG,KAAKD,MAAMyB,YAAcG,EAAqB3B,KAAKD,MAAM2B,SAAS,KAAM,EACxEmE,uBAAsB,KACpB7F,KAAK8F,iBACL9F,KAAKmG,4BAA4B,G,CAIrC,kBAAAE,GACER,uBAAsB,IAAM7F,KAAKmG,8B,CAGnC,SAAAlF,CAAUqF,EAAuBC,GAC/B,GAAIvG,KAAKD,MAAMyG,aAAgBxG,KAAKD,MAAM2B,QAAQG,SAAW7B,KAAKD,MAAMkF,UAAY,OACpF,MAAMrD,EAAUD,EAAqB3B,KAAKD,MAAM2B,SAChD1B,KAAKD,MAAMyB,YACT+E,IAAS,OACJ3E,EAAQA,EAAQC,OAAS,KAAM,EAChC7B,KAAKD,MAAM0G,gBAAkB,EAC3BzG,KAAKD,MAAM0G,eACV7E,EAAQ,KAAM,EACvB5B,KAAKD,MAAMwB,iBAAmB+E,EAC9BtG,KAAKD,MAAMc,KAAO,I,CAGpB,UAAAsB,CAAWuE,EAAe,OACxB,IAAK1G,KAAKD,MAAMc,KAAM,OACtBb,KAAKD,MAAMc,KAAO,MAClB,GAAI6F,EAAcb,uBAAsB,IAAM7F,KAAKC,WAAW0F,S,CAGhE,oBAAAgB,GACEd,uBAAsB,KACpB,GAAI7F,KAAKD,MAAMoB,gBAAiBnB,KAAKG,UAAUuF,gBAC1C1F,KAAKC,WAAW0F,OAAO,G,CAwExB,cAAAzE,CAAeN,GACrB,OAAOA,EAAMG,IAAIc,SAAW,IAAMjB,EAAMgG,UAAYhG,EAAMiG,UAAYjG,EAAMkG,M,CAGtE,eAAAzF,CAAgBN,GACtB,GAAIf,KAAKK,eAAgBoF,aAAazF,KAAKK,gBAC3CL,KAAKD,MAAMwB,iBAAmB,KAC9B,MAAMwF,EAAahG,EAAIiG,oBACvB,MAAMC,EACJjH,KAAKI,UAAUyB,OAAS,GAAK,IAAI7B,KAAKI,WAAW8G,OAAMC,GAAaA,IAAcJ,IACpF/G,KAAKI,UAAY6G,EAAoBF,EAAa,GAAG/G,KAAKI,YAAY2G,IACtE,MAAMK,EAAQC,EACZrH,KAAKD,MAAM2B,QACX1B,KAAKI,UACLJ,KAAKD,MAAMyB,aAEb,GAAI4F,GAAS,EAAGpH,KAAKD,MAAMyB,YAAc4F,EACzC,MAAME,EAAUC,EACdxE,EAAeyE,yBACfzE,EAAeyE,0BAEjBxH,KAAKK,eAAiBoH,YAAW,KAC/BzH,KAAKI,UAAY,GACjBJ,KAAKK,eAAiB,IAAI,GACzBiH,E,CAGG,0BAAAnB,GACN,IAAKnG,KAAKD,MAAMc,OAASb,KAAKgF,eAAgB,OAC9ChF,KAAKD,MAAM6C,KACR8E,cAA2B,IAAI1H,KAAKgF,mBACnC2C,eAAe,CAAEC,MAAO,UAAWC,OAAQ,W,CAGzC,kBAAA5B,GACNjG,KAAKwF,uBACLxF,KAAKM,eAAiBM,IACpB,GAAIkH,EAAgClH,EAAOZ,KAAKD,MAAM6C,MAAO,OAC7D5C,KAAKmC,YAAY,EAEnB4F,SAASC,iBAAiB,YAAahI,KAAKM,eAAgB,MAC5DN,KAAKoC,SAAS6F,S,CAGR,oBAAAzC,GACN,GAAIxF,KAAKM,eAAgB,CACvByH,SAASG,oBAAoB,YAAalI,KAAKM,eAAgB,MAC/DN,KAAKM,eAAiB,I,CAExBN,KAAKoC,SAAS+F,W,CAGR,mBAAA5C,GACNvF,KAAKoC,SAASgG,Q,CAGR,sBAAAlC,CAAuBmC,GAC7B,IAAKrI,KAAKD,MAAMc,KAAM,OACtBb,KAAKD,MAAM+E,cAAgB,MAC3B9E,KAAKoC,SAASkG,SAASD,E,CAGjB,cAAAvC,GACN,OAAO9F,KAAKoC,SAASmG,Q,EChUzB,MAAMC,EAAY,IAAM,0qsCCoExB,MAAMC,EAA2D,CAC/DC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,MAGN,MAAMC,EAA6D,CACjEJ,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,MAGN,IAAIE,EAAW,E,MAQFC,EAAMC,EAAA,MAAAD,UAAAE,EANnB,WAAApJ,CAAAqJ,G,4VAWUnJ,KAAA0B,QAA0B,GAE1B1B,KAAAoJ,SAA4B,GAEXpJ,KAAAqJ,SAAoB,MAEpBrJ,KAAAsJ,MAAqB,GAENtJ,KAAAa,KAAgB,MAI/Bb,KAAAuJ,SAAoB,MAEpBvJ,KAAAwJ,SAAoB,MAErCxJ,KAAAyJ,gBAA0BC,EAE1B1J,KAAA2J,YAAsB,SAItB3J,KAAA4J,wBAAmC,MAEnC5J,KAAA6J,IAAe,MAEf7J,KAAA8J,KAAmB,KAEnB9J,KAAA+J,MAAqB,MAErB/J,KAAAuD,WAA+B,QAI/BvD,KAAAgK,WAAsB,MAEtBhK,KAAAiF,UAAqB,MAErBjF,KAAAiK,WAAsB,MAKLjK,KAAAkK,cAAyB,MAE1ClK,KAAAmK,UAAqB,KAIrBnK,KAAAoK,UAA6B,OAE7BpK,KAAAqK,WAAsB,KAEtBrK,KAAAsK,WAAqB,QAErBtK,KAAAuK,cAAwB,WAIxBvK,KAAAmB,WAAsB,MAEtBnB,KAAAwK,kBAA4B,SAE5BxK,KAAAyK,cAAwB,mBAExBzK,KAAA0K,aAAuB,UAIvB1K,KAAA2K,MAAiB,MAMU3K,KAAA4K,UAA2B,KAmB7C5K,KAAAwB,aAAc,EACdxB,KAAAoB,WAAa,GACbpB,KAAA6K,aAAe,MACf7K,KAAAoC,SAAW,CAAEwC,EAAG,EAAGC,EAAG,GACtB7E,KAAA8E,cAAgB,MAChB9E,KAAAuB,iBAAmB,MACnBvB,KAAA8K,qBAAuB,MACvB9K,KAAA+K,eAAiB,MAEjB/K,KAAAkF,YAAc,eAAe6D,IAC7B/I,KAAAgL,UAAY,GAAGhL,KAAKkF,sBACpBlF,KAAAiL,QAAU,GAAGjL,KAAKkF,oBAC3BlF,KAAAkL,aAA4B,GACnBlL,KAAAmL,WAAanL,KAAKoL,mBAQ3BpL,KAAAqL,UAAY,MAuUZrL,KAAAsL,eAAkB1K,IACxBA,EAAMI,iBACNJ,EAAM2K,kBACNvL,KAAKsJ,MAAQtJ,KAAKqJ,SAAW,GAAK,GAClCrJ,KAAKwL,SAASC,KAAKzL,KAAKqJ,SAAW,GAAK,IACxCrJ,KAAK0L,QAAQD,OACb,IAAKzL,KAAKqJ,SAAU,CAClB,MAAMzH,EAAUD,EAAqB3B,KAAK2L,gBAC1C3L,KAAKwB,YAAcI,EAAQ,KAAM,C,CAEnC5B,KAAKmL,WAAWxE,sBAAsB,EAGhC3G,KAAA4L,qBAAwBhL,IAC9BA,EAAMI,iBACNJ,EAAM2K,kBACNvL,KAAK6L,eAAeJ,OACpBzL,KAAKmC,YAAY,EAGFnC,KAAAsB,kBAAoBtB,KAAKmL,WAAW7J,kBACpCtB,KAAAW,qBAAuBX,KAAKmL,WAAWxK,oBAoezD,CA9zBS,gBAAAyK,GAEN,MAAMU,EAAQ9L,KACd,OAAO,IAAIH,EAA+B,CACxC,QAAI+C,GACF,OAAOkJ,EAAMC,E,EAEf7G,YAAa4G,EAAM5G,YACnB,WAAIxD,GACF,OAAOoK,EAAMH,c,EAEf,cAAIxK,GACF,OAAO2K,EAAM3K,U,EAEf,aAAI8D,GACF,OAAO6G,EAAM7G,S,EAEf,cAAIuB,GACF,OAAOsF,EAAMtF,U,EAEf,kBAAIC,GACF,GAAIqF,EAAMzC,SAAU,OAAO,EAC3B,OAAOyC,EAAMH,eAAeK,WAC1B/J,GAAUA,EAAOqH,QAAUwC,EAAMG,cAAgBhK,EAAO+H,Y,EAG5D,cAAIzG,GACF,OAAOuI,EAAMvI,U,EAEf,YAAImB,GACF,OAAOoH,EAAMpH,Q,EAEf,QAAI7D,GACF,OAAOiL,EAAMjL,I,EAEf,QAAIA,CAAKyI,GACPwC,EAAMjL,KAAOyI,C,EAEf,eAAI9H,GACF,OAAOsK,EAAMtK,W,EAEf,eAAIA,CAAY8H,GACdwC,EAAMtK,YAAc8H,C,EAEtB,cAAIlI,GACF,OAAO0K,EAAM1K,U,EAEf,cAAIA,CAAWkI,GACbwC,EAAM1K,WAAakI,C,EAErB,oBAAI/H,GACF,OAAOuK,EAAMvK,gB,EAEf,oBAAIA,CAAiB+H,GACnBwC,EAAMvK,iBAAmB+H,C,EAE3B,YAAIlH,GACF,OAAO0J,EAAM1J,Q,EAEf,YAAIA,CAASkH,GACXwC,EAAM1J,SAAWkH,C,EAEnB,iBAAIxE,GACF,OAAOgH,EAAMhH,a,EAEf,iBAAIA,CAAcwE,GAChBwC,EAAMhH,cAAgBwE,C,EAExBpH,aAAcD,GAAU6J,EAAM5J,aAAaD,I,CAI/C,iBAAAiK,GACElM,KAAKsJ,MAAQtJ,KAAKmM,sBAAsBnM,KAAKsJ,OAC7CtJ,KAAKkL,aAAekB,MAAMC,QAAQrM,KAAKsJ,OAAS,IAAItJ,KAAKsJ,OAAStJ,KAAKsJ,MACvEtJ,KAAKsM,e,CAGP,gBAAAC,GACEvM,KAAKqL,UAAY,KACjBrL,KAAKmL,WAAW/F,UAChBpF,KAAKwM,uBACLxM,KAAKyM,4B,CAGP,iBAAAC,GACE,IAAK1M,KAAKqL,UAAW,OACrBrL,KAAKmL,WAAW/F,UAChBpF,KAAKwM,uBACLxM,KAAKyM,4B,CAGP,kBAAAE,GACE3M,KAAKwM,uBACLxM,KAAK4M,kC,CAGP,oBAAAC,GACE7M,KAAKmL,WAAW7F,aAChBtF,KAAK8M,sBAAsBxH,aAC3BtF,KAAK+M,6BAA+B5H,UACpC,GAAInF,KAAKgN,yBAA2B7H,UAAW,CAC7C8H,qBAAqBjN,KAAKgN,wBAC1BhN,KAAKgN,uBAAyB7H,S,CAEhCnF,KAAKkN,kC,CAIP,qBAAAC,GACEnN,KAAKyM,4B,CAWP,aAAAH,GACE,GACGtM,KAAKqJ,WAAa+C,MAAMC,QAAQrM,KAAKsJ,SACpCtJ,KAAKqJ,UAAY+C,MAAMC,QAAQrM,KAAKsJ,OACtC,CACAtJ,KAAKsJ,MAAQtJ,KAAKmM,sBAAsBnM,KAAKsJ,M,CAE/C,MAAM8D,EAAWpN,KAAKwG,WACtB,GAAIxG,KAAKqJ,SAAU,CACjB,MAAMgE,EAASrN,KAAKsN,eACpBC,EAA4BvN,KAAKwN,UAAWxN,KAAKyN,KAAMJ,EAAQ,CAAED,Y,KAC5D,CACL,MAAM9D,EAAQtJ,KAAK0N,aAAe1N,KAAKiM,YAAc,GACrD0B,EAAoB3N,KAAKwN,UAAWlE,EAAO,CAAE8D,Y,CAE/C,MAAMQ,EAAU5N,KAAKwJ,WAAa4D,IAAapN,KAAK0N,aACpDG,EAAoB7N,KAAKwN,UAAWI,EAAS5N,KAAKyJ,iBAClDzJ,KAAKmL,WAAWvF,gB,CAIlB,eAAAkI,GACE9N,KAAKmL,WAAWpF,gB,CAKlB,kBAAAgI,GACE/N,KAAKmL,WAAWnF,iB,CAIlB,YAAAgI,CAAanN,GACXb,KAAKiO,aAAaxC,KAAK5K,GACvBb,KAAKmL,WAAW9F,YAAYxE,E,CAI9B,kBAAAqN,GACElO,KAAKmL,WAAW/E,e,CAIlB,mBAAA+H,GACEnO,KAAKmL,WAAW9E,oB,CAGlB,oBAAA+H,CAAqB7E,GACnBvJ,KAAK6K,aAAetB,EACpBvJ,KAAKsM,e,CAGP,iBAAA+B,GACErO,KAAKsJ,MAAQtJ,KAAKmM,sBAAsBnM,KAAKkL,cAC7ClL,KAAKmC,Y,CAGP,wBAAAmM,CAAyBvO,GACvB,IAAKC,KAAKqJ,SAAU,CAClBrJ,KAAKsJ,MAAQiF,EAAuBxO,GACpC,M,CAEFC,KAAKsJ,MAAQkF,EAA4BzO,E,CAI3C,cAAM2F,GACJ1F,KAAKmL,WAAWzF,U,CAGlB,cAAYc,GACV,OAAOxG,KAAKuJ,UAAYvJ,KAAKgK,YAAchK,KAAK6K,Y,CAG1C,qBAAAsB,CAAsB7C,GAC5B,GAAItJ,KAAKqJ,SAAU,CACjB,OAAO+C,MAAMC,QAAQ/C,GAAS,IAAIA,GAASA,EAAQ,CAACA,GAAS,E,CAE/D,OAAO8C,MAAMC,QAAQ/C,GAAUA,EAAM,IAAM,GAAMA,C,CAGnD,eAAYmF,GACV,OAAOC,EAAsB1O,KAAK0B,QAAS1B,KAAKoJ,S,CAGlD,cAAYuF,GACV,OAAOC,EAAsB5O,KAAKyO,Y,CAGpC,mBAAYI,GACV,OAAO7O,KAAKmB,WACR2N,EAAqB9O,KAAKyO,YAAazO,KAAKoB,YAC5CpB,KAAKyO,W,CAGX,kBAAY9C,GACV,OAAOiD,EAAsB5O,KAAK6O,gB,CAGpC,eAAY5C,GACV,cAAcjM,KAAKsJ,QAAU,SAAWtJ,KAAKsJ,MAAQ,E,CAGvD,kBAAYgE,GACV,IAAKtN,KAAKqJ,WAAa+C,MAAMC,QAAQrM,KAAKsJ,OAAQ,MAAO,GACzD,MAAMyF,EAAQ,IAAIC,IAAIhP,KAAK2O,WAAWM,KAAIhN,GAAUA,EAAOqH,SAC3D,MAAO,IAAI,IAAI0F,IAAIhP,KAAKsJ,MAAM4F,QAAO5F,GAASyF,EAAMI,IAAI7F,M,CAG1D,kBAAY8F,GACV,GAAIpP,KAAKqJ,SAAU,OAAOlE,UAC1B,OAAOnF,KAAK2O,WAAWU,MAAKpN,GAAUA,EAAOqH,QAAUtJ,KAAKiM,a,CAG9D,gBAAYyB,GACV,OAAO1N,KAAKqJ,SAAWrJ,KAAKsN,eAAezL,OAAS,EAAIyN,QAAQtP,KAAKoP,e,CAGvE,kBAAYpK,GACV,OAAOhF,KAAKmL,WAAWnG,c,CAGzB,aAAYuK,GACV,OAAOvP,KAAK2O,WAAWa,MAAKvN,GAAUqN,QAAQrN,EAAOwN,UAAW,OAAS,S,CAGnE,oBAAAjD,GACN,MAAMkD,EACJ1P,KAAKa,MAAQb,KAAKqJ,UAAYrJ,KAAK0N,aAAe1N,KAAK2P,qBAAuBxK,UAChF,IAAKuK,GAAS/M,YAAa,CACzB3C,KAAK8M,sBAAsBxH,aAC3BtF,KAAK+M,6BAA+B5H,UACpC,M,CAEF,GAAInF,KAAK+M,+BAAiC2C,EAAS,OAEnD1P,KAAK8M,sBAAsBxH,aAC3B,UAAWsK,iBAAmB,YAAa,CACzC5P,KAAK8M,qBAAuB,IAAI8C,gBAAe,IAAM5P,KAAK4M,qCAC1D5M,KAAK8M,qBAAqB7E,QAAQyH,E,CAEpC1P,KAAK+M,6BAA+B2C,C,CAG9B,gCAAA9C,GACN,IACG5M,KAAKa,OACLb,KAAKqJ,WACLrJ,KAAK0N,cACN1N,KAAKgN,yBAA2B7H,UAChC,CACA,M,CAEFnF,KAAKgN,uBAAyBnH,uBAAsB,KAClD7F,KAAKgN,uBAAyB7H,UAC9BnF,KAAK6P,sBAAsB,G,CAIvB,oBAAAA,GACN,MAAMH,EAAU1P,KAAK2P,qBACrB,MAAMG,EAAU9P,KAAK+P,4BACrB,MAAMC,EAAQhQ,KAAKiQ,mBACnB,IAAKP,GAAS/M,cAAgBmN,GAASnN,cAAgBqN,GAAOrN,YAAa,OAE3E,MAAMuN,EAASC,iBAAiBT,GAChC,MAAMrL,EACJqL,EAAQU,YACRC,OAAOC,WAAWJ,EAAOK,oBAAsB,KAC/CF,OAAOC,WAAWJ,EAAOM,kBAAoB,KAC/C,MAAMC,EACJX,EAAQrM,wBAAwBsG,MAChCiG,EAAMvM,wBAAwBsG,MAC9BsG,OAAOC,WAAWJ,EAAOQ,WAAa,KACxC,MAAMC,EAAcF,EAAgBpM,EAAa,GACjD,GAAIsM,IAAgB3Q,KAAK8K,qBAAsB,CAC7C9K,KAAK8K,qBAAuB6F,C,EAIxB,UAAAxO,CAAWuE,EAAe,OAChC1G,KAAKmL,WAAWhJ,WAAWuE,E,CAGrB,SAAAzF,CAAUqF,EAAuBC,GACvCvG,KAAKmL,WAAWlK,UAAUqF,EAAcC,E,CAGlC,YAAArE,CAAaD,GACnB,GAAIA,EAAO+H,YAAchK,KAAKiF,UAAW,OACzC,GAAIjF,KAAKqJ,SAAU,CACjB,MAAMuH,EAAU5Q,KAAKsN,eACrB,MAAMuD,EAAOD,EAAQ9P,SAASmB,EAAOqH,OACjCsH,EAAQ1B,QAAO5F,GAASA,IAAUrH,EAAOqH,QACzC,IAAIsH,EAAS3O,EAAOqH,OACxBtJ,KAAKsJ,MAAQuH,EACb7Q,KAAKwL,SAASC,KAAK,IAAIoF,IACvB,M,CAEF7Q,KAAKsJ,MAAQrH,EAAOqH,MACpBtJ,KAAKwL,SAASC,KAAKxJ,EAAOqH,OAC1BtJ,KAAKmL,WAAWhJ,WAAW,K,CA0BrB,YAAA2O,CACN7O,EACA8O,EACAC,EACAC,GAEA,MAAMC,EAAWlR,KAAKqJ,SAClBrJ,KAAKsN,eAAexM,SAASmB,EAAOqH,OACpCrH,EAAOqH,QAAUtJ,KAAKiM,YAC1B,MAAMkF,EAASJ,IAAU/Q,KAAKwB,YAC9B,MAAM4P,EAAW,GAAGpR,KAAKkF,6BAA6B6L,IACtD,OACEM,EAACC,EAAe,CACdxH,KAAM9J,KAAK8J,KACXyH,GAAI,GAAGvR,KAAKkF,sBAAsB6L,IAClC9O,OAAQA,EACRiP,SAAUA,EACVC,OAAQA,EACR5P,iBAAkBvB,KAAKuB,iBACvB0P,YAAaA,EACbO,WAAYvP,EAAOwN,QAAQgC,aAAexP,EAAOwN,QAAQiC,SACzDnC,UAAWvP,KAAKuP,UAChBoC,QACE3R,KAAKqJ,SACHgI,EAAA,QACEO,MAAM,wEAAuE,cACjE,QAEZP,EAAA,eACEO,MAAM,0BACNC,MAAM,GACN/H,KAAM9J,KAAK8J,KACXgI,QAASZ,EACTa,aAAY,QAGdf,GAAa/O,EAAO+P,KACtBX,EAAA,QACEO,MAAM,wEAAuE,cACjE,QAEZP,EAAA,WAAS5D,KAAMxL,EAAO+P,KAAMlI,KAAM9J,KAAK8J,KAAMmI,MAAM,aAEnD9M,UAEN+M,WACEjQ,EAAOkQ,gBAAgBtQ,OACrBwP,EAAA,QAAMO,MAAM,+EACT3P,EAAOkQ,eAAelD,KAAI,CAACQ,EAAQ2C,IAAgB,CAClDA,EAAc,EACZf,EAAA,WACEO,MAAM,0CACNS,GAAG,OACHC,QAASC,EAAgCvS,KAAK8J,MAC9CmI,MAAM,UAAS,cACH,QAAM,KAIlB,KACJZ,EAAA,UACEmB,KAAK,SACLZ,MAAO,CACL,gCAAiC,KACjC,0CAA2CnC,EAAOgD,OAAS,WAC3D,iBAAkB,KAClB,gBAAiB,MAEnBC,UAAY9R,GAAyBA,EAAM2K,kBAC3CoH,QAAU/R,IACRA,EAAMI,iBACNJ,EAAM2K,kBACNvL,KAAK4S,sBAAsBnH,KAAK,CAC9BnC,MAAOrH,EAAOqH,MACduJ,YAAapD,EAAOnG,MACpBwJ,cAAelS,GACf,GAGJyQ,EAAA,WACEgB,GAAG,OACHC,QAASC,EAAgCvS,KAAK8J,MAC9CmI,MAAM,WAELxC,EAAOoC,YAKd1M,UAENsK,OACExN,EAAOwN,OACL4B,EAAA,cAAYQ,MAAO5P,EAAOwN,OAAOoC,MAAOhO,KAAK,OAAOiG,KAAK,MACvDuH,EAAA,sBACEE,GAAIH,EACJkB,QAAQ,OACRxI,KAAMhB,EAAmB9I,KAAK8J,MAC9BkI,KAAK,WACLe,QAAO,KACP5I,UAAW,MACXF,WAAY,MACZW,UAAW3I,EAAOwN,OAAOoC,MACzBmB,SAAS,OACTC,SAAUhR,EAAOwN,OAAOwD,SACxBvB,SAAUzP,EAAOwN,OAAOiC,SACxBD,YAAaxP,EAAOwN,OAAOgC,YAC3BiB,UAAW9R,IACTA,EAAM2K,kBACN,GAAI3K,EAAMG,MAAQ,UAAYH,EAAMG,MAAQ,YAAa,CACvDH,EAAMI,iBACNhB,KAAKmL,WAAWxE,sB,GAGpBuM,UAAYtS,IACVA,EAAM2K,kBACNvL,KAAKmT,eAAe1H,KAAK,CACvBnC,MAAOrH,EAAOqH,MACd8J,SAAUhC,EACV0B,cAAelS,EAAMyS,QACrB,KAINlO,UAENmO,QAAS,KACPtT,KAAKuB,iBAAmB,MACxBvB,KAAKwB,YAAcuP,CAAK,EAE1BwC,SAAU,IAAMvT,KAAKkC,aAAaD,I,CAKxC,mBAAYuR,GACV,OAAOxT,KAAKkK,eAAiBlK,KAAK+K,gBAAkBuE,QAAQtP,KAAKgS,MAAQhS,KAAKiF,U,CAGxE,0BAAAwH,GACNzM,KAAKkN,mCACL,IAAKlN,KAAKkK,cAAe,CACvB,GAAIlK,KAAK+K,eAAgB/K,KAAK+K,eAAiB,MAC/C,M,CAEF/K,KAAKyT,yBAA2BC,EAA2B1T,KAAK+L,IAAI4H,IAClE,GAAI3T,KAAK+K,iBAAmB4I,EAAS3T,KAAK+K,eAAiB4I,CAAO,G,CAI9D,gCAAAzG,GACNlN,KAAKyT,6BACLzT,KAAKyT,yBAA2BtO,S,CAG1B,oBAAAyO,CAAqBnR,EAAgBoP,GAC3C,IAAK7R,KAAKkK,cAAe,OAAOzH,EAChC,OACE4O,EAAA,cAAYQ,MAAOA,EAAOhO,KAAK,MAAMiG,KAAK,MACvCrH,E,CAKP,MAAAoR,GACE,MAAMzG,EAAWpN,KAAKwG,WACtB,MAAMsN,GAAmB9T,KAAK0N,aAC9B,MAAMqG,EAAQ/T,KAAKsN,eAAezL,OAClC,MAAMgQ,EAAQ7R,KAAKqJ,SACf,GAAGrJ,KAAK2J,cAAcoK,EAAQ,EAAI,MAAMA,IAAU,KAClDD,EACE9T,KAAK2J,YACJ3J,KAAKgU,cAAgBhU,KAAKoP,gBAAgByC,MACjD,MAAMoC,EAAcC,EAAqBlU,KAAK8J,MAC9C,MAAMqK,EAAW1L,EAAUzI,KAAK8J,MAChC,MAAMsK,GAAmBpU,KAAKqJ,UAAYgL,EAAoBrU,KAAK2O,YACnE,MAAM2F,EAAoBC,EAAsBvU,KAAK2O,YACrD,MAAM6F,EAAYxU,KAAK2K,OAAS2E,QAAQtP,KAAKyU,cAC7C,MAAMC,EACJ,CAAC1U,KAAK2U,gBAAiBH,EAAYxU,KAAKiL,QAAU9F,WAAW+J,OAAOI,SAASsF,KAAK,MAClFzP,UACF,MAAM0P,EAAa,CACjBzS,SAAU,QACV0S,KAAM,IACNC,IAAK,IACLC,UAAW,aAAaC,KAAKC,MAAMlV,KAAKoC,SAASwC,SAASqQ,KAAKC,MAAMlV,KAAKoC,SAASyC,QACnFsQ,OAAQ,oCACRC,WAAYpV,KAAK8E,cAAgB,UAAY,UAE/C,IAAIuQ,EAAY,EAEhB,OACEhE,EAACiE,EAAI,CAAAvU,IAAA,2CACH6Q,MAAO,CACL,cAAe,KACf,yBAA0B,KAC1B,wBAAyB5R,KAAKqJ,SAC9B,iBAAkB,KAClB,sBAAuB+D,EACvB,CAAC,eAAepN,KAAK8J,QAAS,KAC9B,2BAA4B9J,KAAKkK,cACjC,oCAAqClK,KAAKwT,mBACvC+B,EAAkBvV,KAAK+J,OAC1B,CAAC,2BAA2B/J,KAAKwV,gBAAiBxV,KAAKwV,WACvD,CAAC,sCAAsCxV,KAAKwV,gBAAiBxV,KAAKwV,aAGnExV,KAAK4T,qBACJvC,EAAA,UACEoE,IAAKjV,IACHR,KAAKmL,WAAW5K,kBAAmBC,GAAiC,KAAK,EAE3E+Q,GAAIvR,KAAK0V,SAAW1V,KAAKkF,YACzBsN,KAAK,SACLZ,MAAO,CACLnP,QAAS,KACT,mBAAoB,KACpB,sBAAuB,KACvB,sBAAuB,KACvB,iCAAkC2K,GAAYpN,KAAKiK,YAAcjK,KAAK0N,aACtE,qBAAsBN,GAAYpN,KAAKa,KACvC,qCAAsCuM,GAAYpN,KAAKa,KACvD,oBAAqBb,KAAKmK,UAC1B,uBAAwB2J,IAAoB9T,KAAKqJ,SACjD,qBAAsBrJ,KAAK0N,aAC3B,8BACG1N,KAAKqJ,UAAYiG,QAAQtP,KAAKgU,eAAiBhU,KAAK4J,wBACvD,iBAAkB5J,KAAKmK,WAAanK,KAAK2K,MACzC,CAAC,eAAe3K,KAAK8J,QAAS,QAC3B6L,EAAyB3V,KAAKwV,aAEnCjM,SAAU6D,EACVwI,KAAK,WAAU,gBACA5V,KAAKuP,UAAS,gBACdsG,OAAO7V,KAAKa,MAAK,gBACjBb,KAAKa,KAAOb,KAAKgL,UAAY7F,UAAS,wBAC9BnF,KAAKa,OAASb,KAAKmB,WAAanB,KAAKgF,eAAiBG,UAAS,aAC1EnF,KAAK4K,YAAc5K,KAAKwT,gBAAkB3B,EAAQ1M,WAAU,kBACvDnF,KAAK8V,eAAc,mBAClBpB,EAAW,eACf1U,KAAK2K,MAAQ,OAASxF,UAAS,gBAC9BnF,KAAKwJ,UAAYrE,UAAS,YAC9BnF,KAAKiF,UAAY,OAASE,UACrCwN,QAAS,IAAO3S,KAAKa,KAAOb,KAAKmC,aAAenC,KAAKiB,UAAU,OAC/DyR,UAAW9R,IACT,MAAM6O,EAASzP,KAAK2L,eAAe3L,KAAKwB,cAAciO,OACtD,GACEzP,KAAKa,MACL4O,IACC7O,EAAMG,MAAQ,cAAiBH,EAAMG,MAAQ,OAASH,EAAMmV,UAC7D,CACAnV,EAAMI,iBACN+G,SACGiO,eAAe,GAAGhW,KAAKkF,6BAA6BlF,KAAKwB,gBACxDkG,cAA2B,WAC3B/B,QACJ,M,CAEF3F,KAAKW,qBAAqBC,EAAM,IAGhCZ,KAAKgS,MAAQhS,KAAKiF,YAClBoM,EAAA,QACEO,MAAM,mEAAkE,cAC5D,QAEX5R,KAAKiF,UACJoM,EAAA,aAAWvH,KAAMqK,EAAUlC,MAAM,YAEjCZ,EAAA,WAAS5D,KAAMzN,KAAKgS,KAAMlI,KAAMqK,EAAUlC,MAAM,aAIrDjS,KAAKwT,gBAAkB,KACtBnC,EAAA,QACEO,MAAO,CACL,qBAAsB,KACtB,+BAAgC,OAGlCP,EAAA,QACEO,MAAO,CACL,yBAA0B,KAC1B,uBAAwB,KACxB,uBAAwB5R,KAAK6J,IAC7B,8BAA+B7J,KAAK6J,MAGtCwH,EAAA,WACEO,MAAM,iBACNS,GAAG,OACHC,QAAS2B,EACThC,MAAM,UACNgE,eAAgB,GAEfpE,GAEF7R,KAAK6J,KACJwH,EAAA,YACEO,MAAM,2CACNU,QAAQ,MACR4D,QAAS,MACTrE,MAAM,GAAE,cACI,WAMrB7R,KAAKwT,gBAAkB,KACtBnC,EAAA,QACEO,MAAM,oEAAmE,cAC7D,QAEZP,EAAA,WACE5D,KAAMzN,KAAKoK,YAAc,UAAY,gBAAkB,cACvDN,KAAMqK,EACNlC,MAAM,cAKdjS,KAAKwT,gBAAkBxT,KAAK4K,WAAWuL,QAAUnW,KAAK2J,YAAc,IAGrE3J,KAAKa,MACJwQ,EAAA,OAAAtQ,IAAA,2CACEqV,QAAQ,SACRX,IAAKjV,IACHR,KAAKmL,WAAW1K,gBAAiBD,GAA8B,KAAK,EAEtEoR,MAAM,+BACN3O,MAAO4R,GAEN7U,KAAKmB,YACJkQ,EAACgF,EAAY,CAAAtV,IAAA,2CACX+I,KAAM9J,KAAK8J,KACXR,MAAOtJ,KAAKoB,WACZuI,YAAa3J,KAAKwK,kBAClByI,SAAUjT,KAAKgL,UACfsL,iBAAkBtW,KAAKgF,eACvBuR,SAAUvW,KAAKmL,WAAWzK,iBAC1B4J,WAAYtK,KAAKsK,WACjBkM,cAAelN,IACbtJ,KAAKoB,WAAakI,CAAK,EAEzBoJ,UAAW9R,GAASZ,KAAKsB,kBAAkBV,KAG/CyQ,EAAA,OAAAtQ,IAAA,2CACEwQ,GAAIvR,KAAKgL,UACT4G,MAAM,iBACNgE,KAAM5V,KAAKuP,UAAS,uBACEvP,KAAKqJ,SAAW,OAASlE,UAAS,aAC5CnF,KAAK4K,WAAa5K,KAAK2J,YAAW,YACnC3J,KAAKiF,UAAY,OAASE,WAEpCnF,KAAKiF,UACJoM,EAAA,OACEO,MAAM,oCACNgE,KAAM5V,KAAKuP,YAAc,OAAS,MAAQ,SAAQ,gBACpC,QAAO,gBACP,OAAM,aACRvP,KAAK0K,aAAY,YACnB,UAET1K,KAAKuP,YAAc,OAClB8B,EAAA,QAAMuE,KAAK,YACTvE,EAAA,aAAWvH,KAAM9J,KAAK8J,KAAMmI,MAAM,aAGpCZ,EAAA,aAAWvH,KAAM9J,KAAK8J,KAAMmI,MAAM,aAGpCjS,KAAK2L,eAAe9J,SAAW,EACjCwP,EAAA,OACEO,MAAM,kCACNgE,KAAM5V,KAAKuP,YAAc,OAAS,MAAQ,SAAQ,gBACpC,QAAO,gBACP,OAAM,aACRvP,KAAKyK,cAAa,YACpB,UAETzK,KAAKuP,YAAc,OAClB8B,EAAA,QAAMuE,KAAK,YACTvE,EAAA,kBAAgBoF,KAAMzW,KAAKyK,iBAG7B4G,EAAA,kBAAgBoF,KAAMzW,KAAKyK,iBAI/BzK,KAAK6O,gBAAgBI,KAAI,CAACyH,EAASC,IACjCtF,EAAA,OACEO,MAAO,CACL,oBAAqB,KACrB,mBAAoB,KACpB,sBAAuB,KACvB,+BAAgC8E,EAAQE,QACxC,wCACED,EAAe,GAAKrH,QAAQoH,EAAQG,SAExCjB,KACE5V,KAAKuP,YAAc,OAAS,WAAamH,EAAQG,OAAS,QAAU1R,UAAS,aAEnEuR,EAAQG,QAEnBH,EAAQG,QAAU7W,KAAKuP,YAAc,OACpC8B,EAAA,WACEO,MAAO,oEAAoE5R,KAAK8J,OAChFuI,GAAG,OACHC,QAASC,EAAgCvS,KAAK8J,MAC9CgN,SAAQ,KACR7E,MAAM,UACN2D,KAAK,OAELvE,EAAA,QAAMO,MAAM,kCAAkCgE,KAAK,YAChDc,EAAQG,SAGXH,EAAQG,OACVxF,EAAA,WACEO,MAAO,oEAAoE5R,KAAK8J,OAChFuI,GAAG,OACHC,QAASC,EAAgCvS,KAAK8J,MAC9CgN,SAAQ,KACR7E,MAAM,UAAS,cACH,QAEZZ,EAAA,QAAMO,MAAM,mCAAmC8E,EAAQG,SAEvD,KACHH,EAAQhV,QAAQuN,KAAIhN,GACnBjC,KAAK8Q,aAAa7O,EAAQoT,IAAajB,EAAiBE,SAMjEtU,KAAK+W,oBAAsB/W,KAAKiF,UAC/BoM,EAAC2F,EAAkB,CACjBlN,KAAM9J,KAAK8J,KACX+H,MAAO7R,KAAK+W,kBACZE,SAAUjX,KAAK4L,uBAEf5L,KAAKqK,YAAcrK,KAAK0N,eAAiB1N,KAAKiF,UAChDoM,EAAC6F,EAAY,CACXpN,KAAM9J,KAAK8J,KACXgG,QAAS9P,KAAKqJ,SAAW,GAAG0K,KAAS/T,KAAKuK,gBAAkBpF,UAC5DgS,eAAgBnX,KAAKqJ,SAAWwM,OAAO9B,GAAS5O,UAChDiS,kBAAmBpX,KAAK8K,qBACxBuM,WAAY7W,IACVR,KAAK2P,qBAAuBnP,GAAW2E,SAAS,EAElDmS,kBAAmB9W,IACjBR,KAAK+P,4BAA8BvP,GAAW2E,SAAS,EAEzDoS,SAAU/W,IACRR,KAAKiQ,mBAAqBzP,GAAW2E,SAAS,EAEhDmF,WAAYtK,KAAKsK,WACjBkN,QAASxX,KAAKsL,iBAEd,MAIPkJ,GACCnD,EAAA,WAAAtQ,IAAA,2CACE6Q,MAAM,aACNS,GAAG,MACHC,QAAQ,kBACRL,MAAM,WACNwF,OAAQzX,KAAKiL,QACb2K,KAAK,SAEJ5V,KAAKyU,c","ignoreList":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|