@ds-mo/ui 14.17.0 → 14.18.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 +6 -6
- package/dist/agent.json +62 -34
- package/dist/angular/ds-button-filled.d.ts +1 -1
- package/dist/angular/ds-button-filled.js +3 -3
- package/dist/angular/ds-button-unfilled.d.ts +1 -1
- package/dist/angular/ds-button-unfilled.js +3 -3
- package/dist/angular/ds-mobile-bar-nav.d.ts +1 -1
- package/dist/angular/ds-mobile-bar-nav.js +3 -3
- 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-title.js +1 -1
- package/dist/components/ds-bar-workflow.js +1 -1
- package/dist/components/ds-bar-workflow.js.map +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-chart.js +1 -1
- package/dist/components/ds-card-chart.js.map +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-setting.js.map +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-conversation-list.js +1 -1
- package/dist/components/ds-divider.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-actions.js.map +1 -1
- package/dist/components/ds-message-bubble.js +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-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-saved-views.js +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-toast.js +1 -1
- package/dist/components/ds-toast.js.map +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-y4jhIkRc.js → p-3WlVHGUe.js} +2 -2
- package/dist/components/{p-DAqSoyd4.js → p-9EQ3xLI1.js} +2 -2
- package/dist/components/p-9GuNIXuz.js +2 -0
- package/dist/components/{p-B0PEg5RF.js.map → p-9GuNIXuz.js.map} +1 -1
- package/dist/components/p-B0Byw6OX.js +2 -0
- package/dist/components/p-B0Byw6OX.js.map +1 -0
- package/dist/components/{p-DSIOINBK.js → p-B145kX-i.js} +2 -2
- package/dist/components/{p-DZ55e3j9.js → p-B9ZfoprK.js} +2 -2
- package/dist/components/{p-DNJTN_s0.js → p-BBmRD_S0.js} +2 -2
- package/dist/components/{p-C4TgWJi9.js → p-BKx2ihnG.js} +2 -2
- package/dist/components/p-BMERUCe1.js +2 -0
- package/dist/components/p-BMERUCe1.js.map +1 -0
- package/dist/components/{p-Be1sY58w.js → p-BTTxl3ro.js} +2 -2
- package/dist/components/p-Ba7DaFkb.js +2 -0
- package/dist/components/{p-DEjh3klB.js.map → p-Ba7DaFkb.js.map} +1 -1
- package/dist/components/{p-CKmfuK7k.js → p-BcNYvLMi.js} +2 -2
- package/dist/components/p-BcNYvLMi.js.map +1 -0
- package/dist/components/{p-rrFMAZkj.js → p-BdgoB2ef.js} +2 -2
- package/dist/components/{p-U8JIZzI2.js → p-Be-vZpWx.js} +2 -2
- package/dist/components/p-Be-vZpWx.js.map +1 -0
- package/dist/components/{p-DQqOzDEq.js → p-BiBXCjjo.js} +2 -2
- package/dist/components/{p-D1YhYulL.js → p-C6yLERx6.js} +2 -2
- package/dist/components/{p-Dg9qiMDa.js → p-C9StMCWg.js} +2 -2
- package/dist/components/{p-7tZx4ukz.js → p-CAJIARNW.js} +2 -2
- package/dist/components/{p-BVlfQ8xZ.js → p-CBa_6lqj.js} +2 -2
- package/dist/components/p-CBa_6lqj.js.map +1 -0
- package/dist/components/{p-D2z2DgtX.js → p-CHEt4mW8.js} +2 -2
- package/dist/components/p-CI5Ce8VF.js +2 -0
- package/dist/components/p-CI5Ce8VF.js.map +1 -0
- package/dist/components/{p-BHz78C8h.js → p-CbZ0RU2c.js} +2 -2
- package/dist/components/{p-BFSLT0yc.js → p-Cgm7YMLw.js} +2 -2
- package/dist/components/{p-BFSLT0yc.js.map → p-Cgm7YMLw.js.map} +1 -1
- package/dist/components/{p-Bn8NryHK.js → p-CihNoe1M.js} +2 -2
- package/dist/components/{p-D4K9CE8a.js → p-Cj5Hkt6Y.js} +2 -2
- package/dist/components/{p-ruPTIV6t.js → p-D6P_1YrL.js} +2 -2
- package/dist/components/p-DC_8dK55.js +2 -0
- package/dist/components/p-DC_8dK55.js.map +1 -0
- package/dist/components/p-DHzn7INS.js +2 -0
- package/dist/components/{p-DIEK54fV.js.map → p-DHzn7INS.js.map} +1 -1
- package/dist/components/{p-BNkU9dcc.js → p-DJ0GCCFa.js} +2 -2
- package/dist/components/p-DKY3IJqt.js +2 -0
- package/dist/components/p-DKY3IJqt.js.map +1 -0
- package/dist/components/{p-DsJW5W3W.js → p-DMaQkEYP.js} +2 -2
- package/dist/components/p-DNpLDbWY.js +2 -0
- package/dist/components/p-DNpLDbWY.js.map +1 -0
- package/dist/components/{p-PD1Vfg0t.js → p-DPR0TGGJ.js} +2 -2
- package/dist/components/{p-CMFvaY05.js → p-DPpHSIzS.js} +2 -2
- package/dist/components/p-DQyvAN44.js +2 -0
- package/dist/components/p-DQyvAN44.js.map +1 -0
- package/dist/components/p-DaxKVtZG.js +2 -0
- package/dist/components/p-DaxKVtZG.js.map +1 -0
- package/dist/components/{p-a6qP60zb.js → p-DbJahF86.js} +2 -2
- package/dist/components/{p-D8Qd6gkf.js → p-Dd8VKdAO.js} +2 -2
- package/dist/components/{p-C0X2zKbB.js → p-Dginv8PT.js} +2 -2
- package/dist/components/{p-BHDkJmrC.js → p-Dl3gciej.js} +2 -2
- package/dist/components/p-Drcl4zS9.js +2 -0
- package/dist/components/p-DzPw6aDK.js +2 -0
- package/dist/components/p-DzPw6aDK.js.map +1 -0
- package/dist/components/{p-BhYWdbEp.js → p-HZz5aJKz.js} +2 -2
- package/dist/components/{p-BGXqFq2C.js → p-LHzBS95u.js} +2 -2
- package/dist/components/{p-DHuyj-9J.js → p-hp_2W2Qy.js} +2 -2
- package/dist/components/p-jk2-y5dH.js +2 -0
- package/dist/components/p-jk2-y5dH.js.map +1 -0
- package/dist/components/{p-CzcWZiH-.js → p-oCc3mz_c.js} +2 -2
- package/dist/docs/components.json +234 -19
- package/dist/lib/components/ButtonFilled/ButtonFilled.d.ts +2 -0
- package/dist/lib/components/PanelTools/panel-tools-types.d.ts +2 -2
- package/dist/lib/shell/index.js +17 -25
- package/dist/lib/shell/index.js.map +2 -2
- package/dist/lib/shell/shell-responsive.d.ts +6 -1
- package/dist/lib/utils/anchored-position.d.ts +2 -0
- package/dist/lib/utils/button-render.d.ts +1 -0
- package/dist/mcp-data/registry/button-filled.json +20 -1
- package/dist/mcp-data/registry/button-unfilled.json +24 -4
- package/dist/mcp-data/registry/filter-menu.json +2 -2
- package/dist/mcp-data/registry/input.json +2 -2
- package/dist/mcp-data/registry/menu.json +2 -1
- package/dist/mcp-data/registry/mobile-bar-nav.json +57 -6
- package/dist/mcp-data/registry/pagination.json +5 -4
- package/dist/mcp-data/registry/panel-tools.json +4 -4
- package/dist/mcp-data/registry/registry.json +61 -33
- package/dist/mcp-data/registry/select.json +2 -2
- package/dist/mcp-data/registry/shell-app.json +5 -5
- package/dist/mcp-data/registry/shell-tools.json +4 -4
- package/dist/mcp-data/registry/table-filter.json +3 -3
- package/dist/mcp-data/registry/table-sort.json +5 -4
- package/dist/mcp-data/registry/table-toolbar.json +10 -9
- package/dist/mcp-data/registry/table.json +6 -6
- package/dist/styles/table.css +30 -10
- package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +2 -0
- package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +2 -0
- package/dist/types/components/Menu/Menu.d.ts +1 -0
- package/dist/types/components/MobileBarNav/MobileBarNav.d.ts +4 -0
- package/dist/types/components/Pagination/Pagination.d.ts +8 -0
- package/dist/types/components/PanelTools/panel-tools-types.d.ts +2 -2
- package/dist/types/components/Table/Table.d.ts +1 -0
- package/dist/types/components/Table/table-column-customizer.d.ts +0 -2
- package/dist/types/components/TableToolbar/TableToolbar.d.ts +5 -0
- package/dist/types/components.d.ts +51 -0
- package/dist/types/shell/shell-responsive.d.ts +6 -1
- package/dist/types/utils/anchored-position.d.ts +2 -0
- package/dist/types/utils/button-render.d.ts +1 -0
- package/dist/vue/ds-button-filled.js +1 -0
- package/dist/vue/ds-button-unfilled.js +1 -0
- package/dist/vue/ds-mobile-bar-nav.js +3 -0
- package/package.json +1 -1
- package/dist/components/p-23u3lIr1.js +0 -2
- package/dist/components/p-Asi9h3pa.js +0 -2
- package/dist/components/p-Asi9h3pa.js.map +0 -1
- package/dist/components/p-B0PEg5RF.js +0 -2
- package/dist/components/p-BBxcMVqk.js +0 -2
- package/dist/components/p-BBxcMVqk.js.map +0 -1
- package/dist/components/p-BEvBJ65v.js +0 -2
- package/dist/components/p-BEvBJ65v.js.map +0 -1
- package/dist/components/p-BVlfQ8xZ.js.map +0 -1
- package/dist/components/p-BX0BMhgz.js +0 -2
- package/dist/components/p-BX0BMhgz.js.map +0 -1
- package/dist/components/p-BdnQv7Zl.js +0 -2
- package/dist/components/p-BdnQv7Zl.js.map +0 -1
- package/dist/components/p-Bh67XbfB.js +0 -2
- package/dist/components/p-Bh67XbfB.js.map +0 -1
- package/dist/components/p-CKmfuK7k.js.map +0 -1
- package/dist/components/p-DEjh3klB.js +0 -2
- package/dist/components/p-DIEK54fV.js +0 -2
- package/dist/components/p-DOqnJVos.js +0 -2
- package/dist/components/p-DOqnJVos.js.map +0 -1
- package/dist/components/p-Dr4AgJbV.js +0 -2
- package/dist/components/p-Dr4AgJbV.js.map +0 -1
- package/dist/components/p-NzGRAPcF.js +0 -2
- package/dist/components/p-NzGRAPcF.js.map +0 -1
- package/dist/components/p-U8JIZzI2.js.map +0 -1
- package/dist/components/p-ZZzC52Ea.js +0 -2
- package/dist/components/p-ZZzC52Ea.js.map +0 -1
- package/dist/components/p-__lNIImO.js +0 -2
- package/dist/components/p-__lNIImO.js.map +0 -1
- /package/dist/components/{p-y4jhIkRc.js.map → p-3WlVHGUe.js.map} +0 -0
- /package/dist/components/{p-DAqSoyd4.js.map → p-9EQ3xLI1.js.map} +0 -0
- /package/dist/components/{p-DSIOINBK.js.map → p-B145kX-i.js.map} +0 -0
- /package/dist/components/{p-DZ55e3j9.js.map → p-B9ZfoprK.js.map} +0 -0
- /package/dist/components/{p-DNJTN_s0.js.map → p-BBmRD_S0.js.map} +0 -0
- /package/dist/components/{p-C4TgWJi9.js.map → p-BKx2ihnG.js.map} +0 -0
- /package/dist/components/{p-Be1sY58w.js.map → p-BTTxl3ro.js.map} +0 -0
- /package/dist/components/{p-rrFMAZkj.js.map → p-BdgoB2ef.js.map} +0 -0
- /package/dist/components/{p-DQqOzDEq.js.map → p-BiBXCjjo.js.map} +0 -0
- /package/dist/components/{p-D1YhYulL.js.map → p-C6yLERx6.js.map} +0 -0
- /package/dist/components/{p-Dg9qiMDa.js.map → p-C9StMCWg.js.map} +0 -0
- /package/dist/components/{p-7tZx4ukz.js.map → p-CAJIARNW.js.map} +0 -0
- /package/dist/components/{p-D2z2DgtX.js.map → p-CHEt4mW8.js.map} +0 -0
- /package/dist/components/{p-BHz78C8h.js.map → p-CbZ0RU2c.js.map} +0 -0
- /package/dist/components/{p-Bn8NryHK.js.map → p-CihNoe1M.js.map} +0 -0
- /package/dist/components/{p-D4K9CE8a.js.map → p-Cj5Hkt6Y.js.map} +0 -0
- /package/dist/components/{p-ruPTIV6t.js.map → p-D6P_1YrL.js.map} +0 -0
- /package/dist/components/{p-BNkU9dcc.js.map → p-DJ0GCCFa.js.map} +0 -0
- /package/dist/components/{p-DsJW5W3W.js.map → p-DMaQkEYP.js.map} +0 -0
- /package/dist/components/{p-PD1Vfg0t.js.map → p-DPR0TGGJ.js.map} +0 -0
- /package/dist/components/{p-CMFvaY05.js.map → p-DPpHSIzS.js.map} +0 -0
- /package/dist/components/{p-a6qP60zb.js.map → p-DbJahF86.js.map} +0 -0
- /package/dist/components/{p-D8Qd6gkf.js.map → p-Dd8VKdAO.js.map} +0 -0
- /package/dist/components/{p-C0X2zKbB.js.map → p-Dginv8PT.js.map} +0 -0
- /package/dist/components/{p-BHDkJmrC.js.map → p-Dl3gciej.js.map} +0 -0
- /package/dist/components/{p-23u3lIr1.js.map → p-Drcl4zS9.js.map} +0 -0
- /package/dist/components/{p-BhYWdbEp.js.map → p-HZz5aJKz.js.map} +0 -0
- /package/dist/components/{p-BGXqFq2C.js.map → p-LHzBS95u.js.map} +0 -0
- /package/dist/components/{p-DHuyj-9J.js.map → p-hp_2W2Qy.js.map} +0 -0
- /package/dist/components/{p-CzcWZiH-.js.map → p-oCc3mz_c.js.map} +0 -0
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
],
|
|
43
43
|
"accessibility": [
|
|
44
44
|
"The trigger is an icon-label combobox named Filter table unless a product aria-label supplies the table context. Compact caption widths preserve that accessible name after the visible label and chevron are omitted.",
|
|
45
|
-
"The popup retains ds-filter-menu category navigation, option semantics, focus entry, dismissal, and focus return.",
|
|
45
|
+
"The popup retains ds-filter-menu category navigation, option semantics, focus entry, dismissal, and focus return, and aligns its start edge with the trigger.",
|
|
46
46
|
"Localize label, menuLabel, categoriesLabel, and clearLabel together so visible and accessible wording remains consistent."
|
|
47
47
|
],
|
|
48
48
|
"states": [
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
],
|
|
53
53
|
"responsiveBehavior": [
|
|
54
54
|
"Place the control in the trailing region of ds-table-toolbar.",
|
|
55
|
-
"Inside a named ds-table container narrower than 900px, the trigger becomes icon-only and active criteria promote the Filters icon to primary."
|
|
55
|
+
"Inside a named ds-table container narrower than 900px, the trigger becomes icon-only, exposes its visible label through a hover and keyboard-focus tooltip, and active criteria promote the Filters icon to primary."
|
|
56
56
|
],
|
|
57
57
|
"frameworkCaveats": {
|
|
58
58
|
"customElements": [
|
|
@@ -392,7 +392,7 @@
|
|
|
392
392
|
},
|
|
393
393
|
{
|
|
394
394
|
"path": "src/wc/components/TableFilter/TableFilter.tsx",
|
|
395
|
-
"content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\nimport type {\n FilterMenuChangeDetail,\n FilterMenuFilter,\n FilterMenuValues,\n} from '../FilterMenu/FilterMenu';\n\n@Component({\n tag: 'ds-table-filter',\n styleUrl: 'TableFilter.css',\n scoped: true,\n})\nexport class TableFilter {\n /** Controlled popup visibility. */\n @Prop({ mutable: true }) open: boolean = false;\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 category shown in the option pane. */\n @Prop() activeFilterId: string | undefined;\n /** Visible trigger label. */\n @Prop() label: string = 'Filter';\n /** Accessible name for the trigger. Defaults to Filter table. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n /** Accessible name for the non-modal filter dialog. Defaults to the trigger name. */\n @Prop() menuLabel: string | null = null;\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\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 active-category replacement. */\n @Event() dsActiveFilterChange!: EventEmitter<string>;\n /** Requests that the controlled popup close. */\n @Event() dsClose!: EventEmitter<void>;\n /** Emitted whenever 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 render() {\n const name = this.ariaLabel?.trim() || 'Filter table';\n const menuName = this.menuLabel?.trim() || name;\n\n return (\n <Host>\n <ds-filter-menu\n open={this.open}\n triggerLabel={this.label}\n icon=\"Filters\"\n size=\"md\"\n width=\"hug\"\n hasBorder={true}\n activeFill={false}\n collapseLabel={true}\n aria-label={name}\n filters={this.filters}\n values={this.values}\n activeFilterId={this.activeFilterId}\n menuLabel={menuName}\n categoriesLabel={this.categoriesLabel}\n clearLabel={this.clearLabel}\n onDsChange={event => this.forward(event, this.dsChange)}\n onDsClear={event => this.forward(event, this.dsClear)}\n onDsActiveFilterChange={event => this.forward(event, this.dsActiveFilterChange)}\n onDsClose={event => this.forward(event, this.dsClose)}\n onDsOpenChange={event => {\n event.stopPropagation();\n this.open = event.detail;\n this.dsOpenChange.emit(event.detail);\n }}\n onDsAfterClose={event => this.forward(event, this.dsAfterClose)}\n />\n </Host>\n );\n }\n\n private forward<T>(event: CustomEvent<T>, emitter: EventEmitter<T>): void {\n event.stopPropagation();\n emitter.emit(event.detail);\n }\n}\n",
|
|
395
|
+
"content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\nimport type {\n FilterMenuChangeDetail,\n FilterMenuFilter,\n FilterMenuValues,\n} from '../FilterMenu/FilterMenu';\n\n@Component({\n tag: 'ds-table-filter',\n styleUrl: 'TableFilter.css',\n scoped: true,\n})\nexport class TableFilter {\n /** Controlled popup visibility. */\n @Prop({ mutable: true }) open: boolean = false;\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 category shown in the option pane. */\n @Prop() activeFilterId: string | undefined;\n /** Visible trigger label. */\n @Prop() label: string = 'Filter';\n /** Accessible name for the trigger. Defaults to Filter table. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n /** Accessible name for the non-modal filter dialog. Defaults to the trigger name. */\n @Prop() menuLabel: string | null = null;\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\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 active-category replacement. */\n @Event() dsActiveFilterChange!: EventEmitter<string>;\n /** Requests that the controlled popup close. */\n @Event() dsClose!: EventEmitter<void>;\n /** Emitted whenever 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 render() {\n const name = this.ariaLabel?.trim() || 'Filter table';\n const menuName = this.menuLabel?.trim() || name;\n\n return (\n <Host>\n <ds-filter-menu\n open={this.open}\n triggerLabel={this.label}\n icon=\"Filters\"\n size=\"md\"\n width=\"hug\"\n hasBorder={true}\n activeFill={false}\n collapseLabel={true}\n align=\"start\"\n aria-label={name}\n filters={this.filters}\n values={this.values}\n activeFilterId={this.activeFilterId}\n menuLabel={menuName}\n categoriesLabel={this.categoriesLabel}\n clearLabel={this.clearLabel}\n onDsChange={event => this.forward(event, this.dsChange)}\n onDsClear={event => this.forward(event, this.dsClear)}\n onDsActiveFilterChange={event => this.forward(event, this.dsActiveFilterChange)}\n onDsClose={event => this.forward(event, this.dsClose)}\n onDsOpenChange={event => {\n event.stopPropagation();\n this.open = event.detail;\n this.dsOpenChange.emit(event.detail);\n }}\n onDsAfterClose={event => this.forward(event, this.dsAfterClose)}\n />\n </Host>\n );\n }\n\n private forward<T>(event: CustomEvent<T>, emitter: EventEmitter<T>): void {\n event.stopPropagation();\n emitter.emit(event.detail);\n }\n}\n",
|
|
396
396
|
"type": "registry:ui"
|
|
397
397
|
}
|
|
398
398
|
]
|
|
@@ -43,18 +43,19 @@
|
|
|
43
43
|
],
|
|
44
44
|
"accessibility": [
|
|
45
45
|
"The trigger is an icon-label menu button named Sort table unless a product aria-label is supplied. Compact caption widths keep that accessible name after the visible label is omitted.",
|
|
46
|
-
"The menu has two sections, Data and Direction. Each section presents one selected row through isSelected; the menu is not a single radio group because field and direction are independent.",
|
|
46
|
+
"The start-aligned menu has two sections, Data and Direction. Each section presents one selected row through isSelected; the menu is not a single radio group because field and direction are independent.",
|
|
47
47
|
"Choosing a row applies immediately and keeps the menu open so the other section can be changed. Escape and outside activation close the menu and restore trigger focus."
|
|
48
48
|
],
|
|
49
49
|
"states": [
|
|
50
50
|
"columns and sort are controlled. dsSortChange reports the next TableSortState and never mutates those inputs. The same sort object is what column headers emit through the table.",
|
|
51
51
|
"Selecting a different data field keeps the current direction, or starts ascending when no sort exists. Selecting a direction applies it to the current field, or to the first sortable field when no sort exists. Selecting the already-active field or direction is a no-op and does not toggle the way a header click does.",
|
|
52
|
-
"The trigger stays Sort in resting secondary chrome. Field and direction selection live in the menu and on column headers, so the trigger never uses active primary emphasis.",
|
|
52
|
+
"The trigger stays Sort in regular-weight resting secondary chrome. Field and direction selection live in the menu and on column headers, so the trigger never uses active primary emphasis. It keeps pressed interaction paint without physically scaling inside the stable table caption row.",
|
|
53
53
|
"Compound sortable headers contribute one Data row per segment. Action columns never appear."
|
|
54
54
|
],
|
|
55
55
|
"responsiveBehavior": [
|
|
56
56
|
"Place the control in the trailing region of ds-table-toolbar with Filter and Group.",
|
|
57
|
-
"Inside a named ds-table container narrower than 900px, the trigger omits its label and chevron and becomes icon-only.
|
|
57
|
+
"Inside a named ds-table container narrower than 900px, the trigger omits its label and chevron and becomes icon-only. A hover and keyboard-focus tooltip preserves the label, and the icon keeps the resting secondary foreground.",
|
|
58
|
+
"Long sortable-field catalogs inherit Menu's collision-aware height cap and internal choice scrolling instead of extending beyond the available viewport space."
|
|
58
59
|
],
|
|
59
60
|
"frameworkCaveats": {
|
|
60
61
|
"customElements": [
|
|
@@ -217,7 +218,7 @@
|
|
|
217
218
|
},
|
|
218
219
|
{
|
|
219
220
|
"path": "src/wc/components/TableSort/TableSort.tsx",
|
|
220
|
-
"content": "import { Component, Element, Event, EventEmitter, h, Host, Method, Prop, State } from '@stencil/core';\nimport type { MenuItemData } from '../Menu/menu-types';\nimport type { TableColumn, TableSortChangeDetail, TableSortState } from '../Table/table-types';\nimport {\n nextTableSortStateFromMenuItem,\n tableSortFields,\n tableSortMenuSections,\n tableSortStatesEqual,\n} from './table-sort-menu';\n\nlet tableSortSeq = 0;\n\n@Component({\n tag: 'ds-table-sort',\n styleUrl: 'TableSort.css',\n scoped: true,\n})\nexport class TableSort {\n @Element() private el!: HTMLElement;\n\n /** Catalog used to derive sortable fields, including compound header segments. */\n @Prop() columns: TableColumn[] = [];\n /** Controlled table sort. Header sorting and this menu share the same value. */\n @Prop() sort: TableSortState | null = null;\n /** Accessible name for the trigger and menu. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n\n @Event({ bubbles: false }) dsSortChange!: EventEmitter<TableSortChangeDetail>;\n\n @State() private menuOpen = false;\n @State() private initialFocusVisible = false;\n\n private readonly componentId = `ds-table-sort-${++tableSortSeq}`;\n private readonly triggerId = `${this.componentId}-trigger`;\n private readonly menuId = `${this.componentId}-menu`;\n\n @Method()\n async setFocus() {\n const trigger = this.el.querySelector<HTMLElement & { setFocus?: () => Promise<void> }>(\n `#${CSS.escape(this.triggerId)}`\n );\n await trigger?.setFocus?.();\n }\n\n render() {\n const fields = tableSortFields(this.columns);\n const name = this.ariaLabel?.trim() || 'Sort table';\n\n return (\n <Host hidden={fields.length === 0 ? true : undefined}>\n {fields.length === 0 ? null : (\n <ds-button-unfilled\n id={this.triggerId}\n variant=\"icon-label\"\n size=\"md\"\n icon=\"ArrowsVertical\"\n label=\"Sort\"\n aria-label={name}\n hasMenu={true}\n collapseLabel={true}\n expanded={this.menuOpen}\n controls={this.menuId}\n onDsClick={(event: CustomEvent<MouseEvent>) => {\n this.toggle(event.detail.detail === 0);\n }}\n />\n )}\n {fields.length === 0 ? null : (\n <ds-menu\n id={this.menuId}\n open={this.menuOpen}\n anchorId={this.triggerId}\n align=\"
|
|
221
|
+
"content": "import { Component, Element, Event, EventEmitter, h, Host, Method, Prop, State } from '@stencil/core';\nimport type { MenuItemData } from '../Menu/menu-types';\nimport type { TableColumn, TableSortChangeDetail, TableSortState } from '../Table/table-types';\nimport {\n nextTableSortStateFromMenuItem,\n tableSortFields,\n tableSortMenuSections,\n tableSortStatesEqual,\n} from './table-sort-menu';\n\nlet tableSortSeq = 0;\n\n@Component({\n tag: 'ds-table-sort',\n styleUrl: 'TableSort.css',\n scoped: true,\n})\nexport class TableSort {\n @Element() private el!: HTMLElement;\n\n /** Catalog used to derive sortable fields, including compound header segments. */\n @Prop() columns: TableColumn[] = [];\n /** Controlled table sort. Header sorting and this menu share the same value. */\n @Prop() sort: TableSortState | null = null;\n /** Accessible name for the trigger and menu. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n\n @Event({ bubbles: false }) dsSortChange!: EventEmitter<TableSortChangeDetail>;\n\n @State() private menuOpen = false;\n @State() private initialFocusVisible = false;\n\n private readonly componentId = `ds-table-sort-${++tableSortSeq}`;\n private readonly triggerId = `${this.componentId}-trigger`;\n private readonly menuId = `${this.componentId}-menu`;\n\n @Method()\n async setFocus() {\n const trigger = this.el.querySelector<HTMLElement & { setFocus?: () => Promise<void> }>(\n `#${CSS.escape(this.triggerId)}`\n );\n await trigger?.setFocus?.();\n }\n\n render() {\n const fields = tableSortFields(this.columns);\n const name = this.ariaLabel?.trim() || 'Sort table';\n\n return (\n <Host hidden={fields.length === 0 ? true : undefined}>\n {fields.length === 0 ? null : (\n <ds-button-unfilled\n id={this.triggerId}\n variant=\"icon-label\"\n size=\"md\"\n icon=\"ArrowsVertical\"\n label=\"Sort\"\n labelEmphasis={false}\n pressScale={false}\n aria-label={name}\n hasMenu={true}\n collapseLabel={true}\n expanded={this.menuOpen}\n controls={this.menuId}\n onDsClick={(event: CustomEvent<MouseEvent>) => {\n this.toggle(event.detail.detail === 0);\n }}\n />\n )}\n {fields.length === 0 ? null : (\n <ds-menu\n id={this.menuId}\n open={this.menuOpen}\n anchorId={this.triggerId}\n align=\"start\"\n side=\"bottom\"\n menuLabel={name}\n selectionMode=\"none\"\n initialFocusVisible={this.initialFocusVisible}\n sections={tableSortMenuSections(this.columns, this.sort)}\n onDsClose={() => this.close()}\n onDsSelect={event => this.handleSelect(event.detail)}\n />\n )}\n </Host>\n );\n }\n\n private toggle(fromKeyboard = false): void {\n if (this.menuOpen) this.close();\n else this.open(fromKeyboard);\n }\n\n private open(fromKeyboard = false): void {\n if (this.menuOpen) return;\n this.initialFocusVisible = fromKeyboard;\n this.menuOpen = true;\n }\n\n private close(): void {\n this.menuOpen = false;\n }\n\n private handleSelect(item: MenuItemData): void {\n const next = nextTableSortStateFromMenuItem(this.columns, this.sort, item);\n if (tableSortStatesEqual(this.sort, next)) return;\n this.dsSortChange.emit({ sort: next });\n }\n}\n",
|
|
221
222
|
"type": "registry:ui"
|
|
222
223
|
},
|
|
223
224
|
{
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "table-toolbar",
|
|
4
4
|
"title": "TableToolbar",
|
|
5
|
-
"description": "Data-agnostic companion layout for application-owned table caption controls, with a start cluster, optional search, trailing Filter/Group
|
|
5
|
+
"description": "Data-agnostic companion layout for application-owned table caption controls, with a start cluster, optional search, trailing Filter/Sort/Group, and narrow-width horizontal overflow.",
|
|
6
6
|
"type": "registry:ui",
|
|
7
7
|
"meta": {
|
|
8
8
|
"library": "@ds-mo/ui",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"intent": {
|
|
14
14
|
"audience": "general",
|
|
15
15
|
"status": "stable",
|
|
16
|
-
"summary": "Data-agnostic companion layout for application-owned table caption controls, with a start cluster, optional search, trailing Filter/Group
|
|
16
|
+
"summary": "Data-agnostic companion layout for application-owned table caption controls, with a start cluster, optional search, trailing Filter/Sort/Group, and narrow-width horizontal overflow.",
|
|
17
17
|
"useWhen": [
|
|
18
18
|
"Several table pages repeat the same saved-view cluster, middle discovery and result-shaping controls, and table-owned caption actions.",
|
|
19
19
|
"A ds-table header slot needs consistent control spacing, alignment, grouping, and narrow-width overflow without moving product behavior into the table."
|
|
@@ -36,17 +36,18 @@
|
|
|
36
36
|
"patterns": [],
|
|
37
37
|
"accessibility": [
|
|
38
38
|
"The component exposes a named toolbar while each slotted control retains its own accessible name and native keyboard behavior.",
|
|
39
|
-
"Use the start slot for saved views. Use search for the optional discovery field, leading for any additional left-side middle controls, and trailing for Filter,
|
|
39
|
+
"Use the start slot for saved views. Use search for the optional discovery field, leading for any additional left-side middle controls, and trailing for Filter, Sort, and Group. Table-owned column customizer and data-mode actions remain in the table caption trailing cluster and participate in the same caption overflow row.",
|
|
40
40
|
"Tab order follows authored DOM order. The toolbar does not add roving focus because it may contain heterogeneous form and popup controls."
|
|
41
41
|
],
|
|
42
42
|
"states": [
|
|
43
43
|
"The component owns layout only. It never mutates slotted control props, values, menus, loading, persistence, or consequences. Use ds-table-saved-views and ds-table-filter when those interactions need the shared CompoMo behavior while application data and persistence remain external.",
|
|
44
|
-
"
|
|
45
|
-
"
|
|
44
|
+
"Buttons in the toolbar keep their hover and pressed interaction paint without physically scaling, so pointer feedback does not disturb the stable caption geometry.",
|
|
45
|
+
"The start cluster is followed by a decorative vertical divider, then Search, optional leading controls, and one trailing action cluster. The start cluster and divider hide when nothing is projected. Search is a dedicated slot that hides when nothing is projected. Empty leading or trailing clusters add no placeholder chrome. Search is the only toolbar region that shrinks; all action controls retain their control geometry and align directly before the table-owned actions.",
|
|
46
|
+
"Column customizer and data-mode switching stay table-owned caption actions. Do not recreate those menus in the toolbar. When slotted into a table header, the table caption owns overflow for the complete toolbar and table-owned action row."
|
|
46
47
|
],
|
|
47
48
|
"responsiveBehavior": [
|
|
48
|
-
"The start cluster, search, trailing Filter/Group
|
|
49
|
-
"Inside a named ds-table container narrower than 900px, ds-table-filter and ds-table-sort omit their labels and chevrons and become icon-only.
|
|
49
|
+
"The start cluster, search, trailing Filter/Sort/Group, and table caption trailing actions stay on one line. Saved views hug their current trigger content up to the compact menu-width token rather than reserving that full width; long names truncate while the dirty dot stays visible. Filter, Sort, and Group triggers cap at the same token, and Sort and Group popups keep that compact menu-width floor. A standalone toolbar owns its horizontal scrolling; inside a table, the complete caption row is the single overflow owner so table-owned actions never remain pinned over scrolling toolbar controls.",
|
|
50
|
+
"Inside a named ds-table container narrower than 900px, Search retains its standard maximum width and flexes smaller only when the complete row needs space. ds-table-filter and ds-table-sort omit their labels and chevrons, and Group controls explicitly opted into collapseLabel become icon-only; each exposes its label through a hover and keyboard-focus tooltip. Empty leading and trailing slot groups do not add spacing. Active filtering or grouping promotes the prefix icon to primary. Sort keeps resting secondary chrome. Table-owned Customize also becomes the icon-only Table menu button at that width with the same tooltip behavior.",
|
|
50
51
|
"The scrollbar is visually suppressed without removing touch, trackpad, mouse-wheel, or keyboard scrolling from the overflow container.",
|
|
51
52
|
"Trailing controls remain grouped after leading controls; the toolbar does not collapse controls into an application-specific overflow menu."
|
|
52
53
|
],
|
|
@@ -146,12 +147,12 @@
|
|
|
146
147
|
"files": [
|
|
147
148
|
{
|
|
148
149
|
"path": "src/wc/components/TableToolbar/TableToolbar.css",
|
|
149
|
-
"content": ":host {\n display: block;\n min-inline-size: 0;\n max-inline-size: 100%;\n}\n\n.table-toolbar {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n inline-size: 100%;\n min-inline-size: 0;\n gap: var(--dimension-space-100);\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n}\n\n.table-toolbar::-webkit-scrollbar {\n display: none;\n}\n\n.table-toolbar__start,\n.table-toolbar__search,\n.table-
|
|
150
|
+
"content": ":host {\n --ds-control-press-active-scale: var(--dimension-scale-default);\n\n display: block;\n min-inline-size: 0;\n max-inline-size: 100%;\n}\n\n/* A table caption owns overflow for the complete application + table control row. */\n:host([slot='header']) {\n display: contents;\n max-inline-size: none;\n}\n\n.table-toolbar {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n inline-size: 100%;\n min-inline-size: 0;\n gap: var(--dimension-space-100);\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n}\n\n:host([slot='header']) .table-toolbar {\n display: contents;\n}\n\n.table-toolbar::-webkit-scrollbar {\n display: none;\n}\n\n.table-toolbar__start,\n.table-toolbar__search,\n.table-toolbar__leading,\n.table-toolbar__trailing {\n display: flex;\n align-items: center;\n min-inline-size: 0;\n gap: var(--dimension-space-100);\n}\n\n.table-toolbar__start {\n flex: 0 0 auto;\n min-inline-size: 0;\n max-inline-size: var(--dimension-menu-width-xs);\n overflow: hidden;\n}\n\n.table-toolbar__rule {\n flex: 0 0 auto;\n}\n\n.table-toolbar__search {\n flex: 0 1 var(--dimension-panel-width-xs);\n max-inline-size: var(--dimension-panel-width-xs);\n contain: inline-size;\n}\n\n.table-toolbar__slot--empty {\n display: none;\n}\n\n.table-toolbar__leading {\n flex: 0 0 auto;\n}\n\n.table-toolbar__trailing {\n flex: 0 0 auto;\n margin-inline-start: auto;\n}\n\n.table-toolbar__trailing > *,\n.table-toolbar [slot='start'],\n.table-toolbar ds-table-filter,\n.table-toolbar ds-filter-menu,\n.table-toolbar ds-select,\n.table-toolbar ds-table-sort {\n min-inline-size: 0;\n max-inline-size: var(--dimension-menu-width-xs);\n --ds-choice-popup-min-inline-size: var(--dimension-menu-width-xs);\n}\n\n.table-toolbar__trailing > * {\n flex: 0 0 auto;\n}\n\n.table-toolbar__start slot,\n.table-toolbar__search slot,\n.table-toolbar__leading slot,\n.table-toolbar__trailing slot {\n display: contents;\n}\n",
|
|
150
151
|
"type": "registry:ui"
|
|
151
152
|
},
|
|
152
153
|
{
|
|
153
154
|
"path": "src/wc/components/TableToolbar/TableToolbar.tsx",
|
|
154
|
-
"content": "import { Component, h, Host, Prop } from '@stencil/core';\n\n@Component({\n tag: 'ds-table-toolbar',\n styleUrl: 'TableToolbar.css',\n scoped: true,\n})\nexport class TableToolbar {\n /** Accessible name for the grouped table controls. */\n @Prop() label: string = 'Table controls';\n\n render() {\n return (\n <Host>\n <div class=\"table-toolbar\" role=\"toolbar\" aria-label={this.label}>\n <div
|
|
155
|
+
"content": "import { Component, Element, h, Host, Prop, State } from '@stencil/core';\n\nconst TABLE_TOOLBAR_SLOT_START = 1 << 0;\nconst TABLE_TOOLBAR_SLOT_SEARCH = 1 << 1;\nconst TABLE_TOOLBAR_SLOT_LEADING = 1 << 2;\nconst TABLE_TOOLBAR_SLOT_TRAILING = 1 << 3;\n\n@Component({\n tag: 'ds-table-toolbar',\n styleUrl: 'TableToolbar.css',\n scoped: true,\n})\nexport class TableToolbar {\n @Element() el!: HTMLElement;\n\n /** Accessible name for the grouped table controls. */\n @Prop() label: string = 'Table controls';\n\n @State() private slotPresence = 0;\n\n componentWillLoad(): void {\n this.syncSlotPresence();\n }\n\n private hasOwnedSlot(name: string): boolean {\n return Array.from(this.el.querySelectorAll<HTMLElement>(`[slot=\"${name}\"]`)).some(\n element => element.closest('ds-table-toolbar') === this.el\n );\n }\n\n private syncSlotPresence = () => {\n let presence = 0;\n if (this.hasOwnedSlot('start')) presence |= TABLE_TOOLBAR_SLOT_START;\n if (this.hasOwnedSlot('search')) presence |= TABLE_TOOLBAR_SLOT_SEARCH;\n if (this.hasOwnedSlot('leading')) presence |= TABLE_TOOLBAR_SLOT_LEADING;\n if (this.hasOwnedSlot('trailing')) presence |= TABLE_TOOLBAR_SLOT_TRAILING;\n if (presence !== this.slotPresence) this.slotPresence = presence;\n };\n\n render() {\n const hasStart = (this.slotPresence & TABLE_TOOLBAR_SLOT_START) !== 0;\n const hasSearch = (this.slotPresence & TABLE_TOOLBAR_SLOT_SEARCH) !== 0;\n const hasLeading = (this.slotPresence & TABLE_TOOLBAR_SLOT_LEADING) !== 0;\n const hasTrailing = (this.slotPresence & TABLE_TOOLBAR_SLOT_TRAILING) !== 0;\n\n return (\n <Host>\n <div class=\"table-toolbar\" role=\"toolbar\" aria-label={this.label}>\n <div\n class={{\n 'table-toolbar__start': true,\n 'table-toolbar__slot--empty': !hasStart,\n }}\n >\n <slot name=\"start\" onSlotchange={this.syncSlotPresence} />\n </div>\n <ds-divider\n class={{\n 'table-toolbar__rule': true,\n 'table-toolbar__slot--empty': !hasStart,\n }}\n orientation=\"vertical\"\n length=\"32px\"\n />\n <div\n class={{\n 'table-toolbar__search': true,\n 'table-toolbar__slot--empty': !hasSearch,\n }}\n >\n <slot name=\"search\" onSlotchange={this.syncSlotPresence} />\n </div>\n <div\n class={{\n 'table-toolbar__leading': true,\n 'table-toolbar__slot--empty': !hasLeading,\n }}\n >\n <slot name=\"leading\" onSlotchange={this.syncSlotPresence} />\n </div>\n <div\n class={{\n 'table-toolbar__trailing': true,\n 'table-toolbar__slot--empty': !hasTrailing,\n }}\n >\n <slot name=\"trailing\" onSlotchange={this.syncSlotPresence} />\n </div>\n </div>\n </Host>\n );\n }\n}\n",
|
|
155
156
|
"type": "registry:ui"
|
|
156
157
|
}
|
|
157
158
|
]
|