@ds-mo/ui 14.20.0 → 14.22.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 +8 -4
- package/dist/agent.json +447 -44
- package/dist/angular/ds-bar-title.d.ts +1 -1
- package/dist/angular/ds-bar-title.js +3 -3
- package/dist/angular/ds-chip.d.ts +1 -1
- package/dist/angular/ds-chip.js +3 -3
- package/dist/angular/ds-filter-menu.d.ts +7 -1
- package/dist/angular/ds-filter-menu.js +7 -4
- package/dist/angular/ds-input.d.ts +1 -1
- package/dist/angular/ds-input.js +3 -3
- package/dist/angular/ds-panel-nav.d.ts +7 -1
- package/dist/angular/ds-panel-nav.js +7 -4
- package/dist/angular/ds-shell-app.d.ts +7 -1
- package/dist/angular/ds-shell-app.js +7 -4
- package/dist/angular/ds-shell-page.d.ts +1 -1
- package/dist/angular/ds-shell-page.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 +7 -1
- package/dist/angular/ds-table-filter.js +7 -4
- package/dist/angular/ds-table-group.d.ts +29 -0
- package/dist/angular/ds-table-group.js +48 -0
- package/dist/angular/ds-table-search.d.ts +20 -0
- package/dist/angular/ds-table-search.js +49 -0
- package/dist/angular/ds-table.d.ts +1 -1
- package/dist/angular/ds-table.js +3 -3
- package/dist/angular/index.d.ts +1 -1
- package/dist/angular/index.js +2 -0
- package/dist/angular/proxies.d.ts +2 -0
- package/dist/angular/proxies.js +2 -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-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-chart.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-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-chip.js.map +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-composer.js +1 -1
- package/dist/components/ds-message-scroller.js +1 -1
- package/dist/components/ds-message-scroller.js.map +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-tool-search.js.map +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-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-slider.js +1 -1
- package/dist/components/ds-swatch-picker.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.d.ts +11 -0
- package/dist/components/ds-table-group.js +2 -0
- package/dist/components/ds-table-group.js.map +1 -0
- package/dist/components/ds-table-saved-views.js +1 -1
- package/dist/components/ds-table-search.d.ts +11 -0
- package/dist/components/ds-table-search.js +2 -0
- package/dist/components/ds-table-search.js.map +1 -0
- 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-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-Bf7PZJPT.js → p-5Z4oYuiK.js} +2 -2
- package/dist/components/{p-DIlScMvI.js → p-6rB0eAda.js} +2 -2
- package/dist/components/{p-CptSB-tA.js → p-9ykZwPlI.js} +2 -2
- package/dist/components/p-B0OZx3JB.js +2 -0
- package/dist/components/p-B0OZx3JB.js.map +1 -0
- package/dist/components/{p-BHhmB9-4.js → p-B0kSlcaw.js} +2 -2
- package/dist/components/{p-DWjTOoXs.js → p-B1wMpt1z.js} +2 -2
- package/dist/components/p-BEttT0UB.js +2 -0
- package/dist/components/p-BEttT0UB.js.map +1 -0
- package/dist/components/p-BFit8o0r.js +2 -0
- package/dist/components/p-BFit8o0r.js.map +1 -0
- package/dist/components/{p-fRDzpfi9.js → p-BXv6RpoF.js} +2 -2
- package/dist/components/{p-D7QlTWbN.js → p-BbG7nOcz.js} +2 -2
- package/dist/components/{p-Bx5BSd6F.js → p-BcxidW9k.js} +2 -2
- package/dist/components/{p-1UAVanY9.js → p-Bd8I2oXN.js} +2 -2
- package/dist/components/{p-DGe5oXR0.js → p-Bjq1KP_Y.js} +2 -2
- package/dist/components/p-Bjq1KP_Y.js.map +1 -0
- package/dist/components/{p-DW5Ita-P.js → p-BnTPuV3x.js} +2 -2
- package/dist/components/{p-DW5Ita-P.js.map → p-BnTPuV3x.js.map} +1 -1
- package/dist/components/p-BqVXMEJm.js +2 -0
- package/dist/components/p-BqVXMEJm.js.map +1 -0
- package/dist/components/p-CB3fv_Oh.js +2 -0
- package/dist/components/p-CB3fv_Oh.js.map +1 -0
- package/dist/components/{p-DdH7b4JF.js → p-CBymzuOO.js} +2 -2
- package/dist/components/{p-BjRD57w3.js → p-CE2b5GPu.js} +2 -2
- package/dist/components/{p-DBYv7fRq.js → p-CFkZSDwI.js} +2 -2
- package/dist/components/{p-Bb4KnRy0.js → p-CTH3dSYg.js} +2 -2
- package/dist/components/{p-BmssRAEZ.js → p-CZ144LS5.js} +2 -2
- package/dist/components/{p-B-HsfQOK.js → p-Cd1JnnVK.js} +2 -2
- package/dist/components/p-CeKa4VbU.js +2 -0
- package/dist/components/{p-AtUP95E_.js.map → p-CeKa4VbU.js.map} +1 -1
- package/dist/components/{p-CDw_WEVt.js → p-Cnsvgx1M.js} +2 -2
- package/dist/components/{p-BYFS2qWb.js → p-CpeJMKJ5.js} +2 -2
- package/dist/components/{p-DM1Z_hh0.js → p-D36EmETH.js} +2 -2
- package/dist/components/p-D9wZlB_N.js +2 -0
- package/dist/components/p-D9wZlB_N.js.map +1 -0
- package/dist/components/{p-DFC0sRM-.js → p-DI8DUozc.js} +2 -2
- package/dist/components/{p-v4oqkJms.js → p-DSy1oOnd.js} +2 -2
- package/dist/components/{p-v4oqkJms.js.map → p-DSy1oOnd.js.map} +1 -1
- package/dist/components/{p-DQBT1Jkf.js → p-DbLLH3hr.js} +2 -2
- package/dist/components/{p-B2FT4Da6.js → p-De0qjzPu.js} +2 -2
- package/dist/components/{p-B6rSDhJY.js → p-Dit6JmAK.js} +2 -2
- package/dist/components/p-DnZ7DNaz.js +2 -0
- package/dist/components/p-DnZ7DNaz.js.map +1 -0
- package/dist/components/{p-caLOcQUK.js → p-DzPtYdXy.js} +2 -2
- package/dist/components/{p-Do8wbFff.js → p-XaCYqck3.js} +2 -2
- package/dist/components/{p-L8IIeDXM.js → p-_C-XRpCB.js} +2 -2
- package/dist/components/{p-CyZqk196.js → p-bHnk8t5I.js} +2 -2
- package/dist/components/p-hYjmOPCI.js +2 -0
- package/dist/components/p-hYjmOPCI.js.map +1 -0
- package/dist/components/{p-ChfVRPHw.js → p-pUOA3iDG.js} +2 -2
- package/dist/components/{p-DLbHgbVj.js → p-pnO8tAYB.js} +2 -2
- package/dist/components/{p-CCmgtju-.js → p-pxN8JGEh.js} +2 -2
- package/dist/components/p-pxN8JGEh.js.map +1 -0
- package/dist/components/{p-B4wTnsUL.js → p-w9fkkwL2.js} +2 -2
- package/dist/components/p-x5u5Ueli.js +2 -0
- package/dist/components/{p-BeA6Jv-3.js.map → p-x5u5Ueli.js.map} +1 -1
- package/dist/docs/components.json +1582 -45
- package/dist/lib/components/BarTitle/bar-title-types.d.ts +1 -0
- package/dist/lib/components/Menu/menu-placement.d.ts +13 -0
- package/dist/lib/components/PanelNav/panel-nav-types.d.ts +19 -0
- package/dist/lib/components/ShellApp/shell-app-types.d.ts +1 -0
- package/dist/lib/components/ShellPage/shell-page-types.d.ts +1 -0
- package/dist/lib/shell/index.d.ts +3 -3
- package/dist/lib/shell/index.js.map +2 -2
- package/dist/mcp-data/registry/bar-title.json +25 -4
- package/dist/mcp-data/registry/button-filled.json +1 -0
- package/dist/mcp-data/registry/button-unfilled.json +1 -0
- package/dist/mcp-data/registry/chip.json +39 -2
- package/dist/mcp-data/registry/filter-menu.json +84 -11
- package/dist/mcp-data/registry/input.json +54 -2
- package/dist/mcp-data/registry/menu.json +1 -1
- package/dist/mcp-data/registry/panel-nav.json +71 -10
- package/dist/mcp-data/registry/panel-tool-search.json +4 -5
- package/dist/mcp-data/registry/registry.json +452 -43
- package/dist/mcp-data/registry/select.json +1 -0
- package/dist/mcp-data/registry/shell-app.json +47 -5
- package/dist/mcp-data/registry/shell-page.json +25 -5
- package/dist/mcp-data/registry/tab-group.json +21 -2
- package/dist/mcp-data/registry/table-filter.json +79 -9
- package/dist/mcp-data/registry/table-group.json +301 -0
- package/dist/mcp-data/registry/table-search.json +343 -0
- package/dist/mcp-data/registry/table-sort.json +1 -1
- package/dist/mcp-data/registry/table-toolbar.json +7 -6
- package/dist/mcp-data/registry/table.json +55 -17
- package/dist/react/components.d.ts +2 -0
- package/dist/react/components.js +2 -0
- package/dist/react/ds-filter-menu.d.ts +2 -1
- package/dist/react/ds-filter-menu.js +1 -0
- package/dist/react/ds-panel-nav.d.ts +2 -1
- package/dist/react/ds-panel-nav.js +1 -0
- package/dist/react/ds-shell-app.d.ts +2 -1
- package/dist/react/ds-shell-app.js +1 -0
- package/dist/react/ds-table-filter.d.ts +2 -1
- package/dist/react/ds-table-filter.js +1 -0
- package/dist/react/ds-table-group.d.ts +14 -0
- package/dist/react/ds-table-group.js +16 -0
- package/dist/react/ds-table-search.d.ts +14 -0
- package/dist/react/ds-table-search.js +16 -0
- package/dist/styles/table.css +46 -0
- package/dist/types/components/BarTitle/BarTitle.d.ts +4 -1
- package/dist/types/components/BarTitle/bar-title-types.d.ts +1 -0
- package/dist/types/components/BarTitle/index.d.ts +1 -1
- package/dist/types/components/Chip/Chip.d.ts +5 -0
- package/dist/types/components/FilterMenu/FilterMenu.d.ts +26 -0
- package/dist/types/components/Input/Input.d.ts +6 -0
- package/dist/types/components/Menu/menu-placement.d.ts +13 -0
- package/dist/types/components/PanelNav/PanelNav.d.ts +29 -2
- package/dist/types/components/PanelNav/index.d.ts +2 -2
- package/dist/types/components/PanelNav/panel-nav-types.d.ts +19 -0
- package/dist/types/components/PanelNav/panel-nav-utils.d.ts +10 -2
- package/dist/types/components/ShellApp/ShellApp.d.ts +11 -1
- package/dist/types/components/ShellApp/shell-app-types.d.ts +1 -0
- package/dist/types/components/ShellPage/ShellPage.d.ts +6 -1
- package/dist/types/components/ShellPage/index.d.ts +1 -1
- package/dist/types/components/ShellPage/shell-page-types.d.ts +1 -0
- package/dist/types/components/TabGroup/TabGroup.d.ts +2 -0
- package/dist/types/components/Table/Table.d.ts +6 -0
- package/dist/types/components/Table/index.d.ts +1 -1
- package/dist/types/components/Table/table-cell-model.d.ts +11 -1
- package/dist/types/components/Table/table-highlight.d.ts +12 -0
- package/dist/types/components/Table/table-model.d.ts +6 -5
- package/dist/types/components/Table/table-render-model.d.ts +1 -1
- package/dist/types/components/Table/table-row-view.d.ts +4 -1
- package/dist/types/components/Table/table-types.d.ts +22 -4
- package/dist/types/components/Table/table-virtual-model.d.ts +2 -0
- package/dist/types/components/TableFilter/TableFilter.d.ts +9 -1
- package/dist/types/components/TableGroup/TableGroup.d.ts +60 -0
- package/dist/types/components/TableSearch/TableSearch.d.ts +56 -0
- package/dist/types/components/TableSearch/table-search-model.d.ts +10 -0
- package/dist/types/components/TableSearch/table-search-types.d.ts +10 -0
- package/dist/types/components.d.ts +459 -14
- package/dist/types/shell/index.d.ts +3 -3
- package/dist/types/utils/choice-list-parts.d.ts +11 -1
- package/dist/types/utils/select-controller.d.ts +1 -1
- package/dist/vue/components.d.ts +2 -0
- package/dist/vue/components.js +2 -0
- package/dist/vue/ds-bar-title.js +1 -0
- package/dist/vue/ds-chip.js +2 -0
- package/dist/vue/ds-filter-menu.js +5 -0
- package/dist/vue/ds-input.js +3 -0
- package/dist/vue/ds-panel-nav.js +4 -0
- package/dist/vue/ds-shell-app.js +3 -0
- package/dist/vue/ds-shell-page.js +1 -0
- package/dist/vue/ds-tab-group.js +1 -0
- package/dist/vue/ds-table-filter.js +5 -0
- package/dist/vue/ds-table-group.d.ts +3 -0
- package/dist/vue/ds-table-group.js +20 -0
- package/dist/vue/ds-table-search.d.ts +3 -0
- package/dist/vue/ds-table-search.js +22 -0
- package/dist/vue/ds-table.js +2 -0
- package/package.json +1 -1
- package/dist/components/p-AtUP95E_.js +0 -2
- package/dist/components/p-B5-R5mb8.js +0 -2
- package/dist/components/p-B5-R5mb8.js.map +0 -1
- package/dist/components/p-BUexfjjg.js +0 -2
- package/dist/components/p-BUexfjjg.js.map +0 -1
- package/dist/components/p-BeA6Jv-3.js +0 -2
- package/dist/components/p-BkelrY4-.js +0 -2
- package/dist/components/p-BkelrY4-.js.map +0 -1
- package/dist/components/p-CCmgtju-.js.map +0 -1
- package/dist/components/p-DA5H_Iq_.js +0 -2
- package/dist/components/p-DA5H_Iq_.js.map +0 -1
- package/dist/components/p-DGe5oXR0.js.map +0 -1
- package/dist/components/p-DKt_8s-U.js +0 -2
- package/dist/components/p-DKt_8s-U.js.map +0 -1
- package/dist/components/p-DfDoqOlx.js +0 -2
- package/dist/components/p-DfDoqOlx.js.map +0 -1
- package/dist/components/p-rw0ZxIE4.js +0 -2
- package/dist/components/p-rw0ZxIE4.js.map +0 -1
- /package/dist/components/{p-Bf7PZJPT.js.map → p-5Z4oYuiK.js.map} +0 -0
- /package/dist/components/{p-DIlScMvI.js.map → p-6rB0eAda.js.map} +0 -0
- /package/dist/components/{p-CptSB-tA.js.map → p-9ykZwPlI.js.map} +0 -0
- /package/dist/components/{p-BHhmB9-4.js.map → p-B0kSlcaw.js.map} +0 -0
- /package/dist/components/{p-DWjTOoXs.js.map → p-B1wMpt1z.js.map} +0 -0
- /package/dist/components/{p-fRDzpfi9.js.map → p-BXv6RpoF.js.map} +0 -0
- /package/dist/components/{p-D7QlTWbN.js.map → p-BbG7nOcz.js.map} +0 -0
- /package/dist/components/{p-Bx5BSd6F.js.map → p-BcxidW9k.js.map} +0 -0
- /package/dist/components/{p-1UAVanY9.js.map → p-Bd8I2oXN.js.map} +0 -0
- /package/dist/components/{p-DdH7b4JF.js.map → p-CBymzuOO.js.map} +0 -0
- /package/dist/components/{p-BjRD57w3.js.map → p-CE2b5GPu.js.map} +0 -0
- /package/dist/components/{p-DBYv7fRq.js.map → p-CFkZSDwI.js.map} +0 -0
- /package/dist/components/{p-Bb4KnRy0.js.map → p-CTH3dSYg.js.map} +0 -0
- /package/dist/components/{p-BmssRAEZ.js.map → p-CZ144LS5.js.map} +0 -0
- /package/dist/components/{p-B-HsfQOK.js.map → p-Cd1JnnVK.js.map} +0 -0
- /package/dist/components/{p-CDw_WEVt.js.map → p-Cnsvgx1M.js.map} +0 -0
- /package/dist/components/{p-BYFS2qWb.js.map → p-CpeJMKJ5.js.map} +0 -0
- /package/dist/components/{p-DM1Z_hh0.js.map → p-D36EmETH.js.map} +0 -0
- /package/dist/components/{p-DFC0sRM-.js.map → p-DI8DUozc.js.map} +0 -0
- /package/dist/components/{p-DQBT1Jkf.js.map → p-DbLLH3hr.js.map} +0 -0
- /package/dist/components/{p-B2FT4Da6.js.map → p-De0qjzPu.js.map} +0 -0
- /package/dist/components/{p-B6rSDhJY.js.map → p-Dit6JmAK.js.map} +0 -0
- /package/dist/components/{p-caLOcQUK.js.map → p-DzPtYdXy.js.map} +0 -0
- /package/dist/components/{p-Do8wbFff.js.map → p-XaCYqck3.js.map} +0 -0
- /package/dist/components/{p-L8IIeDXM.js.map → p-_C-XRpCB.js.map} +0 -0
- /package/dist/components/{p-CyZqk196.js.map → p-bHnk8t5I.js.map} +0 -0
- /package/dist/components/{p-ChfVRPHw.js.map → p-pUOA3iDG.js.map} +0 -0
- /package/dist/components/{p-DLbHgbVj.js.map → p-pnO8tAYB.js.map} +0 -0
- /package/dist/components/{p-B4wTnsUL.js.map → p-w9fkkwL2.js.map} +0 -0
|
@@ -1309,6 +1309,7 @@
|
|
|
1309
1309
|
],
|
|
1310
1310
|
"commonlyComposedWith": [
|
|
1311
1311
|
"component:ds-shell-page",
|
|
1312
|
+
"component:ds-shell-app",
|
|
1312
1313
|
"component:ds-button-filled",
|
|
1313
1314
|
"component:ds-button-unfilled",
|
|
1314
1315
|
"component:ds-breadcrumb",
|
|
@@ -1333,11 +1334,13 @@
|
|
|
1333
1334
|
"The overflow trigger uses its bordered treatment whenever the primary action is visible beside it; overflow-only and auto-collapsed-primary presentations keep the trigger borderless.",
|
|
1334
1335
|
"expanded renders the larger heading, optional description, inset divider, and a full-width caption breadcrumb row above the title. The breadcrumb begins after 32px top padding; the following title and right-side actions share one top alignment. Compact renders 48px chrome with the existing icon Back action; constrained uses compact chrome and moves an auto-collapse primary action into overflow.",
|
|
1335
1336
|
"primaryAction collapse defaults to auto. Use never for exceptional actions whose hierarchy must remain visible in constrained layouts.",
|
|
1336
|
-
"showDivider=false removes the bottom divider when the surrounding page composition supplies the boundary; showCompactDivider can independently restore or remove that boundary in compact and constrained variants."
|
|
1337
|
+
"showDivider=false removes the bottom divider when the surrounding page composition supplies the boundary; showCompactDivider can independently restore or remove that boundary in compact and constrained variants.",
|
|
1338
|
+
"placement=shell-bar is reserved for ShellApp panel section navigation. It remains compact, omits description and breadcrumb presentation, and preserves applicable Back, section, primary, and overflow controls."
|
|
1337
1339
|
],
|
|
1338
1340
|
"responsiveBehavior": [
|
|
1339
1341
|
"BarTitle does not observe viewport, shell, scroll, or container state. Its owner selects an explicit variant.",
|
|
1340
1342
|
"ShellPage is the standard owner for automatic expanded, compact, and constrained selection.",
|
|
1343
|
+
"ShellApp owns shell-bar placement and always selects compact presentation there; mobile continues to use MobileHeader.",
|
|
1341
1344
|
"When ShellPage owns BarTitle on a secondary desktop or tablet page, its expanded, compact, and constrained presentations all match that canvas; the separate MobileHeader component remains primary.",
|
|
1342
1345
|
"Compact titles use the shared compact-header geometry and md control inset so top-level headings align with BarNav and inline Back geometry aligns with PanelToolHeader. Long headings and section labels truncate independently while Back and action controls retain complete hit targets and accessible names.",
|
|
1343
1346
|
"A never-collapse primary action remains visible in constrained mode; the title and section label yield space first."
|
|
@@ -1404,6 +1407,10 @@
|
|
|
1404
1407
|
"type": "string",
|
|
1405
1408
|
"required": true
|
|
1406
1409
|
},
|
|
1410
|
+
"placement": {
|
|
1411
|
+
"type": "BarTitlePlacement",
|
|
1412
|
+
"required": false
|
|
1413
|
+
},
|
|
1407
1414
|
"primaryAction": {
|
|
1408
1415
|
"type": "BarTitlePrimaryAction | null",
|
|
1409
1416
|
"required": false
|
|
@@ -1828,6 +1835,7 @@
|
|
|
1828
1835
|
],
|
|
1829
1836
|
"states": [
|
|
1830
1837
|
"Every size applies one complete control-density recipe across frame height, inline padding, icon zone, text-container inset, gap, and radius.",
|
|
1838
|
+
"Every button has a minimum inline size equal to its resolved height. Short labels therefore form a square control while longer labels continue to hug their content.",
|
|
1831
1839
|
"Set isInset only when the button is nested inside a same-size control. The default single inset removes 4px overall; insetDepth double removes 8px overall so the parent can add 4px per edge while preserving its outer alignment box. Double inset falls back to single at xs to protect minimum icon geometry.",
|
|
1832
1840
|
"Use only one filled action per local decision area; render all secondary actions with ButtonUnfilled.",
|
|
1833
1841
|
"Choose brand or neutral for general commands. Reserve positive, negative, warning, and caution for matching action consequences, and AI, guide, or walkthrough for actions that enter those feature experiences.",
|
|
@@ -2045,6 +2053,7 @@
|
|
|
2045
2053
|
],
|
|
2046
2054
|
"states": [
|
|
2047
2055
|
"Every size applies one complete control-density recipe across frame height, inline padding, icon zone, text-container inset, gap, and radius.",
|
|
2056
|
+
"Every button has a minimum inline size equal to its resolved height. Short labels therefore form a square control while longer labels continue to hug their content.",
|
|
2048
2057
|
"Set isInset only when the button is nested inside a same-size control. The default single inset removes 4px overall; insetDepth double removes 8px overall so the parent can add 4px per edge while preserving its outer alignment box. Double inset falls back to single at xs to protect minimum icon geometry.",
|
|
2049
2058
|
"A true pressed toggle and owner-controlled isActive emphasis share the selected visual treatment, but only pressed supplies toggle semantics and dsChange.",
|
|
2050
2059
|
"General content UI keeps the selected interaction fill and border for pressed or active emphasis.",
|
|
@@ -3135,6 +3144,7 @@
|
|
|
3135
3144
|
"The dismiss action is the chip's only interaction, and the parent owns data mutation after dsRemove.",
|
|
3136
3145
|
"Long labels remain on one line and truncate only when the consuming layout supplies a maximum width; otherwise the chip sizes to its content.",
|
|
3137
3146
|
"Rounded shape is a visual choice and does not change semantics or interaction.",
|
|
3147
|
+
"isInset opts into reduced outer geometry only when Chip is nested inside a control of the same density. The dismiss button applies the same inset depth again inside the Chip's already-reduced height, and its trailing padding matches the resulting top and bottom space. The default single inset removes 4px overall; insetDepth double removes 8px overall and falls back to single at xs.",
|
|
3138
3148
|
"Chip is designed only for primary surfaces and has no surface-context API."
|
|
3139
3149
|
],
|
|
3140
3150
|
"responsiveBehavior": [
|
|
@@ -3160,10 +3170,18 @@
|
|
|
3160
3170
|
]
|
|
3161
3171
|
},
|
|
3162
3172
|
"props": {
|
|
3173
|
+
"insetDepth": {
|
|
3174
|
+
"type": "ControlInsetDepth",
|
|
3175
|
+
"required": false
|
|
3176
|
+
},
|
|
3163
3177
|
"isInactive": {
|
|
3164
3178
|
"type": "boolean",
|
|
3165
3179
|
"required": false
|
|
3166
3180
|
},
|
|
3181
|
+
"isInset": {
|
|
3182
|
+
"type": "boolean",
|
|
3183
|
+
"required": false
|
|
3184
|
+
},
|
|
3167
3185
|
"label": {
|
|
3168
3186
|
"type": "string",
|
|
3169
3187
|
"required": true
|
|
@@ -3904,7 +3922,7 @@
|
|
|
3904
3922
|
{
|
|
3905
3923
|
"name": "filter-menu",
|
|
3906
3924
|
"title": "FilterMenu",
|
|
3907
|
-
"description": "Controlled two-pane filter select with menu-recipe category navigation, single- and multiple-choice, boolean, semantic relative-date and fixed-range filters, selected counts, and a clear action.",
|
|
3925
|
+
"description": "Controlled two-pane filter select with menu-recipe category navigation, local option search for non-date categories, single- and multiple-choice, boolean, semantic relative-date and fixed-range filters, selected counts, and a clear action.",
|
|
3908
3926
|
"type": "registry:ui",
|
|
3909
3927
|
"meta": {
|
|
3910
3928
|
"library": "@ds-mo/ui",
|
|
@@ -3915,7 +3933,7 @@
|
|
|
3915
3933
|
"intent": {
|
|
3916
3934
|
"audience": "general",
|
|
3917
3935
|
"status": "stable",
|
|
3918
|
-
"summary": "Controlled two-pane filter select with menu-recipe category navigation, single- and multiple-choice, boolean, semantic relative-date and fixed-range filters, selected counts, and a clear action.",
|
|
3936
|
+
"summary": "Controlled two-pane filter select with menu-recipe category navigation, local option search for non-date categories, single- and multiple-choice, boolean, semantic relative-date and fixed-range filters, selected counts, and a clear action.",
|
|
3919
3937
|
"useWhen": [
|
|
3920
3938
|
"A compact trigger must expose several filter families without turning the toolbar into many separate controls.",
|
|
3921
3939
|
"Users need to move between persistent filter categories while editing the selected category in a second pane."
|
|
@@ -3945,17 +3963,20 @@
|
|
|
3945
3963
|
"accessibility": [
|
|
3946
3964
|
"The built-in select trigger exposes combobox semantics with a dialog popup, synchronizes expanded state, holds the pressed interaction wash without changing resting foreground while open, and restores focus after dismissal.",
|
|
3947
3965
|
"The category pane is a vertical tab list. Arrow Up and Arrow Down wrap, Home and End jump, Arrow Right enters the option pane, and Arrow Left returns to the active category.",
|
|
3966
|
+
"Every non-date category begins with a labelled search field. Arrow Down and Arrow Up enter the first or last visible option, while Left and Right retain native text-caret behavior. Search matches option labels and descriptions without changing selected values.",
|
|
3948
3967
|
"Escape and outside activation close the popup and restore trigger focus. Tab moves through option controls and closes only when it leaves the popup boundary.",
|
|
3949
|
-
"Date filters expose Range and Relative tabs in a
|
|
3968
|
+
"Date filters expose containerless Range and Relative tabs in a secondary-background header with 4px padding around the 32px medium control. Relative presets use listbox semantics; the range calendar exposes a labelled grid, one tab stop, arrow-key day navigation, Home and End week navigation, and Page Up or Page Down month navigation. After a range start is chosen, pointer hover and keyboard focus preview the possible inclusive range without changing selection semantics.",
|
|
3950
3969
|
"When an external trigger is inside an open shadow tree, pass its HTMLElement through anchor so outside activation, focus return, and Tab continuation use the composed tree.",
|
|
3951
3970
|
"The trigger count reports active filter categories. Multiple-choice category tags report individual selected criteria, while an applied Date category uses a visual dot because its value is singular. The default summary footer announces the total; the categories-clear footer recipe reserves a visually empty category-pane action row and exposes its divider and only Clear when criteria are active."
|
|
3952
3971
|
],
|
|
3953
3972
|
"states": [
|
|
3954
|
-
"The application owns filters, values, activeFilterId, and open. Replace controlled objects and arrays after dsChange, dsActiveFilterChange, dsClear, or dsClose.",
|
|
3973
|
+
"The application owns filters, values, matchModes, activeFilterId, and open. Replace controlled objects and arrays after dsChange, dsMatchModeChange, dsActiveFilterChange, dsClear, or dsClose.",
|
|
3955
3974
|
"Single filters return a string, multiple filters return ordered string arrays, boolean filters return a boolean, and date filters return a serializable semantic string.",
|
|
3975
|
+
"Multiple filters expose a right-pane footer reading Limit results to any or all selected. any is the default OR mode. Activating the blue mode word requests the opposite controlled mode through dsMatchModeChange; the application owns the corresponding query semantics.",
|
|
3976
|
+
"Non-date option search is internal, scoped independently per category while the popup remains open, and reset after the popup closes. An unmatched query shows the configurable noResultsText empty state. Date uses its Relative and Range modes instead of option search.",
|
|
3956
3977
|
"Date values are serializable semantic strings: relative:<preset> preserves a relative choice for future resolution and range:<start>/<end> preserves fixed inclusive ISO calendar dates. A legacy YYYY-MM-DD value is interpreted as a one-day range.",
|
|
3957
3978
|
"Relative presets are Today, Yesterday, and the last 7, 14, 30, 60, or 90 inclusive calendar days. Applications resolve them against their current product date and time-zone policy by using resolveDateFilterRange from @ds-mo/ui/utils.",
|
|
3958
|
-
"Range selection applies the first date immediately as a one-day range; a second activation completes an ordered inclusive range. A new activation after completion starts a replacement range.",
|
|
3979
|
+
"Range selection applies the first date immediately as a one-day range; while an end is pending, that selected start retains its bold treatment and hovering or focusing another day paints the rest of the provisional inclusive span faint without emitting a value. A second activation completes an ordered inclusive range and gives both edges the bold treatment. A new activation after completion starts a replacement range.",
|
|
3959
3980
|
"Selection applies immediately and does not close the popup.",
|
|
3960
3981
|
"Changing category replaces the option-pane subtree so checkbox and other option visuals mount in their new state instead of transitioning from the previous category's row state.",
|
|
3961
3982
|
"The trigger reports how many filter categories have selections. footerLayout=summary adds a full-width selected-count footer only while values are selected; footerLayout=categories-clear always reserves the category-pane footer height while keeping its inactive divider hidden, then reveals the divider and only its left-aligned Clear action while values are selected."
|
|
@@ -3968,13 +3989,13 @@
|
|
|
3968
3989
|
],
|
|
3969
3990
|
"frameworkCaveats": {
|
|
3970
3991
|
"customElements": [
|
|
3971
|
-
"Assign filters and
|
|
3992
|
+
"Assign filters, values, and matchModes as JavaScript properties after the element is defined."
|
|
3972
3993
|
],
|
|
3973
3994
|
"react": [
|
|
3974
|
-
"Pass filters and
|
|
3995
|
+
"Pass filters, values, and matchModes as controlled props and handle onDsChange, onDsMatchModeChange, onDsActiveFilterChange, onDsClear, and onDsClose."
|
|
3975
3996
|
],
|
|
3976
3997
|
"angular": [
|
|
3977
|
-
"Use property bindings for filters and
|
|
3998
|
+
"Use property bindings for filters, values, and matchModes and event bindings for dsChange, dsMatchModeChange, dsActiveFilterChange, dsClear, and dsClose."
|
|
3978
3999
|
]
|
|
3979
4000
|
},
|
|
3980
4001
|
"references": [
|
|
@@ -4053,6 +4074,10 @@
|
|
|
4053
4074
|
"type": "string | undefined",
|
|
4054
4075
|
"required": false
|
|
4055
4076
|
},
|
|
4077
|
+
"matchModes": {
|
|
4078
|
+
"type": "FilterMenuMatchModes",
|
|
4079
|
+
"required": false
|
|
4080
|
+
},
|
|
4056
4081
|
"menuLabel": {
|
|
4057
4082
|
"type": "string",
|
|
4058
4083
|
"required": false
|
|
@@ -4061,10 +4086,18 @@
|
|
|
4061
4086
|
"type": "string",
|
|
4062
4087
|
"required": false
|
|
4063
4088
|
},
|
|
4089
|
+
"noResultsText": {
|
|
4090
|
+
"type": "string",
|
|
4091
|
+
"required": false
|
|
4092
|
+
},
|
|
4064
4093
|
"open": {
|
|
4065
4094
|
"type": "boolean",
|
|
4066
4095
|
"required": false
|
|
4067
4096
|
},
|
|
4097
|
+
"searchPlaceholder": {
|
|
4098
|
+
"type": "string",
|
|
4099
|
+
"required": false
|
|
4100
|
+
},
|
|
4068
4101
|
"showSelectedCount": {
|
|
4069
4102
|
"type": "boolean",
|
|
4070
4103
|
"required": false
|
|
@@ -4115,6 +4148,10 @@
|
|
|
4115
4148
|
"name": "dsClose",
|
|
4116
4149
|
"detail": "void"
|
|
4117
4150
|
},
|
|
4151
|
+
{
|
|
4152
|
+
"name": "dsMatchModeChange",
|
|
4153
|
+
"detail": "FilterMenuMatchModeChangeDetail"
|
|
4154
|
+
},
|
|
4118
4155
|
{
|
|
4119
4156
|
"name": "dsOpenChange",
|
|
4120
4157
|
"detail": "boolean"
|
|
@@ -4137,7 +4174,9 @@
|
|
|
4137
4174
|
"badge",
|
|
4138
4175
|
"button-unfilled",
|
|
4139
4176
|
"checkbox",
|
|
4177
|
+
"empty-state",
|
|
4140
4178
|
"icon",
|
|
4179
|
+
"input",
|
|
4141
4180
|
"tab-group",
|
|
4142
4181
|
"tag",
|
|
4143
4182
|
"text",
|
|
@@ -4326,10 +4365,12 @@
|
|
|
4326
4365
|
],
|
|
4327
4366
|
"states": [
|
|
4328
4367
|
"Every size applies one complete control-density recipe across frame height, inline padding, icon zones, text-container inset, gap, and radius; supporting error content follows the shared 4px field flow.",
|
|
4329
|
-
"The normal field boundary uses the shared secondary inset border. Focus promotes it to the thicker bold-brand inset stroke, while error uses the thicker bold-negative inset stroke without changing geometry. Set hasBorder to false only in chrome that supplies enough surrounding structure;
|
|
4368
|
+
"The normal field boundary uses the shared secondary inset border. Focus promotes it to the thicker bold-brand inset stroke, while error uses the thicker bold-negative inset stroke without changing geometry. Set hasBorder to false only in chrome that supplies enough surrounding structure; set hasInteractionFill to false when that containing chrome also owns hover and pressed feedback.",
|
|
4330
4369
|
"Placeholder text is secondary at rest and quaternary while the editable field is focused because it becomes decorative once typing begins. Single-line placeholder and entered value text truncate with an ellipsis when the field is narrower than its content.",
|
|
4331
4370
|
"Entered values use the parent surface's primary foreground; prefix icons, suffix content, and resting placeholder text use its secondary foreground.",
|
|
4332
4371
|
"Search fields show a standard borderless CrossCircle icon action only while they contain a value. Clearing emits the empty value and restores focus to the native field.",
|
|
4372
|
+
"Search fields disable browser autocomplete history, automatic capitalization, autocorrection, and spellchecking by default so browser-owned suggestions do not compete with product-owned results. Consumers can explicitly provide autoComplete when a different native history behavior is required.",
|
|
4373
|
+
"Search fields used with owned result sets forward aria-controls and aria-activedescendant to the native field so keyboard focus can remain in the query while assistive technology tracks the active result.",
|
|
4333
4374
|
"The suffix slot is for compact units or decorations. The optional leading icon is decorative and does not replace the field label.",
|
|
4334
4375
|
"Use autoComplete, inputMode, and enterKeyHint to provide browser and virtual-keyboard hints without changing the value's semantic type.",
|
|
4335
4376
|
"Number fields preserve native spinbutton semantics, keyboard stepping, and min/max constraint behavior while dsChange continues to report the native string value. Two borderless inset chevron actions split the available inner height, disable independently at their numeric bound, and restore focus to the spinbutton after pointer activation.",
|
|
@@ -4369,6 +4410,14 @@
|
|
|
4369
4410
|
]
|
|
4370
4411
|
},
|
|
4371
4412
|
"props": {
|
|
4413
|
+
"ariaActiveDescendant": {
|
|
4414
|
+
"type": "string | undefined",
|
|
4415
|
+
"required": false
|
|
4416
|
+
},
|
|
4417
|
+
"ariaControls": {
|
|
4418
|
+
"type": "string | undefined",
|
|
4419
|
+
"required": false
|
|
4420
|
+
},
|
|
4372
4421
|
"ariaDescribedby": {
|
|
4373
4422
|
"type": "string | undefined",
|
|
4374
4423
|
"required": false
|
|
@@ -4417,6 +4466,10 @@
|
|
|
4417
4466
|
"type": "boolean",
|
|
4418
4467
|
"required": false
|
|
4419
4468
|
},
|
|
4469
|
+
"hasInteractionFill": {
|
|
4470
|
+
"type": "boolean",
|
|
4471
|
+
"required": false
|
|
4472
|
+
},
|
|
4420
4473
|
"icon": {
|
|
4421
4474
|
"type": "string | undefined",
|
|
4422
4475
|
"required": false
|
|
@@ -6237,7 +6290,7 @@
|
|
|
6237
6290
|
{
|
|
6238
6291
|
"name": "panel-nav",
|
|
6239
6292
|
"title": "PanelNav",
|
|
6240
|
-
"description": "The single persistent primary navigation for an application, providing grouped
|
|
6293
|
+
"description": "The single persistent primary navigation for an application, providing grouped destinations, optional nested route sections, active-route state, standard dashboard/settings switching, user access, and collapsible desktop and tablet presentation.",
|
|
6241
6294
|
"type": "registry:ui",
|
|
6242
6295
|
"meta": {
|
|
6243
6296
|
"library": "@ds-mo/ui",
|
|
@@ -6248,7 +6301,7 @@
|
|
|
6248
6301
|
"intent": {
|
|
6249
6302
|
"audience": "specialized",
|
|
6250
6303
|
"status": "stable",
|
|
6251
|
-
"summary": "The single persistent primary navigation for an application, providing grouped
|
|
6304
|
+
"summary": "The single persistent primary navigation for an application, providing grouped destinations, optional nested route sections, active-route state, standard dashboard/settings switching, user access, and collapsible desktop and tablet presentation.",
|
|
6252
6305
|
"useWhen": [
|
|
6253
6306
|
"Building the one primary navigation surface for an application that uses the CompoMo system.",
|
|
6254
6307
|
"Top-level destinations must remain consistently available while the application's page content changes.",
|
|
@@ -6256,14 +6309,14 @@
|
|
|
6256
6309
|
],
|
|
6257
6310
|
"avoidWhen": [
|
|
6258
6311
|
"A second navigation surface is needed within the same application; an application must have only one PanelNav.",
|
|
6259
|
-
"
|
|
6312
|
+
"Route sections belong in the shell bar for the application's selected navigation mode; use flat PanelNav with BarNav rather than mixing both section presentations.",
|
|
6260
6313
|
"The choices switch local content without changing the application's primary destination; use TabGroup instead.",
|
|
6261
6314
|
"The interaction performs a command or presents temporary contextual choices; use a button or Menu instead.",
|
|
6262
6315
|
"Building navigation below the mobile breakpoint; use the application's dedicated mobile navigation component instead."
|
|
6263
6316
|
],
|
|
6264
6317
|
"alternatives": [
|
|
6265
6318
|
{
|
|
6266
|
-
"when": "The
|
|
6319
|
+
"when": "The application uses the standard flat primary-navigation mode and route sections belong in the shell bar.",
|
|
6267
6320
|
"component": "component:ds-bar-nav",
|
|
6268
6321
|
"reason": "BarNav owns secondary section navigation within the destination selected by PanelNav."
|
|
6269
6322
|
},
|
|
@@ -6291,6 +6344,7 @@
|
|
|
6291
6344
|
"Give every primary destination a concise visible label and an icon that supports rather than replaces that label.",
|
|
6292
6345
|
"Provide localized dashboard, settings, account, navigation, collapse, and expand labels.",
|
|
6293
6346
|
"Preserve accessible destination names when the panel is collapsed to icon-only presentation.",
|
|
6347
|
+
"In nested presentation, expose parent expansion state, give only the active child aria-current, and focus the selected or first enabled child when a keyboard-opened flyout appears.",
|
|
6294
6348
|
"Use notification dots as supplemental status and never as the only indication of important information.",
|
|
6295
6349
|
"When the destination body overflows, it becomes a localized keyboard-focusable scroll region in addition to the roving destination controls.",
|
|
6296
6350
|
"Keep the standard dashboard/settings switch and user/account entry available in the footer."
|
|
@@ -6299,7 +6353,13 @@
|
|
|
6299
6353
|
"Render exactly one PanelNav per application; it owns primary application destinations and no other navigation role.",
|
|
6300
6354
|
"The host router owns the current route; prefer currentUrl for active destination matching and use activeId only when route matching is unavailable.",
|
|
6301
6355
|
"Use anchor mode for native links or routers that intercept anchors; use event mode when the host performs navigation from dsNavSelect.",
|
|
6302
|
-
"Groups visually organize top-level destinations
|
|
6356
|
+
"Groups visually organize top-level destinations. Use presentation=nested only when parent children replace BarNav route sections.",
|
|
6357
|
+
"A parent with children is not a standalone page: activating it while expanded resolves to the first enabled child; route state keeps that parent expanded and gives both parent and child selected styling.",
|
|
6358
|
+
"While one parent is expanded in nested presentation, other top-level destinations retain secondary foreground; flat and collapsed presentations keep their existing foreground treatment.",
|
|
6359
|
+
"Within a multi-item group, an expanded nested branch is bounded beside its siblings: the first branch adds a divider after its children, a middle branch adds dividers before its parent and after its children, and the final branch adds a divider before its parent. Single-item groups add neither. Divider space expands on the nested section-height timing while the line fades in, with equal visible spacing on both sides; collapsing the full rail contracts and fades the divider on the rail-collapse timing.",
|
|
6360
|
+
"Expanded nested branches animate to their full required height over 500ms while fixed-size child rows progressively fade over 500ms after a 250ms wait, with each row starting 50ms after the previous row. On close, child rows fade out in reverse order with secondary foreground and the height contraction waits 250ms; reduced-motion preferences collapse those transitions to the instant motion token.",
|
|
6361
|
+
"Collapsing the full navigation rail keeps the active nested branch mounted through the rail transition and contracts its height over the same duration, so following destinations reposition without snapping.",
|
|
6362
|
+
"Collapsed nested presentation opens a child-only flyout from the parent icon without navigating; the parent holds the transient pressed wash while the flyout is rendered, activates again to close, and emits navigation intent only after a child selection.",
|
|
6303
6363
|
"Dashboard presents day-to-day operational destinations; Settings presents administrative and configuration destinations.",
|
|
6304
6364
|
"The standard footer switches the entire destination collection and navStyle between Dashboard and Settings and exposes the user/account entry.",
|
|
6305
6365
|
"The host owns the external user menu opened from dsNavUserAction.",
|
|
@@ -6313,7 +6373,8 @@
|
|
|
6313
6373
|
"Below 768px, the consuming application replaces PanelNav with a dedicated mobile navigation component; PanelNav does not own mobile navigation.",
|
|
6314
6374
|
"Managed ShellApp permanently owns responsive composition: it determines shell mode, enforces tablet collapse, and presents MobileSheetNav below 768px.",
|
|
6315
6375
|
"When the viewport is below breakpoint, PanelNav locks collapsed, disables its header toggle affordance, and preserves the persisted desktop collapse preference.",
|
|
6316
|
-
"Collapsed presentation must preserve destination ordering, active state, notification status, and accessible names."
|
|
6376
|
+
"Collapsed presentation must preserve destination ordering, active state, notification status, and accessible names.",
|
|
6377
|
+
"Nested parents expose child routes inline while expanded and in an anchored flyout while collapsed; mobile navigation remains owned by ShellApp."
|
|
6317
6378
|
],
|
|
6318
6379
|
"frameworkCaveats": {
|
|
6319
6380
|
"customElements": [
|
|
@@ -6354,6 +6415,10 @@
|
|
|
6354
6415
|
"type": "boolean",
|
|
6355
6416
|
"required": false
|
|
6356
6417
|
},
|
|
6418
|
+
"activeChildId": {
|
|
6419
|
+
"type": "string",
|
|
6420
|
+
"required": false
|
|
6421
|
+
},
|
|
6357
6422
|
"activeId": {
|
|
6358
6423
|
"type": "string",
|
|
6359
6424
|
"required": false
|
|
@@ -6402,6 +6467,10 @@
|
|
|
6402
6467
|
"type": "string",
|
|
6403
6468
|
"required": false
|
|
6404
6469
|
},
|
|
6470
|
+
"presentation": {
|
|
6471
|
+
"type": "PanelNavPresentation",
|
|
6472
|
+
"required": false
|
|
6473
|
+
},
|
|
6405
6474
|
"routerMode": {
|
|
6406
6475
|
"type": "PanelNavRouterMode",
|
|
6407
6476
|
"required": false
|
|
@@ -6436,6 +6505,10 @@
|
|
|
6436
6505
|
"name": "dsChromeTransitionStart",
|
|
6437
6506
|
"detail": "ChromeTransitionDetail"
|
|
6438
6507
|
},
|
|
6508
|
+
{
|
|
6509
|
+
"name": "dsNavChildSelect",
|
|
6510
|
+
"detail": "PanelNavChildSelectDetail"
|
|
6511
|
+
},
|
|
6439
6512
|
{
|
|
6440
6513
|
"name": "dsNavFooterAction",
|
|
6441
6514
|
"detail": "void"
|
|
@@ -6470,6 +6543,7 @@
|
|
|
6470
6543
|
"badge",
|
|
6471
6544
|
"button-unfilled",
|
|
6472
6545
|
"icon",
|
|
6546
|
+
"menu",
|
|
6473
6547
|
"text",
|
|
6474
6548
|
"tooltip"
|
|
6475
6549
|
]
|
|
@@ -6860,13 +6934,12 @@
|
|
|
6860
6934
|
},
|
|
6861
6935
|
"dependencies": [
|
|
6862
6936
|
"@ds-mo/ui",
|
|
6863
|
-
"@ds-mo/tokens"
|
|
6864
|
-
"@ds-mo/icons"
|
|
6937
|
+
"@ds-mo/tokens"
|
|
6865
6938
|
],
|
|
6866
6939
|
"registryDependencies": [
|
|
6867
6940
|
"button-unfilled",
|
|
6868
6941
|
"divider",
|
|
6869
|
-
"
|
|
6942
|
+
"input",
|
|
6870
6943
|
"text",
|
|
6871
6944
|
"tooltip"
|
|
6872
6945
|
]
|
|
@@ -7722,6 +7795,7 @@
|
|
|
7722
7795
|
"checkbox",
|
|
7723
7796
|
"empty-state",
|
|
7724
7797
|
"icon",
|
|
7798
|
+
"input",
|
|
7725
7799
|
"loader",
|
|
7726
7800
|
"text",
|
|
7727
7801
|
"tooltip"
|
|
@@ -7755,6 +7829,7 @@
|
|
|
7755
7829
|
"commonlyComposedWith": [
|
|
7756
7830
|
"component:ds-panel-nav",
|
|
7757
7831
|
"component:ds-bar-nav",
|
|
7832
|
+
"component:ds-bar-title",
|
|
7758
7833
|
"component:ds-panel-tools",
|
|
7759
7834
|
"component:ds-shell-tools",
|
|
7760
7835
|
"component:ds-mobile-sheet-nav",
|
|
@@ -7784,6 +7859,10 @@
|
|
|
7784
7859
|
"The application router owns the current route, authorization filtering, Dashboard or Settings context, destination collections, section collections, and localized content labels.",
|
|
7785
7860
|
"ShellApp renders the lower-level desktop, tablet, and mobile chrome, coordinates layout, gradient alignment, transitions, shortcuts, global surfaces, optional Inbox state, focus restoration, and mobile-stage visibility.",
|
|
7786
7861
|
"The application router owns authorization, current URLs, history, and route execution; ShellApp forwards navigation and page intent events without routing.",
|
|
7862
|
+
"sectionNavigation is an application-controlled preference: bar keeps route sections in BarNav, while panel renders them as nested PanelNav children and places compact BarTitle in the shell bar.",
|
|
7863
|
+
"Managed ShellApp derives ShellPage desktop header placement from sectionNavigation. Panel mode removes page-local title geometry, restores the standard responsive top gutter, and preserves full-bleed page content without requiring route-specific navigation branches.",
|
|
7864
|
+
"Switch sectionNavigation at runtime without replacing routed content or tool owners; the application owns preference storage and defaults new users to bar unless product policy says otherwise.",
|
|
7865
|
+
"In panel mode, supply the same route sections as children on their PanelNav parent and handle dsNavChildSelect as structured parent, child, and href navigation intent.",
|
|
7787
7866
|
"The application supplies each routed content owner and tool view once. ShellApp changes visibility, inert state, and presentation without recreating those nodes.",
|
|
7788
7867
|
"The optional banner slot accepts one application-owned ds-banner above the complete shell row. The application owns its open state, orientation for the current shell capacity, action consequences, dismissal persistence, and resolution when several messages compete.",
|
|
7789
7868
|
"Use composition=slotted only for advanced application architectures that intentionally own all lower-level chrome wiring.",
|
|
@@ -7793,15 +7872,18 @@
|
|
|
7793
7872
|
"Dashboard represents day-to-day operational work while Settings represents administrative and configuration work; route state selects the context.",
|
|
7794
7873
|
"Replace navigation and pageChrome together from one completed route state.",
|
|
7795
7874
|
"When pageChrome.showBack marks a detail depth, mobile chrome keeps the page heading as its identity and presents only local subsections; peer route tabs remain in desktop BarNav rather than replacing the detail heading.",
|
|
7796
|
-
"Managed ShellApp keeps
|
|
7797
|
-
"Route-owned pageChrome independently selects ShellPage contentInset,
|
|
7875
|
+
"Managed ShellApp keeps the selected desktop section-navigation presentation and ShellPage present and owns page header stickiness and the content scroller.",
|
|
7876
|
+
"Route-owned pageChrome independently selects ShellPage contentInset, page-header seams, scroll compaction, expanded and compact header-divider visibility, and contentSurface. ShellApp forwards them while resolving whether desktop title geometry is page-local or shell-bar-owned.",
|
|
7798
7877
|
"The application filters unauthorized destinations, sections, and tools before passing them into shell components."
|
|
7799
7878
|
],
|
|
7800
7879
|
"responsiveBehavior": [
|
|
7801
7880
|
"ShellApp owns the fixed system breakpoints and resolves desktop at 1200px and wider, tablet from 768px through 1199px, and mobile below 768px.",
|
|
7802
7881
|
"On desktop, PanelNav defaults expanded, permits user collapse or expansion, and respects the locally persisted desktop preference.",
|
|
7803
7882
|
"On tablet, ShellApp keeps PanelNav permanently collapsed and prevents user expansion without overwriting the desktop preference.",
|
|
7883
|
+
"On desktop and tablet, panel section navigation replaces BarNav with compact BarTitle; collapsed PanelNav exposes child sections through its anchored flyout.",
|
|
7884
|
+
"When panel section navigation moves BarTitle into the shell bar, routed content starts at the standard 32px desktop or 16px tablet gutter and ShellPage reports no page-local sticky-header height.",
|
|
7804
7885
|
"On mobile, ShellApp hides and inerts desktop chrome, uses a solid primary stage, and composes MobileHeader, MobileSheetNav, ShellTools, and the persistent MobileBarNav around the same application-owned content.",
|
|
7886
|
+
"Changing sectionNavigation never changes mobile chrome; the preference may still be edited by an application Settings page.",
|
|
7805
7887
|
"Opening MobileSheetNav temporarily overlays the active routed page or global tool; closing it without selecting an area restores that same destination and its nested state. The sheet exposes the router-derived current area only while the routed area owns the mobile stage, so a global tool never leaves an underlying route highlighted.",
|
|
7806
7888
|
"Selecting Help from the managed mobile sheet activates the configured Help tool and promotes Help to the primary mobile destination instead of forwarding it as route navigation.",
|
|
7807
7889
|
"Set navigation.showMobileAccount to false when the Settings destination collection already includes account and user preferences.",
|
|
@@ -7885,6 +7967,10 @@
|
|
|
7885
7967
|
"type": "PaperTextureConfig",
|
|
7886
7968
|
"required": false
|
|
7887
7969
|
},
|
|
7970
|
+
"sectionNavigation": {
|
|
7971
|
+
"type": "ShellSectionNavigation",
|
|
7972
|
+
"required": false
|
|
7973
|
+
},
|
|
7888
7974
|
"shortcutsEnabled": {
|
|
7889
7975
|
"type": "boolean",
|
|
7890
7976
|
"required": false
|
|
@@ -7911,6 +7997,10 @@
|
|
|
7911
7997
|
"name": "dsHeaderBack",
|
|
7912
7998
|
"detail": "{ tool: PanelToolsToolId }"
|
|
7913
7999
|
},
|
|
8000
|
+
{
|
|
8001
|
+
"name": "dsNavChildSelect",
|
|
8002
|
+
"detail": "PanelNavChildSelectDetail"
|
|
8003
|
+
},
|
|
7914
8004
|
{
|
|
7915
8005
|
"name": "dsNavFooterAction",
|
|
7916
8006
|
"detail": "void"
|
|
@@ -8028,7 +8118,7 @@
|
|
|
8028
8118
|
],
|
|
8029
8119
|
"accessibility": [
|
|
8030
8120
|
"ShellPage exposes the routed page as the main landmark; render exactly one active ShellPage inside ShellApp.",
|
|
8031
|
-
"Provide one BarTitle or BarWorkflow through the desktop header slot and one MobileHeader through mobile-header when the page participates in the mobile shell.",
|
|
8121
|
+
"Provide one BarTitle or BarWorkflow through the desktop header slot when desktopHeaderPlacement=page, and one MobileHeader through mobile-header when the page participates in the mobile shell.",
|
|
8032
8122
|
"Keep loading, empty, validation, error, progress, success, and failure communication in the default product-content slot.",
|
|
8033
8123
|
"Responsive variant changes preserve the same heading, controls, accessible names, and keyboard focus targets."
|
|
8034
8124
|
],
|
|
@@ -8036,6 +8126,7 @@
|
|
|
8036
8126
|
"headerCapacity=roomy, compact, or constrained is supplied before paint by the owning application shell and describes the page-header space available after viewport and shell-chrome policy are applied.",
|
|
8037
8127
|
"headerPresentation=auto selects the matching header variant from headerCapacity and scroll position.",
|
|
8038
8128
|
"expanded, compact, and constrained are explicit overrides for exceptional layouts and deterministic examples.",
|
|
8129
|
+
"desktopHeaderPlacement=page preserves page-local sticky title geometry. shell-bar declares that desktop and tablet title chrome is external and compact, restores the responsive top gutter, reports zero page-header block size, and disables page-header scroll compaction while preserving downstream compact-header behavior and full-bleed content.",
|
|
8039
8130
|
"contentInset=default supplies standard page gutters; none permits maps, canvases, and other full-bleed content.",
|
|
8040
8131
|
"contentInsetBlockStart=none removes only the gutter adjacent to the page header while retaining the responsive inline and bottom gutters.",
|
|
8041
8132
|
"contentInsetBlockStartSize can provide an exact roomy top seam, while compactContentInsetBlockStartSize independently defines the compact and constrained seam. ShellPage exposes their resolved sticky-header offset through --ds-shell-page-content-block-start-offset for viewport-fitted descendants.",
|
|
@@ -8052,6 +8143,7 @@
|
|
|
8052
8143
|
"responsiveMode=mobile hides and inerts the desktop header, exposes mobile-header, and disables desktop scroll-compaction geometry.",
|
|
8053
8144
|
"Update headerCapacity synchronously with shell layout state so opening tools or crossing application breakpoints cannot briefly render the wrong presentation.",
|
|
8054
8145
|
"The default content inset is balanced on every side: 32px in desktop mode and 16px in tablet and mobile modes.",
|
|
8146
|
+
"When desktopHeaderPlacement=shell-bar, desktop and tablet ignore page-header-specific block-start seam overrides and expose --ds-shell-page-content-block-start-offset as the responsive gutter only; mobile keeps its MobileHeader geometry and existing seam.",
|
|
8055
8147
|
"contentInsetBlockStart can independently remove the top gutter for table and canvas pages that should meet the sticky header; exact roomy and compact block-start sizes support pages whose seam changes with header capacity.",
|
|
8056
8148
|
"The selected content surface persists unchanged across desktop, tablet, and mobile modes.",
|
|
8057
8149
|
"On a secondary desktop or tablet page, BarTitle matches the page canvas across capacity and scroll-driven variant changes; the separate mobile-header presentation remains primary.",
|
|
@@ -8063,7 +8155,7 @@
|
|
|
8063
8155
|
],
|
|
8064
8156
|
"frameworkCaveats": {
|
|
8065
8157
|
"customElements": [
|
|
8066
|
-
"Import ShellPage with BarTitle or BarWorkflow in slot=header and MobileHeader in slot=mobile-header, then render route content as default children.",
|
|
8158
|
+
"Import ShellPage with BarTitle or BarWorkflow in slot=header when desktopHeaderPlacement=page and MobileHeader in slot=mobile-header, then render route content as default children.",
|
|
8067
8159
|
"Do not set BarTitle.variant while ShellPage owns headerPresentation."
|
|
8068
8160
|
],
|
|
8069
8161
|
"react": [
|
|
@@ -8111,6 +8203,10 @@
|
|
|
8111
8203
|
"type": "ShellPageContentSurface",
|
|
8112
8204
|
"required": false
|
|
8113
8205
|
},
|
|
8206
|
+
"desktopHeaderPlacement": {
|
|
8207
|
+
"type": "ShellPageDesktopHeaderPlacement",
|
|
8208
|
+
"required": false
|
|
8209
|
+
},
|
|
8114
8210
|
"headerCapacity": {
|
|
8115
8211
|
"type": "ShellPageCapacity",
|
|
8116
8212
|
"required": false
|
|
@@ -9020,6 +9116,7 @@
|
|
|
9020
9116
|
"A missing, empty, inactive, or unknown selected value is invalid when enabled tabs exist; the component does not choose a fallback selection.",
|
|
9021
9117
|
"Selection is singular and follows keyboard focus.",
|
|
9022
9118
|
"Width follows the shared control contract: hug keeps the track content-sized, while fill occupies the parent width and distributes available space equally across selectable segments; dividers remain fixed-width separators.",
|
|
9119
|
+
"hasContainer defaults to true. Set it to false only when a parent surface owns the track background and boundary; the outer fill, border, and inset disappear while selected-pill, interaction, focus, density, and keyboard behavior remain unchanged.",
|
|
9023
9120
|
"Small, medium, and large use the shared 24px, 32px, and 40px control-density recipes for the outer track. Each segment uses the same-size inset recipe at 20px, 28px, and 36px while preserving that density's typography, icon, gap, and label metrics.",
|
|
9024
9121
|
"Use one consistent content variant across every selectable tab in a group.",
|
|
9025
9122
|
"Omitted background is for primary and secondary surfaces; pass the faint context explicitly on faint surfaces.",
|
|
@@ -9063,6 +9160,10 @@
|
|
|
9063
9160
|
"type": "TabBackground | undefined",
|
|
9064
9161
|
"required": false
|
|
9065
9162
|
},
|
|
9163
|
+
"hasContainer": {
|
|
9164
|
+
"type": "boolean",
|
|
9165
|
+
"required": false
|
|
9166
|
+
},
|
|
9066
9167
|
"size": {
|
|
9067
9168
|
"type": "TabGroupSize",
|
|
9068
9169
|
"required": false
|
|
@@ -9108,7 +9209,7 @@
|
|
|
9108
9209
|
{
|
|
9109
9210
|
"name": "table",
|
|
9110
9211
|
"title": "Table",
|
|
9111
|
-
"description": "Semantic, controlled data table with durable visual primitives for cell geometry, grouping, sorting, multi-selection, sticky overflow, incremental loading, top-level pagination, and optional row virtualization.",
|
|
9212
|
+
"description": "Semantic, controlled data table with durable visual primitives for cell geometry, wrapping multiple-Tag cells, grouping, sorting, multi-selection, sticky overflow, incremental loading, top-level pagination, and optional row virtualization.",
|
|
9112
9213
|
"type": "registry:ui",
|
|
9113
9214
|
"meta": {
|
|
9114
9215
|
"library": "@ds-mo/ui",
|
|
@@ -9119,7 +9220,7 @@
|
|
|
9119
9220
|
"intent": {
|
|
9120
9221
|
"audience": "general",
|
|
9121
9222
|
"status": "stable",
|
|
9122
|
-
"summary": "Semantic, controlled data table with durable visual primitives for cell geometry, grouping, sorting, multi-selection, sticky overflow, incremental loading, top-level pagination, and optional row virtualization.",
|
|
9223
|
+
"summary": "Semantic, controlled data table with durable visual primitives for cell geometry, wrapping multiple-Tag cells, grouping, sorting, multi-selection, sticky overflow, incremental loading, top-level pagination, and optional row virtualization.",
|
|
9123
9224
|
"useWhen": [
|
|
9124
9225
|
"A structured dataset needs native row and column relationships, optional one-level grouping, or comparable values across records.",
|
|
9125
9226
|
"An application needs controlled sorting, loaded-row selection, infinite loading, pagination, virtual row recycling, or opted-in table-owned data-mode and column controls while retaining ownership of the data query, catalog, and persistence.",
|
|
@@ -9154,15 +9255,16 @@
|
|
|
9154
9255
|
"The rendered structure uses a native table, caption, column headers, row groups, and data cells; keep the caption non-empty. The native caption remains visually hidden as the table's accessible name. When caption visibility is enabled, a 48px header bar renders as component chrome outside the data scrollport. It defaults to a presentational caption title that does not duplicate the accessible name. Application-owned labeled controls supplied through the single named header slot replace that fallback and share one horizontal caption overflow row with table-owned actions inside the component-owned 8px inset. Table caption buttons keep pressed interaction paint without physically scaling. When columnCustomizer is enabled, the table adds a trailing Customize control named Customize table. Its label uses regular weight and its resting foreground remains neutral when hidden or reordered columns differ from the catalog default. The control is icon-label at typical widths and the icon-only Table menu button below 900px, where a tooltip preserves the Customize label. The always-icon-only table-variant control also exposes its label through a tooltip. Otherwise the header slot receives the complete content width.",
|
|
9155
9256
|
"The data-mode switcher is the shared Menu of the table's supported infinite, pagination, and virtual modes. It uses an Ellipses trigger. The switcher is the final caption-bar action; when the column customizer is also present, a decorative vertical divider separates the two controls. dataMode remains controlled, and the application responds to change intent by supplying the matching records, pagination state, loading behavior, and query consequences. Escape, dismissal, and selection return focus to the trigger.",
|
|
9156
9257
|
"The column customizer is the shared Menu of switch rows, not a table-owned dialog. Data columns can be shown, hidden, and reordered. Action columns and the selection checkbox never appear in the menu. The last remaining visible data column cannot be hidden, but it stays focusable so it can still be reordered. Escape and outside click restore focus to the trigger. Persistence stays in the application.",
|
|
9157
|
-
"Sorting controls remain buttons inside column headers and expose the table's one controlled member-row sort through aria-sort. ds-table-sort in the toolbar trailing cluster is the matching menu of Data and Direction sections; it emits the same dsSortChange shape so header clicks and menu choices stay in sync. Grouping never adds a second sort indicator or header control; the
|
|
9258
|
+
"Sorting controls remain buttons inside column headers and expose the table's one controlled member-row sort through aria-sort. ds-table-sort in the toolbar trailing cluster is the matching menu of Data and Direction sections; it emits the same dsSortChange shape so header clicks and menu choices stay in sync. Grouping never adds a second sort indicator or header control; ds-table-group controls the grouping data point and ascending or descending group-section order while the application supplies the resulting groups. Optional column help underlines the header label with the shared dotted decoration and shows ds-tooltip from that label; it does not add a second header control or replace the column name.",
|
|
9158
9259
|
"Selection controls expose checkbox semantics and explicit row names; select-all affects selectable loaded rows only and preserves selected identities outside the loaded window. In virtual mode the supplied in-memory rows are that loaded set, including rows whose DOM is recycled. When grouping is active with multi-selection, each group section header also exposes a checkbox that selects or clears that group's selectable loaded rows.",
|
|
9159
9260
|
"Interactive rows are focusable as native rows, activate with Enter or Space, and do not steal activation from their nested selection, action, overflow-menu, or primary-text link controls.",
|
|
9160
9261
|
"Scrollable table regions become keyboard focusable and named only when overflow exists.",
|
|
9161
9262
|
"Incremental loading, newly appended row counts, failures, and end-of-results transitions are announced through a polite status region without replacing visible state. In grouped tables, announcements name the independently loading group.",
|
|
9263
|
+
"Applications may pass their controlled literal search terms through highlightTerms after applying their own filtering. When TableSearch scopes the query, pass the same selected field identities through highlightFieldIds. A compound column maps its ordered headerSegments to primary, secondary-run, and tertiary-run data points; simple columns map their column ID to every owned text track. With no highlightFieldIds every text track remains eligible. Matching text is rendered with semantic mark elements, so the emphasis is identifiable independently of its faint-brand background and bold-brand foreground. Highlight markup preserves source order, the cell's complete accessible text, and does not create extra announcements.",
|
|
9162
9264
|
"Static and infinite tables may show an optional result summary footer when displayedCount and totalCount are finite. Virtual mode shows a total-only summary and ignores displayedCount. Pagination mode instead renders a named Pagination control with a compact selected-size total, vertical divider, and page position; range changes are announced independently with complete phrasing. Unmodified Left and Right Arrow request the adjacent page while focus is inside a paginated table or on a containing page scroller that owns it; editable fields, choice controls, sliders, open menus, and modified key combinations retain their own keyboard behavior. A table-owned footer slot can replace summary copy, while footer-leading and footer-trailing remain available in the same compact-bar anatomy. Nested dialog footers are ignored."
|
|
9163
9265
|
],
|
|
9164
9266
|
"states": [
|
|
9165
|
-
"Columns, rows, groups, grouping, sorting, selected row IDs, collapsed group IDs, hiddenColumnIds, columnOrder, dataMode, pagination, displayedCount, totalCount, and incremental-loading state are controlled inputs. Events communicate intent and never mutate those inputs. The optional header is one composable table-local surface: the component owns its 48px chrome, 8px inset on every side, and sticky placement while the application owns the leading slot's internal layout, controls, labels, filtering behavior, and action handling. Opting into dataModeSwitcher and columnCustomizer adds their trailing Menu triggers and requires caption visibility. When both are present, Customize precedes a decorative divider and the data-mode trigger remains the final action. The Customize trigger keeps one stable label and neutral resting foreground whether or not hiddenColumnIds or columnOrder differ from the catalog default; the configured state remains visible inside the Menu. The table closes one trailing Menu before opening the other. The footer retains its compact-bar composition: application-owned leading status sits left while a controlled result summary or Pagination aligns right, before any trailing action. Content-sized tables remain natural for sparse or fixed-count results. height bounds the complete header, frame, and footer composition. fitViewport reserves the compact-state composition height in the nearest vertical scrollport while growing the visible table into that reservation as surrounding page chrome collapses.",
|
|
9267
|
+
"Columns, rows, groups, grouping, sorting, selected row IDs, collapsed group IDs, highlightTerms, highlightFieldIds, hiddenColumnIds, columnOrder, dataMode, pagination, displayedCount, totalCount, and incremental-loading state are controlled inputs. Events communicate intent and never mutate those inputs. The optional header is one composable table-local surface: the component owns its 48px chrome, 8px inset on every side, and sticky placement while the application owns the leading slot's internal layout, controls, labels, filtering behavior, and action handling. highlightTerms only marks matching table-owned text and never filters rows, changes query semantics, or highlights Tag labels. highlightFieldIds optionally narrows that marking to matching column IDs or compound header-segment sort keys. Opting into dataModeSwitcher and columnCustomizer adds their trailing Menu triggers and requires caption visibility. When both are present, Customize precedes a decorative divider and the data-mode trigger remains the final action. The Customize trigger keeps one stable label and neutral resting foreground whether or not hiddenColumnIds or columnOrder differ from the catalog default; the configured state remains visible inside the Menu. The table closes one trailing Menu before opening the other. The footer retains its compact-bar composition: application-owned leading status sits left while a controlled result summary or Pagination aligns right, before any trailing action. Content-sized tables remain natural for sparse or fixed-count results. height bounds the complete header, frame, and footer composition. fitViewport reserves the compact-state composition height in the nearest vertical scrollport while growing the visible table into that reservation as surrounding page chrome collapses.",
|
|
9166
9268
|
"Grouping supports one level. The application supplies groups in a fixed product-defined order and supplies ordered member rows independently. Group section headers show an emphasized text-body-medium label followed by a middle dot and plain secondary loaded progress, for example Critical · 50 of 166. The loaded value comes from the supplied member rows and the total comes from totalCount. A localized countLabel total phrase remains available for the complete assistive progress announcement. Virtual mode shows totals only, for example Critical · 166, because there is no loaded window. Groups may declare an optional intent (brand, neutral, negative, warning, caution, positive) that paints an LTR gradient from the faint intent surface at the label edge into faint neutral at the trailing edge, plus a bold intent title color. Neutral groups remain solid faint neutral. Section separators are painted inside that viewport-width surface so translucent border tokens composite with each intent background. Internal sections keep their separators; a collapsed or empty section header yields its separator only when it is the table's final rendered item. A trailing visually neutral icon-only ButtonUnfilled uses the 24px md double-inset action recipe and toggles controlled collapsedGroupIds, showing ChevronUp while expanded and ChevronDown while collapsed. While any group is expanded, a ChevronDownUp action uses the xs sort-control recipe widened to a table-owned 24px lane and collapses every group. It appears at the inline-end edge of the trailing column declared with kind action when one exists; otherwise a button-hugging 24px by 16px medium-elevation surface floats at the visible scrollport's header edge so the action remains reachable while member columns scroll beneath it. With stickyHeader enabled, each contained section uses its one real section row as a native sticky header inside its real row-group boundary. The browser therefore owns pinning, push-off, scrolling, and resize layout in one pass without a duplicated lane, active-section state, transforms, or scroll-time geometry. Shared grid tracks retain exact header and member-cell alignment. The section surface also stays pinned to the visible horizontal scrollport and spans the smaller of the visible viewport or table width. Virtual grouped tables flatten headers and members into that same scrollport; expanding a section never introduces an inner scroller.",
|
|
9167
9269
|
"When columnCustomizer is false, columns render in catalog order. When it is true, columns remains the catalog: hiddenColumnIds and columnOrder control visibility and data-column sequence, action columns stay last, cannot be hidden, and remain absent from the customizer Menu, and dsColumnsConfigChange reports the next hidden ids and data-column order without mutating those inputs. The customizer Menu live-applies show/hide and data-column reorder. The table does not persist preferences.",
|
|
9168
9270
|
"An active member sort toggles only between ascending and descending; activating a different sortable label moves the one sorting state to that key. Applications may still clear the controlled sort state explicitly. Grouping does not introduce another interactive direction.",
|
|
@@ -9172,7 +9274,7 @@
|
|
|
9172
9274
|
"When pagination enables Fit to page on a bounded table, the table proposes the number of complete top-level rows that fit below its column header. Grouped tables count group headers only; member rows never affect capacity. Selecting Fit captures that numeric snapshot. A changed fitIdentity requests one fresh snapshot for a new query shape, while viewport resizing alone does not change the active controlled page size.",
|
|
9173
9275
|
"Rows opt into complete-row activation with interactive and emit dsRowActivate without owning navigation. Selection paints through the shared selected ::before layer; interactive hover and press paint through the shared ::after layer.",
|
|
9174
9276
|
"Row selection owns the single sticky start lane. One explicitly sized application column can own the sticky end lane, or the start lane when selection is absent. Each sticky boundary owns one fixed divider and a row-clipped directional shadow that paints into the adjacent scrolling columns only while more inline content remains beyond that edge.",
|
|
9175
|
-
"Cells accept scalar content, standard primary-and-secondary or dual-primary text primitives, declarative Tag, icon-only, icon-and-text, 16:9 Image, or ButtonUnfilled Action content, or explicit Empty and Blank absence values. Text objects may declare an optional href (and target) on the primary track only; the table renders a native anchor with the shared brand text-action treatment when the URL is safe, and leaves scalars unlinked. Standard secondary copy defaults to the secondary foreground and may declare a semantic Text color when the application data carries intent; an optional tertiary track uses the same subdued body-small recipe as secondary. Secondary and tertiary may also be a short list of colorable runs, rendered on one line with the table's middle-dot separator. Dual-primary copy keeps both tracks primary unless explicitly colored and does not gain a tertiary track. Body data cells share 8px outer padding; header and group rows keep their own geometry. Text tracks, including Empty, keep 4px inline padding so copy lines up with column-header labels; Tag and icon-only tracks stay on the 8px cell chrome alone. Icon-and-text cells (`kind: 'icon-text'`) place one md prefix icon beside the same copy stack as a text cell. The icon slot takes 2px padding on every side, then a 2px flex gap before the copy; text-track padding stays on the copy. Omit iconLabel when the glyph is decorative. 20px content (body-medium text, md icon, and the row checkbox) sits in a 24px track so it stays optically aligned with 24px Tag and Action content. Single-track text, selection, tag-only, icon-only, icon-and-text, Action, Empty, Blank, and 1-track Image cells resolve a 40px base contract while two-track cells grow to 62px and three-track cells grow to 84px. Tracks stack with a 2px gap. Wrapping primary on a 1-track cell uses that same rhythm: two wrapped lines share the 62px row and three wrapped lines share the 84px row. Wrapping secondary keeps primary on the first track and consumes later tracks: two secondary lines share the 84px row and three secondary lines share a 106px fourth track. Keep the same track count in every row of a table or group when those rows should share one height. Tag cells use the inset Tag recipe: md double-inset is a 24px control for tag-only and tag-with-text, while text-with-tag uses sm single-inset at 20px so the second-track pill fills the body-small slot. Action cells primarily use an icon-only Ellipses treatment, render a 24px small ButtonUnfilled, default to unbordered, and emit row, column, and action identities through dsCellAction. When an action cell declares items, that Ellipses trigger opens the shared ds-menu for commands, dividers, inactive rows, and destructive rows instead of emitting on click; choosing a command emits dsCellAction with that item's actionId. Omit items to keep a single-shot control. Image cells declare tracks 1, 2, or 3 so the 16:9 bordered preview fills that body-row content box (cell height minus 8px padding) and the column hugs the resulting width; omit tracks for the 1-track recipe, and keep image tracks aligned with the other cells in the table or group. Image cells fall back to an accessible placeholder when no source is supplied. Empty means the data applies but has no value and renders an em dash with localized assistive text; Blank means the data is not applicable and renders no content. Nullish values remain backward-compatible Empty values. Stable type and
|
|
9277
|
+
"Cells accept scalar content, standard primary-and-secondary or dual-primary text primitives, declarative Tag, wrapping multiple-Tag content, icon-only, icon-and-text, 16:9 Image, or ButtonUnfilled Action content, or explicit Empty and Blank absence values. Text objects may declare an optional href (and target) on the primary track only; the table renders a native anchor with the shared brand text-action treatment when the URL is safe, and leaves scalars unlinked. Standard secondary copy defaults to the secondary foreground and may declare a semantic Text color when the application data carries intent; an optional tertiary track uses the same subdued body-small recipe as secondary. Secondary and tertiary may also be a short list of colorable runs, rendered on one line with the table's middle-dot separator. Dual-primary copy keeps both tracks primary unless explicitly colored and does not gain a tertiary track. Body data cells share 8px outer padding; header and group rows keep their own geometry. Text tracks, including Empty, keep 4px inline padding so copy lines up with column-header labels; Tag and icon-only tracks stay on the 8px cell chrome alone. Icon-and-text cells (`kind: 'icon-text'`) place one md prefix icon beside the same copy stack as a text cell. The icon slot takes 2px padding on every side, then a 2px flex gap before the copy; text-track padding stays on the copy. Omit iconLabel when the glyph is decorative. 20px content (body-medium text, md icon, and the row checkbox) sits in a 24px track so it stays optically aligned with 24px Tag and Action content. Single-track text, selection, tag-only, icon-only, icon-and-text, Action, Empty, Blank, and 1-track Image cells resolve a 40px base contract while two-track cells grow to 62px and three-track cells grow to 84px. Every later track adds 22px, so four tracks resolve to 106px, five to 128px, and the sequence may continue. Tracks stack with a 2px gap. Wrapping primary on a 1-track cell uses that same rhythm: two wrapped lines share the 62px row and three wrapped lines share the 84px row. Wrapping secondary keeps primary on the first track and consumes later tracks: two secondary lines share the 84px row and three secondary lines share a 106px fourth track. Keep the same track count in every row of a table or group when those rows should share one height. Tag cells use the inset Tag recipe: md double-inset is a 24px control for tag-only and tag-with-text, while text-with-tag uses sm single-inset at 20px so the second-track pill fills the body-small slot. Multiple-Tag cells use `kind: 'tags'`, a positive `tracks` count, and small single-inset Tags that wrap naturally at the column edge. Their 2px block inset creates the 24px first track and each later wrapped line adds a 20px track plus the shared 2px gap. The tallest cell establishes the native row height, so all sibling cells match even at four, five, or more tracks; virtual tables use the declared count as the initial estimate and measure responsive wrapping after paint. Action cells primarily use an icon-only Ellipses treatment, render a 24px small ButtonUnfilled, default to unbordered, and emit row, column, and action identities through dsCellAction. When an action cell declares items, that Ellipses trigger opens the shared ds-menu for commands, dividers, inactive rows, and destructive rows instead of emitting on click; choosing a command emits dsCellAction with that item's actionId. Omit items to keep a single-shot control. Image cells declare tracks 1, 2, or 3 so the 16:9 bordered preview fills that body-row content box (cell height minus 8px padding) and the column hugs the resulting width; omit tracks for the 1-track recipe, and keep image tracks aligned with the other cells in the table or group. Image cells fall back to an accessible placeholder when no source is supplied. Empty means the data applies but has no value and renders an em dash with localized assistive text; Blank means the data is not applicable and renders no content. Nullish values remain backward-compatible Empty values. Stable type, variant, and track-count hooks keep every cell family independently styleable.",
|
|
9176
9278
|
"The public @ds-mo/ui/table.css export is the authoritative zero-specificity visual recipe. Override its --ds-table-* properties or target its stable element classes for product-specific styling."
|
|
9177
9279
|
],
|
|
9178
9280
|
"responsiveBehavior": [
|
|
@@ -9181,14 +9283,14 @@
|
|
|
9181
9283
|
"stickyHeader follows the active vertical scroll owner: a maxHeight, height, or fitViewport table keeps its native header and group sections inside one bounded table scrollport, while a document-flow table retains a semantic native header and renders a sticky control header whose columns follow the body's native inline scroll timeline. Consumers set --ds-table-sticky-header-offset when page chrome occupies an unbounded document scrollport edge. When the 48px table header bar is visible, it sticks at that external offset and the column header stacks immediately below it.",
|
|
9182
9284
|
"fitViewport uses viewportInsetBlockStart and viewportInsetBlockEnd to describe compact surrounding chrome and page gutters relative to the nearest vertical scroll owner. Before the table reaches that compact position, its host reserves the eventual height while the visible composition grows and vertical input remains owned by the outer page. Once settled, the internal table viewport becomes the vertical scroll owner. Bounded grouped tables use browser-native sticky section rows inside real block row-group boundaries, so scroll and resize do not run component JavaScript or trigger reactive section swaps. Document-flow tables retain the synchronized visual lane required by their separate horizontal scrollport.",
|
|
9183
9285
|
"Without maxHeight the table grows the document and automatic lazy loading observes the browser viewport. Horizontal scrolling chains vertical wheel and trackpad movement to the page instead of trapping it.",
|
|
9184
|
-
"Explicit column sizes establish the horizontal overflow width; unsized columns share remaining space. Set imageTracks on an image column to derive its fixed width from the matching 1-, 2-, or 3-track 16:9 image geometry plus table cell padding instead of copying a numeric width.",
|
|
9286
|
+
"Explicit column sizes establish the horizontal overflow width; unsized columns share remaining space. When every visible data column is explicitly sized, one internal presentational spacer absorbs unused inline space without stretching the final data column and collapses to zero when those widths introduce horizontal overflow. The spacer sits before trailing action and sticky-end lanes so those controls remain at the visible edge. Set imageTracks on an image column to derive its fixed width from the matching 1-, 2-, or 3-track 16:9 image geometry plus table cell padding instead of copying a numeric width.",
|
|
9185
9287
|
"Prefer the named xs through xl column sizes, which resolve through TokoMo's table-column width tokens; numeric pixel sizes remain an escape hatch for exceptional application-owned widths.",
|
|
9186
|
-
"Column headers use one 32px geometry. Body rows use a 40px single-track minimum with shared 8px cell padding; additional
|
|
9288
|
+
"Column headers use one 32px geometry. Body rows use a 40px single-track minimum with shared 8px cell padding; every additional track adds 22px and grows the complete native row so sibling cells match. Image previews fill the same content box as their declared track count. Wrapping multiple-Tag cells may declare any positive track count. The second text track and the third text track share one subdued body-small recipe so line 3 lines up with line 2.",
|
|
9187
9289
|
"Long content truncates to one line by default. Hover (or keyboard-focus a primary link) shows the omitted value in one table-owned tooltip when that track overflows. maxLines 2 or 3 wrap onto the named 2-track and 3-track row heights, then ellipsize with the same tooltip. wrap: true remains unlimited and does not show a truncation tooltip. Wrapping 1-track primary occupies the named 2-track and 3-track row heights instead of a private line-height scale. Wrapping secondary on a 2-track cell occupies the named 3-track row and a 106px fourth track for three lines."
|
|
9188
9290
|
],
|
|
9189
9291
|
"frameworkCaveats": {
|
|
9190
9292
|
"customElements": [
|
|
9191
|
-
"Assign columns, rows, groups, grouping, sort, selectedRowIds, collapsedGroupIds, hiddenColumnIds, columnOrder, pagination, displayedCount, and totalCount through JavaScript properties rather than HTML attribute strings.",
|
|
9293
|
+
"Assign columns, rows, groups, grouping, sort, selectedRowIds, collapsedGroupIds, highlightTerms, highlightFieldIds, hiddenColumnIds, columnOrder, pagination, displayedCount, and totalCount through JavaScript properties rather than HTML attribute strings.",
|
|
9192
9294
|
"dataMode=virtual recycles row DOM over the supplied in-memory rows or groups and requires height, maxHeight, or fitViewport. It does not fetch or paginate.",
|
|
9193
9295
|
"When an action cell supplies items, the table opens one shared ds-menu from the Ellipses trigger; dsCellAction fires for the selected command, not for opening or closing the menu.",
|
|
9194
9296
|
"When columnCustomizer is enabled, the Table trigger opens the same shared ds-menu of reorderable switch rows; toggling a switch or reordering a row emits dsColumnsConfigChange and does not close the menu.",
|
|
@@ -9344,6 +9446,14 @@
|
|
|
9344
9446
|
"type": "string[]",
|
|
9345
9447
|
"required": false
|
|
9346
9448
|
},
|
|
9449
|
+
"highlightFieldIds": {
|
|
9450
|
+
"type": "string[]",
|
|
9451
|
+
"required": false
|
|
9452
|
+
},
|
|
9453
|
+
"highlightTerms": {
|
|
9454
|
+
"type": "string[]",
|
|
9455
|
+
"required": false
|
|
9456
|
+
},
|
|
9347
9457
|
"infiniteModeLabel": {
|
|
9348
9458
|
"type": "string",
|
|
9349
9459
|
"required": false
|
|
@@ -9526,7 +9636,7 @@
|
|
|
9526
9636
|
{
|
|
9527
9637
|
"name": "table-filter",
|
|
9528
9638
|
"title": "TableFilter",
|
|
9529
|
-
"description": "Standard table-toolbar Filter control that owns the shared trigger, filter
|
|
9639
|
+
"description": "Standard table-toolbar Filter control that owns the shared trigger, searchable non-date filter options, accessible defaults, and compact-caption behavior while the application controls data and values.",
|
|
9530
9640
|
"type": "registry:ui",
|
|
9531
9641
|
"meta": {
|
|
9532
9642
|
"library": "@ds-mo/ui",
|
|
@@ -9537,7 +9647,7 @@
|
|
|
9537
9647
|
"intent": {
|
|
9538
9648
|
"audience": "general",
|
|
9539
9649
|
"status": "stable",
|
|
9540
|
-
"summary": "Standard table-toolbar Filter control that owns the shared trigger, filter
|
|
9650
|
+
"summary": "Standard table-toolbar Filter control that owns the shared trigger, searchable non-date filter options, accessible defaults, and compact-caption behavior while the application controls data and values.",
|
|
9541
9651
|
"useWhen": [
|
|
9542
9652
|
"A table toolbar should expose the standard singular Filter control and shared filter-menu interaction.",
|
|
9543
9653
|
"A product supplies filter definitions and controlled values but should not recreate the toolbar trigger, category navigation, or responsive treatment."
|
|
@@ -9567,12 +9677,14 @@
|
|
|
9567
9677
|
"accessibility": [
|
|
9568
9678
|
"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.",
|
|
9569
9679
|
"The popup retains ds-filter-menu category navigation, option semantics, focus entry, dismissal, and focus return, and aligns its start edge with the trigger.",
|
|
9570
|
-
"Localize label, menuLabel, categoriesLabel, and
|
|
9680
|
+
"Localize label, menuLabel, categoriesLabel, clearLabel, searchPlaceholder, and noResultsText together so visible and accessible wording remains consistent."
|
|
9571
9681
|
],
|
|
9572
9682
|
"states": [
|
|
9573
|
-
"filters, values, and activeFilterId are controlled. dsChange, dsClear, and dsActiveFilterChange report intent without changing those inputs; the application applies query consequences and returns replacement values.",
|
|
9683
|
+
"filters, values, matchModes, and activeFilterId are controlled. dsChange, dsMatchModeChange, dsClear, and dsActiveFilterChange report intent without changing those inputs; the application applies query consequences and returns replacement values.",
|
|
9574
9684
|
"The visible trigger label stays singular Filter without appending an active-count suffix. Active criteria promote only the visible label from secondary to primary, matching the other table caption controls without redefining generic button active semantics.",
|
|
9575
9685
|
"The popup reserves a visually empty footer row inside the category pane for every state. Active criteria reveal its divider and only a left-aligned Clear action, without adding popup height or showing redundant selected-count copy; the option pane retains its full column.",
|
|
9686
|
+
"Every multiple-choice category exposes a right-pane footer where the blue any or all word toggles its controlled match mode. any is the default OR mode; the application applies the requested mode to its query.",
|
|
9687
|
+
"Every non-date category exposes a 40px secondary-background search header that filters its displayed option labels and descriptions without changing controlled filter values. Date retains only its Relative and Range header.",
|
|
9576
9688
|
"Date categories use the shared compact-header Range and Relative experience. Persist relative values semantically and resolve them from the product's current date whenever rows or saved views are applied.",
|
|
9577
9689
|
"Popup visibility follows the same mutable open and dsOpenChange contract as ds-filter-menu."
|
|
9578
9690
|
],
|
|
@@ -9582,13 +9694,13 @@
|
|
|
9582
9694
|
],
|
|
9583
9695
|
"frameworkCaveats": {
|
|
9584
9696
|
"customElements": [
|
|
9585
|
-
"Assign filters, values, and activeFilterId as JavaScript properties. Replace controlled values in response to dsChange and dsClear."
|
|
9697
|
+
"Assign filters, values, matchModes, and activeFilterId as JavaScript properties. Replace controlled values and modes in response to dsChange, dsMatchModeChange, and dsClear."
|
|
9586
9698
|
],
|
|
9587
9699
|
"react": [
|
|
9588
|
-
"Keep filters and
|
|
9700
|
+
"Keep filters, values, and matchModes in application state and replace them from the typed dsChange, dsMatchModeChange, and dsClear events."
|
|
9589
9701
|
],
|
|
9590
9702
|
"angular": [
|
|
9591
|
-
"Import the generated DsTableFilter adapter, bind filters and
|
|
9703
|
+
"Import the generated DsTableFilter adapter, bind filters, values, and matchModes, and handle dsChange, dsMatchModeChange, dsClear, and dsActiveFilterChange."
|
|
9592
9704
|
]
|
|
9593
9705
|
},
|
|
9594
9706
|
"references": [
|
|
@@ -9627,14 +9739,26 @@
|
|
|
9627
9739
|
"type": "string",
|
|
9628
9740
|
"required": false
|
|
9629
9741
|
},
|
|
9742
|
+
"matchModes": {
|
|
9743
|
+
"type": "FilterMenuMatchModes",
|
|
9744
|
+
"required": false
|
|
9745
|
+
},
|
|
9630
9746
|
"menuLabel": {
|
|
9631
9747
|
"type": "string | null",
|
|
9632
9748
|
"required": false
|
|
9633
9749
|
},
|
|
9750
|
+
"noResultsText": {
|
|
9751
|
+
"type": "string",
|
|
9752
|
+
"required": false
|
|
9753
|
+
},
|
|
9634
9754
|
"open": {
|
|
9635
9755
|
"type": "boolean",
|
|
9636
9756
|
"required": false
|
|
9637
9757
|
},
|
|
9758
|
+
"searchPlaceholder": {
|
|
9759
|
+
"type": "string",
|
|
9760
|
+
"required": false
|
|
9761
|
+
},
|
|
9638
9762
|
"values": {
|
|
9639
9763
|
"type": "FilterMenuValues",
|
|
9640
9764
|
"required": false
|
|
@@ -9661,6 +9785,10 @@
|
|
|
9661
9785
|
"name": "dsClose",
|
|
9662
9786
|
"detail": "void"
|
|
9663
9787
|
},
|
|
9788
|
+
{
|
|
9789
|
+
"name": "dsMatchModeChange",
|
|
9790
|
+
"detail": "FilterMenuMatchModeChangeDetail"
|
|
9791
|
+
},
|
|
9664
9792
|
{
|
|
9665
9793
|
"name": "dsOpenChange",
|
|
9666
9794
|
"detail": "boolean"
|
|
@@ -9682,6 +9810,141 @@
|
|
|
9682
9810
|
"filter-menu"
|
|
9683
9811
|
]
|
|
9684
9812
|
},
|
|
9813
|
+
{
|
|
9814
|
+
"name": "table-group",
|
|
9815
|
+
"title": "TableGroup",
|
|
9816
|
+
"description": "Two-panel toolbar control for choosing one table grouping data point and the ascending or descending order of its group sections.",
|
|
9817
|
+
"type": "registry:ui",
|
|
9818
|
+
"meta": {
|
|
9819
|
+
"library": "@ds-mo/ui",
|
|
9820
|
+
"distribution": "npm",
|
|
9821
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/table-group",
|
|
9822
|
+
"source": "src/wc/components/TableGroup/TableGroup.tsx",
|
|
9823
|
+
"intentStatus": "complete",
|
|
9824
|
+
"intent": {
|
|
9825
|
+
"audience": "general",
|
|
9826
|
+
"status": "stable",
|
|
9827
|
+
"summary": "Two-panel toolbar control for choosing one table grouping data point and the ascending or descending order of its group sections.",
|
|
9828
|
+
"useWhen": [
|
|
9829
|
+
"A table toolbar needs explicit control of one grouping level and its section order.",
|
|
9830
|
+
"Grouping data-point labels differ from compact table-header labels."
|
|
9831
|
+
],
|
|
9832
|
+
"avoidWhen": [
|
|
9833
|
+
"The table is not groupable.",
|
|
9834
|
+
"The application expects the component to rearrange rows or create group sections internally."
|
|
9835
|
+
],
|
|
9836
|
+
"alternatives": [
|
|
9837
|
+
{
|
|
9838
|
+
"when": "The choice is one submitted form value with no dependent order pane.",
|
|
9839
|
+
"component": "component:ds-select",
|
|
9840
|
+
"reason": "Select owns form-value semantics rather than table grouping state."
|
|
9841
|
+
}
|
|
9842
|
+
],
|
|
9843
|
+
"commonlyComposedWith": [
|
|
9844
|
+
"component:ds-table",
|
|
9845
|
+
"component:ds-table-toolbar",
|
|
9846
|
+
"component:ds-table-filter",
|
|
9847
|
+
"component:ds-table-sort"
|
|
9848
|
+
],
|
|
9849
|
+
"patterns": [
|
|
9850
|
+
"pattern:menu-trigger"
|
|
9851
|
+
],
|
|
9852
|
+
"accessibility": [
|
|
9853
|
+
"The trigger opens a named non-modal dialog. Data and Order are independently named single-selection listboxes.",
|
|
9854
|
+
"Up and Down move within the focused pane. Right moves from Data to Order when a group is active, Left returns to the selected Data row, and Escape closes the dialog and restores trigger focus.",
|
|
9855
|
+
"The right pane remains present before a group is active as one complete empty state without the Order heading, and explains that a group must be selected."
|
|
9856
|
+
],
|
|
9857
|
+
"states": [
|
|
9858
|
+
"options and grouping are controlled. dsGroupChange reports a complete TableGroupingState and dsClear requests null grouping without mutating either input.",
|
|
9859
|
+
"Selecting a new data point starts its order at ascending. Re-selecting the active data point preserves its direction.",
|
|
9860
|
+
"Selecting a data point or direction applies immediately and leaves the dialog open so the other pane can be changed."
|
|
9861
|
+
],
|
|
9862
|
+
"responsiveBehavior": [
|
|
9863
|
+
"Use in the trailing region of ds-table-toolbar.",
|
|
9864
|
+
"The trigger uses the shared caption-control button behavior and becomes icon-only in compact named table containers.",
|
|
9865
|
+
"Both panes remain present and their choice lists scroll within the collision-constrained popup."
|
|
9866
|
+
],
|
|
9867
|
+
"frameworkCaveats": {
|
|
9868
|
+
"customElements": [
|
|
9869
|
+
"Assign options and grouping as JavaScript properties and replace grouping from dsGroupChange or dsClear."
|
|
9870
|
+
],
|
|
9871
|
+
"react": [
|
|
9872
|
+
"Keep grouping in application state and replace it from dsGroupChange; set it to null from dsClear."
|
|
9873
|
+
],
|
|
9874
|
+
"angular": [
|
|
9875
|
+
"Import the generated DsTableGroup adapter and bind options and grouping as properties."
|
|
9876
|
+
]
|
|
9877
|
+
},
|
|
9878
|
+
"references": [
|
|
9879
|
+
{
|
|
9880
|
+
"label": "Review states",
|
|
9881
|
+
"path": "src/wc/components/TableGroup/TableGroup.stories.ts"
|
|
9882
|
+
},
|
|
9883
|
+
{
|
|
9884
|
+
"label": "Toolbar composition owner",
|
|
9885
|
+
"path": "src/wc/components/TableToolbar/TableToolbar.agent.json"
|
|
9886
|
+
}
|
|
9887
|
+
]
|
|
9888
|
+
},
|
|
9889
|
+
"props": {
|
|
9890
|
+
"ariaLabel": {
|
|
9891
|
+
"type": "string | null",
|
|
9892
|
+
"required": false
|
|
9893
|
+
},
|
|
9894
|
+
"clearLabel": {
|
|
9895
|
+
"type": "string",
|
|
9896
|
+
"required": false
|
|
9897
|
+
},
|
|
9898
|
+
"emptyMessage": {
|
|
9899
|
+
"type": "string",
|
|
9900
|
+
"required": false
|
|
9901
|
+
},
|
|
9902
|
+
"grouping": {
|
|
9903
|
+
"type": "TableGroupingState | null",
|
|
9904
|
+
"required": false
|
|
9905
|
+
},
|
|
9906
|
+
"open": {
|
|
9907
|
+
"type": "boolean",
|
|
9908
|
+
"required": false
|
|
9909
|
+
},
|
|
9910
|
+
"options": {
|
|
9911
|
+
"type": "TableGroupOption[]",
|
|
9912
|
+
"required": false
|
|
9913
|
+
}
|
|
9914
|
+
},
|
|
9915
|
+
"events": [
|
|
9916
|
+
{
|
|
9917
|
+
"name": "dsClear",
|
|
9918
|
+
"detail": "void"
|
|
9919
|
+
},
|
|
9920
|
+
{
|
|
9921
|
+
"name": "dsGroupChange",
|
|
9922
|
+
"detail": "TableGroupingState"
|
|
9923
|
+
},
|
|
9924
|
+
{
|
|
9925
|
+
"name": "dsOpenChange",
|
|
9926
|
+
"detail": "boolean"
|
|
9927
|
+
}
|
|
9928
|
+
],
|
|
9929
|
+
"slots": [],
|
|
9930
|
+
"exports": {
|
|
9931
|
+
"customElement": "ds-table-group",
|
|
9932
|
+
"react": "DsTableGroup",
|
|
9933
|
+
"vue": "DsTableGroup",
|
|
9934
|
+
"angular": "DsTableGroup"
|
|
9935
|
+
}
|
|
9936
|
+
},
|
|
9937
|
+
"dependencies": [
|
|
9938
|
+
"@ds-mo/ui",
|
|
9939
|
+
"@ds-mo/tokens"
|
|
9940
|
+
],
|
|
9941
|
+
"registryDependencies": [
|
|
9942
|
+
"button-unfilled",
|
|
9943
|
+
"empty-state",
|
|
9944
|
+
"input",
|
|
9945
|
+
"text"
|
|
9946
|
+
]
|
|
9947
|
+
},
|
|
9685
9948
|
{
|
|
9686
9949
|
"name": "table-saved-views",
|
|
9687
9950
|
"title": "TableSavedViews",
|
|
@@ -9833,6 +10096,151 @@
|
|
|
9833
10096
|
"select"
|
|
9834
10097
|
]
|
|
9835
10098
|
},
|
|
10099
|
+
{
|
|
10100
|
+
"name": "table-search",
|
|
10101
|
+
"title": "TableSearch",
|
|
10102
|
+
"description": "Controlled table-search editor with slash-invoked field scoping, removable inset field Chips, and an input-focused listbox keyboard model.",
|
|
10103
|
+
"type": "registry:ui",
|
|
10104
|
+
"meta": {
|
|
10105
|
+
"library": "@ds-mo/ui",
|
|
10106
|
+
"distribution": "npm",
|
|
10107
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/table-search",
|
|
10108
|
+
"source": "src/wc/components/TableSearch/TableSearch.tsx",
|
|
10109
|
+
"intentStatus": "complete",
|
|
10110
|
+
"intent": {
|
|
10111
|
+
"audience": "general",
|
|
10112
|
+
"status": "stable",
|
|
10113
|
+
"summary": "Controlled table-search editor with slash-invoked field scoping, removable inset field Chips, and an input-focused listbox keyboard model.",
|
|
10114
|
+
"useWhen": [
|
|
10115
|
+
"A data-table search needs optional field-specific scopes without replacing the application's filtering logic.",
|
|
10116
|
+
"People should be able to add one or more searchable data points through a slash command while continuing to type one free-text query."
|
|
10117
|
+
],
|
|
10118
|
+
"avoidWhen": [
|
|
10119
|
+
"A plain global text search is sufficient; use Input with type search.",
|
|
10120
|
+
"The choices are persistent filters with independent values; use TableFilter or Select instead.",
|
|
10121
|
+
"The component is expected to inspect records, build a search index, or filter rows internally."
|
|
10122
|
+
],
|
|
10123
|
+
"commonlyComposedWith": [
|
|
10124
|
+
"component:ds-table",
|
|
10125
|
+
"component:ds-table-toolbar",
|
|
10126
|
+
"component:ds-chip",
|
|
10127
|
+
"component:ds-button-unfilled",
|
|
10128
|
+
"component:ds-icon"
|
|
10129
|
+
],
|
|
10130
|
+
"accessibility": [
|
|
10131
|
+
"The native search input remains the one Tab stop and exposes combobox, expanded, controls, and active-descendant relationships to the field listbox.",
|
|
10132
|
+
"Typing slash opens the field listbox without inserting slash into the table query. Text typed while it is open filters data points by complete label, Up and Down change the active match, Enter selects it, Escape closes it, and Left and Right retain native text-cursor behavior because focus never leaves the input. Backspace edits the field-picker query first and closes the listbox when that query is empty.",
|
|
10133
|
+
"The query disables browser autocomplete history, automatic capitalization, autocorrection, and spellchecking so browser-owned suggestions never obscure the product-owned field menu or table results.",
|
|
10134
|
+
"Selected field Chips have individually labeled remove actions and are also described by the search input. Polite announcements report additions, removals, and clearing without duplicating the visible query.",
|
|
10135
|
+
"The slash suffix is a labeled double-inset md button excluded from sequential keyboard navigation; the search input exposes the same action through aria-keyshortcuts and its description.",
|
|
10136
|
+
"The clear action removes both free text and every selected field. It restores focus to the search input; each Chip's own remove action remains scoped to that field."
|
|
10137
|
+
],
|
|
10138
|
+
"states": [
|
|
10139
|
+
"value and selectedFieldIds are controlled. columns supplies the same table catalog used by Table and TableSort; dataLabel provides the complete out-of-context name while header and header segment label may remain compact. dsChange reports query edits, dsFieldsChange reports the next ordered field identities, and dsClear reports a complete clear. The component never filters rows or mutates consumer inputs.",
|
|
10140
|
+
"The field menu excludes already-selected identities and closes after one selection. Typing slash again reopens the remaining fields so multiple scopes can be added.",
|
|
10141
|
+
"Selected scopes render as neutral md Chips using the double-inset recipe so they remain 24px high inside the 32px md search control and each can be removed directly.",
|
|
10142
|
+
"Backspace edits a non-empty field-picker query, then closes the open slash listbox when that query is empty. When the table query is empty and the listbox is already closed, the next Backspace removes the last selected field. Ordinary Backspace edits table query text when the listbox is closed.",
|
|
10143
|
+
"Duplicate, blank, and unknown field identities are ignored for presentation. Selected fields preserve the consumer's order.",
|
|
10144
|
+
"Inactive search leaves the tab order, closes the field listbox, and does not emit query or field changes."
|
|
10145
|
+
],
|
|
10146
|
+
"responsiveBehavior": [
|
|
10147
|
+
"The control fills the available inline size supplied by the table toolbar search slot. Selected Chips and the editable query share one horizontal editor lane so the md control does not grow vertically.",
|
|
10148
|
+
"The field popup enters the top layer, aligns its first choice cell with the search control, flips or clamps to the viewport or nearest overlay boundary, and scrolls internally when its catalog is taller than available space.",
|
|
10149
|
+
"Long selected field labels truncate inside their Chips while the input remains available at the inline end of the editor lane. Both suffix actions resolve to the same 24px height as selected Chips. Clear follows the standard md Input recipe—a non-inset sm icon button—while slash is a double-inset md label button. Slash remains rightmost; when query text exposes Clear, a vertical divider separates the two actions."
|
|
10150
|
+
],
|
|
10151
|
+
"frameworkCaveats": {
|
|
10152
|
+
"customElements": [
|
|
10153
|
+
"Assign columns and selectedFieldIds through JavaScript properties and replace controlled values from dsChange and dsFieldsChange.",
|
|
10154
|
+
"Keep field IDs aligned with the application search index; the component treats IDs as opaque values."
|
|
10155
|
+
],
|
|
10156
|
+
"react": [
|
|
10157
|
+
"Pass new array references for columns and selectedFieldIds and update controlled state from onDsChange and onDsFieldsChange."
|
|
10158
|
+
],
|
|
10159
|
+
"angular": [
|
|
10160
|
+
"Import DsTableSearch, bind columns, selectedFieldIds, and value, then update application signals from dsChange and dsFieldsChange."
|
|
10161
|
+
]
|
|
10162
|
+
},
|
|
10163
|
+
"references": [
|
|
10164
|
+
{
|
|
10165
|
+
"label": "Storybook interaction states",
|
|
10166
|
+
"path": "src/wc/components/TableSearch/TableSearch.stories.ts"
|
|
10167
|
+
},
|
|
10168
|
+
{
|
|
10169
|
+
"label": "Toolbar composition owner",
|
|
10170
|
+
"path": "src/wc/components/TableToolbar/TableToolbar.agent.json"
|
|
10171
|
+
}
|
|
10172
|
+
]
|
|
10173
|
+
},
|
|
10174
|
+
"props": {
|
|
10175
|
+
"ariaLabel": {
|
|
10176
|
+
"type": "string",
|
|
10177
|
+
"required": false
|
|
10178
|
+
},
|
|
10179
|
+
"clearLabel": {
|
|
10180
|
+
"type": "string",
|
|
10181
|
+
"required": false
|
|
10182
|
+
},
|
|
10183
|
+
"columns": {
|
|
10184
|
+
"type": "TableColumn[]",
|
|
10185
|
+
"required": false
|
|
10186
|
+
},
|
|
10187
|
+
"fieldMenuLabel": {
|
|
10188
|
+
"type": "string",
|
|
10189
|
+
"required": false
|
|
10190
|
+
},
|
|
10191
|
+
"isInactive": {
|
|
10192
|
+
"type": "boolean",
|
|
10193
|
+
"required": false
|
|
10194
|
+
},
|
|
10195
|
+
"placeholder": {
|
|
10196
|
+
"type": "string",
|
|
10197
|
+
"required": false
|
|
10198
|
+
},
|
|
10199
|
+
"selectedFieldIds": {
|
|
10200
|
+
"type": "string[]",
|
|
10201
|
+
"required": false
|
|
10202
|
+
},
|
|
10203
|
+
"value": {
|
|
10204
|
+
"type": "string",
|
|
10205
|
+
"required": false
|
|
10206
|
+
}
|
|
10207
|
+
},
|
|
10208
|
+
"events": [
|
|
10209
|
+
{
|
|
10210
|
+
"name": "dsChange",
|
|
10211
|
+
"detail": "string"
|
|
10212
|
+
},
|
|
10213
|
+
{
|
|
10214
|
+
"name": "dsClear",
|
|
10215
|
+
"detail": "void"
|
|
10216
|
+
},
|
|
10217
|
+
{
|
|
10218
|
+
"name": "dsFieldsChange",
|
|
10219
|
+
"detail": "TableSearchFieldsChangeDetail"
|
|
10220
|
+
}
|
|
10221
|
+
],
|
|
10222
|
+
"slots": [],
|
|
10223
|
+
"exports": {
|
|
10224
|
+
"customElement": "ds-table-search",
|
|
10225
|
+
"react": "DsTableSearch",
|
|
10226
|
+
"vue": "DsTableSearch",
|
|
10227
|
+
"angular": "DsTableSearch"
|
|
10228
|
+
}
|
|
10229
|
+
},
|
|
10230
|
+
"dependencies": [
|
|
10231
|
+
"@ds-mo/ui",
|
|
10232
|
+
"@ds-mo/tokens",
|
|
10233
|
+
"@ds-mo/icons"
|
|
10234
|
+
],
|
|
10235
|
+
"registryDependencies": [
|
|
10236
|
+
"button-unfilled",
|
|
10237
|
+
"chip",
|
|
10238
|
+
"divider",
|
|
10239
|
+
"empty-state",
|
|
10240
|
+
"icon",
|
|
10241
|
+
"text"
|
|
10242
|
+
]
|
|
10243
|
+
},
|
|
9836
10244
|
{
|
|
9837
10245
|
"name": "table-sort",
|
|
9838
10246
|
"title": "TableSort",
|
|
@@ -9980,6 +10388,7 @@
|
|
|
9980
10388
|
"component:ds-divider",
|
|
9981
10389
|
"component:ds-input",
|
|
9982
10390
|
"component:ds-table-filter",
|
|
10391
|
+
"component:ds-table-group",
|
|
9983
10392
|
"component:ds-select",
|
|
9984
10393
|
"component:ds-table-sort",
|
|
9985
10394
|
"component:ds-button-unfilled"
|
|
@@ -9993,24 +10402,24 @@
|
|
|
9993
10402
|
"states": [
|
|
9994
10403
|
"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.",
|
|
9995
10404
|
"Buttons in the toolbar keep their hover and pressed interaction paint without physically scaling, so pointer feedback does not disturb the stable caption geometry.",
|
|
9996
|
-
"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.",
|
|
10405
|
+
"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 and grows to consume available row space. Empty leading or trailing clusters add no placeholder chrome. Search is the only toolbar region that grows and shrinks; all action controls retain their control geometry and align directly before the table-owned actions.",
|
|
9997
10406
|
"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."
|
|
9998
10407
|
],
|
|
9999
10408
|
"responsiveBehavior": [
|
|
10000
10409
|
"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.",
|
|
10001
|
-
"
|
|
10410
|
+
"Search consumes the row space left between fixed control groups and flexes smaller when the complete row needs space. Inside a named ds-table container narrower than 900px, ds-table-filter, ds-table-group, and ds-table-sort omit their labels and chevrons; each exposes its label through a hover and keyboard-focus tooltip. Empty leading and trailing slot groups do not add spacing. Active filtering promotes its prefix icon to primary. Group and Sort keep resting secondary chrome. Table-owned Customize also becomes the icon-only Table menu button at that width with the same tooltip behavior.",
|
|
10002
10411
|
"The scrollbar is visually suppressed without removing touch, trackpad, mouse-wheel, or keyboard scrolling from the overflow container.",
|
|
10003
10412
|
"Trailing controls remain grouped after leading controls; the toolbar does not collapse controls into an application-specific overflow menu."
|
|
10004
10413
|
],
|
|
10005
10414
|
"frameworkCaveats": {
|
|
10006
10415
|
"customElements": [
|
|
10007
|
-
"Project saved views through slot=start, search through slot=search, additional left-side middle controls through slot=leading, and ds-table-filter,
|
|
10416
|
+
"Project saved views through slot=start, search through slot=search, additional left-side middle controls through slot=leading, and ds-table-filter, ds-table-group, and ds-table-sort through slot=trailing. Provide contextual accessible names when Table controls is insufficient."
|
|
10008
10417
|
],
|
|
10009
10418
|
"react": [
|
|
10010
|
-
"Set slot=start, slot=search, slot=leading, or slot=trailing on each child control. Use ds-table-filter for the standard Filter
|
|
10419
|
+
"Set slot=start, slot=search, slot=leading, or slot=trailing on each child control. Use ds-table-filter and ds-table-group for the standard Filter and Group recipes, and keep values and event handlers in the application."
|
|
10011
10420
|
],
|
|
10012
10421
|
"angular": [
|
|
10013
|
-
"Set slot=start, slot=search, slot=leading, or slot=trailing on each child control, use DsTableFilter for the standard Filter
|
|
10422
|
+
"Set slot=start, slot=search, slot=leading, or slot=trailing on each child control, use DsTableFilter and DsTableGroup for the standard Filter and Group recipes, and import the generated adapters."
|
|
10014
10423
|
]
|
|
10015
10424
|
},
|
|
10016
10425
|
"references": [
|