@ds-mo/ui 16.1.0 → 16.1.2
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 +133 -32
- package/dist/angular/boolean-value-accessor.js +3 -3
- package/dist/angular/ds-agent-activity.js +3 -3
- package/dist/angular/ds-agent-questionnaire.js +3 -3
- package/dist/angular/ds-agent-response.js +3 -3
- package/dist/angular/ds-agent-source-list.js +3 -3
- package/dist/angular/ds-agent-tool-call.js +3 -3
- package/dist/angular/ds-attachment-list.js +3 -3
- package/dist/angular/ds-avatar.js +3 -3
- package/dist/angular/ds-badge.js +3 -3
- package/dist/angular/ds-banner.js +3 -3
- package/dist/angular/ds-bar-action.js +3 -3
- package/dist/angular/ds-bar-nav.js +3 -3
- package/dist/angular/ds-bar-page-title.js +3 -3
- package/dist/angular/ds-bar-title.js +3 -3
- package/dist/angular/ds-bar-workflow.js +3 -3
- package/dist/angular/ds-breadcrumb.js +3 -3
- package/dist/angular/ds-button-filled.js +3 -3
- package/dist/angular/ds-button-inverted.js +3 -3
- package/dist/angular/ds-button-unfilled.js +3 -3
- package/dist/angular/ds-calendar.js +3 -3
- package/dist/angular/ds-card-action-center.js +3 -3
- package/dist/angular/ds-card-chart.js +3 -3
- package/dist/angular/ds-card-navigation.js +3 -3
- package/dist/angular/ds-card-overview.js +3 -3
- package/dist/angular/ds-card-setting.js +3 -3
- package/dist/angular/ds-card-settings-scope.js +3 -3
- package/dist/angular/ds-chart-legend.js +3 -3
- package/dist/angular/ds-chart.js +3 -3
- package/dist/angular/ds-checkbox-group.js +3 -3
- package/dist/angular/ds-checkbox.js +3 -3
- package/dist/angular/ds-chip.js +3 -3
- package/dist/angular/ds-code-block.js +3 -3
- package/dist/angular/ds-conversation-list-item.js +3 -3
- package/dist/angular/ds-conversation-list-section.js +3 -3
- package/dist/angular/ds-conversation-list.js +3 -3
- package/dist/angular/ds-data-customize.js +3 -3
- package/dist/angular/ds-data-filter.js +3 -3
- package/dist/angular/ds-data-group.js +3 -3
- package/dist/angular/ds-data-preferences.js +3 -3
- package/dist/angular/ds-data-saved-views.js +3 -3
- package/dist/angular/ds-data-search.js +3 -3
- package/dist/angular/ds-data-sort.js +3 -3
- package/dist/angular/ds-data-toolbar.js +3 -3
- package/dist/angular/ds-divider.js +3 -3
- package/dist/angular/ds-empty-state.js +3 -3
- package/dist/angular/ds-field.js +3 -3
- package/dist/angular/ds-filter-menu.js +3 -3
- package/dist/angular/ds-icon.js +3 -3
- package/dist/angular/ds-inline-banner-settings.js +3 -3
- package/dist/angular/ds-input-date.js +3 -3
- package/dist/angular/ds-input-time.js +3 -3
- package/dist/angular/ds-input.js +3 -3
- package/dist/angular/ds-loader.js +3 -3
- package/dist/angular/ds-map-cluster-marker.js +3 -3
- package/dist/angular/ds-map-entity-marker.js +3 -3
- package/dist/angular/ds-map-marker.js +3 -3
- package/dist/angular/ds-markdown.js +3 -3
- package/dist/angular/ds-menu.js +3 -3
- package/dist/angular/ds-message-actions.js +3 -3
- package/dist/angular/ds-message-bubble.js +3 -3
- package/dist/angular/ds-message-composer.js +3 -3
- package/dist/angular/ds-message-scroller.js +3 -3
- package/dist/angular/ds-message.js +3 -3
- package/dist/angular/ds-mobile-bar-nav.js +3 -3
- package/dist/angular/ds-mobile-header.js +3 -3
- package/dist/angular/ds-mobile-section-switcher.js +3 -3
- package/dist/angular/ds-mobile-sheet-nav.js +3 -3
- package/dist/angular/ds-modal.js +3 -3
- package/dist/angular/ds-navigation-tab-group.js +3 -3
- package/dist/angular/ds-pagination.js +3 -3
- package/dist/angular/ds-panel-nav.js +3 -3
- package/dist/angular/ds-panel-sub-nav.js +3 -3
- package/dist/angular/ds-panel-tool-header.js +3 -3
- package/dist/angular/ds-panel-tool-search.js +3 -3
- package/dist/angular/ds-panel-tools.js +3 -3
- package/dist/angular/ds-paper-texture.js +3 -3
- package/dist/angular/ds-radio-tile.js +3 -3
- package/dist/angular/ds-radio.js +3 -3
- package/dist/angular/ds-score.js +3 -3
- package/dist/angular/ds-scroll-overlay.js +3 -3
- package/dist/angular/ds-select-toggle.js +3 -3
- package/dist/angular/ds-select.js +3 -3
- package/dist/angular/ds-setting-row-checkbox.js +3 -3
- package/dist/angular/ds-setting-row-radio.js +3 -3
- package/dist/angular/ds-setting-row-toggle.js +3 -3
- package/dist/angular/ds-shell-app.js +3 -3
- package/dist/angular/ds-shell-page.js +3 -3
- package/dist/angular/ds-shell-tools.js +3 -3
- package/dist/angular/ds-skeleton.js +3 -3
- package/dist/angular/ds-slider.js +3 -3
- package/dist/angular/ds-swatch-picker.js +3 -3
- package/dist/angular/ds-switch.js +3 -3
- package/dist/angular/ds-tab-group.js +3 -3
- package/dist/angular/ds-table.js +3 -3
- package/dist/angular/ds-tag.js +3 -3
- package/dist/angular/ds-text.js +3 -3
- package/dist/angular/ds-textarea.js +3 -3
- package/dist/angular/ds-time-picker.js +3 -3
- package/dist/angular/ds-toast.js +3 -3
- package/dist/angular/ds-tooltip-chart.js +3 -3
- package/dist/angular/ds-tooltip.js +3 -3
- package/dist/angular/ds-typing-indicator.js +3 -3
- package/dist/angular/number-value-accessor.js +3 -3
- package/dist/angular/radio-value-accessor.js +3 -3
- package/dist/angular/select-value-accessor.js +3 -3
- package/dist/angular/text-value-accessor.js +3 -3
- package/dist/angular/value-accessor.js +3 -3
- package/dist/components/THIRD-PARTY-NOTICES +2 -2
- package/dist/components/bundled-dependencies.json +2 -2
- 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-chart-legend.js +1 -1
- package/dist/components/ds-chart-legend.js.map +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-saved-views.js +1 -1
- package/dist/components/ds-data-search.js +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/index.js +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/{p-BufAjyCA.js → p-9zDZcSc0.js} +2 -2
- package/dist/components/{p-SuM1Dske.js → p-B8jrUwL-.js} +2 -2
- package/dist/components/{p-DbBRCHst.js → p-BJB6kfA2.js} +2 -2
- package/dist/components/{p-a_-GSwE_.js → p-BK_SriZN.js} +2 -2
- package/dist/components/{p-DwiHy7ws.js → p-BKd0e8k8.js} +2 -2
- package/dist/components/{p-FsosWHV6.js → p-BNySDuzx.js} +2 -2
- package/dist/components/{p-DGznD-OD.js → p-BdJqRDKY.js} +2 -2
- package/dist/components/{p-CtBlyEwu.js → p-BgMeLCj3.js} +2 -2
- package/dist/components/{p-B6kIiHGc.js → p-BknNUjWh.js} +2 -2
- package/dist/components/{p-D1D_nwPJ.js → p-Bn-tsogb.js} +2 -2
- package/dist/components/{p-C9R-Yn0N.js → p-C3nUi5Lo.js} +2 -2
- package/dist/components/{p-DACIe-66.js → p-CcWT4SzP.js} +2 -2
- package/dist/components/{p-BL98zGOI.js → p-Ckar-ZZa.js} +2 -2
- package/dist/components/{p-D4wFhnby.js → p-CvK-Gy-b.js} +2 -2
- package/dist/components/{p-8XJLNIKj.js → p-D9MqUHig.js} +2 -2
- package/dist/components/{p-BNimvRZy.js → p-DI5GEmid.js} +2 -2
- package/dist/components/p-DTlNtCX1.js +2 -0
- package/dist/components/p-DTlNtCX1.js.map +1 -0
- package/dist/components/p-D_kOVT6i.js +2 -0
- package/dist/components/{p-S6vTfjOk.js.map → p-D_kOVT6i.js.map} +1 -1
- package/dist/components/{p-DC_yjqdf.js → p-Ddkyu_wE.js} +2 -2
- package/dist/components/{p-CeaXdjwl.js → p-ZcZ0N7Ok.js} +2 -2
- package/dist/components/{p-BO0Tb3LT.js → p-ZumxIz-2.js} +2 -2
- package/dist/components/{p-BLPr2sCi.js → p-qnp-yeXl.js} +2 -2
- package/dist/components/{p-02bODFpT.js → p-txmcXZdy.js} +2 -2
- package/dist/components/{p-BiB2qjNS.js → p-xouEdChm.js} +2 -2
- package/dist/components/{p-Dp90dvw8.js → p-zdiRX3Sf.js} +2 -2
- package/dist/docs/components.json +359 -39
- package/dist/lib/toast/index.js +61 -20
- package/dist/lib/toast/index.js.map +2 -2
- package/dist/lib/toast/toast-types.d.ts +1 -0
- package/dist/lint/THIRD-PARTY-NOTICES +1 -1
- package/dist/lint/bundled-dependencies.json +1 -1
- package/dist/lint/index.js +18 -10
- package/dist/mcp-data/registry/agent-response.json +30 -2
- package/dist/mcp-data/registry/agent-tool-call.json +22 -2
- package/dist/mcp-data/registry/banner.json +10 -2
- package/dist/mcp-data/registry/bar-action.json +10 -2
- package/dist/mcp-data/registry/card-chart.json +30 -2
- package/dist/mcp-data/registry/card-navigation.json +12 -2
- package/dist/mcp-data/registry/card-overview.json +22 -2
- package/dist/mcp-data/registry/card-setting.json +18 -2
- package/dist/mcp-data/registry/chart-legend.json +6 -6
- package/dist/mcp-data/registry/checkbox-group.json +12 -2
- package/dist/mcp-data/registry/conversation-list-item.json +22 -2
- package/dist/mcp-data/registry/conversation-list-section.json +12 -2
- package/dist/mcp-data/registry/conversation-list.json +24 -2
- package/dist/mcp-data/registry/data-toolbar.json +28 -2
- package/dist/mcp-data/registry/field.json +12 -2
- package/dist/mcp-data/registry/input.json +16 -2
- package/dist/mcp-data/registry/message-bubble.json +12 -2
- package/dist/mcp-data/registry/message-composer.json +28 -2
- package/dist/mcp-data/registry/message-scroller.json +24 -2
- package/dist/mcp-data/registry/message.json +36 -2
- package/dist/mcp-data/registry/mobile-header.json +16 -2
- package/dist/mcp-data/registry/modal.json +18 -2
- package/dist/mcp-data/registry/registry.json +132 -31
- package/dist/mcp-data/registry/scroll-overlay.json +18 -2
- package/dist/mcp-data/registry/setting-row-checkbox.json +12 -2
- package/dist/mcp-data/registry/setting-row-radio.json +12 -2
- package/dist/mcp-data/registry/shell-app.json +60 -2
- package/dist/mcp-data/registry/shell-page.json +24 -2
- package/dist/mcp-data/registry/table.json +31 -2
- package/dist/mcp-data/registry/text.json +12 -2
- package/dist/mcp-data/registry/tooltip.json +12 -2
- package/dist/react/react-runtime.js +44 -1
- package/dist/types/components/ChartLegend/ChartLegend.d.ts +2 -2
- package/dist/types/components/Table/table-group-load-controller.d.ts +1 -1
- package/dist/types/components/Table/table-load-controller.d.ts +1 -2
- package/dist/types/components/Table/table-load-observer.d.ts +13 -0
- package/dist/types/components.d.ts +3 -3
- package/dist/types/stencil-public-runtime.d.ts +73 -55
- package/dist/types/toast/toast-types.d.ts +1 -0
- package/dist/types/utils/anchored-position-controller.d.ts +3 -2
- package/dist/vue/vue-runtime.js +13 -1
- package/package.json +15 -12
- package/dist/components/p-BMI0F08u.js +0 -2
- package/dist/components/p-BMI0F08u.js.map +0 -1
- package/dist/components/p-S6vTfjOk.js +0 -2
- /package/dist/components/{p-BufAjyCA.js.map → p-9zDZcSc0.js.map} +0 -0
- /package/dist/components/{p-SuM1Dske.js.map → p-B8jrUwL-.js.map} +0 -0
- /package/dist/components/{p-DbBRCHst.js.map → p-BJB6kfA2.js.map} +0 -0
- /package/dist/components/{p-a_-GSwE_.js.map → p-BK_SriZN.js.map} +0 -0
- /package/dist/components/{p-DwiHy7ws.js.map → p-BKd0e8k8.js.map} +0 -0
- /package/dist/components/{p-FsosWHV6.js.map → p-BNySDuzx.js.map} +0 -0
- /package/dist/components/{p-DGznD-OD.js.map → p-BdJqRDKY.js.map} +0 -0
- /package/dist/components/{p-CtBlyEwu.js.map → p-BgMeLCj3.js.map} +0 -0
- /package/dist/components/{p-B6kIiHGc.js.map → p-BknNUjWh.js.map} +0 -0
- /package/dist/components/{p-D1D_nwPJ.js.map → p-Bn-tsogb.js.map} +0 -0
- /package/dist/components/{p-C9R-Yn0N.js.map → p-C3nUi5Lo.js.map} +0 -0
- /package/dist/components/{p-DACIe-66.js.map → p-CcWT4SzP.js.map} +0 -0
- /package/dist/components/{p-BL98zGOI.js.map → p-Ckar-ZZa.js.map} +0 -0
- /package/dist/components/{p-D4wFhnby.js.map → p-CvK-Gy-b.js.map} +0 -0
- /package/dist/components/{p-8XJLNIKj.js.map → p-D9MqUHig.js.map} +0 -0
- /package/dist/components/{p-BNimvRZy.js.map → p-DI5GEmid.js.map} +0 -0
- /package/dist/components/{p-DC_yjqdf.js.map → p-Ddkyu_wE.js.map} +0 -0
- /package/dist/components/{p-CeaXdjwl.js.map → p-ZcZ0N7Ok.js.map} +0 -0
- /package/dist/components/{p-BO0Tb3LT.js.map → p-ZumxIz-2.js.map} +0 -0
- /package/dist/components/{p-BLPr2sCi.js.map → p-qnp-yeXl.js.map} +0 -0
- /package/dist/components/{p-02bODFpT.js.map → p-txmcXZdy.js.map} +0 -0
- /package/dist/components/{p-BiB2qjNS.js.map → p-xouEdChm.js.map} +0 -0
- /package/dist/components/{p-Dp90dvw8.js.map → p-zdiRX3Sf.js.map} +0 -0
|
@@ -943,9 +943,21 @@
|
|
|
943
943
|
}
|
|
944
944
|
],
|
|
945
945
|
"slots": [
|
|
946
|
+
{
|
|
947
|
+
"name": "alternate-view"
|
|
948
|
+
},
|
|
946
949
|
{
|
|
947
950
|
"name": "error-actions",
|
|
948
951
|
"description": "Application-owned recovery controls below the initial error message."
|
|
952
|
+
},
|
|
953
|
+
{
|
|
954
|
+
"name": "footer"
|
|
955
|
+
},
|
|
956
|
+
{
|
|
957
|
+
"name": "footer-leading"
|
|
958
|
+
},
|
|
959
|
+
{
|
|
960
|
+
"name": "footer-trailing"
|
|
949
961
|
}
|
|
950
962
|
]
|
|
951
963
|
},
|
|
@@ -1652,9 +1664,21 @@
|
|
|
1652
1664
|
}
|
|
1653
1665
|
],
|
|
1654
1666
|
"slots": [
|
|
1667
|
+
{
|
|
1668
|
+
"name": "alternate-view"
|
|
1669
|
+
},
|
|
1655
1670
|
{
|
|
1656
1671
|
"name": "error-actions",
|
|
1657
1672
|
"description": "Application-owned recovery controls below the initial error message."
|
|
1673
|
+
},
|
|
1674
|
+
{
|
|
1675
|
+
"name": "footer"
|
|
1676
|
+
},
|
|
1677
|
+
{
|
|
1678
|
+
"name": "footer-leading"
|
|
1679
|
+
},
|
|
1680
|
+
{
|
|
1681
|
+
"name": "footer-trailing"
|
|
1658
1682
|
}
|
|
1659
1683
|
],
|
|
1660
1684
|
"exports": {
|
|
@@ -1775,7 +1799,7 @@
|
|
|
1775
1799
|
},
|
|
1776
1800
|
{
|
|
1777
1801
|
"path": "src/wc/components/Table/table-group-load-controller.ts",
|
|
1778
|
-
"content": "import type {\n DataGroup,\n TableGroupLoadMoreDetail,\n TableLoadMoreMode,\n TableLoadMoreReason,\n} from './table-types';\n\nexport interface TableGroupLoadControllerState {\n enabled: boolean;\n loadMoreMode: TableLoadMoreMode;\n loadMoreThreshold: number;\n containedScroll: boolean;\n groups: DataGroup[];\n viewport: HTMLElement | null;\n sentinels: ReadonlyMap<string, HTMLElement>;\n loadingMoreLabel: string;\n endOfResultsLabel: string;\n rowsLoadedLabel: string;\n}\n\nexport interface TableGroupLoadControllerOptions {\n state: () => TableGroupLoadControllerState;\n announce: (message: string) => void;\n request: (detail: TableGroupLoadMoreDetail) => void;\n}\n\ninterface GroupSnapshot {\n count: number;\n hasMore: boolean;\n loading: boolean;\n error: string;\n identity: string | number;\n}\n\nfunction groupIdentity(group: DataGroup): string | number {\n return group.loadIdentity ?? group.id;\n}\n\nfunction formatGroupLabel(template: string, group: DataGroup, count?: number): string {\n return template\n .split('{group}')\n .join(group.label)\n .split('{count}')\n .join(String(count ?? group.rows.length))\n .split('{loaded}')\n .join(String(group.rows.length))\n .split('{total}')\n .join(String(group.totalCount ?? group.rows.length));\n}\n\n/** Owns request guards, announcements, and observation for independently loaded groups. */\nexport class TableGroupLoadController {\n readonly intersectionSupported = typeof IntersectionObserver !== 'undefined';\n\n private connected = false;\n private
|
|
1802
|
+
"content": "import type {\n DataGroup,\n TableGroupLoadMoreDetail,\n TableLoadMoreMode,\n TableLoadMoreReason,\n} from './table-types';\nimport { TableLoadObserver } from './table-load-observer';\n\nexport interface TableGroupLoadControllerState {\n enabled: boolean;\n loadMoreMode: TableLoadMoreMode;\n loadMoreThreshold: number;\n containedScroll: boolean;\n groups: DataGroup[];\n viewport: HTMLElement | null;\n sentinels: ReadonlyMap<string, HTMLElement>;\n loadingMoreLabel: string;\n endOfResultsLabel: string;\n rowsLoadedLabel: string;\n}\n\nexport interface TableGroupLoadControllerOptions {\n state: () => TableGroupLoadControllerState;\n announce: (message: string) => void;\n request: (detail: TableGroupLoadMoreDetail) => void;\n}\n\ninterface GroupSnapshot {\n count: number;\n hasMore: boolean;\n loading: boolean;\n error: string;\n identity: string | number;\n}\n\nfunction groupIdentity(group: DataGroup): string | number {\n return group.loadIdentity ?? group.id;\n}\n\nfunction formatGroupLabel(template: string, group: DataGroup, count?: number): string {\n return template\n .split('{group}')\n .join(group.label)\n .split('{count}')\n .join(String(count ?? group.rows.length))\n .split('{loaded}')\n .join(String(group.rows.length))\n .split('{total}')\n .join(String(group.totalCount ?? group.rows.length));\n}\n\n/** Owns request guards, announcements, and observation for independently loaded groups. */\nexport class TableGroupLoadController {\n readonly intersectionSupported = typeof IntersectionObserver !== 'undefined';\n\n private connected = false;\n private readonly observer = new TableLoadObserver(groupId => this.request(groupId, 'auto'));\n private snapshots = new Map<string, GroupSnapshot>();\n private pending = new Map<string, { identity: string | number; count: number }>();\n\n constructor(private readonly options: TableGroupLoadControllerOptions) {}\n\n initialize(): void {\n this.snapshots = this.createSnapshots();\n }\n\n connect(): void {\n this.connected = true;\n this.refresh();\n }\n\n disconnect(): void {\n this.connected = false;\n this.disconnectObserver();\n }\n\n refresh(): void {\n if (!this.connected) return;\n const state = this.options.state();\n if (\n !state.enabled ||\n state.loadMoreMode !== 'auto' ||\n !this.intersectionSupported ||\n !state.viewport\n ) {\n this.disconnectObserver();\n return;\n }\n\n const groups = new Map(state.groups.map(group => [group.id, group]));\n const targets = new Map<HTMLElement, string>();\n for (const [groupId, sentinel] of state.sentinels) {\n const group = groups.get(groupId);\n if (!group?.hasMore || group.loadingMore || group.loadMoreError?.trim()) continue;\n targets.set(sentinel, groupId);\n }\n this.observer.refresh(\n targets,\n state.containedScroll ? state.viewport : null,\n state.loadMoreThreshold\n );\n }\n\n structureChanged(): void {\n this.pending.clear();\n this.snapshots = this.createSnapshots();\n this.disconnectObserver();\n }\n\n dataChanged(): void {\n const state = this.options.state();\n const nextSnapshots = new Map<string, GroupSnapshot>();\n\n for (const group of state.groups) {\n const next = this.snapshot(group);\n const previous = this.snapshots.get(group.id);\n const pending = this.pending.get(group.id);\n\n if (!previous || previous.identity !== next.identity) {\n this.pending.delete(group.id);\n } else {\n if (next.count > previous.count) {\n this.options.announce(\n formatGroupLabel(state.rowsLoadedLabel, group, next.count - previous.count)\n );\n }\n if (!previous.error && next.error) {\n this.pending.delete(group.id);\n this.options.announce(next.error);\n }\n if (previous.hasMore && !next.hasMore) {\n this.pending.delete(group.id);\n this.options.announce(formatGroupLabel(state.endOfResultsLabel, group));\n }\n if (pending && next.count > pending.count) this.pending.delete(group.id);\n if (\n state.loadMoreMode === 'manual' &&\n pending &&\n previous.loading &&\n !next.loading &&\n next.count === pending.count\n ) {\n // Empty automatic responses must not cause an endless request loop.\n this.pending.delete(group.id);\n }\n }\n\n nextSnapshots.set(group.id, next);\n }\n\n this.snapshots = nextSnapshots;\n for (const groupId of this.pending.keys()) {\n if (!nextSnapshots.has(groupId)) this.pending.delete(groupId);\n }\n this.disconnectObserver();\n }\n\n configurationChanged(): void {\n this.disconnectObserver();\n }\n\n request(groupId: string, reason: TableLoadMoreReason): void {\n const state = this.options.state();\n const group = state.groups.find(item => item.id === groupId);\n if (\n !state.enabled ||\n (reason === 'auto' && (!this.connected || state.loadMoreMode !== 'auto')) ||\n !group?.hasMore ||\n group.loadingMore ||\n (reason !== 'retry' && !!group.loadMoreError?.trim()) ||\n this.pending.has(groupId)\n )\n return;\n\n const identity = groupIdentity(group);\n this.pending.set(groupId, { identity, count: group.rows.length });\n this.options.announce(formatGroupLabel(state.loadingMoreLabel, group));\n this.options.request({\n groupId,\n reason,\n loadIdentity: identity,\n loadedRowCount: group.rows.length,\n });\n }\n\n private createSnapshots(): Map<string, GroupSnapshot> {\n return new Map(this.options.state().groups.map(group => [group.id, this.snapshot(group)]));\n }\n\n private snapshot(group: DataGroup): GroupSnapshot {\n return {\n count: group.rows.length,\n hasMore: !!group.hasMore,\n loading: !!group.loadingMore,\n error: group.loadMoreError?.trim() ?? '',\n identity: groupIdentity(group),\n };\n }\n\n private disconnectObserver(): void {\n this.observer.disconnect();\n }\n}\n",
|
|
1779
1803
|
"type": "registry:ui"
|
|
1780
1804
|
},
|
|
1781
1805
|
{
|
|
@@ -1790,7 +1814,12 @@
|
|
|
1790
1814
|
},
|
|
1791
1815
|
{
|
|
1792
1816
|
"path": "src/wc/components/Table/table-load-controller.ts",
|
|
1793
|
-
"content": "import type { TableLoadMoreDetail, TableLoadMoreMode, TableLoadMoreReason } from './table-types';\n\nexport interface TableLoadControllerState {\n lazyLoading: boolean;\n loadMoreMode: TableLoadMoreMode;\n hasMore: boolean;\n loadingMore: boolean;\n loadMoreError: string | undefined;\n loadIdentity: string | number;\n loadMoreThreshold: number;\n containedScroll: boolean;\n loadingMoreLabel: string;\n endOfResultsLabel: string;\n rowsLoadedLabel: string;\n loadedRowCount: number;\n viewport: HTMLElement | null;\n sentinel: HTMLElement | null;\n}\n\nexport interface TableLoadControllerOptions {\n state: () => TableLoadControllerState;\n announce: (message: string) => void;\n request: (detail: TableLoadMoreDetail) => void;\n}\n\n/** Owns incremental-loading request guards, announcements, and observation. */\nexport class TableLoadController {\n readonly intersectionSupported = typeof IntersectionObserver !== 'undefined';\n\n private connected = false;\n private
|
|
1817
|
+
"content": "import type { TableLoadMoreDetail, TableLoadMoreMode, TableLoadMoreReason } from './table-types';\nimport { TableLoadObserver } from './table-load-observer';\n\nexport interface TableLoadControllerState {\n lazyLoading: boolean;\n loadMoreMode: TableLoadMoreMode;\n hasMore: boolean;\n loadingMore: boolean;\n loadMoreError: string | undefined;\n loadIdentity: string | number;\n loadMoreThreshold: number;\n containedScroll: boolean;\n loadingMoreLabel: string;\n endOfResultsLabel: string;\n rowsLoadedLabel: string;\n loadedRowCount: number;\n viewport: HTMLElement | null;\n sentinel: HTMLElement | null;\n}\n\nexport interface TableLoadControllerOptions {\n state: () => TableLoadControllerState;\n announce: (message: string) => void;\n request: (detail: TableLoadMoreDetail) => void;\n}\n\n/** Owns incremental-loading request guards, announcements, and observation. */\nexport class TableLoadController {\n readonly intersectionSupported = typeof IntersectionObserver !== 'undefined';\n\n private connected = false;\n private readonly observer = new TableLoadObserver(() => this.request('auto'));\n private requestPending = false;\n private requestedRowCount = 0;\n private previousLoadedRowCount = 0;\n\n constructor(private readonly options: TableLoadControllerOptions) {}\n\n initialize(): void {\n this.previousLoadedRowCount = this.options.state().loadedRowCount;\n }\n\n connect(): void {\n this.connected = true;\n this.refresh();\n }\n\n disconnect(): void {\n this.connected = false;\n this.disconnectObserver();\n }\n\n refresh(): void {\n if (!this.connected) return;\n const state = this.options.state();\n if (\n !state.lazyLoading ||\n state.loadMoreMode !== 'auto' ||\n !state.hasMore ||\n !!state.loadMoreError?.trim() ||\n !this.intersectionSupported ||\n !state.viewport ||\n !state.sentinel\n ) {\n this.disconnectObserver();\n return;\n }\n\n this.observer.refresh(\n new Map([[state.sentinel, 'rows']]),\n state.containedScroll ? state.viewport : null,\n state.loadMoreThreshold\n );\n }\n\n structureChanged(): void {\n this.resetRequest();\n }\n\n dataChanged(): void {\n const state = this.options.state();\n const nextCount = state.loadedRowCount;\n if (!state.lazyLoading) {\n this.previousLoadedRowCount = nextCount;\n this.resetRequest();\n return;\n }\n if (nextCount > this.previousLoadedRowCount) {\n const added = nextCount - this.previousLoadedRowCount;\n this.options.announce(\n state.rowsLoadedLabel\n .replace('{count}', String(added))\n .replace('{total}', String(nextCount))\n );\n }\n if (nextCount > this.requestedRowCount) this.requestPending = false;\n this.previousLoadedRowCount = nextCount;\n this.disconnectObserver();\n }\n\n identityChanged(): void {\n this.previousLoadedRowCount = this.options.state().loadedRowCount;\n this.resetRequest();\n }\n\n configurationChanged(): void {\n this.disconnectObserver();\n }\n\n loadingChanged(loading: boolean): void {\n const state = this.options.state();\n if (!state.lazyLoading) {\n this.resetRequest();\n return;\n }\n if (loading) {\n this.requestPending = true;\n this.options.announce(state.loadingMoreLabel);\n } else if (state.loadMoreMode === 'manual') {\n // A completed manual request may append no rows; permit another explicit activation.\n this.requestPending = false;\n }\n this.disconnectObserver();\n }\n\n errorChanged(error: string | undefined): void {\n if (!this.options.state().lazyLoading) {\n this.resetRequest();\n return;\n }\n if (error?.trim()) {\n this.requestPending = false;\n this.options.announce(error);\n }\n this.disconnectObserver();\n }\n\n hasMoreChanged(hasMore: boolean, hadMore: boolean): void {\n if (!this.options.state().lazyLoading) {\n this.resetRequest();\n return;\n }\n if (!hasMore) {\n this.requestPending = false;\n if (hadMore) this.options.announce(this.options.state().endOfResultsLabel);\n }\n this.disconnectObserver();\n }\n\n request(reason: TableLoadMoreReason): void {\n const state = this.options.state();\n if (\n !state.lazyLoading ||\n (reason === 'auto' && (!this.connected || state.loadMoreMode !== 'auto')) ||\n !state.hasMore ||\n state.loadingMore ||\n (reason !== 'retry' && !!state.loadMoreError?.trim()) ||\n this.requestPending\n )\n return;\n\n this.requestPending = true;\n this.requestedRowCount = state.loadedRowCount;\n this.options.announce(state.loadingMoreLabel);\n this.options.request({\n reason,\n loadIdentity: state.loadIdentity,\n loadedRowCount: this.requestedRowCount,\n });\n }\n\n private resetRequest(): void {\n this.requestPending = false;\n this.requestedRowCount = this.options.state().loadedRowCount;\n this.disconnectObserver();\n }\n\n private disconnectObserver(): void {\n this.observer.disconnect();\n }\n}\n",
|
|
1818
|
+
"type": "registry:ui"
|
|
1819
|
+
},
|
|
1820
|
+
{
|
|
1821
|
+
"path": "src/wc/components/Table/table-load-observer.ts",
|
|
1822
|
+
"content": "/** Reconciles loading sentinels without rebuilding an observer on every render. */\nexport class TableLoadObserver {\n private observer: IntersectionObserver | null = null;\n private targets = new Map<HTMLElement, string>();\n private root: HTMLElement | null = null;\n private margin = '';\n private revision = 0;\n\n constructor(private readonly intersect: (id: string, target: HTMLElement) => void) {}\n\n refresh(\n targets: ReadonlyMap<HTMLElement, string>,\n root: HTMLElement | null,\n threshold: number\n ): void {\n if (!targets.size) {\n this.disconnect();\n return;\n }\n const margin = `0px 0px ${Number.isFinite(threshold) ? Math.max(0, threshold) : 0}px 0px`;\n const reassigned = [...targets].some(\n ([target, id]) => this.targets.has(target) && this.targets.get(target) !== id\n );\n if (this.root !== root || this.margin !== margin || reassigned) this.disconnect();\n if (!this.observer) {\n const observer = new IntersectionObserver(\n entries => {\n const revision = this.revision;\n for (const entry of entries) {\n // Disconnect does not revoke a callback already queued by the browser.\n // Application callbacks can also invalidate the rest of this delivery.\n if (this.observer !== observer || revision !== this.revision) return;\n const target = entry.target as HTMLElement;\n const id = this.targets.get(target);\n if (entry.isIntersecting && id !== undefined) this.intersect(id, target);\n }\n },\n { root, rootMargin: margin }\n );\n this.observer = observer;\n this.root = root;\n this.margin = margin;\n }\n const previous = this.targets;\n let changed = previous.size !== targets.size;\n for (const [target, id] of previous) {\n if (targets.get(target) !== id) changed = true;\n if (!targets.has(target)) this.observer.unobserve(target);\n }\n if (changed) this.revision++;\n this.targets = new Map(targets);\n for (const target of targets.keys()) {\n if (!previous.has(target)) this.observer.observe(target);\n }\n }\n\n disconnect(): void {\n const observer = this.observer;\n this.observer = null;\n this.targets.clear();\n this.root = null;\n this.margin = '';\n this.revision++;\n observer?.disconnect();\n }\n}\n",
|
|
1794
1823
|
"type": "registry:ui"
|
|
1795
1824
|
},
|
|
1796
1825
|
{
|
|
@@ -221,7 +221,12 @@
|
|
|
221
221
|
},
|
|
222
222
|
"events": [],
|
|
223
223
|
"methods": [],
|
|
224
|
-
"slots": [
|
|
224
|
+
"slots": [
|
|
225
|
+
{
|
|
226
|
+
"name": "",
|
|
227
|
+
"description": "The default slot"
|
|
228
|
+
}
|
|
229
|
+
]
|
|
225
230
|
},
|
|
226
231
|
"props": {
|
|
227
232
|
"align": {
|
|
@@ -332,7 +337,12 @@
|
|
|
332
337
|
},
|
|
333
338
|
"events": [],
|
|
334
339
|
"methods": [],
|
|
335
|
-
"slots": [
|
|
340
|
+
"slots": [
|
|
341
|
+
{
|
|
342
|
+
"name": "",
|
|
343
|
+
"description": "The default slot"
|
|
344
|
+
}
|
|
345
|
+
],
|
|
336
346
|
"exports": {
|
|
337
347
|
"customElement": "ds-text",
|
|
338
348
|
"react": "DsText",
|
|
@@ -240,7 +240,12 @@
|
|
|
240
240
|
"description": "Present against an external anchor the host already measured.\nDoes not bind hover or focus on that anchor — the owner drives show/hide."
|
|
241
241
|
}
|
|
242
242
|
],
|
|
243
|
-
"slots": [
|
|
243
|
+
"slots": [
|
|
244
|
+
{
|
|
245
|
+
"name": "",
|
|
246
|
+
"description": "The default slot"
|
|
247
|
+
}
|
|
248
|
+
]
|
|
244
249
|
},
|
|
245
250
|
"props": {
|
|
246
251
|
"align": {
|
|
@@ -358,7 +363,12 @@
|
|
|
358
363
|
"description": "Present against an external anchor the host already measured.\nDoes not bind hover or focus on that anchor — the owner drives show/hide."
|
|
359
364
|
}
|
|
360
365
|
],
|
|
361
|
-
"slots": [
|
|
366
|
+
"slots": [
|
|
367
|
+
{
|
|
368
|
+
"name": "",
|
|
369
|
+
"description": "The default slot"
|
|
370
|
+
}
|
|
371
|
+
],
|
|
362
372
|
"exports": {
|
|
363
373
|
"customElement": "ds-tooltip",
|
|
364
374
|
"react": "DsTooltip",
|
|
@@ -6,8 +6,51 @@ import { createComponent as createLitComponent } from '@lit/react';
|
|
|
6
6
|
export function createComponent({ defineCustomElement, tagName, transformTag, ...options }) {
|
|
7
7
|
defineCustomElement?.();
|
|
8
8
|
const resolvedTagName = transformTag ? transformTag(tagName) : tagName;
|
|
9
|
-
|
|
9
|
+
const events = Object.entries(options.events ?? {});
|
|
10
|
+
const Bridge = createLitComponent({
|
|
10
11
|
...options,
|
|
12
|
+
// Own subscriptions so unmount releases application callbacks. Lit retains
|
|
13
|
+
// ownership of custom-element properties and native React props.
|
|
14
|
+
events: {},
|
|
11
15
|
tagName: resolvedTagName,
|
|
12
16
|
});
|
|
17
|
+
if (events.length === 0)
|
|
18
|
+
return Bridge;
|
|
19
|
+
const React = options.react;
|
|
20
|
+
const useBrowserLayoutEffect = typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect;
|
|
21
|
+
const Component = React.forwardRef((props, ref) => {
|
|
22
|
+
const element = React.useRef(null);
|
|
23
|
+
const elementProps = { ...props };
|
|
24
|
+
for (const [prop] of events)
|
|
25
|
+
delete elementProps[prop];
|
|
26
|
+
useBrowserLayoutEffect(() => {
|
|
27
|
+
const node = element.current;
|
|
28
|
+
if (!node)
|
|
29
|
+
return;
|
|
30
|
+
const subscriptions = [];
|
|
31
|
+
for (const [prop, name] of events) {
|
|
32
|
+
const handler = props[prop];
|
|
33
|
+
if (typeof handler !== 'function')
|
|
34
|
+
continue;
|
|
35
|
+
const listener = event => handler(event);
|
|
36
|
+
node.addEventListener(name, listener);
|
|
37
|
+
subscriptions.push([name, listener]);
|
|
38
|
+
}
|
|
39
|
+
return () => {
|
|
40
|
+
for (const [name, listener] of subscriptions)
|
|
41
|
+
node.removeEventListener(name, listener);
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
const setRef = React.useCallback((node) => {
|
|
45
|
+
element.current = node;
|
|
46
|
+
if (typeof ref === 'function')
|
|
47
|
+
ref(node);
|
|
48
|
+
else if (ref)
|
|
49
|
+
ref.current = node;
|
|
50
|
+
}, [ref]);
|
|
51
|
+
const bridgeProps = { ...elementProps, ref: setRef };
|
|
52
|
+
return React.createElement(Bridge, bridgeProps);
|
|
53
|
+
});
|
|
54
|
+
Component.displayName = options.displayName ?? resolvedTagName;
|
|
55
|
+
return Component;
|
|
13
56
|
}
|
|
@@ -22,8 +22,8 @@ export declare class ChartLegend {
|
|
|
22
22
|
highlightOnHover: boolean;
|
|
23
23
|
/**
|
|
24
24
|
* Externally controlled highlight, matched by `label` — e.g. drive this from a sibling
|
|
25
|
-
* chart's `dsSliceHover` event to keep chart and legend hover in sync.
|
|
26
|
-
* rows'
|
|
25
|
+
* chart's `dsSliceHover` event to keep chart and legend hover in sync. Dims the other
|
|
26
|
+
* rows' swatches while keeping their text fully readable. It never shows the hover-fill,
|
|
27
27
|
* since that's reserved for a real pointer/keyboard interaction on this row.
|
|
28
28
|
*/
|
|
29
29
|
activeLabel: string | null;
|
|
@@ -21,7 +21,7 @@ export declare class TableGroupLoadController {
|
|
|
21
21
|
private readonly options;
|
|
22
22
|
readonly intersectionSupported: boolean;
|
|
23
23
|
private connected;
|
|
24
|
-
private
|
|
24
|
+
private readonly observer;
|
|
25
25
|
private snapshots;
|
|
26
26
|
private pending;
|
|
27
27
|
constructor(options: TableGroupLoadControllerOptions);
|
|
@@ -25,8 +25,7 @@ export declare class TableLoadController {
|
|
|
25
25
|
private readonly options;
|
|
26
26
|
readonly intersectionSupported: boolean;
|
|
27
27
|
private connected;
|
|
28
|
-
private
|
|
29
|
-
private observedSentinel;
|
|
28
|
+
private readonly observer;
|
|
30
29
|
private requestPending;
|
|
31
30
|
private requestedRowCount;
|
|
32
31
|
private previousLoadedRowCount;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Reconciles loading sentinels without rebuilding an observer on every render. */
|
|
2
|
+
export declare class TableLoadObserver {
|
|
3
|
+
private readonly intersect;
|
|
4
|
+
private observer;
|
|
5
|
+
private targets;
|
|
6
|
+
private root;
|
|
7
|
+
private margin;
|
|
8
|
+
private revision;
|
|
9
|
+
constructor(intersect: (id: string, target: HTMLElement) => void);
|
|
10
|
+
refresh(targets: ReadonlyMap<HTMLElement, string>, root: HTMLElement | null, threshold: number): void;
|
|
11
|
+
disconnect(): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=table-load-observer.d.ts.map
|
|
@@ -1327,7 +1327,7 @@ export namespace Components {
|
|
|
1327
1327
|
*/
|
|
1328
1328
|
interface DsChartLegend {
|
|
1329
1329
|
/**
|
|
1330
|
-
* Externally controlled highlight, matched by `label` — e.g. drive this from a sibling chart's `dsSliceHover` event to keep chart and legend hover in sync.
|
|
1330
|
+
* Externally controlled highlight, matched by `label` — e.g. drive this from a sibling chart's `dsSliceHover` event to keep chart and legend hover in sync. Dims the other rows' swatches while keeping their text fully readable. It never shows the hover-fill, since that's reserved for a real pointer/keyboard interaction on this row.
|
|
1331
1331
|
* @default null
|
|
1332
1332
|
*/
|
|
1333
1333
|
"activeLabel": string | null;
|
|
@@ -7245,7 +7245,7 @@ declare global {
|
|
|
7245
7245
|
}
|
|
7246
7246
|
}
|
|
7247
7247
|
declare namespace LocalJSX {
|
|
7248
|
-
type OneOf<K extends string, PropT, AttrT = PropT> = { [P in K]: PropT } & { [P in `attr:${K}`
|
|
7248
|
+
type OneOf<K extends string, PropT, AttrT = PropT> = { [P in K]: PropT } & { [P in `attr:${K}`]?: never } | { [P in `attr:${K}`]: AttrT } & { [P in K]?: never };
|
|
7249
7249
|
|
|
7250
7250
|
interface DsAgentActivity {
|
|
7251
7251
|
/**
|
|
@@ -8483,7 +8483,7 @@ declare namespace LocalJSX {
|
|
|
8483
8483
|
*/
|
|
8484
8484
|
interface DsChartLegend {
|
|
8485
8485
|
/**
|
|
8486
|
-
* Externally controlled highlight, matched by `label` — e.g. drive this from a sibling chart's `dsSliceHover` event to keep chart and legend hover in sync.
|
|
8486
|
+
* Externally controlled highlight, matched by `label` — e.g. drive this from a sibling chart's `dsSliceHover` event to keep chart and legend hover in sync. Dims the other rows' swatches while keeping their text fully readable. It never shows the hover-fill, since that's reserved for a real pointer/keyboard interaction on this row.
|
|
8487
8487
|
* @default null
|
|
8488
8488
|
*/
|
|
8489
8489
|
"activeLabel"?: string | null;
|