@ds-mo/ui 15.5.1 → 15.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.package-ready.json +1 -1
- package/dist/agent-patterns.json +1 -1
- package/dist/agent.json +46 -21
- package/dist/angular/ds-data-preferences.d.ts +1 -1
- package/dist/angular/ds-data-preferences.js +3 -3
- package/dist/angular/ds-menu.d.ts +7 -1
- package/dist/angular/ds-menu.js +5 -2
- package/dist/angular/ds-table.d.ts +1 -1
- package/dist/angular/ds-table.js +3 -3
- package/dist/components/THIRD-PARTY-NOTICES +1 -1
- package/dist/components/bundled-dependencies.json +1 -1
- package/dist/components/ds-agent-questionnaire.js +1 -1
- package/dist/components/ds-agent-response.js +1 -1
- package/dist/components/ds-banner.js +1 -1
- package/dist/components/ds-bar-nav.js +1 -1
- package/dist/components/ds-bar-page-title.js +1 -1
- package/dist/components/ds-bar-title.js +1 -1
- package/dist/components/ds-bar-workflow.js +1 -1
- package/dist/components/ds-button-unfilled.js +1 -1
- package/dist/components/ds-calendar.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-code-block.js +1 -1
- package/dist/components/ds-data-customize.js +1 -1
- package/dist/components/ds-data-filter.js +1 -1
- package/dist/components/ds-data-group.js +1 -1
- package/dist/components/ds-data-preferences.js +1 -1
- package/dist/components/ds-data-preferences.js.map +1 -1
- package/dist/components/ds-data-saved-views.js +1 -1
- package/dist/components/ds-data-search.js +1 -1
- package/dist/components/ds-data-search.js.map +1 -1
- package/dist/components/ds-data-sort.js +1 -1
- package/dist/components/ds-filter-menu.js +1 -1
- package/dist/components/ds-input-date.js +1 -1
- package/dist/components/ds-input-time.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-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-tool-header.js +1 -1
- package/dist/components/ds-panel-tool-search.js +1 -1
- package/dist/components/ds-panel-tools.js +1 -1
- package/dist/components/ds-select.js +1 -1
- package/dist/components/ds-shell-app.js +1 -1
- package/dist/components/ds-shell-tools.js +1 -1
- package/dist/components/ds-table.js +1 -1
- package/dist/components/ds-table.js.map +1 -1
- package/dist/components/ds-toast.js +1 -1
- package/dist/components/ds-toast.js.map +1 -1
- package/dist/components/ds-tooltip.js +1 -1
- package/dist/components/{p-sDm8BEMy.js → p-B-pkoIX9.js} +2 -2
- package/dist/components/{p-DYsRXun3.js → p-B3o9zn3Y.js} +2 -2
- package/dist/components/p-BR9Pjp15.js +2 -0
- package/dist/components/{p-CXlklL-0.js.map → p-BR9Pjp15.js.map} +1 -1
- package/dist/components/{p-CcwxySms.js → p-BZY40-pE.js} +2 -2
- package/dist/components/{p-BLeHHoVb.js → p-BqipGGua.js} +2 -2
- package/dist/components/{p-BuDxlhnQ.js → p-C6kUn-vb.js} +2 -2
- package/dist/components/p-CElsKlxj.js +2 -0
- package/dist/components/{p-CzdE3M3g.js.map → p-CElsKlxj.js.map} +1 -1
- package/dist/components/p-CIMyD_6H.js +2 -0
- package/dist/components/{p-C5BBIDVm.js.map → p-CIMyD_6H.js.map} +1 -1
- package/dist/components/{p-C35Tki38.js → p-CSxwWcwW.js} +2 -2
- package/dist/components/p-CUYLGe5d.js +2 -0
- package/dist/components/{p-D9_iDlkT.js.map → p-CUYLGe5d.js.map} +1 -1
- package/dist/components/{p-BlbfbYg6.js → p-CaFXrn_8.js} +2 -2
- package/dist/components/{p-DZLtFn-r.js → p-DObhRLBa.js} +2 -2
- package/dist/components/{p-bQE1NZVe.js → p-DP07JCed.js} +2 -2
- package/dist/components/p-DYGllrVT.js +2 -0
- package/dist/components/{p-CNeDJTGX.js.map → p-DYGllrVT.js.map} +1 -1
- package/dist/components/{p-C378wwRj.js → p-DYtVsnDS.js} +2 -2
- package/dist/components/p-DbW8S5qe.js +2 -0
- package/dist/components/p-DbW8S5qe.js.map +1 -0
- package/dist/components/p-DcxY_pdJ.js +2 -0
- package/dist/components/{p-Df9S0aWi.js.map → p-DcxY_pdJ.js.map} +1 -1
- package/dist/components/{p-C9H-3JOA.js → p-DdFeWC-e.js} +2 -2
- package/dist/components/p-DlCLfwP4.js +2 -0
- package/dist/components/p-DuCfCvPs.js +2 -0
- package/dist/components/p-DuCfCvPs.js.map +1 -0
- package/dist/components/{p-BYrBU_U9.js → p-HMDczkQf.js} +2 -2
- package/dist/components/p-HfZ1gI2q.js +2 -0
- package/dist/components/{p-Da3aFRk2.js.map → p-HfZ1gI2q.js.map} +1 -1
- package/dist/components/{p--VQc5GDy.js → p-KA8srEed.js} +2 -2
- package/dist/components/{p-BfVMaZZE.js → p-OJ5WeR05.js} +2 -2
- package/dist/components/p-Ouk6FCxc.js +2 -0
- package/dist/components/{p-a-cIN_BX.js.map → p-Ouk6FCxc.js.map} +1 -1
- package/dist/components/p-leZFu-cd.js +2 -0
- package/dist/components/{p-BuGlC5r8.js.map → p-leZFu-cd.js.map} +1 -1
- package/dist/components/{p-DPwptvZl.js → p-wXKIVUTn.js} +2 -2
- package/dist/components/p-xMBaOeKa.js +2 -0
- package/dist/components/p-xMBaOeKa.js.map +1 -0
- package/dist/docs/components.json +207 -29
- package/dist/lint/index.js +1 -1
- package/dist/mcp-data/registry/agent-activity.json +1 -1
- package/dist/mcp-data/registry/agent-questionnaire.json +1 -1
- package/dist/mcp-data/registry/agent-response.json +1 -1
- package/dist/mcp-data/registry/agent-source-list.json +1 -1
- package/dist/mcp-data/registry/agent-tool-call.json +1 -1
- package/dist/mcp-data/registry/attachment-list.json +1 -1
- package/dist/mcp-data/registry/avatar.json +1 -1
- package/dist/mcp-data/registry/badge.json +1 -1
- package/dist/mcp-data/registry/banner.json +1 -1
- package/dist/mcp-data/registry/bar-action.json +1 -1
- package/dist/mcp-data/registry/bar-nav.json +1 -1
- package/dist/mcp-data/registry/bar-page-title.json +1 -1
- package/dist/mcp-data/registry/bar-title.json +1 -1
- package/dist/mcp-data/registry/bar-workflow.json +1 -1
- package/dist/mcp-data/registry/breadcrumb.json +1 -1
- package/dist/mcp-data/registry/button-filled.json +1 -1
- package/dist/mcp-data/registry/button-inverted.json +1 -1
- package/dist/mcp-data/registry/button-unfilled.json +1 -1
- package/dist/mcp-data/registry/calendar.json +1 -1
- package/dist/mcp-data/registry/card-action-center.json +1 -1
- package/dist/mcp-data/registry/card-chart.json +1 -1
- package/dist/mcp-data/registry/card-navigation.json +1 -1
- package/dist/mcp-data/registry/card-overview.json +1 -1
- package/dist/mcp-data/registry/card-setting.json +1 -1
- package/dist/mcp-data/registry/card-settings-scope.json +1 -1
- package/dist/mcp-data/registry/chart-legend.json +1 -1
- package/dist/mcp-data/registry/chart.json +1 -1
- package/dist/mcp-data/registry/checkbox-group.json +1 -1
- package/dist/mcp-data/registry/checkbox.json +1 -1
- package/dist/mcp-data/registry/chip.json +1 -1
- package/dist/mcp-data/registry/code-block.json +1 -1
- package/dist/mcp-data/registry/conversation-list-item.json +1 -1
- package/dist/mcp-data/registry/conversation-list-section.json +1 -1
- package/dist/mcp-data/registry/conversation-list.json +1 -1
- package/dist/mcp-data/registry/data-customize.json +1 -1
- package/dist/mcp-data/registry/data-filter.json +1 -1
- package/dist/mcp-data/registry/data-group.json +1 -1
- package/dist/mcp-data/registry/data-preferences.json +22 -6
- package/dist/mcp-data/registry/data-saved-views.json +1 -1
- package/dist/mcp-data/registry/data-search.json +1 -1
- package/dist/mcp-data/registry/data-sort.json +1 -1
- package/dist/mcp-data/registry/data-toolbar.json +1 -1
- package/dist/mcp-data/registry/divider.json +1 -1
- package/dist/mcp-data/registry/empty-state.json +1 -1
- package/dist/mcp-data/registry/field.json +1 -1
- package/dist/mcp-data/registry/filter-menu.json +1 -1
- package/dist/mcp-data/registry/icon.json +1 -1
- package/dist/mcp-data/registry/inline-banner-settings.json +1 -1
- package/dist/mcp-data/registry/input-date.json +1 -1
- package/dist/mcp-data/registry/input-time.json +1 -1
- package/dist/mcp-data/registry/input.json +1 -1
- package/dist/mcp-data/registry/loader.json +1 -1
- package/dist/mcp-data/registry/map-cluster-marker.json +1 -1
- package/dist/mcp-data/registry/map-entity-marker.json +1 -1
- package/dist/mcp-data/registry/markdown.json +1 -1
- package/dist/mcp-data/registry/menu.json +31 -12
- package/dist/mcp-data/registry/message-actions.json +1 -1
- package/dist/mcp-data/registry/message-bubble.json +1 -1
- package/dist/mcp-data/registry/message-composer.json +1 -1
- package/dist/mcp-data/registry/message-scroller.json +1 -1
- package/dist/mcp-data/registry/message.json +1 -1
- package/dist/mcp-data/registry/mobile-bar-nav.json +1 -1
- package/dist/mcp-data/registry/mobile-header.json +1 -1
- package/dist/mcp-data/registry/mobile-section-switcher.json +1 -1
- package/dist/mcp-data/registry/mobile-sheet-nav.json +1 -1
- package/dist/mcp-data/registry/modal.json +1 -1
- package/dist/mcp-data/registry/pagination.json +1 -1
- package/dist/mcp-data/registry/panel-nav.json +1 -1
- package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
- package/dist/mcp-data/registry/panel-tool-header.json +1 -1
- package/dist/mcp-data/registry/panel-tool-search.json +1 -1
- package/dist/mcp-data/registry/panel-tools.json +1 -1
- package/dist/mcp-data/registry/paper-texture.json +1 -1
- package/dist/mcp-data/registry/radio-tile.json +1 -1
- package/dist/mcp-data/registry/radio.json +1 -1
- package/dist/mcp-data/registry/registry.json +46 -21
- package/dist/mcp-data/registry/score.json +1 -1
- package/dist/mcp-data/registry/scroll-overlay.json +1 -1
- package/dist/mcp-data/registry/select.json +1 -1
- package/dist/mcp-data/registry/setting-row-checkbox.json +1 -1
- package/dist/mcp-data/registry/setting-row-radio.json +1 -1
- package/dist/mcp-data/registry/setting-row-toggle.json +1 -1
- package/dist/mcp-data/registry/shell-app.json +1 -1
- package/dist/mcp-data/registry/shell-page.json +1 -1
- package/dist/mcp-data/registry/shell-tools.json +1 -1
- package/dist/mcp-data/registry/skeleton.json +1 -1
- package/dist/mcp-data/registry/slider.json +1 -1
- package/dist/mcp-data/registry/swatch-picker.json +1 -1
- package/dist/mcp-data/registry/switch.json +1 -1
- package/dist/mcp-data/registry/tab-group.json +1 -1
- package/dist/mcp-data/registry/table.json +59 -19
- package/dist/mcp-data/registry/tag.json +1 -1
- package/dist/mcp-data/registry/text.json +1 -1
- package/dist/mcp-data/registry/textarea.json +1 -1
- package/dist/mcp-data/registry/time-picker.json +1 -1
- package/dist/mcp-data/registry/toast.json +1 -1
- package/dist/mcp-data/registry/tooltip-chart.json +1 -1
- package/dist/mcp-data/registry/tooltip.json +1 -1
- package/dist/mcp-data/registry/typing-indicator.json +1 -1
- package/dist/react/ds-menu.d.ts +2 -1
- package/dist/react/ds-menu.js +1 -0
- package/dist/styles/table.css +41 -0
- package/dist/types/components/DataPreferences/DataPreferences.d.ts +3 -0
- package/dist/types/components/Menu/Menu.d.ts +5 -1
- package/dist/types/components/Menu/menu-types.d.ts +36 -0
- package/dist/types/components/Table/Table.d.ts +11 -2
- package/dist/types/components/Table/index.d.ts +1 -1
- package/dist/types/components/Table/table-column-customizer.d.ts +23 -4
- package/dist/types/components/Table/table-layout-controller.d.ts +2 -1
- package/dist/types/components/Table/table-types.d.ts +3 -1
- package/dist/types/components.d.ts +42 -6
- package/dist/vue/ds-data-preferences.js +1 -0
- package/dist/vue/ds-menu.js +2 -0
- package/dist/vue/ds-table.js +2 -0
- package/package.json +3 -3
- package/dist/components/p-BuGlC5r8.js +0 -2
- package/dist/components/p-C5BBIDVm.js +0 -2
- package/dist/components/p-CE6MaXBg.js +0 -2
- package/dist/components/p-CE6MaXBg.js.map +0 -1
- package/dist/components/p-CNeDJTGX.js +0 -2
- package/dist/components/p-CXlklL-0.js +0 -2
- package/dist/components/p-CzdE3M3g.js +0 -2
- package/dist/components/p-D9_iDlkT.js +0 -2
- package/dist/components/p-Da3aFRk2.js +0 -2
- package/dist/components/p-Df9S0aWi.js +0 -2
- package/dist/components/p-DvGrsLgt.js +0 -2
- package/dist/components/p-DvGrsLgt.js.map +0 -1
- package/dist/components/p-a-cIN_BX.js +0 -2
- package/dist/components/p-aD5cw_m2.js +0 -2
- package/dist/components/p-aD5cw_m2.js.map +0 -1
- package/dist/components/p-kDZ0sEII.js +0 -2
- package/dist/components/p-t2Ebn8si.js +0 -2
- package/dist/components/p-t2Ebn8si.js.map +0 -1
- /package/dist/components/{p-sDm8BEMy.js.map → p-B-pkoIX9.js.map} +0 -0
- /package/dist/components/{p-DYsRXun3.js.map → p-B3o9zn3Y.js.map} +0 -0
- /package/dist/components/{p-CcwxySms.js.map → p-BZY40-pE.js.map} +0 -0
- /package/dist/components/{p-BLeHHoVb.js.map → p-BqipGGua.js.map} +0 -0
- /package/dist/components/{p-BuDxlhnQ.js.map → p-C6kUn-vb.js.map} +0 -0
- /package/dist/components/{p-C35Tki38.js.map → p-CSxwWcwW.js.map} +0 -0
- /package/dist/components/{p-BlbfbYg6.js.map → p-CaFXrn_8.js.map} +0 -0
- /package/dist/components/{p-DZLtFn-r.js.map → p-DObhRLBa.js.map} +0 -0
- /package/dist/components/{p-bQE1NZVe.js.map → p-DP07JCed.js.map} +0 -0
- /package/dist/components/{p-C378wwRj.js.map → p-DYtVsnDS.js.map} +0 -0
- /package/dist/components/{p-C9H-3JOA.js.map → p-DdFeWC-e.js.map} +0 -0
- /package/dist/components/{p-kDZ0sEII.js.map → p-DlCLfwP4.js.map} +0 -0
- /package/dist/components/{p-BYrBU_U9.js.map → p-HMDczkQf.js.map} +0 -0
- /package/dist/components/{p--VQc5GDy.js.map → p-KA8srEed.js.map} +0 -0
- /package/dist/components/{p-BfVMaZZE.js.map → p-OJ5WeR05.js.map} +0 -0
- /package/dist/components/{p-DPwptvZl.js.map → p-wXKIVUTn.js.map} +0 -0
|
@@ -136,7 +136,7 @@
|
|
|
136
136
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
|
|
137
137
|
"peerDependencies": {
|
|
138
138
|
"required": [
|
|
139
|
-
"@ds-mo/tokens ^6.
|
|
139
|
+
"@ds-mo/tokens ^6.7.0",
|
|
140
140
|
"@ds-mo/icons ^8.1.1"
|
|
141
141
|
],
|
|
142
142
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -241,7 +241,7 @@
|
|
|
241
241
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: answers, labels, questions.",
|
|
242
242
|
"peerDependencies": {
|
|
243
243
|
"required": [
|
|
244
|
-
"@ds-mo/tokens ^6.
|
|
244
|
+
"@ds-mo/tokens ^6.7.0",
|
|
245
245
|
"@ds-mo/icons ^8.1.1"
|
|
246
246
|
],
|
|
247
247
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -239,7 +239,7 @@
|
|
|
239
239
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: parts.",
|
|
240
240
|
"peerDependencies": {
|
|
241
241
|
"required": [
|
|
242
|
-
"@ds-mo/tokens ^6.
|
|
242
|
+
"@ds-mo/tokens ^6.7.0",
|
|
243
243
|
"@ds-mo/icons ^8.1.1"
|
|
244
244
|
],
|
|
245
245
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -152,7 +152,7 @@
|
|
|
152
152
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
|
|
153
153
|
"peerDependencies": {
|
|
154
154
|
"required": [
|
|
155
|
-
"@ds-mo/tokens ^6.
|
|
155
|
+
"@ds-mo/tokens ^6.7.0",
|
|
156
156
|
"@ds-mo/icons ^8.1.1"
|
|
157
157
|
],
|
|
158
158
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -232,7 +232,7 @@
|
|
|
232
232
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: input, output.",
|
|
233
233
|
"peerDependencies": {
|
|
234
234
|
"required": [
|
|
235
|
-
"@ds-mo/tokens ^6.
|
|
235
|
+
"@ds-mo/tokens ^6.7.0",
|
|
236
236
|
"@ds-mo/icons ^8.1.1"
|
|
237
237
|
],
|
|
238
238
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -116,7 +116,7 @@
|
|
|
116
116
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
|
|
117
117
|
"peerDependencies": {
|
|
118
118
|
"required": [
|
|
119
|
-
"@ds-mo/tokens ^6.
|
|
119
|
+
"@ds-mo/tokens ^6.7.0",
|
|
120
120
|
"@ds-mo/icons ^8.1.1"
|
|
121
121
|
],
|
|
122
122
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -291,7 +291,7 @@
|
|
|
291
291
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: tabs.",
|
|
292
292
|
"peerDependencies": {
|
|
293
293
|
"required": [
|
|
294
|
-
"@ds-mo/tokens ^6.
|
|
294
|
+
"@ds-mo/tokens ^6.7.0",
|
|
295
295
|
"@ds-mo/icons ^8.1.1"
|
|
296
296
|
],
|
|
297
297
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -421,7 +421,7 @@
|
|
|
421
421
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: actionItems, actions, primaryAction, sections.",
|
|
422
422
|
"peerDependencies": {
|
|
423
423
|
"required": [
|
|
424
|
-
"@ds-mo/tokens ^6.
|
|
424
|
+
"@ds-mo/tokens ^6.7.0",
|
|
425
425
|
"@ds-mo/icons ^8.1.1"
|
|
426
426
|
],
|
|
427
427
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -564,7 +564,7 @@
|
|
|
564
564
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: actionItems, actions, breadcrumbs, primaryAction, sections.",
|
|
565
565
|
"peerDependencies": {
|
|
566
566
|
"required": [
|
|
567
|
-
"@ds-mo/tokens ^6.
|
|
567
|
+
"@ds-mo/tokens ^6.7.0",
|
|
568
568
|
"@ds-mo/icons ^8.1.1"
|
|
569
569
|
],
|
|
570
570
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -379,7 +379,7 @@
|
|
|
379
379
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: steps, submitAction.",
|
|
380
380
|
"peerDependencies": {
|
|
381
381
|
"required": [
|
|
382
|
-
"@ds-mo/tokens ^6.
|
|
382
|
+
"@ds-mo/tokens ^6.7.0",
|
|
383
383
|
"@ds-mo/icons ^8.1.1"
|
|
384
384
|
],
|
|
385
385
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -181,7 +181,7 @@
|
|
|
181
181
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
|
|
182
182
|
"peerDependencies": {
|
|
183
183
|
"required": [
|
|
184
|
-
"@ds-mo/tokens ^6.
|
|
184
|
+
"@ds-mo/tokens ^6.7.0",
|
|
185
185
|
"@ds-mo/icons ^8.1.1"
|
|
186
186
|
],
|
|
187
187
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -198,7 +198,7 @@
|
|
|
198
198
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: sections.",
|
|
199
199
|
"peerDependencies": {
|
|
200
200
|
"required": [
|
|
201
|
-
"@ds-mo/tokens ^6.
|
|
201
|
+
"@ds-mo/tokens ^6.7.0",
|
|
202
202
|
"@ds-mo/icons ^8.1.1"
|
|
203
203
|
],
|
|
204
204
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -376,7 +376,7 @@
|
|
|
376
376
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: metrics, score.",
|
|
377
377
|
"peerDependencies": {
|
|
378
378
|
"required": [
|
|
379
|
-
"@ds-mo/tokens ^6.
|
|
379
|
+
"@ds-mo/tokens ^6.7.0",
|
|
380
380
|
"@ds-mo/icons ^8.1.1"
|
|
381
381
|
],
|
|
382
382
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -277,7 +277,7 @@
|
|
|
277
277
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
|
|
278
278
|
"peerDependencies": {
|
|
279
279
|
"required": [
|
|
280
|
-
"@ds-mo/tokens ^6.
|
|
280
|
+
"@ds-mo/tokens ^6.7.0",
|
|
281
281
|
"@ds-mo/icons ^8.1.1"
|
|
282
282
|
],
|
|
283
283
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -239,7 +239,7 @@
|
|
|
239
239
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: definition.",
|
|
240
240
|
"peerDependencies": {
|
|
241
241
|
"required": [
|
|
242
|
-
"@ds-mo/tokens ^6.
|
|
242
|
+
"@ds-mo/tokens ^6.7.0",
|
|
243
243
|
"@ds-mo/icons ^8.1.1"
|
|
244
244
|
],
|
|
245
245
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -369,7 +369,7 @@
|
|
|
369
369
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: fieldOrder, fields, hiddenFieldIds, options.",
|
|
370
370
|
"peerDependencies": {
|
|
371
371
|
"required": [
|
|
372
|
-
"@ds-mo/tokens ^6.
|
|
372
|
+
"@ds-mo/tokens ^6.7.0",
|
|
373
373
|
"@ds-mo/icons ^8.1.1"
|
|
374
374
|
],
|
|
375
375
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -487,7 +487,7 @@
|
|
|
487
487
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: filters, matchModes, values.",
|
|
488
488
|
"peerDependencies": {
|
|
489
489
|
"required": [
|
|
490
|
-
"@ds-mo/tokens ^6.
|
|
490
|
+
"@ds-mo/tokens ^6.7.0",
|
|
491
491
|
"@ds-mo/icons ^8.1.1"
|
|
492
492
|
],
|
|
493
493
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -351,7 +351,7 @@
|
|
|
351
351
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: grouping, options.",
|
|
352
352
|
"peerDependencies": {
|
|
353
353
|
"required": [
|
|
354
|
-
"@ds-mo/tokens ^6.
|
|
354
|
+
"@ds-mo/tokens ^6.7.0",
|
|
355
355
|
"@ds-mo/icons ^8.1.1"
|
|
356
356
|
],
|
|
357
357
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
"Borderless toolbar compositions omit resting control borders while retaining focus and interaction feedback.",
|
|
27
27
|
"Apply-required filtering stages edits locally, including match mode. Clear immediately clears all filters and discards pending edits. The footer appears when filters are selected or applied; Apply stays in place and inactive without pending changes; applying emits controlled changes. Closing discards unapplied edits.",
|
|
28
28
|
"Embedded presentation delegates its active tab, draft state, Apply, Reset, and dismissal to the owning panel; it renders vertical filter and grouping content without a popup trigger.",
|
|
29
|
-
"Customize builds its catalog from fields. catalogReorderable defaults to true for a table:
|
|
29
|
+
"Customize builds its catalog from fields. catalogReorderable defaults to true for a table: each row independently controls visibility and left-side pinning, pinned and unpinned sections constrain drag reorder to their own partition, and the last visible entry stays locked. Pass false for a show-and-hide catalog, where rows are switches with no drag handle or pin action and every entry may be hidden.",
|
|
30
30
|
"catalogHeader overrides the catalog section header, which otherwise reads Columns whenever customizeOptions supply a second section. customizeLabel names the Customize menu, so a non-table surface can announce Customize view rather than Customize table.",
|
|
31
|
-
"Both catalog modes emit dsFieldsConfigChange with hiddenFieldIds
|
|
31
|
+
"Both catalog modes emit dsFieldsConfigChange with hiddenFieldIds, fieldOrder, and pinnedFieldIds. Toggle-only catalogs preserve pin state unchanged; table catalogs report pin and partitioned order intent."
|
|
32
32
|
],
|
|
33
33
|
"accessibility": [
|
|
34
34
|
"An icon-only Preferences trigger opens a named dialog. TabGroup owns section keyboard navigation; Escape and outside activation dismiss, returning focus to the trigger."
|
|
@@ -204,6 +204,14 @@
|
|
|
204
204
|
"required": false,
|
|
205
205
|
"mutable": false
|
|
206
206
|
},
|
|
207
|
+
"pinnedFieldIds": {
|
|
208
|
+
"type": "string[]",
|
|
209
|
+
"resolvedType": "string[]",
|
|
210
|
+
"default": "[]",
|
|
211
|
+
"required": false,
|
|
212
|
+
"mutable": false,
|
|
213
|
+
"description": "Controlled user-pinned table-column identities. Ignored for toggle-only catalogs."
|
|
214
|
+
},
|
|
207
215
|
"sort": {
|
|
208
216
|
"type": "DataSortState | null",
|
|
209
217
|
"resolvedType": "DataSortState | null",
|
|
@@ -433,6 +441,14 @@
|
|
|
433
441
|
"required": false,
|
|
434
442
|
"mutable": false
|
|
435
443
|
},
|
|
444
|
+
"pinnedFieldIds": {
|
|
445
|
+
"type": "string[]",
|
|
446
|
+
"resolvedType": "string[]",
|
|
447
|
+
"default": "[]",
|
|
448
|
+
"required": false,
|
|
449
|
+
"mutable": false,
|
|
450
|
+
"description": "Controlled user-pinned table-column identities. Ignored for toggle-only catalogs."
|
|
451
|
+
},
|
|
436
452
|
"sort": {
|
|
437
453
|
"type": "DataSortState | null",
|
|
438
454
|
"resolvedType": "DataSortState | null",
|
|
@@ -554,10 +570,10 @@
|
|
|
554
570
|
"import": "import { DsDataPreferences } from '@ds-mo/ui/angular/ds-data-preferences';",
|
|
555
571
|
"example": "<ds-data-preferences></ds-data-preferences>"
|
|
556
572
|
},
|
|
557
|
-
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: customizeOptions, customizeSections, fieldOrder, fields, filters, grouping, groupingOptions, hiddenFieldIds, matchModes, sort, sortColumns, values.",
|
|
573
|
+
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: customizeOptions, customizeSections, fieldOrder, fields, filters, grouping, groupingOptions, hiddenFieldIds, matchModes, pinnedFieldIds, sort, sortColumns, values.",
|
|
558
574
|
"peerDependencies": {
|
|
559
575
|
"required": [
|
|
560
|
-
"@ds-mo/tokens ^6.
|
|
576
|
+
"@ds-mo/tokens ^6.7.0",
|
|
561
577
|
"@ds-mo/icons ^8.1.1"
|
|
562
578
|
],
|
|
563
579
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -579,12 +595,12 @@
|
|
|
579
595
|
"files": [
|
|
580
596
|
{
|
|
581
597
|
"path": "src/wc/components/DataPreferences/DataPreferences.css",
|
|
582
|
-
"content": "@import '../../utils/radius.css';\n\n:host {\n display: inline-flex;\n}\n\n.data-preferences {\n position: fixed;\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: var(--ds-radius-menu);\n width: min(var(--dimension-menu-width-lg), calc(100vw - var(--dimension-space-200)));\n max-height: calc(100dvh - var(--dimension-space-400));\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--color-background-primary);\n color: var(--color-foreground-secondary);\n box-shadow: var(--effect-shadow-elevated-floating);\n}\n\n.data-preferences::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n box-shadow: var(--effect-highlight-elevated-floating);\n pointer-events: none;\n z-index: 4;\n}\n\n.data-preferences__tabs {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n box-sizing: border-box;\n flex: 0 0 var(--dimension-size-500);\n min-block-size: var(--dimension-size-500);\n padding: var(--dimension-space-050);\n background: var(--color-background-primary);\n border-bottom: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n\n.data-preferences__body {\n min-height: 0;\n overflow: auto;\n overscroll-behavior: contain;\n}\n\n:host:has(.data-preferences-panel) {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.data-preferences-panel {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n min-width: 0;\n}\n.data-preferences-panel .data-preferences__tabs {\n flex: 0 0 auto;\n padding: var(--dimension-space-200);\n}\n",
|
|
598
|
+
"content": "@import '../../utils/radius.css';\n\n:host {\n display: inline-flex;\n}\n\n.data-preferences {\n position: fixed;\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: var(--ds-radius-menu);\n width: min(var(--dimension-menu-width-lg), calc(100vw - var(--dimension-space-200)));\n max-height: calc(100dvh - var(--dimension-space-400));\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--color-background-primary);\n color: var(--color-foreground-secondary);\n box-shadow: var(--effect-shadow-elevated-floating);\n}\n\n.data-preferences::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n box-shadow: var(--effect-highlight-elevated-floating);\n pointer-events: none;\n z-index: 4;\n}\n\n.data-preferences__tabs {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n box-sizing: border-box;\n flex: 0 0 var(--dimension-size-500);\n min-block-size: var(--dimension-size-500);\n padding: var(--dimension-space-050);\n background: var(--color-background-primary);\n border-bottom: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n\n.data-preferences__body {\n min-height: 0;\n overflow: auto;\n overscroll-behavior: contain;\n}\n\n:host:has(.data-preferences-panel) {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.data-preferences-panel {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n min-width: 0;\n}\n.data-preferences-panel .data-preferences__tabs {\n flex: 0 0 auto;\n padding: var(--dimension-space-200);\n background: transparent;\n}\n",
|
|
583
599
|
"type": "registry:ui"
|
|
584
600
|
},
|
|
585
601
|
{
|
|
586
602
|
"path": "src/wc/components/DataPreferences/DataPreferences.tsx",
|
|
587
|
-
"content": "import type { DataField } from '../../utils/data-field';\nimport type { MenuItemData, MenuSection } from '../Menu/menu-types';\nimport { resolveAnchoredOverlayBoundaryRect } from '../../utils/anchored-overlay-boundary';\nimport {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Prop,\n State,\n} from '@stencil/core';\nimport type {\n FilterMenuFilter,\n FilterMenuValues,\n FilterMenuMatchModes,\n FilterMenuChangeDetail,\n FilterMenuMatchModeChangeDetail,\n} from '../FilterMenu/FilterMenu';\nimport type {\n TableColumn,\n DataSortState,\n DataSortChangeDetail,\n DataGroupingState,\n DataFieldsConfigChangeDetail,\n} from '../Table/table-types';\nimport type { DataGroupOption } from '../DataGroup/DataGroup';\nimport { dataSortMenuSections, nextDataSortStateFromMenuItem } from '../DataSort/data-sort-menu';\nimport {\n tableColumnCustomizerLabel,\n tableColumnCustomizerMenuItems,\n tableDataColumns,\n toggleTableColumnHidden,\n resolveTableColumnOrder,\n} from '../Table/table-column-customizer';\nimport {\n listCustomizerMenuItems,\n resolveListOrder,\n toggleListHidden,\n type ListCustomizerOptions,\n} from '../../utils/list-customizer';\nimport { AnchoredPositionController } from '../../utils/anchored-position-controller';\nimport { ConnectionTasks } from '../../utils/connection-tasks';\nimport { AnchoredOverlayInteractionController } from '../../utils/anchored-overlay-interaction-controller';\nimport { resolveCssLengthPx } from '../../utils/resolve-css-length-px';\nimport { TOKEN_DEFAULTS } from '../../utils/token-defaults';\n\n/** Toggle-only catalog: every entry may hide and no row carries a drag handle. */\nconst TOGGLE_ONLY_CATALOG: ListCustomizerOptions = { minVisible: 0, reorderable: false };\n\nexport type PreferencesTab = 'filters' | 'sort' | 'group' | 'customize';\nlet preferencesSequence = 0;\n\n@Component({ tag: 'ds-data-preferences', styleUrl: 'DataPreferences.css', scoped: true })\nexport class DataPreferences {\n @Element() el!: HTMLElement;\n /** Show the trigger border. */\n @Prop() hasBorder: boolean = true;\n @Prop() filters: FilterMenuFilter[] = [];\n @Prop() values: FilterMenuValues = {};\n @Prop() matchModes: FilterMenuMatchModes = {};\n @Prop() activeFilterId: string | undefined;\n @Prop() fields: DataField[] = [];\n /** Additional toggle options in the column customizer. */\n @Prop() customizeOptions: MenuItemData[] = [];\n @Prop() customizeSections: MenuSection[] = [];\n /** Accessible name for the Customize menu. */\n @Prop() customizeLabel: string = 'Customize table';\n /**\n * Section header above the catalog rows. Defaults to Columns when\n * customizeOptions supply a second section, matching the table.\n */\n @Prop() catalogHeader?: string;\n /**\n * Drag-reorder the catalog rows and keep the last visible entry locked, as a\n * table requires. Pass false for a catalog that only shows and hides, where\n * every entry may be hidden and rows carry no drag handle.\n */\n @Prop() catalogReorderable: boolean = true;\n @Event() dsCustomizeOptionChange!: EventEmitter<string>;\n /** Optional sort fields when they differ from customizable content. */\n @Prop() sortColumns?: TableColumn[];\n @Prop() sort: DataSortState | null = null;\n @Prop() groupingOptions: DataGroupOption[] = [];\n @Prop() grouping: DataGroupingState | null = null;\n @Prop() hiddenFieldIds: string[] = [];\n @Prop() fieldOrder: string[] = [];\n /** Render shared content without its popup or trigger. */\n @Prop() embedded = false;\n @Prop() activeTab: PreferencesTab = 'filters';\n @Event() dsPreferencesTabChange!: EventEmitter<PreferencesTab>;\n @Prop() label = 'Configure view';\n @Event() dsFilterChange!: EventEmitter<FilterMenuChangeDetail>;\n @Event() dsFilterMatchModeChange!: EventEmitter<FilterMenuMatchModeChangeDetail>;\n @Event() dsActiveFilterChange!: EventEmitter<string>;\n @Event() dsFiltersClear!: EventEmitter<void>;\n @Event() dsSortChange!: EventEmitter<DataSortChangeDetail>;\n @Event() dsGroupChange!: EventEmitter<DataGroupingState>;\n @Event() dsGroupClear!: EventEmitter<void>;\n @Event() dsFieldsConfigChange!: EventEmitter<DataFieldsConfigChangeDetail>;\n\n /** Catalog rows as domain-neutral items, so a non-table catalog needs no column shape. */\n private catalogItems(): { id: string; label: string }[] {\n return tableDataColumns(this.fields).map(column => ({\n id: column.id,\n label: tableColumnCustomizerLabel(column),\n }));\n }\n @State() private open = false;\n @State() private tab: PreferencesTab = 'filters';\n @State() private pos = { x: 0, y: 0 };\n @State() private ready = false;\n private readonly popupId = `ds-data-preferences-${++preferencesSequence}`;\n private trigger?: HTMLDsButtonUnfilledElement;\n private popup?: HTMLElement;\n private readonly tasks = new ConnectionTasks(() => this.el.isConnected);\n private readonly position = new AnchoredPositionController({\n getAnchor: () => this.trigger ?? null,\n getPopup: () => this.popup ?? null,\n getOwnerDocument: () => this.el.ownerDocument,\n measure: (anchor, popup) => {\n const collisionRect = resolveAnchoredOverlayBoundaryRect(anchor);\n const pad = resolveCssLengthPx(TOKEN_DEFAULTS.space100, 8);\n popup.style.maxWidth = `${Math.max(0, Math.min(window.innerWidth, collisionRect?.width ?? window.innerWidth) - pad * 2)}px`;\n popup.style.maxHeight = `${Math.max(0, Math.min(window.innerHeight, collisionRect?.height ?? window.innerHeight) - pad * 2)}px`;\n return {\n anchorRect: anchor.getBoundingClientRect(),\n popupWidth: popup.offsetWidth,\n popupHeight: popup.offsetHeight,\n side: 'bottom',\n align: 'end',\n sideOffsetPx: resolveCssLengthPx(TOKEN_DEFAULTS.space050, 4),\n alignOffsetPx: 0,\n viewportPadPx: resolveCssLengthPx(TOKEN_DEFAULTS.space100, 8),\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n collisionRect,\n };\n },\n apply: ({ x, y }) => {\n this.pos = { x, y };\n },\n onReady: () => {\n this.ready = true;\n },\n topLayer: true,\n observeResize: true,\n observeAnchorMotion: true,\n liveUpdate: 'double-frame',\n });\n private readonly interaction = new AnchoredOverlayInteractionController({\n getAnchor: () => this.trigger ?? null,\n getPopup: () => this.popup ?? null,\n getOwnerDocument: () => this.el.ownerDocument,\n onOutsideActivation: () => this.close(),\n });\n disconnectedCallback() {\n this.close(false);\n }\n private close(restoreFocus = true) {\n this.tasks.cancel();\n this.position.unobserve();\n this.interaction.disconnect();\n if (this.popup?.matches(':popover-open')) this.popup.hidePopover();\n this.open = false;\n this.ready = false;\n if (restoreFocus) void this.trigger?.setFocus();\n }\n private toggle() {\n if (!this.el.isConnected) return;\n if (this.open) {\n this.close();\n return;\n }\n this.open = true;\n this.ready = false;\n this.position.observe();\n this.interaction.connect();\n this.position.schedule(async () => {\n const focus = this.tasks.guard(() => {\n this.tasks.frame(() => {\n if (this.open)\n this.popup?.querySelector<HTMLElement>('[role=\"tab\"][aria-selected=\"true\"]')?.focus();\n });\n });\n await this.popup?.querySelector('ds-tab-group')?.componentOnReady?.();\n focus();\n });\n }\n @Listen('keydown')\n onKeydown(event: KeyboardEvent) {\n if (this.embedded || !this.open || event.defaultPrevented) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.close();\n } else if (event.key === 'Tab' && this.interaction.tabLeavesPopup(event)) {\n event.preventDefault();\n this.close();\n this.interaction.moveFocusAfterTab(event.shiftKey);\n }\n }\n private forward<T>(event: CustomEvent<T>, emitter: EventEmitter<T>) {\n event.stopPropagation();\n emitter.emit(event.detail);\n }\n render() {\n const currentTab = this.embedded ? this.activeTab : this.tab;\n const tabs = ['filters', 'sort', 'group', 'customize'].map(id => ({\n id,\n label: id === 'filters' ? 'Filters' : id[0].toUpperCase() + id.slice(1),\n panelId: `${this.popupId}-${id}`,\n }));\n return (\n <Host>\n {!this.embedded && (\n <ds-tooltip label={this.label} side=\"bottom\" size=\"sm\">\n <ds-button-unfilled\n hasBorder={this.hasBorder}\n ref={el => {\n this.trigger = el;\n }}\n variant=\"icon\"\n icon=\"Preferences\"\n size=\"md\"\n ariaLabel={this.label}\n haspopup=\"dialog\"\n expanded={this.open}\n surfaceOpen={this.open}\n controls={this.popupId}\n onDsClick={() => this.toggle()}\n />\n </ds-tooltip>\n )}\n {(this.open || this.embedded) && (\n <div\n ref={el => {\n this.popup = el;\n }}\n id={this.popupId}\n popover={this.embedded ? undefined : 'manual'}\n role={this.embedded ? undefined : 'dialog'}\n aria-label={this.label}\n class={{\n 'data-preferences': !this.embedded,\n 'data-preferences-panel': this.embedded,\n }}\n style={\n this.embedded\n ? undefined\n : {\n left: `${this.pos.x}px`,\n top: `${this.pos.y}px`,\n visibility: this.ready ? 'visible' : 'hidden',\n }\n }\n >\n <div class=\"data-preferences__tabs\">\n <ds-tab-group\n ariaLabel=\"Table preference sections\"\n size=\"md\"\n presentation={this.embedded ? 'segmented' : 'tabs'}\n width={this.embedded ? 'fill' : 'hug'}\n tabs={tabs}\n value={currentTab}\n onDsChange={event => {\n event.stopPropagation();\n this.tab = event.detail as PreferencesTab;\n this.dsPreferencesTabChange.emit(this.tab);\n }}\n />\n </div>\n <div\n class=\"data-preferences__body\"\n id={`${this.popupId}-${currentTab}`}\n role=\"tabpanel\"\n aria-label={tabs.find(tab => tab.id === currentTab)?.label}\n >\n <div hidden={currentTab !== 'filters'}>\n <ds-filter-menu\n embedded\n vertical={this.embedded}\n applyRequired={!this.embedded}\n filters={this.filters}\n values={this.values}\n matchModes={this.matchModes}\n activeFilterId={this.activeFilterId}\n footerLayout=\"categories-clear\"\n onDsChange={e => this.forward(e, this.dsFilterChange)}\n onDsMatchModeChange={e => this.forward(e, this.dsFilterMatchModeChange)}\n onDsActiveFilterChange={e => this.forward(e, this.dsActiveFilterChange)}\n onDsClear={e => this.forward(e, this.dsFiltersClear)}\n />\n </div>\n {currentTab === 'sort' && (\n <ds-menu\n embedded\n menuLabel=\"Sort table\"\n sections={dataSortMenuSections(this.sortColumns ?? this.fields, this.sort)}\n onDsSelect={e => {\n e.stopPropagation();\n this.dsSortChange.emit({\n sort: nextDataSortStateFromMenuItem(\n this.sortColumns ?? this.fields,\n this.sort,\n e.detail\n ),\n });\n }}\n />\n )}\n {currentTab === 'group' && (\n <ds-data-group\n embedded\n vertical={this.embedded}\n options={this.groupingOptions}\n grouping={this.grouping}\n onDsGroupChange={e => this.forward(e, this.dsGroupChange)}\n onDsClear={e => this.forward(e, this.dsGroupClear)}\n />\n )}\n {currentTab === 'customize' && (\n <ds-menu\n embedded\n menuLabel={this.customizeLabel}\n sections={[\n ...(this.fields.length\n ? [\n {\n header:\n this.catalogHeader ??\n (this.customizeOptions.length ? 'Columns' : undefined),\n items: this.catalogReorderable\n ? tableColumnCustomizerMenuItems(\n this.fields,\n this.hiddenFieldIds,\n this.fieldOrder\n )\n : listCustomizerMenuItems(\n this.catalogItems(),\n this.hiddenFieldIds,\n this.fieldOrder,\n TOGGLE_ONLY_CATALOG\n ),\n },\n ]\n : []),\n ...this.customizeSections,\n ...(this.customizeOptions.length\n ? [{ header: 'Options', items: this.customizeOptions }]\n : []),\n ]}\n onDsSelect={e => {\n e.stopPropagation();\n if (!e.detail.value || e.detail.isInactive) return;\n if (\n [\n ...this.customizeOptions,\n ...this.customizeSections.flatMap(section =>\n 'items' in section ? section.items : []\n ),\n ].some(option => option.value === e.detail.value)\n ) {\n this.dsCustomizeOptionChange.emit(e.detail.value);\n return;\n }\n if (!this.catalogReorderable) {\n const ids = this.catalogItems().map(item => item.id);\n this.dsFieldsConfigChange.emit({\n hiddenFieldIds: toggleListHidden(\n ids,\n this.hiddenFieldIds,\n e.detail.value,\n TOGGLE_ONLY_CATALOG\n ),\n fieldOrder: resolveListOrder(ids, this.fieldOrder),\n });\n return;\n }\n this.dsFieldsConfigChange.emit({\n hiddenFieldIds: toggleTableColumnHidden(\n this.fields,\n this.hiddenFieldIds,\n e.detail.value\n ),\n fieldOrder: resolveTableColumnOrder(this.fields, this.fieldOrder),\n });\n }}\n onDsReorder={e => {\n e.stopPropagation();\n if (!this.catalogReorderable) return;\n this.dsFieldsConfigChange.emit({\n hiddenFieldIds: this.hiddenFieldIds,\n fieldOrder: e.detail.items\n .filter(item => item.reorderable)\n .map(item => item.value!)\n .filter(Boolean),\n });\n }}\n />\n )}\n </div>\n </div>\n )}\n </Host>\n );\n }\n}\n",
|
|
603
|
+
"content": "import type { DataField } from '../../utils/data-field';\nimport type { MenuItemData, MenuItemToggleDetail, MenuSection } from '../Menu/menu-types';\nimport { resolveAnchoredOverlayBoundaryRect } from '../../utils/anchored-overlay-boundary';\nimport {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Prop,\n State,\n} from '@stencil/core';\nimport type {\n FilterMenuFilter,\n FilterMenuValues,\n FilterMenuMatchModes,\n FilterMenuChangeDetail,\n FilterMenuMatchModeChangeDetail,\n} from '../FilterMenu/FilterMenu';\nimport type {\n TableColumn,\n DataSortState,\n DataSortChangeDetail,\n DataGroupingState,\n DataFieldsConfigChangeDetail,\n} from '../Table/table-types';\nimport type { DataGroupOption } from '../DataGroup/DataGroup';\nimport { dataSortMenuSections, nextDataSortStateFromMenuItem } from '../DataSort/data-sort-menu';\nimport {\n tableColumnCustomizerLabel,\n tableColumnCustomizerSections,\n tableDataColumns,\n toggleTableColumnHidden,\n reorderTableColumnPartition,\n resolveTableFieldsConfiguration,\n toggleTableColumnPinned,\n} from '../Table/table-column-customizer';\nimport {\n listCustomizerMenuItems,\n resolveListOrder,\n toggleListHidden,\n type ListCustomizerOptions,\n} from '../../utils/list-customizer';\nimport { AnchoredPositionController } from '../../utils/anchored-position-controller';\nimport { ConnectionTasks } from '../../utils/connection-tasks';\nimport { AnchoredOverlayInteractionController } from '../../utils/anchored-overlay-interaction-controller';\nimport { resolveCssLengthPx } from '../../utils/resolve-css-length-px';\nimport { TOKEN_DEFAULTS } from '../../utils/token-defaults';\n\n/** Toggle-only catalog: every entry may hide and no row carries a drag handle. */\nconst TOGGLE_ONLY_CATALOG: ListCustomizerOptions = { minVisible: 0, reorderable: false };\n\nexport type PreferencesTab = 'filters' | 'sort' | 'group' | 'customize';\nlet preferencesSequence = 0;\n\n@Component({ tag: 'ds-data-preferences', styleUrl: 'DataPreferences.css', scoped: true })\nexport class DataPreferences {\n @Element() el!: HTMLElement;\n /** Show the trigger border. */\n @Prop() hasBorder: boolean = true;\n @Prop() filters: FilterMenuFilter[] = [];\n @Prop() values: FilterMenuValues = {};\n @Prop() matchModes: FilterMenuMatchModes = {};\n @Prop() activeFilterId: string | undefined;\n @Prop() fields: DataField[] = [];\n /** Additional toggle options in the column customizer. */\n @Prop() customizeOptions: MenuItemData[] = [];\n @Prop() customizeSections: MenuSection[] = [];\n /** Accessible name for the Customize menu. */\n @Prop() customizeLabel: string = 'Customize table';\n /**\n * Section header above the catalog rows. Defaults to Columns when\n * customizeOptions supply a second section, matching the table.\n */\n @Prop() catalogHeader?: string;\n /**\n * Drag-reorder the catalog rows and keep the last visible entry locked, as a\n * table requires. Pass false for a catalog that only shows and hides, where\n * every entry may be hidden and rows carry no drag handle.\n */\n @Prop() catalogReorderable: boolean = true;\n @Event() dsCustomizeOptionChange!: EventEmitter<string>;\n /** Optional sort fields when they differ from customizable content. */\n @Prop() sortColumns?: TableColumn[];\n @Prop() sort: DataSortState | null = null;\n @Prop() groupingOptions: DataGroupOption[] = [];\n @Prop() grouping: DataGroupingState | null = null;\n @Prop() hiddenFieldIds: string[] = [];\n @Prop() fieldOrder: string[] = [];\n /** Controlled user-pinned table-column identities. Ignored for toggle-only catalogs. */\n @Prop() pinnedFieldIds: string[] = [];\n /** Render shared content without its popup or trigger. */\n @Prop() embedded = false;\n @Prop() activeTab: PreferencesTab = 'filters';\n @Event() dsPreferencesTabChange!: EventEmitter<PreferencesTab>;\n @Prop() label = 'Configure view';\n @Event() dsFilterChange!: EventEmitter<FilterMenuChangeDetail>;\n @Event() dsFilterMatchModeChange!: EventEmitter<FilterMenuMatchModeChangeDetail>;\n @Event() dsActiveFilterChange!: EventEmitter<string>;\n @Event() dsFiltersClear!: EventEmitter<void>;\n @Event() dsSortChange!: EventEmitter<DataSortChangeDetail>;\n @Event() dsGroupChange!: EventEmitter<DataGroupingState>;\n @Event() dsGroupClear!: EventEmitter<void>;\n @Event() dsFieldsConfigChange!: EventEmitter<DataFieldsConfigChangeDetail>;\n\n /** Catalog rows as domain-neutral items, so a non-table catalog needs no column shape. */\n private catalogItems(): { id: string; label: string }[] {\n return tableDataColumns(this.fields).map(column => ({\n id: column.id,\n label: tableColumnCustomizerLabel(column),\n }));\n }\n\n private customizeMenuSections(): MenuSection[] {\n const catalogSections: MenuSection[] = !this.fields.length\n ? []\n : this.catalogReorderable\n ? tableColumnCustomizerSections(\n this.fields,\n this.hiddenFieldIds,\n this.fieldOrder,\n this.pinnedFieldIds\n ).map((section, index, sections) =>\n index === 0 && sections.length === 1 && this.catalogHeader\n ? { ...section, header: this.catalogHeader }\n : section\n )\n : [\n {\n header: this.catalogHeader ?? (this.customizeOptions.length ? 'Columns' : undefined),\n items: listCustomizerMenuItems(\n this.catalogItems(),\n this.hiddenFieldIds,\n this.fieldOrder,\n TOGGLE_ONLY_CATALOG\n ),\n },\n ];\n return [\n ...catalogSections,\n ...this.customizeSections,\n ...(this.customizeOptions.length\n ? [{ header: 'Options', items: this.customizeOptions }]\n : []),\n ];\n }\n @State() private open = false;\n @State() private tab: PreferencesTab = 'filters';\n @State() private pos = { x: 0, y: 0 };\n @State() private ready = false;\n private readonly popupId = `ds-data-preferences-${++preferencesSequence}`;\n private trigger?: HTMLDsButtonUnfilledElement;\n private popup?: HTMLElement;\n private readonly tasks = new ConnectionTasks(() => this.el.isConnected);\n private readonly position = new AnchoredPositionController({\n getAnchor: () => this.trigger ?? null,\n getPopup: () => this.popup ?? null,\n getOwnerDocument: () => this.el.ownerDocument,\n measure: (anchor, popup) => {\n const collisionRect = resolveAnchoredOverlayBoundaryRect(anchor);\n const pad = resolveCssLengthPx(TOKEN_DEFAULTS.space100, 8);\n popup.style.maxWidth = `${Math.max(0, Math.min(window.innerWidth, collisionRect?.width ?? window.innerWidth) - pad * 2)}px`;\n popup.style.maxHeight = `${Math.max(0, Math.min(window.innerHeight, collisionRect?.height ?? window.innerHeight) - pad * 2)}px`;\n return {\n anchorRect: anchor.getBoundingClientRect(),\n popupWidth: popup.offsetWidth,\n popupHeight: popup.offsetHeight,\n side: 'bottom',\n align: 'end',\n sideOffsetPx: resolveCssLengthPx(TOKEN_DEFAULTS.space050, 4),\n alignOffsetPx: 0,\n viewportPadPx: resolveCssLengthPx(TOKEN_DEFAULTS.space100, 8),\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n collisionRect,\n };\n },\n apply: ({ x, y }) => {\n this.pos = { x, y };\n },\n onReady: () => {\n this.ready = true;\n },\n topLayer: true,\n observeResize: true,\n observeAnchorMotion: true,\n liveUpdate: 'double-frame',\n });\n private readonly interaction = new AnchoredOverlayInteractionController({\n getAnchor: () => this.trigger ?? null,\n getPopup: () => this.popup ?? null,\n getOwnerDocument: () => this.el.ownerDocument,\n onOutsideActivation: () => this.close(),\n });\n disconnectedCallback() {\n this.close(false);\n }\n private close(restoreFocus = true) {\n this.tasks.cancel();\n this.position.unobserve();\n this.interaction.disconnect();\n if (this.popup?.matches(':popover-open')) this.popup.hidePopover();\n this.open = false;\n this.ready = false;\n if (restoreFocus) void this.trigger?.setFocus();\n }\n private toggle() {\n if (!this.el.isConnected) return;\n if (this.open) {\n this.close();\n return;\n }\n this.open = true;\n this.ready = false;\n this.position.observe();\n this.interaction.connect();\n this.position.schedule(async () => {\n const focus = this.tasks.guard(() => {\n this.tasks.frame(() => {\n if (this.open)\n this.popup?.querySelector<HTMLElement>('[role=\"tab\"][aria-selected=\"true\"]')?.focus();\n });\n });\n await this.popup?.querySelector('ds-tab-group')?.componentOnReady?.();\n focus();\n });\n }\n @Listen('keydown')\n onKeydown(event: KeyboardEvent) {\n if (this.embedded || !this.open || event.defaultPrevented) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.close();\n } else if (event.key === 'Tab' && this.interaction.tabLeavesPopup(event)) {\n event.preventDefault();\n this.close();\n this.interaction.moveFocusAfterTab(event.shiftKey);\n }\n }\n private forward<T>(event: CustomEvent<T>, emitter: EventEmitter<T>) {\n event.stopPropagation();\n emitter.emit(event.detail);\n }\n render() {\n const currentTab = this.embedded ? this.activeTab : this.tab;\n const tabs = ['filters', 'sort', 'group', 'customize'].map(id => ({\n id,\n label: id === 'filters' ? 'Filters' : id[0].toUpperCase() + id.slice(1),\n panelId: `${this.popupId}-${id}`,\n }));\n return (\n <Host>\n {!this.embedded && (\n <ds-tooltip label={this.label} side=\"bottom\" size=\"sm\">\n <ds-button-unfilled\n hasBorder={this.hasBorder}\n ref={el => {\n this.trigger = el;\n }}\n variant=\"icon\"\n icon=\"Preferences\"\n size=\"md\"\n ariaLabel={this.label}\n haspopup=\"dialog\"\n expanded={this.open}\n surfaceOpen={this.open}\n controls={this.popupId}\n onDsClick={() => this.toggle()}\n />\n </ds-tooltip>\n )}\n {(this.open || this.embedded) && (\n <div\n ref={el => {\n this.popup = el;\n }}\n id={this.popupId}\n popover={this.embedded ? undefined : 'manual'}\n role={this.embedded ? undefined : 'dialog'}\n aria-label={this.label}\n class={{\n 'data-preferences': !this.embedded,\n 'data-preferences-panel': this.embedded,\n }}\n style={\n this.embedded\n ? undefined\n : {\n left: `${this.pos.x}px`,\n top: `${this.pos.y}px`,\n visibility: this.ready ? 'visible' : 'hidden',\n }\n }\n >\n <div class=\"data-preferences__tabs\">\n <ds-tab-group\n ariaLabel=\"Table preference sections\"\n size=\"md\"\n presentation={this.embedded ? 'segmented' : 'tabs'}\n width={this.embedded ? 'fill' : 'hug'}\n tabs={tabs}\n value={currentTab}\n onDsChange={event => {\n event.stopPropagation();\n this.tab = event.detail as PreferencesTab;\n this.dsPreferencesTabChange.emit(this.tab);\n }}\n />\n </div>\n <div\n class=\"data-preferences__body\"\n id={`${this.popupId}-${currentTab}`}\n role=\"tabpanel\"\n aria-label={tabs.find(tab => tab.id === currentTab)?.label}\n >\n <div hidden={currentTab !== 'filters'}>\n <ds-filter-menu\n embedded\n vertical={this.embedded}\n applyRequired={!this.embedded}\n filters={this.filters}\n values={this.values}\n matchModes={this.matchModes}\n activeFilterId={this.activeFilterId}\n footerLayout=\"categories-clear\"\n onDsChange={e => this.forward(e, this.dsFilterChange)}\n onDsMatchModeChange={e => this.forward(e, this.dsFilterMatchModeChange)}\n onDsActiveFilterChange={e => this.forward(e, this.dsActiveFilterChange)}\n onDsClear={e => this.forward(e, this.dsFiltersClear)}\n />\n </div>\n {currentTab === 'sort' && (\n <ds-menu\n embedded\n menuLabel=\"Sort table\"\n sections={dataSortMenuSections(this.sortColumns ?? this.fields, this.sort)}\n onDsSelect={e => {\n e.stopPropagation();\n this.dsSortChange.emit({\n sort: nextDataSortStateFromMenuItem(\n this.sortColumns ?? this.fields,\n this.sort,\n e.detail\n ),\n });\n }}\n />\n )}\n {currentTab === 'group' && (\n <ds-data-group\n embedded\n vertical={this.embedded}\n options={this.groupingOptions}\n grouping={this.grouping}\n onDsGroupChange={e => this.forward(e, this.dsGroupChange)}\n onDsClear={e => this.forward(e, this.dsGroupClear)}\n />\n )}\n {currentTab === 'customize' && (\n <ds-menu\n embedded\n menuLabel={this.customizeLabel}\n sections={this.customizeMenuSections()}\n onDsSelect={e => {\n e.stopPropagation();\n if (!e.detail.value || e.detail.isInactive) return;\n if (\n [\n ...this.customizeOptions,\n ...this.customizeSections.flatMap(section =>\n 'items' in section ? section.items : []\n ),\n ].some(option => option.value === e.detail.value)\n ) {\n this.dsCustomizeOptionChange.emit(e.detail.value);\n return;\n }\n if (!this.catalogReorderable) {\n const ids = this.catalogItems().map(item => item.id);\n this.dsFieldsConfigChange.emit({\n hiddenFieldIds: toggleListHidden(\n ids,\n this.hiddenFieldIds,\n e.detail.value,\n TOGGLE_ONLY_CATALOG\n ),\n fieldOrder: resolveListOrder(ids, this.fieldOrder),\n pinnedFieldIds: this.pinnedFieldIds,\n });\n return;\n }\n this.dsFieldsConfigChange.emit(\n resolveTableFieldsConfiguration(\n this.fields,\n toggleTableColumnHidden(this.fields, this.hiddenFieldIds, e.detail.value),\n this.fieldOrder,\n this.pinnedFieldIds\n )\n );\n }}\n onDsItemToggle={(e: CustomEvent<MenuItemToggleDetail>) => {\n e.stopPropagation();\n if (!this.catalogReorderable || !e.detail.item.value) return;\n if (e.detail.action?.id === 'visibility') {\n this.dsFieldsConfigChange.emit(\n resolveTableFieldsConfiguration(\n this.fields,\n toggleTableColumnHidden(\n this.fields,\n this.hiddenFieldIds,\n e.detail.item.value\n ),\n this.fieldOrder,\n this.pinnedFieldIds\n )\n );\n return;\n }\n if (e.detail.action?.id !== 'pin') return;\n this.dsFieldsConfigChange.emit(\n toggleTableColumnPinned(\n this.fields,\n this.hiddenFieldIds,\n this.fieldOrder,\n this.pinnedFieldIds,\n e.detail.item.value\n )\n );\n }}\n onDsReorder={e => {\n e.stopPropagation();\n if (!this.catalogReorderable) return;\n this.dsFieldsConfigChange.emit(\n reorderTableColumnPartition(\n this.fields,\n this.hiddenFieldIds,\n this.fieldOrder,\n this.pinnedFieldIds,\n e.detail.items\n .filter(item => item.reorderable)\n .map(item => item.value!)\n .filter(Boolean)\n )\n );\n }}\n />\n )}\n </div>\n </div>\n )}\n </Host>\n );\n }\n}\n",
|
|
588
604
|
"type": "registry:ui"
|
|
589
605
|
}
|
|
590
606
|
]
|
|
@@ -418,7 +418,7 @@
|
|
|
418
418
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: views.",
|
|
419
419
|
"peerDependencies": {
|
|
420
420
|
"required": [
|
|
421
|
-
"@ds-mo/tokens ^6.
|
|
421
|
+
"@ds-mo/tokens ^6.7.0",
|
|
422
422
|
"@ds-mo/icons ^8.1.1"
|
|
423
423
|
],
|
|
424
424
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -348,7 +348,7 @@
|
|
|
348
348
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: fields, selectedFieldIds.",
|
|
349
349
|
"peerDependencies": {
|
|
350
350
|
"required": [
|
|
351
|
-
"@ds-mo/tokens ^6.
|
|
351
|
+
"@ds-mo/tokens ^6.7.0",
|
|
352
352
|
"@ds-mo/icons ^8.1.1"
|
|
353
353
|
],
|
|
354
354
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -244,7 +244,7 @@
|
|
|
244
244
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: fields, sort.",
|
|
245
245
|
"peerDependencies": {
|
|
246
246
|
"required": [
|
|
247
|
-
"@ds-mo/tokens ^6.
|
|
247
|
+
"@ds-mo/tokens ^6.7.0",
|
|
248
248
|
"@ds-mo/icons ^8.1.1"
|
|
249
249
|
],
|
|
250
250
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|